Added netherite items in concept, trust and admin commands are conceptual as well.

This commit is contained in:
thetrouper
2025-03-25 21:54:12 -05:00
parent 4fd9c0144a
commit 7f15410220
9 changed files with 375 additions and 26 deletions

View File

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

View File

@@ -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();

View File

@@ -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 <tier> <player>");
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 <upgrader|netherite|mace> ...");
return;
}
String type = args.get(1).toString().toLowerCase();
switch (type) {
case "upgrader" -> {
if (args.getSize() < 3) {
Text.sendError(sender, "Usage: /armorsmp give upgrader <player>");
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 <piece> <player>");
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 <player>");
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 <end|nether|mace>");
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 <piece> <player>");
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")));
}
}

View File

@@ -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 <player>");
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 <player>");
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<String> trustees = ArmorSMP.getInstance().getManager().trust.getTrustees((Player) sender);
Set<String> 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")
);
}
}

View File

@@ -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)

View File

@@ -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();

View File

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

View File

@@ -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<String> 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<String> trustees = getTrustees(truster);
boolean removed = trustees.remove(trustee.toString());
storage.userData.playerTrust.put(truster.getUniqueId().toString(),trustees);
storage.save();
return removed;
}
public Set<String> getTrustees(Player target) {
return storage.userData.playerTrust.getOrDefault(target.getUniqueId(),new HashSet<>());
}
}

View File

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