Archived
0

Clean up BlockPlaceMods

This commit is contained in:
Dico200
2017-05-29 13:57:03 +02:00
parent 2a3958d9b3
commit 18dc672bdd
12 changed files with 165 additions and 298 deletions

View File

@@ -1,15 +1,7 @@
package com.redstoner.modules.blockplacemods; 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.nemez.cmdmgr.Command;
import com.redstoner.annotations.AutoRegisterListener;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
import com.redstoner.misc.Main; import com.redstoner.misc.Main;
import com.redstoner.misc.Utils; 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.mods.ModAbstract;
import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.blockplacemods.util.CommandException;
import com.redstoner.modules.blockplacemods.util.CommandMap; 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 final class BlockPlaceMods implements Module, Listener
{ {
public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]" public static String PREFIX = ChatColor.GRAY + "[" + ChatColor.DARK_GREEN + "BPM" + ChatColor.GRAY + "]"
@@ -29,10 +29,10 @@ public final class BlockPlaceMods implements Module, Listener
@Override @Override
public boolean onEnable() public boolean onEnable()
{ {
ModAbstract.constructAll(); ModAbstract.registerAll();
for (Mod mod : new ArrayList<>(ModAbstract.getMods().values())) for (Mod mod : new ArrayList<>(ModAbstract.getMods().values()))
{ {
mod.register(); mod.registerListeners();
} }
// CommandManager.registerCommand(getCommandString(), this, Main.plugin); // CommandManager.registerCommand(getCommandString(), this, Main.plugin);
// Sorry but this stuff isn't working for me. Not gonna spend more time on it. // 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()) for (Mod mod : ModAbstract.getMods().values())
{ {
mod.unregister(); mod.unregisterListeners();
} }
try try
{ {
@@ -91,6 +91,7 @@ public final class BlockPlaceMods implements Module, Listener
* "}\n" + * "}\n" +
* "}\n"; * "}\n";
* } */ * } */
@Command(hook = "mod_empty") @Command(hook = "mod_empty")
public void onModEmptyCommand(CommandSender sender) 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() String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream()
.filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new); .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new);
String prefix = PREFIX; String prefix = PREFIX;
ThrowingSupplier<String> supplier; String message;
if (args.length > 0)
{ try {
Mod target = ModAbstract.getMod(args[0].toLowerCase());
if (target != null) if (args.length > 0) {
{ Mod target = ModAbstract.getMod(args[0].toLowerCase());
prefix += "&7[&2" + target.getName() + "&7]&a"; if (target != null) {
if (!(sender instanceof Player)) prefix += "&7[&2" + target.getName() + "&7]&a";
{ if (!(sender instanceof Player)) {
supplier = () -> "&cYou must be a player to use any block place mod"; 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));
{ }
supplier = () -> 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"))
{ } catch (CommandException ex) {
supplier = () -> commandHelp(sender, args); message = " &c" + ex.getMessage();
} } catch (Throwable t) {
else message = " &cAn unexpected error occurred while executing this command.";
{ t.printStackTrace();
supplier = () -> "&cThat argument could not be recognized";
}
} }
else
{ Utils.sendMessage(sender, prefix, message, '&');
supplier = () -> commandHelp(sender, args);
}
handleCommand(sender, prefix, supplier);
} }
private String commandHelp(CommandSender sender, String[] args) private String commandHelp(CommandSender sender, String[] args)
@@ -148,22 +149,4 @@ public final class BlockPlaceMods implements Module, Listener
return result.toString(); return result.toString();
} }
public static void handleCommand(CommandSender sender, String prefix, ThrowingSupplier<String> 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, '&');
}
} }

View File

@@ -1,12 +1,11 @@
package com.redstoner.modules.blockplacemods.mods; package com.redstoner.modules.blockplacemods.mods;
import com.redstoner.modules.blockplacemods.util.CommandException;
import org.bukkit.entity.Player;
import java.util.Set; import java.util.Set;
import org.bukkit.entity.Player; public interface Mod
import com.redstoner.modules.blockplacemods.util.CommandException;
public interface Mod<T>
{ {
String getName(); String getName();
@@ -18,7 +17,7 @@ public interface Mod<T>
String runCommand(Player sender, String[] args) throws CommandException; String runCommand(Player sender, String[] args) throws CommandException;
void register(); void registerListeners();
void unregister(); void unregisterListeners();
} }

View File

@@ -1,23 +1,21 @@
package com.redstoner.modules.blockplacemods.mods; 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.Main;
import com.redstoner.misc.Utils; import com.redstoner.misc.Utils;
import com.redstoner.modules.datamanager.DataManager; 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<T> implements Mod<T>, Listener import java.util.*;
public abstract class ModAbstract implements Mod, Listener
{ {
private static final Map<String, Mod> mods = new HashMap<>(); private static final Map<String, Mod> mods = new HashMap<>();
private final String name;
private final Set<String> aliases;
public static Map<String, Mod> getMods() public static Map<String, Mod> getMods()
{ {
@@ -29,45 +27,34 @@ public abstract class ModAbstract<T> implements Mod<T>, Listener
return mods.get(name); return mods.get(name);
} }
public static void constructAll() public static void registerMod(Mod mod) {
{ mods.put(mod.getName(), mod);
new ModBooleanCauldron(); for (String alias : mod.getAliases()) {
new ModBooleanPiston(); mods.putIfAbsent(alias, mod);
new ModBooleanStep();
new ModBooleanTorch();
new ModInventoryDropper();
new ModInventoryFurnace();
new ModInventoryHopper();
}
private final Set<String> 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); }
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 @Override
public void unregister() public String getName() {
{ return name;
HandlerList.unregisterAll(this);
} }
@Override @Override
@@ -76,6 +63,18 @@ public abstract class ModAbstract<T> implements Mod<T>, Listener
return aliases; return aliases;
} }
@Override
public void registerListeners()
{
Bukkit.getPluginManager().registerEvents(this, Main.plugin);
}
@Override
public void unregisterListeners()
{
HandlerList.unregisterAll(this);
}
protected void reset(Player player) protected void reset(Player player)
{ {
DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName());

View File

@@ -1,7 +1,8 @@
package com.redstoner.modules.blockplacemods.mods; 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.Material;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -15,22 +16,17 @@ import org.bukkit.inventory.ItemStack;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.redstoner.modules.blockplacemods.util.CommandException; import java.util.Arrays;
import com.redstoner.modules.blockplacemods.util.ItemProperties;
import com.redstoner.modules.datamanager.DataManager;
public abstract class ModInventoryAbstract extends ModAbstract<ItemStack[]> public class ModInventory extends ModAbstract
{ {
protected InventoryType inventoryType; protected InventoryType inventoryType;
@Override public ModInventory(String name, InventoryType inventoryType) {
protected void preConstruction() super(name);
{ this.inventoryType = inventoryType;
inventoryType = getInventoryType();
} }
protected abstract InventoryType getInventoryType();
private static int highestUsedIndex(ItemStack[] items) private static int highestUsedIndex(ItemStack[] items)
{ {
for (int i = items.length - 1; i >= 0; i--) for (int i = items.length - 1; i >= 0; i--)
@@ -80,16 +76,12 @@ public abstract class ModInventoryAbstract extends ModAbstract<ItemStack[]>
item = null; item = null;
if (present(sender)) if (present(sender))
{ {
ItemStack[] data = get(sender); set(sender, slot, null);
data[slot] = null;
set(sender, data);
} }
} }
else else
{ {
ItemStack[] data = get(sender); set(sender, slot, item);// don't need to clone because the reference isn't kept
data[slot] = item.clone();
set(sender, data);
} }
String itemName = item == null ? "nothing" String itemName = item == null ? "nothing"
: item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", ""); : item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", "");
@@ -137,19 +129,33 @@ public abstract class ModInventoryAbstract extends ModAbstract<ItemStack[]>
{ {
Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName());
if (obj == null) if (obj == null)
return new ItemStack[inventoryType.getDefaultSize()]; return getDefault();
JSONArray array = (JSONArray) obj; JSONArray array = (JSONArray) obj;
ArrayList<ItemStack> items = new ArrayList<ItemStack>();
for (Object obj2 : array.toArray()) ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())];
{ for (int i = 0, n = items.length; i < n; i++) {
items.add((new ItemProperties()).loadFrom((JSONObject) obj2).toItemStack()); 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++) return items;
{ }
itemArray[i] = items.get(i);
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) protected void set(Player player, ItemStack[] data)
@@ -159,9 +165,9 @@ public abstract class ModInventoryAbstract extends ModAbstract<ItemStack[]>
else else
{ {
JSONArray array = new JSONArray(); JSONArray array = new JSONArray();
for (ItemStack stack : data) for (int i = 0, n = highestUsedIndex(data); i < n; i++) {
{ ItemStack item = data[i];
array.add((new ItemProperties(stack)).toJSONObject()); array.add(item == null ? null : new ItemProperties(item).toJSONObject());
} }
DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array); DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array);
} }
@@ -171,4 +177,10 @@ public abstract class ModInventoryAbstract extends ModAbstract<ItemStack[]>
{ {
return get(player) != null; return get(player) != null;
} }
@Override
public ItemStack[] getDefault() {
return new ItemStack[0];
}
} }

View File

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

View File

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

View File

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

View File

@@ -5,16 +5,18 @@ import org.bukkit.entity.Player;
import com.redstoner.modules.blockplacemods.util.CommandException; import com.redstoner.modules.blockplacemods.util.CommandException;
import com.redstoner.modules.datamanager.DataManager; import com.redstoner.modules.datamanager.DataManager;
public abstract class ModBooleanAbstract extends ModAbstract<Boolean> public abstract class ModToggledAbstract extends ModAbstract
{ {
protected boolean enabledByDefault; protected boolean enabledByDefault;
protected abstract boolean enabledByDefault(); public ModToggledAbstract(String name, boolean enabledByDefault) {
super(name);
this.enabledByDefault = enabledByDefault;
}
@Override @Override
protected void preConstruction() public Boolean getDefault() {
{ return enabledByDefault;
enabledByDefault = enabledByDefault();
} }
protected boolean hasEnabled(Player player) protected boolean hasEnabled(Player player)
@@ -27,7 +29,7 @@ public abstract class ModBooleanAbstract extends ModAbstract<Boolean>
{ {
if (enabled == hasEnabled(sender)) if (enabled == hasEnabled(sender))
return false; return false;
if (enabled == (boolean) getDefault()) if (enabled == enabledByDefault)
reset(sender); reset(sender);
else else
DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled); DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled);

View File

@@ -8,12 +8,11 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
public class ModBooleanCauldron extends ModBooleanAbstract public class ModToggledCauldron extends ModToggledAbstract
{ {
@Override
public String getName() public ModToggledCauldron() {
{ super("cauldron", false);
return "Cauldron";
} }
@Override @Override
@@ -22,12 +21,6 @@ public class ModBooleanCauldron extends ModBooleanAbstract
return "fills cauldrons upon placement and cycles upon right click"; return "fills cauldrons upon placement and cycles upon right click";
} }
@Override
protected boolean enabledByDefault()
{
return false;
}
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) public void onPlayerInteract(PlayerInteractEvent event)
{ {
@@ -49,9 +42,4 @@ public class ModBooleanCauldron extends ModBooleanAbstract
} }
} }
@Override
public Object getDefault()
{
return false;
}
} }

View File

@@ -9,12 +9,11 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
public class ModBooleanPiston extends ModBooleanAbstract public class ModToggledPiston extends ModToggledAbstract
{ {
@Override
public String getName() public ModToggledPiston() {
{ super("piston", false);
return "Piston";
} }
@Override @Override
@@ -23,12 +22,6 @@ public class ModBooleanPiston extends ModBooleanAbstract
return "makes pistons face the block you placed it against"; return "makes pistons face the block you placed it against";
} }
@Override
protected boolean enabledByDefault()
{
return false;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
@@ -67,9 +60,4 @@ public class ModBooleanPiston extends ModBooleanAbstract
} }
} }
@Override
public Object getDefault()
{
return false;
}
} }

View File

@@ -5,16 +5,12 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
public class ModBooleanStep extends ModBooleanAbstract public class ModToggledStep extends ModToggledAbstract
{ {
{
getAliases().add("Slab");
}
@Override public ModToggledStep() {
public String getName() super("step", true);
{ getAliases().add("Slab");
return "Step";
} }
@Override @Override
@@ -23,12 +19,6 @@ public class ModBooleanStep extends ModBooleanAbstract
return "turns steps upside-down upon placement"; return "turns steps upside-down upon placement";
} }
@Override
protected boolean enabledByDefault()
{
return true;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
@@ -47,9 +37,4 @@ public class ModBooleanStep extends ModBooleanAbstract
return block == Material.STEP || block == Material.STONE_SLAB2; return block == Material.STEP || block == Material.STONE_SLAB2;
} }
@Override
public Object getDefault()
{
return true;
}
} }

View File

@@ -1,9 +1,6 @@
package com.redstoner.modules.blockplacemods.mods; package com.redstoner.modules.blockplacemods.mods;
import java.util.HashSet; import com.redstoner.misc.Main;
import java.util.Iterator;
import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
@@ -14,20 +11,17 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockPlaceEvent; 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<Block> torchesPlaced = new HashSet<>(); private final Set<Block> torchesPlaced = new HashSet<>();
@Override public ModToggledTorch() {
public String getName() super("torch", true);
{ Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2);
return "Torch";
} }
@Override @Override
@@ -36,12 +30,6 @@ public class ModBooleanTorch extends ModBooleanAbstract
return "removes redstone torches placed against a redstone block"; return "removes redstone torches placed against a redstone block";
} }
@Override
protected boolean enabledByDefault()
{
return true;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
@@ -98,9 +86,4 @@ public class ModBooleanTorch extends ModBooleanAbstract
} }
} }
@Override
public Object getDefault()
{
return true;
}
} }