More Bug patching, next round of testing coming soon

This commit is contained in:
thetrouper
2025-04-01 08:47:14 -05:00
parent 44972f8465
commit 991ce83369
22 changed files with 272 additions and 217 deletions

Binary file not shown.

View File

@@ -8,8 +8,6 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.function.Consumer;
public enum ArmorTier {
NONE(0,
new ItemStack(Material.AIR),
@@ -146,7 +144,7 @@ public enum ArmorTier {
if (value.getLeggings().getType().equals(p.getInventory().getLeggings().getType())) return value;
if (value.getBoots().getType().equals(p.getInventory().getBoots().getType())) return value;
}
return ArmorSMP.getInstance().getManager().armor.getTier(p);
return ArmorSMP.getInstance().getManager().tiers.getTier(p);
}
public int getNumeric() {

View File

@@ -7,7 +7,7 @@ import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.utils.Display;
import me.trouper.armorsmp.utils.Text;
import me.trouper.armorsmp.utils.Verbose;
import me.trouper.armorsmp.utils.WorldUtils;
import me.trouper.armorsmp.utils.ItemUtils;
import org.bukkit.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
@@ -41,7 +41,7 @@ public enum Unique {
p.addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST,25,2,true,false,false));
}, (p) -> {
}, 50),
CHESTPLATE(ItemBuilder.create()
DRAGON_EGG(ItemBuilder.create()
.material(Material.NETHERITE_CHESTPLATE)
.lore(Text.legacyColor("&bAbilities:"))
.lore(Text.legacyColor("&3| &7Dragon's Breath"))
@@ -216,24 +216,29 @@ public enum Unique {
}
public static boolean isUnique(ItemStack i) {
if (i == null) return false;
for (Unique value : values()) {
if (WorldUtils.isSimilar(value.getInGameItem(),i)) return true;
if (ItemUtils.isSimilar(value.getInGameItem(),i)) return true;
if (i.getType().equals(Material.DRAGON_EGG)) return true;
}
return false;
}
public static boolean isArmor(Unique unique) {
return ItemUtils.isArmor(unique.getInGameItem());
}
public static Unique matchUnique(ItemStack i) {
Verbose.send("Matching Unique, Item Type: %s",i.getType());
Unique match = null;
for (Unique value : values()) {
if (WorldUtils.isSimilar(value.getInGameItem(),i)) {
if (ItemUtils.isSimilar(value.getInGameItem(),i)) {
match = value;
Verbose.send("Matched with, Unique: %s",match);
}
}
if (i.getType().equals(Material.DRAGON_EGG)) {
match = Unique.CHESTPLATE;
match = Unique.DRAGON_EGG;
Verbose.send("Matched with dragon egg: Unique: %s",match);
}
return match;

View File

@@ -8,20 +8,17 @@ 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.*;
import me.trouper.armorsmp.server.systems.ArmorBackend;
import me.trouper.armorsmp.server.systems.Broadcaster;
import me.trouper.armorsmp.server.systems.TrustBackend;
import me.trouper.armorsmp.server.systems.UniquesBackend;
import me.trouper.armorsmp.server.systems.*;
import org.bukkit.Bukkit;
public class Manager {
// My systems
public IO io;
public ArmorBackend armor;
public TrustBackend trust;
public UniquesBackend uniques;
public TierBackend tiers;
public Broadcaster broadcaster;
public UniquesBackend uniques;
public Manager() {
io = new IO();
@@ -30,10 +27,12 @@ public class Manager {
public void init() {
io.loadAll();
armor = new ArmorBackend();
trust = new TrustBackend();
uniques = new UniquesBackend();
tiers = new TierBackend();
//uniques = new UniquesBackend();
broadcaster = new Broadcaster();
uniques = new UniquesBackend();
registerCommands();
registerEvents();

View File

@@ -11,7 +11,6 @@ import me.trouper.armorsmp.data.io.Config;
import me.trouper.armorsmp.data.Unique;
import me.trouper.armorsmp.server.crafting.ArmorUpgrade;
import me.trouper.armorsmp.utils.Text;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
@@ -153,7 +152,7 @@ public class AdminCommand implements CustomCommand {
return;
}
ArmorSMP.getInstance().getManager().armor.setTier(target, tier);
ArmorSMP.getInstance().getManager().tiers.setTier(target, tier);
Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Changed armor tier to {0} for {1}", tier, target.getName());
}
@@ -205,8 +204,7 @@ public class AdminCommand implements CustomCommand {
}
ArmorSMP.getInstance().getManager().uniques.setOwner(piece, target);
ArmorSMP.getInstance().getManager().armor.queueUpdate(target, true);
ArmorSMP.getInstance().getManager().uniques.queueUpdate(target);
ArmorSMP.getInstance().getManager().tiers.queueUpdate(target, true);
Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Set the owner of unique {0} to {1}.", piece.getCanonical(), target.getName());
}
@@ -287,7 +285,7 @@ public class AdminCommand implements CustomCommand {
}
ArmorSMP.getInstance().getManager().uniques.dropUnique(target,piece);
ArmorSMP.getInstance().getManager().armor.queueUpdate(target, true);
ArmorSMP.getInstance().getManager().tiers.queueUpdate(target, true);
ArmorSMP.getInstance().getManager().uniques.queueUpdate(target);
Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.getCanonical(), target.getName());

View File

@@ -6,7 +6,7 @@ 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 me.trouper.armorsmp.utils.WorldUtils;
import me.trouper.armorsmp.utils.ItemUtils;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -18,26 +18,25 @@ public class DeathEvents implements CustomListener {
@EventHandler
public void onDeath(PlayerDeathEvent e) {
Player p = e.getEntity();
final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p);
final ArmorTier tier = ArmorSMP.getInstance().getManager().tiers.getTier(p);
Verbose.send("Handling death event for %s, their tier is %s",p.getName(),tier);
e.getDrops().removeIf(WorldUtils::notDroppable);
e.getDrops().removeIf(ItemUtils::notDroppable);
if (tier.equals(ArmorTier.NONE)) {
Verbose.send("Tier was none");
Text.sendMessage(true, Text.Pallet.INFO,p,"You have died! Since you were at tier {0}, you didn't drop an Armor Upgrader.",tier);
return;
}
if (ArmorSMP.getInstance().getManager().armor.downTier(p)) {
if (ArmorSMP.getInstance().getManager().tiers.downTier(p)) {
Verbose.send("They have been down-tiered");
e.getDrops().add(ArmorUpgrade.ARMOR_UGPRADE);
e.deathMessage(Text.getMessage(false, Text.Pallet.INFO,"{0} has died, and dropped an {1}!", LegacyComponentSerializer.legacyAmpersand().serialize(p.name()),"Armor Upgrader"));
}
ArmorSMP.getInstance().getManager().armor.dropUniqueArmor(p);
ArmorSMP.getInstance().getManager().uniques.dropUniqueItems(p);
ArmorSMP.getInstance().getManager().uniques.dropAllUniques(p);
}
@EventHandler
public void onRespawn(PlayerRespawnEvent e) {
ArmorSMP.getInstance().getManager().armor.queueUpdate(e.getPlayer(),false);
ArmorSMP.getInstance().getManager().tiers.queueUpdate(e.getPlayer(),false);
}
}

View File

@@ -3,8 +3,6 @@ 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;

View File

@@ -32,9 +32,9 @@ public class JoinEvent implements CustomListener {
Verbose.send("Checking for updates needed on %s",p.getName());
final Map<String, Boolean> armorCache = ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache;
final Set<String> uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache;
if (!ArmorSMP.getInstance().getManager().armor.verifyArmor(p)) {
if (!ArmorSMP.getInstance().getManager().tiers.verifyArmor(p)) {
Verbose.send("Updating armor");
ArmorSMP.getInstance().getManager().armor.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true));
ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true));
}
if (!ArmorSMP.getInstance().getManager().uniques.verifyUniques(p)) {
Verbose.send("Updating uniques");
@@ -42,7 +42,7 @@ public class JoinEvent implements CustomListener {
}
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().tiers.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true));
ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache.remove(p.getUniqueId().toString());
ArmorSMP.getInstance().getManager().io.storage.save();
}

View File

@@ -4,7 +4,7 @@ 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 me.trouper.armorsmp.utils.ItemUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityPickupItemEvent;
@@ -29,9 +29,9 @@ public class PickUpEvent implements CustomListener {
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());
ArmorSMP.getInstance().getServer().broadcast(Text.getMessage(false, Text.Pallet.INFO,"GG, {0}! They are the new owner of the unique {1}.",p.getName(),match.getCanonical()));
if (WorldUtils.isArmor(match.getInGameItem())) {
if (ItemUtils.isArmor(match.getInGameItem())) {
p.getInventory().remove(i);
ArmorSMP.getInstance().getManager().armor.queueUpdate(p,true);
ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,true);
}
}
}

View File

@@ -24,11 +24,11 @@ public class UpgradeRedeemEvent implements CustomListener {
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().tiers.getTier(p);
if (ArmorSMP.getInstance().getManager().armor.upTier(p)) {
if (ArmorSMP.getInstance().getManager().tiers.upTier(p)) {
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));
Text.sendMessage(true, Text.Pallet.INFO,p,"Successfully redeemed armor upgrade! Tier {0} -> Tier {1}",tier,ArmorSMP.getInstance().getManager().tiers.getTier(p));
} else {
Text.sendMessage(true, Text.Pallet.ERROR,p,"Unable to upgrade. You are already at the maximum Armor Tier!");
}

View File

@@ -2,9 +2,8 @@ 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;
import me.trouper.armorsmp.data.Unique;
import me.trouper.armorsmp.utils.ItemUtils;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
@@ -12,13 +11,27 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
public class ArmorBackend {
public class TierBackend {
private final Storage storage = ArmorSMP.getInstance().getManager().io.storage;
public synchronized void setTier(OfflinePlayer target, ArmorTier tier, boolean transferEnchants) {
Verbose.send("Setting tier of %s to %s",target.getName(),tier);
storage.userData.playerTiers.put(target.getUniqueId().toString(),tier);
storage.save();
queueUpdate(target,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 boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) {
final ArmorTier current = getTier(target);
return request.getNumeric() >= current.getNumeric();
@@ -28,13 +41,6 @@ public class ArmorBackend {
setTier(target, tier, shouldTransferEnchants(target, tier));
}
public void setTier(OfflinePlayer target, ArmorTier tier, boolean transferEnchants) {
Verbose.send("Setting tier of %s to %s",target.getName(),tier);
storage.userData.playerTiers.put(target.getUniqueId().toString(),tier);
storage.save();
queueUpdate(target,transferEnchants);
}
public boolean downTier(OfflinePlayer target) {
int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric();
Verbose.send("Downgrading %s, current numeric: %s",target.getName(),numeric);
@@ -74,29 +80,16 @@ public class ArmorBackend {
final Material correctChestplate = tier.getChestplate().getType();
final Material correctLeggings = tier.getLeggings().getType();
final Material correctBoots = tier.getBoots().getType();
Verbose.send("""
Correct Gear:
%s
%s
%s
%s
""", correctHelmet,correctChestplate,correctLeggings,correctBoots
);
final Material helmet = e.getHelmet() == null ? Material.AIR : e.getHelmet().getType() == Material.NETHERITE_HELMET ? correctHelmet : e.getHelmet().getType();
final Material chestplate = e.getChestplate() == null ? Material.AIR : e.getChestplate().getType() == Material.NETHERITE_CHESTPLATE ? correctChestplate : e.getChestplate().getType();
final Material leggings = e.getLeggings() == null ? Material.AIR : e.getLeggings().getType() == Material.NETHERITE_LEGGINGS ? correctLeggings : e.getLeggings().getType();
final Material boots = e.getBoots() == null ? Material.AIR : e.getBoots().getType() == Material.NETHERITE_BOOTS ? correctBoots : e.getBoots().getType();
Verbose.send("""
Equipped Gear:
%s
%s
%s
%s
""", helmet,chestplate,leggings,boots
);
boolean helmetValid = (e.getHelmet() != null && ItemUtils.isUniqueArmor(e.getHelmet())) || (e.getHelmet() != null ? e.getHelmet().getType() : Material.AIR) == correctHelmet;
boolean chestplateValid = (e.getChestplate() != null && ItemUtils.isUniqueArmor(e.getChestplate())) || (e.getChestplate() != null ? e.getChestplate().getType() : Material.AIR) == correctChestplate;
boolean leggingsValid = (e.getLeggings() != null && ItemUtils.isUniqueArmor(e.getLeggings())) || (e.getLeggings() != null ? e.getLeggings().getType() : Material.AIR) == correctLeggings;
boolean bootsValid = (e.getBoots() != null && ItemUtils.isUniqueArmor(e.getBoots())) || (e.getBoots() != null ? e.getBoots().getType() : Material.AIR) == correctBoots;
return helmet.equals(correctHelmet) && chestplate.equals(correctChestplate) && leggings.equals(correctLeggings) && boots.equals(correctBoots);
Verbose.send("Armor validation result: [%b, %b, %b, %b]",
helmetValid, chestplateValid, leggingsValid, bootsValid);
return helmetValid && chestplateValid && leggingsValid && bootsValid;
}
private void updateArmor(Player target, boolean transferEnchants) {
@@ -104,48 +97,40 @@ public class ArmorBackend {
PlayerInventory e = target.getInventory();
final ArmorTier tier = getTier(target);
Verbose.send("Tier is %s",tier);
final ItemStack helmet = e.getHelmet();
final ItemStack chestplate = e.getChestplate();
final ItemStack leggings = e.getLeggings();
final ItemStack boots = e.getBoots();
if (tier.equals(ArmorTier.NONE)) {
e.setHelmet(new ItemStack(Material.AIR));
e.setChestplate(new ItemStack(Material.AIR));
e.setLeggings(new ItemStack(Material.AIR));
e.setBoots(new ItemStack(Material.AIR));
updateUniqueArmor(target);
Verbose.send("Returning to prevent NPE");
ArmorSMP.getInstance().getManager().uniques.queueUpdate(target);
Verbose.send("Cleared armor slots for tier NONE.");
return;
}
AtomicReference<ItemStack> updatedHelmet = new AtomicReference<>(tier.getHelmet());
AtomicReference<ItemStack> updatedChestplate = new AtomicReference<>(tier.getChestplate());
AtomicReference<ItemStack> updatedLeggings = new AtomicReference<>(tier.getLeggings());
AtomicReference<ItemStack> updatedBoots = new AtomicReference<>(tier.getBoots());
ItemStack updatedHelmet = tier.getHelmet().clone();
ItemStack updatedChestplate = tier.getChestplate().clone();
ItemStack updatedLeggings = tier.getLeggings().clone();
ItemStack updatedBoots = tier.getBoots().clone();
if (transferEnchants) {
Verbose.send("Transfering enchants...");
if (helmet != null && !helmet.getType().name().contains("NETHERITE")) updatedHelmet.get().addEnchantments(helmet.getEnchantments());
if (chestplate != null && !chestplate.getType().name().contains("NETHERITE")) updatedChestplate.get().addEnchantments(chestplate.getEnchantments());
if (leggings != null && !leggings.getType().name().contains("NETHERITE")) updatedLeggings.get().addEnchantments(leggings.getEnchantments());
if (boots != null && !boots.getType().name().contains("NETHERITE")) updatedBoots.get().addEnchantments(boots.getEnchantments());
Verbose.send("Transfering enchants (non-unique only)...");
ItemUtils.transferEnchants(e.getHelmet(), updatedHelmet);
ItemUtils.transferEnchants(e.getChestplate(), updatedChestplate);
ItemUtils.transferEnchants(e.getLeggings(), updatedLeggings);
ItemUtils.transferEnchants(e.getBoots(), updatedBoots);
}
Verbose.send("Setting items...");
e.setHelmet(updatedHelmet.get());
e.setChestplate(updatedChestplate.get());
e.setLeggings(updatedLeggings.get());
e.setBoots(updatedBoots.get());
e.setHelmet(updatedHelmet);
e.setChestplate(updatedChestplate);
e.setLeggings(updatedLeggings);
e.setBoots(updatedBoots);
updateUniqueArmor(target);
Verbose.send("Update complete!");
ArmorSMP.getInstance().getManager().uniques.queueUpdate(target);
Verbose.send("Armor update complete!");
}
/*
private void updateUniqueArmor(Player target) {
PlayerInventory e = target.getInventory();
@@ -163,12 +148,7 @@ public class ArmorBackend {
}
}
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 synchronized void dropUniqueArmor(Player target) {
final Map<Unique, String> uniques = storage.uniques.owners;
@@ -191,4 +171,6 @@ public class ArmorBackend {
ArmorSMP.getInstance().getManager().io.storage.save();
}
*/
}

View File

@@ -1,71 +1,93 @@
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 me.trouper.armorsmp.data.Unique;
import me.trouper.armorsmp.data.io.Storage;
import me.trouper.armorsmp.utils.ItemUtils;
import me.trouper.armorsmp.utils.Verbose;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
public class UniquesBackend {
private final Storage storage = ArmorSMP.getInstance().getManager().io.storage;
private void updateUniques() {
ArmorSMP.getInstance().getServer().getOnlinePlayers().forEach(this::updateUniques);
}
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())) {
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());
}
}));
}
public void queueUpdate(OfflinePlayer target) {
if (target.getPlayer() != null && target.isOnline()) updateUniques();
else storage.uniqueUpdateCache.add(target.getUniqueId().toString());
if (target.getPlayer() != null && target.isOnline()) updateUniques(target.getPlayer());
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();
private void updateUniques(Player p) {
removeUnowned(p);
equipOwnedArmor(p);
addMissing(p);
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())) {
storage.uniques.owners.remove(unique);
private void removeUnowned(Player p) {
PlayerInventory inv = p.getInventory();
for (ItemStack item : inv.getContents()) {
if (item == null || !ItemUtils.isUnique(item)) continue;
Unique unique = Unique.matchUnique(item);
if (unique == null || !isOwner(p, unique)) {
inv.removeItemAnySlot(item);
}
}
for (ItemStack armor : inv.getArmorContents()) {
if (armor == null || !ItemUtils.isUnique(armor)) continue;
Unique unique = Unique.matchUnique(armor);
if (unique == null || !isOwner(p, unique)) {
inv.setItem(inv.first(armor), null);
}
}
}
private void equipOwnedArmor(Player p) {
storage.uniques.owners.forEach((unique, ownerId) -> {
if (ownerId.equals(p.getUniqueId().toString()) && Unique.isArmor(unique)) {
if (ItemUtils.isHelmet(unique.getInGameItem())) p.getInventory().setHelmet(unique.getInGameItem());
else if (ItemUtils.isChestplate(unique.getInGameItem())) p.getInventory().setChestplate(unique.getInGameItem());
else if (ItemUtils.isLeggings(unique.getInGameItem())) p.getInventory().setLeggings(unique.getInGameItem());
else if (ItemUtils.isBoots(unique.getInGameItem())) p.getInventory().setBoots(unique.getInGameItem());
}
});
ArmorSMP.getInstance().getManager().io.storage.save();
}
private void addMissing(Player p) {
storage.uniques.owners.forEach((unique, ownerId) -> {
if (ownerId.equals(p.getUniqueId().toString())) {
if (!Unique.isArmor(unique) && !hasItem(p, unique)) {
p.getInventory().addItem(unique.getInGameItem());
}
}
});
}
public boolean isOwner(Player p, Unique unique) {
return storage.uniques.owners.containsKey(unique) && storage.uniques.owners.get(unique).equals(p.getUniqueId().toString());
}
private boolean hasItem(Player p, Unique unique) {
for (ItemStack item : p.getInventory().getContents()) {
if (item != null && ItemUtils.isSimilar(item, unique.getInGameItem())) {
return true;
}
}
return false;
}
public void applyPersistence() {
@@ -80,18 +102,32 @@ public class UniquesBackend {
});
}
public void dropUnique(Player p, Unique dropped) {
storage.uniques.owners.remove(dropped);
storage.save();
}
public void dropAllUniques(Player p) {
storage.uniques.owners.forEach((unique,owner)->{
if (owner.equals(p.getUniqueId().toString())) {
storage.uniques.owners.remove(unique);
}
});
storage.save();
}
public void setOwner(Unique u, OfflinePlayer p) {
storage.uniques.owners.put(u, p.getUniqueId().toString());
storage.save();
if (p.isOnline()) updateUniques(p.getPlayer());
}
public boolean verifyUniques(Player p) {
AtomicBoolean success = new AtomicBoolean(false);
List<Boolean> checks = new ArrayList<>();
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())) {
Verbose.send(1, "They own the unique, checking if they have it: ", p.getInventory().contains(unique.getInGameItem()));
if (p.getInventory().contains(unique.getInGameItem())) {
if (hasItem(p,unique)) {
Verbose.send(1, "They have it");
checks.add(true);
} else {
@@ -102,4 +138,6 @@ public class UniquesBackend {
}));
return !checks.contains(false);
}
}

View File

@@ -36,11 +36,14 @@ public class Display implements Global {
}
}
}
public static final Function<Particle, Consumer<Location>> PARTICLE_FACTORY = particle -> l -> l.getWorld().spawnParticle(particle, l, 1, 0, 0, 0, 0);
public static final BiFunction<Color, Float, Consumer<Location>> DUST_PARTICLE_FACTORY = (color, thickness) -> {
Particle.DustOptions dust = new Particle.DustOptions(color, thickness);
return l -> l.getWorld().spawnParticle(Particle.DUST, l, 1, 0, 0, 0, 0, dust);
};
public static final Function<Boolean, Consumer<Location>> FLAME_PARTICLE_FACTORY = soul -> {
Particle flame = soul ? Particle.SOUL_FIRE_FLAME : Particle.FLAME;
return l -> l.getWorld().spawnParticle(flame, l, 1, 0, 0, 0, 0);

View File

@@ -0,0 +1,81 @@
package me.trouper.armorsmp.utils;
import me.trouper.armorsmp.data.Unique;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
public class ItemUtils {
public static boolean notDroppable(ItemStack i) {
return isArmor(i) && !isUnique(i) && !isDragonEggEquivalent(i);
}
private static boolean isDragonEggEquivalent(ItemStack i) {
Material m = i.getType();
return m.equals(Unique.DRAGON_EGG);
}
public static boolean isArmor(ItemStack i) {
return isHelmet(i) || isChestplate(i) || isLeggings(i) || isBoots(i);
}
public static boolean isHelmet(ItemStack i) {
Material m = i.getType();
String n = m.name();
return n.contains("HELMET");
}
public static boolean isChestplate(ItemStack i) {
Material m = i.getType();
String n = m.name();
return n.contains("CHESTPLATE");
}
public static boolean isLeggings(ItemStack i) {
Material m = i.getType();
String n = m.name();
return n.contains("LEGGINGS");
}
public static boolean isBoots(ItemStack i) {
Material m = i.getType();
String n = m.name();
return n.contains("BOOTS");
}
public static boolean isUnique(ItemStack i) {
Material m = i.getType();
List<Material> uniqueMets = new ArrayList<>();
for (Unique value : Unique.values()) {
uniqueMets.add(value.getInGameItem().getType());
}
return uniqueMets.contains(m);
}
public static boolean isUniqueArmor(ItemStack i) {
return isUnique(i) && isArmor(i);
}
public static boolean isSimilar(ItemStack item1, ItemStack item2) {
if (item1 == null || item2 == null) return false;
if (item1.getType() != item2.getType()) return false;
if (item1.hasItemMeta() != item2.hasItemMeta()) return false;
ItemMeta meta1 = item1.getItemMeta();
ItemMeta meta2 = item2.getItemMeta();
return meta1 == null || meta2 == null || meta1.equals(meta2);
}
/** @excludes unique enchants */
public static void transferEnchants(ItemStack oldItem, ItemStack newItem) {
if (oldItem != null && !isUnique(oldItem)) {
newItem.addEnchantments(oldItem.getEnchantments());
}
}
}

View File

@@ -1,46 +0,0 @@
package me.trouper.armorsmp.utils;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class WorldUtils {
public static boolean notDroppable(ItemStack i) {
return isArmor(i) && !isUnique(i) && !isDragonEggEquivalent(i);
}
private static boolean isDragonEggEquivalent(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("BOOTS");
}
public static boolean isUnique(ItemStack i) {
Material m = i.getType();
String n = m.name();
return (n.contains("NETHERITE") && isArmor(i))
|| n.contains("MACE")
|| n.contains("NETHERITE_SWORD")
|| n.contains("NETHERITE_AXE");
}
public static boolean isSimilar(ItemStack item1, ItemStack item2) {
if (item1 == null || item2 == null) return false;
if (item1.getType() != item2.getType()) return false;
if (item1.hasItemMeta() != item2.hasItemMeta()) return false;
ItemMeta meta1 = item1.getItemMeta();
ItemMeta meta2 = item2.getItemMeta();
return meta1 == null || meta2 == null || meta1.equals(meta2);
}
}