summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid <david@panic.tk>2019-01-03 23:24:31 +0100
committerDavid <david@panic.tk>2019-01-03 23:24:31 +0100
commitff348a6e3faada64b42f98278fa5ba7d0e9ec851 (patch)
tree58ec6373b1411a7ea939d881c9c7d24bef5eec34
parentadbb2c9cb254b60d3394386352dfab80e67c6dda (diff)
Re-wrote BlockPlaceMods
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java42
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd28
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java418
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/ModType.java9
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/Mod.java24
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModAbstract.java94
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java73
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java63
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModInventory.java195
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java39
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java80
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java49
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java40
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java43
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java46
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java40
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java91
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java80
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/module.info3
20 files changed, 580 insertions, 880 deletions
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java
new file mode 100644
index 0000000..ae7799e
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java
@@ -0,0 +1,42 @@
+package com.redstoner.modules.blockplacemods;
+
+import com.redstoner.modules.datamanager.DataManager;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+
+public class BlockPlaceMod implements Listener {
+ public final String name;
+ public final String[] aliases;
+ public final String description;
+ public final ModType type;
+ public final String typeDescription;
+
+ public final boolean enabledByDefault;
+
+ protected BlockPlaceMod(String name, String description, ModType type, String typeDescription, boolean enabledByDefault, String... aliases) {
+ this.name = name;
+ this.aliases = aliases;
+ this.description = description;
+
+ this.type = type;
+ this.typeDescription = typeDescription;
+
+ this.enabledByDefault = enabledByDefault;
+ }
+
+ protected final boolean hasEnabled(Player player) {
+ String uuid = player.getUniqueId().toString();
+ return (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", name, enabledByDefault);
+ }
+
+ protected final Object getState(Player player) {
+ String uuid = player.getUniqueId().toString();
+ return DataManager.getOrDefault(uuid, "BlockPlaceMods", name + "_state", null);
+ }
+
+ public boolean onEnable() {
+ return true;
+ }
+
+ public void onDisable() {}
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd
new file mode 100644
index 0000000..f025d26
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd
@@ -0,0 +1,28 @@
+command bpm {
+ alias set;
+ alias toggle;
+
+ perm blockplacemods.use;
+
+ type player;
+
+ [empty] {
+ help Lists the block place mods and their statuses.;
+ run list_mods;
+ }
+
+ reset [string:mod] {
+ Help Resets the specified mod's settings to the default value.;
+ run reset_mod mod;
+ }
+
+ [string:mod] {
+ help Toggles a block place mod.;
+ run toggle_mod mod;
+ }
+
+ [string:mod] [string:value] {
+ help Sets the specified mod's state to the specified value. Only works for mods that have a state.;
+ run set_mod_value mod value;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
index 6befbae..bd2126a 100644
--- a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
@@ -1,17 +1,5 @@
package com.redstoner.modules.blockplacemods;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-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.Commands;
@@ -19,188 +7,268 @@ import com.redstoner.annotations.Version;
import com.redstoner.misc.CommandHolderType;
import com.redstoner.misc.Main;
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.utils.CommandException;
-import com.redstoner.utils.CommandMap;
+import com.redstoner.modules.blockplacemods.mods.ModBetterDirectional;
+import com.redstoner.modules.blockplacemods.mods.ModCauldron;
+import com.redstoner.modules.blockplacemods.mods.ModSlab;
+import com.redstoner.modules.datamanager.DataManager;
+import net.nemez.chatapi.click.Message;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
-@Commands(CommandHolderType.None)
+@Commands (CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 1, compatible = 4)
-public final class BlockPlaceMods implements Module, Listener
-{
+@Version (major = 4, minor = 1, revision = 1, compatible = 4)
+public class BlockPlaceMods implements Module, Listener {
+ private static final Map<String, BlockPlaceMod> mods = new HashMap<>();
+ private static final List<BlockPlaceMod> enabledMods = new ArrayList<>();
+
+ private final BlockPlaceMod[] modsToRegister = {
+ new ModCauldron(),
+ new ModSlab(),
+ new ModBetterDirectional("Observer", Material.OBSERVER, "observers", false),
+ new ModBetterDirectional("Piston", Material.PISTON, "pistons", false),
+ };
+
@Override
- public boolean onEnable()
- {
- ModAbstract.registerAll(getLogger());
- for (Mod mod : new ArrayList<>(ModAbstract.getMods().values()))
- {
- mod.registerListeners();
- }
- try
- {
- Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
- org.bukkit.command.Command command = new BlockPlaceModsCommand();
- for (String alias : getCommandAliases())
- {
- commandMap.put(alias, command);
+ public boolean onEnable() {
+ for (BlockPlaceMod mod : modsToRegister) {
+ mods.put(mod.name.toLowerCase(), mod);
+
+ for (String alias : mod.aliases) {
+ mods.put(alias.toLowerCase(), mod);
+ }
+
+ if (mod.onEnable()) {
+ enabledMods.add(mod);
+ Bukkit.getPluginManager().registerEvents(mod, Main.plugin);
+ } else {
+ getLogger().warn("Block place mod failed to enable, see any errors above!");
}
}
- catch (ReflectiveOperationException ex)
- {
- ex.printStackTrace();
- return false;
- }
+
return true;
}
-
- @Override
- public void postEnable()
- {
- setPrefix("BPM");
- }
-
+
@Override
- public void onDisable()
- {
- for (Mod mod : ModAbstract.getMods().values())
- {
- mod.unregisterListeners();
+ public void onDisable() {
+ for (BlockPlaceMod mod : enabledMods) {
+ mod.onDisable();
+ HandlerList.unregisterAll(mod);
}
- try
- {
- Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
- for (String alias : getCommandAliases())
- {
- org.bukkit.command.Command command = commandMap.get(alias);
- if (command != null && command.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 + ":set",
- "toggle", pluginName + ":toggle"
- };
- // @format
- }
-
- @Command(hook = "mod_empty")
- public void onModEmptyCommand(CommandSender sender)
- {
- onModCommand(sender, "");
+
+ enabledMods.clear();
+ mods.clear();
}
-
- @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 = "";
- String message;
- try
- {
- if (args.length > 0)
- {
- Mod target = ModAbstract.getMod(args[0].toLowerCase());
- if (target != null)
- {
- 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
- {
- message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length));
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "list_mods")
+ public void listMods(CommandSender sender) {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ Message msg = new Message(sender, sender);
+
+ msg.appendText(ChatColor.DARK_GREEN + "--==[BlockPlaceMods]==--\n");
+ msg.appendText(ChatColor.GRAY + "TIP: Hover over the following messages to see a description :)\n\n");
+
+ for (BlockPlaceMod mod : modsToRegister) {
+
+ msg.appendTextHover(
+ ChatColor.DARK_PURPLE + "["
+ + ChatColor.DARK_BLUE + mod.name
+ + ChatColor.DARK_PURPLE + "]",
+
+ ChatColor.GREEN + mod.description
+ );
+
+ msg.appendText(" ");
+
+ boolean enabled = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name, mod.enabledByDefault);
+
+ msg.appendTextHover(
+ enabledMods.contains(mod) ? ChatColor.GREEN + "Loaded" : ChatColor.DARK_RED + "Not loaded",
+ ChatColor.GRAY + (enabledMods.contains(mod) ? "The mod is working fine." : "Something is wrong!")
+ );
+
+ msg.appendText(ChatColor.RESET + ", ");
+ msg.appendTextHover(
+ enabled ? ChatColor.GREEN + "Enabled" : ChatColor.DARK_RED + "Disabled",
+ ChatColor.GRAY + (enabled ? "You have this mod enabled." : "You have disabled this mod!")
+ );
+
+ if (mod.type != ModType.STATELESS) {
+ Object state = DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name + "_state", null);
+
+ if (state != null) {
+ msg.appendText(ChatColor.AQUA + " -> ");
+
+ switch (mod.type) {
+ case STRING:
+ msg.appendTextHover(ChatColor.GOLD + state.toString(), "String value - " + mod.typeDescription);
+ break;
+ case INTEGER:
+ case UNSIGNED_INTEGER:
+ msg.appendTextHover(ChatColor.DARK_GREEN + state.toString(), "Integer value - " + mod.typeDescription);
+ break;
+ case REDSTONE_LEVEL:
+ msg.appendTextHover(ChatColor.RED + state.toString(), "Redstone level - " + mod.typeDescription);
}
- }
- else if (args[0].equalsIgnoreCase("help"))
- {
- message = commandHelp(sender, args);
- }
- else
- {
- message = "&cThat argument could not be recognized";
+
+ msg.appendTextHover(
+ enabled ? ChatColor.GREEN + "Enabled" : ChatColor.DARK_RED + "Disabled",
+ ChatColor.GRAY + (enabled ? "You have this mod enabled." : "You have disabled this mod!")
+ );
}
}
- else
- {
- message = commandHelp(sender, args);
- }
- }
- catch (CommandException ex)
- {
- message = " &c" + ex.getMessage();
- }
- catch (Throwable t)
- {
- message = " &cAn unexpected error occurred while executing this command.";
- t.printStackTrace();
}
- getLogger().message(sender, prefix + message);
+
+ msg.send();
}
-
- 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:");
- List<Mod> mods = new ArrayList<>(new HashSet<>(ModAbstract.getMods().values()));
- mods.sort(Comparator.<Mod> 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())
- {
- result.append('|').append(alias);
- }
- result.append(ChatColor.GRAY.toString()).append(" - ").append(mod.getDescription());
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "reset_mod")
+ public void resetMod(CommandSender sender, String mod) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+ Message msg = new Message(sender, sender);
+
+ msg.appendText(ChatColor.DARK_GREEN + "[BlockPlaceMods] ");
+
+ if (bpm == null) {
+ msg.appendText(ChatColor.DARK_RED + "That mod does not exist!");
+ } else {
+ Player player = (Player) sender;
+ DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name);
+ DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name + "_state");
+
+ msg.appendText(ChatColor.GREEN + "Successfully reset the settings for: " + ChatColor.DARK_PURPLE + bpm.name);
}
- return result.toString();
+
+ msg.send();
}
-
- 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);
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod")
+ public void toggleMod(CommandSender sender, String mod) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+ Message msg = new Message(sender, sender);
+
+ msg.appendText(ChatColor.DARK_GREEN + "[BlockPlaceMods] ");
+
+ if (bpm == null) {
+ msg.appendText(ChatColor.DARK_RED + "That mod does not exist!");
+ } else {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ boolean current = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", bpm.name, bpm.enabledByDefault);
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name, !current);
+
+ msg.appendText(
+ ChatColor.GREEN + "The " + ChatColor.DARK_PURPLE + bpm.name
+ + ChatColor.GREEN + " mod has been "
+ + (current ? ChatColor.RED + "Disabled!" : ChatColor.GREEN + "Enabled!")
+ );
}
- return modName;
+
+ msg.send();
}
-
- 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;
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "set_mod_value")
+ public void setModValue(CommandSender sender, String mod, String value) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+ Message msg = new Message(sender, sender);
+
+ msg.appendText(ChatColor.DARK_GREEN + "[BlockPlaceMods] ");
+
+ if (bpm == null) {
+ msg.appendText(ChatColor.DARK_RED + "That mod does not exist!");
+ } else {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ switch (bpm.type) {
+ case STATELESS:
+ msg.appendText(ChatColor.DARK_RED + "You cannot change the value of a stateless mod!");
+ break;
+ case STRING:
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", value);
+
+ msg.appendText(
+ ChatColor.GREEN + "Changed the value of "
+ + ChatColor.DARK_PURPLE + bpm.name + ChatColor.GREEN
+ + " to: " + ChatColor.GRAY + value
+ );
+
+ break;
+ case INTEGER:
+ try {
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", Integer.parseInt(value));
+ } catch (NumberFormatException e) {
+ msg.appendText(ChatColor.RED + "The specified value must be an integer!");
+ break;
+ }
+
+ msg.appendText(
+ ChatColor.GREEN + "Changed the value of "
+ + ChatColor.DARK_PURPLE + bpm.name + ChatColor.GREEN
+ + " to: " + ChatColor.GRAY + value
+ );
+
+ break;
+ case UNSIGNED_INTEGER:
+ try {
+ int val = Integer.parseInt(value);
+
+ if (val < 0) {
+ msg.appendText(ChatColor.RED + "The specified value must be a positive integer!");
+ break;
+ }
+
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
+ } catch (NumberFormatException e) {
+ msg.appendText(ChatColor.RED + "The specified value must be a positive integer!");
+ break;
+ }
+
+ msg.appendText(
+ ChatColor.GREEN + "Changed the value of "
+ + ChatColor.DARK_PURPLE + bpm.name + ChatColor.GREEN
+ + " to: " + ChatColor.GRAY + value
+ );
+
+ break;
+ case REDSTONE_LEVEL:
+ try {
+ int val = Integer.parseInt(value);
+
+ if (val < 1 || val > 15) {
+ msg.appendText(ChatColor.RED + "The specified value must be an integer between 0 (exclusive) and 15 (inclusive)!");
+ break;
+ }
+
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
+ } catch (NumberFormatException e) {
+ msg.appendText(ChatColor.RED + "The specified value must be an integer between 0 (exclusive) and 15 (inclusive)!");
+ break;
+ }
+
+ msg.appendText(
+ ChatColor.GREEN + "Changed the value of "
+ + ChatColor.DARK_PURPLE + bpm.name + ChatColor.GREEN
+ + " to: " + ChatColor.GRAY + value
+ );
+
+ break;
+ }
}
+
+ msg.send();
}
}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/ModType.java b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java
new file mode 100644
index 0000000..6ef4634
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java
@@ -0,0 +1,9 @@
+package com.redstoner.modules.blockplacemods;
+
+public enum ModType {
+ STATELESS,
+ INTEGER,
+ UNSIGNED_INTEGER,
+ STRING,
+ REDSTONE_LEVEL
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/Mod.java
deleted file mode 100644
index 9a2fcad..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/Mod.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.entity.Player;
-
-import com.redstoner.utils.CommandException;
-
-import java.util.Set;
-
-public interface Mod
-{
- String getName();
-
- String getDescription();
-
- Set<String> getAliases();
-
- Object getDefault();
-
- String runCommand(Player sender, String[] args) throws CommandException;
-
- void registerListeners();
-
- void unregisterListeners();
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModAbstract.java
deleted file mode 100644
index 5a383d8..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModAbstract.java
+++ /dev/null
@@ -1,94 +0,0 @@
-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.Objects;
-import java.util.Set;
-
-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;
-
-import com.redstoner.misc.Main;
-import com.redstoner.modules.ModuleLogger;
-import com.redstoner.modules.datamanager.DataManager;
-
-public abstract class ModAbstract implements Mod, Listener
-{
- private static final Map<String, Mod> mods = new HashMap<>();
- private final String name;
- private final Set<String> aliases;
- private static ModuleLogger logger;
-
- public static Map<String, Mod> getMods()
- {
- return Collections.unmodifiableMap(mods);
- }
-
- public static Mod getMod(String name)
- {
- return mods.get(name);
- }
-
- public static void registerMod(Mod mod)
- {
- mods.put(mod.getName(), mod);
- for (String alias : mod.getAliases())
- {
- mods.putIfAbsent(alias, mod);
- }
- }
-
- public static void registerAll(final ModuleLogger logger)
- {
- ModAbstract.logger = logger;
- registerMod(new ModToggledCauldron());
- registerMod(new ModToggledPiston());
- registerMod(new ModToggledObserver());
- 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);
- logger.info("Loaded mod " + name);
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public Set<String> getAliases()
- {
- 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/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java
new file mode 100644
index 0000000..99a9f5d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java
@@ -0,0 +1,73 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.Directional;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+
+public class ModBetterDirectional extends BlockPlaceMod {
+ private static final BlockFace[][][] dirMap = {
+ {
+ { null, null, null },
+ { null, BlockFace.WEST, null }, // (-1, 0, 0)
+ { null, null, null }
+ },
+ {
+ { null, BlockFace.DOWN, null }, // (0, -1, 0)
+ { BlockFace.NORTH, BlockFace.SELF, BlockFace.SOUTH }, // (0, 0, x)
+ { null, BlockFace.UP, null } // (0, 1, 0)
+ },
+ {
+ { null, null, null },
+ { null, BlockFace.EAST, null }, // (1, 0, 0)
+ { null, null, null }
+ }
+ };
+
+ private final Material material;
+
+ public ModBetterDirectional(String name, Material material, String materialPlural, boolean enabledByDefault) {
+ super(
+ name,
+ "With this mod enabled " + materialPlural + " are placed with the bottom on the block clicked.",
+ ModType.STATELESS,
+ null,
+ enabledByDefault,
+ "BetterDirectional" + material.name().toLowerCase()
+ );
+
+ this.material = material;
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == material
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Directional data = (Directional) block.getBlockData();
+
+ data.setFacing(getDirection(event));
+ block.setBlockData(data);
+ }
+ }
+
+ private BlockFace getDirection(BlockPlaceEvent event) {
+ Location original = event.getBlockPlaced().getLocation();
+ Location against = event.getBlockAgainst().getLocation();
+
+ Location dir = original.subtract(against);
+
+ return dirMap[dir.getBlockX() + 1][dir.getBlockY() + 1][dir.getBlockZ() + 1];
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java
new file mode 100644
index 0000000..d28c9ba
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java
@@ -0,0 +1,63 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.Levelled;
+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 ModCauldron extends BlockPlaceMod {
+ public ModCauldron() {
+ super(
+ "Cauldron",
+ "With this mod enabled cauldrons are placed filled and cycle on a shiftless right click with an empty hand.",
+ ModType.STATELESS,
+ null,
+ true,
+ "CauldronFill", "AutoCauldron"
+ );
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (
+ event.getAction() == Action.RIGHT_CLICK_BLOCK
+ && !event.isCancelled()
+ && !event.getPlayer().isSneaking()
+ && event.getClickedBlock().getType() == Material.CAULDRON
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ && event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR
+ ) {
+ Block block = event.getClickedBlock();
+ Levelled data = (Levelled) block.getBlockData();
+
+ int newLevel = (data.getLevel() + 1) % (data.getMaximumLevel() + 1);
+
+ data.setLevel(newLevel);
+ block.setBlockData(data);
+ }
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == Material.CAULDRON
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Levelled data = (Levelled) block.getBlockData();
+
+ data.setLevel(data.getMaximumLevel());
+ block.setBlockData(data);
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModInventory.java
deleted file mode 100644
index c6e483e..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModInventory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import com.redstoner.modules.datamanager.DataManager;
-import com.redstoner.utils.CommandException;
-import com.redstoner.utils.ItemProperties;
-import org.bukkit.GameMode;
-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 java.util.Arrays;
-
-public class ModInventory extends ModAbstract
-{
- protected InventoryType inventoryType;
-
- public ModInventory(String name, InventoryType inventoryType)
- {
- super(name);
- this.inventoryType = inventoryType;
- }
-
- 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 " + inventoryType.name().toLowerCase() + " placement content";
- }
-
- @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.getInventory().getItemInMainHand();
- 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))
- {
- set(sender, slot, null);
- }
- }
- else
- {
- 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("_", "");
- 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### &3Container Mod&a Help ###\n");
- message.append("&7").append(getDescription()).append('\n');
- message.append("&6/mod ").append(getName().toLowerCase())
- .append("&o <slot> &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()) && event.getPlayer().getGameMode() == GameMode.CREATIVE)
- {
- 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();
- }
- }
- }
- }
-
- 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++)
- {
- Object obj2 = array.get(i);
- 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)
- {
- 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;
- }
- set(player, data);
- }
-
- @SuppressWarnings("unchecked")
- protected void set(Player player, ItemStack[] data)
- {
- if (highestUsedIndex(data) == -1)
- reset(player);
- else
- {
- JSONArray array = new JSONArray();
- 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);
- }
- }
-
- protected boolean present(Player player)
- {
- return get(player) != null;
- }
-
- @Override
- public ItemStack[] getDefault()
- {
- return new ItemStack[0];
- }
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java
new file mode 100644
index 0000000..9e18bef
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java
@@ -0,0 +1,39 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.type.Slab;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+
+public class ModSlab extends BlockPlaceMod {
+ public ModSlab() {
+ super(
+ "Slab",
+ "With this mod enabled Slabs are placed on the top half of the block unless you are sneaking.",
+ ModType.STATELESS,
+ null,
+ true,
+ "Step", "AutoSlab", "AutoStep", "SlabRotation", "StepRotation"
+ );
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getBlockData() instanceof Slab
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Slab data = (Slab) block.getBlockData();
+
+ data.setType(Slab.Type.TOP);
+ block.setBlockData(data);
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java
deleted file mode 100644
index b9b2a7c..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import com.redstoner.modules.datamanager.DataManager;
-import com.redstoner.utils.CommandException;
-import org.bukkit.entity.Player;
-
-public abstract class ModToggledAbstract extends ModAbstract
-{
- protected boolean enabledByDefault;
-
- public ModToggledAbstract(String name, boolean enabledByDefault) {
- super(name);
- this.enabledByDefault = enabledByDefault;
- }
-
- @Override
- public Boolean getDefault() {
- return 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 == enabledByDefault)
- 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### &3Toggled Mod&a Help ###");
- message.append("\n&7").append(getDescription());
- message.append("\n&6/mod ").append(getName()).append("&o (toggle) &btoggles state");
- message.append("\n&6/mod ").append(getName()).append("&o on/off &bsets state");
- message.append("\n&6/mod ").append(getName()).append("&o help &bshows this help page");
- return message.toString();
- }
- final boolean enable;
- 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/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java
deleted file mode 100644
index 669f093..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.GameMode;
-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 ModToggledCauldron extends ModToggledAbstract
-{
- public ModToggledCauldron()
- {
- super("cauldron", false);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, placed cauldrons are filled, and they cycle on shiftless right click with redstone or fist";
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler
- public void onPlayerInteract(PlayerInteractEvent event)
- {
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getPlayer().isSneaking()
- && event.getClickedBlock().getType() == Material.CAULDRON && hasEnabled(event.getPlayer())
- && (event.getPlayer().getGameMode() == GameMode.CREATIVE)
- && (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR))
- {
- Block block = event.getClickedBlock();
- block.setData((byte) ((block.getData() - 1) & 0x3));
- }
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- if (event.getBlock().getType() == Material.CAULDRON && !event.getPlayer().isSneaking()
- && hasEnabled(event.getPlayer()) && (event.getPlayer().getGameMode() == GameMode.CREATIVE))
- {
- event.getBlock().setData((byte) 3);
- }
- }
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java
deleted file mode 100644
index 17c414b..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.GameMode;
-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;
-
-/**
- * A mod that makes placement of directional blocks act the way placement of logs does normally.
- * Quartz pillar placement works like this too.
- *
- * Placed blocks face the block you clicked to place them.
- */
-public abstract class ModToggledLogPlaceAbstract extends ModToggledAbstract {
-
- protected ModToggledLogPlaceAbstract(String name, boolean enabledByDefault) {
- super(name, enabledByDefault);
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- Player player = event.getPlayer();
- Block block;
- if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE
- && isApplicableToPlacedBlock(block = event.getBlock()))
- {
- block.setData((byte) getBlockDataForFacing(block.getFace(event.getBlockAgainst())));
- }
- }
-
- protected abstract int getBlockDataForFacing(BlockFace direction);
-
- protected abstract boolean isApplicableToPlacedBlock(Block block);
-
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java
deleted file mode 100644
index 8084bf4..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-
-public class ModToggledObserver extends ModToggledLogPlaceAbstract {
-
- protected ModToggledObserver() {
- super("observer", false);
- }
-
- @Override
- public String getDescription() {
- return "If active, observers face the block you place them against";
- }
-
- @Override
- protected boolean isApplicableToPlacedBlock(Block block) {
- return block.getType() == Material.OBSERVER;
- }
-
- @Override
- protected int getBlockDataForFacing(BlockFace direction) {
- switch (direction) {
- case UP:
- return 0;
- default:
- case DOWN:
- return 1;
- case SOUTH:
- return 2;
- case NORTH:
- return 3;
- case EAST:
- return 4;
- case WEST:
- return 5;
- }
- }
-
-
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java
deleted file mode 100644
index 29e810c..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-
-public class ModToggledPiston extends ModToggledLogPlaceAbstract
-{
- public ModToggledPiston()
- {
- super("piston", false);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, pistons face the block you place them against";
- }
-
- @Override
- protected boolean isApplicableToPlacedBlock(Block block) {
- Material type = block.getType();
- return type == Material.PISTON_BASE || type == Material.PISTON_STICKY_BASE;
- }
-
- @Override
- protected int getBlockDataForFacing(BlockFace direction) {
- switch (direction)
- {
- default:
- case DOWN:
- return 0;
- case UP:
- return 1;
- case NORTH:
- return 2;
- case SOUTH:
- return 3;
- case WEST:
- return 4;
- case EAST:
- return 5;
- }
- }
-
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java
deleted file mode 100644
index fe42fa4..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java
+++ /dev/null
@@ -1,40 +0,0 @@
-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 ModToggledStep extends ModToggledAbstract
-{
- public ModToggledStep()
- {
- super("step", true);
- getAliases().add("slab");
- }
-
- @Override
- public String getDescription()
- {
- return "If active, placed steps will always turn upside-down";
- }
-
- @SuppressWarnings("deprecation")
- @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;
- }
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java
deleted file mode 100644
index 188bce2..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java
+++ /dev/null
@@ -1,91 +0,0 @@
-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 ModToggledTorch extends ModToggledAbstract
-{
- private final Set<Block> torchesPlaced = new HashSet<>();
-
- public ModToggledTorch()
- {
- super("torch", true);
- Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, redstone torches placed on a redstone block disappear quickly";
- }
-
- @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());
- }
- }
- }
-
- @SuppressWarnings("deprecation")
- 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<Block> 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();
- }
- }
- }
-}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java
new file mode 100644
index 0000000..a1c4f08
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java
@@ -0,0 +1,80 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.misc.Main;
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.material.RedstoneTorch;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ModTorch extends BlockPlaceMod {
+ private static final Map<Block, Block> monitorBlocks = new HashMap<>();
+
+ private int monitorId = -1;
+
+ public ModTorch() {
+ super(
+ "Torch",
+ "With this mod enabled redstone torches placed on redstone blocks get auto removed after they turn off.",
+ ModType.STATELESS,
+ null,
+ true,
+ "AutoTorch", "TorchRemoval", "RedstoneTorch"
+ );
+ }
+
+ @Override
+ public boolean onEnable() {
+ monitorId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, () -> {
+ for (Block block : monitorBlocks.keySet()) {
+ Block against = monitorBlocks.get(block);
+
+ if (block.getType() != Material.REDSTONE_TORCH || against.getType() != Material.REDSTONE_BLOCK) {
+ monitorBlocks.remove(block);
+ return;
+ }
+
+ RedstoneTorch data = (RedstoneTorch) block.getBlockData();
+
+ if (!data.isPowered()) {
+ block.setType(Material.AIR);
+ }
+ }
+ }, 2, 2);
+
+ return monitorId != -1;
+ }
+
+ @Override
+ public void onDisable() {
+ Bukkit.getScheduler().cancelTask(monitorId);
+ monitorId = -1;
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == Material.REDSTONE_TORCH
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Block against = event.getBlockAgainst();
+
+ if (against.getType() == Material.REDSTONE_BLOCK) {
+ monitorBlocks.put(block, against);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/module.info b/src/main/java/com/redstoner/modules/blockplacemods/mods/module.info
deleted file mode 100644
index 9d3a3dc..0000000
--- a/src/main/java/com/redstoner/modules/blockplacemods/mods/module.info
+++ /dev/null
@@ -1,3 +0,0 @@
-displayName:
-category:
-description: \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/module.info b/src/main/java/com/redstoner/modules/blockplacemods/module.info
new file mode 100644
index 0000000..2d1904f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/module.info
@@ -0,0 +1,3 @@
+displayName: BlockPlaceMods
+category: Other
+description: Adds features to block placing. \ No newline at end of file