diff --git a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java index 47345d4..588e3f3 100644 --- a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java +++ b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java @@ -1,31 +1,164 @@ package me.trouper.armorsmp.data; -public enum ArmorTier { - NONE(0), - LEATHER(1), - CHAINMAIL(2), - GOLD(3), - IRON(4), - DIAMOND(5); +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import me.trouper.armorsmp.ArmorSMP; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; - private int numeric; - - ArmorTier(int numeric) { +public enum ArmorTier { + NONE(0, + new ItemStack(Material.AIR), + new ItemStack(Material.AIR), + new ItemStack(Material.AIR), + new ItemStack(Material.AIR) + ), + LEATHER(1, + ItemBuilder.create() + .material(Material.LEATHER_HELMET) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.LEATHER_CHESTPLATE) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.LEATHER_LEGGINGS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.LEATHER_BOOTS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build() + ), + CHAINMAIL(2, + ItemBuilder.create() + .material(Material.CHAINMAIL_HELMET) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.CHAINMAIL_CHESTPLATE) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.CHAINMAIL_LEGGINGS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.CHAINMAIL_BOOTS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build() + ), + GOLD(3, + ItemBuilder.create() + .material(Material.GOLDEN_HELMET) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.GOLDEN_CHESTPLATE) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.GOLDEN_LEGGINGS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.GOLDEN_BOOTS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build() + ), + IRON(4, + ItemBuilder.create() + .material(Material.IRON_HELMET) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.IRON_CHESTPLATE) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.IRON_LEGGINGS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.IRON_BOOTS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build() + ), + DIAMOND(5, + ItemBuilder.create() + .material(Material.DIAMOND_HELMET) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.DIAMOND_CHESTPLATE) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.DIAMOND_LEGGINGS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build(), + ItemBuilder.create() + .material(Material.DIAMOND_BOOTS) + .enchant(Enchantment.BINDING_CURSE, 1) + .build() + ); + + private final ItemStack helmet; + private final ItemStack chestplate; + private final ItemStack leggings; + private final ItemStack boots; + private final int numeric; + + ArmorTier(int numeric, ItemStack helmet, ItemStack chestplate, ItemStack leggings, ItemStack boots) { this.numeric = numeric; - } - - public int getNumeric() { - return numeric; + this.helmet = helmet; + this.chestplate = chestplate; + this.leggings = leggings; + this.boots = boots; } 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; - } + if (value.getNumeric() < 1) return NONE; + if (value.getNumeric() > 5) return DIAMOND; } return NONE; } + + public static ArmorTier inferTier(Player p) { + for (ArmorTier value : values()) { + if (p.getInventory().getHelmet() == null || p.getInventory().getHelmet().isEmpty()) return NONE; + if (p.getInventory().getChestplate() == null || p.getInventory().getHelmet().isEmpty()) return NONE; + if (p.getInventory().getLeggings() == null || p.getInventory().getHelmet().isEmpty()) return NONE; + if (p.getInventory().getBoots() == null || p.getInventory().getHelmet().isEmpty()) return NONE; + if (value.getHelmet().getType().equals(p.getInventory().getHelmet().getType())) return value; + if (value.getChestplate().getType().equals(p.getInventory().getChestplate().getType())) return value; + if (value.getLeggings().getType().equals(p.getInventory().getLeggings().getType())) return value; + if (value.getBoots().getType().equals(p.getInventory().getBoots().getType())) return value; + } + return ArmorSMP.getInstance().getManager().armor.getTier(p); + } + + public int getNumeric() { + return numeric; + } + + public ItemStack getHelmet() { + return helmet; + } + + public ItemStack getChestplate() { + return chestplate; + } + + public ItemStack getLeggings() { + return leggings; + } + + public ItemStack getBoots() { + return boots; + } } diff --git a/src/main/java/me/trouper/armorsmp/data/Storage.java b/src/main/java/me/trouper/armorsmp/data/Storage.java index 9f986fc..967d5fc 100644 --- a/src/main/java/me/trouper/armorsmp/data/Storage.java +++ b/src/main/java/me/trouper/armorsmp/data/Storage.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; public class Storage implements JsonSerializable { @@ -17,10 +18,16 @@ public class Storage implements JsonSerializable { } public UserData userData = new UserData(); + public Uniques uniques = new Uniques(); + public Map updateCache = new ConcurrentHashMap<>(); + + public class Uniques { + public Map owners = new HashMap<>(); + } public class UserData { public Set tipsDisabled = new HashSet<>(); - public Map playerTiers = new HashMap<>(); + public Map playerTiers = new HashMap<>(); public Map> playerTrust = new HashMap<>(); } } diff --git a/src/main/java/me/trouper/armorsmp/data/NetheritePiece.java b/src/main/java/me/trouper/armorsmp/data/Unique.java similarity index 56% rename from src/main/java/me/trouper/armorsmp/data/NetheritePiece.java rename to src/main/java/me/trouper/armorsmp/data/Unique.java index dc121fc..d122c68 100644 --- a/src/main/java/me/trouper/armorsmp/data/NetheritePiece.java +++ b/src/main/java/me/trouper/armorsmp/data/Unique.java @@ -6,7 +6,7 @@ import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; -public enum NetheritePiece { +public enum Unique { HELMET(ItemBuilder.create() .material(Material.NETHERITE_HELMET) .lore(Text.legacyColor("&bAbilities:")) @@ -18,6 +18,7 @@ public enum NetheritePiece { .enchant(Enchantment.MENDING,1) .enchant(Enchantment.RESPIRATION,3) .enchant(Enchantment.AQUA_AFFINITY,1) + .customModelData(2) .build() ), CHESTPLATE(ItemBuilder.create() @@ -30,6 +31,7 @@ public enum NetheritePiece { .enchant(Enchantment.PROTECTION,4) .enchant(Enchantment.UNBREAKING,3) .enchant(Enchantment.MENDING,1) + .customModelData(3) .build() ), LEGGINGS(ItemBuilder.create() @@ -42,6 +44,7 @@ public enum NetheritePiece { .enchant(Enchantment.UNBREAKING,3) .enchant(Enchantment.MENDING,1) .enchant(Enchantment.SWIFT_SNEAK,3) + .customModelData(4) .build() ), BOOTS(ItemBuilder.create() @@ -56,12 +59,64 @@ public enum NetheritePiece { .enchant(Enchantment.SOUL_SPEED,3) .enchant(Enchantment.FEATHER_FALLING,4) .enchant(Enchantment.DEPTH_STRIDER,3) + .customModelData(5) + .build() + ), + MACE(ItemBuilder.create() + .material(Material.MACE) + .lore(Text.legacyColor("&bAbilities:")) + .lore(Text.legacyColor("&3| &7Speed 1")) + .enchant(Enchantment.UNBREAKING,1) + .enchant(Enchantment.WIND_BURST,2) + .enchant(Enchantment.DENSITY,3) + .enchant(Enchantment.MENDING,1) + .customModelData(6) + .build() + ), + SWORD(ItemBuilder.create() + .material(Material.NETHERITE_SWORD) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.SHARPNESS,5) + .customModelData(7) + .build() + ), + AXE(ItemBuilder.create() + .material(Material.NETHERITE_AXE) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.SHARPNESS,5) + .enchant(Enchantment.EFFICIENCY,5) + .customModelData(8) + .build() + ), + PICKAXE(ItemBuilder.create() + .material(Material.NETHERITE_PICKAXE) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.EFFICIENCY,5) + .customModelData(9) + .build() + ), + SHOVEL(ItemBuilder.create() + .material(Material.NETHERITE_SHOVEL) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.EFFICIENCY,5) + .customModelData(10) + .build() + ), + HOE(ItemBuilder.create() + .material(Material.NETHERITE_HOE) + .enchant(Enchantment.UNBREAKING,3) + .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.EFFICIENCY,5) + .customModelData(11) .build() ); - private ItemStack inGame; - NetheritePiece(ItemStack inGame) { + Unique(ItemStack inGame) { this.inGame = inGame; } 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 e8440be..c5bcbc1 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -7,7 +7,7 @@ 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.data.Unique; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; import org.bukkit.Bukkit; @@ -17,7 +17,6 @@ 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 { @@ -57,7 +56,7 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Usage: /armorsmp give ..."); return; } - String type = args.get(1).toString().toLowerCase(); + final String type = args.get(1).toString().toLowerCase(); switch (type) { case "upgrader" -> { @@ -80,7 +79,7 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Usage: /armorsmp give netherite "); return; } - NetheritePiece piece = args.get(2).toEnum(NetheritePiece.class); + final Unique piece = args.get(2).toEnum(Unique.class); if (piece == null) { Text.sendMessage(false, Text.Pallet.ERROR,sender,"Error: {0} is not a valid Netherite piece.",args.get(2).toString()); return; @@ -120,7 +119,7 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Usage: /armorsmp toggle "); return; } - String feature = args.get(1).toString().toLowerCase(); + final String feature = args.get(1).toString().toLowerCase(); // TODO: toggles Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled the {0}",feature); } @@ -133,7 +132,7 @@ public class AdminCommand implements CustomCommand { Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); } case "remove" -> { - String type = args.get(1).toString().toLowerCase(); + final String type = args.get(1).toString().toLowerCase(); switch (type) { case "netherite" -> { @@ -141,7 +140,7 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Usage: /armorsmp remove "); return; } - NetheritePiece piece = args.get(2).toEnum(NetheritePiece.class); + final Unique piece = args.get(2).toEnum(Unique.class); Player target = Bukkit.getPlayer(args.get(3).toString()); if (target == null) { @@ -169,7 +168,7 @@ public class AdminCommand implements CustomCommand { .then(b.arg("upgrader") .then(b.argOnlinePlayers())) .then(b.arg("netherite") - .then(b.argEnum(NetheritePiece.class) + .then(b.argEnum(Unique.class) .then(b.argOnlinePlayers()))) .then(b.arg("mace") .then(b.argOnlinePlayers())) @@ -179,7 +178,7 @@ public class AdminCommand implements CustomCommand { ).then( b.arg("remove") .then(b.arg("netherite") - .then(b.argEnum(NetheritePiece.class) + .then(b.argEnum(Unique.class) .then(b.argOnlinePlayers()))) ).then(b.arg("toggle") .then(b.arg("end","nether","mace"))); 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 4cfc82a..bb7e3ab 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java @@ -2,8 +2,10 @@ package me.trouper.armorsmp.server.events; import io.github.itzispyder.pdk.events.CustomListener; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Verbose; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.CraftItemEvent; @@ -13,12 +15,27 @@ public class CraftEvent implements CustomListener { @EventHandler public void onCraft(CraftItemEvent e) { - final ItemStack result = e.getRecipe().getResult(); + ItemStack result = e.getRecipe().getResult(); final String name = result.getType().name(); - final Player p = (Player) e.getWhoClicked(); + Player p = (Player) e.getWhoClicked(); Verbose.send("Handling craft for %s, result: %s", p.getName(), result.getType().name()); + if (result.getType().equals(Material.MACE)) { + if (!ArmorSMP.getInstance().getManager().io.config.maceCraftingEnabled) { + e.setCancelled(true); + return; + } + + + + result.addEnchantments(Unique.MACE.getInGameItem().getEnchantments()); + result.lore(Unique.MACE.getInGameItem().lore()); + result.setItemMeta(Unique.MACE.getInGameItem().getItemMeta()); + + return; + } + if (!name.contains("HELMET") && !name.contains("CHESTPLATE") && !name.contains("LEGGINGS") @@ -28,7 +45,6 @@ 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()); diff --git a/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java b/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java new file mode 100644 index 0000000..8fa4751 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java @@ -0,0 +1,21 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.server.crafting.ArmorUpgrade; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; + +public class DeathEvent implements CustomListener { + @EventHandler + public void onDeath(PlayerDeathEvent e) { + Player p = e.getEntity(); + final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); + if (tier.equals(ArmorTier.NONE)) return; + if (ArmorSMP.getInstance().getManager().armor.downTier(p)) { + e.getDrops().add(ArmorUpgrade.ARMOR_UGPRADE); + } + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java new file mode 100644 index 0000000..83d99b3 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java @@ -0,0 +1,16 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.armorsmp.ArmorSMP; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinEvent implements CustomListener { + public void onJoin(PlayerJoinEvent e) { + Player p = e.getPlayer(); + if (ArmorSMP.getInstance().getManager().io.storage.updateCache.containsKey(e.getPlayer().getUniqueId().toString())) { + ArmorSMP.getInstance().getManager().armor.updateArmor(p,ArmorSMP.getInstance().getManager().io.storage.updateCache.get(p.getUniqueId().toString())); + ArmorSMP.getInstance().getManager().io.storage.updateCache.remove(p.getUniqueId().toString()); + } + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java new file mode 100644 index 0000000..67b00b9 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java @@ -0,0 +1,27 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.server.crafting.ArmorUpgrade; +import me.trouper.armorsmp.utils.Text; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class UpgradeRedeemEvent implements CustomListener { + + public void onClick(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack holding = e.getItem(); + final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); + + if (holding == null || holding.isEmpty()) return; + if (!holding.equals(ArmorUpgrade.ARMOR_UGPRADE)) return; + + if (ArmorSMP.getInstance().getManager().armor.upTier(p)) { + holding.setAmount(holding.getAmount() - 1); + Text.sendMessage(true, Text.Pallet.INFO,p,"Successfully redeemed armor upgrade! Tier {0} -> Tier {1}",tier,ArmorSMP.getInstance().getManager().armor.getTier(p)); + } + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java index b47e928..fbd1e9f 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java @@ -3,8 +3,15 @@ package me.trouper.armorsmp.server.systems; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.Storage; +import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.utils.Verbose; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import java.util.concurrent.atomic.AtomicReference; public class ArmorBackend { @@ -13,39 +20,108 @@ public class ArmorBackend { public ArmorBackend() { storage = ArmorSMP.getInstance().getManager().io.storage; } + + public boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) { + final ArmorTier current = getTier(target); + return request.getNumeric() >= current.getNumeric(); + } 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(OfflinePlayer target, int tier) { - Verbose.send("Setting tier of %s to %s",target.getName(),tier); - setTier(target,ArmorTier.getTier(tier)); + setTier(target, tier, shouldTransferEnchants(target, tier)); } - public void downTier(OfflinePlayer target) { - int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); - setTier(target,ArmorTier.getTier(numeric - 1)); + public void setTier(OfflinePlayer target, ArmorTier tier, boolean transferEnchants) { + Verbose.send("Setting tier of %s to %s",target.getName(),tier); + storage.userData.playerTiers.put(target.getUniqueId().toString(),tier); + if (target.getPlayer() != null && target.isOnline()) updateArmor(target.getPlayer(), transferEnchants); + else storage.updateCache.put(target.getUniqueId().toString(),transferEnchants); + storage.save(); + } + + public boolean downTier(OfflinePlayer target) { + final int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + if (numeric < 0) return false; + + setTier(target,ArmorTier.getTier(numeric - 1),true); + return false; } - public void upTier(OfflinePlayer target) { - int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()); - setTier(target,ArmorTier.getTier(numeric + 1)); + public boolean upTier(OfflinePlayer target) { + final int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + if (numeric > 4) return false; + + setTier(target,ArmorTier.getTier(numeric + 1),false); + return true; } 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; - 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; + return storage.userData.playerTiers.getOrDefault(target.getUniqueId().toString(),ArmorTier.NONE); } + + public boolean verifyArmor(Player p) { + PlayerInventory e = p.getInventory(); + final ArmorTier tier = getTier(p); + + final Material correctHelmet = tier.getHelmet().getType(); + final Material correctChestplate = tier.getChestplate().getType(); + final Material correctLeggings = tier.getLeggings().getType(); + final Material correctBoots = tier.getBoots().getType(); + + final Material helmet = e.getHelmet() == null ? Material.AIR : e.getHelmet().getType() == Material.NETHERITE_HELMET ? correctHelmet : e.getHelmet().getType(); + final Material chestplate = e.getChestplate() == null ? Material.AIR : e.getChestplate().getType() == Material.NETHERITE_CHESTPLATE ? correctChestplate : e.getChestplate().getType(); + final Material leggings = e.getLeggings() == null ? Material.AIR : e.getLeggings().getType() == Material.NETHERITE_LEGGINGS ? correctLeggings : e.getLeggings().getType(); + final Material boots = e.getBoots() == null ? Material.AIR : e.getBoots().getType() == Material.NETHERITE_BOOTS ? correctBoots : e.getBoots().getType(); + + return helmet.equals(correctHelmet) && chestplate.equals(correctChestplate) && leggings.equals(correctLeggings) && boots.equals(correctBoots); + } + + public void updateArmor(Player p, boolean transferEnchants) { + PlayerInventory e = p.getInventory(); + final ArmorTier tier = getTier(p); + + final ItemStack helmet = e.getHelmet(); + final ItemStack chestplate = e.getChestplate(); + final ItemStack leggings = e.getLeggings(); + final ItemStack boots = e.getBoots(); + + if (tier.equals(ArmorTier.NONE)) { + e.setHelmet(new ItemStack(Material.AIR)); + e.setChestplate(new ItemStack(Material.AIR)); + e.setLeggings(new ItemStack(Material.AIR)); + e.setBoots(new ItemStack(Material.AIR)); + return; + } + + AtomicReference updatedHelmet = new AtomicReference<>(tier.getHelmet()); + AtomicReference updatedChestplate = new AtomicReference<>(tier.getChestplate()); + AtomicReference updatedLeggings = new AtomicReference<>(tier.getLeggings()); + AtomicReference updatedBoots = new AtomicReference<>(tier.getBoots()); + + + if (transferEnchants) { + if (helmet != null) updatedHelmet.get().addEnchantments(helmet.getEnchantments()); + if (chestplate != null) updatedChestplate.get().addEnchantments(chestplate.getEnchantments()); + if (leggings != null) updatedLeggings.get().addEnchantments(leggings.getEnchantments()); + if (boots != null) updatedBoots.get().addEnchantments(boots.getEnchantments()); + } + + if (storage.uniques.owners.containsValue(p.getUniqueId().toString())) { + storage.uniques.owners.forEach((unique,owner)->{ + if (owner.equals(p.getUniqueId().toString())) { + if (unique.equals(Unique.HELMET)) updatedHelmet.set(unique.getInGameItem()); + if (unique.equals(Unique.CHESTPLATE)) updatedChestplate.set(unique.getInGameItem()); + if (unique.equals(Unique.LEGGINGS)) updatedLeggings.set(unique.getInGameItem()); + if (unique.equals(Unique.BOOTS)) updatedBoots.set(unique.getInGameItem()); + } + }); + } + + e.setHelmet(updatedHelmet.get()); + e.setChestplate(updatedChestplate.get()); + e.setLeggings(updatedLeggings.get()); + e.setBoots(updatedBoots.get()); + } + + } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java index 87c4dce..d825b70 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -17,7 +17,7 @@ public class TrustBackend { public boolean addTrust(Player truster, UUID trustee) { Set trustees = getTrustees(truster); - boolean added = trustees.add(trustee.toString()); + final boolean added = trustees.add(trustee.toString()); storage.userData.playerTrust.put(truster.getUniqueId().toString(),trustees); storage.save(); return added; @@ -25,7 +25,7 @@ public class TrustBackend { public boolean removeTrust(Player truster, UUID trustee) { Set trustees = getTrustees(truster); - boolean removed = trustees.remove(trustee.toString()); + final boolean removed = trustees.remove(trustee.toString()); storage.userData.playerTrust.put(truster.getUniqueId().toString(),trustees); storage.save(); return removed; diff --git a/src/main/java/me/trouper/armorsmp/utils/Text.java b/src/main/java/me/trouper/armorsmp/utils/Text.java index 701942b..0635221 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Text.java +++ b/src/main/java/me/trouper/armorsmp/utils/Text.java @@ -2,7 +2,6 @@ package me.trouper.armorsmp.utils; import io.github.itzispyder.pdk.utils.misc.Randomizer; import me.trouper.armorsmp.ArmorSMP; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; @@ -11,7 +10,10 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/me/trouper/armorsmp/utils/Verbose.java b/src/main/java/me/trouper/armorsmp/utils/Verbose.java index 0a6caad..defda33 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Verbose.java +++ b/src/main/java/me/trouper/armorsmp/utils/Verbose.java @@ -4,8 +4,6 @@ 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) {