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"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

View File

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

View File

@@ -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

View File

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

Binary file not shown.

View File

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

View File

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

View File

@@ -2,6 +2,7 @@ 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;
@@ -16,6 +17,12 @@ public class Config implements JsonSerializable<Config> {
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;

View File

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

View File

@@ -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;
@@ -19,18 +20,24 @@ public class Storage implements JsonSerializable<Storage> {
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<String,Boolean> armorUpdateCache = new ConcurrentHashMap<>();
public Map<String,Boolean> armorUpdateCache = new HashMap<>();
public Set<String> uniqueUpdateCache = new HashSet<>();
public class Uniques {
public Map<Unique, String> owners = new ConcurrentHashMap<>();
public Map<Unique, String> owners = new HashMap<>();
}
public class UserData {
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<>();
}
}

View File

@@ -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.*;
@@ -24,16 +25,16 @@ public class Manager {
public Manager() {
io = new IO();
armor = new ArmorBackend(io);
trust = new TrustBackend(io);
uniques = new UniquesBackend(io);
broadcaster = new Broadcaster(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() {

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()));
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

View File

@@ -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 <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.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");

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) {
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<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");
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<String> 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();
}
}
}

View File

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

View File

@@ -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,7 +19,10 @@ 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);

View File

@@ -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<Unique, String> 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();
}
}

View File

@@ -8,13 +8,10 @@ import org.bukkit.entity.Player;
public class Broadcaster {
private final IO io;
public Broadcaster(IO io) {
this.io = io;
}
private final IO io = ArmorSMP.getInstance().getManager().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;

View File

@@ -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<String> trustees = getTrustees(truster);
@@ -32,7 +29,7 @@ public class TrustBackend {
}
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.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() {

View File

@@ -5,8 +5,13 @@ 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) {

View File

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