From 4fd9c0144a0aa1306c46e14f11e5c014201a22c6 Mon Sep 17 00:00:00 2001 From: thetrouper Date: Tue, 25 Mar 2025 17:57:04 -0500 Subject: [PATCH] Added custom craft --- .../java/me/trouper/armorsmp/ArmorSMP.java | 8 ++- .../me/trouper/armorsmp/data/ArmorTier.java | 31 ++++++++ .../java/me/trouper/armorsmp/data/Config.java | 8 ++- .../me/trouper/armorsmp/data/Storage.java | 4 ++ .../me/trouper/armorsmp/server/Manager.java | 35 +++++++++- .../{GiveCommand.java => AdminCommand.java} | 19 +++-- ...ceToggleCommand.java => TrustCommand.java} | 2 +- .../server/crafting/ArmorUpgrade.java | 44 ++++++++++++ .../armorsmp/server/events/CraftEvent.java | 4 +- .../server/functions/ArmorBackend.java | 47 +++++++++++++ .../java/me/trouper/armorsmp/utils/Text.java | 43 +++++++----- .../me/trouper/armorsmp/utils/Verbose.java | 70 +++++++++++++++++++ src/main/resources/plugin.yml | 13 ++++ 13 files changed, 291 insertions(+), 37 deletions(-) create mode 100644 src/main/java/me/trouper/armorsmp/data/ArmorTier.java rename src/main/java/me/trouper/armorsmp/server/commands/{GiveCommand.java => AdminCommand.java} (57%) rename src/main/java/me/trouper/armorsmp/server/commands/{MaceToggleCommand.java => TrustCommand.java} (90%) create mode 100644 src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java create mode 100644 src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java create mode 100644 src/main/java/me/trouper/armorsmp/utils/Verbose.java diff --git a/src/main/java/me/trouper/armorsmp/ArmorSMP.java b/src/main/java/me/trouper/armorsmp/ArmorSMP.java index 81945af..fa7c2d2 100644 --- a/src/main/java/me/trouper/armorsmp/ArmorSMP.java +++ b/src/main/java/me/trouper/armorsmp/ArmorSMP.java @@ -11,14 +11,20 @@ public final class ArmorSMP extends JavaPlugin { @Override public void onEnable() { + getLogger().info("Initializing PDK"); PDK.init(this); + + getLogger().info("Instantiating Plugin"); instance = this; + + getLogger().info("Initializing Manager"); manager = new Manager().init(); } @Override public void onDisable() { - + manager.io.saveAll(); + getLogger().info("Saved all IO files."); } public static ArmorSMP getInstance() { diff --git a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java new file mode 100644 index 0000000..47345d4 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java @@ -0,0 +1,31 @@ +package me.trouper.armorsmp.data; + +public enum ArmorTier { + NONE(0), + LEATHER(1), + CHAINMAIL(2), + GOLD(3), + IRON(4), + DIAMOND(5); + + private int numeric; + + ArmorTier(int numeric) { + this.numeric = numeric; + } + + public int getNumeric() { + return numeric; + } + + public static ArmorTier getTier(int numeric) { + for (ArmorTier value : values()) { + if (value.getNumeric() == numeric) return value; + if (value.getNumeric() < 1 ) return NONE; + if (value.getNumeric() > 5) { + return DIAMOND; + } + } + return NONE; + } +} diff --git a/src/main/java/me/trouper/armorsmp/data/Config.java b/src/main/java/me/trouper/armorsmp/data/Config.java index fd168b9..96053fa 100644 --- a/src/main/java/me/trouper/armorsmp/data/Config.java +++ b/src/main/java/me/trouper/armorsmp/data/Config.java @@ -8,13 +8,17 @@ import java.util.Arrays; import java.util.List; public class Config implements JsonSerializable { - + + public boolean debugMode = false; + @Override public File getFile() { return ArmorSMP.getInstance().getManager().io.CONFIG_FILE; } - public boolean maceCraftingeEnabled = true; + public boolean maceCraftingEnabled = true; + public boolean netherEnabled = true; + public boolean endEnabled = true; public String mainColor = "�ff00"; public String prefix = "&9ArmorSMP> &7"; diff --git a/src/main/java/me/trouper/armorsmp/data/Storage.java b/src/main/java/me/trouper/armorsmp/data/Storage.java index 0ac1f2e..9f986fc 100644 --- a/src/main/java/me/trouper/armorsmp/data/Storage.java +++ b/src/main/java/me/trouper/armorsmp/data/Storage.java @@ -4,7 +4,9 @@ import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.armorsmp.ArmorSMP; import java.io.File; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; public class Storage implements JsonSerializable { @@ -18,5 +20,7 @@ public class Storage implements JsonSerializable { public class UserData { public Set tipsDisabled = new HashSet<>(); + public Map playerTiers = new HashMap<>(); + public Map> playerTrust = new HashMap<>(); } } diff --git a/src/main/java/me/trouper/armorsmp/server/Manager.java b/src/main/java/me/trouper/armorsmp/server/Manager.java index 31b3a3d..43cbdf3 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -1,16 +1,38 @@ package me.trouper.armorsmp.server; +import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.IO; +import me.trouper.armorsmp.server.commands.AdminCommand; +import me.trouper.armorsmp.server.commands.TrustCommand; +import me.trouper.armorsmp.server.crafting.ArmorUpgrade; +import me.trouper.armorsmp.server.events.CraftEvent; +import me.trouper.armorsmp.server.functions.ArmorBackend; public class Manager { + // My systems public IO io; + public ArmorBackend armor; + + // Commands + public AdminCommand adminCommand; + public TrustCommand trustCommand; + + // Events + public CraftEvent craftEvent; public Manager() { - io = new IO(); + io = new IO(); // IO must come as the first. + armor = new ArmorBackend(); + + adminCommand = new AdminCommand(); + trustCommand = new TrustCommand(); + craftEvent = new CraftEvent(); } public Manager init() { + ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); io.loadAll(); + registerCommands(); registerEvents(); registerCrafting(); @@ -18,16 +40,23 @@ public class Manager { return this; } + private void registerEvents() { - + ArmorSMP.getInstance().getLogger().info("Registering Events"); + craftEvent.register(); } private void registerCommands() { - + ArmorSMP.getInstance().getLogger().info("Registering Commands"); + adminCommand.register(); + trustCommand.register(); } private void registerCrafting() { + ArmorSMP.getInstance().getLogger().info("Repairing Crafts"); + ArmorUpgrade.removeRecipe(); + ArmorUpgrade.addRecipe(); } } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/GiveCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java similarity index 57% rename from src/main/java/me/trouper/armorsmp/server/commands/GiveCommand.java rename to src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java index 6e5a80e..f742e56 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/GiveCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -11,22 +11,21 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandRegistry(value = "armorsmp_give", permission = @Permission("armorsmp.give")) -public class GiveCommand implements CustomCommand { +@CommandRegistry(value = "armorsmp", permission = @Permission("op"), printStackTrace = true) +public class AdminCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Command command, String label, Args args) { - String target = args.get(0).toString(); - Player t = Bukkit.getPlayer(target); - if (t == null) { - Text.sendError((Player) commandSender); - return; + public void dispatchCommand(CommandSender sender, Command command, String label, Args args) { + if (args.getSize() < 1) { + Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]"); } switch (label) { - case "neth_axe" -> { + case "change" -> { } - + default -> { + Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]"); + } } } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/MaceToggleCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java similarity index 90% rename from src/main/java/me/trouper/armorsmp/server/commands/MaceToggleCommand.java rename to src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java index 00c6b44..f33bdb7 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/MaceToggleCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java @@ -6,7 +6,7 @@ import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -public class MaceToggleCommand implements CustomCommand { +public class TrustCommand implements CustomCommand { @Override public void dispatchCommand(CommandSender commandSender, Command command, String s, Args args) { diff --git a/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java new file mode 100644 index 0000000..4d7ca90 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java @@ -0,0 +1,44 @@ +package me.trouper.armorsmp.server.crafting; + +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import me.trouper.armorsmp.ArmorSMP; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; + +public class ArmorUpgrade { + public static final ItemStack ARMOR_UGPRADE = ItemBuilder.create() + .material(Material.NETHER_STAR) + .name("§b§lArmor Upgrade") + .lore("§9| §3Right click to upgrade your gear") + .count(1) + .customModelData(1) + .build(); + + public static final NamespacedKey KEY = new NamespacedKey(ArmorSMP.getInstance(), "armor_upgrade_recipe"); + + public static ShapedRecipe recipe = new ShapedRecipe(KEY, ARMOR_UGPRADE); + + public static void addRecipe() { + recipe.shape("ABC", "DEF", "GHI"); + + recipe.setIngredient('A', Material.DIAMOND_BLOCK); + recipe.setIngredient('B', Material.DIAMOND_BLOCK); + recipe.setIngredient('C', Material.DIAMOND_BLOCK); + + recipe.setIngredient('D', Material.OMINOUS_TRIAL_KEY); + recipe.setIngredient('E', Material.ENCHANTED_GOLDEN_APPLE); + recipe.setIngredient('F', Material.OMINOUS_TRIAL_KEY); + + recipe.setIngredient('G', Material.DIAMOND_BLOCK); + recipe.setIngredient('H', Material.DIAMOND_BLOCK); + recipe.setIngredient('I', Material.DIAMOND_BLOCK); + + ArmorSMP.getInstance().getServer().addRecipe(recipe); + } + + public static void removeRecipe() { + ArmorSMP.getInstance().getServer().removeRecipe(KEY); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java b/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java index b247b8e..4069dfc 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java @@ -19,11 +19,11 @@ public class CraftEvent implements CustomListener { && !name.contains("CHESTPLATE") && !name.contains("LEGGINGS") && !name.contains("BOOTS") - && !name.contains("NETHERITE_AXE") && !name.contains("NETHERITE_SWORD") + && !name.contains("NETHERITE_PICKAXE") + && !name.contains("NETHERITE_AXE") && !name.contains("NETHERITE_SHOVEL") && !name.contains("NETHERITE_HOE") - && !name.contains("NETHERITE_PICKAXE") ) return; e.setCancelled(true); diff --git a/src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java b/src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java new file mode 100644 index 0000000..4029c67 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java @@ -0,0 +1,47 @@ +package me.trouper.armorsmp.server.functions; + +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.data.Storage; +import org.bukkit.entity.Player; + +public class ArmorBackend { + + private final Storage storage; + + public ArmorBackend() { + storage = ArmorSMP.getInstance().getManager().io.storage; + } + + public void setTier(Player target, ArmorTier tier) { + storage.userData.playerTiers.put(target.getUniqueId().toString(),tier.getNumeric()); + storage.save(); + } + + public void setTier(Player target, int tier) { + setTier(target,ArmorTier.getTier(tier)); + } + + public void downTier(Player target) { + int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); + setTier(target,ArmorTier.getTier(numeric - 1)); + } + + public void upTier(Player target) { + int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); + setTier(target,ArmorTier.getTier(numeric + 1)); + } + + public ArmorTier getTier(Player target) { + int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); + for (ArmorTier value : ArmorTier.values()) { + if (value.getNumeric() == numeric) return value; + if (value.getNumeric() > 5) { + ArmorSMP.getInstance().getLogger().warning("Detected a player above tier 5 (diamond) this should not be possible. Setting them back to diamond."); + setTier(target,ArmorTier.DIAMOND); + return ArmorTier.DIAMOND; + } + } + return ArmorTier.NONE; + } +} diff --git a/src/main/java/me/trouper/armorsmp/utils/Text.java b/src/main/java/me/trouper/armorsmp/utils/Text.java index 3307516..90ca877 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Text.java +++ b/src/main/java/me/trouper/armorsmp/utils/Text.java @@ -8,6 +8,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.*; @@ -23,33 +24,39 @@ public class Text { public static Component color(String msg) { return LegacyComponentSerializer.legacyAmpersand().deserialize(msg); } - - public static void sendWarning(Player player,String warning, Object... args) { - sendMessage(Pallet.WARNING,player,warning,false,args); - } - - public static void sendError(Player player, String error, Object... args) { - sendMessage(Pallet.ERROR,player,error,false,args); + + public static void sendWarning(CommandSender sender, String warning, Object... args) { + sendMessage(Pallet.WARNING, sender, warning, false, args); } - public static void sendMessage(Player player, String text, boolean allowTip, Object... args) { - sendMessage(Pallet.NEUTRAL,player,text,allowTip,args); + public static void sendError(CommandSender sender, String error, Object... args) { + sendMessage(Pallet.ERROR, sender, error, false, args); } - public static void sendMessage(Pallet pallet, Player player, String text, boolean allowTip, Object... args) { - text = formatArgs(pallet,text,args); - sendMessage(player,text,allowTip); + public static void sendMessage(CommandSender sender, String text, boolean allowTip, Object... args) { + sendMessage(Pallet.NEUTRAL, sender, text, allowTip, args); } - public static void sendMessage(Player player, String text, boolean allowTip) { - allowTip = allowTip && ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled && !ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(player.getUniqueId().toString()); - Component message = getMessage(text,allowTip); - player.sendMessage(message); + public static void sendMessage(Pallet pallet, CommandSender sender, String text, boolean allowTip, Object... args) { + text = formatArgs(pallet, text, args); + sendMessage(sender, text, allowTip); + } + + public static void sendMessage(CommandSender sender, String text, boolean allowTip) { + if (sender instanceof Player player) { + allowTip = allowTip + && ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled + && !ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(player.getUniqueId().toString()); + } else { + allowTip = false; + } + Component message = getMessage(text, allowTip); + sender.sendMessage(message); } public static Component getMessage(String text, boolean addFancyTip) { if (ArmorSMP.getInstance().getManager().io.config.fancyAlerts) { - return formatFancyMessage(text,addFancyTip); + return formatFancyMessage(text, addFancyTip); } else { return color(ArmorSMP.getInstance().getManager().io.config.prefix + text); } @@ -88,7 +95,7 @@ public class Text { return LegacyComponentSerializer.legacyAmpersand().serialize(message); } - public static Component formatFancyMessage(String text,boolean addTip) { + public static Component formatFancyMessage(String text, boolean addTip) { Component message = Component.empty().appendNewline(); if (addTip) { diff --git a/src/main/java/me/trouper/armorsmp/utils/Verbose.java b/src/main/java/me/trouper/armorsmp/utils/Verbose.java new file mode 100644 index 0000000..0a6caad --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/utils/Verbose.java @@ -0,0 +1,70 @@ +package me.trouper.armorsmp.utils; + +import me.trouper.armorsmp.ArmorSMP; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.Arrays; + +public class Verbose { + + public static void send(int backtrace, String message, Object... args) { + if (!ArmorSMP.getInstance().getManager().io.config.debugMode) return; + String callerInfo = "Unknown Caller"; + + // Capture the stack trace to determine the caller + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + if (stackTrace.length > 2 + backtrace) { // Ensure we have enough depth + StackTraceElement caller = stackTrace[2 + backtrace]; // The method that called `verbose()` + + String className = caller.getClassName(); + className = className.substring(className.lastIndexOf(".") + 1); + if (className.contains("-")) { + callerInfo = "Protected"; + } else { + callerInfo = className + "." + caller.getMethodName(); + } + + + } + + String formattedMessage = message.formatted(args); + String log = "[Sentinel] [DEBUG ^ %s] [%s]: %s".formatted(backtrace, callerInfo, formattedMessage); + ArmorSMP.getInstance().getLogger().info(log); + + for (Player operator : Bukkit.getOnlinePlayers()) { + if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG ^ %s§7] §7[§e%s§7] §8» §7%s" + .formatted(backtrace, callerInfo, formattedMessage)); + } + } + + public static void send(String message, Object... args) { + if (!ArmorSMP.getInstance().getManager().io.config.debugMode) return; + String callerInfo = "Unknown Caller"; + + // Capture the stack trace to determine the caller + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + if (stackTrace.length > 2) { // Ensure we have enough depth + StackTraceElement caller = stackTrace[2]; // The method that called `verbose()` + + String className = caller.getClassName(); + className = className.substring(className.lastIndexOf(".") + 1); + if (className.contains("-")) { + callerInfo = "Protected"; + } else { + callerInfo = className + "." + caller.getMethodName(); + } + + + } + + String formattedMessage = message.formatted(args); + String log = "[Sentinel] [DEBUG] [%s]: %s".formatted(callerInfo, formattedMessage); + ArmorSMP.getInstance().getLogger().info(log); + + for (Player operator : Bukkit.getOnlinePlayers()) { + if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG§7] §7[§e%s§7] §8» §7%s" + .formatted(callerInfo, formattedMessage)); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d2f0d5c..4625655 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,3 +6,16 @@ prefix: ArmorSMP load: STARTUP authors: [ obvWolf ] description: Kill Based Armor Upgrading +commands: + trust: + description: Make your friends immune to your abilities. + usage: " " + aliases: + - t + armorsmp: + permission: op + description: Root command for giving items, everything is handled though alias labels. + usage: "/asmp usage" + aliases: + - asmp + - armor_smp \ No newline at end of file