From 7f15410220e93cf67b839e17447e84df7d64254a Mon Sep 17 00:00:00 2001 From: thetrouper Date: Tue, 25 Mar 2025 21:54:12 -0500 Subject: [PATCH] Added netherite items in concept, trust and admin commands are conceptual as well. --- .../trouper/armorsmp/data/NetheritePiece.java | 71 ++++++++ .../me/trouper/armorsmp/server/Manager.java | 5 +- .../server/commands/AdminCommand.java | 167 +++++++++++++++++- .../server/commands/TrustCommand.java | 79 ++++++++- .../server/crafting/ArmorUpgrade.java | 2 +- .../armorsmp/server/events/CraftEvent.java | 7 + .../{functions => systems}/ArmorBackend.java | 18 +- .../armorsmp/server/systems/TrustBackend.java | 38 ++++ .../java/me/trouper/armorsmp/utils/Text.java | 14 +- 9 files changed, 375 insertions(+), 26 deletions(-) create mode 100644 src/main/java/me/trouper/armorsmp/data/NetheritePiece.java rename src/main/java/me/trouper/armorsmp/server/{functions => systems}/ArmorBackend.java (69%) create mode 100644 src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java diff --git a/src/main/java/me/trouper/armorsmp/data/NetheritePiece.java b/src/main/java/me/trouper/armorsmp/data/NetheritePiece.java new file mode 100644 index 0000000..dc121fc --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/data/NetheritePiece.java @@ -0,0 +1,71 @@ +package me.trouper.armorsmp.data; + +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import me.trouper.armorsmp.utils.Text; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; + +public enum NetheritePiece { + HELMET(ItemBuilder.create() + .material(Material.NETHERITE_HELMET) + .lore(Text.legacyColor("&bAbilities:")) + .lore(Text.legacyColor("&3| &75 Extra Hearts")) + .lore(Text.legacyColor("&3| &7Fire Resistence")) + .enchant(Enchantment.BINDING_CURSE,1) + .enchant(Enchantment.PROTECTION,4) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.RESPIRATION,3) + .enchant(Enchantment.AQUA_AFFINITY,1) + .build() + ), + CHESTPLATE(ItemBuilder.create() + .material(Material.NETHERITE_CHESTPLATE) + .lore(Text.legacyColor("&bAbilities:")) + .lore(Text.legacyColor("&3| &7Dragon's Breath")) + .lore(Text.legacyColor("&3| &7Resistence I")) + .lore(Text.legacyColor("&3| &7Strength I")) + .enchant(Enchantment.BINDING_CURSE,1) + .enchant(Enchantment.PROTECTION,4) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .build() + ), + LEGGINGS(ItemBuilder.create() + .material(Material.NETHERITE_LEGGINGS) + .lore(Text.legacyColor("&bAbilities:")) + .lore(Text.legacyColor("&3| &7Knockback Shield")) + .lore(Text.legacyColor("&3| &7Resistence I")) + .enchant(Enchantment.BINDING_CURSE,1) + .enchant(Enchantment.PROTECTION,4) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.SWIFT_SNEAK,3) + .build() + ), + BOOTS(ItemBuilder.create() + .material(Material.NETHERITE_BOOTS) + .lore(Text.legacyColor("&bAbilities:")) + .lore(Text.legacyColor("&3| &7Dash")) + .lore(Text.legacyColor("&3| &7Speed 1")) + .enchant(Enchantment.BINDING_CURSE,1) + .enchant(Enchantment.PROTECTION,4) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.SOUL_SPEED,3) + .enchant(Enchantment.FEATHER_FALLING,4) + .enchant(Enchantment.DEPTH_STRIDER,3) + .build() + ); + + private ItemStack inGame; + + NetheritePiece(ItemStack inGame) { + this.inGame = inGame; + } + + public ItemStack getInGameItem() { + return inGame; + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/Manager.java b/src/main/java/me/trouper/armorsmp/server/Manager.java index 43cbdf3..94866d8 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -6,12 +6,14 @@ 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; +import me.trouper.armorsmp.server.systems.ArmorBackend; +import me.trouper.armorsmp.server.systems.TrustBackend; public class Manager { // My systems public IO io; public ArmorBackend armor; + public TrustBackend trust; // Commands public AdminCommand adminCommand; @@ -23,6 +25,7 @@ public class Manager { public Manager() { io = new IO(); // IO must come as the first. armor = new ArmorBackend(); + trust = new TrustBackend(); adminCommand = new AdminCommand(); trustCommand = new TrustCommand(); diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java index f742e56..e8440be 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -5,32 +5,185 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.data.NetheritePiece; +import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.Arrays; +import java.util.List; + @CommandRegistry(value = "armorsmp", permission = @Permission("op"), printStackTrace = true) public class AdminCommand implements CustomCommand { - + @Override 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]"); + return; } - switch (label) { + String sub = args.get(0).toString(); + switch (sub) { case "change" -> { - + if (args.getSize() < 3) { + Text.sendError(sender, "Usage: /armorsmp change "); + return; + } + final String tierName = args.get(1).toString(); + final String playerName = args.get(2).toString(); + final OfflinePlayer target = Bukkit.getPlayer(playerName); + + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + try { + ArmorTier tier = ArmorTier.valueOf(tierName.toUpperCase()); + ArmorSMP.getInstance().getManager().armor.setTier(target,tier); + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender,"Changed armor tier to {0} for {1}",tier,target.getName()); + } catch (IllegalArgumentException e) { + Text.sendError(sender, "Invalid tier! Valid tiers: " + Arrays.toString(ArmorTier.values())); + } } - default -> { - Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]"); + case "give" -> { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /armorsmp give ..."); + return; + } + String type = args.get(1).toString().toLowerCase(); + + switch (type) { + case "upgrader" -> { + if (args.getSize() < 3) { + Text.sendError(sender, "Usage: /armorsmp give upgrader "); + return; + } + Player target = Bukkit.getPlayer(args.get(2).toString()); + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + + target.getInventory().addItem(ArmorUpgrade.ARMOR_UGPRADE); + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}",target.getName()); + } + case "netherite" -> { + if (args.getSize() < 4) { + Text.sendError(sender, "Usage: /armorsmp give netherite "); + return; + } + NetheritePiece piece = args.get(2).toEnum(NetheritePiece.class); + if (piece == null) { + Text.sendMessage(false, Text.Pallet.ERROR,sender,"Error: {0} is not a valid Netherite piece.",args.get(2).toString()); + return; + } + + Player target = Bukkit.getPlayer(args.get(3).toString()); + + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + + // TODO: Handle netherite stuff + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given {0} to {1}",piece.name().toLowerCase(), target.getName()); + } + case "mace" -> { + if (args.getSize() < 3) { + Text.sendError(sender, "Usage: /armorsmp give mace "); + return; + } + Player target = Bukkit.getPlayer(args.get(2).toString()); + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + + // TODO: handle Mace stuff + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given {0} to {1}","mace",target.getName()); + } + default -> Text.sendError(sender, "Invalid give type! Valid types: upgrader, netherite, mace"); + } } + case "toggle" -> { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /armorsmp toggle "); + return; + } + String feature = args.get(1).toString().toLowerCase(); + // TODO: toggles + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled the {0}",feature); + } + case "reset" -> { + if (args.getSize() < 2 || !args.get(1).toString().equalsIgnoreCase("mace")) { + Text.sendError(sender, "Usage: /armorsmp reset mace"); + return; + } + // TODO: mace reset + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); + } + case "remove" -> { + String type = args.get(1).toString().toLowerCase(); + + switch (type) { + case "netherite" -> { + if (args.getSize() < 4) { + Text.sendError(sender, "Usage: /armorsmp remove "); + return; + } + NetheritePiece piece = args.get(2).toEnum(NetheritePiece.class); + Player target = Bukkit.getPlayer(args.get(3).toString()); + + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + + // TODO: armor removal + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.name().toLowerCase(), target.getName()); + } + default -> Text.sendError(sender, "Invalid give type! Valid types: netherite"); + } + } + default -> Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]"); } } @Override - public void dispatchCompletions(CommandSender commandSender, Command command, String label, CompletionBuilder completionBuilder) { - + public void dispatchCompletions(CommandSender commandSender, Command command, String label, CompletionBuilder b) { + b.then( + b.arg("change") + .then(b.argEnum(ArmorTier.class).then(b.argOnlinePlayers())) + ).then( + b.arg("give") + .then(b.arg("upgrader") + .then(b.argOnlinePlayers())) + .then(b.arg("netherite") + .then(b.argEnum(NetheritePiece.class) + .then(b.argOnlinePlayers()))) + .then(b.arg("mace") + .then(b.argOnlinePlayers())) + ).then( + b.arg("reset") + .then(b.arg("mace")) + ).then( + b.arg("remove") + .then(b.arg("netherite") + .then(b.argEnum(NetheritePiece.class) + .then(b.argOnlinePlayers()))) + ).then(b.arg("toggle") + .then(b.arg("end","nether","mace"))); } + + } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java index f33bdb7..cd6b4c2 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java @@ -1,19 +1,92 @@ package me.trouper.armorsmp.server.commands; import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +@CommandRegistry(value = "trust", playersOnly = true, printStackTrace = true) public class TrustCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Command command, String s, Args args) { + public void dispatchCommand(CommandSender sender, Command command, String label, Args args) { + if (args.getSize() < 1) { + Text.sendError(sender, "Error: Valid sub-commands are: [add, remove, list]"); + return; + } + + final String sub = args.get(0).toString(); + + switch (sub) { + case "add" -> { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /trust add "); + return; + } + final String target = args.get(1).toString(); + final OfflinePlayer trustee = Bukkit.getOfflinePlayer(target); + if (trustee == null) { + Text.sendError(sender, "Player not found online or offline."); + return; + } + + if (ArmorSMP.getInstance().getManager().trust.addTrust((Player) sender,trustee.getUniqueId())) { + Text.sendMessage(true, Text.Pallet.SUCCESS,sender,"Successfully trusted {0}.",target); + if (trustee.isOnline())Text.sendMessage(true, Text.Pallet.SUCCESS,(Player) trustee,"Successfully trusted {0}.",sender.getName()); + } else { + Text.sendMessage(true, Text.Pallet.NEUTRAL,sender,"You already have {0} trusted.",target); + } + } + case "remove" -> { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /trust remove "); + return; + } + final String target = args.get(1).toString(); + final OfflinePlayer trustee = Bukkit.getOfflinePlayer(target); + + if (trustee == null) { + Text.sendError(sender, "Player not found online or offline."); + return; + } + + if (ArmorSMP.getInstance().getManager().trust.removeTrust((Player) sender,trustee.getUniqueId())) { + Text.sendMessage(true, Text.Pallet.SUCCESS,sender,"Successfully un-trusted {0}.",target); + if (trustee.isOnline())Text.sendMessage(true, Text.Pallet.SUCCESS,(Player) trustee,"{0} has un-trusted you.",sender.getName()); + } else { + Text.sendMessage(true, Text.Pallet.NEUTRAL,sender,"You do not have {0} trusted.",target); + } + } + case "list" -> { + final Set trustees = ArmorSMP.getInstance().getManager().trust.getTrustees((Player) sender); + Set names = new HashSet<>(); + for (String trustee : trustees) { + names.add(Bukkit.getOfflinePlayer(UUID.fromString(trustee)).getName()); + } + Text.sendMessage(false, Text.Pallet.NEUTRAL,sender,"You currently have {0} players trusted: {1}",trustees.size(), Arrays.toString(names.toArray())); + } + } } @Override - public void dispatchCompletions(CommandSender commandSender, Command command, String s, CompletionBuilder completionBuilder) { - + public void dispatchCompletions(CommandSender commandSender, Command command, String s, CompletionBuilder b) { + b.then( + b.arg("add","remove") + .then(b.argOnlinePlayers()) + ).then( + b.arg("list") + ); } } diff --git a/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java index 4d7ca90..937b4f1 100644 --- a/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java +++ b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java @@ -10,7 +10,7 @@ import org.bukkit.inventory.ShapedRecipe; public class ArmorUpgrade { public static final ItemStack ARMOR_UGPRADE = ItemBuilder.create() .material(Material.NETHER_STAR) - .name("§b§lArmor Upgrade") + .name("§b§lArmor Upgrader") .lore("§9| §3Right click to upgrade your gear") .count(1) .customModelData(1) 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 4069dfc..4cfc82a 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java @@ -1,7 +1,9 @@ package me.trouper.armorsmp.server.events; import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.utils.Text; +import me.trouper.armorsmp.utils.Verbose; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.CraftItemEvent; @@ -14,6 +16,8 @@ public class CraftEvent implements CustomListener { final ItemStack result = e.getRecipe().getResult(); final String name = result.getType().name(); final Player p = (Player) e.getWhoClicked(); + + Verbose.send("Handling craft for %s, result: %s", p.getName(), result.getType().name()); if (!name.contains("HELMET") && !name.contains("CHESTPLATE") @@ -24,7 +28,10 @@ public class CraftEvent implements CustomListener { && !name.contains("NETHERITE_AXE") && !name.contains("NETHERITE_SHOVEL") && !name.contains("NETHERITE_HOE") + && (!ArmorSMP.getInstance().getManager().io.config.maceCraftingEnabled && !name.contains("MACE")) ) return; + + Verbose.send("%s Attempted to craft a disabled item.", p.getName()); e.setCancelled(true); p.closeInventory(); diff --git a/src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java similarity index 69% rename from src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java rename to src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java index 4029c67..b47e928 100644 --- a/src/main/java/me/trouper/armorsmp/server/functions/ArmorBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java @@ -1,9 +1,10 @@ -package me.trouper.armorsmp.server.functions; +package me.trouper.armorsmp.server.systems; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.Storage; -import org.bukkit.entity.Player; +import me.trouper.armorsmp.utils.Verbose; +import org.bukkit.OfflinePlayer; public class ArmorBackend { @@ -13,26 +14,29 @@ public class ArmorBackend { storage = ArmorSMP.getInstance().getManager().io.storage; } - public void setTier(Player target, ArmorTier tier) { + public void setTier(OfflinePlayer target, ArmorTier tier) { + Verbose.send("Setting tier of %s to %s",target.getName(),tier); storage.userData.playerTiers.put(target.getUniqueId().toString(),tier.getNumeric()); storage.save(); } - public void setTier(Player target, int tier) { + public void setTier(OfflinePlayer target, int tier) { + Verbose.send("Setting tier of %s to %s",target.getName(),tier); setTier(target,ArmorTier.getTier(tier)); } - public void downTier(Player target) { + public void downTier(OfflinePlayer target) { int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); setTier(target,ArmorTier.getTier(numeric - 1)); } - public void upTier(Player target) { + public void upTier(OfflinePlayer target) { int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); setTier(target,ArmorTier.getTier(numeric + 1)); } - public ArmorTier getTier(Player target) { + public ArmorTier getTier(OfflinePlayer target) { + Verbose.send("Getting tier of %s", target.getName()); int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); for (ArmorTier value : ArmorTier.values()) { if (value.getNumeric() == numeric) return value; diff --git a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java new file mode 100644 index 0000000..87c4dce --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -0,0 +1,38 @@ +package me.trouper.armorsmp.server.systems; + +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.Storage; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class TrustBackend { + private final Storage storage; + + public TrustBackend() { + storage = ArmorSMP.getInstance().getManager().io.storage; + } + + public boolean addTrust(Player truster, UUID trustee) { + Set trustees = getTrustees(truster); + boolean added = trustees.add(trustee.toString()); + storage.userData.playerTrust.put(truster.getUniqueId().toString(),trustees); + storage.save(); + return added; + } + + public boolean removeTrust(Player truster, UUID trustee) { + Set trustees = getTrustees(truster); + boolean removed = trustees.remove(trustee.toString()); + storage.userData.playerTrust.put(truster.getUniqueId().toString(),trustees); + storage.save(); + return removed; + } + + public Set getTrustees(Player target) { + return storage.userData.playerTrust.getOrDefault(target.getUniqueId(),new HashSet<>()); + } + +} diff --git a/src/main/java/me/trouper/armorsmp/utils/Text.java b/src/main/java/me/trouper/armorsmp/utils/Text.java index 90ca877..701942b 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Text.java +++ b/src/main/java/me/trouper/armorsmp/utils/Text.java @@ -26,23 +26,23 @@ public class Text { } public static void sendWarning(CommandSender sender, String warning, Object... args) { - sendMessage(Pallet.WARNING, sender, warning, false, args); + sendMessage(false, Pallet.WARNING, sender, warning, args); } public static void sendError(CommandSender sender, String error, Object... args) { - sendMessage(Pallet.ERROR, sender, error, false, args); + sendMessage(false, Pallet.ERROR, sender, error, args); } - public static void sendMessage(CommandSender sender, String text, boolean allowTip, Object... args) { - sendMessage(Pallet.NEUTRAL, sender, text, allowTip, args); + public static void sendMessage(boolean allowTip, CommandSender sender, String text, Object... args) { + sendMessage(false, Pallet.NEUTRAL, sender, text, args); } - public static void sendMessage(Pallet pallet, CommandSender sender, String text, boolean allowTip, Object... args) { + public static void sendMessage(boolean allowTip, Pallet pallet, CommandSender sender, String text, Object... args) { text = formatArgs(pallet, text, args); - sendMessage(sender, text, allowTip); + sendMessage(allowTip,sender, text); } - public static void sendMessage(CommandSender sender, String text, boolean allowTip) { + public static void sendMessage(boolean allowTip, CommandSender sender, String text) { if (sender instanceof Player player) { allowTip = allowTip && ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled