From 8f7b6c8e6d3606161bd035d63131443f78e52b0c Mon Sep 17 00:00:00 2001 From: Pepich Date: Mon, 29 May 2017 12:46:26 +0200 Subject: [PATCH 01/15] Updated BPM to use DataManager --- .../blockplacemods/BlockPlaceMods.java | 169 +++++++++++ .../modules/blockplacemods/mods/Mod.java | 24 ++ .../blockplacemods/mods/ModAbstract.java | 83 ++++++ .../mods/ModBooleanAbstract.java | 86 ++++++ .../mods/ModBooleanCauldron.java | 57 ++++ .../blockplacemods/mods/ModBooleanPiston.java | 75 +++++ .../blockplacemods/mods/ModBooleanStep.java | 55 ++++ .../blockplacemods/mods/ModBooleanTorch.java | 106 +++++++ .../mods/ModInventoryAbstract.java | 174 +++++++++++ .../mods/ModInventoryDropper.java | 24 ++ .../mods/ModInventoryFurnace.java | 24 ++ .../mods/ModInventoryHopper.java | 24 ++ .../blockplacemods/util/CommandException.java | 23 ++ .../blockplacemods/util/CommandMap.java | 22 ++ .../blockplacemods/util/ItemProperties.java | 270 ++++++++++++++++++ .../blockplacemods/util/ThrowingSupplier.java | 12 + 16 files changed, 1228 insertions(+) create mode 100644 src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/Mod.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java create mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java create mode 100644 src/com/redstoner/modules/blockplacemods/util/CommandException.java create mode 100644 src/com/redstoner/modules/blockplacemods/util/CommandMap.java create mode 100644 src/com/redstoner/modules/blockplacemods/util/ItemProperties.java create mode 100644 src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java new file mode 100644 index 0000000..cfda593 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -0,0 +1,169 @@ +package com.redstoner.modules.blockplacemods; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.Version; +import com.redstoner.misc.Main; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.blockplacemods.mods.Mod; +import com.redstoner.modules.blockplacemods.mods.ModAbstract; +import com.redstoner.modules.blockplacemods.util.CommandException; +import com.redstoner.modules.blockplacemods.util.CommandMap; +import com.redstoner.modules.blockplacemods.util.ThrowingSupplier; + +@Version(major = 3, minor = 1, revision = 0, compatible = 3) +public final class BlockPlaceMods implements Module, Listener +{ + public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" + + ChatColor.GREEN; + + @Override + public boolean onEnable() + { + ModAbstract.constructAll(); + for (Mod mod : new ArrayList<>(ModAbstract.getMods().values())) + { + mod.register(); + } + // CommandManager.registerCommand(getCommandString(), this, Main.plugin); + // Sorry but this stuff isn't working for me. Not gonna spend more time on it. + try + { + Map commandMap = CommandMap.getCommandMap(); + String[] aliases = {"mod", Main.plugin.getName().toLowerCase() + ":mod"}; + org.bukkit.command.Command command = new org.bukkit.command.Command("mod") + { + @Override + public boolean execute(CommandSender sender, String label, String[] args) + { + onModCommand(sender, String.join(" ", args)); + return true; + } + }; + for (String alias : aliases) + { + commandMap.put(alias, command); + } + } + catch (ReflectiveOperationException ex) + { + throw new Error(ex); + } + return true; + } + + @Override + public void onDisable() + { + for (Mod mod : ModAbstract.getMods().values()) + { + mod.unregister(); + } + try + { + Map commandMap = CommandMap.getCommandMap(); + commandMap.remove("mod"); + commandMap.remove(Main.plugin.getName().toLowerCase() + ":mod"); + } + catch (Exception ignored) + {} + } + + /* @Override + * public String getCommandString() { + * return "command mod {\n" + + * "perm utils.blockplacemods.command;\n" + + * "type player;\n" + + * "[empty] {\n" + + * "run mod_empty;\n" + + * "}\n" + + * "[string:args...] {\n" + + * "run mod args;\n" + + * "}\n" + + * "}\n"; + * } */ + @Command(hook = "mod_empty") + public void onModEmptyCommand(CommandSender sender) + { + onModCommand(sender, ""); + } + + @Command(hook = "mod") + public void onModCommand(CommandSender sender, String input) + { + String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream() + .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new); + String prefix = PREFIX; + ThrowingSupplier supplier; + if (args.length > 0) + { + Mod target = ModAbstract.getMod(args[0].toLowerCase()); + if (target != null) + { + prefix += "&7[&2" + target.getName() + "&7]&a"; + if (!(sender instanceof Player)) + { + supplier = () -> "&cYou must be a player to use any block place mod"; + } + else + { + supplier = () -> target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length)); + } + } + else if (args[0].equalsIgnoreCase("help")) + { + supplier = () -> commandHelp(sender, args); + } + else + { + supplier = () -> "&cThat argument could not be recognized"; + } + } + else + { + supplier = () -> commandHelp(sender, args); + } + handleCommand(sender, prefix, supplier); + } + + private String commandHelp(CommandSender sender, String[] args) + { + StringBuilder result = new StringBuilder("§7BlockPlaceMods adds some redstone-centric utilities"); + result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:"); + for (Mod mod : ModAbstract.getMods().values()) + { + result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString()) + .append(mod.getName().toLowerCase()).append(ChatColor.GRAY.toString()).append(" - ") + .append(mod.getDescription()); + } + return result.toString(); + } + + public static void handleCommand(CommandSender sender, String prefix, ThrowingSupplier supplier) + { + String message; + try + { + message = " &a" + supplier.get(); + } + catch (CommandException e) + { + message = " &c" + e.getMessage(); + } + catch (Throwable t) + { + message = " &cAn unexpected error occurred while executing this command."; + t.printStackTrace(); + } + Utils.sendMessage(sender, prefix, message, '&'); + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/com/redstoner/modules/blockplacemods/mods/Mod.java new file mode 100644 index 0000000..c34a460 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/Mod.java @@ -0,0 +1,24 @@ +package com.redstoner.modules.blockplacemods.mods; + +import java.util.Set; + +import org.bukkit.entity.Player; + +import com.redstoner.modules.blockplacemods.util.CommandException; + +public interface Mod +{ + String getName(); + + String getDescription(); + + Set getAliases(); + + Object getDefault(); + + String runCommand(Player sender, String[] args) throws CommandException; + + void register(); + + void unregister(); +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java new file mode 100644 index 0000000..f2cde40 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java @@ -0,0 +1,83 @@ +package com.redstoner.modules.blockplacemods.mods; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +import com.redstoner.misc.Main; +import com.redstoner.misc.Utils; +import com.redstoner.modules.datamanager.DataManager; + +public abstract class ModAbstract implements Mod, Listener +{ + private static final Map mods = new HashMap<>(); + + public static Map getMods() + { + return Collections.unmodifiableMap(mods); + } + + public static Mod getMod(String name) + { + return mods.get(name); + } + + public static void constructAll() + { + new ModBooleanCauldron(); + new ModBooleanPiston(); + new ModBooleanStep(); + new ModBooleanTorch(); + new ModInventoryDropper(); + new ModInventoryFurnace(); + new ModInventoryHopper(); + } + + private final Set aliases; + + public ModAbstract() + { + preConstruction(); + Utils.info("Loaded mod " + getName()); + aliases = new HashSet<>(); + aliases.add(getName()); + mods.put(getName().toLowerCase(), this); + } + + protected void preConstruction() + {} + + @Override + public void register() + { + for (String alias : aliases) + { + mods.putIfAbsent(alias.toLowerCase(), this); + } + Bukkit.getPluginManager().registerEvents(this, Main.plugin); + } + + @Override + public void unregister() + { + HandlerList.unregisterAll(this); + } + + @Override + public Set getAliases() + { + return aliases; + } + + protected void reset(Player player) + { + DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java new file mode 100644 index 0000000..1faa8c5 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java @@ -0,0 +1,86 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.entity.Player; + +import com.redstoner.modules.blockplacemods.util.CommandException; +import com.redstoner.modules.datamanager.DataManager; + +public abstract class ModBooleanAbstract extends ModAbstract +{ + protected boolean enabledByDefault; + + protected abstract boolean enabledByDefault(); + + @Override + protected void preConstruction() + { + enabledByDefault = enabledByDefault(); + } + + protected boolean hasEnabled(Player player) + { + return (boolean) DataManager.getOrDefault(player.getUniqueId().toString(), "BlockPlaceMods", getName(), + enabledByDefault); + } + + protected boolean setEnabled(Player sender, boolean enabled) + { + if (enabled == hasEnabled(sender)) + return false; + if (enabled == (boolean) getDefault()) + reset(sender); + else + DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled); + return true; + } + + @Override + public String runCommand(Player sender, String[] args) throws CommandException + { + if (args.length == 0 || args[0].equalsIgnoreCase("toggle")) + { + boolean enabled = hasEnabled(sender); + setEnabled(sender, !enabled); + return !enabled ? "Enabled" : "Disabled"; + } + if (args[0].equalsIgnoreCase("help")) + { + StringBuilder message = new StringBuilder(); + message.append("&a### &3").append(getName()).append("&a Help ###"); + message.append("\n&8If enabled, ").append(getDescription()); + message.append("\n&6/mod ").append(getName().toLowerCase()).append("&o toggle &btoggles state"); + message.append("\n&6/mod ").append(getName().toLowerCase()).append("&o on/off &bsets state"); + message.append("\n&6/mod ").append(getName().toLowerCase()).append("&o help &bshows this help page"); + return message.toString(); + } + final boolean enable; + if (args[0] == null) + { + throw new CommandException("Missing argument"); + } + else + { + switch (args[0].toLowerCase()) + { + case "on": + case "enable": + case "true": + enable = true; + break; + case "off": + case "disable": + case "false": + enable = false; + break; + default: + throw new CommandException("Input '" + args[0] + "' was not understood. " + + "Use one of: \non, enable, true, off, disable, false."); + } + } + if (!setEnabled(sender, enable)) + { + throw new CommandException("Was already " + (enable ? "enabled" : "disabled")); + } + return enable ? "Enabled" : "Disabled"; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java new file mode 100644 index 0000000..d831b1e --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java @@ -0,0 +1,57 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class ModBooleanCauldron extends ModBooleanAbstract +{ + @Override + public String getName() + { + return "Cauldron"; + } + + @Override + public String getDescription() + { + return "fills cauldrons upon placement and cycles upon right click"; + } + + @Override + protected boolean enabledByDefault() + { + return false; + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) + { + if (event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getPlayer().isSneaking() + && event.getClickedBlock().getType() == Material.CAULDRON && hasEnabled(event.getPlayer())) + { + Block block = event.getClickedBlock(); + block.setData((byte) ((block.getData() - 1) & 0x3)); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + if (event.getBlock().getType() == Material.CAULDRON && !event.getPlayer().isSneaking() + && hasEnabled(event.getPlayer())) + { + event.getBlock().setData((byte) 3); + } + } + + @Override + public Object getDefault() + { + return false; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java new file mode 100644 index 0000000..e8542f7 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java @@ -0,0 +1,75 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +public class ModBooleanPiston extends ModBooleanAbstract +{ + @Override + public String getName() + { + return "Piston"; + } + + @Override + public String getDescription() + { + return "makes pistons face the block you placed it against"; + } + + @Override + protected boolean enabledByDefault() + { + return false; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + Player player = event.getPlayer(); + if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE + && isPiston(event.getBlock().getType())) + { + Block block = event.getBlock(); + block.setData((byte) pistonDataForFace(block.getFace(event.getBlockAgainst()))); + } + } + + private boolean isPiston(Material block) + { + return block == Material.PISTON_BASE || block == Material.PISTON_STICKY_BASE; + } + + private int pistonDataForFace(BlockFace face) + { + switch (face) + { + case DOWN: + return 0; + case UP: + return 1; + case NORTH: + return 2; + case SOUTH: + return 3; + case WEST: + return 4; + case EAST: + return 5; + default: + return 0; + } + } + + @Override + public Object getDefault() + { + return false; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java new file mode 100644 index 0000000..91f1126 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java @@ -0,0 +1,55 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +public class ModBooleanStep extends ModBooleanAbstract +{ + { + getAliases().add("Slab"); + } + + @Override + public String getName() + { + return "Step"; + } + + @Override + public String getDescription() + { + return "turns steps upside-down upon placement"; + } + + @Override + protected boolean enabledByDefault() + { + return true; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + if (isStep(event.getBlock().getType()) && !event.getPlayer().isSneaking() && hasEnabled(event.getPlayer())) + { + byte data = event.getBlock().getData(); + if (data != (data |= 0x8)) + { + event.getBlock().setData(data); + } + } + } + + private boolean isStep(Material block) + { + return block == Material.STEP || block == Material.STONE_SLAB2; + } + + @Override + public Object getDefault() + { + return true; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java new file mode 100644 index 0000000..b37cbeb --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java @@ -0,0 +1,106 @@ +package com.redstoner.modules.blockplacemods.mods; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +import com.redstoner.misc.Main; + +public class ModBooleanTorch extends ModBooleanAbstract +{ + { + Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2); + } + + private final Set torchesPlaced = new HashSet<>(); + + @Override + public String getName() + { + return "Torch"; + } + + @Override + public String getDescription() + { + return "removes redstone torches placed against a redstone block"; + } + + @Override + protected boolean enabledByDefault() + { + return true; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + final Player player = event.getPlayer(); + if (!player.isSneaking() && player.getGameMode() == GameMode.CREATIVE && hasEnabled(player) + && event.getBlock().getType() == Material.REDSTONE_TORCH_ON) + { + if (isAttachedToRedstoneBlock(event.getBlock())) + { + torchesPlaced.add(event.getBlock()); + } + } + } + + private boolean isAttachedToRedstoneBlock(Block block) + { + BlockFace towardsAgainst = getFaceTowardsBlockAgainst(block.getData()); + return towardsAgainst != null && block.getRelative(towardsAgainst).getType() == Material.REDSTONE_BLOCK; + } + + private BlockFace getFaceTowardsBlockAgainst(byte data) + { + switch (data) + { + case 1: + return BlockFace.WEST; + case 2: + return BlockFace.EAST; + case 3: + return BlockFace.NORTH; + case 4: + return BlockFace.SOUTH; + case 5: + return BlockFace.DOWN; + default: + return null; + } + } + + private void updateTorches() + { + for (Iterator it = torchesPlaced.iterator(); it.hasNext();) + { + Block block = it.next(); + if (block.getType() == Material.REDSTONE_TORCH_OFF) + { + block.setType(Material.AIR); + it.remove(); + } + else if (block.getType() != Material.REDSTONE_TORCH_ON || !isAttachedToRedstoneBlock(block)) + { + it.remove(); + } + } + } + + @Override + public Object getDefault() + { + return true; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java new file mode 100644 index 0000000..1ba7684 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java @@ -0,0 +1,174 @@ +package com.redstoner.modules.blockplacemods.mods; + +import java.util.ArrayList; + +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.redstoner.modules.blockplacemods.util.CommandException; +import com.redstoner.modules.blockplacemods.util.ItemProperties; +import com.redstoner.modules.datamanager.DataManager; + +public abstract class ModInventoryAbstract extends ModAbstract +{ + protected InventoryType inventoryType; + + @Override + protected void preConstruction() + { + inventoryType = getInventoryType(); + } + + protected abstract InventoryType getInventoryType(); + + private static int highestUsedIndex(ItemStack[] items) + { + for (int i = items.length - 1; i >= 0; i--) + { + if (items[i] != null) + { + return i; + } + } + return -1; + } + + @Override + public String getDescription() + { + return "Controls contents of " + inventoryType.name().toLowerCase() + "s upon placement"; + } + + @Override + public String runCommand(Player sender, String[] args) throws CommandException + { + if (args.length > 0) + { + if (args[0].equalsIgnoreCase("clear")) + { + reset(sender); + return "Reset data successfully"; + } + try + { + int slot = Integer.parseInt(args[0]); + if (slot >= inventoryType.getDefaultSize()) + { + throw new CommandException( + "Slot number " + slot + " is too high for " + inventoryType.toString().toLowerCase() + "s"); + } + if (slot < 0) + { + throw new CommandException("Slot number " + slot + " is negative"); + } + // Set the stored item to the item in the sender's hand + ItemStack item = sender.getItemInHand(); + if (item == null || item.getType() == Material.AIR || item.getAmount() == 0) + { + // Remove the item. + // Set item to null to ensure correct itemName below. + item = null; + if (present(sender)) + { + ItemStack[] data = get(sender); + data[slot] = null; + set(sender, data); + } + } + else + { + ItemStack[] data = get(sender); + data[slot] = item.clone(); + set(sender, data); + } + String itemName = item == null ? "nothing" + : item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", ""); + return "Set the item in slot " + slot + " to " + itemName; + } + catch (NumberFormatException ex) + { + if (!args[0].equalsIgnoreCase("help")) + { + throw new CommandException("Expected a number indicating the slot that you want to set"); + } + } + } + StringBuilder message = new StringBuilder(); + message.append("&a### &3").append(getName()).append("&a Help ###\n"); + message.append("&8").append(getDescription()).append('\n'); + message.append("&6/mod ").append(getName().toLowerCase()) + .append("&o &bsets the item in slot to your hand\n"); + message.append("&6/mod ").append(getName().toLowerCase()).append("&o clear &bclears the data\n"); + message.append("&6/mod ").append(getName().toLowerCase()).append("&o help &bshows this help page\n"); + return message.toString(); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + if (present(event.getPlayer())) + { + BlockState state = event.getBlock().getState(); + if (state instanceof InventoryHolder) + { + Inventory inv = ((InventoryHolder) state).getInventory(); + if (inv.getType() == inventoryType) + { + ItemStack[] data = get(event.getPlayer()); + inv.setContents(data); + state.update(); + } + } + } + } + + @SuppressWarnings("unchecked") + protected ItemStack[] get(Player player) + { + Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); + if (obj == null) + return new ItemStack[inventoryType.getDefaultSize()]; + JSONArray array = (JSONArray) obj; + ArrayList items = new ArrayList(); + for (Object obj2 : array.toArray()) + { + items.add((new ItemProperties()).loadFrom((JSONObject) obj2).toItemStack()); + } + ItemStack[] itemArray = new ItemStack[array.size()]; + for (int i = 0; i < itemArray.length; i++) + { + itemArray[i] = items.get(i); + } + return itemArray; + } + + protected void set(Player player, ItemStack[] data) + { + if (highestUsedIndex(data) == -1) + reset(player); + else + { + JSONArray array = new JSONArray(); + for (ItemStack stack : data) + { + array.add((new ItemProperties(stack)).toJSONObject()); + } + DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array); + } + } + + protected boolean present(Player player) + { + return get(player) != null; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java new file mode 100644 index 0000000..312dfe8 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java @@ -0,0 +1,24 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.event.inventory.InventoryType; + +public class ModInventoryDropper extends ModInventoryAbstract +{ + @Override + public String getName() + { + return "Dropper"; + } + + @Override + protected InventoryType getInventoryType() + { + return InventoryType.DROPPER; + } + + @Override + public Object getDefault() + { + return null; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java new file mode 100644 index 0000000..d0ecd46 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java @@ -0,0 +1,24 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.event.inventory.InventoryType; + +public class ModInventoryFurnace extends ModInventoryAbstract +{ + @Override + public String getName() + { + return "Furnace"; + } + + @Override + protected InventoryType getInventoryType() + { + return InventoryType.FURNACE; + } + + @Override + public Object getDefault() + { + return null; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java new file mode 100644 index 0000000..3154c98 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java @@ -0,0 +1,24 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.event.inventory.InventoryType; + +public class ModInventoryHopper extends ModInventoryAbstract +{ + @Override + public String getName() + { + return "Hopper"; + } + + @Override + protected InventoryType getInventoryType() + { + return InventoryType.HOPPER; + } + + @Override + public Object getDefault() + { + return null; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/util/CommandException.java b/src/com/redstoner/modules/blockplacemods/util/CommandException.java new file mode 100644 index 0000000..e113026 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/util/CommandException.java @@ -0,0 +1,23 @@ +package com.redstoner.modules.blockplacemods.util; + +public class CommandException extends Exception { + + public CommandException(String message, Throwable cause) { + super(message, cause); + } + + public CommandException(Throwable cause) { + super(cause); + } + + public CommandException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public CommandException() { + } + + public CommandException(String message) { + super(message); + } +} diff --git a/src/com/redstoner/modules/blockplacemods/util/CommandMap.java b/src/com/redstoner/modules/blockplacemods/util/CommandMap.java new file mode 100644 index 0000000..d350a62 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/util/CommandMap.java @@ -0,0 +1,22 @@ +package com.redstoner.modules.blockplacemods.util; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.plugin.SimplePluginManager; + +import java.lang.reflect.Field; +import java.util.Map; + +public class CommandMap { + + public static Map getCommandMap() throws ReflectiveOperationException, ClassCastException { + Field field = SimplePluginManager.class.getDeclaredField("commandMap"); + field.setAccessible(true); + Object map = field.get(Bukkit.getPluginManager()); + field = SimpleCommandMap.class.getDeclaredField("knownCommands"); + field.setAccessible(true); + return (Map) field.get(map); + } + +} diff --git a/src/com/redstoner/modules/blockplacemods/util/ItemProperties.java b/src/com/redstoner/modules/blockplacemods/util/ItemProperties.java new file mode 100644 index 0000000..223987c --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/util/ItemProperties.java @@ -0,0 +1,270 @@ +package com.redstoner.modules.blockplacemods.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.BiConsumer; + +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +/** Save and load {@link ItemStack} in json format + * Any additional NBT data not included by {@link ItemMeta} is discarded. */ +public class ItemProperties +{ + private int id = 0; + private byte data = 0; + private int amount = 1; + private Map enchantments; + private List lore; + private String displayName; + private boolean unbreakable = false; + + public ItemProperties() + {} + + public ItemProperties(ItemStack item) + { + if (item == null) + return; + id = item.getTypeId(); + data = item.getData().getData(); + amount = item.getAmount(); + enchantments = new HashMap<>(); + ItemMeta meta = item.getItemMeta(); + if (meta == null) + return; + if (meta.hasEnchants()) + { + enchantments.putAll(meta.getEnchants()); + } + if (meta.hasLore()) + { + lore = meta.getLore(); + } + if (meta.hasDisplayName()) + { + displayName = meta.getDisplayName(); + } + unbreakable = meta.isUnbreakable(); + } + + public ItemStack toItemStack() + { + ItemStack result = new ItemStack(id, amount, data); + ItemMeta meta = result.getItemMeta(); + if (meta == null) + return result; + if (enchantments != null) + { + enchantments.forEach(new BiConsumer() + { + @Override + public void accept(Enchantment ench, Integer level) + { + meta.addEnchant(ench, level, true); + } + }); + } + if (lore != null) + { + meta.setLore(lore); + } + if (displayName != null) + { + meta.setDisplayName(displayName); + } + meta.setUnbreakable(unbreakable); + result.setItemMeta(meta); + return result; + } + + @SuppressWarnings("unchecked") + public JSONObject toJSONObject() + { + JSONObject object = new JSONObject(); + object.put("id", id + ""); + object.put("data", data + ""); + object.put("amount", amount + ""); + if (displayName != null) + { + object.put("displayName", displayName); + } + if (enchantments != null) + { + Map enchantments = this.enchantments; + JSONObject stringKeys = new JSONObject(); + for (Map.Entry entry : enchantments.entrySet()) + { + stringKeys.put(entry.getKey().getName(), entry.getValue()); + } + object.put("enchantments", stringKeys); + } + if (lore != null) + { + object.put("lore", JSONArray.toJSONString(lore)); + } + if (unbreakable) + { + object.put("unbreakable", true); + } + return object; + } + + @Override + public String toString() + { + return toJSONObject().toString(); + } + + @SuppressWarnings("unchecked") + public ItemProperties loadFrom(JSONObject object) + { + for (Object obj : object.entrySet()) + { + Entry entry = (Entry) obj; + final String key = entry.getKey(); + switch (key) + { + case "id": + id = Integer.parseInt((String) entry.getValue()); + break; + case "data": + data = Byte.parseByte((String) entry.getValue()); + break; + case "amount": + amount = Integer.parseInt((String) entry.getValue()); + break; + case "unbreakable": + unbreakable = (boolean) entry.getValue(); + break; + case "enchantments": + { + if (enchantments == null) + { + enchantments = new HashMap<>(); + } + else if (!enchantments.isEmpty()) + { + enchantments.clear(); + } + JSONObject read = (JSONObject) entry.getValue(); + if (read != null) + { + for (Object obj2 : read.entrySet()) + { + Entry entry2 = (Entry) obj2; + Enchantment ench = Enchantment.getByName(entry2.getKey()); + if (ench != null) + { + enchantments.put(ench, entry2.getValue()); + } + } + } + break; + } + case "lore": + JSONParser parser = new JSONParser(); + Object rawObject; + try + { + rawObject = parser.parse((String) entry.getValue()); + } + catch (ParseException e) + { + rawObject = new JSONArray(); + } + JSONArray jsonArray = (JSONArray) rawObject; + lore = jsonArray; + break; + case "displayName": + displayName = (String) entry.getValue(); + default: + } + } + return this; + } + + public int getId() + { + return id; + } + + public byte getData() + { + return data; + } + + public int getAmount() + { + return amount; + } + + public Map getEnchantments() + { + return enchantments; + } + + public List getLore() + { + return lore; + } + + public String getDisplayName() + { + return displayName; + } + + public boolean isUnbreakable() + { + return unbreakable; + } + + public ItemProperties setId(int id) + { + this.id = id; + return this; + } + + public ItemProperties setData(byte data) + { + this.data = data; + return this; + } + + public ItemProperties setAmount(int amount) + { + this.amount = amount; + return this; + } + + public ItemProperties setEnchantments(Map enchantments) + { + this.enchantments = enchantments; + return this; + } + + public ItemProperties setLore(List lore) + { + this.lore = lore; + return this; + } + + public ItemProperties setDisplayName(String displayName) + { + this.displayName = displayName; + return this; + } + + public ItemProperties setUnbreakable(boolean unbreakable) + { + this.unbreakable = unbreakable; + return this; + } +} diff --git a/src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java b/src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java new file mode 100644 index 0000000..9dc3cf3 --- /dev/null +++ b/src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java @@ -0,0 +1,12 @@ +package com.redstoner.modules.blockplacemods.util; + +/** + * A supplier with a throws declaration. + * Once again, I have more solid alternatives, but if you want it in your utils... be my guest :D + * + * @param The type of object computed by this supplier. + */ +@FunctionalInterface +public interface ThrowingSupplier { + T get() throws Throwable; +} From 2a3958d9b338ca486e636d984785c9ce924f86e4 Mon Sep 17 00:00:00 2001 From: Pepich Date: Mon, 29 May 2017 12:46:41 +0200 Subject: [PATCH 02/15] Fixed remove method not properly deteling entries --- src/com/redstoner/modules/datamanager/DataManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/redstoner/modules/datamanager/DataManager.java b/src/com/redstoner/modules/datamanager/DataManager.java index 969cf31..a309470 100644 --- a/src/com/redstoner/modules/datamanager/DataManager.java +++ b/src/com/redstoner/modules/datamanager/DataManager.java @@ -27,7 +27,7 @@ import com.redstoner.modules.CoreModule; import com.redstoner.modules.Module; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 0, compatible = 3) +@Version(major = 3, minor = 2, revision = 1, compatible = 3) public final class DataManager implements CoreModule, Listener { protected final File dataFolder = new File(Main.plugin.getDataFolder(), "data"); @@ -322,6 +322,7 @@ public final class DataManager implements CoreModule, Listener {} } + @SuppressWarnings("unchecked") protected void removeData_(String id, String module, String key) { if (data.containsKey(id)) @@ -330,6 +331,7 @@ public final class DataManager implements CoreModule, Listener if (moduleData == null) return; moduleData.remove(key); + data.put(module, data); save_(id); } else From 18dc672bdd688bab8bad63cca30460ad21b70aba Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 13:57:03 +0200 Subject: [PATCH 03/15] Clean up BlockPlaceMods --- .../blockplacemods/BlockPlaceMods.java | 101 ++++++++---------- .../modules/blockplacemods/mods/Mod.java | 13 ++- .../blockplacemods/mods/ModAbstract.java | 93 ++++++++-------- ...ventoryAbstract.java => ModInventory.java} | 74 +++++++------ .../mods/ModInventoryDropper.java | 24 ----- .../mods/ModInventoryFurnace.java | 24 ----- .../mods/ModInventoryHopper.java | 24 ----- ...nAbstract.java => ModToggledAbstract.java} | 14 +-- ...nCauldron.java => ModToggledCauldron.java} | 20 +--- ...oleanPiston.java => ModToggledPiston.java} | 20 +--- ...odBooleanStep.java => ModToggledStep.java} | 23 +--- ...BooleanTorch.java => ModToggledTorch.java} | 33 ++---- 12 files changed, 165 insertions(+), 298 deletions(-) rename src/com/redstoner/modules/blockplacemods/mods/{ModInventoryAbstract.java => ModInventory.java} (76%) delete mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java delete mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java delete mode 100644 src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java rename src/com/redstoner/modules/blockplacemods/mods/{ModBooleanAbstract.java => ModToggledAbstract.java} (88%) rename src/com/redstoner/modules/blockplacemods/mods/{ModBooleanCauldron.java => ModToggledCauldron.java} (81%) rename src/com/redstoner/modules/blockplacemods/mods/{ModBooleanPiston.java => ModToggledPiston.java} (83%) rename src/com/redstoner/modules/blockplacemods/mods/{ModBooleanStep.java => ModToggledStep.java} (76%) rename src/com/redstoner/modules/blockplacemods/mods/{ModBooleanTorch.java => ModToggledTorch.java} (89%) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index cfda593..ee1e6e4 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -1,15 +1,7 @@ package com.redstoner.modules.blockplacemods; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Map; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Version; import com.redstoner.misc.Main; import com.redstoner.misc.Utils; @@ -18,9 +10,17 @@ import com.redstoner.modules.blockplacemods.mods.Mod; import com.redstoner.modules.blockplacemods.mods.ModAbstract; import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.blockplacemods.util.CommandMap; -import com.redstoner.modules.blockplacemods.util.ThrowingSupplier; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; -@Version(major = 3, minor = 1, revision = 0, compatible = 3) +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; + +@AutoRegisterListener +@Version(major = 3, minor = 2, revision = 0, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -29,10 +29,10 @@ public final class BlockPlaceMods implements Module, Listener @Override public boolean onEnable() { - ModAbstract.constructAll(); + ModAbstract.registerAll(); for (Mod mod : new ArrayList<>(ModAbstract.getMods().values())) { - mod.register(); + mod.registerListeners(); } // CommandManager.registerCommand(getCommandString(), this, Main.plugin); // Sorry but this stuff isn't working for me. Not gonna spend more time on it. @@ -66,7 +66,7 @@ public final class BlockPlaceMods implements Module, Listener { for (Mod mod : ModAbstract.getMods().values()) { - mod.unregister(); + mod.unregisterListeners(); } try { @@ -91,6 +91,7 @@ public final class BlockPlaceMods implements Module, Listener * "}\n" + * "}\n"; * } */ + @Command(hook = "mod_empty") public void onModEmptyCommand(CommandSender sender) { @@ -103,36 +104,36 @@ public final class BlockPlaceMods implements Module, Listener String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream() .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new); String prefix = PREFIX; - ThrowingSupplier supplier; - if (args.length > 0) - { - Mod target = ModAbstract.getMod(args[0].toLowerCase()); - if (target != null) - { - prefix += "&7[&2" + target.getName() + "&7]&a"; - if (!(sender instanceof Player)) - { - supplier = () -> "&cYou must be a player to use any block place mod"; - } - else - { - supplier = () -> target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length)); + String message; + + try { + + if (args.length > 0) { + Mod target = ModAbstract.getMod(args[0].toLowerCase()); + if (target != null) { + prefix += "&7[&2" + target.getName() + "&7]&a"; + if (!(sender instanceof Player)) { + message = "&cYou must be a player to use any block place mod"; + } else { + message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length)); + } + } else if (args[0].equalsIgnoreCase("help")) { + message = commandHelp(sender, args); + } else { + message = "&cThat argument could not be recognized"; } + } else { + message = commandHelp(sender, args); } - else if (args[0].equalsIgnoreCase("help")) - { - supplier = () -> commandHelp(sender, args); - } - else - { - supplier = () -> "&cThat argument could not be recognized"; - } + + } catch (CommandException ex) { + message = " &c" + ex.getMessage(); + } catch (Throwable t) { + message = " &cAn unexpected error occurred while executing this command."; + t.printStackTrace(); } - else - { - supplier = () -> commandHelp(sender, args); - } - handleCommand(sender, prefix, supplier); + + Utils.sendMessage(sender, prefix, message, '&'); } private String commandHelp(CommandSender sender, String[] args) @@ -148,22 +149,4 @@ public final class BlockPlaceMods implements Module, Listener return result.toString(); } - public static void handleCommand(CommandSender sender, String prefix, ThrowingSupplier supplier) - { - String message; - try - { - message = " &a" + supplier.get(); - } - catch (CommandException e) - { - message = " &c" + e.getMessage(); - } - catch (Throwable t) - { - message = " &cAn unexpected error occurred while executing this command."; - t.printStackTrace(); - } - Utils.sendMessage(sender, prefix, message, '&'); - } } diff --git a/src/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/com/redstoner/modules/blockplacemods/mods/Mod.java index c34a460..7429010 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/Mod.java +++ b/src/com/redstoner/modules/blockplacemods/mods/Mod.java @@ -1,12 +1,11 @@ package com.redstoner.modules.blockplacemods.mods; +import com.redstoner.modules.blockplacemods.util.CommandException; +import org.bukkit.entity.Player; + import java.util.Set; -import org.bukkit.entity.Player; - -import com.redstoner.modules.blockplacemods.util.CommandException; - -public interface Mod +public interface Mod { String getName(); @@ -18,7 +17,7 @@ public interface Mod String runCommand(Player sender, String[] args) throws CommandException; - void register(); + void registerListeners(); - void unregister(); + void unregisterListeners(); } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java index f2cde40..4184ffe 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java @@ -1,23 +1,21 @@ package com.redstoner.modules.blockplacemods.mods; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - import com.redstoner.misc.Main; import com.redstoner.misc.Utils; import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryType; -public abstract class ModAbstract implements Mod, Listener +import java.util.*; + +public abstract class ModAbstract implements Mod, Listener { private static final Map mods = new HashMap<>(); + private final String name; + private final Set aliases; public static Map getMods() { @@ -29,45 +27,34 @@ public abstract class ModAbstract implements Mod, Listener return mods.get(name); } - public static void constructAll() - { - new ModBooleanCauldron(); - new ModBooleanPiston(); - new ModBooleanStep(); - new ModBooleanTorch(); - new ModInventoryDropper(); - new ModInventoryFurnace(); - new ModInventoryHopper(); - } - - private final Set aliases; - - public ModAbstract() - { - preConstruction(); - Utils.info("Loaded mod " + getName()); - aliases = new HashSet<>(); - aliases.add(getName()); - mods.put(getName().toLowerCase(), this); - } - - protected void preConstruction() - {} - - @Override - public void register() - { - for (String alias : aliases) - { - mods.putIfAbsent(alias.toLowerCase(), this); + public static void registerMod(Mod mod) { + mods.put(mod.getName(), mod); + for (String alias : mod.getAliases()) { + mods.putIfAbsent(alias, mod); } - Bukkit.getPluginManager().registerEvents(this, Main.plugin); + } + + public static void registerAll() + { + registerMod(new ModToggledCauldron()); + registerMod(new ModToggledPiston()); + registerMod(new ModToggledStep()); + registerMod(new ModToggledTorch()); + registerMod(new ModInventory("dropper", InventoryType.DROPPER)); + registerMod(new ModInventory("furnace", InventoryType.FURNACE)); + registerMod(new ModInventory("hopper", InventoryType.HOPPER)); + } + + public ModAbstract(String name) + { + this.name = Objects.requireNonNull(name); + this.aliases = new HashSet<>(2); + Utils.info("Loaded mod " + name); } @Override - public void unregister() - { - HandlerList.unregisterAll(this); + public String getName() { + return name; } @Override @@ -76,6 +63,18 @@ public abstract class ModAbstract implements Mod, Listener return aliases; } + @Override + public void registerListeners() + { + Bukkit.getPluginManager().registerEvents(this, Main.plugin); + } + + @Override + public void unregisterListeners() + { + HandlerList.unregisterAll(this); + } + protected void reset(Player player) { DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java similarity index 76% rename from src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java rename to src/com/redstoner/modules/blockplacemods/mods/ModInventory.java index 1ba7684..9f219bc 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryAbstract.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java @@ -1,7 +1,8 @@ package com.redstoner.modules.blockplacemods.mods; -import java.util.ArrayList; - +import com.redstoner.modules.blockplacemods.util.CommandException; +import com.redstoner.modules.blockplacemods.util.ItemProperties; +import com.redstoner.modules.datamanager.DataManager; import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; @@ -15,22 +16,17 @@ import org.bukkit.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import com.redstoner.modules.blockplacemods.util.CommandException; -import com.redstoner.modules.blockplacemods.util.ItemProperties; -import com.redstoner.modules.datamanager.DataManager; +import java.util.Arrays; -public abstract class ModInventoryAbstract extends ModAbstract +public class ModInventory extends ModAbstract { protected InventoryType inventoryType; - @Override - protected void preConstruction() - { - inventoryType = getInventoryType(); + public ModInventory(String name, InventoryType inventoryType) { + super(name); + this.inventoryType = inventoryType; } - protected abstract InventoryType getInventoryType(); - private static int highestUsedIndex(ItemStack[] items) { for (int i = items.length - 1; i >= 0; i--) @@ -80,16 +76,12 @@ public abstract class ModInventoryAbstract extends ModAbstract item = null; if (present(sender)) { - ItemStack[] data = get(sender); - data[slot] = null; - set(sender, data); + set(sender, slot, null); } } else { - ItemStack[] data = get(sender); - data[slot] = item.clone(); - set(sender, data); + set(sender, slot, item);// don't need to clone because the reference isn't kept } String itemName = item == null ? "nothing" : item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", ""); @@ -137,19 +129,33 @@ public abstract class ModInventoryAbstract extends ModAbstract { Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); if (obj == null) - return new ItemStack[inventoryType.getDefaultSize()]; + return getDefault(); JSONArray array = (JSONArray) obj; - ArrayList items = new ArrayList(); - for (Object obj2 : array.toArray()) - { - items.add((new ItemProperties()).loadFrom((JSONObject) obj2).toItemStack()); + + ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())]; + for (int i = 0, n = items.length; i < n; i++) { + Object obj2 = array.get(i); + if (obj2 instanceof JSONObject) { // if null, items[i] remains null + items[i] = new ItemProperties().loadFrom((JSONObject) obj2).toItemStack(); + } } - ItemStack[] itemArray = new ItemStack[array.size()]; - for (int i = 0; i < itemArray.length; i++) - { - itemArray[i] = items.get(i); + + return items; + } + + protected void set(Player player, int index, ItemStack item) { + ItemStack[] data = get(player); + if (item == null) { + if (index < data.length) { + data[index] = null; + } + } else { + if (index >= data.length) { + data = Arrays.copyOf(data, index + 1); + } + data[index] = item; } - return itemArray; + set(player, data); } protected void set(Player player, ItemStack[] data) @@ -159,9 +165,9 @@ public abstract class ModInventoryAbstract extends ModAbstract else { JSONArray array = new JSONArray(); - for (ItemStack stack : data) - { - array.add((new ItemProperties(stack)).toJSONObject()); + for (int i = 0, n = highestUsedIndex(data); i < n; i++) { + ItemStack item = data[i]; + array.add(item == null ? null : new ItemProperties(item).toJSONObject()); } DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array); } @@ -171,4 +177,10 @@ public abstract class ModInventoryAbstract extends ModAbstract { return get(player) != null; } + + @Override + public ItemStack[] getDefault() { + return new ItemStack[0]; + } + } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java deleted file mode 100644 index 312dfe8..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryDropper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.event.inventory.InventoryType; - -public class ModInventoryDropper extends ModInventoryAbstract -{ - @Override - public String getName() - { - return "Dropper"; - } - - @Override - protected InventoryType getInventoryType() - { - return InventoryType.DROPPER; - } - - @Override - public Object getDefault() - { - return null; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java deleted file mode 100644 index d0ecd46..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryFurnace.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.event.inventory.InventoryType; - -public class ModInventoryFurnace extends ModInventoryAbstract -{ - @Override - public String getName() - { - return "Furnace"; - } - - @Override - protected InventoryType getInventoryType() - { - return InventoryType.FURNACE; - } - - @Override - public Object getDefault() - { - return null; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java deleted file mode 100644 index 3154c98..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventoryHopper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.event.inventory.InventoryType; - -public class ModInventoryHopper extends ModInventoryAbstract -{ - @Override - public String getName() - { - return "Hopper"; - } - - @Override - protected InventoryType getInventoryType() - { - return InventoryType.HOPPER; - } - - @Override - public Object getDefault() - { - return null; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java similarity index 88% rename from src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java rename to src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java index 1faa8c5..c3bf2ca 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanAbstract.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java @@ -5,16 +5,18 @@ import org.bukkit.entity.Player; import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.datamanager.DataManager; -public abstract class ModBooleanAbstract extends ModAbstract +public abstract class ModToggledAbstract extends ModAbstract { protected boolean enabledByDefault; - protected abstract boolean enabledByDefault(); + public ModToggledAbstract(String name, boolean enabledByDefault) { + super(name); + this.enabledByDefault = enabledByDefault; + } @Override - protected void preConstruction() - { - enabledByDefault = enabledByDefault(); + public Boolean getDefault() { + return enabledByDefault; } protected boolean hasEnabled(Player player) @@ -27,7 +29,7 @@ public abstract class ModBooleanAbstract extends ModAbstract { if (enabled == hasEnabled(sender)) return false; - if (enabled == (boolean) getDefault()) + if (enabled == enabledByDefault) reset(sender); else DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled); diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java similarity index 81% rename from src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java rename to src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java index d831b1e..64ae2b8 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanCauldron.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java @@ -8,12 +8,11 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -public class ModBooleanCauldron extends ModBooleanAbstract +public class ModToggledCauldron extends ModToggledAbstract { - @Override - public String getName() - { - return "Cauldron"; + + public ModToggledCauldron() { + super("cauldron", false); } @Override @@ -22,12 +21,6 @@ public class ModBooleanCauldron extends ModBooleanAbstract return "fills cauldrons upon placement and cycles upon right click"; } - @Override - protected boolean enabledByDefault() - { - return false; - } - @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { @@ -49,9 +42,4 @@ public class ModBooleanCauldron extends ModBooleanAbstract } } - @Override - public Object getDefault() - { - return false; - } } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java similarity index 83% rename from src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java rename to src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java index e8542f7..aae3bcc 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanPiston.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java @@ -9,12 +9,11 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; -public class ModBooleanPiston extends ModBooleanAbstract +public class ModToggledPiston extends ModToggledAbstract { - @Override - public String getName() - { - return "Piston"; + + public ModToggledPiston() { + super("piston", false); } @Override @@ -23,12 +22,6 @@ public class ModBooleanPiston extends ModBooleanAbstract return "makes pistons face the block you placed it against"; } - @Override - protected boolean enabledByDefault() - { - return false; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -67,9 +60,4 @@ public class ModBooleanPiston extends ModBooleanAbstract } } - @Override - public Object getDefault() - { - return false; - } } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java similarity index 76% rename from src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java rename to src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java index 91f1126..ec340bd 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanStep.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java @@ -5,16 +5,12 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; -public class ModBooleanStep extends ModBooleanAbstract +public class ModToggledStep extends ModToggledAbstract { - { - getAliases().add("Slab"); - } - @Override - public String getName() - { - return "Step"; + public ModToggledStep() { + super("step", true); + getAliases().add("Slab"); } @Override @@ -23,12 +19,6 @@ public class ModBooleanStep extends ModBooleanAbstract return "turns steps upside-down upon placement"; } - @Override - protected boolean enabledByDefault() - { - return true; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -47,9 +37,4 @@ public class ModBooleanStep extends ModBooleanAbstract return block == Material.STEP || block == Material.STONE_SLAB2; } - @Override - public Object getDefault() - { - return true; - } } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java similarity index 89% rename from src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java rename to src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java index b37cbeb..a13f6cb 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModBooleanTorch.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java @@ -1,9 +1,6 @@ package com.redstoner.modules.blockplacemods.mods; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - +import com.redstoner.misc.Main; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -14,20 +11,17 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; -import com.redstoner.misc.Main; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; -public class ModBooleanTorch extends ModBooleanAbstract +public class ModToggledTorch extends ModToggledAbstract { - { - Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2); - } - private final Set torchesPlaced = new HashSet<>(); - @Override - public String getName() - { - return "Torch"; + public ModToggledTorch() { + super("torch", true); + Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2); } @Override @@ -36,12 +30,6 @@ public class ModBooleanTorch extends ModBooleanAbstract return "removes redstone torches placed against a redstone block"; } - @Override - protected boolean enabledByDefault() - { - return true; - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -98,9 +86,4 @@ public class ModBooleanTorch extends ModBooleanAbstract } } - @Override - public Object getDefault() - { - return true; - } } From ba6ae698363dd1cc7b3bf6e19bada05a37d02075 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 13:59:19 +0200 Subject: [PATCH 04/15] Remove redundant toLowerCase() --- src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index ee1e6e4..81b5c4a 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -143,7 +143,7 @@ public final class BlockPlaceMods implements Module, Listener for (Mod mod : ModAbstract.getMods().values()) { result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString()) - .append(mod.getName().toLowerCase()).append(ChatColor.GRAY.toString()).append(" - ") + .append(mod.getName()).append(ChatColor.GRAY.toString()).append(" - ") .append(mod.getDescription()); } return result.toString(); From 102e999f13ee0c865c6e2b27c9998d5a8a17ab11 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:04:47 +0200 Subject: [PATCH 05/15] Clean up help message a bit --- .../blockplacemods/BlockPlaceMods.java | 19 ++++++++++++++----- .../blockplacemods/mods/ModToggledStep.java | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 81b5c4a..6f69ee6 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -8,6 +8,7 @@ import com.redstoner.misc.Utils; import com.redstoner.modules.Module; import com.redstoner.modules.blockplacemods.mods.Mod; import com.redstoner.modules.blockplacemods.mods.ModAbstract; +import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract; import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.blockplacemods.util.CommandMap; import org.bukkit.ChatColor; @@ -15,9 +16,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Listener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Map; +import java.util.*; @AutoRegisterListener @Version(major = 3, minor = 2, revision = 0, compatible = 3) @@ -140,10 +139,20 @@ public final class BlockPlaceMods implements Module, Listener { StringBuilder result = new StringBuilder("§7BlockPlaceMods adds some redstone-centric utilities"); result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:"); - for (Mod mod : ModAbstract.getMods().values()) + + List mods = new ArrayList<>(ModAbstract.getMods().values()); + mods.sort(Comparator.comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1).thenComparing(Mod::getName)); + + for (Mod mod : mods) { result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString()) - .append(mod.getName()).append(ChatColor.GRAY.toString()).append(" - ") + .append(mod.getName()); + + for (String alias : mod.getAliases()) { + result.append('|').append(alias); + } + + result.append(ChatColor.GRAY.toString()).append(" - ") .append(mod.getDescription()); } return result.toString(); diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java index ec340bd..a01614d 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java @@ -10,7 +10,7 @@ public class ModToggledStep extends ModToggledAbstract public ModToggledStep() { super("step", true); - getAliases().add("Slab"); + getAliases().add("slab"); } @Override From 5441ea077c6c82103dfb4581f3ffba0ab920d216 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:09:25 +0200 Subject: [PATCH 06/15] Improve descriptions --- src/com/redstoner/modules/blockplacemods/mods/ModInventory.java | 2 +- .../modules/blockplacemods/mods/ModToggledCauldron.java | 2 +- .../redstoner/modules/blockplacemods/mods/ModToggledPiston.java | 2 +- .../redstoner/modules/blockplacemods/mods/ModToggledStep.java | 2 +- .../redstoner/modules/blockplacemods/mods/ModToggledTorch.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java index 9f219bc..fd980ed 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java @@ -42,7 +42,7 @@ public class ModInventory extends ModAbstract @Override public String getDescription() { - return "Controls contents of " + inventoryType.name().toLowerCase() + "s upon placement"; + return "Controls " + inventoryType.name().toLowerCase() + " placement content"; } @Override diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java index 64ae2b8..1e37cd3 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java @@ -18,7 +18,7 @@ public class ModToggledCauldron extends ModToggledAbstract @Override public String getDescription() { - return "fills cauldrons upon placement and cycles upon right click"; + return "If active, placed cauldrons are filled, and they cycle on right click"; } @EventHandler diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java index aae3bcc..df1c745 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java @@ -19,7 +19,7 @@ public class ModToggledPiston extends ModToggledAbstract @Override public String getDescription() { - return "makes pistons face the block you placed it against"; + return "If active, pistons face the block you place them against"; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java index a01614d..a076cfc 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java @@ -16,7 +16,7 @@ public class ModToggledStep extends ModToggledAbstract @Override public String getDescription() { - return "turns steps upside-down upon placement"; + return "If active, placed steps will always turn upside-down"; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java index a13f6cb..91cb8b5 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java @@ -27,7 +27,7 @@ public class ModToggledTorch extends ModToggledAbstract @Override public String getDescription() { - return "removes redstone torches placed against a redstone block"; + return "If active, redstone torches placed on a redstone block disappear quickly"; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) From 8bcebab9d0975cfd546018d3b7e35eb7ec98f9e3 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:13:24 +0200 Subject: [PATCH 07/15] Update revision number --- src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 6f69ee6..bc52fa2 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -19,7 +19,7 @@ import org.bukkit.event.Listener; import java.util.*; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 0, compatible = 3) +@Version(major = 3, minor = 2, revision = 1, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" From 071203be2c6af256050b65bbdfa2ce06d61ccfce Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:46:16 +0200 Subject: [PATCH 08/15] Capitalize mod name in message prefix --- .../modules/blockplacemods/BlockPlaceMods.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index bc52fa2..ba9dced 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -110,7 +110,7 @@ public final class BlockPlaceMods implements Module, Listener if (args.length > 0) { Mod target = ModAbstract.getMod(args[0].toLowerCase()); if (target != null) { - prefix += "&7[&2" + target.getName() + "&7]&a"; + prefix += "&7[&2" + capitalize(target.getName()) + "&7]&a"; if (!(sender instanceof Player)) { message = "&cYou must be a player to use any block place mod"; } else { @@ -158,4 +158,17 @@ public final class BlockPlaceMods implements Module, Listener return result.toString(); } + private static String capitalize(String modName) { + if (modName.isEmpty()) { + return modName; + } + char first = modName.charAt(0); + if (first != (first = Character.toUpperCase(first))) { + char[] result = modName.toCharArray(); + result[0] = first; + return String.valueOf(result); + } + return modName; + } + } From 10c9d6f97741ea3ddfa9f2ead49dd638e026a644 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:46:31 +0200 Subject: [PATCH 09/15] Increment revision number --- src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index ba9dced..550a817 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -19,7 +19,7 @@ import org.bukkit.event.Listener; import java.util.*; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 1, compatible = 3) +@Version(major = 3, minor = 2, revision = 2, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" From 8c59af9ec32d981d1dbf1070e14ef828796cbc34 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 29 May 2017 14:50:58 +0200 Subject: [PATCH 10/15] Change ModInventory command help, update revision number --- src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 2 +- src/com/redstoner/modules/blockplacemods/mods/ModInventory.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 550a817..229fcf6 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -19,7 +19,7 @@ import org.bukkit.event.Listener; import java.util.*; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 2, compatible = 3) +@Version(major = 3, minor = 2, revision = 3, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java index fd980ed..2a804f2 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java @@ -96,7 +96,7 @@ public class ModInventory extends ModAbstract } } StringBuilder message = new StringBuilder(); - message.append("&a### &3").append(getName()).append("&a Help ###\n"); + message.append("&a### &3Container&a Help ###\n"); message.append("&8").append(getDescription()).append('\n'); message.append("&6/mod ").append(getName().toLowerCase()) .append("&o &bsets the item in slot to your hand\n"); From c0fab2a72e68e526b01fe8e3fec3170cbd7042fc Mon Sep 17 00:00:00 2001 From: Pepich Date: Tue, 30 May 2017 11:52:34 +0200 Subject: [PATCH 11/15] Moved "util" package contents into correct "utils" package --- .../blockplacemods/BlockPlaceMods.java | 87 +++++++++++-------- .../modules/blockplacemods/mods/Mod.java | 3 +- .../blockplacemods/mods/ModInventory.java | 5 +- .../mods/ModToggledAbstract.java | 2 +- .../util => utils}/CommandException.java | 2 +- .../util => utils}/CommandMap.java | 2 +- .../util => utils}/ItemProperties.java | 2 +- .../util => utils}/ThrowingSupplier.java | 2 +- 8 files changed, 61 insertions(+), 44 deletions(-) rename src/com/redstoner/{modules/blockplacemods/util => utils}/CommandException.java (91%) rename src/com/redstoner/{modules/blockplacemods/util => utils}/CommandMap.java (92%) rename src/com/redstoner/{modules/blockplacemods/util => utils}/ItemProperties.java (99%) rename src/com/redstoner/{modules/blockplacemods/util => utils}/ThrowingSupplier.java (85%) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 229fcf6..41c6c1e 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -1,5 +1,16 @@ package com.redstoner.modules.blockplacemods; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Version; @@ -9,17 +20,11 @@ import com.redstoner.modules.Module; import com.redstoner.modules.blockplacemods.mods.Mod; import com.redstoner.modules.blockplacemods.mods.ModAbstract; import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract; -import com.redstoner.modules.blockplacemods.util.CommandException; -import com.redstoner.modules.blockplacemods.util.CommandMap; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - -import java.util.*; +import com.redstoner.utils.CommandException; +import com.redstoner.utils.CommandMap; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 3, compatible = 3) +@Version(major = 3, minor = 2, revision = 4, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -90,7 +95,6 @@ public final class BlockPlaceMods implements Module, Listener * "}\n" + * "}\n"; * } */ - @Command(hook = "mod_empty") public void onModEmptyCommand(CommandSender sender) { @@ -104,34 +108,46 @@ public final class BlockPlaceMods implements Module, Listener .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new); String prefix = PREFIX; String message; - - try { - - if (args.length > 0) { + try + { + if (args.length > 0) + { Mod target = ModAbstract.getMod(args[0].toLowerCase()); - if (target != null) { + if (target != null) + { prefix += "&7[&2" + capitalize(target.getName()) + "&7]&a"; - if (!(sender instanceof Player)) { + if (!(sender instanceof Player)) + { message = "&cYou must be a player to use any block place mod"; - } else { + } + else + { message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length)); } - } else if (args[0].equalsIgnoreCase("help")) { + } + else if (args[0].equalsIgnoreCase("help")) + { message = commandHelp(sender, args); - } else { + } + else + { message = "&cThat argument could not be recognized"; } - } else { + } + else + { message = commandHelp(sender, args); } - - } catch (CommandException ex) { + } + catch (CommandException ex) + { message = " &c" + ex.getMessage(); - } catch (Throwable t) { + } + catch (Throwable t) + { message = " &cAn unexpected error occurred while executing this command."; t.printStackTrace(); } - Utils.sendMessage(sender, prefix, message, '&'); } @@ -139,36 +155,35 @@ public final class BlockPlaceMods implements Module, Listener { StringBuilder result = new StringBuilder("§7BlockPlaceMods adds some redstone-centric utilities"); result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:"); - List mods = new ArrayList<>(ModAbstract.getMods().values()); - mods.sort(Comparator.comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1).thenComparing(Mod::getName)); - + mods.sort(Comparator. comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1) + .thenComparing(Mod::getName)); for (Mod mod : mods) { result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString()) .append(mod.getName()); - - for (String alias : mod.getAliases()) { + for (String alias : mod.getAliases()) + { result.append('|').append(alias); } - - result.append(ChatColor.GRAY.toString()).append(" - ") - .append(mod.getDescription()); + result.append(ChatColor.GRAY.toString()).append(" - ").append(mod.getDescription()); } return result.toString(); } - private static String capitalize(String modName) { - if (modName.isEmpty()) { + private static String capitalize(String modName) + { + if (modName.isEmpty()) + { return modName; } char first = modName.charAt(0); - if (first != (first = Character.toUpperCase(first))) { + if (first != (first = Character.toUpperCase(first))) + { char[] result = modName.toCharArray(); result[0] = first; return String.valueOf(result); } return modName; } - } diff --git a/src/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/com/redstoner/modules/blockplacemods/mods/Mod.java index 7429010..9a2fcad 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/Mod.java +++ b/src/com/redstoner/modules/blockplacemods/mods/Mod.java @@ -1,8 +1,9 @@ package com.redstoner.modules.blockplacemods.mods; -import com.redstoner.modules.blockplacemods.util.CommandException; import org.bukkit.entity.Player; +import com.redstoner.utils.CommandException; + import java.util.Set; public interface Mod diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java index 2a804f2..0d3f2af 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java @@ -1,8 +1,9 @@ package com.redstoner.modules.blockplacemods.mods; -import com.redstoner.modules.blockplacemods.util.CommandException; -import com.redstoner.modules.blockplacemods.util.ItemProperties; import com.redstoner.modules.datamanager.DataManager; +import com.redstoner.utils.CommandException; +import com.redstoner.utils.ItemProperties; + import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java index c3bf2ca..ba3d37e 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java @@ -2,8 +2,8 @@ package com.redstoner.modules.blockplacemods.mods; import org.bukkit.entity.Player; -import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.datamanager.DataManager; +import com.redstoner.utils.CommandException; public abstract class ModToggledAbstract extends ModAbstract { diff --git a/src/com/redstoner/modules/blockplacemods/util/CommandException.java b/src/com/redstoner/utils/CommandException.java similarity index 91% rename from src/com/redstoner/modules/blockplacemods/util/CommandException.java rename to src/com/redstoner/utils/CommandException.java index e113026..2445134 100644 --- a/src/com/redstoner/modules/blockplacemods/util/CommandException.java +++ b/src/com/redstoner/utils/CommandException.java @@ -1,4 +1,4 @@ -package com.redstoner.modules.blockplacemods.util; +package com.redstoner.utils; public class CommandException extends Exception { diff --git a/src/com/redstoner/modules/blockplacemods/util/CommandMap.java b/src/com/redstoner/utils/CommandMap.java similarity index 92% rename from src/com/redstoner/modules/blockplacemods/util/CommandMap.java rename to src/com/redstoner/utils/CommandMap.java index d350a62..7ae67d0 100644 --- a/src/com/redstoner/modules/blockplacemods/util/CommandMap.java +++ b/src/com/redstoner/utils/CommandMap.java @@ -1,4 +1,4 @@ -package com.redstoner.modules.blockplacemods.util; +package com.redstoner.utils; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/com/redstoner/modules/blockplacemods/util/ItemProperties.java b/src/com/redstoner/utils/ItemProperties.java similarity index 99% rename from src/com/redstoner/modules/blockplacemods/util/ItemProperties.java rename to src/com/redstoner/utils/ItemProperties.java index 223987c..8c8b27e 100644 --- a/src/com/redstoner/modules/blockplacemods/util/ItemProperties.java +++ b/src/com/redstoner/utils/ItemProperties.java @@ -1,4 +1,4 @@ -package com.redstoner.modules.blockplacemods.util; +package com.redstoner.utils; import java.util.HashMap; import java.util.List; diff --git a/src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java b/src/com/redstoner/utils/ThrowingSupplier.java similarity index 85% rename from src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java rename to src/com/redstoner/utils/ThrowingSupplier.java index 9dc3cf3..986746b 100644 --- a/src/com/redstoner/modules/blockplacemods/util/ThrowingSupplier.java +++ b/src/com/redstoner/utils/ThrowingSupplier.java @@ -1,4 +1,4 @@ -package com.redstoner.modules.blockplacemods.util; +package com.redstoner.utils; /** * A supplier with a throws declaration. From d965f30dcaed52638a40bc9c48acf195f7117a21 Mon Sep 17 00:00:00 2001 From: Pepich Date: Tue, 30 May 2017 11:56:56 +0200 Subject: [PATCH 12/15] General cleanup Removing outdated comments Removing outdated annotations Adding new annotations Removing deprecation --- .../blockplacemods/BlockPlaceMods.java | 17 +------ .../blockplacemods/mods/ModInventory.java | 46 +++++++++++-------- .../mods/ModToggledCauldron.java | 7 +-- .../blockplacemods/mods/ModToggledPiston.java | 6 +-- .../blockplacemods/mods/ModToggledStep.java | 6 +-- .../blockplacemods/mods/ModToggledTorch.java | 14 +++--- src/com/redstoner/utils/CommandException.java | 46 +++++++++++-------- src/com/redstoner/utils/CommandMap.java | 15 +++--- src/com/redstoner/utils/ItemProperties.java | 2 + 9 files changed, 82 insertions(+), 77 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 41c6c1e..a9e9742 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -24,7 +24,7 @@ import com.redstoner.utils.CommandException; import com.redstoner.utils.CommandMap; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 4, compatible = 3) +@Version(major = 3, minor = 2, revision = 5, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -38,8 +38,6 @@ public final class BlockPlaceMods implements Module, Listener { mod.registerListeners(); } - // CommandManager.registerCommand(getCommandString(), this, Main.plugin); - // Sorry but this stuff isn't working for me. Not gonna spend more time on it. try { Map commandMap = CommandMap.getCommandMap(); @@ -82,19 +80,6 @@ public final class BlockPlaceMods implements Module, Listener {} } - /* @Override - * public String getCommandString() { - * return "command mod {\n" + - * "perm utils.blockplacemods.command;\n" + - * "type player;\n" + - * "[empty] {\n" + - * "run mod_empty;\n" + - * "}\n" + - * "[string:args...] {\n" + - * "run mod args;\n" + - * "}\n" + - * "}\n"; - * } */ @Command(hook = "mod_empty") public void onModEmptyCommand(CommandSender sender) { diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java index 0d3f2af..5c5a539 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java @@ -1,8 +1,6 @@ package com.redstoner.modules.blockplacemods.mods; -import com.redstoner.modules.datamanager.DataManager; -import com.redstoner.utils.CommandException; -import com.redstoner.utils.ItemProperties; +import java.util.Arrays; import org.bukkit.Material; import org.bukkit.block.BlockState; @@ -17,13 +15,16 @@ import org.bukkit.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import java.util.Arrays; +import com.redstoner.modules.datamanager.DataManager; +import com.redstoner.utils.CommandException; +import com.redstoner.utils.ItemProperties; public class ModInventory extends ModAbstract { protected InventoryType inventoryType; - public ModInventory(String name, InventoryType inventoryType) { + public ModInventory(String name, InventoryType inventoryType) + { super(name); this.inventoryType = inventoryType; } @@ -69,7 +70,7 @@ public class ModInventory extends ModAbstract throw new CommandException("Slot number " + slot + " is negative"); } // Set the stored item to the item in the sender's hand - ItemStack item = sender.getItemInHand(); + ItemStack item = sender.getInventory().getItemInMainHand(); if (item == null || item.getType() == Material.AIR || item.getAmount() == 0) { // Remove the item. @@ -125,33 +126,38 @@ public class ModInventory extends ModAbstract } } - @SuppressWarnings("unchecked") protected ItemStack[] get(Player player) { Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); if (obj == null) return getDefault(); JSONArray array = (JSONArray) obj; - ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())]; - for (int i = 0, n = items.length; i < n; i++) { + for (int i = 0, n = items.length; i < n; i++) + { Object obj2 = array.get(i); - if (obj2 instanceof JSONObject) { // if null, items[i] remains null + if (obj2 instanceof JSONObject) + { // if null, items[i] remains null items[i] = new ItemProperties().loadFrom((JSONObject) obj2).toItemStack(); } } - return items; } - protected void set(Player player, int index, ItemStack item) { + protected void set(Player player, int index, ItemStack item) + { ItemStack[] data = get(player); - if (item == null) { - if (index < data.length) { + if (item == null) + { + if (index < data.length) + { data[index] = null; } - } else { - if (index >= data.length) { + } + else + { + if (index >= data.length) + { data = Arrays.copyOf(data, index + 1); } data[index] = item; @@ -159,6 +165,7 @@ public class ModInventory extends ModAbstract set(player, data); } + @SuppressWarnings("unchecked") protected void set(Player player, ItemStack[] data) { if (highestUsedIndex(data) == -1) @@ -166,7 +173,8 @@ public class ModInventory extends ModAbstract else { JSONArray array = new JSONArray(); - for (int i = 0, n = highestUsedIndex(data); i < n; i++) { + for (int i = 0, n = highestUsedIndex(data); i < n; i++) + { ItemStack item = data[i]; array.add(item == null ? null : new ItemProperties(item).toJSONObject()); } @@ -180,8 +188,8 @@ public class ModInventory extends ModAbstract } @Override - public ItemStack[] getDefault() { + public ItemStack[] getDefault() + { return new ItemStack[0]; } - } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java index 1e37cd3..2a678b2 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java @@ -10,8 +10,8 @@ import org.bukkit.event.player.PlayerInteractEvent; public class ModToggledCauldron extends ModToggledAbstract { - - public ModToggledCauldron() { + public ModToggledCauldron() + { super("cauldron", false); } @@ -21,6 +21,7 @@ public class ModToggledCauldron extends ModToggledAbstract return "If active, placed cauldrons are filled, and they cycle on right click"; } + @SuppressWarnings("deprecation") @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { @@ -32,6 +33,7 @@ public class ModToggledCauldron extends ModToggledAbstract } } + @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -41,5 +43,4 @@ public class ModToggledCauldron extends ModToggledAbstract event.getBlock().setData((byte) 3); } } - } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java index df1c745..9561a34 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java @@ -11,8 +11,8 @@ import org.bukkit.event.block.BlockPlaceEvent; public class ModToggledPiston extends ModToggledAbstract { - - public ModToggledPiston() { + public ModToggledPiston() + { super("piston", false); } @@ -22,6 +22,7 @@ public class ModToggledPiston extends ModToggledAbstract return "If active, pistons face the block you place them against"; } + @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -59,5 +60,4 @@ public class ModToggledPiston extends ModToggledAbstract return 0; } } - } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java index a076cfc..fe42fa4 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java @@ -7,8 +7,8 @@ import org.bukkit.event.block.BlockPlaceEvent; public class ModToggledStep extends ModToggledAbstract { - - public ModToggledStep() { + public ModToggledStep() + { super("step", true); getAliases().add("slab"); } @@ -19,6 +19,7 @@ public class ModToggledStep extends ModToggledAbstract return "If active, placed steps will always turn upside-down"; } + @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { @@ -36,5 +37,4 @@ public class ModToggledStep extends ModToggledAbstract { return block == Material.STEP || block == Material.STONE_SLAB2; } - } diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java index 91cb8b5..188bce2 100644 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java +++ b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java @@ -1,6 +1,9 @@ package com.redstoner.modules.blockplacemods.mods; -import com.redstoner.misc.Main; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -11,15 +14,14 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; +import com.redstoner.misc.Main; public class ModToggledTorch extends ModToggledAbstract { private final Set torchesPlaced = new HashSet<>(); - public ModToggledTorch() { + public ModToggledTorch() + { super("torch", true); Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2); } @@ -44,6 +46,7 @@ public class ModToggledTorch extends ModToggledAbstract } } + @SuppressWarnings("deprecation") private boolean isAttachedToRedstoneBlock(Block block) { BlockFace towardsAgainst = getFaceTowardsBlockAgainst(block.getData()); @@ -85,5 +88,4 @@ public class ModToggledTorch extends ModToggledAbstract } } } - } diff --git a/src/com/redstoner/utils/CommandException.java b/src/com/redstoner/utils/CommandException.java index 2445134..0b12125 100644 --- a/src/com/redstoner/utils/CommandException.java +++ b/src/com/redstoner/utils/CommandException.java @@ -1,23 +1,29 @@ package com.redstoner.utils; -public class CommandException extends Exception { - - public CommandException(String message, Throwable cause) { - super(message, cause); - } - - public CommandException(Throwable cause) { - super(cause); - } - - public CommandException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } - - public CommandException() { - } - - public CommandException(String message) { - super(message); - } +public class CommandException extends Exception +{ + private static final long serialVersionUID = -7176634557736106754L; + + public CommandException(String message, Throwable cause) + { + super(message, cause); + } + + public CommandException(Throwable cause) + { + super(cause); + } + + public CommandException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + } + + public CommandException() + {} + + public CommandException(String message) + { + super(message); + } } diff --git a/src/com/redstoner/utils/CommandMap.java b/src/com/redstoner/utils/CommandMap.java index 7ae67d0..4003b01 100644 --- a/src/com/redstoner/utils/CommandMap.java +++ b/src/com/redstoner/utils/CommandMap.java @@ -1,16 +1,18 @@ package com.redstoner.utils; +import java.lang.reflect.Field; +import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.SimpleCommandMap; import org.bukkit.plugin.SimplePluginManager; -import java.lang.reflect.Field; -import java.util.Map; - -public class CommandMap { - - public static Map getCommandMap() throws ReflectiveOperationException, ClassCastException { +public class CommandMap +{ + @SuppressWarnings("unchecked") + public static Map getCommandMap() throws ReflectiveOperationException, ClassCastException + { Field field = SimplePluginManager.class.getDeclaredField("commandMap"); field.setAccessible(true); Object map = field.get(Bukkit.getPluginManager()); @@ -18,5 +20,4 @@ public class CommandMap { field.setAccessible(true); return (Map) field.get(map); } - } diff --git a/src/com/redstoner/utils/ItemProperties.java b/src/com/redstoner/utils/ItemProperties.java index 8c8b27e..cddd0a4 100644 --- a/src/com/redstoner/utils/ItemProperties.java +++ b/src/com/redstoner/utils/ItemProperties.java @@ -29,6 +29,7 @@ public class ItemProperties public ItemProperties() {} + @SuppressWarnings("deprecation") public ItemProperties(ItemStack item) { if (item == null) @@ -55,6 +56,7 @@ public class ItemProperties unbreakable = meta.isUnbreakable(); } + @SuppressWarnings("deprecation") public ItemStack toItemStack() { ItemStack result = new ItemStack(id, amount, data); From 4b874814ee561d229757ce69ec23b98ebb5433f9 Mon Sep 17 00:00:00 2001 From: Pepich Date: Tue, 30 May 2017 12:03:32 +0200 Subject: [PATCH 13/15] Added command aliases "set" and "toggle" --- .../modules/blockplacemods/BlockPlaceMods.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index a9e9742..c864f7c 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -24,7 +24,7 @@ import com.redstoner.utils.CommandException; import com.redstoner.utils.CommandMap; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 5, compatible = 3) +@Version(major = 3, minor = 2, revision = 6, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -41,7 +41,13 @@ public final class BlockPlaceMods implements Module, Listener try { Map commandMap = CommandMap.getCommandMap(); - String[] aliases = {"mod", Main.plugin.getName().toLowerCase() + ":mod"}; + // @noformat + String pluginName = Main.plugin.getName().toLowerCase(); + String[] aliases = {"mod", pluginName + ":mod", + "set", pluginName + ":mod", + "toggle", pluginName + ":toggle" + }; + // @format org.bukkit.command.Command command = new org.bukkit.command.Command("mod") { @Override From 9c636d2a9b7a6ea766a9ce71f33ef826a41509da Mon Sep 17 00:00:00 2001 From: Dico200 Date: Tue, 30 May 2017 15:15:01 +0200 Subject: [PATCH 14/15] Ensure all command aliases are removed in onDisable, and only if they were not replaced. --- .../blockplacemods/BlockPlaceMods.java | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index c864f7c..081eabd 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -1,16 +1,5 @@ package com.redstoner.modules.blockplacemods; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Version; @@ -22,9 +11,15 @@ import com.redstoner.modules.blockplacemods.mods.ModAbstract; import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract; import com.redstoner.utils.CommandException; import com.redstoner.utils.CommandMap; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +import java.util.*; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 6, compatible = 3) +@Version(major = 3, minor = 2, revision = 7, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -41,30 +36,15 @@ public final class BlockPlaceMods implements Module, Listener try { Map commandMap = CommandMap.getCommandMap(); - // @noformat - String pluginName = Main.plugin.getName().toLowerCase(); - String[] aliases = {"mod", pluginName + ":mod", - "set", pluginName + ":mod", - "toggle", pluginName + ":toggle" - }; - // @format - org.bukkit.command.Command command = new org.bukkit.command.Command("mod") - { - @Override - public boolean execute(CommandSender sender, String label, String[] args) - { - onModCommand(sender, String.join(" ", args)); - return true; - } - }; - for (String alias : aliases) + org.bukkit.command.Command command = new BlockPlaceModsCommand(); + for (String alias : getCommandAliases()) { commandMap.put(alias, command); } } catch (ReflectiveOperationException ex) { - throw new Error(ex); + return false; } return true; } @@ -76,16 +56,33 @@ public final class BlockPlaceMods implements Module, Listener { mod.unregisterListeners(); } + try { Map commandMap = CommandMap.getCommandMap(); - commandMap.remove("mod"); - commandMap.remove(Main.plugin.getName().toLowerCase() + ":mod"); + for (String alias : getCommandAliases()) + { + if (commandMap.get(alias).getClass() == BlockPlaceModsCommand.class) + { + commandMap.remove(alias); + } + } } catch (Exception ignored) {} } + private static String[] getCommandAliases() + { + String pluginName = Main.plugin.getName().toLowerCase(); + // @noformat + return new String[]{"mod", pluginName + ":mod", + "set", pluginName + ":mod", + "toggle", pluginName + ":toggle" + }; + // @format + } + @Command(hook = "mod_empty") public void onModEmptyCommand(CommandSender sender) { @@ -177,4 +174,22 @@ public final class BlockPlaceMods implements Module, Listener } return modName; } + + private class BlockPlaceModsCommand extends org.bukkit.command.Command + { + public BlockPlaceModsCommand() + { + super("mod"); + String[] aliases = getCommandAliases(); + setAliases(Arrays.asList(Arrays.copyOfRange(aliases, 1, aliases.length))); + } + + @Override + public boolean execute(CommandSender sender, String label, String[] args) + { + onModCommand(sender, String.join(" ", args)); + return true; + } + } + } From 1061eb4b595bfc009b275e56786b651f5b13990c Mon Sep 17 00:00:00 2001 From: Dico200 Date: Tue, 30 May 2017 15:17:48 +0200 Subject: [PATCH 15/15] Prevent an entry being added to command help for each mod alias --- src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 081eabd..b38e8b4 100644 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -19,7 +19,7 @@ import org.bukkit.event.Listener; import java.util.*; @AutoRegisterListener -@Version(major = 3, minor = 2, revision = 7, compatible = 3) +@Version(major = 3, minor = 2, revision = 8, compatible = 3) public final class BlockPlaceMods implements Module, Listener { public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" @@ -143,7 +143,7 @@ public final class BlockPlaceMods implements Module, Listener { StringBuilder result = new StringBuilder("§7BlockPlaceMods adds some redstone-centric utilities"); result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:"); - List mods = new ArrayList<>(ModAbstract.getMods().values()); + List mods = new ArrayList<>(new HashSet<>(ModAbstract.getMods().values())); mods.sort(Comparator. comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1) .thenComparing(Mod::getName)); for (Mod mod : mods)