diff --git a/pom.xml b/pom.xml
index dbc5e018..6d4b996f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.massivecraft
Factions
- 1.6.9.5-U0.1.9
+ 1.6.9.5-U0.1.10-SNAPSHOT
jar
Factions
diff --git a/src/main/java/com/massivecraft/factions/FLocation.java b/src/main/java/com/massivecraft/factions/FLocation.java
index 4a77ae10..9560cca8 100644
--- a/src/main/java/com/massivecraft/factions/FLocation.java
+++ b/src/main/java/com/massivecraft/factions/FLocation.java
@@ -2,6 +2,7 @@ package com.massivecraft.factions;
import com.massivecraft.factions.util.MiscUtil;
import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
@@ -149,6 +150,14 @@ public class FLocation implements Serializable {
return dx * dx + dz * dz;
}
+ public boolean isInChunk(Location loc) {
+ if (loc == null) {
+ return false;
+ }
+ Chunk chunk = loc.getChunk();
+ return loc.getWorld().getName().equalsIgnoreCase(getWorldName()) && chunk.getX() == x && chunk.getZ() == z;
+ }
+
//----------------------------------------------//
// Some Geometry
//----------------------------------------------//
diff --git a/src/main/java/com/massivecraft/factions/Faction.java b/src/main/java/com/massivecraft/factions/Faction.java
index 655be7bf..11ff53e0 100644
--- a/src/main/java/com/massivecraft/factions/Faction.java
+++ b/src/main/java/com/massivecraft/factions/Faction.java
@@ -4,15 +4,29 @@ import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.iface.RelationParticipator;
import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role;
+import com.massivecraft.factions.util.LazyLocation;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
public interface Faction extends EconomyParticipator {
public HashMap> getAnnouncements();
+ public ConcurrentHashMap getWarps();
+
+ public LazyLocation getWarp(String name);
+
+ public void setWarp(String name, LazyLocation loc);
+
+ public boolean isWarp(String name);
+
+ public boolean removeWarp(String name);
+
+ public void clearWarps();
+
public void addAnnouncement(FPlayer fPlayer, String msg);
public void sendUnreadAnnouncements(FPlayer fPlayer);
diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdDelFWarp.java b/src/main/java/com/massivecraft/factions/cmd/CmdDelFWarp.java
new file mode 100644
index 00000000..21f56ce6
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/cmd/CmdDelFWarp.java
@@ -0,0 +1,29 @@
+package com.massivecraft.factions.cmd;
+
+import com.massivecraft.factions.struct.Permission;
+
+public class CmdDelFWarp extends FCommand {
+
+ public CmdDelFWarp() {
+ super();
+ this.aliases.add("delwarp");
+ this.aliases.add("dw");
+ this.aliases.add("deletewarp");
+ this.requiredArgs.add("warp name");
+ this.senderMustBeMember = true;
+ this.senderMustBeModerator = true;
+ this.senderMustBePlayer = true;
+ this.permission = Permission.SETWARP.node;
+ }
+
+ @Override
+ public void perform() {
+ String warp = argAsString(0);
+ if (myFaction.isWarp(warp)) {
+ myFaction.removeWarp(warp);
+ fme.msg("Deleted warp %s", warp);
+ } else {
+ fme.msg("Couldn't find warp %s", warp);
+ }
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java b/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java
new file mode 100644
index 00000000..c7177dba
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java
@@ -0,0 +1,39 @@
+package com.massivecraft.factions.cmd;
+
+import com.massivecraft.factions.struct.Permission;
+
+public class CmdFWarp extends FCommand {
+
+ public CmdFWarp() {
+ super();
+ this.aliases.add("warp");
+ this.aliases.add("warps");
+ this.optionalArgs.put("warpname", "warpname");
+
+ this.permission = Permission.WARP.node;
+ this.senderMustBeMember = true;
+ this.senderMustBeModerator = false;
+ }
+
+ @Override
+ public void perform() {
+ //TODO: check if in combat.
+ if (args.size() == 0) {
+ StringBuilder sb = new StringBuilder();
+ for (String s : myFaction.getWarps().keySet()) {
+ sb.append(s + " ");
+ }
+ fme.msg("Warps: " + sb.toString().trim());
+ } else if (args.size() > 1) {
+ fme.msg("/f warp ");
+ } else {
+ String warpName = argAsString(0);
+ if (myFaction.isWarp(argAsString(0))) {
+ fme.getPlayer().teleport(myFaction.getWarp(warpName).getLocation());
+ fme.msg("Warped to %s", warpName);
+ } else {
+ fme.msg("Couldn't find warp %s", warpName);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdSetFWarp.java b/src/main/java/com/massivecraft/factions/cmd/CmdSetFWarp.java
new file mode 100644
index 00000000..5bec0ac8
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/cmd/CmdSetFWarp.java
@@ -0,0 +1,39 @@
+package com.massivecraft.factions.cmd;
+
+import com.massivecraft.factions.P;
+import com.massivecraft.factions.struct.Permission;
+import com.massivecraft.factions.struct.Relation;
+import com.massivecraft.factions.util.LazyLocation;
+
+public class CmdSetFWarp extends FCommand {
+
+ public CmdSetFWarp() {
+ super();
+ this.aliases.add("setwarp");
+ this.aliases.add("sw");
+ this.requiredArgs.add("warp name");
+ this.senderMustBeMember = true;
+ this.senderMustBeModerator = true;
+ this.senderMustBePlayer = true;
+ this.permission = Permission.SETWARP.node;
+ }
+
+ @Override
+ public void perform() {
+ if (!(fme.getRelationToLocation() == Relation.MEMBER)) {
+ fme.msg("You can only set warps in your faction territory.");
+ return;
+ }
+
+ int maxWarps = P.p.getConfig().getInt("max-warps", 5);
+ if (maxWarps <= myFaction.getWarps().size()) {
+ fme.msg("Your Faction already has the max amount of warps set (%d).", maxWarps);
+ return;
+ }
+
+ String warp = argAsString(0);
+ LazyLocation loc = new LazyLocation(fme.getPlayer().getLocation());
+ myFaction.setWarp(warp, loc);
+ fme.msg("Set warp %s to your location.", warp);
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java
index f9e0c490..0f345454 100644
--- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java
+++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java
@@ -57,6 +57,9 @@ public class FCmdRoot extends FCommand {
public CmdAnnounce cmdAnnounce = new CmdAnnounce();
public CmdSeeChunk cmdSeeChunk = new CmdSeeChunk();
public CmdConvert cmdConvert = new CmdConvert();
+ public CmdFWarp cmdFWarp = new CmdFWarp();
+ public CmdSetFWarp cmdSetFWarp = new CmdSetFWarp();
+ public CmdDelFWarp cmdDelFWarp = new CmdDelFWarp();
public FCmdRoot() {
super();
@@ -130,6 +133,9 @@ public class FCmdRoot extends FCommand {
this.addSubCommand(this.cmdAnnounce);
this.addSubCommand(this.cmdSeeChunk);
this.addSubCommand(this.cmdConvert);
+ this.addSubCommand(this.cmdFWarp);
+ this.addSubCommand(this.cmdSetFWarp);
+ this.addSubCommand(this.cmdDelFWarp);
}
@Override
diff --git a/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FDefaultSidebar.java b/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FDefaultSidebar.java
index d754dc9e..df72e298 100644
--- a/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FDefaultSidebar.java
+++ b/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FDefaultSidebar.java
@@ -30,7 +30,8 @@ public class FDefaultSidebar extends FSidebarProvider {
private String replace(FPlayer fplayer, String s) {
String faction = !fplayer.getFaction().isNone() ? fplayer.getFaction().getTag() : "factionless";
- s = s.replace("{name}", fplayer.getName()).replace("{power}", String.valueOf(fplayer.getPowerRounded())).replace("{balance}", String.valueOf(Econ.getFriendlyBalance(fplayer.getPlayer().getUniqueId()))).replace("{faction}", faction).replace("{maxPower}", String.valueOf(fplayer.getPowerMaxRounded())).replace("{totalOnline}", String.valueOf(Bukkit.getServer().getOnlinePlayers().length));
+ String powerBoost = String.valueOf((int) fplayer.getPowerBoost());
+ s = s.replace("{name}", fplayer.getName()).replace("{power}", String.valueOf(fplayer.getPowerRounded())).replace("{balance}", String.valueOf(Econ.getFriendlyBalance(fplayer.getPlayer().getUniqueId()))).replace("{faction}", faction).replace("{maxPower}", String.valueOf(fplayer.getPowerMaxRounded())).replace("{totalOnline}", String.valueOf(Bukkit.getServer().getOnlinePlayers().length)).replace("{powerBoost}", powerBoost);
return ChatColor.translateAlternateColorCodes('&', s);
}
}
diff --git a/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FInfoSidebar.java b/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FInfoSidebar.java
index 178086b1..b93e7b36 100644
--- a/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FInfoSidebar.java
+++ b/src/main/java/com/massivecraft/factions/scoreboards/sidebar/FInfoSidebar.java
@@ -37,6 +37,6 @@ public class FInfoSidebar extends FSidebarProvider {
boolean raidable = faction.getLandRounded() > faction.getPower();
FPlayer fLeader = faction.getFPlayerAdmin();
String leader = fLeader == null ? "Server" : fLeader.getName().substring(0, fLeader.getName().length() > 14 ? 13 : fLeader.getName().length());
- return ChatColor.translateAlternateColorCodes('&', s.replace("{power}", String.valueOf(faction.getPowerRounded())).replace("{online}", String.valueOf(faction.getOnlinePlayers().size())).replace("{members}", String.valueOf(faction.getFPlayers().size())).replace("{leader}", leader).replace("{chunks}", String.valueOf(faction.getLandRounded())).replace("{raidable}", String.valueOf(raidable)));
+ return ChatColor.translateAlternateColorCodes('&', s.replace("{power}", String.valueOf(faction.getPowerRounded())).replace("{online}", String.valueOf(faction.getOnlinePlayers().size())).replace("{members}", String.valueOf(faction.getFPlayers().size())).replace("{leader}", leader).replace("{chunks}", String.valueOf(faction.getLandRounded())).replace("{raidable}", String.valueOf(raidable)).replace("{warps}", String.valueOf(faction.getWarps().size())));
}
}
diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java
index 31172cc4..27b272d1 100644
--- a/src/main/java/com/massivecraft/factions/struct/Permission.java
+++ b/src/main/java/com/massivecraft/factions/struct/Permission.java
@@ -68,7 +68,9 @@ public enum Permission {
UNCLAIM_ALL("unclaimall"),
VERSION("version"),
SCOREBOARD("scoreboard"),
- SEECHUNK("seechunk");
+ SEECHUNK("seechunk"),
+ SETWARP("setwarp"),
+ WARP("warp");
public final String node;
diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java
index 71a780c5..6cc2f4a4 100644
--- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java
+++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java
@@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.logging.Level;
public abstract class MemoryBoard extends Board {
@@ -45,6 +46,13 @@ public abstract class MemoryBoard extends Board {
}
public void removeAt(FLocation flocation) {
+ Faction faction = getFactionAt(flocation);
+ for (String s : faction.getWarps().keySet()) {
+ if (flocation.isInChunk(faction.getWarp(s).getLocation())) {
+ faction.removeWarp(s);
+ P.p.log(Level.INFO, "Removed warp %s from faction %s", s, faction.getTag());
+ }
+ }
clearOwnershipAt(flocation);
flocationIds.remove(flocation);
}
@@ -62,6 +70,7 @@ public abstract class MemoryBoard extends Board {
if (faction != null && faction.isNormal()) {
faction.clearAllClaimOwnership();
}
+ faction.clearWarps();
clean(factionId);
}
diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java
index 42b97b5f..f603a6ef 100644
--- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java
+++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java
@@ -38,6 +38,7 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator {
protected transient Set fplayers = new HashSet();
protected Set invites = new HashSet();
protected HashMap> announcements = new HashMap>();
+ protected ConcurrentHashMap warps = new ConcurrentHashMap();
public HashMap> getAnnouncements() {
return this.announcements;
@@ -67,6 +68,34 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator {
}
}
+ public ConcurrentHashMap getWarps() {
+ return this.warps;
+ }
+
+ public LazyLocation getWarp(String name) {
+ return this.warps.get(name);
+ }
+
+ public void setWarp(String name, LazyLocation loc) {
+ this.warps.put(name, loc);
+ }
+
+ public boolean isWarp(String name) {
+ return this.warps.containsKey(name);
+ }
+
+ public boolean removeWarp(String name) {
+ if (warps.containsKey(name)) {
+ warps.remove(name);
+ return true;
+ }
+ return false;
+ }
+
+ public void clearWarps() {
+ warps.clear();
+ }
+
public Set getInvites() {
return invites;
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index e72c1972..3c98e844 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -19,6 +19,10 @@ findfactionsexploit:
cooldown: 2000 # in miliseconds. 2000 = 2 seconds.
log: false
+# Warps
+# What should be the max amount of warps that a Factoin can set?
+max-warps: 5
+
# Configuration section for Scoreboards
# This will allow you to completely customize how your scoreboards look.
# Make sure that no lines are duplicates of each other otherwise only the first will display.
@@ -34,6 +38,7 @@ scoreboard:
# {power} - faction's power. {chunks} - total claimed chunks. {members} - total members.
# {online} - online members. {leader} - faction's leader. {open} - shows either true or false if open.
# {raidable} - true if the faction can be claimed over, otherwise false.
+# {warps} - the number of warps that a faction has set.
# The title of the scoreboard will be the Faction's tag and colored according to the relation with the player's Faction.
# Commenting this section out will cause the info to appear in chat as the plugin originally did.
finfo-enabled: false # Default to false to keep original functionality.
@@ -52,6 +57,7 @@ scoreboard:
# Replace {name} - player's name. {faction} - player's faction title, factionless if none.
# {totalOnline} - total players on the server. {balance} - player's balance.
# {maxPower} - player's max power.
+# {powerBoost} - player's powerboost.
default-enabled: false # Default to false to keep original functionality.
default-title: "i love drt" # Can use any of the values from above but this won't update once it's set (so don't set {balance}).
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index ce604805..c4da2f2f 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -233,4 +233,8 @@ permissions:
factions.showinvites:
description: show pending invites to your faction
factions.seechunk:
- description: see the chunk you stand in
\ No newline at end of file
+ description: see the chunk you stand in
+ factions.setwarp:
+ description: set a warp for your faction
+ factions.warp:
+ description: access your faction warps
\ No newline at end of file