diff --git a/.gradle/8.8/checksums/checksums.lock b/.gradle/8.8/checksums/checksums.lock index 166c142..07ca503 100644 Binary files a/.gradle/8.8/checksums/checksums.lock and b/.gradle/8.8/checksums/checksums.lock differ diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin index 71e7a1e..ea62791 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.bin and b/.gradle/8.8/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.8/executionHistory/executionHistory.lock b/.gradle/8.8/executionHistory/executionHistory.lock index 6d10104..c821e11 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.lock and b/.gradle/8.8/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin index e399e01..fa77287 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.bin and b/.gradle/8.8/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock index 5966817..863398f 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.lock and b/.gradle/8.8/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index eaf164d..b061068 100644 Binary files a/.gradle/8.8/fileHashes/resourceHashesCache.bin and b/.gradle/8.8/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index e19ffa1..adecda2 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.idea/discord.xml b/.idea/discord.xml index 30bab2a..d8e9561 100644 --- a/.idea/discord.xml +++ b/.idea/discord.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/.idea/modules/ArmorSMP.main.iml b/.idea/modules/ArmorSMP.main.iml index 746f1fd..bbeeb3e 100644 --- a/.idea/modules/ArmorSMP.main.iml +++ b/.idea/modules/ArmorSMP.main.iml @@ -11,8 +11,4 @@ - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4721bc0..866683d 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ repositories { dependencies { compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") - implementation files("libs/PDK-1.4.0.jar") + implementation files("libs/PDK-1.5.0.jar") } def targetJavaVersion = 21 diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index cf54608..813a31b 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -22,4 +22,6 @@ commands: ability: description: Utilize unique abilities. aliases: - - a \ No newline at end of file + - a + tips: + description: Toggle tips in messages. \ No newline at end of file diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 47d25ae..b1be63c 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/libs/PDK-1.4.0.jar b/libs/PDK-1.4.0.jar deleted file mode 100644 index 0e4230c..0000000 Binary files a/libs/PDK-1.4.0.jar and /dev/null differ diff --git a/src/main/java/me/trouper/armorsmp/ArmorSMP.java b/src/main/java/me/trouper/armorsmp/ArmorSMP.java index b54cd90..4ff1cda 100644 --- a/src/main/java/me/trouper/armorsmp/ArmorSMP.java +++ b/src/main/java/me/trouper/armorsmp/ArmorSMP.java @@ -36,7 +36,7 @@ public final class ArmorSMP extends JavaPlugin { manager.io.saveAll(); getLogger().info("Saved all IO files."); } - + public static ArmorSMP getInstance() { return instance; } diff --git a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java index 551af68..e25281d 100644 --- a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java +++ b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java @@ -21,110 +21,90 @@ public enum ArmorTier { ItemBuilder.create() .material(Material.LEATHER_HELMET) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.LEATHER_CHESTPLATE) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.LEATHER_LEGGINGS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.LEATHER_BOOTS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build() ), CHAINMAIL(2, ItemBuilder.create() .material(Material.CHAINMAIL_HELMET) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.CHAINMAIL_CHESTPLATE) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.CHAINMAIL_LEGGINGS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.CHAINMAIL_BOOTS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build() ), GOLD(3, ItemBuilder.create() .material(Material.GOLDEN_HELMET) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.GOLDEN_CHESTPLATE) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.GOLDEN_LEGGINGS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.GOLDEN_BOOTS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build() ), IRON(4, ItemBuilder.create() .material(Material.IRON_HELMET) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.IRON_CHESTPLATE) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.IRON_LEGGINGS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.IRON_BOOTS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build() ), DIAMOND(5, ItemBuilder.create() .material(Material.DIAMOND_HELMET) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.DIAMOND_CHESTPLATE) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.DIAMOND_LEGGINGS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build(), ItemBuilder.create() .material(Material.DIAMOND_BOOTS) .enchant(Enchantment.BINDING_CURSE, 1) - .unbreakable(true) .build() ); diff --git a/src/main/java/me/trouper/armorsmp/data/Unique.java b/src/main/java/me/trouper/armorsmp/data/Unique.java index 9dabafa..0c6ac1f 100644 --- a/src/main/java/me/trouper/armorsmp/data/Unique.java +++ b/src/main/java/me/trouper/armorsmp/data/Unique.java @@ -4,6 +4,7 @@ import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.utils.Text; +import me.trouper.armorsmp.utils.Verbose; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; @@ -191,14 +192,23 @@ public enum Unique { public static boolean isUnique(ItemStack i) { for (Unique value : values()) { if (value.getInGameItem().isSimilar(i)) return true; + if (i.getType().equals(Material.DRAGON_EGG)) return true; } return false; } public static Unique matchUnique(ItemStack i) { + Verbose.send("Matching Unique, Item Type: %s",i.getType()); Unique match = null; for (Unique value : values()) { - if (value.getInGameItem().isSimilar(i)) match = value; + if (value.getInGameItem().isSimilar(i)) { + match = value; + Verbose.send("Matched with, Unique: %s",match); + } + } + if (i.getType().equals(Material.DRAGON_EGG)) { + match = Unique.CHESTPLATE; + Verbose.send("Matched with dragon egg: Unique: %s",match); } return match; } diff --git a/src/main/java/me/trouper/armorsmp/data/io/Config.java b/src/main/java/me/trouper/armorsmp/data/io/Config.java index e58e1dc..63b8633 100644 --- a/src/main/java/me/trouper/armorsmp/data/io/Config.java +++ b/src/main/java/me/trouper/armorsmp/data/io/Config.java @@ -2,20 +2,27 @@ package me.trouper.armorsmp.data.io; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.utils.Verbose; import java.io.File; 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; } - + + @Override + public void save() { + Verbose.send(1,"Saving Config..."); + JsonSerializable.super.save(); + } + public boolean maceCraftingEnabled = true; public boolean netherEnabled = true; public boolean endEnabled = true; diff --git a/src/main/java/me/trouper/armorsmp/data/io/IO.java b/src/main/java/me/trouper/armorsmp/data/io/IO.java index 4128d59..d82ad05 100644 --- a/src/main/java/me/trouper/armorsmp/data/io/IO.java +++ b/src/main/java/me/trouper/armorsmp/data/io/IO.java @@ -26,9 +26,6 @@ public class IO { ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); config = JsonSerializable.load(CONFIG_FILE,Config.class,new Config()); storage = JsonSerializable.load(STORAGE_FILE,Storage.class,new Storage()); - - config.save(); - storage.save(); } public void saveAll() { diff --git a/src/main/java/me/trouper/armorsmp/data/io/Storage.java b/src/main/java/me/trouper/armorsmp/data/io/Storage.java index ba757dd..172755f 100644 --- a/src/main/java/me/trouper/armorsmp/data/io/Storage.java +++ b/src/main/java/me/trouper/armorsmp/data/io/Storage.java @@ -4,6 +4,7 @@ import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.Unique; +import me.trouper.armorsmp.utils.Verbose; import java.io.File; import java.util.HashMap; @@ -18,19 +19,25 @@ public class Storage implements JsonSerializable { public File getFile() { return ArmorSMP.getInstance().getManager().io.STORAGE_FILE; } - + + @Override + public void save() { + Verbose.send(1,"Saving Storage..."); + JsonSerializable.super.save(); + } + public UserData userData = new UserData(); public Uniques uniques = new Uniques(); - public Map armorUpdateCache = new ConcurrentHashMap<>(); + public Map armorUpdateCache = new HashMap<>(); public Set uniqueUpdateCache = new HashSet<>(); public class Uniques { - public Map owners = new ConcurrentHashMap<>(); + public Map owners = new HashMap<>(); } public class UserData { public Set tipsDisabled = new HashSet<>(); - public Map playerTiers = new ConcurrentHashMap<>(); + 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 9ed64c5..cf822d8 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -4,6 +4,7 @@ import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.server.commands.AbilityCommand; import me.trouper.armorsmp.server.commands.AdminCommand; +import me.trouper.armorsmp.server.commands.TipsCommand; import me.trouper.armorsmp.server.commands.TrustCommand; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.server.events.*; @@ -23,17 +24,17 @@ public class Manager { public Broadcaster broadcaster; public Manager() { - io = new IO(); - - armor = new ArmorBackend(io); - trust = new TrustBackend(io); - uniques = new UniquesBackend(io); - broadcaster = new Broadcaster(io); + io = new IO(); } public void init() { io.loadAll(); + armor = new ArmorBackend(); + trust = new TrustBackend(); + uniques = new UniquesBackend(); + broadcaster = new Broadcaster(); + registerCommands(); registerEvents(); registerCrafting(); @@ -51,6 +52,9 @@ public class Manager { new UpgradeRedeemEvent().register(); new PickUpEvent().register(); new ItemDestroyEvents().register(); + new TrustEvents().register(); + new DropItemEvent().register(); + new ContainerEvents().register(); } private void registerCommands() { @@ -58,6 +62,7 @@ public class Manager { new AdminCommand().register(); new TrustCommand().register(); new AbilityCommand().register(); + new TipsCommand().register(); } private void registerCrafting() { diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java index fccccdc..51d01e2 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java @@ -30,8 +30,8 @@ public class AbilityCommand implements CustomCommand { Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid unique. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); return; } - if (p.getUniqueId().toString().equals(ArmorSMP.getInstance().getManager().io.storage.uniques.owners.get(piece))) { - Text.sendMessage(false, Text.Pallet.WARNING, sender, "You do not own {0}.",piece.getCanonical()); + if (!p.getUniqueId().toString().equals(ArmorSMP.getInstance().getManager().io.storage.uniques.owners.get(piece))) { + Text.sendMessage(false, Text.Pallet.WARNING, sender, "You do not own the {0}.",piece.getCanonical()); return; } if (abilityCooldown.isOnCooldown(Pair.of(piece,p.getUniqueId()))) { @@ -40,6 +40,7 @@ public class AbilityCommand implements CustomCommand { } piece.getAbility().accept(p); abilityCooldown.addCooldown(Pair.of(piece,p.getUniqueId()),piece.getAbilityCooldownTicks() * 50L); + Text.sendMessage(false, Text.Pallet.SUCCESS,sender,"Successfully used your {0}'s ability!",piece.getCanonical()); } @Override 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 112110b..65e6a29 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -25,11 +25,12 @@ 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]"); + Text.sendError(sender, "Error: Valid sub-commands are: [reload, change, give, toggle, reset, remove]"); return; } String sub = args.get(0).toString(); switch (sub) { + case "reload" -> handleReload(sender,args); case "change" -> handleChange(sender, args); case "give" -> handleGive(sender, args); case "toggle" -> handleToggle(sender, args); @@ -63,6 +64,11 @@ public class AdminCommand implements CustomCommand { .then(b.arg("end","nether","mace","debug"))); } + private void handleReload(CommandSender sender, Args args) { + Text.sendMessage(false, Text.Pallet.NEUTRAL,sender,"Reloading IO..."); + ArmorSMP.getInstance().getManager().io.loadAll(); + } + private void handleChange(CommandSender sender, Args args) { if (args.getSize() < 3) { Text.sendError(sender, "Usage: /armorsmp change "); diff --git a/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java new file mode 100644 index 0000000..b208740 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java @@ -0,0 +1,36 @@ +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.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandRegistry(value = "tips",playersOnly = true) +public class TipsCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender sender, Command command, String s, Args args) { + Player p = (Player) sender; + boolean result = false; + + if (ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(p.getUniqueId().toString())) { + ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.remove(p.getUniqueId().toString()); + result = true; + } else { + ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.add(p.getUniqueId().toString()); + } + + ArmorSMP.getInstance().getManager().io.storage.save(); + + Text.sendMessage(false, Text.Pallet.SUCCESS,sender,"Successfully {0} tips.", result ? "enabled" : "disabled"); + } + + @Override + public void dispatchCompletions(CommandSender sender, Command command, String s, CompletionBuilder completionBuilder) { + + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/ContainerEvents.java b/src/main/java/me/trouper/armorsmp/server/events/ContainerEvents.java new file mode 100644 index 0000000..aa93265 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/ContainerEvents.java @@ -0,0 +1,116 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.armorsmp.data.Unique; +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.*; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class ContainerEvents implements CustomListener { + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) return; + Player player = (Player) event.getWhoClicked(); + Inventory clickedInventory = event.getClickedInventory(); + ItemStack currentItem = event.getCurrentItem(); + ItemStack cursorItem = event.getCursor(); + + if (event.isShiftClick() && currentItem != null && Unique.isUnique(currentItem)) { + if (clickedInventory != null && clickedInventory.getType() == InventoryType.PLAYER) { + event.setCancelled(true); + player.closeInventory(); + return; + } + } + + if (cursorItem != null && Unique.isUnique(cursorItem)) { + if (clickedInventory != null && clickedInventory.getType() != InventoryType.PLAYER) { + event.setCancelled(true); + player.closeInventory(); + return; + } + } + + if (event.getClick() == ClickType.NUMBER_KEY) { + ItemStack hotbarItem = player.getInventory().getItem(event.getHotbarButton()); + if (hotbarItem != null && Unique.isUnique(hotbarItem)) { + if (clickedInventory != null && clickedInventory.getType() != InventoryType.PLAYER) { + event.setCancelled(true); + player.closeInventory(); + } + } + } + + if (event.getClick() == ClickType.SWAP_OFFHAND) { + ItemStack offhandItem = player.getInventory().getItemInOffHand(); + Verbose.send("Detected"); + if (Unique.isUnique(cursorItem) || Unique.isUnique(offhandItem) || Unique.isUnique(currentItem)) { + if (clickedInventory != null && clickedInventory.getType() != InventoryType.PLAYER) { + event.setCancelled(true); + player.closeInventory(); + return; + } + } + } + } + + @EventHandler + public void onInventoryDrag(InventoryDragEvent event) { + if (!(event.getWhoClicked() instanceof Player)) return; + Player player = (Player) event.getWhoClicked(); + ItemStack draggedItem = event.getOldCursor(); + + if (!Unique.isUnique(draggedItem)) return; + for (int rawSlot : event.getRawSlots()) { + if (!(rawSlot < event.getView().getTopInventory().getSize())) return; + event.setCancelled(true); + player.closeInventory(); + return; + } + } + + @EventHandler + public void onInventoryDrag(PlayerSwapHandItemsEvent event) { + ItemStack draggedItem = event.getOffHandItem(); + + if (!Unique.isUnique(draggedItem)) return; + + event.setCancelled(true); + } + + @EventHandler + public void onInventoryDrag(InventoryPickupItemEvent event) { + ItemStack draggedItem = event.getItem().getItemStack(); + if (!Unique.isUnique(draggedItem)) return; + + event.setCancelled(true); + } + + @EventHandler + public void onInventoryMoveItem(InventoryMoveItemEvent event) { + ItemStack item = event.getItem(); + Inventory destination = event.getDestination(); + + if (!Unique.isUnique(item)) return; + if ((destination.getHolder() instanceof Player)) return; + + event.setCancelled(true); + } + + @EventHandler + public void onInventoryMoveItem(PlayerInteractEvent e) { + if (e.getClickedBlock() != null && !e.getClickedBlock().getType().equals(Material.DECORATED_POT)) return; + if (!Unique.isUnique(e.getItem())) return; + + e.setCancelled(true); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java index 645e915..21e9fe4 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java +++ b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java @@ -7,13 +7,11 @@ import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Verbose; import me.trouper.armorsmp.utils.WorldUtils; -import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.inventory.ItemStack; public class DeathEvents implements CustomListener { @@ -22,7 +20,7 @@ public class DeathEvents implements CustomListener { Player p = e.getEntity(); final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); Verbose.send("Handling death event for %s, their tier is %s",p.getName(),tier); - e.getDrops().removeIf(WorldUtils::isDroppable); + e.getDrops().removeIf(WorldUtils::notDroppable); if (tier.equals(ArmorTier.NONE)) { Verbose.send("Tier was none"); diff --git a/src/main/java/me/trouper/armorsmp/server/events/DropItemEvent.java b/src/main/java/me/trouper/armorsmp/server/events/DropItemEvent.java new file mode 100644 index 0000000..fd6549a --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/DropItemEvent.java @@ -0,0 +1,25 @@ +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.WorldUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.inventory.ItemStack; + +public class DropItemEvent implements CustomListener { + + @EventHandler + public void onDrop(PlayerDropItemEvent e) { + Player p = e.getPlayer(); + ItemStack i = e.getItemDrop().getItemStack(); + + if (!Unique.isUnique(i)) return; + Unique match = Unique.matchUnique(i); + + ArmorSMP.getInstance().getManager().uniques.dropUnique(p,match); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java index 5045188..8fa4b5f 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java @@ -22,23 +22,31 @@ public class JoinEvent implements CustomListener { } private void initPlayer(Player p) { + Verbose.send("Setting up data for %s",p.getName()); ArmorSMP.getInstance().getManager().io.storage.userData.playerTiers.putIfAbsent(p.getUniqueId().toString(), ArmorTier.NONE); ArmorSMP.getInstance().getManager().io.storage.userData.playerTrust.putIfAbsent(p.getUniqueId().toString(), new HashSet<>(Set.of(p.getUniqueId().toString()))); + ArmorSMP.getInstance().getManager().io.storage.save(); } private void handleUpdates(Player p) { Verbose.send("Checking for updates needed on %s",p.getName()); final Map armorCache = ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache; - if (armorCache.containsKey(p.getUniqueId().toString()) || !ArmorSMP.getInstance().getManager().armor.verifyArmor(p)) { + if (!ArmorSMP.getInstance().getManager().armor.verifyArmor(p)) { Verbose.send("Updating armor"); ArmorSMP.getInstance().getManager().armor.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); + } + if (armorCache.containsKey(p.getUniqueId().toString())) { + Verbose.send("Updating armor from cache"); + ArmorSMP.getInstance().getManager().armor.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache.remove(p.getUniqueId().toString()); + ArmorSMP.getInstance().getManager().io.storage.save(); } final Set uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache; if (uniquesCache.contains(p.getUniqueId().toString())) { Verbose.send("Updating uniques"); ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString()); + ArmorSMP.getInstance().getManager().io.storage.save(); } } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java index 818f248..caca8a3 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java @@ -22,6 +22,8 @@ public class PickUpEvent implements CustomListener { if (!Unique.isUnique(i)) return; Unique match = Unique.matchUnique(i); + e.setCancelled(true); + e.getItem().remove(); ArmorSMP.getInstance().getManager().uniques.setOwner(match,p); Text.sendMessage(true, Text.Pallet.INFO,p,"Congratulations! You have picked up the unique {0}. There is only one of each in the whole server!",match.getCanonical()); diff --git a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java index b1a50ca..9da66ff 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java @@ -5,6 +5,7 @@ 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 me.trouper.armorsmp.utils.Verbose; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; @@ -18,12 +19,15 @@ public class UpgradeRedeemEvent implements CustomListener { ItemStack holding = e.getItem(); if (holding == null || holding.isEmpty()) return; - if (!holding.isSimilar(ArmorUpgrade.ARMOR_UGPRADE)) return; + Verbose.send("Detected Interact Event Holding: %s", holding.getType()); + if (!holding.getType().equals(ArmorUpgrade.ARMOR_UGPRADE.getType())) return; + if (!holding.hasItemMeta()) return; + if (holding.getItemMeta().getCustomModelData() != ArmorUpgrade.ARMOR_UGPRADE.getItemMeta().getCustomModelData()) return; final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); if (ArmorSMP.getInstance().getManager().armor.upTier(p)) { - holding.setAmount(holding.getAmount() - 1); + 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)); } else { Text.sendMessage(true, Text.Pallet.ERROR,p,"Unable to upgrade. You are already at the maximum Armor Tier!"); 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 aa87b16..2d8a339 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java @@ -1,5 +1,6 @@ package me.trouper.armorsmp.server.systems; +import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.Storage; @@ -16,11 +17,7 @@ import java.util.concurrent.atomic.AtomicReference; public class ArmorBackend { - private final Storage storage; - - public ArmorBackend(IO io) { - storage = io.storage; - } + private final Storage storage = ArmorSMP.getInstance().getManager().io.storage; public boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) { final ArmorTier current = getTier(target); @@ -51,7 +48,7 @@ public class ArmorBackend { } public boolean upTier(OfflinePlayer target) { - int numeric = storage.userData.playerTiers.computeIfAbsent(target.getUniqueId().toString(),tier->ArmorTier.NONE).getNumeric(); + int numeric = storage.userData.playerTiers.getOrDefault(target.getUniqueId().toString(),ArmorTier.NONE).getNumeric(); Verbose.send("Upgrading %s, current numeric: %s",target.getName(),numeric); if (numeric > 4) return false; numeric++; @@ -166,13 +163,14 @@ public class ArmorBackend { } } - public void queueUpdate(OfflinePlayer target, boolean transferEnchants) { + public synchronized void queueUpdate(OfflinePlayer target, boolean transferEnchants) { Verbose.send("Queueing update for %s",target.getName()); if (target.getPlayer() != null && target.isOnline()) updateArmor(target.getPlayer(), transferEnchants); else storage.armorUpdateCache.put(target.getUniqueId().toString(),transferEnchants); + ArmorSMP.getInstance().getManager().io.storage.save(); } - public void dropUniqueArmor(Player target) { + public synchronized void dropUniqueArmor(Player target) { final Map uniques = storage.uniques.owners; if (!uniques.containsValue(target.getUniqueId().toString())) return; @@ -186,7 +184,12 @@ public class ArmorBackend { storage.uniques.owners.remove(unique); //target.getLocation().getWorld().dropItem(target.getLocation(),unique.getInGameItem()); } + if (unique.equals(Unique.CHESTPLATE)) { + target.getLocation().getWorld().dropItem(target.getLocation(),new ItemStack(Material.DRAGON_EGG)); + } } }); + + ArmorSMP.getInstance().getManager().io.storage.save(); } } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java b/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java index 1f0d365..e408ab6 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java @@ -8,13 +8,10 @@ import org.bukkit.entity.Player; public class Broadcaster { - private final IO io; + private final IO io = ArmorSMP.getInstance().getManager().io; - public Broadcaster(IO io) { - this.io = io; - } - public void broadcastTip() { + if (!io.config.tips.broadcastTips) return; String tip = new Randomizer().getRandomElement(io.config.tips.tipList); for (Player onlinePlayer : ArmorSMP.getInstance().getServer().getOnlinePlayers()) { if (ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(onlinePlayer.getUniqueId().toString())) continue; 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 fa71e91..7395772 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -1,5 +1,6 @@ package me.trouper.armorsmp.server.systems; +import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.Storage; import org.bukkit.entity.Player; @@ -9,11 +10,7 @@ import java.util.Set; import java.util.UUID; public class TrustBackend { - private final Storage storage; - - public TrustBackend(IO io) { - storage = io.storage; - } + private final Storage storage = ArmorSMP.getInstance().getManager().io.storage; public boolean addTrust(Player truster, UUID trustee) { Set trustees = getTrustees(truster); @@ -32,7 +29,7 @@ public class TrustBackend { } public Set getTrustees(Player target) { - return storage.userData.playerTrust.getOrDefault(target.getUniqueId(),new HashSet<>()); + return storage.userData.playerTrust.getOrDefault(target.getUniqueId().toString(),new HashSet<>()); } } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java index 80da80d..a75e641 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java @@ -4,6 +4,7 @@ import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.Unique; +import me.trouper.armorsmp.utils.Verbose; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -12,11 +13,7 @@ import java.util.UUID; public class UniquesBackend { - private final Storage storage; - - public UniquesBackend(IO io) { - storage = io.storage; - } + private final Storage storage = ArmorSMP.getInstance().getManager().io.storage; private void updateUniques() { ArmorSMP.getInstance().getServer().getOnlinePlayers().forEach(this::updateUniques); @@ -24,8 +21,18 @@ public class UniquesBackend { public void updateUniques(Player p) { ArmorSMP.getInstance().getManager().io.storage.uniques.owners.forEach(((unique, id) -> { + if (unique.equals(Unique.HELMET) + || unique.equals(Unique.CHESTPLATE) + || unique.equals(Unique.LEGGINGS) + || unique.equals(Unique.BOOTS) + ) return; if (id.equals(p.getUniqueId().toString())) { - if (!p.getInventory().contains(unique.getInGameItem())) p.getInventory().addItem(unique.getInGameItem()); + Verbose.send(1, "They own the unique, checking if they have it: ", p.getInventory().contains(unique.getInGameItem())); + if (!p.getInventory().contains(unique.getInGameItem())) { + Verbose.send(1, "They don't have it, giving them the item."); + p.getInventory().removeItemAnySlot(unique.getInGameItem()); + p.getInventory().addItem(unique.getInGameItem()); + } } else { p.getInventory().removeItemAnySlot(unique.getInGameItem()); } @@ -35,19 +42,27 @@ public class UniquesBackend { public void queueUpdate(OfflinePlayer target) { if (target.getPlayer() != null && target.isOnline()) updateUniques(); else storage.uniqueUpdateCache.add(target.getUniqueId().toString()); + ArmorSMP.getInstance().getManager().io.storage.save(); } public void setOwner(Unique u, OfflinePlayer p) { storage.uniques.owners.put(u,p.getUniqueId().toString()); + ArmorSMP.getInstance().getManager().io.storage.save(); queueUpdate(p); } + public void dropUnique(Player p, Unique dropped) { + storage.uniques.owners.remove(dropped); + ArmorSMP.getInstance().getManager().io.storage.save(); + } + public void dropUniqueItems(Player p) { storage.uniques.owners.forEach((unique,owner)->{ if (unique.equals(Unique.MACE) || unique.equals(Unique.SWORD) || unique.equals(Unique.AXE) && owner.equals(p.getUniqueId().toString()) && !p.getInventory().contains(unique.getInGameItem())) { storage.uniques.owners.remove(unique); } }); + ArmorSMP.getInstance().getManager().io.storage.save(); } public void applyPersistence() { diff --git a/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java b/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java index 2dd1167..b52fdb5 100644 --- a/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java +++ b/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java @@ -5,16 +5,21 @@ import org.bukkit.inventory.ItemStack; public class WorldUtils { - public static boolean isDroppable(ItemStack i) { - return isArmor(i) && !isUnique(i); + public static boolean notDroppable(ItemStack i) { + return isArmor(i) && !isUnique(i) && !isChestplateUnique(i); } - + + private static boolean isChestplateUnique(ItemStack i) { + Material m = i.getType(); + return m.equals(Material.NETHERITE_CHESTPLATE); + } + public static boolean isArmor(ItemStack i) { Material m = i.getType(); String n = m.name(); return n.contains("HELMET") || n.contains("CHESTPLATE") - || n.contains("LEGGINGS") + || n.contains("LEGGINGS") || n.contains("BOOTS"); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cf54608..813a31b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -22,4 +22,6 @@ commands: ability: description: Utilize unique abilities. aliases: - - a \ No newline at end of file + - a + tips: + description: Toggle tips in messages. \ No newline at end of file