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