diff options
Diffstat (limited to 'src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java')
-rw-r--r-- | src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java new file mode 100644 index 0000000..1306235 --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -0,0 +1,213 @@ +package com.redstoner.modules.blockplacemods; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Main; +import com.redstoner.modules.Module; +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.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.File) +@AutoRegisterListener +@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() { + 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("Failed to enable the mod, &e" + mod.name + "&7!"); + } + } + + return true; + } + + @Override + public void onDisable() { + for (BlockPlaceMod mod : enabledMods) { + mod.onDisable(); + HandlerList.unregisterAll(mod); + } + + enabledMods.clear(); + mods.clear(); + } + + @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(getLogger().getHeader() + "\n"); + + int curMod = 1; + for (BlockPlaceMod mod : modsToRegister) { + + boolean enabled = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name, mod.enabledByDefault); + boolean loaded = enabledMods.contains(mod); + + String text = (enabled? "&a" : "&c") + (loaded? "" : "&m") + mod.name; + String hover = (enabled? "&aEnabled" : "&cDisabled") + (loaded? "" : "\n&c&oThis mod is not loaded, report to staff!"); + + if (mod.type != ModType.STATELESS) { + Object state = DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name + "_state", null); + if (state != null) + hover += ("\n\n&7Value: &e" + state.toString() + "\n&7Type: &e" + mod.type.asString() + " \n&7Meaning: " + mod.typeDescription); + } + + hover += "\n\n&7" + mod.description + "\n&e&oClick to " + (enabled? "&c&oDisable" : "&a&oEnable"); + msg.appendSendChatHover(text, "/bpm " + mod.name, hover); + + if (curMod != modsToRegister.length) + msg.appendText("&7, "); + curMod++; + } + msg.appendText("\n\n&2Hover over a mod for details.") + .send(); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "reset_mod") + public void resetMod(CommandSender sender, String mod) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + Player player = (Player) sender; + DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name); + DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name + "_state"); + + getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been reset back to it's original settings."); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod_no_prefix") + public void toggleModNoPrefix(CommandSender sender, String mod) { + if (mod.equals("help")) + try { + Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "bpm help 1")).get(); + } catch (Exception e) { + getLogger().message(sender, true, "&4An error accorded trying to show you the help! Please inform a staff member!"); + e.printStackTrace(); + } + else + toggleMod(sender, mod); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod") + public void toggleMod(CommandSender sender, String mod) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + 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); + + getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been " + (current ? "&cDisabled&7!" : "&aEnabled&7!")); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "set_mod_value") + public void setModValue(CommandSender sender, String mod, String value) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); + + switch (bpm.type) { + case STATELESS: + getLogger().message(sender, true, "You cannot change the value of a stateless mod!"); + break; + case STRING: + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", value); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + break; + case INTEGER: + try { + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", Integer.parseInt(value)); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be an integer!"); + } + break; + case UNSIGNED_INTEGER: + try { + int val = Integer.parseInt(value); + + if (val < 0) { + getLogger().message(sender, true, "The specified value must be zero or a positive integer!"); + break; + } + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be zero or a positive integer!"); + } + break; + case REDSTONE_LEVEL: + try { + int val = Integer.parseInt(value); + + if (val < 1 || val > 15) { + getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!"); + break; + } + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!"); + } + break; + } + } +} |