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; - } }