From 8b64b4bfe19a782c6f9993204ac3acab532d4a88 Mon Sep 17 00:00:00 2001 From: drtshock Date: Fri, 7 Nov 2014 11:49:54 -0600 Subject: [PATCH] Adds per faction warps functionality from #72. Default max warps per faction is 5. It can be changed in the config.yml. You can now use {warps} in the info board to show how many warps a faction has when you walk into their territory. Only faction mods+ can set faction warps. --- pom.xml | 2 +- .../com/massivecraft/factions/FLocation.java | 9 +++++ .../com/massivecraft/factions/Faction.java | 14 +++++++ .../factions/cmd/CmdDelFWarp.java | 29 ++++++++++++++ .../massivecraft/factions/cmd/CmdFWarp.java | 39 +++++++++++++++++++ .../factions/cmd/CmdSetFWarp.java | 39 +++++++++++++++++++ .../massivecraft/factions/cmd/FCmdRoot.java | 6 +++ .../scoreboards/sidebar/FDefaultSidebar.java | 3 +- .../scoreboards/sidebar/FInfoSidebar.java | 2 +- .../factions/struct/Permission.java | 4 +- .../factions/zcore/persist/MemoryBoard.java | 9 +++++ .../factions/zcore/persist/MemoryFaction.java | 29 ++++++++++++++ src/main/resources/config.yml | 6 +++ src/main/resources/plugin.yml | 6 ++- 14 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdDelFWarp.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdSetFWarp.java 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