Patched the bain of my existence (swap hand into container thingy)

This commit is contained in:
thetrouper
2025-03-28 00:41:10 -05:00
parent ab6b82272e
commit 1eb04fdc49
35 changed files with 302 additions and 83 deletions

Binary file not shown.

2
.idea/discord.xml generated
View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DiscordProjectSettings"> <component name="DiscordProjectSettings">
<option name="show" value="ASK" /> <option name="show" value="PROJECT_FILES" />
<option name="description" value="" /> <option name="description" value="" />
</component> </component>
</project> </project>

View File

@@ -11,8 +11,4 @@
</configuration> </configuration>
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module> </module>

View File

@@ -28,7 +28,7 @@ repositories {
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") 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 def targetJavaVersion = 21

View File

@@ -23,3 +23,5 @@ commands:
description: Utilize unique abilities. description: Utilize unique abilities.
aliases: aliases:
- a - a
tips:
description: Toggle tips in messages.

Binary file not shown.

View File

@@ -21,110 +21,90 @@ public enum ArmorTier {
ItemBuilder.create() ItemBuilder.create()
.material(Material.LEATHER_HELMET) .material(Material.LEATHER_HELMET)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.LEATHER_CHESTPLATE) .material(Material.LEATHER_CHESTPLATE)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.LEATHER_LEGGINGS) .material(Material.LEATHER_LEGGINGS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.LEATHER_BOOTS) .material(Material.LEATHER_BOOTS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build() .build()
), ),
CHAINMAIL(2, CHAINMAIL(2,
ItemBuilder.create() ItemBuilder.create()
.material(Material.CHAINMAIL_HELMET) .material(Material.CHAINMAIL_HELMET)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.CHAINMAIL_CHESTPLATE) .material(Material.CHAINMAIL_CHESTPLATE)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.CHAINMAIL_LEGGINGS) .material(Material.CHAINMAIL_LEGGINGS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.CHAINMAIL_BOOTS) .material(Material.CHAINMAIL_BOOTS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build() .build()
), ),
GOLD(3, GOLD(3,
ItemBuilder.create() ItemBuilder.create()
.material(Material.GOLDEN_HELMET) .material(Material.GOLDEN_HELMET)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.GOLDEN_CHESTPLATE) .material(Material.GOLDEN_CHESTPLATE)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.GOLDEN_LEGGINGS) .material(Material.GOLDEN_LEGGINGS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.GOLDEN_BOOTS) .material(Material.GOLDEN_BOOTS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build() .build()
), ),
IRON(4, IRON(4,
ItemBuilder.create() ItemBuilder.create()
.material(Material.IRON_HELMET) .material(Material.IRON_HELMET)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.IRON_CHESTPLATE) .material(Material.IRON_CHESTPLATE)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.IRON_LEGGINGS) .material(Material.IRON_LEGGINGS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.IRON_BOOTS) .material(Material.IRON_BOOTS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build() .build()
), ),
DIAMOND(5, DIAMOND(5,
ItemBuilder.create() ItemBuilder.create()
.material(Material.DIAMOND_HELMET) .material(Material.DIAMOND_HELMET)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.DIAMOND_CHESTPLATE) .material(Material.DIAMOND_CHESTPLATE)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.DIAMOND_LEGGINGS) .material(Material.DIAMOND_LEGGINGS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build(), .build(),
ItemBuilder.create() ItemBuilder.create()
.material(Material.DIAMOND_BOOTS) .material(Material.DIAMOND_BOOTS)
.enchant(Enchantment.BINDING_CURSE, 1) .enchant(Enchantment.BINDING_CURSE, 1)
.unbreakable(true)
.build() .build()
); );

View File

@@ -4,6 +4,7 @@ import io.github.itzispyder.pdk.plugin.builders.ItemBuilder;
import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer;
import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Text;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle; import org.bukkit.Particle;
@@ -191,14 +192,23 @@ public enum Unique {
public static boolean isUnique(ItemStack i) { public static boolean isUnique(ItemStack i) {
for (Unique value : values()) { for (Unique value : values()) {
if (value.getInGameItem().isSimilar(i)) return true; if (value.getInGameItem().isSimilar(i)) return true;
if (i.getType().equals(Material.DRAGON_EGG)) return true;
} }
return false; return false;
} }
public static Unique matchUnique(ItemStack i) { public static Unique matchUnique(ItemStack i) {
Verbose.send("Matching Unique, Item Type: %s",i.getType());
Unique match = null; Unique match = null;
for (Unique value : values()) { 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; return match;
} }

View File

@@ -2,6 +2,7 @@ package me.trouper.armorsmp.data.io;
import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable;
import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.utils.Verbose;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
@@ -16,6 +17,12 @@ public class Config implements JsonSerializable<Config> {
return ArmorSMP.getInstance().getManager().io.CONFIG_FILE; 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 maceCraftingEnabled = true;
public boolean netherEnabled = true; public boolean netherEnabled = true;
public boolean endEnabled = true; public boolean endEnabled = true;

View File

@@ -26,9 +26,6 @@ public class IO {
ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); ArmorSMP.getInstance().getLogger().info("Loading all IO Files");
config = JsonSerializable.load(CONFIG_FILE,Config.class,new Config()); config = JsonSerializable.load(CONFIG_FILE,Config.class,new Config());
storage = JsonSerializable.load(STORAGE_FILE,Storage.class,new Storage()); storage = JsonSerializable.load(STORAGE_FILE,Storage.class,new Storage());
config.save();
storage.save();
} }
public void saveAll() { public void saveAll() {

View File

@@ -4,6 +4,7 @@ import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable;
import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.ArmorTier;
import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.data.Unique;
import me.trouper.armorsmp.utils.Verbose;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
@@ -19,18 +20,24 @@ public class Storage implements JsonSerializable<Storage> {
return ArmorSMP.getInstance().getManager().io.STORAGE_FILE; 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 UserData userData = new UserData();
public Uniques uniques = new Uniques(); public Uniques uniques = new Uniques();
public Map<String,Boolean> armorUpdateCache = new ConcurrentHashMap<>(); public Map<String,Boolean> armorUpdateCache = new HashMap<>();
public Set<String> uniqueUpdateCache = new HashSet<>(); public Set<String> uniqueUpdateCache = new HashSet<>();
public class Uniques { public class Uniques {
public Map<Unique, String> owners = new ConcurrentHashMap<>(); public Map<Unique, String> owners = new HashMap<>();
} }
public class UserData { public class UserData {
public Set<String> tipsDisabled = new HashSet<>(); public Set<String> tipsDisabled = new HashSet<>();
public Map<String, ArmorTier> playerTiers = new ConcurrentHashMap<>(); public Map<String, ArmorTier> playerTiers = new HashMap<>();
public Map<String, Set<String>> playerTrust = new HashMap<>(); public Map<String, Set<String>> playerTrust = new HashMap<>();
} }
} }

View File

@@ -4,6 +4,7 @@ import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.IO;
import me.trouper.armorsmp.server.commands.AbilityCommand; import me.trouper.armorsmp.server.commands.AbilityCommand;
import me.trouper.armorsmp.server.commands.AdminCommand; 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.commands.TrustCommand;
import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.server.crafting.ArmorUpgrade;
import me.trouper.armorsmp.server.events.*; import me.trouper.armorsmp.server.events.*;
@@ -24,16 +25,16 @@ public class Manager {
public Manager() { public Manager() {
io = new IO(); io = new IO();
armor = new ArmorBackend(io);
trust = new TrustBackend(io);
uniques = new UniquesBackend(io);
broadcaster = new Broadcaster(io);
} }
public void init() { public void init() {
io.loadAll(); io.loadAll();
armor = new ArmorBackend();
trust = new TrustBackend();
uniques = new UniquesBackend();
broadcaster = new Broadcaster();
registerCommands(); registerCommands();
registerEvents(); registerEvents();
registerCrafting(); registerCrafting();
@@ -51,6 +52,9 @@ public class Manager {
new UpgradeRedeemEvent().register(); new UpgradeRedeemEvent().register();
new PickUpEvent().register(); new PickUpEvent().register();
new ItemDestroyEvents().register(); new ItemDestroyEvents().register();
new TrustEvents().register();
new DropItemEvent().register();
new ContainerEvents().register();
} }
private void registerCommands() { private void registerCommands() {
@@ -58,6 +62,7 @@ public class Manager {
new AdminCommand().register(); new AdminCommand().register();
new TrustCommand().register(); new TrustCommand().register();
new AbilityCommand().register(); new AbilityCommand().register();
new TipsCommand().register();
} }
private void registerCrafting() { private void registerCrafting() {

View File

@@ -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())); 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; return;
} }
if (p.getUniqueId().toString().equals(ArmorSMP.getInstance().getManager().io.storage.uniques.owners.get(piece))) { 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()); Text.sendMessage(false, Text.Pallet.WARNING, sender, "You do not own the {0}.",piece.getCanonical());
return; return;
} }
if (abilityCooldown.isOnCooldown(Pair.of(piece,p.getUniqueId()))) { if (abilityCooldown.isOnCooldown(Pair.of(piece,p.getUniqueId()))) {
@@ -40,6 +40,7 @@ public class AbilityCommand implements CustomCommand {
} }
piece.getAbility().accept(p); piece.getAbility().accept(p);
abilityCooldown.addCooldown(Pair.of(piece,p.getUniqueId()),piece.getAbilityCooldownTicks() * 50L); 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 @Override

View File

@@ -25,11 +25,12 @@ public class AdminCommand implements CustomCommand {
@Override @Override
public void dispatchCommand(CommandSender sender, Command command, String label, Args args) { public void dispatchCommand(CommandSender sender, Command command, String label, Args args) {
if (args.getSize() < 1) { 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; return;
} }
String sub = args.get(0).toString(); String sub = args.get(0).toString();
switch (sub) { switch (sub) {
case "reload" -> handleReload(sender,args);
case "change" -> handleChange(sender, args); case "change" -> handleChange(sender, args);
case "give" -> handleGive(sender, args); case "give" -> handleGive(sender, args);
case "toggle" -> handleToggle(sender, args); case "toggle" -> handleToggle(sender, args);
@@ -63,6 +64,11 @@ public class AdminCommand implements CustomCommand {
.then(b.arg("end","nether","mace","debug"))); .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) { private void handleChange(CommandSender sender, Args args) {
if (args.getSize() < 3) { if (args.getSize() < 3) {
Text.sendError(sender, "Usage: /armorsmp change <tier> <player>"); Text.sendError(sender, "Usage: /armorsmp change <tier> <player>");

View File

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

View File

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

View File

@@ -7,13 +7,11 @@ import me.trouper.armorsmp.server.crafting.ArmorUpgrade;
import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Text;
import me.trouper.armorsmp.utils.Verbose; import me.trouper.armorsmp.utils.Verbose;
import me.trouper.armorsmp.utils.WorldUtils; import me.trouper.armorsmp.utils.WorldUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
public class DeathEvents implements CustomListener { public class DeathEvents implements CustomListener {
@@ -22,7 +20,7 @@ public class DeathEvents implements CustomListener {
Player p = e.getEntity(); Player p = e.getEntity();
final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p);
Verbose.send("Handling death event for %s, their tier is %s",p.getName(),tier); 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)) { if (tier.equals(ArmorTier.NONE)) {
Verbose.send("Tier was none"); Verbose.send("Tier was none");

View File

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

View File

@@ -22,23 +22,31 @@ public class JoinEvent implements CustomListener {
} }
private void initPlayer(Player p) { 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.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.userData.playerTrust.putIfAbsent(p.getUniqueId().toString(), new HashSet<>(Set.of(p.getUniqueId().toString())));
ArmorSMP.getInstance().getManager().io.storage.save();
} }
private void handleUpdates(Player p) { private void handleUpdates(Player p) {
Verbose.send("Checking for updates needed on %s",p.getName()); Verbose.send("Checking for updates needed on %s",p.getName());
final Map<String, Boolean> armorCache = ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache; final Map<String, Boolean> 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"); Verbose.send("Updating armor");
ArmorSMP.getInstance().getManager().armor.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); 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.armorUpdateCache.remove(p.getUniqueId().toString());
ArmorSMP.getInstance().getManager().io.storage.save();
} }
final Set<String> uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache; final Set<String> uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache;
if (uniquesCache.contains(p.getUniqueId().toString())) { if (uniquesCache.contains(p.getUniqueId().toString())) {
Verbose.send("Updating uniques"); Verbose.send("Updating uniques");
ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); ArmorSMP.getInstance().getManager().uniques.queueUpdate(p);
ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString()); ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString());
ArmorSMP.getInstance().getManager().io.storage.save();
} }
} }
} }

View File

@@ -22,6 +22,8 @@ public class PickUpEvent implements CustomListener {
if (!Unique.isUnique(i)) return; if (!Unique.isUnique(i)) return;
Unique match = Unique.matchUnique(i); Unique match = Unique.matchUnique(i);
e.setCancelled(true);
e.getItem().remove();
ArmorSMP.getInstance().getManager().uniques.setOwner(match,p); 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()); 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());

View File

@@ -5,6 +5,7 @@ import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.ArmorTier;
import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.server.crafting.ArmorUpgrade;
import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Text;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
@@ -18,7 +19,10 @@ public class UpgradeRedeemEvent implements CustomListener {
ItemStack holding = e.getItem(); ItemStack holding = e.getItem();
if (holding == null || holding.isEmpty()) return; 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); final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p);

View File

@@ -1,5 +1,6 @@
package me.trouper.armorsmp.server.systems; package me.trouper.armorsmp.server.systems;
import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.data.ArmorTier;
import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.IO;
import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.io.Storage;
@@ -16,11 +17,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class ArmorBackend { public class ArmorBackend {
private final Storage storage; private final Storage storage = ArmorSMP.getInstance().getManager().io.storage;
public ArmorBackend(IO io) {
storage = io.storage;
}
public boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) { public boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) {
final ArmorTier current = getTier(target); final ArmorTier current = getTier(target);
@@ -51,7 +48,7 @@ public class ArmorBackend {
} }
public boolean upTier(OfflinePlayer target) { 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); Verbose.send("Upgrading %s, current numeric: %s",target.getName(),numeric);
if (numeric > 4) return false; if (numeric > 4) return false;
numeric++; 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()); Verbose.send("Queueing update for %s",target.getName());
if (target.getPlayer() != null && target.isOnline()) updateArmor(target.getPlayer(), transferEnchants); if (target.getPlayer() != null && target.isOnline()) updateArmor(target.getPlayer(), transferEnchants);
else storage.armorUpdateCache.put(target.getUniqueId().toString(),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<Unique, String> uniques = storage.uniques.owners; final Map<Unique, String> uniques = storage.uniques.owners;
if (!uniques.containsValue(target.getUniqueId().toString())) return; if (!uniques.containsValue(target.getUniqueId().toString())) return;
@@ -186,7 +184,12 @@ public class ArmorBackend {
storage.uniques.owners.remove(unique); storage.uniques.owners.remove(unique);
//target.getLocation().getWorld().dropItem(target.getLocation(),unique.getInGameItem()); //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();
} }
} }

View File

@@ -8,13 +8,10 @@ import org.bukkit.entity.Player;
public class Broadcaster { 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() { public void broadcastTip() {
if (!io.config.tips.broadcastTips) return;
String tip = new Randomizer().getRandomElement(io.config.tips.tipList); String tip = new Randomizer().getRandomElement(io.config.tips.tipList);
for (Player onlinePlayer : ArmorSMP.getInstance().getServer().getOnlinePlayers()) { for (Player onlinePlayer : ArmorSMP.getInstance().getServer().getOnlinePlayers()) {
if (ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(onlinePlayer.getUniqueId().toString())) continue; if (ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(onlinePlayer.getUniqueId().toString())) continue;

View File

@@ -1,5 +1,6 @@
package me.trouper.armorsmp.server.systems; package me.trouper.armorsmp.server.systems;
import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.IO;
import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.io.Storage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -9,11 +10,7 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
public class TrustBackend { public class TrustBackend {
private final Storage storage; private final Storage storage = ArmorSMP.getInstance().getManager().io.storage;
public TrustBackend(IO io) {
storage = io.storage;
}
public boolean addTrust(Player truster, UUID trustee) { public boolean addTrust(Player truster, UUID trustee) {
Set<String> trustees = getTrustees(truster); Set<String> trustees = getTrustees(truster);
@@ -32,7 +29,7 @@ public class TrustBackend {
} }
public Set<String> getTrustees(Player target) { public Set<String> getTrustees(Player target) {
return storage.userData.playerTrust.getOrDefault(target.getUniqueId(),new HashSet<>()); return storage.userData.playerTrust.getOrDefault(target.getUniqueId().toString(),new HashSet<>());
} }
} }

View File

@@ -4,6 +4,7 @@ import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.io.IO; import me.trouper.armorsmp.data.io.IO;
import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.io.Storage;
import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.data.Unique;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -12,11 +13,7 @@ import java.util.UUID;
public class UniquesBackend { public class UniquesBackend {
private final Storage storage; private final Storage storage = ArmorSMP.getInstance().getManager().io.storage;
public UniquesBackend(IO io) {
storage = io.storage;
}
private void updateUniques() { private void updateUniques() {
ArmorSMP.getInstance().getServer().getOnlinePlayers().forEach(this::updateUniques); ArmorSMP.getInstance().getServer().getOnlinePlayers().forEach(this::updateUniques);
@@ -24,8 +21,18 @@ public class UniquesBackend {
public void updateUniques(Player p) { public void updateUniques(Player p) {
ArmorSMP.getInstance().getManager().io.storage.uniques.owners.forEach(((unique, id) -> { 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 (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 { } else {
p.getInventory().removeItemAnySlot(unique.getInGameItem()); p.getInventory().removeItemAnySlot(unique.getInGameItem());
} }
@@ -35,19 +42,27 @@ public class UniquesBackend {
public void queueUpdate(OfflinePlayer target) { public void queueUpdate(OfflinePlayer target) {
if (target.getPlayer() != null && target.isOnline()) updateUniques(); if (target.getPlayer() != null && target.isOnline()) updateUniques();
else storage.uniqueUpdateCache.add(target.getUniqueId().toString()); else storage.uniqueUpdateCache.add(target.getUniqueId().toString());
ArmorSMP.getInstance().getManager().io.storage.save();
} }
public void setOwner(Unique u, OfflinePlayer p) { public void setOwner(Unique u, OfflinePlayer p) {
storage.uniques.owners.put(u,p.getUniqueId().toString()); storage.uniques.owners.put(u,p.getUniqueId().toString());
ArmorSMP.getInstance().getManager().io.storage.save();
queueUpdate(p); 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) { public void dropUniqueItems(Player p) {
storage.uniques.owners.forEach((unique,owner)->{ 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())) { 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); storage.uniques.owners.remove(unique);
} }
}); });
ArmorSMP.getInstance().getManager().io.storage.save();
} }
public void applyPersistence() { public void applyPersistence() {

View File

@@ -5,8 +5,13 @@ import org.bukkit.inventory.ItemStack;
public class WorldUtils { public class WorldUtils {
public static boolean isDroppable(ItemStack i) { public static boolean notDroppable(ItemStack i) {
return isArmor(i) && !isUnique(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) { public static boolean isArmor(ItemStack i) {

View File

@@ -23,3 +23,5 @@ commands:
description: Utilize unique abilities. description: Utilize unique abilities.
aliases: aliases:
- a - a
tips:
description: Toggle tips in messages.