From 5ffb921150dd7935c4fd8018a815eb224709d09a Mon Sep 17 00:00:00 2001 From: unurled Date: Fri, 1 Mar 2024 19:54:16 +0100 Subject: [PATCH] fix attribute command --- .../sr/commands/admin/AttributeCommand.java | 43 +++++-------- .../sr/components/item/ItemManager.java | 12 ++++ .../sr/components/player/PlayerManager.java | 32 ++++++++++ .../sr/components/player/SRPlayer.java | 62 +++++++++++++++++-- .../unurled/sacredrealms/sr/utils/Items.java | 52 +++++++++++++--- .../sacredrealms/sr/utils/NumberParser.java | 33 ---------- .../sacredrealms/sr/utils/SRPlayerUtils.java | 18 +++++- 7 files changed, 174 insertions(+), 78 deletions(-) delete mode 100644 src/main/java/me/unurled/sacredrealms/sr/utils/NumberParser.java diff --git a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java index 08c960c..2e36bed 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java +++ b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java @@ -1,8 +1,7 @@ package me.unurled.sacredrealms.sr.commands.admin; import static me.unurled.sacredrealms.sr.utils.Component.comp; -import static me.unurled.sacredrealms.sr.utils.NumberParser.format; -import static me.unurled.sacredrealms.sr.utils.NumberParser.parse; +import static me.unurled.sacredrealms.sr.utils.SRPlayerUtils.syncSRToPlayer; import java.util.Arrays; import java.util.List; @@ -81,7 +80,7 @@ public class AttributeCommand implements TabExecutor { if (args[0].equalsIgnoreCase("set")) { try { - double value = parse(args[3]); + double value = Double.parseDouble(args[3]); if (value < attribute.getMinValue() || value > attribute.getMaxValue()) { sender.sendMessage( "Value out of bounds. Min: " @@ -94,7 +93,10 @@ public class AttributeCommand implements TabExecutor { if (player == null) return true; player.setHandItemAttribute(attribute, value); sender.sendMessage( - "Set " + attribute.getName() + " to " + format(value) + " for " + target.getName()); + "Set " + attribute.getName() + " to " + value + " for " + target.getName()); + // update player + player.setItemAttributes(attribute, target.getInventory().getItemInMainHand(), value); + syncSRToPlayer(player, target); } catch (NumberFormatException e) { sender.sendMessage("Invalid value."); } @@ -113,6 +115,8 @@ public class AttributeCommand implements TabExecutor { SRPlayer player = getSrPlayer(sender, target); if (player == null) return true; player.removeHandItemAttribute(attribute); + player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand()); + sender.sendMessage("Removed " + attribute.getName() + " for " + target.getName()); } else { sender.sendMessage("Usage: /attribute [value]"); @@ -135,7 +139,7 @@ public class AttributeCommand implements TabExecutor { if (args[0].equalsIgnoreCase("set")) { try { - double value = parse(args[3]); + double value = Double.parseDouble(args[3]); if (value < attribute.getMinValue() || value > attribute.getMaxValue()) { sender.sendMessage( "Value out of bounds. Min: " @@ -148,7 +152,9 @@ public class AttributeCommand implements TabExecutor { if (player == null) return true; player.setAttribute(attribute, value); sender.sendMessage( - "Set " + attribute.getName() + " to " + format(value) + " for " + target.getName()); + "Set " + attribute.getName() + " to " + value + " for " + target.getName()); + player.setItemAttributes(attribute, target.getInventory().getItemInMainHand(), value); + syncSRToPlayer(player, target); } catch (NumberFormatException e) { sender.sendMessage("Invalid value."); } @@ -166,6 +172,8 @@ public class AttributeCommand implements TabExecutor { SRPlayer player = getSrPlayer(sender, target); if (player == null) return true; player.removeAttribute(attribute); + player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand()); + syncSRToPlayer(player, target); sender.sendMessage("Removed " + attribute.getName() + " for " + target.getName()); } else { sender.sendMessage("Usage: /attribute [value]"); @@ -211,29 +219,6 @@ public class AttributeCommand implements TabExecutor { attributes.removeIf(s -> !s.startsWith(args[2])); return attributes; } - if (args.length == 4 && args[0].equalsIgnoreCase("set")) { - Attribute attribute; - try { - attribute = Attribute.valueOf(args[2].toUpperCase()); - } catch (IllegalArgumentException e) { - return null; - } - try { - if (parse(args[3]) > attribute.getMaxValue() || parse(args[3]) < attribute.getMinValue()) { - return null; - } - } catch (NumberFormatException e) { - return null; - } - - List values = new java.util.ArrayList<>(); - double currentValue = attribute.getMinValue(); - while (currentValue <= attribute.getMaxValue()) { - values.add(String.valueOf(format(currentValue))); - currentValue *= 10; - } - return values; - } return null; } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/item/ItemManager.java b/src/main/java/me/unurled/sacredrealms/sr/components/item/ItemManager.java index 09c47e4..da5c046 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/item/ItemManager.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/item/ItemManager.java @@ -3,6 +3,8 @@ package me.unurled.sacredrealms.sr.components.item; import java.util.HashMap; import me.unurled.sacredrealms.sr.managers.Manager; import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; @SuppressWarnings("EmptyMethod") public class ItemManager extends Manager { @@ -33,6 +35,16 @@ public class ItemManager extends Manager { return items.get(id); } + public Item getItem(ItemStack item) { + if (item == null) return null; + if (item.getItemMeta() == null) return null; + if (item.getItemMeta().getPersistentDataContainer().has(ID, PersistentDataType.STRING)) { + return getItem( + item.getItemMeta().getPersistentDataContainer().get(ID, PersistentDataType.STRING)); + } + return null; + } + public void removeItem(String id) { items.remove(id); } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java index cf9cc4e..42e7ca4 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java @@ -2,6 +2,7 @@ package me.unurled.sacredrealms.sr.components.player; import static me.unurled.sacredrealms.sr.utils.Logger.error; +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.HashMap; @@ -13,10 +14,13 @@ import me.unurled.sacredrealms.sr.data.gson.InventorySerializer; import me.unurled.sacredrealms.sr.data.gson.PotionEffectDeserializer; import me.unurled.sacredrealms.sr.data.gson.PotionEffectSerializer; import me.unurled.sacredrealms.sr.managers.Manager; +import me.unurled.sacredrealms.sr.utils.Items; import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -87,6 +91,9 @@ public class PlayerManager extends Manager { .create(); String json = dh.get(PLAYER_KEY + e.getPlayer().getUniqueId()); SRPlayer srPlayer = gson.fromJson(json, SRPlayer.class); + if (srPlayer == null) { + srPlayer = new SRPlayer(e.getPlayer()); + } addPlayer(srPlayer); @@ -119,4 +126,29 @@ public class PlayerManager extends Manager { removePlayer(e.getPlayer().getUniqueId()); } + + @EventHandler + public void onPlayerInventorySlotChangeEvent(@NotNull PlayerItemHeldEvent e) { + SRPlayer player = getPlayer(e.getPlayer().getUniqueId()); + if (player == null) { + return; + } + player.setInventory(e.getPlayer().getInventory()); + + ItemStack oldItem = e.getPlayer().getInventory().getItem(e.getPreviousSlot()); + ItemStack newItem = e.getPlayer().getInventory().getItem(e.getNewSlot()); + + Items.updatePlayer(e.getPlayer(), oldItem, newItem); + } + + @EventHandler + public void onPlayerArmorChange(PlayerArmorChangeEvent e) { + SRPlayer player = getPlayer(e.getPlayer().getUniqueId()); + if (player == null) { + return; + } + player.setInventory(e.getPlayer().getInventory()); + + Items.updatePlayer(e.getPlayer(), e.getOldItem(), e.getNewItem()); + } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java index baa78b7..d8774cf 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java @@ -1,12 +1,15 @@ package me.unurled.sacredrealms.sr.components.player; +import static me.unurled.sacredrealms.sr.utils.Items.lore; import static me.unurled.sacredrealms.sr.utils.Logger.warn; import com.google.gson.annotations.Expose; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.UUID; import me.unurled.sacredrealms.sr.components.attributes.Attribute; +import me.unurled.sacredrealms.sr.components.item.Item; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -19,15 +22,16 @@ import org.jetbrains.annotations.Nullable; public class SRPlayer { - @Expose private final UUID uuid; - @Expose private final HashMap attributes; - @Expose private final List potionEffects; + @Expose private UUID uuid = null; + @Expose private HashMap attributes = new HashMap<>(); + private HashMap> itemAttributes = new HashMap<>(); + @Expose private List potionEffects; @Expose private Inventory inventory; public SRPlayer(@NotNull Player player) { this.uuid = player.getUniqueId(); this.inventory = player.getInventory(); - this.attributes = new HashMap<>(); + this.itemAttributes = new HashMap<>(); this.potionEffects = (List) player.getActivePotionEffects(); } @@ -95,7 +99,9 @@ public class SRPlayer { ItemStack i = p.getInventory().getItemInMainHand(); ItemMeta im = i.getItemMeta(); im.getPersistentDataContainer().set(attribute.getKey(), PersistentDataType.DOUBLE, value); - im.lore(); + i.setItemMeta(im); + lore(i); + p.getInventory().setItemInMainHand(i); } private boolean checkIfValueIsOutOfBoundsForAttribute( @@ -150,6 +156,7 @@ public class SRPlayer { @NotNull public List getPotionEffects() { + if (potionEffects == null) potionEffects = new ArrayList<>(); return potionEffects; } @@ -157,4 +164,49 @@ public class SRPlayer { potionEffects.clear(); potionEffects.addAll(effects); } + + public void setItemAttributes( + @NotNull Attribute attribute, @NotNull ItemStack item, @NotNull Double value) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + if (itemAttributes.containsKey(attribute)) { + itemAttributes.get(attribute).put(item, value); + } else { + HashMap map = new HashMap<>(); + map.put(item, value); + itemAttributes.put(attribute, map); + } + } + + public void removeItemAttributes(@NotNull Attribute attribute, @NotNull ItemStack item) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + if (itemAttributes.containsKey(attribute)) { + itemAttributes.get(attribute).remove(item); + } + } + + public @Nullable Double getItemAttributes(@NotNull Attribute attribute, @NotNull ItemStack item) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + if (itemAttributes.containsKey(attribute)) { + return itemAttributes.get(attribute).get(item); + } + return null; + } + + public @NotNull HashMap getItemAttributes(@NotNull Attribute attribute) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + return itemAttributes.getOrDefault(attribute, new HashMap<>()); + } + + public @NotNull HashMap getItemAttributes(Item item) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + HashMap map = new HashMap<>(); + itemAttributes.forEach((k, v) -> map.put(k, v.get(item))); + return map; + } + + public @NotNull Double getTotalItemAttribute(@NotNull Attribute attribute) { + if (itemAttributes == null) itemAttributes = new HashMap<>(); + return itemAttributes.getOrDefault(attribute, new HashMap<>()).values().stream() + .reduce(0.0, Double::sum); + } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/utils/Items.java b/src/main/java/me/unurled/sacredrealms/sr/utils/Items.java index 90d6426..4fe4693 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/utils/Items.java +++ b/src/main/java/me/unurled/sacredrealms/sr/utils/Items.java @@ -1,6 +1,7 @@ package me.unurled.sacredrealms.sr.utils; import static me.unurled.sacredrealms.sr.utils.Component.comp; +import static me.unurled.sacredrealms.sr.utils.SRPlayerUtils.syncSRToPlayer; import java.util.ArrayList; import java.util.Arrays; @@ -9,6 +10,8 @@ import java.util.concurrent.atomic.AtomicReference; import me.unurled.sacredrealms.sr.components.attributes.Attribute; import me.unurled.sacredrealms.sr.components.item.Item; import me.unurled.sacredrealms.sr.components.item.ItemManager; +import me.unurled.sacredrealms.sr.components.player.PlayerManager; +import me.unurled.sacredrealms.sr.components.player.SRPlayer; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; @@ -19,7 +22,7 @@ import org.jetbrains.annotations.NotNull; @SuppressWarnings("UnusedReturnValue") public class Items { - public static @NotNull Double getTotalAttribute(Player player, Attribute attribute) { + public static @NotNull Double getTotalAttribute(@NotNull Player player, Attribute attribute) { return getTotalAttribute(player.getEquipment(), attribute); } @@ -51,18 +54,17 @@ public class Items { return i.getAttribute(attribute); } } + if (p.has(attribute.getKey(), PersistentDataType.DOUBLE)) { + try { + return p.get(attribute.getKey(), PersistentDataType.DOUBLE); + } catch (Exception e) { + return 0.0; + } + } return 0.0; } /** - * rarity Description: blablabla blabbla - * blabla Attributes: ➤ Health: +100 ➤ Strength: +10 - * ➤ Mana: +10 Abilities: ➤ Ability 1, On Rightclick unleash - * a powerful attack cooldown: 10s, damage: 100, mana cost: - * 50 ➤ Ability 2, On Rightclick unleash a powerful attack - * cooldown: 10s, damage: 100, mana cost: 50 - * Enchantments: ➤ Enchantment 1 ➤ Enchantment 2 * * @param stack the itemstack * @return the itemstack with lore @@ -118,4 +120,36 @@ public class Items { return stack; } + + public static void updatePlayer(@NotNull Player player, ItemStack oldItem, ItemStack newItem) { + PlayerManager pm = (PlayerManager) PlayerManager.getInstance(PlayerManager.class); + if (pm == null) { + return; + } + SRPlayer p = pm.getPlayer(player.getUniqueId()); + if (p == null) { + return; + } + + ItemManager im = (ItemManager) ItemManager.getInstance(ItemManager.class); + if (im == null) { + return; + } + + // remove status of old Item + if (oldItem != null && !oldItem.getType().equals(Material.AIR)) { + for (Attribute a : Attribute.values()) { + p.removeItemAttributes(a, oldItem); + } + } + + // add status of new Item + if (newItem != null && !newItem.getType().equals(Material.AIR)) { + for (Attribute a : Attribute.values()) { + p.setItemAttributes(a, newItem, getAttribute(newItem, a)); + } + } + + syncSRToPlayer(p, player); + } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/utils/NumberParser.java b/src/main/java/me/unurled/sacredrealms/sr/utils/NumberParser.java deleted file mode 100644 index a5196b8..0000000 --- a/src/main/java/me/unurled/sacredrealms/sr/utils/NumberParser.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.unurled.sacredrealms.sr.utils; - -public class NumberParser { - public static double parse(String input) { - input = input.toLowerCase().trim(); - double multiplier = 1.0; - - if (input.endsWith("k")) { - multiplier = 1e3; - input = input.substring(0, input.length() - 1); - } else if (input.endsWith("m")) { - multiplier = 1e6; - input = input.substring(0, input.length() - 1); - } else if (input.endsWith("b")) { - multiplier = 1e9; - input = input.substring(0, input.length() - 1); - } - - return Double.parseDouble(input) * multiplier; - } - - public static String format(double number) { - if (number >= 1e9) { - return String.format("%.2fb", number / 1e9); - } else if (number >= 1e6) { - return String.format("%.2fm", number / 1e6); - } else if (number >= 1e3) { - return String.format("%.2fk", number / 1e3); - } else { - return String.format("%.2f", number); - } - } -} diff --git a/src/main/java/me/unurled/sacredrealms/sr/utils/SRPlayerUtils.java b/src/main/java/me/unurled/sacredrealms/sr/utils/SRPlayerUtils.java index fb28742..1380e52 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/utils/SRPlayerUtils.java +++ b/src/main/java/me/unurled/sacredrealms/sr/utils/SRPlayerUtils.java @@ -3,6 +3,7 @@ package me.unurled.sacredrealms.sr.utils; import java.util.List; import me.unurled.sacredrealms.sr.components.attributes.Attribute; import me.unurled.sacredrealms.sr.components.player.SRPlayer; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; @@ -17,7 +18,17 @@ public class SRPlayerUtils { // agility (speed) // default is 100 so 0.2 - float value = (float) (sr.getAttribute(Attribute.AGILITY) / 500.0); + double items = sr.getTotalItemAttribute(Attribute.AGILITY); + double speed = sr.getAttribute(Attribute.AGILITY); + float value = (float) ((speed + items) / 500.0f); + value = Math.min(value, 1.0f); + value = Math.max(value, 0f); + AttributeInstance attribute1 = + p.getAttribute(org.bukkit.attribute.Attribute.GENERIC_MOVEMENT_SPEED); + if (attribute1 != null) attribute1.setBaseValue(value); + AttributeInstance attribute2 = + p.getAttribute(org.bukkit.attribute.Attribute.GENERIC_FLYING_SPEED); + if (attribute2 != null) attribute2.setBaseValue(value); p.setFlySpeed(value); p.setWalkSpeed(value); @@ -27,7 +38,10 @@ public class SRPlayerUtils { // health // default is 100 so 20 - p.setHealth(sr.getAttribute(Attribute.HEALTH) / 5); + double health = + (sr.getAttribute(Attribute.HEALTH) + sr.getTotalItemAttribute(Attribute.HEALTH)) / 5; + AttributeInstance attribute = p.getAttribute(org.bukkit.attribute.Attribute.GENERIC_MAX_HEALTH); + if (attribute != null) attribute.setBaseValue(health); p.sendHealthUpdate(); p.updateInventory(); }