From d54f340e2ddd7f01945638a2f38a950a1266a963 Mon Sep 17 00:00:00 2001 From: thetrouper Date: Thu, 27 Mar 2025 01:48:02 -0500 Subject: [PATCH] Testing begins! Made armor updating not transfer unique enchantments, added functionality from command TODO. Unique transfers when picked up now, need to implement drop notifications. --- .gradle/8.8/checksums/checksums.lock | Bin 17 -> 17 bytes .../8.8/executionHistory/executionHistory.bin | Bin 67240 -> 164559 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.8/fileHashes/fileHashes.bin | Bin 21797 -> 23547 bytes .gradle/8.8/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.8/fileHashes/resourceHashesCache.bin | Bin 19007 -> 21217 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes build/resources/main/plugin.yml | 13 ++ .../compileJava/previous-compilation-data.bin | Bin 57932 -> 61379 bytes .../java/me/trouper/armorsmp/ArmorSMP.java | 17 ++- .../me/trouper/armorsmp/data/ArmorTier.java | 31 +++- .../me/trouper/armorsmp/data/Storage.java | 7 +- .../java/me/trouper/armorsmp/data/Unique.java | 82 +++++----- .../me/trouper/armorsmp/server/Manager.java | 35 ++--- .../server/commands/AdminCommand.java | 90 ++++++----- .../server/commands/TrustCommand.java | 4 + .../{CraftEvent.java => CraftEvents.java} | 34 +++-- .../armorsmp/server/events/DeathEvent.java | 21 --- .../armorsmp/server/events/DeathEvents.java | 45 ++++++ .../armorsmp/server/events/JoinEvent.java | 34 ++++- .../armorsmp/server/events/PickUpEvent.java | 32 ++++ .../server/events/UpgradeRedeemEvent.java | 7 +- .../armorsmp/server/systems/ArmorBackend.java | 140 +++++++++++++----- .../armorsmp/server/systems/TrustBackend.java | 5 +- .../server/systems/UniquesBackend.java | 45 ++++++ .../java/me/trouper/armorsmp/utils/Text.java | 8 +- .../me/trouper/armorsmp/utils/Verbose.java | 8 +- .../me/trouper/armorsmp/utils/WorldUtils.java | 29 ++++ 28 files changed, 494 insertions(+), 193 deletions(-) rename src/main/java/me/trouper/armorsmp/server/events/{CraftEvent.java => CraftEvents.java} (62%) delete mode 100644 src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java create mode 100644 src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java create mode 100644 src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java create mode 100644 src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java create mode 100644 src/main/java/me/trouper/armorsmp/utils/WorldUtils.java diff --git a/.gradle/8.8/checksums/checksums.lock b/.gradle/8.8/checksums/checksums.lock index 4797fd9e4095c2ac1ec39253f84dbd0faf56031e..17750ef6d02978884e66d1bdd3f37fe723cc19a6 100644 GIT binary patch literal 17 TcmZRMD3>v^U4J5)0RqGUCQ1WG literal 17 TcmZRMD3>v^U4J5)0RngdCO`u{ diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin index 039484b51054a86cd0b4a19e49f4f6d7a9131a21..294162160d1f551b73dc15658a7c6476a39ec5ec 100644 GIT binary patch delta 13998 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 delta 405 zcmX@#%C(}GWrBzxBLf)ttYu&bQUWp+Hzw{7pIBfsSyIB0nPCg>QY z;lvP{?#RO^KY8C4waxRkn6Pa>pUuebw7GI>5+|eKWbZ{XN)bs-^!~pK!QVcA z*>cTF09|CW^!yEsjE5%&{?|7tN-fSWElN%;jw#3~P0!5JtIW+|7MLQQW)k&wm5=D- z{$TD;?Y9`a5weUsCLjE#Ck59iaD2yfw)ABm!tK8`zu%Y7_iXZ%g-VROCJQdtp0t54 z4OuILK*gS-x08N(-V+N{5p6tC>G1W~?hkj2b}=$D2;}nk-939MDon*aa+ literal 17 TcmZSP%UL8YayH460Rn^pA+`e6 diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin index b5c7a45643a8e1581135b852ee3a3c523d03d36a..96a88a31cf3cca3d71eec7c11a86cee5b8433d94 100644 GIT binary patch delta 3359 zcmZve2|QJK8^@33lES^ZNpY`Tj6_|@HbN-bcdlJtHwu-pzv)t1Op$TMXk{XzG@`MD zGDf{p$-K$hjL@|uqh%^f;!uruYZ?u%E5a5>79h$^?$u_dwG(T!!9BYov-KgYi6Gn zEja~s--~=5HQc9pJ&}f9Si`2}A3dNR7vjK%K7MUCr`GrgX+1i{3S^l?YC_d>icfYF zY&EdYy%i31@3p9zys}o84bs~GjPZ_e&fq)u{+67%dH(l}Q1|UXJ>^|!L+X+2cuP|a zD0;b~7eRz^ohYyI+Z z-RlTyz&K-}Th(@nLTN}Kob&k3depxPl}gR_Lft2UuNy=seY?k0svYXS#^^nU3(aa% zP?cIr)>nkH4JySn(z4Bu_xUs5HVca0_WTHTMlUQBjGGdn?iYrdF^y!j$FJqKU%un^s5IV?zsV);nKrrxFyquul6GNT(R2VE3Xal#`5s|c9b z6d0Bg3ZTwc1Jj3oF)N~k1#mQF`flCEkoGwbDRk0aUOBX<_@wrWsiGPV8kF1)o%(3h*+JedC`{6DaKtKq(!fNK_XpJ)rZ0T}-6>I|^dNh^ z=@VDs_EU`W3Jp3z)E*^*=z#=P6TM_hS1LFbBes|xsUU40W_*1I=q{iLk5a-%jEYV< ztmAe&#$qc7jDoe3rLzQSbfY5z^)GW0v)Xk)6epK*55hd>^}Bod({1P}{NzcXsxtyOuM z+`2`NOD`c&CIbnr)##X`HMivaq@t61uugPKuVPf?VM)S?=uXouf?-pCl#_Z~L$RZO zoxPYQEg_E)9ot_MT}l|cj->VZ64CYMuqyDRfS>R(w8F_+`Amsi(O*cmtG}T~*nq!E z1yP9u@Blt74L9k|E5*3~yavg&BQ>M1v`zVkIR93xN%B^Cd>gr4ki+e{xKArHBdHo+A3Yw?N5ny+Ay1?r;L+q6u6I)B+tV=} zP3wx``Y6*FSX~GrS^@^r+)JO^_(xiFsfx?psZv>=d6oOPvnDU zgrfFULlcv9a2Y{|{G1yI3DHI{e{zyThqa?aPZZXncjKnjo?C6klk7NF3=y%jf`k4-Z%h>o%;U4!}L&%pL-d4BLwjp z2M{V%kSIJ~#?Cn65Xo%Y)fo^N3kt{f{j&ii#H;uO_wP^R%YWbd>0Xoejc0y(dF>mn zfjQ#~{2n4w*o;VJt+PM(ukrp92Zis`_uAXn^S6ZP_!3_z>r?Z#^mo(44iJ2_Ugsj38b zP1S7PKISk!5yv><{|+^7DS>vl%Zqls;U=RpPV!v0LL$c*lx#sG?atk0 zxZ{LuRvjcnwty#TB8#_2Q0|J}ns;);ksPbRyjwUTXF>ei7hM!YtQY1QI>YKze5;C= vizS$BzzMfbb(n-wDM*z4lq-IrwfP&)rK$EC(TEW-5v*?klcanNM&17bZ>0N; delta 609 zcmeypopI?Z#tkMCj82nlB@!lwN+xVRD;dBz*;iU(@>FS$$zOrAt&GRyxiS+byUH3) z?vpK_Y$`WlGOxVHc-cJ!FR6m-%r_(H_<@W&FZ5xUQ|-YQ~XV4QmPr)v`f7%)WvDLrE#p$Wu_AS|H0 z)Mfh#lb^o#KEI!P)UoL^R7W&W5(t>}Cu@7F)dP+2g$n!t(r8BT|LEJZ#{a?MDITHP z74MsXW`ivahv;CE!PLQ$8Te}Eoi&qQ>YXlnd}QKrsE#hE4sJ9Z(m;169lUtc`rbwT z#n%n2oc2uE2GlZT!t>AfC%^WVQkb6A=r7$-w|27s7q(sI$BseG>xY;p95`9kN0oKL zJS`R3$^Jf4lgoodSkC@zyE(Z(NDs(pXPkU6NRJ1|V1{U5O_}`GM-8Op$7I!DuoAAx z;SdJ*x+ZovoaZ1N8 zh{=x%CwGUa0jpF diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock index 4aa53a9f5fc806b6e25198d187c509f6838ae40b..97e7d73cf3cacdb83bbf34fba05d2bf47f670bf5 100644 GIT binary patch literal 17 VcmZSHRrQ78AlK>b3}C<<1^_sf1kwNi literal 17 UcmZSHRrQ78AlK>b3=oh2063Wh*#H0l diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index acaad409c760ca19f3b8a2ea0ea44157c5974c66..d0e1e8d9cf951d207c230554820f86e992ba9724 100644 GIT binary patch literal 21217 zcmeI4c{G%JAHe07tz?Pfsw^Q{2BE1Yks2{$j44aD5N*7Q$QDYLitI&+P$Vi#BB?Be zvUIZ)qM~c3BHLI7*Syd3>z;R>&bjZu?|XjE!E-+IIp3MzXP)!SAD*8*Y-}R@3+NZy z-(SLiAHpM802Y7+U;$VF7Jvm{0aySQfCXRySO6A)1z-VK02Y7+U;$VF7WjWDV6wOn z9%L~hitNk-K2J6_l@*HzMnPvDUMo|pk3=5UR|bDS2$$*7T21VcLO8hv@W@uDuJlpi zy$Gjr0v;W%t5(s?orG|MO2A{z*EoJSZ{mV*NgNIe?t+%0^7u>-!u59j zikHmw9)c4hHum!f82xcMsM& z@ZqlvqH{C>@8=J#h~fUj72)Jqz(@UgeC)kds}OEv3HbPykz;dZN7E2)_!965qaT_+ z&Ly|Fv_5l(XgeA-q%Wz+3m0y@VYaK_rtT&njy zIS@`c3HXBNbMcN_I4^|jy8+IfY{8IDH3#RL^H2VujKm0R)kf#g0bl;ZpwT51kG@}I zSHK0!9|md@#&@FgKL9Rj9dy1eliG}M+D5>|uDyv|gV#aN6N5g$#V?U!X}?*CA-+*E z;1U{i0XvFl2|8yCaA^z66Gm5;=OTPxDc~|XDn7YkqrC_xQvu(|?U7GUGqppwp(x-= z!;yKC4oTJMe0{)GRdB&X+CDvWzB%BV9Rz%WQ*|RyE)4iqN>`6K`3AaPQXt^l2)U|* z!G7-$-^dT}?GZ5%&81CQ2q&cjzEf7m(Nnd^8}+vVuA^a-gP)K?*JWr8IB`dusQvo5 z7}W0qT$eiY{N+3sSl2SZ_nuH4pACL#g!<)x>vhO!e3K9c?^grhqJ4gc{N74@v7M@3m9hSa{t5ox=^dbp>zvuuFa=!u4rCd7r6Gs6*xg!uOp4{9sNZ zeW+?k6`k`QaND{TKg&;BI}vVR1Gt^~8roY%G#;IU2mEmD$o;4o++Bo|mjiw@QH~u|IGFcSvKY^g*Ul+r z$eaoj<_e1|Z;`KU*tPs~kD=DmVi`3BTY=NV zTFPTR+}IhN@i`X!swR~Ts_tZd&JN^xQgr3Qm{sRX#vgXV?s##Va6U%Cw+|v866RqOaUp*P%i@&3b zHLN=i$E-1Y(Ry$&*^gRxlX<5&%MA1H7gw3MsT-GgMpVZ(uH1+o+GTxu~vNoHOsS)S$EwDI$r!+2_-cSHH9Cw9~tCpJj_&vO8R{#z~ph zyB(4?$L=Nk7!YRP@rx_n-laY(=cRh2W*p57)62h_VP{B2PfZhPo49?a8SGO-+06ei z$Fdfld>KOaN*noBeLdIm^j_xv5f&r-o%kI7ab0K(jp%c$zE2)&M9J;w$XRGxoo()+ zttKipi8Y2N39B@YCFT{hOoeWi8$-R=aGFSW$Vy=~Aw-b8;%ysEb^y z+3}$H(I=%{Wf2dnnEN(ZW)#NU8l`6?TWtT#EBwJ>)i0_SP`$*P@;W~g=}rcTVjj$G zeJnHPX?gp7^14rMDQV-{@It~8YZ&?J6y4_<%#RXZK7L*0}0>bCNAoRCm-R zb9zI&G;{wL%UW#jZuJ-vdemvBdYM|BQ|y5?M0gncLyUWU+Zz}S&e9^xy(cU)j$Rr$ zy|h1IfpJCgWXhILZ?HxNCBe=y>hjG*4=sD+Tz+1x@ht4Fd;hSHt5U$uWRJ(g2e8J> zytHquF7!xJEK1f2zf|!Y}bPa~BB9E4`wJ%aCWp_VJHuEp1HS zb_#3s^^Z}b|7?RT%A-* y?fv5w;(zgZ>ynWDK5gKlu%h`9ZZET}U!3b~?174P7aOy-c6Z^)n!|F;XZZ`ILC`J$ delta 93 zcmaF3lyUzQ#tkMCg8VJjn`Rs^zR=GA2A=wpeI)}XKb4f2>?$QOSyozNaw-r{1>&zj lTq`FrSyf(Qa;Urq&wnUjU|_7=sQ5#Cqrn2P&5j=b7y%&pBj5l4 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 2bc18a410d5ffe37f8d70c626eae930694fe1108..a157a7156f05606e8e3a87689223f1d96748c197 100644 GIT binary patch literal 17 VcmZR+e^jIHbcJ9j0~jzW001<~1Q-AS literal 17 UcmZR+e^jIHbcJ9j0|Yn#05s?XHvj+t diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index d2f0d5c..4625655 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -6,3 +6,16 @@ prefix: ArmorSMP load: STARTUP authors: [ obvWolf ] description: Kill Based Armor Upgrading +commands: + trust: + description: Make your friends immune to your abilities. + usage: " " + aliases: + - t + armorsmp: + permission: op + description: Root command for giving items, everything is handled though alias labels. + usage: "/asmp usage" + aliases: + - asmp + - armor_smp \ No newline at end of file diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index e828df8e58488363fa6bbdb487b3197f6c80c2e0..7c424f833c6f8f5791e24974919fea8f2ef8017d 100644 GIT binary patch literal 61379 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 &maOA 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 G`1`**jbs1- diff --git a/src/main/java/me/trouper/armorsmp/ArmorSMP.java b/src/main/java/me/trouper/armorsmp/ArmorSMP.java index fa7c2d2..3942c03 100644 --- a/src/main/java/me/trouper/armorsmp/ArmorSMP.java +++ b/src/main/java/me/trouper/armorsmp/ArmorSMP.java @@ -9,16 +9,21 @@ public final class ArmorSMP extends JavaPlugin { private static ArmorSMP instance; private Manager manager; + @Override + public void onLoad() { + getLogger().info("Instantiating Plugin"); + instance = this; + + getLogger().info("Initializing Manager"); + manager = new Manager(); + } + @Override public void onEnable() { getLogger().info("Initializing PDK"); PDK.init(this); - - getLogger().info("Instantiating Plugin"); - instance = this; - - getLogger().info("Initializing Manager"); - manager = new Manager().init(); + + manager.init(); } @Override diff --git a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java index 588e3f3..35359e3 100644 --- a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java +++ b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java @@ -2,6 +2,7 @@ package me.trouper.armorsmp.data; import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.utils.Verbose; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -18,90 +19,110 @@ 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() ); @@ -120,10 +141,14 @@ public enum ArmorTier { } public static ArmorTier getTier(int numeric) { + Verbose.send("Getting tier for numeric %s",numeric); for (ArmorTier value : values()) { - if (value.getNumeric() == numeric) return value; - if (value.getNumeric() < 1) return NONE; - if (value.getNumeric() > 5) return DIAMOND; + if (value.getNumeric() == numeric) { + Verbose.send("Matched %s to %s",numeric, value); + return value; + } + if (value.getNumeric() < 0) throw new IllegalArgumentException("Armor tier must be a value 0-5"); + if (value.getNumeric() > 5) throw new IllegalArgumentException("Armor tier must be a value 0-5"); } return NONE; } diff --git a/src/main/java/me/trouper/armorsmp/data/Storage.java b/src/main/java/me/trouper/armorsmp/data/Storage.java index 967d5fc..d6c7680 100644 --- a/src/main/java/me/trouper/armorsmp/data/Storage.java +++ b/src/main/java/me/trouper/armorsmp/data/Storage.java @@ -19,15 +19,16 @@ public class Storage implements JsonSerializable { public UserData userData = new UserData(); public Uniques uniques = new Uniques(); - public Map updateCache = new ConcurrentHashMap<>(); + public Map armorUpdateCache = new ConcurrentHashMap<>(); + public Set uniqueUpdateCache = new HashSet<>(); public class Uniques { - public Map owners = new HashMap<>(); + public Map owners = new ConcurrentHashMap<>(); } public class UserData { public Set tipsDisabled = new HashSet<>(); - public Map playerTiers = new HashMap<>(); + public Map playerTiers = new ConcurrentHashMap<>(); public Map> playerTrust = new HashMap<>(); } } diff --git a/src/main/java/me/trouper/armorsmp/data/Unique.java b/src/main/java/me/trouper/armorsmp/data/Unique.java index d122c68..786cdb5 100644 --- a/src/main/java/me/trouper/armorsmp/data/Unique.java +++ b/src/main/java/me/trouper/armorsmp/data/Unique.java @@ -19,8 +19,8 @@ public enum Unique { .enchant(Enchantment.RESPIRATION,3) .enchant(Enchantment.AQUA_AFFINITY,1) .customModelData(2) - .build() - ), + .build(), + "Netherite Helmet"), CHESTPLATE(ItemBuilder.create() .material(Material.NETHERITE_CHESTPLATE) .lore(Text.legacyColor("&bAbilities:")) @@ -32,8 +32,8 @@ public enum Unique { .enchant(Enchantment.UNBREAKING,3) .enchant(Enchantment.MENDING,1) .customModelData(3) - .build() - ), + .build(), + "Dragon Egg"), LEGGINGS(ItemBuilder.create() .material(Material.NETHERITE_LEGGINGS) .lore(Text.legacyColor("&bAbilities:")) @@ -45,8 +45,8 @@ public enum Unique { .enchant(Enchantment.MENDING,1) .enchant(Enchantment.SWIFT_SNEAK,3) .customModelData(4) - .build() - ), + .build(), + "Netherite Leggings"), BOOTS(ItemBuilder.create() .material(Material.NETHERITE_BOOTS) .lore(Text.legacyColor("&bAbilities:")) @@ -60,27 +60,27 @@ public enum Unique { .enchant(Enchantment.FEATHER_FALLING,4) .enchant(Enchantment.DEPTH_STRIDER,3) .customModelData(5) - .build() - ), + .build(), + "Netherite Boots"), MACE(ItemBuilder.create() .material(Material.MACE) .lore(Text.legacyColor("&bAbilities:")) .lore(Text.legacyColor("&3| &7Speed 1")) - .enchant(Enchantment.UNBREAKING,1) + .enchant(Enchantment.UNBREAKING,3) .enchant(Enchantment.WIND_BURST,2) .enchant(Enchantment.DENSITY,3) .enchant(Enchantment.MENDING,1) .customModelData(6) - .build() - ), + .build(), + "Mace"), SWORD(ItemBuilder.create() .material(Material.NETHERITE_SWORD) .enchant(Enchantment.UNBREAKING,3) .enchant(Enchantment.MENDING,1) .enchant(Enchantment.SHARPNESS,5) .customModelData(7) - .build() - ), + .build(), + "Netherite Sword"), AXE(ItemBuilder.create() .material(Material.NETHERITE_AXE) .enchant(Enchantment.UNBREAKING,3) @@ -88,39 +88,37 @@ public enum Unique { .enchant(Enchantment.SHARPNESS,5) .enchant(Enchantment.EFFICIENCY,5) .customModelData(8) - .build() - ), - PICKAXE(ItemBuilder.create() - .material(Material.NETHERITE_PICKAXE) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.EFFICIENCY,5) - .customModelData(9) - .build() - ), - SHOVEL(ItemBuilder.create() - .material(Material.NETHERITE_SHOVEL) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.EFFICIENCY,5) - .customModelData(10) - .build() - ), - HOE(ItemBuilder.create() - .material(Material.NETHERITE_HOE) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.EFFICIENCY,5) - .customModelData(11) - .build() - ); - private ItemStack inGame; + .build(), + "Netherite Axe"); - Unique(ItemStack inGame) { + private final ItemStack inGame; + private final String canonical; + + Unique(ItemStack inGame, String canonical) { this.inGame = inGame; + this.canonical = canonical; } - + public ItemStack getInGameItem() { return inGame; } + + public static boolean isUnique(ItemStack i) { + for (Unique value : values()) { + if (value.getInGameItem().isSimilar(i)) return true; + } + return false; + } + + public static Unique matchUnique(ItemStack i) { + Unique match = null; + for (Unique value : values()) { + if (value.getInGameItem().isSimilar(i)) match = value; + } + return match; + } + + public String getCanonical() { + return canonical; + } } diff --git a/src/main/java/me/trouper/armorsmp/server/Manager.java b/src/main/java/me/trouper/armorsmp/server/Manager.java index 94866d8..1ec2305 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -5,54 +5,49 @@ import me.trouper.armorsmp.data.IO; import me.trouper.armorsmp.server.commands.AdminCommand; import me.trouper.armorsmp.server.commands.TrustCommand; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; -import me.trouper.armorsmp.server.events.CraftEvent; +import me.trouper.armorsmp.server.events.*; import me.trouper.armorsmp.server.systems.ArmorBackend; import me.trouper.armorsmp.server.systems.TrustBackend; +import me.trouper.armorsmp.server.systems.UniquesBackend; public class Manager { // My systems public IO io; public ArmorBackend armor; public TrustBackend trust; - - // Commands - public AdminCommand adminCommand; - public TrustCommand trustCommand; - - // Events - public CraftEvent craftEvent; + public UniquesBackend uniques; public Manager() { - io = new IO(); // IO must come as the first. - armor = new ArmorBackend(); - trust = new TrustBackend(); + io = new IO(); - adminCommand = new AdminCommand(); - trustCommand = new TrustCommand(); - craftEvent = new CraftEvent(); + armor = new ArmorBackend(io); + trust = new TrustBackend(io); + uniques = new UniquesBackend(io); } - public Manager init() { + public void init() { ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); io.loadAll(); registerCommands(); registerEvents(); registerCrafting(); - - return this; } private void registerEvents() { ArmorSMP.getInstance().getLogger().info("Registering Events"); - craftEvent.register(); + new CraftEvents().register(); + new DeathEvents().register(); + new JoinEvent().register(); + new UpgradeRedeemEvent().register(); + new PickUpEvent().register(); } private void registerCommands() { ArmorSMP.getInstance().getLogger().info("Registering Commands"); - adminCommand.register(); - trustCommand.register(); + new AdminCommand().register(); + new TrustCommand().register(); } private void registerCrafting() { diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java index c5bcbc1..c35c8d5 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -7,6 +7,7 @@ import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.data.Config; import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; @@ -66,7 +67,7 @@ public class AdminCommand implements CustomCommand { } Player target = Bukkit.getPlayer(args.get(2).toString()); if (target == null) { - Text.sendError(sender, "Player not found or offline."); + Text.sendError(sender, "Player not found online."); return; } @@ -74,42 +75,29 @@ public class AdminCommand implements CustomCommand { Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}",target.getName()); } - case "netherite" -> { + case "unique" -> { if (args.getSize() < 4) { - Text.sendError(sender, "Usage: /armorsmp give netherite "); + Text.sendError(sender, "Usage: /armorsmp give unique "); return; } final Unique piece = args.get(2).toEnum(Unique.class); if (piece == null) { - Text.sendMessage(false, Text.Pallet.ERROR,sender,"Error: {0} is not a valid Netherite piece.",args.get(2).toString()); + Text.sendMessage(false, Text.Pallet.ERROR,sender,"Error: {0} is not a valid unique piece.",args.get(2).toString()); return; } - Player target = Bukkit.getPlayer(args.get(3).toString()); + OfflinePlayer target = Bukkit.getPlayer(args.get(3).toString()); if (target == null) { - Text.sendError(sender, "Player not found or offline."); + Text.sendError(sender, "Player not found online or offline."); return; } - // TODO: Handle netherite stuff + ArmorSMP.getInstance().getManager().uniques.setOwner(piece,target); + ArmorSMP.getInstance().getManager().armor.queueUpdate(target,true); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given {0} to {1}",piece.name().toLowerCase(), target.getName()); - } - case "mace" -> { - if (args.getSize() < 3) { - Text.sendError(sender, "Usage: /armorsmp give mace "); - return; - } - Player target = Bukkit.getPlayer(args.get(2).toString()); - if (target == null) { - Text.sendError(sender, "Player not found or offline."); - return; - } - - // TODO: handle Mace stuff - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given {0} to {1}","mace",target.getName()); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Set the owner of unique {0} to {1}.",piece.getCanonical(), target.getName()); } default -> Text.sendError(sender, "Invalid give type! Valid types: upgrader, netherite, mace"); } @@ -119,25 +107,54 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Usage: /armorsmp toggle "); return; } - final String feature = args.get(1).toString().toLowerCase(); - // TODO: toggles - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled the {0}",feature); + Config config = ArmorSMP.getInstance().getManager().io.config; + String feature = args.get(1).toString().toLowerCase(); + boolean result = false; + switch (feature) { + case "end" -> { + config.endEnabled = result = !config.endEnabled; + config.save(); + + feature = "The End"; + } + case "nether" -> { + config.netherEnabled = result = !config.netherEnabled; + config.save(); + + feature = "The Nether"; + } + case "mace" -> { + config.maceCraftingEnabled = result = !config.maceCraftingEnabled; + config.save(); + + feature = "Mace Crafting"; + } + case "debug" -> { + config.debugMode = result = !config.debugMode; + config.save(); + + feature = "Debug Mode"; + } + } + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled {0} {1}.",feature,result ? "on" : "off"); } case "reset" -> { if (args.getSize() < 2 || !args.get(1).toString().equalsIgnoreCase("mace")) { Text.sendError(sender, "Usage: /armorsmp reset mace"); return; } - // TODO: mace reset + + ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(Unique.MACE); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); } case "remove" -> { final String type = args.get(1).toString().toLowerCase(); switch (type) { - case "netherite" -> { + case "unique" -> { if (args.getSize() < 4) { - Text.sendError(sender, "Usage: /armorsmp remove "); + Text.sendError(sender, "Usage: /armorsmp remove unique "); return; } final Unique piece = args.get(2).toEnum(Unique.class); @@ -147,9 +164,12 @@ public class AdminCommand implements CustomCommand { Text.sendError(sender, "Player not found or offline."); return; } + + ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(piece); + ArmorSMP.getInstance().getManager().armor.queueUpdate(target,true); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); - // TODO: armor removal - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.name().toLowerCase(), target.getName()); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.getCanonical(), target.getName()); } default -> Text.sendError(sender, "Invalid give type! Valid types: netherite"); } @@ -167,21 +187,19 @@ public class AdminCommand implements CustomCommand { b.arg("give") .then(b.arg("upgrader") .then(b.argOnlinePlayers())) - .then(b.arg("netherite") + .then(b.arg("unique") .then(b.argEnum(Unique.class) .then(b.argOnlinePlayers()))) - .then(b.arg("mace") - .then(b.argOnlinePlayers())) ).then( b.arg("reset") .then(b.arg("mace")) ).then( b.arg("remove") - .then(b.arg("netherite") + .then(b.arg("unique") .then(b.argEnum(Unique.class) .then(b.argOnlinePlayers()))) ).then(b.arg("toggle") - .then(b.arg("end","nether","mace"))); + .then(b.arg("end","nether","mace","debug"))); } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java index cd6b4c2..d747462 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java @@ -61,6 +61,10 @@ public class TrustCommand implements CustomCommand { Text.sendError(sender, "Player not found online or offline."); return; } + if (trustee.getUniqueId().equals(((Player) sender).getUniqueId())) { + Text.sendError(sender, "You do not want to un-trust yourself. It will break the code ;-;"); + return; + } if (ArmorSMP.getInstance().getManager().trust.removeTrust((Player) sender,trustee.getUniqueId())) { Text.sendMessage(true, Text.Pallet.SUCCESS,sender,"Successfully un-trusted {0}.",target); diff --git a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java b/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java similarity index 62% rename from src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java rename to src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java index bb7e3ab..0396c8f 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/CraftEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java @@ -9,9 +9,10 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.PrepareSmithingEvent; import org.bukkit.inventory.ItemStack; -public class CraftEvent implements CustomListener { +public class CraftEvents implements CustomListener { @EventHandler public void onCraft(CraftItemEvent e) { @@ -24,9 +25,16 @@ public class CraftEvent implements CustomListener { if (result.getType().equals(Material.MACE)) { if (!ArmorSMP.getInstance().getManager().io.config.maceCraftingEnabled) { e.setCancelled(true); + p.closeInventory(); + Text.sendWarning(p,"You are not allowed to craft {0}. Mace crafting is disabled.",name); + return; + } + if (ArmorSMP.getInstance().getManager().io.storage.uniques.owners.containsKey(Unique.MACE)) { + e.setCancelled(true); + p.closeInventory(); + Text.sendWarning(p,"You are not allowed to craft {0}. It has already been crafted.",name); return; } - result.addEnchantments(Unique.MACE.getInGameItem().getEnchantments()); @@ -36,16 +44,7 @@ public class CraftEvent implements CustomListener { return; } - if (!name.contains("HELMET") - && !name.contains("CHESTPLATE") - && !name.contains("LEGGINGS") - && !name.contains("BOOTS") - && !name.contains("NETHERITE_SWORD") - && !name.contains("NETHERITE_PICKAXE") - && !name.contains("NETHERITE_AXE") - && !name.contains("NETHERITE_SHOVEL") - && !name.contains("NETHERITE_HOE") - ) return; + if (isUnique(result)) return; Verbose.send("%s Attempted to craft a disabled item.", p.getName()); @@ -53,4 +52,15 @@ public class CraftEvent implements CustomListener { p.closeInventory(); Text.sendWarning(p,"You are not allowed to craft {0}.",name); } + + private boolean isUnique(ItemStack item) { + return isUnique(item.getType()); + } + + private boolean isUnique(Material m) { + for (Unique unique : Unique.values()) { + if (unique.getInGameItem().getType().equals(m)) return true; + } + return false; + } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java b/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java deleted file mode 100644 index 8fa4751..0000000 --- a/src/main/java/me/trouper/armorsmp/server/events/DeathEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.trouper.armorsmp.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.data.ArmorTier; -import me.trouper.armorsmp.server.crafting.ArmorUpgrade; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.PlayerDeathEvent; - -public class DeathEvent implements CustomListener { - @EventHandler - public void onDeath(PlayerDeathEvent e) { - Player p = e.getEntity(); - final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); - if (tier.equals(ArmorTier.NONE)) return; - if (ArmorSMP.getInstance().getManager().armor.downTier(p)) { - e.getDrops().add(ArmorUpgrade.ARMOR_UGPRADE); - } - } -} diff --git a/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java new file mode 100644 index 0000000..645e915 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java @@ -0,0 +1,45 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +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 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 { + + @EventHandler + public void onDeath(PlayerDeathEvent e) { + 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); + + 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)) { + 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); + } + + @EventHandler + public void onRespawn(PlayerRespawnEvent e) { + ArmorSMP.getInstance().getManager().armor.queueUpdate(e.getPlayer(),false); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java index 83d99b3..1978987 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java @@ -2,15 +2,43 @@ package me.trouper.armorsmp.server.events; import io.github.itzispyder.pdk.events.CustomListener; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.utils.Verbose; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class JoinEvent implements CustomListener { + + @EventHandler public void onJoin(PlayerJoinEvent e) { Player p = e.getPlayer(); - if (ArmorSMP.getInstance().getManager().io.storage.updateCache.containsKey(e.getPlayer().getUniqueId().toString())) { - ArmorSMP.getInstance().getManager().armor.updateArmor(p,ArmorSMP.getInstance().getManager().io.storage.updateCache.get(p.getUniqueId().toString())); - ArmorSMP.getInstance().getManager().io.storage.updateCache.remove(p.getUniqueId().toString()); + initPlayer(p); + handleUpdates(p); + } + + private void initPlayer(Player p) { + 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()))); + } + + private void handleUpdates(Player p) { + Verbose.send("Checking for updates needed on %s",p.getName()); + final Map armorCache = ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache; + if (armorCache.containsKey(p.getUniqueId().toString()) || !ArmorSMP.getInstance().getManager().armor.verifyArmor(p)) { + Verbose.send("Updating armor"); + ArmorSMP.getInstance().getManager().armor.queueUpdate(p,armorCache.get(p.getUniqueId().toString())); + ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache.remove(p.getUniqueId().toString()); + } + final Set uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache; + if (uniquesCache.contains(p.getUniqueId().toString())) { + Verbose.send("Updating uniques"); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); + ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString()); } } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java new file mode 100644 index 0000000..bbda66d --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java @@ -0,0 +1,32 @@ +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.entity.EntityPickupItemEvent; +import org.bukkit.inventory.ItemStack; + +public class PickUpEvent implements CustomListener { + + @EventHandler + public void onItemPickUp(EntityPickupItemEvent e) { + if (!(e.getEntity() instanceof Player p)) return; + ItemStack i = e.getItem().getItemStack(); + + if (!Unique.isUnique(i)) return; + Unique match = Unique.matchUnique(i); + + 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()); + 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())) { + p.getInventory().remove(i); + ArmorSMP.getInstance().getManager().armor.queueUpdate(p,true); + } + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java index 67b00b9..ac5abc9 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java @@ -6,18 +6,21 @@ import me.trouper.armorsmp.data.ArmorTier; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; public class UpgradeRedeemEvent implements CustomListener { + @EventHandler public void onClick(PlayerInteractEvent e) { Player p = e.getPlayer(); ItemStack holding = e.getItem(); - final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); if (holding == null || holding.isEmpty()) return; - if (!holding.equals(ArmorUpgrade.ARMOR_UGPRADE)) return; + if (!holding.isSimilar(ArmorUpgrade.ARMOR_UGPRADE)) return; + + final ArmorTier tier = ArmorSMP.getInstance().getManager().armor.getTier(p); if (ArmorSMP.getInstance().getManager().armor.upTier(p)) { holding.setAmount(holding.getAmount() - 1); diff --git a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java index fbd1e9f..edb2d56 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java @@ -2,6 +2,7 @@ package me.trouper.armorsmp.server.systems; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.data.IO; import me.trouper.armorsmp.data.Storage; import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.utils.Verbose; @@ -11,14 +12,15 @@ 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 { private final Storage storage; - public ArmorBackend() { - storage = ArmorSMP.getInstance().getManager().io.storage; + public ArmorBackend(IO io) { + storage = io.storage; } public boolean shouldTransferEnchants(OfflinePlayer target, ArmorTier request) { @@ -33,52 +35,80 @@ public class ArmorBackend { 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); - if (target.getPlayer() != null && target.isOnline()) updateArmor(target.getPlayer(), transferEnchants); - else storage.updateCache.put(target.getUniqueId().toString(),transferEnchants); storage.save(); + queueUpdate(target,transferEnchants); } - + public boolean downTier(OfflinePlayer target) { - final int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + Verbose.send("Downgrading %s, current numeric: %s",target.getName(),numeric); if (numeric < 0) return false; - - setTier(target,ArmorTier.getTier(numeric - 1),true); - return false; + numeric--; + ArmorTier tier = ArmorTier.getTier(numeric); + Verbose.send("New numeric is %s, tier: %s",numeric,tier); + + setTier(target,tier,true); + return true; } public boolean upTier(OfflinePlayer target) { - final int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString()).getNumeric(); + Verbose.send("Upgrading %s, current numeric: %s",target.getName(),numeric); if (numeric > 4) return false; - - setTier(target,ArmorTier.getTier(numeric + 1),false); + numeric++; + ArmorTier tier = ArmorTier.getTier(numeric); + Verbose.send("New numeric is %s, tier: %s",numeric,tier); + + setTier(target,tier,true); return true; } public ArmorTier getTier(OfflinePlayer target) { - Verbose.send("Getting tier of %s", target.getName()); - return storage.userData.playerTiers.getOrDefault(target.getUniqueId().toString(),ArmorTier.NONE); + ArmorTier tier = storage.userData.playerTiers.getOrDefault(target.getUniqueId().toString(),ArmorTier.NONE); + Verbose.send("Got tier of %s: %s", target.getName(),tier); + return tier; } - public boolean verifyArmor(Player p) { - PlayerInventory e = p.getInventory(); - final ArmorTier tier = getTier(p); + public boolean verifyArmor(Player target) { + Verbose.send("Verifying armor of %s", target.getName()); + PlayerInventory e = target.getInventory(); + final ArmorTier tier = getTier(target); final Material correctHelmet = tier.getHelmet().getType(); 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(); + 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 + ); return helmet.equals(correctHelmet) && chestplate.equals(correctChestplate) && leggings.equals(correctLeggings) && boots.equals(correctBoots); } - public void updateArmor(Player p, boolean transferEnchants) { - PlayerInventory e = p.getInventory(); - final ArmorTier tier = getTier(p); + private void updateArmor(Player target, boolean transferEnchants) { + Verbose.send("Updating the armor of %s",target.getName()); + 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(); @@ -90,6 +120,9 @@ public class ArmorBackend { 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"); return; } @@ -100,28 +133,61 @@ public class ArmorBackend { if (transferEnchants) { - if (helmet != null) updatedHelmet.get().addEnchantments(helmet.getEnchantments()); - if (chestplate != null) updatedChestplate.get().addEnchantments(chestplate.getEnchantments()); - if (leggings != null) updatedLeggings.get().addEnchantments(leggings.getEnchantments()); - if (boots != null) updatedBoots.get().addEnchantments(boots.getEnchantments()); - } - - if (storage.uniques.owners.containsValue(p.getUniqueId().toString())) { - storage.uniques.owners.forEach((unique,owner)->{ - if (owner.equals(p.getUniqueId().toString())) { - if (unique.equals(Unique.HELMET)) updatedHelmet.set(unique.getInGameItem()); - if (unique.equals(Unique.CHESTPLATE)) updatedChestplate.set(unique.getInGameItem()); - if (unique.equals(Unique.LEGGINGS)) updatedLeggings.set(unique.getInGameItem()); - if (unique.equals(Unique.BOOTS)) updatedBoots.set(unique.getInGameItem()); - } - }); + 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("Setting items..."); e.setHelmet(updatedHelmet.get()); e.setChestplate(updatedChestplate.get()); e.setLeggings(updatedLeggings.get()); e.setBoots(updatedBoots.get()); + + updateUniqueArmor(target); + Verbose.send("Update complete!"); } - + private void updateUniqueArmor(Player target) { + PlayerInventory e = target.getInventory(); + + Verbose.send("Handling their unique armor..."); + if (storage.uniques.owners.containsValue(target.getUniqueId().toString())) { + storage.uniques.owners.forEach((unique,owner)->{ + if (owner.equals(target.getUniqueId().toString())) { + Verbose.send("They have the unique %s",unique); + if (unique.equals(Unique.HELMET)) e.setHelmet(unique.getInGameItem()); + if (unique.equals(Unique.CHESTPLATE)) e.setChestplate(unique.getInGameItem()); + if (unique.equals(Unique.LEGGINGS)) e.setLeggings(unique.getInGameItem()); + if (unique.equals(Unique.BOOTS)) e.setBoots(unique.getInGameItem()); + } + }); + } + } + + public 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); + } + + public void dropUniqueArmor(Player target) { + final Map uniques = storage.uniques.owners; + if (!uniques.containsValue(target.getUniqueId().toString())) return; + + uniques.forEach((unique,owner)->{ + if (owner.equals(target.getUniqueId().toString())) { + if (unique.equals(Unique.HELMET) + || unique.equals(Unique.CHESTPLATE) + || unique.equals(Unique.LEGGINGS) + || unique.equals(Unique.BOOTS) + ) { + storage.uniques.owners.remove(unique); + //target.getLocation().getWorld().dropItem(target.getLocation(),unique.getInGameItem()); + } + } + }); + } } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java index d825b70..f7f1225 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -1,6 +1,7 @@ package me.trouper.armorsmp.server.systems; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.IO; import me.trouper.armorsmp.data.Storage; import org.bukkit.entity.Player; @@ -11,8 +12,8 @@ import java.util.UUID; public class TrustBackend { private final Storage storage; - public TrustBackend() { - storage = ArmorSMP.getInstance().getManager().io.storage; + public TrustBackend(IO io) { + storage = io.storage; } public boolean addTrust(Player truster, UUID trustee) { diff --git a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java new file mode 100644 index 0000000..d62c31b --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java @@ -0,0 +1,45 @@ +package me.trouper.armorsmp.server.systems; + +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.IO; +import me.trouper.armorsmp.data.Storage; +import me.trouper.armorsmp.data.Unique; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +public class UniquesBackend { + + private final Storage storage; + + public UniquesBackend(IO io) { + storage = io.storage; + } + + private void updateUniques(Player p) { + if (!storage.uniques.owners.containsValue(p.getUniqueId().toString())) return; + + 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())) { + p.getInventory().addItem(unique.getInGameItem()); + } + }); + } + + public void queueUpdate(OfflinePlayer target) { + if (target.getPlayer() != null && target.isOnline()) updateUniques(target.getPlayer()); + else storage.uniqueUpdateCache.add(target.getUniqueId().toString()); + } + + public void setOwner(Unique u, OfflinePlayer p) { + storage.uniques.owners.put(u,p.getUniqueId().toString()); + queueUpdate(p); + } + + 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); + } + }); + } +} diff --git a/src/main/java/me/trouper/armorsmp/utils/Text.java b/src/main/java/me/trouper/armorsmp/utils/Text.java index 0635221..23774ab 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Text.java +++ b/src/main/java/me/trouper/armorsmp/utils/Text.java @@ -52,11 +52,15 @@ public class Text { } else { allowTip = false; } - Component message = getMessage(text, allowTip); + Component message = getMessage(allowTip,text); sender.sendMessage(message); } - public static Component getMessage(String text, boolean addFancyTip) { + public static Component getMessage(boolean addFancyTip, Pallet pallet, String text, Object... args) { + return getMessage(addFancyTip,formatArgs(pallet,text,args)); + } + + public static Component getMessage(boolean addFancyTip, String text) { if (ArmorSMP.getInstance().getManager().io.config.fancyAlerts) { return formatFancyMessage(text, addFancyTip); } else { diff --git a/src/main/java/me/trouper/armorsmp/utils/Verbose.java b/src/main/java/me/trouper/armorsmp/utils/Verbose.java index defda33..8a10237 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Verbose.java +++ b/src/main/java/me/trouper/armorsmp/utils/Verbose.java @@ -27,11 +27,11 @@ public class Verbose { } String formattedMessage = message.formatted(args); - String log = "[Sentinel] [DEBUG ^ %s] [%s]: %s".formatted(backtrace, callerInfo, formattedMessage); + String log = "[DEBUG ^ %s] [%s]: %s".formatted(backtrace, callerInfo, formattedMessage); ArmorSMP.getInstance().getLogger().info(log); for (Player operator : Bukkit.getOnlinePlayers()) { - if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG ^ %s§7] §7[§e%s§7] §8» §7%s" + if (operator.isOp()) operator.sendMessage("§d§lArmorSMP §7[§bDEBUG ^ %s§7] §7[§e%s§7] §8» §7%s" .formatted(backtrace, callerInfo, formattedMessage)); } } @@ -57,11 +57,11 @@ public class Verbose { } String formattedMessage = message.formatted(args); - String log = "[Sentinel] [DEBUG] [%s]: %s".formatted(callerInfo, formattedMessage); + String log = "[DEBUG] [%s]: %s".formatted(callerInfo, formattedMessage); ArmorSMP.getInstance().getLogger().info(log); for (Player operator : Bukkit.getOnlinePlayers()) { - if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG§7] §7[§e%s§7] §8» §7%s" + if (operator.isOp()) operator.sendMessage("§d§lArmorSMP §7[§bDEBUG§7] §7[§e%s§7] §8» §7%s" .formatted(callerInfo, formattedMessage)); } } diff --git a/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java b/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java new file mode 100644 index 0000000..2dd1167 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/utils/WorldUtils.java @@ -0,0 +1,29 @@ +package me.trouper.armorsmp.utils; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public class WorldUtils { + + public static boolean isDroppable(ItemStack i) { + return isArmor(i) && !isUnique(i); + } + + 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") + || n.contains("MACE") + || n.contains("NETHERITE_SWORD") + || n.contains("NETHERITE_AXE"); + } +}