From aa4bbb38955a18d6549d0c2d36e4223d18da1dd5 Mon Sep 17 00:00:00 2001 From: Naman Date: Tue, 17 Apr 2018 20:01:53 -0500 Subject: [PATCH] 1.1.1-STABLE /f coords - displays your coords and current world to your faction /f showclaims - Lists all your claims in every world /f lowpower - lists players with power under max /f tntfill - fills tnt in a radius and amount, hooks into /f tntbank if you're a mod or higher. Some of these commands require permissions please see the permissions page here https://www.prosavage.net/wiki/permissions --- .../massivecraft/factions/cmd/CmdCoords.java | 42 ++++ .../factions/cmd/CmdLowPower.java | 43 ++++ .../factions/cmd/CmdShowClaims.java | 64 ++++++ .../massivecraft/factions/cmd/CmdTntFill.java | 193 ++++++++++++++++++ .../massivecraft/factions/cmd/FCmdRoot.java | 10 +- .../factions/struct/Permission.java | 2 + .../massivecraft/factions/zcore/util/TL.java | 18 ++ src/main/resources/config.yml | 13 +- src/main/resources/plugin.yml | 4 +- 9 files changed, 385 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdCoords.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdLowPower.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdTntFill.java diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdCoords.java b/src/main/java/com/massivecraft/factions/cmd/CmdCoords.java new file mode 100644 index 00000000..2efc7e6e --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdCoords.java @@ -0,0 +1,42 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Location; +import org.bukkit.plugin.java.JavaPlugin; + +public class CmdCoords extends FCommand { + + public CmdCoords(){ + super(); + this.aliases.add("coords"); + this.aliases.add("coord"); + + this.permission = Permission.COORD.node; + this.disableOnLock = true; + + senderMustBePlayer = true; + senderMustBeMember = true; + senderMustBeModerator = false; + senderMustBeColeader = false; + senderMustBeAdmin = false; + } + + @Override + public void perform(){ + Location location = fme.getPlayer().getLocation(); + String message = TL.COMMAND_COORDS_MESSAGE.toString().replace("{player}",fme.getPlayer().getDisplayName()).replace("{x}",(int) location.getX() + "") + .replace("{y}",(int) location.getY() + "").replace("{z}",(int) location.getZ() + "").replace("{world}",location.getWorld().getName()); + for (FPlayer fPlayer : fme.getFaction().getFPlayers()){ + fPlayer.sendMessage(message); + } + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_COORDS_DESCRIPTION; + } + + +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdLowPower.java b/src/main/java/com/massivecraft/factions/cmd/CmdLowPower.java new file mode 100644 index 00000000..cc8e250b --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdLowPower.java @@ -0,0 +1,43 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.Conf; +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; + +public class CmdLowPower extends FCommand { + + public CmdLowPower(){ + super(); + this.aliases.add("lowpower"); + + + this.disableOnLock = false; + + senderMustBePlayer = true; + senderMustBeMember = true; + senderMustBeModerator = false; + senderMustBeColeader = true; + senderMustBeAdmin = false; + } + + + @Override + public void perform(){ + double maxPower = Conf.powerPlayerMax; + String format = TL.COMMAND_LOWPOWER_FORMAT.toString(); + msg(TL.COMMAND_LOWPOWER_HEADER.toString().replace("{maxpower}",(int) maxPower + "")); + for (FPlayer fPlayer : fme.getFaction().getFPlayers()){ + if (fPlayer.getPower() < maxPower){ + sendMessage(format.replace("{player}",fPlayer.getName()).replace("{player_power}",(int) fPlayer.getPower() + "").replace("{maxpower}",(int) maxPower + "")); + } + } + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_LOWPOWER_DESCRIPTION; + } + + +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java b/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java new file mode 100644 index 00000000..7b9b86ee --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java @@ -0,0 +1,64 @@ +package com.massivecraft.factions.cmd; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import com.massivecraft.factions.FLocation; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.World; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Set; + +public class CmdShowClaims extends FCommand{ + + public CmdShowClaims(){ + + this.aliases.add("showclaims"); + this.aliases.add("showclaim"); + + permission = Permission.SHOWCLAIMS.node; + + this.senderMustBePlayer = true; + this.senderMustBeMember = true; + this.senderMustBeModerator = false; + this.senderMustBePlayer = true; + + + } + + @Override + public void perform(){ + sendMessage(TL.COMMAND_SHOWCLAIMS_HEADER.toString().replace("{faction}",fme.getFaction().describeTo(fme))); + ListMultimap chunkMap = ArrayListMultimap.create(); + String format = TL.COMMAND_SHOWCLAIMS_CHUNKSFORMAT.toString(); + for (FLocation fLocation : fme.getFaction().getAllClaims()){ + chunkMap.put(fLocation.getWorldName(),format.replace("{x}",fLocation.getX() + "").replace("{z}",fLocation.getZ() + "")); + } + for (String world : chunkMap.keySet()){ + String message = TL.COMMAND_SHOWCLAIMS_FORMAT.toString().replace("{world}",world); + StringBuilder chunks = new StringBuilder(""); + for (String chunkString : chunkMap.get(world)){ + chunks.append(chunkString + ", "); + } + sendMessage(message.replace("{chunks}",chunks)); + sendMessage(""); + } + + + + + + + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_SHOWCLAIMS_DESCRIPTION; + } + + +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdTntFill.java b/src/main/java/com/massivecraft/factions/cmd/CmdTntFill.java new file mode 100644 index 00000000..d5a5ca8b --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdTntFill.java @@ -0,0 +1,193 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.P; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class CmdTntFill extends FCommand { + + public CmdTntFill(){ + super(); + this.aliases.add("tntfill"); + + this.requiredArgs.add("radius"); + this.requiredArgs.add("amount"); + + this.permission = Permission.TNTFILL.node; + this.disableOnLock = true; + + senderMustBePlayer = true; + senderMustBeMember = true; + senderMustBeModerator = false; + senderMustBeAdmin = false; + } + + @Override + public void perform(){ + int radius = argAsInt(0,16); + int amount = argAsInt(1,16); + if (radius > P.p.getConfig().getInt("Tntfill.max-radius")){ + msg(TL.COMMAND_TNTFILL_RADIUSMAX.toString().replace("{max}",P.p.getConfig().getInt("Tntfill.max-radius") + "")); + return; + } + if (amount > P.p.getConfig().getInt("Tntfill.max-amount")){ + msg(TL.COMMAND_TNTFILL_AMOUNTMAX.toString().replace("{max}",P.p.getConfig().getInt("Tntfill.max-amount") + "")); + return; + } + int testNumber = -1; + try { + testNumber = Integer.parseInt(args.get(1)); + } catch (NumberFormatException e) { + fme.msg(TL.COMMAND_TNT_INVALID_NUM); + return; + } + if (amount < 0) { + fme.msg(TL.COMMAND_TNT_POSITIVE); + return; + } + boolean bankMode = fme.getRole().isAtLeast(Role.MODERATOR); + Location start = me.getLocation(); + for (double x = start.getX() - radius; x <= start.getX() + radius; x++) { + for (double y = start.getY() - radius; y <= start.getY() + radius; y++) { + for (double z = start.getZ() - radius; z <= start.getZ() + radius; z++) { + Location blockLoc = new Location(start.getWorld(), x, y, z); + if (blockLoc.getBlock().getState() instanceof Dispenser){ + Dispenser disp = (Dispenser) blockLoc.getBlock().getState(); + Inventory dispenser = disp.getInventory(); + if (canHold(dispenser,amount)){ + int fullStacks = amount / 64; + int remainderAmt = amount % 64; + if (!inventoryContains(me.getInventory(), new ItemStack(Material.TNT,amount))){ + if (!fme.getRole().isAtLeast(Role.MODERATOR)){ + msg(TL.COMMAND_TNTFILL_NOTENOUGH); + return; + } else if (bankMode){ + msg(TL.COMMAND_TNTFILL_MOD.toString().replace("{role}",fme.getRole().nicename)); + bankMode = true; + me.performCommand("f tnt take " + amount); + if (!inventoryContains(me.getInventory(), new ItemStack(Material.TNT,amount))){ + msg(TL.COMMAND_TNTFILL_NOTENOUGH); + return; + } + } + } + ItemStack tnt64 = new ItemStack(Material.TNT, 64); + for (int i = 0; i <= fullStacks - 1; i++) { + dispenser.addItem(tnt64); + takeTnt(64); + } + if (remainderAmt != 0) { + ItemStack tnt = new ItemStack(Material.TNT, remainderAmt); + dispenser.addItem(tnt); + takeTnt(remainderAmt); + } + sendMessage(TL.COMMAND_TNTFILL_SUCCESS.toString().replace("{amount}",amount + "").replace("{x}",(int) x + "") + .replace("{y}",(int) y + "").replace("{z}",(int) z + "")); + } + + } + } + } + } + + + + } + public void takeTnt(int amount){ + Inventory inv = me.getInventory(); + int invTnt = 0; + for (int i = 0; i <= inv.getSize(); i++) { + if (inv.getItem(i) == null) { + continue; + } + if (inv.getItem(i).getType() == Material.TNT) { + invTnt += inv.getItem(i).getAmount(); + } + } + if (amount > invTnt) { + fme.msg(TL.COMMAND_TNTFILL_NOTENOUGH); + return; + } + ItemStack tnt = new ItemStack(Material.TNT, amount); + if (fme.getFaction().getTnt() + amount > P.p.getConfig().getInt("ftnt.Bank-Limit")) { + msg(TL.COMMAND_TNT_EXCEEDLIMIT); + return; + } + removeFromInventory(me.getInventory(), tnt); + } + + public boolean canHold(Inventory inventory, int amount){ + int fullStacks = amount / 64; + int remainderAmt = amount % 64; + if ((remainderAmt == 0 && getEmptySlots(me) <= fullStacks)) { + return false; + } + if (getEmptySlots(me) + 1 <= fullStacks) { + fme.msg(TL.COMMAND_TNT_WIDTHDRAW_NOTENOUGH); + return false; + } + return true; + } + + public boolean inventoryContains(Inventory inventory, ItemStack item) { + int count = 0; + ItemStack[] items = inventory.getContents(); + for (int i = 0; i < items.length; i++) { + if (items[i] != null && items[i].getType() == item.getType() && items[i].getDurability() == item.getDurability()) { + count += items[i].getAmount(); + } + if (count >= item.getAmount()) { + return true; + } + } + return false; + } + + + public void removeFromInventory(Inventory inventory, ItemStack item) { + int amt = item.getAmount(); + ItemStack[] items = inventory.getContents(); + for (int i = 0; i < items.length; i++) { + if (items[i] != null && items[i].getType() == item.getType() && items[i].getDurability() == item.getDurability()) { + if (items[i].getAmount() > amt) { + items[i].setAmount(items[i].getAmount() - amt); + break; + } else if (items[i].getAmount() == amt) { + items[i] = null; + break; + } else { + amt -= items[i].getAmount(); + items[i] = null; + } + } + } + inventory.setContents(items); + } + + public int getEmptySlots(Player p) { + PlayerInventory inventory = p.getInventory(); + ItemStack[] cont = inventory.getContents(); + int i = 0; + for (ItemStack item : cont) + if (item != null && item.getType() != Material.AIR) { + i++; + } + return 36 - i; + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_TNTFILL_DESCRIPTION; + } + +} diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index 8e2709bf..51fa6a40 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -94,7 +94,11 @@ public class FCmdRoot extends FCommand { public CmdBanner cmdBanner = new CmdBanner(); public CmdTpBanner cmdTpBanner = new CmdTpBanner(); public CmdKillHolograms cmdKillHolograms = new CmdKillHolograms(); - public CmdInspect cmdInspect = new CmdInspect(); + public CmdInspect cmdInspect = new CmdInspect(); + public CmdCoords cmdCoords = new CmdCoords(); + public CmdShowClaims cmdShowClaims = new CmdShowClaims(); + public CmdLowPower cmdLowPower = new CmdLowPower(); + public CmdTntFill cmdTntFill = new CmdTntFill(); @@ -201,6 +205,10 @@ public class FCmdRoot extends FCommand { this.addSubCommand(this.cmdBanner); this.addSubCommand(this.cmdTpBanner); this.addSubCommand(this.cmdKillHolograms); + this.addSubCommand(this.cmdCoords); + this.addSubCommand(this.cmdShowClaims); + this.addSubCommand(this.cmdLowPower); + this.addSubCommand(this.cmdTntFill); if (Bukkit.getServer().getPluginManager().getPlugin("CoreProtect") != null){ P.p.log("Found CoreProtect, enabling Inspect"); diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java index 9b40475c..959394b2 100644 --- a/src/main/java/com/massivecraft/factions/struct/Permission.java +++ b/src/main/java/com/massivecraft/factions/struct/Permission.java @@ -100,6 +100,8 @@ public enum Permission { KILLHOLOS("killholos"), INSPECT("inspect"), TNTFILL("tntfill"), + COORD("coords"), + SHOWCLAIMS("showclaims"), WARP("warp"); public final String node; diff --git a/src/main/java/com/massivecraft/factions/zcore/util/TL.java b/src/main/java/com/massivecraft/factions/zcore/util/TL.java index 8ef1047b..54c91a14 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -232,6 +232,9 @@ public enum TL { COMMAND_CONVERT_BACKEND_INVALID("&c&l[!]&7 Invalid backend"), COMMAND_CONVERT_DESCRIPTION("Convert the plugin backend"), + COMMAND_COORDS_MESSAGE("&c&l[!] &7{player}&7's coords are &c{x}&7,&c{y}&7,&c{z}&7 in &c{world}"), + COMMAND_COORDS_DESCRIPTION("broadcast your coords to your faction"), + COMMAND_CHECKPOINT_DISABLED("&c&l[!]&7 You &ccannot&7 use checkpoint while its&c disabled&7!"), COMMAND_CHECKPOINT_SET("&c&l[!]&7 You have &cset&7 the &cfaction checkpoint&7 at your &cLocation&7."), COMMAND_CHECKPOINT_GO("&c&l[!]&7 &cTeleporting&7 to &cfaction checkpoint"), @@ -373,6 +376,10 @@ public enum TL { COMMAND_LOGINS_TOGGLE("&c&l[!]&7 Set login / logout notifications for Faction members to: &c%s"), COMMAND_LOGINS_DESCRIPTION("Toggle(?) login / logout notifications for Faction members"), + COMMAND_LOWPOWER_HEADER("&8&m--------&8&8&m---------"), + COMMAND_LOWPOWER_FORMAT("&c{player} &8(&c{player_power}&8/&c{maxpower}&8)"), + COMMAND_LOWPOWER_DESCRIPTION("Shows a list of players in your faction with lower power levels"), + COMMAND_MAP_TOSHOW("to show the map"), COMMAND_MAP_FORSHOW("for showing the map"), COMMAND_MAP_UPDATE_ENABLED("&c&l[!]&7 Map auto update &aENABLED."), @@ -604,6 +611,11 @@ public enum TL { COMMAND_SHOW_EXEMPT("This faction is exempt and cannot be seen."), COMMAND_SHOW_NEEDFACTION("&cYou need to join a faction to view your own!"), + COMMAND_SHOWCLAIMS_HEADER("&8&m-------------&8<{faction}'s claims&8>&8&m-------------"), + COMMAND_SHOWCLAIMS_FORMAT("&8[{world}]: {chunks}"), + COMMAND_SHOWCLAIMS_CHUNKSFORMAT("&8(&c{x}&8,&c{z}&8)"), + COMMAND_SHOWCLAIMS_DESCRIPTION("show your factions claims!"), + COMMAND_SHOWINVITES_PENDING("Players with pending invites: "), COMMAND_SHOWINVITES_CLICKTOREVOKE("Click to revoke invite for %1$s"), COMMAND_SHOWINVITES_DESCRIPTION("Show pending faction invites"), @@ -661,6 +673,12 @@ public enum TL { COMMAND_TNT_POSITIVE("&cPlease use positive numbers!"), COMMAND_TNT_DESCRIPTION("add/widthraw from faction's tnt bank"), + COMMAND_TNTFILL_SUCCESS("&c&l[!] &7Filled &c{amount}&7 Tnt in dispenser at {x} {y} {z}"), + COMMAND_TNTFILL_NOTENOUGH("&c&l[!] &7Not enough tnt in inventory."), + COMMAND_TNTFILL_RADIUSMAX("&c&l[!] &7The max radius is {max}"), + COMMAND_TNTFILL_AMOUNTMAX("&c&l[!] &7The max amount is {max}"), + COMMAND_TNTFILL_MOD("&c&l[!] &7Tnt will be used from the faction bank because you dont have the specified amount in your inventory and you are a {role}"), + COMMAND_TNTFILL_DESCRIPTION("Fill tnt into dispensers around you"), COMMAND_UNBAN_DESCRIPTION("Unban someone from your Faction"), COMMAND_UNBAN_NOTBANNED("&7%s &cisn't banned. Not doing anything."), diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f5359bd0..0b3a9a47 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -346,12 +346,15 @@ help: - '&e/f join &f &8- &7Join to the faction.' - '&e/f list &8- &7List all factions.' - '&e/f top &8- &7View the richest factions.' - - '&e/f map &8- &7Map of the surrounding area.' + - '&e/f map &8- &7Map of the surrounding area, click chunks to claim.' - '&e/f sethome &8- &7Teleport to faction home.' - '&e/f home &8- &7Set your faction home.' - '&e/f ban &8- &7Ban a member from your faction.' - '&e/f unban &8- &7Unban a member from your faction.' - '&e/f banlist &8- &7List banned players from your faction.' + - '&e/f lowpower &8- &7List player with power under max from your faction.' + - '&e/f coords &8- &7Broadcast your location to your faction.' + - '&e/f showclaims &8- &7List all claims from your faction.' - '&7&m--------------------&r &e/f help 2 &7&m-----------------------' '2': - '&7&m----------------------------------------------------' @@ -363,7 +366,9 @@ help: - '&e/f claim &8- &7Claim a land for your faction.' - '&e/f unclaim &8- &7Unclaim land from your faction.' - '&e/f kick &f &8- &7Kick player from your faction.' - - '&e/f mod &f &8- &7Set player role in faction.' + - '&e/f mod &f &8- &7Set player to mod role in faction.' + - '&e/f coleader &f &8- &7Set player to coleader role in faction.' + - '&e/f leader &f &8- &7Set player role to leader in faction.' - '&e/f chat &f &8- &7Switch to Faction/Ally/Public chat.' - '&e/f warp &8- &7Opens the warp menu.' - '&e/f setwarp &8- &7Set a warp.' @@ -854,6 +859,10 @@ see-chunk: interval: 5 +Tntfill: + max-radius: 32 + max-amount: 64 + ############################################################ # +------------------------------------------------------+ # # | Big List of variables | # diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ad9611c1..0c08be30 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Factions -version: ${project.version}-SF-1.1-STABLE +version: ${project.version}-SF-1.2-STABLE main: com.massivecraft.factions.P authors: [Olof Larsson, Brett Flannigan, drtshock, ProSavage] softdepend: [CoreProtect, PlayerVaults, PlaceholderAPI, MVdWPlaceholderAPI, PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag, dynmap, FactionsTop] @@ -317,3 +317,5 @@ permissions: description: create banner factions.killholos: description: kill invisible holograms + factions.coords: + description: broadcast your coords to the player