From 4dc6dd369bd316171c5117b666963317253eaeef Mon Sep 17 00:00:00 2001 From: thetrouper Date: Thu, 3 Apr 2025 18:30:50 -0500 Subject: [PATCH] Fixed being Unable to craft Upgrader End/Nether disabling implementated Fixed Players being able to craft armor Fixed Mace not being assigned on craft Fixed Players unable to craft *anything* Fixed Unique items not being properly removed on death Fixed Duplication of axe, related to previous Fixed Remove global annoucements of item reownership Fixed NPE resulting from unique abilitys being null Fixed NPE resulting from equipOwnedArmor on UniquesBackend.java Fixed crafter bypasses Fixed can still hit players you trust (make so only truster cant hit trustees) Fixed Trusted players still get knocked back from leggings Removed Tips --- .gradle/8.8/checksums/checksums.lock | Bin 17 -> 17 bytes .../8.8/executionHistory/executionHistory.bin | Bin 294207 -> 320766 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.8/fileHashes/fileHashes.bin | Bin 27697 -> 27997 bytes .gradle/8.8/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.8/fileHashes/resourceHashesCache.bin | Bin 27439 -> 31689 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes build.gradle | 2 +- .../compileJava/previous-compilation-data.bin | Bin 63090 -> 63805 bytes .../java/me/trouper/armorsmp/ArmorSMP.java | 4 + .../java/me/trouper/armorsmp/data/Unique.java | 225 ++++++++++-------- .../me/trouper/armorsmp/data/io/Config.java | 45 ---- .../me/trouper/armorsmp/server/Manager.java | 20 +- .../server/commands/AbilityCommand.java | 14 +- .../server/commands/AdminCommand.java | 32 +-- .../armorsmp/server/commands/TipsCommand.java | 36 --- .../server/commands/TrustCommand.java | 14 +- .../armorsmp/server/crafting/CustomMace.java | 42 ++++ .../armorsmp/server/events/CraftEvents.java | 37 +-- .../armorsmp/server/events/DeathEvents.java | 7 +- .../server/events/DimensionEvents.java | 78 ++++++ .../armorsmp/server/events/JoinEvent.java | 25 +- .../armorsmp/server/events/PickUpEvent.java | 12 +- .../armorsmp/server/events/TrustEvents.java | 23 +- .../server/events/UpgradeRedeemEvent.java | 4 +- .../armorsmp/server/systems/Broadcaster.java | 21 -- .../armorsmp/server/systems/TrustBackend.java | 8 +- .../server/systems/UniquesBackend.java | 77 ++++-- .../me/trouper/armorsmp/utils/ItemUtils.java | 16 ++ .../java/me/trouper/armorsmp/utils/Text.java | 75 +++--- 30 files changed, 471 insertions(+), 346 deletions(-) delete mode 100644 src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java create mode 100644 src/main/java/me/trouper/armorsmp/server/crafting/CustomMace.java create mode 100644 src/main/java/me/trouper/armorsmp/server/events/DimensionEvents.java delete mode 100644 src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java diff --git a/.gradle/8.8/checksums/checksums.lock b/.gradle/8.8/checksums/checksums.lock index 5a1120c55c9db082b64522197d62f5953ecd6af0..204d4a81de19b4f4787244ad67088f3083fa6490 100644 GIT binary patch literal 17 TcmZRMD3>v^U4J5)0RpT5CT#<1 literal 17 TcmZRMD3>v^U4J5)0RqebCTRm^ diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin index a1af76cea72d0b9dfef0973f4f324ba51052d107..08884ea3afbc51ebcd7818e1b12af7c402030327 100644 GIT binary patch delta 4428 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 diff --git a/.gradle/8.8/executionHistory/executionHistory.lock b/.gradle/8.8/executionHistory/executionHistory.lock index 6e7a58088263b312cf3cc16c26ec27a736f903bb..4aa7b91ca3dd3dc0237cda05415324b274e8f1a9 100644 GIT binary patch literal 17 VcmZSP%UL8YayH460Ss8K001I?1DgN< literal 17 UcmZSP%UL8YayH460SuT80U_D~_W%F@ diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin index b92adb42112dcddebcdf7cc724c2561b7b8fd079..03d29485f8d00396fdf71f8684dcc9d7429d0255 100644 GIT binary patch delta 2234 zcmZvdeKb^Q9LHzOm>0w_OU!t=T2wQ|jFOV|avF`3iAAM^26?HdNM4d~Ha42FJds*w z%S)>*(lq6?o7I`JL|B!|A=6H>s)I^d+F1L{eeV7<_IJ*`&pprme811{KEL0+SKdb+ z>?dDcX-;ldxR^7kMuzTV%BsC>Bs>!N3KvT+GOIPyu!j`UXohAJN~;sC7%b1MnHrYb zs*;%e1Y+zlmUr!a6;*WjG%?u*vg~tM;*MqI{1S&t#ALK$(msb`mmRo8#oNE)Lc}@ z9X#&5vHMxB2ZHq65cKIQkmc_HlKh>iv$FOFRP{iNAF^n*n*=aRck1Lv^xscR_2dfsS3A z+fl~X!6k04J@5v(^i!UX6|&WHop0;fsrzV6!xzV6uSWAdSiPgTZDDc*p=bmfw}^s< z2I^i9IBe4C2wXc?#_1Wyp;Qwg0o|T&JF>fSU^=X(hT~~m*Z1R)5?9DfGLeFI5)46G z9aB1=?c*+3U{@AwQ#7*(hi>>aBZ#VLV(o3CTKG8a4zbRYw5EkNbne0x2L_3Dw=M%2 zAzNYb7?I#{h$NdtRhwPvHfQfl_gKF7kK!FTJ}~QJW)`3Kjo2LVbRpbf*dVivU!X!$7PDnQxsx4u(0;?XO?zZ} zK=QcJV8$5)(H|jOeJLEZ9@O)?-{ii$ski(K7m)N@z&U8^CEu4J zWA(9f>VyOB*{e=f0jsZVt8Pwt=)R)WvOi9qHgSISIzrKg6g)fN5-P&pth#oX zJM3}1v3tS6>dotVh_#OrYsY{yp$@Qi%qn0N!wCwgZ{G0a+0vQx9M;m$$wqTHUHBoJ zNCH+yJBh*YD>jZBxs-8(tdiXpHSdr=LyZ(B<-losYS5$Gk`1ia@sgzRG0L`jV;vki zKHY#I8h^g+K+BawtTs$J^xVtGLeK3Ukv4`D3%H7@?a55+zBGY1kYql3wBp6@#VIGI zaZ2`&Iie`Tpdcm{DX|iL?DCTxuB4d7>#H#FG!P(19x`WBB3fR=-(iyeX7dcrbg7;x;@N5q| z9;Tm#COLFCYNh|$_*8vhNb=mPJCE-PE5tTLLSm%g_Rd$_<=OO)Na7pYatv#hO zI#>9O*My-nJZU9aep6&ezkGSIzZpf9;Px>OxibF31tink^A*o!C#2K)(oD_^ed)RB uZdh-8pYt^e_&cK&&X<^nXP7@$?rHVjw<<_?sEc^54Nht#B#JLZqxct{zr&&c delta 1525 zcmZ9M4NOy46vtaAtwrX5g0Q;USAmMCV3CRh(ZQ-4P+-(jJ_X7*BNN8>5>oepb7O=J zID*T_#-~9UK}ta(!)++Sh+rr%7zk@k?Z#&obi=v@y8GTES=N)>dv5Og{m(n^+;iW; z998)XwbRRy+N%;eGHEK=tKL-AHI9J+JuZ%*cPUck^NY-_jN3+`*n}&21_$MlpXe(8 zH@`H)Ixok~Fs?M$ogSNSayr+fq)@0eb1hj~3SqQLcoB3RGs<<}%FNnFH$NVErkGqg zg+qGrz)ccj`oci42uq&1R_>-N-dbOp5-Q5BN^oeJVZ2O2PW!+`EP_Ib9c|HnJOI9s zu%S-;HmLp^C44K)T@L&eywx^6FNPhp{TtS$YDOS~= zgWA5L+iMl`Ht9p^dv>!pG#6}EivVPFRDIL1JC+jTf4ytC^yEyg!Y4W1lL*_Bi>Hi? zsellf2y?1VWgO5oW+|Sesm@f79wf3A+<%Q=D3({jCXvO}mqfHCp6I}$?*`qeUARav z*2i8V8G0t@WFpDPUTwI{Rk~jBjbF>}8HPH@ zm^qe2Siff{Nd;>eE<{G5LsnF4QVQu}T z4a1zmywO>ID|^er?Kt{vNQU~H#r-X|!CqsE-ywc8c9e z)Wu(sn>#v?Hz~>1MUUbkBd?hk{&s5FsT!ivNU=dGc;`VFBZA2k{I*Ouz)A|9_Jk{N zQulDZ`&O-Ww`g1DW;aAU-QAerS*$&fx@)?!B_ilP%VFXC3CuT{h2 z2sZe~rbxOZ70I=Jo+9mtkM=v4)5Sy(>tlP!AQoEWO%lGrE8fW&YpLpW{l3oY-bT)L zZB|Hy)tu^iY%UWE+7)#6uy0@`qqiea&)@HgQ<|WePe{tv5z0~vum{|@%63tphx@d6 z_TZts8~=xxk-$w8Ve35Kw5YGkIUD&o{D#Hr_i^aITR?Mw(lnxH@}WMFIMV`96N~Xn zU@pgZ#aCytv;gTj!*q@3u8QrMKU!6n0vrVW&4f?oz3T9fgjtN(x>lG)%# zoWS@rG-f2?yRBf6If%2-FqTQYc1mT;Y@=es{#6;9t5w0VT@Q}F<@EV(JYB8#WBg}< zj9GzSY?#kt1)#hJ$xSu`d6O!qdASSEuW8NRNozS*oinW=!URfDd*EhOf+qKW0aV)z AkN^Mx diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock index 610ab4f7b13d647f6d40418ab0d4fa8fe7915fd1..9781c70a572870b100a2223a399e08557738ae27 100644 GIT binary patch literal 17 VcmZSHRrQ78AlK>b3}7G<2mm;;1l|Au literal 17 VcmZSHRrQ78AlK>b3}C>U0020%1m*w$ diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index ce098b56e85f5c6d7b18c78747bcf89fa5a828a2..7ca272132318bec310768744561eb844b4da29fc 100644 GIT binary patch delta 6774 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 H|90em^}u<4 delta 370 zcmXYrJ1j$C7>0FF23F_)>1nm4txJ3U(;F>kF!dN1#nSY2FtTad!D@49o^&)4iy%T` zv5^>zDh4B)n#$zz55DBdw>dnN&ry+`>t?93*rm(V#X_;&DRapRCZD+{c;P z=XJ_sbK0XfDaj{|i?w9GkB5}xCnZQ(d%RmV%c{h!a&c_MrCq0-mh7foI%$KYjN(Mo z%}8Qd#YVQmxBlgvc5)v6yms=(jL!(xXPOMn);ZGT3wmThk1SMhin>?xU2JkQXVE(^ X$j!S0zyH_MBd*WGtH#BG+ll-EuJ4g9 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index b603c899800e91db7fe22dae5f051e3cbf48bc55..80d64acd2bdc51038992ba77d89faf4041ff5254 100644 GIT binary patch literal 17 VcmZR+e^jIHbcJ9j0~oN00RS}01QP%N literal 17 VcmZR+e^jIHbcJ9j0~oLf0RS|@1PuTH diff --git a/build.gradle b/build.gradle index 866683d..d598ebb 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'me.trouper' -version = '1.0-SNAPSHOT' +version = '1.0.0' jar { from { diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 7975c6b8c3395099ee8b55a357eb72da517fa578..88cbe1a7d464a1a7f408e48c7eaa516a39cca86e 100644 GIT binary patch literal 63805 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 M{4i4{`yFHdAA(`S#{d8T literal 63090 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⪚;NsNgcniscts)l~$HZj2_wq{c7O?UpDfobS2}?$}PpKkfTjc&~NM& zVfc5NU@8@P`^{l&+?iKHZ@Ro!ZGODI{Ri86I|n4pp92|+IspEKr0n^Sc;8<4i-$+v zn&ZRmw|Pz=$0Uejxr0NU!HHmcp(_}=I;#_pKd^C}J4U>4{|;<&2uB>s5$$9UVK5;E z`Hd@GD}DGk^+%4&DF5JG#=y%hH#diKWDy)uBnR4yQ5+yQq(Ra2Pql)SR|vfiFL+#Y zK-Ez=>OML;hGP}WF-~W=LtNKgyL5e8ZG7;69XHl%1O+W|9Fv_KQH!ChQl^ZUFlkgD zuS?j;^>|hTC!S-qi(`_&u}Np_<{%+p{UAh4s1OkEa@`S;rHr&y}q2SF;|~w zTPAT#?qbRG0xfM*m$XL(-1nFRjD4oS1Z$qyQ)P!l-HfeifDujaV` z1a0L=N5!Iovh;%;oi2T6S-VTB^Eg&-*o#QJ#R)-uE0S(CemY#|tR6h-7zdm}KJdk0 z{$U@c8Js_MRxx){c1Gx%#Xt1NIkEzd=mbYx$gwKoP$xNbAPS6uP6_b@KMg2)Yjqke zowME;IKso6I`<7fd97oudjffeV|A7zD&~m63t26vGR2>G=Qc&|$H*`3r@MQc@AbCnbJMOf&iP|G$NC}%5?msWMUs{?Yq!lO z$9x)S`E_+&OVcHe_%cUa!GSt7aRo4fD)S+XtW$qYG55UV-q^d0we5(zTO~(U#evF0 zHO(q8*9t9QIy>>Cd$?QL$y?;17qoL362=gT(6HpcCt?aMl`h zS{K3~KC#b1&GvckY4NeYneOYix1iD_V%ANL)h&*+jzit1Nqd}4)B~;l^OK9nrKPD0 z=X{#qdU}W;)(>}zY~V=maLm848v!7w&x4%BGD)plYu?tfja!map7nftUHSPgM|_WC zd7mSGz!BZWAiQ`;>yq3#5hv$Od;VKoPvGYP=bh(SFIs-&5og6?j`#_OYT{7MAY_cE z93%p4u|^Atp;}SPCZ7Fb9&}|?iWWEsrl!cH?YWBZJkA~7s`9x7^*QY49E(qI&LXW$e`~a9 z^W7p_CX>G9Q13WUn0gNk|JAhUW{_9%nf~*3k90i6+3)-|*1h=y$NVD)+g5)Z7*$ z=k)b^3chhnzjI7}aICj;js3Z@0IuXPBZqaAmCMRw(P}txnQp2;J#n24`L@5nl&2VcrJ*zp&3GcYWr9ms~etWv)we{Rn_B{ zySP*Wm)gyx61h|omrCY>d#PmZ;nGtCUaB1SUbvMm4>_lBk#LY3AMoT_XdIBsruZD3 z+r+jy(3~{MzR1-nm1~^F1(Nrm`{*rBZqS2x-!{al;ED0m(isVU#?QC!Pv=tmxzqtJ zmBFPBa;ZaHn8?*yq&NX|s zz&$>KcQ_0!;ZoxAHMxGrEAwU7N{58Ub8FA1Sa@9Lg6br( zNv~n!oTmOU;Ny~+KV*#?Z={Cen_-&j7xrIRmooeLW86j@i(ARL4EnTCUYiuH+WiES*sYoB*|@JDRl^cyj)f zs3*hyy(@BOVI%;t}SK7c8-Qij_azzC= zaTf?f6PGCDl19U4zcFXVPI|re?EdDR2W;IZUJ2OmI^@Eh4Yyhfn>44CW=&j4 zGuQ4Z*Y+8gYN18sIUEhC*RP379SmT$(pu>W4HV~mCK=YYu=P=&z<%F%6c zxY8F~Q7Z-ochY64Kl|>JfSIo{`v% zc7)ocds6USWk_$o%FjcdR(!?CaxWxj{5nUy*QBAj<{Q#R-9|~XJbpl$!(VSJemuA9 z*vY=|mb>g7*D?)%Z(ufEsQ&<3qlEGFZkPLOv!_i@Ni$mLD15ed@JB9q?M_%G_ksyV zS2E^oQhhJa6;^Jqc0c>P(fWKFbO>3(xU;S9R~H=*+_EI*NKzNq`V-eSi}e|72t*1n z^r2NceF4rw>Y@h2M3#9>30^$Uw8Lh}KbI(z^73x3Ss~{u006Bdvh$d{ILl`}HbM8s z;?V4li9KA&H?DaC9?di-UwbSaw0<_`njV_=Qo7;ctnV~Ge$XM85o@)hS^z*G*;%%5i*zyn?H#%{4%7^Lavoo^eQM^13aTmMmo>&yaqc0s%)ndlB4 zgwLLeM=WyP^%=ICzt4Of5$(Qxn`ZK#JuGsP*kAM`#q8_Sho^);-g!L>=20O$NY+Am zP&0&rT^J9VRcg71g8qf~`|Z;(4N7JhKFz@ot`7Dkl+OP`J=jFpzm9@xYQg0j-naL8*d53X#lvj+1UfCbS&( zYa2a_?{xOlu8c+3*rbKefY7||+seGp%Ou#yMAjajER*g%+nq2`d)5ss!A-Z;y|~)3 zcrQ3 zVA(ZlQ2SZF7lSv?dC@+Ov9eq26g1)>gDePoYaW=lJ$n`+q}pftBz2?YjYZk}ZW>LF zlWkj^tDJb~uLC@j44(8LPrQSf2yG!SwQJV6jxb$em2m0a;?B-dpH3a(*@p8nfv75& z;v)m4s|Kvdf9Wx9<>9h#>+D#EY078Ol=o1O5rtEXX8N)tIu`zMFCtE&Er7?p;CBhw0d(Qk9Q1Cm3zY*4yvcI(^vMYT7x|Kcrw9fdQU#jDGU4bdcZRY!yf{5<(`fj4aw|MAMKtsU})s%@LAJ*M=2li zEFbeMpYTN2xx_Ac}%$~Qh0rPG==b5+i9NM`7jQwm< z!8K?8bL?EW^Z5}ItT5)>HlFMSPkN2>5@<*_RG|Fq9LgZwSMHiyWPG_K#IkfdOX~XN z70;v#Z-+JXte>H-&yn|$XV=Ly?&49Oc;LnAaA-z;26F^c5#W|- zebs1@l)njG7I7;fX3oL32);=qUlhfcMDw9eR0rV%9l#k^wV7sS4C>6I z&ds%~xx6KYZxzdj;xZ8j2g$WCYen`aod#8{UW<5LY~60Xt6H{`ZyV32cJZkMKBQZ_ z`ACTSG>xOX6Qo)YUoCg-9{d8){%{YY{yOfsx+;;sB#Cd8%%}G7sl9witWwbwJ~S+q zL@NByIHm#U8oFV=#In-)Q1rzNix?4gox%gN7pV`(Z2oWXhU2Av5?RLazLk z$%n4hVLm-C{i|z59!nK}_;R^5pl{MUpZilHx=S%~UHqMU=?(0IZ;n-^m86f`lEs&0 z1EPFr7Ub~3L;bJ(PrwKhf42Vww+Ai@{xRNvpyc$q&o^*#peIQ>;;|nm7V&LQ z@~uwssndLjoX!9{A-q&M6KDB!f~hWsoo>(yBm=shKfYCSEF){fvbj~GS20WYR_FN8 zi7bT$9uT@fIQlgA!Gw~ABJ;TXrgi2=udgZNTb$=Z`f&k}`Z+ZYpg^>~H(;53X~vxx z%zx0^m=qWDeJB|@@1r#C-C%oi{INdC5s7EZ`Q~BxMF2+Q1#u#IWn2|Cp=8#T`aU_0 zG2YdJOMKZo7HH6$N%M!RBpgmr!?Z8M;;%>W&qNQc`*BZY0RldbFK4cVy7~NYSvH6KpdiOhAWz_5HIq$MP zru7)PeR$z==F2MfwSzXT&(F4oUgt}1@NH}PqMLlY@CI?OK32OdUI`2XSp8ZfhE})*~as#cjv~W##aUw6OH@>-fnSbycsgGG9T{r9w z-=>i-zRNc&WTmsu(s|14>`Re#vbN$USNM@)_oncBe9QZM=>xv#A>T5e@d)lys$mrG zIO8$!3?9k97v;C=M*22?4`5qu+gVZmgfDC2i<VPzWt{PPi_$m5AyA2m3h&F<4&Ls)+emA>GM zU-BhkcoqK&mz-LZwZXpN#+gaaD;GJhNNjnP0)5=T4T{XTRawz2%D=(EB`y=_)^!aI-FE&#_ToJSIH!yzL}T+IBd)T(^F6 zDSY6K{4V#Z*mr!}_p~W2#6HmAd3ioG_P?kHyyWck8Nmp(g4@h=V^`L>;WQ5RoY z#`y$-pit9wJP?Gx^Hmj-YV4-;6TNvoQK681=2KtzkdJp8=&7gE`gQmIm^EW!NkB_r zh+l!jo}#aO(;hwq{NG@SCsdQa1Bt-as1$M+67gBH>eQ1zqL%g9!Z>_;jl~bXWIG}9 zCtyxHfcQCftyAcUC>9xHb;r{G?aXkGPD zi+ml=)LZT#?3(dl0?-4;Ven&BmgQFC1J+*BJlxZ;GIU??Lq555)49aH>+f6{a7QsW zqh&&D2m$5gP`DH#cEg@m141ezMs7|jeUKMB^u_nAFhYEl9S#d1qo75We5l*E?_Kcj z+s%`2{oyh&fD=JjL=w^{Le#@0q6sJ(YJ3Nhrw;{HJ8=hfDu%H9#EOM) zVHAqI-sj}`;+$fi8R|9F%X&Tf+=7zd5$5+FKZ3J;kEG`mq(rOVv&fKlIR|?X>5D(& z9-yd8QtCn$w3_qqMZXy=U$o!ekd?F9DjbfZ&ka-9>~?sNVA_ zV|?VDyUKAXDTGxjA%;N;xJFA4%4q2MiM?45SMRFIU-n|l*09+pd|&M&OwtL_e!}tq zVR4v|LBr?iZQ#Q>ChZo7_R9;_wZE+D%wsMQbxqAWNSGWVY%>Y)U&L{Gq;)N~sb>zM zcz)#DjoOX2_^5$9avF5v+88qgNeCW9*OEaLi_|f z21vVUAY3HB2FWjOvRvger23C}pEiAt&nG0iaC1`VK2LA8>b`qvSijYKjukyWPS_R@ z(yvT^`~(5EL;*Xi3)%0^df?;4tCYGWb4vn(U{-6ZNvqSgAiSwDuY~<-!MsAkqKJ^4 zB&bsab()~g5J;et<}BPTS9-{`#Xwhh(Etp-jwpc-4UgvtB-|OIB*QEmxpwWBd}4&% zAonY)JwS`_l`S)n!D)e(cPow|N=t8ChrBMpSf9Re(kKh#sm zY=wzExwP;^=$k5I%eI8zMnZCzFi%470k^#2PYs+v$+`cGnYv@&PLF%p)ydn=F8zF; zuz5g;9ukn#JOUY`Lw+#hj|oURmB0W)SD6ehsxPeC9d-Tcksk?7)e)Xg2w5GciAGB9 zNgjCmk4Lnl)!QMOzk?6-%Bso2NVRrSyH`L{itI?*qkpd6{M<}PpAwR1gn0{L`JA9y zK@?#6_`l$}WSVr4)c4LHtlAZC?`XCtGLnEkLy6 zB~8y)wD4%PkWk1JZo!gNX0MGGy>ANz$6vP-(s~ToxoPV5Gp~yFg>HQ8eWp{kxFHuK z-*d0ngxxJ~ig{qsD>HP;v)6>UgOJ8xZ)p2L=ldEhyf<-h_krD~i6!N|(&ik0xa{q& zw}k8+A$m{9J`mJLf*$aIyWxFg7!d2Cb%1{OL_a|BnB18$hgbM*m+`{ceq%~+Kh}LF z#9s*OZi4zsD|!!H1n)Z1MLFUdt9eOdc5J!?twF{E!4Ung#C7b zwZFhLKtKfwKpr0A#0hRK?*LBrJ~eZB>{z=Y(GS114{1*G4-$xX2uy+nkjaGzAa~Yy zfIb=WwuhUq^xC*;_I$}BLGEIsxRs#-$vajUtbrCQaGKn)Jgv{ojHA<5QVKqfG?L*0 zhX?_LgqI$fkK}oZ{t0cp=SB+bud<^ANTeEyub`U-wff$W`eb(WmYa;? zuctp8P2F>rO%Aw!_i)xm;UBSic7s<%Kgo|4fa#7AK*;^mW<%eE{5I*`ia&%4#n7P^nfo!+HEK%T)B%qQ7Fkt}s#2!E# zTG()Z9=;czq38>QBHxZ~X>lwz8TM*L)5f_}ls-k^kSehMz$oXX2|)K%q&8rVdiLW# zH)_fzwslW1@7X7?t>mY}AMH@cwJP%B_z4ysCONg?;rm~kbzbkkUm!gou*(pLnt8-i z9>jJ7yY3ndEdJEjd@J>0%;(t22L+-%oI?U6;14qC$j5`dEq6P833DSY*SC$&6i5#X z;QhlB{6aoC=H4Buk5%6NvwOcfqatozmcTL$&jz@mLIdOaWOHj+xl8EI2m5-Pe;DyW zUUEbr%MsWf6;QbX=%eJpLa4*iGakq2Jv6`7V8upHKcC-gr84i))Dk_@Hn}NZV0&C( zQXrsC&_Y(thIbtc1;5^IfxK^k+xF6Ow=K6!qpaVBwv0GlB(OLsu!LR#yf99l8N5Sn za-Iy{{v@Z*sc+c0Qv!?o?9;IO*ZTzI`1buj7UUdOj57-BH7zxn*jm`33iiw!@s(-x~x=!|*$> zKX5(c`*jzD^!HX8PuP z0+ag!(F1|WLjm=OCK0@m-^HQHILgT+4K;gzZF$?r!iPH#o_Z{>dLocE31Fta5DYE& zJwIcU4Ld$qF==57cByl z=K@i^flq$(i<2v2eO{VxUs*=Xz0PkHh}#6VF9g;}^a~+mpEvFi?2*o&rvIVc@W#>B zr4=I=`{BcS(wBdacr$d~jo_n;Ukc1$31B#`9oPyI5P*?;J~wn#c;sze=KQ>F67IS1 zHLW)tG&7;P4SK^|{Fp3f9oS#P8vY}{uf^0i0<*UQ<97ma5#v3u4q9gr>ngOBj6ycq z?_%zr5_h@DG?)9X17~|xd=NN%6qu9)_Lmu?Xga#$_KAmUdmPrqMSd9CeHSGg!Y&cl z6m12bs|GrDnDe_jK^5t4%{-R-70}OZy_aRJE3w*BRF^ubef9=CBur?Pgr@SzvGb=- z{2udntL4b0A6aQ*Yr}=sH7FFllJj5Y2)^C%H1hrE>-L=-9wC%Q3Rgr4Mfo^!9ETua z>F+CTd7VY~at78NWwpu~%rBBD6ouh!UJ*`ZLLAM^?JH zj$V3Dl^1n;SIZbts?fHHp9WXMAUd=jpgu(|-PW@5LfHG%)|3;&JY*M}_X%y%h2s4} z7=$JanSbxuEj#32Y6ouo^UpKw8&+oQ;*-?ufs7#@w@$^Ex-yiujeQOXS7Zp69u!iC zgfO0y3D81Z2>~3j6Fn@1?1wJ0l6LDaPVWEbz9(eTn#U1mrYf?8@Y-3n5D9Q1sc3v` z4Gd)Y4Jb}{^~X}q5uw>@JOJ8|U9tbP_zd2ndH&>E-^~w|IYP^;%vgf_!^h?pm-*D5 zzZbDJu|GNKsL(22mF@m6ZKhu0se-897eMJ$k$;>K}XFT$8G)n z5a9BTv&009^>q%oLHJBb}g=OQ8TJNJ*r}J`^b(E~GOOS|?4?O!s2W_3$r&iLY zk6pfB_*zJH(B{uzqdPv__4|!8b^cnnfT*PA>W{ZLWR~lTsrFZW{Qg`j{@_zwseB_e zdB+0cwx+5ZYzOQ;@wVK{c!a-M;9H^Wolq3Ur4!VpKV0VKx}2E*tupS;+@Y%l-d!2`!*|i<8IAu|Zn%ty;A{ z-i{;cJM@##u8>n8Bnuf|)@|Fr;zSr%wRgg*FDE|>t-c7YyM?AtVEm(&_Z9d8ld)u< zOABHa9{N0g{#_RK&1FJD3r0EyOfTDT=lI6W@k94~oLGSO2&D&z8$xnkza6E7-NHek z`lJ2E7fm?-O=wn6r?^JB+vH>4`%nLL3cKf?f z@=Ke;&qW~jdutH8}LV-qxNL^2MjbkM& zX8%~}X}WBymLz`*GBVy_WKsa_&|o7N)PdH#lOd-GNNN-^`%I3vJ%$CcL%&NxjKn(` z&;=v69jbk$`>ayRmq>c#H+MDj$rToIx6%CMn)!{@es?n>{s}dr!i=bJBbd>MFhYXi zuZelNMH(Stx?eda2*CH^Z&=xTR=s* zeedJa&7A2OJH|u@#ST=u1sN2tjkF*rhzcg%B_SXsARs9v4bm;rjWnVXiqgV=zuf!z z{(o!TbuV|#JMWy_XP>>F=h&p6`NcETU0_6jHABM^XF z0LVyZps&Ani3Z2DLv8#jKig(L4c`y3qVcvbpoo~K5VK|LwxLl+C z2G6=5l1=ODWjV-4<~g5-Ht?H zJo0bw0=s8Absqa1?C1M_U1jjE@ns)rcLCJ-^rg?)d`m=0=n?H@<3qm>>n|kvCfHUz2-gTf!$w5VsP@YIKcV1 z@x8-gfe;<^?A7gYt!q&#HOT$1xZNk=IGj`mdpr(Ht*pkI1703rB_d54v(nyeCz( z2+26+dmO}{H^XOcyR>h8-;>OBLOHb3xBPKt3Ql5>uU-&+mV4OF406)zx<4m$+8ocG zio2MGld9tG6@+X3%WE;j^=IFnwcyZJaDH24nvPTPzQV_97jmx)uz!YKv_Wkc`9jPB>)AS!^de;{In z4LjFMMwNndPa|FJLZf9LS4=KWG7l${k5ewdF$-~!5FF5P9XKhr5sp=igVXdkR~i>urc$biDSh1Y8KubayL)g6j#-Lhmf-+AQjTpd z;22^Yza$)tiFwH>4XJyT?~jEn)UaF6Emq)wIfadt&P4P2%)XR6Q*Rzo=RU?);#gHU zscM|u2)IDlwGqYB7mGZMGWZCh&++~z70qgJ8nrl;IvgO@Zu#)RAZ&{*Cpk4Av3zmQ zKlq4~zghx2606f_&F-^{8#l466em_z4RF;)qqp56KsS5{4eB*?FwPkX4BZAyDVQww5w$gyIk1O zgkv`2fMU=B#>@orkh`;3C zyC2eBe=m&xSwDtT>*o6gHq=a4&+rivcxWDDv~9nW4sTX_5$1=GMQ_Y!S)*` z^9Kjn$~1sWq7R2@OfRLB;g}nZe6jc&Vlz0YQFb^f6ln+K`Fwh1La#)g5Sc%oGK*85 z!^t^wz2uvR-!_CRya_sOJ9ps5gqHBDdeM6K5RvKyI5e;sUV2Q64uJ|dw81E?6j4)P;idmhsH z3pYIbof*DeEzJ9-Edp?u9fB*3h55gM^b*%Ce}ih7sYY+oi3v~Dd#(9VxY0-6lDvDi zTLdo3kGh|y+aqZQ1W;T@1ZpW-ck6NJpr~^54u0JP?@bQA?*`=?JJ^v~!;=L0*a^x> zpYv0`*=-M;kc2a0xge%1f{TqCTI2CQouJh)w4e{0J6dC7jyTR&l;udi^boJGt6>kK zWP2dFR4z{hj`?ax)9zPKX10{7(*b!>kejZ|tQTVa;`WAy+&8_85<A-jz_|kR9{8o&NDC=E$-mDlL2BHpR4G-Nvr%Omrp!fhdhGl4!Qv&eXngru33r2hr={)kvfsg;d@mwN`dFK6mzL z>ueh1VAhlQ|^A16VBMxCOG)PZAN@I(Mfdch8bmT}O zU*ta!b+R`2&dD1xo`5ja0s4=kd+?DMs5Dsp);tq?l# zQ?u_2pKw&^{*{*Elamd}NbNmROF_(31aWW|ZoxG8!GCGifbdx8N_U%`RUwOXd zzQ(+CB$a_AKOkl%VrC)m`9HE{qctwK%nbFlz)qP7<{*HRfhdJAN*lTK>2c|e`STy` z_PB9fvdTqDje@X-(;Fn>|FOkgyVE0AOum~}W5fJ@KV06HPfra4^ z^T<>&V`9Rq;z-YyGi_p}NU98Jlp}=-Bvpx+RR|cd)zDB7(ZRIT=)s&(yO6sSS6wFtm7bub*@BLLAH>}2eCe9!t8!}JbS4o9lsLeeJ$5yg7gf2$G2 zL$KT?6Izc(%*-x5Hsf&lRR37&Gg4_l5{(G5luhs)rdf#XaEuS+zr2GxT0Gj6a$P-s zU)q>Kt1$ZBe$>&4mfm$~jYIKXX_|R6VzwY=D}u{t5MLXNfxZQ#1fhpdFCNWT&q0P; z)2g4`k)4ccNAevA;zOM<28QMaGrWj%dB&4&`KUx`r;xCgZ2Ipm#Oy|3UVETF5Wq59 z&5f4_ajNKeOt1hRfAYa_r`JoHy(3rClnv~o zdjyeqRNoDHwy>e5Tk_c&1NlR3eCW>Y+1{hZ<2=umJKe06Rg;F0vIjfFD5hToY6t(y z_m@7&>V2%8vUwPm0uNB4rJgCfnIzmc&u>cFRFw7{Hv)5j7+;ZQ0NWV!-qcu6@Ei0I z)UztBLKwH{pQ;Ayht>2N<4NnJx^m&ygFGU58x`==iiP`E}}rwT%Nj z0Wl_#>=e=nVEYLh6v(9*Q=t<#+3Ckoo_c>SnD`{!?IK0ol|#+@sey?BBD z|Lp}V-1EbmHisNC@p}?1d(3{^H7Y|8*(>U=J1*b1v0}bs%dKKPZfm@f4PM0-&$PpX zCa^so5>3OFSqU``}@HKrm`??q*!*+K%ie>z3?A?{D(*#ltrC!~ZWa0Hg0AdSN_VW#-w} zYwibG7f&F5joTwQ^C8&?saa#> zU+_zftGvb6f%Z}SLgQY$AiUgf_GCWfI*=K3d+d4T{j|Yr?agUBUgKHaya0)(*4^bF z^xLQBA3k*XDEr=R!T1XycxEV`8HNW{v~WD2uUEA)!1)8b>>C&!6HEaO%fbVqope5Q z2dB&|FV$DvNLo}j0xuPbm+9n=g0Eqmk-M19fd!w`?$&F4{oJh$LZA04z4+w$7OxSF zSLwm6I?(5|wPX%#dVJ5)h!lFZLxj%`kjj3WDRPS=AMTp{bH{hDaK?>i@M%{k6!C7*{T*)Vw+t zAIF=0_V~aRTpXSiE*uXF2<#?y{?$%xCVk&_^y@xF_hSCH_srecktXI59CnLXas^?v$vies6U1uiMQZ%K^JrQt)s!gSjCbH`TRTuuQiP`5vUa z)@CpjuU;QFl9Ne8_du4PN%P~cl;gjRL{7e zn-2v=xvS@h3AGTF4^$4{e{?ewTUS~CTUUo5;WX33$NZ|YeEU_@^FgNHZlP?vS`J=4 z7thGUOXlOHi-fBM3ZT1?4}{$H5*r|#I_o>DtSI=nkh`~PM#*84g?NpRct-hZNNKIX z-R#-Wu{vt{jxu?UE%ilsnPR+ZF-Hj=7_d5}u-bvQj*h=ovy5jmbay$HS)BU-U);rx z+GLKawiC zJv=#QFg*Wd&CK=vUvDxLJR0zFjd)fQUUG~#9n>~qWAwBc-MzM7yLoWxTEK6apydQM zv^SEiw`~8~8oFf@mz_)H}~nZ1FcV&j#SE zzdWD*e97C;XZd9J*iwN{QWu`tjR!JV5(mt9qg6nBw%YbtyC3vzcfA&04zeS8ZH;JI z(b8k+X;c(l>~MS!9wc{rVMG5Xue<7#%W7M0n*U&N=B7od_=XKn>OZg{jrBMBl0Q4N zo|O<*uzFZ<`3s)ahX;ynKWw{IaR97Ma6>lv9$>*=<=#(s6Id!RQTZ}}hn&|SW;B5- zVGjP&xcrA8y{9sf+FYQiFFSeJ?L@`3kY z#Tz|Pd#Eo^DP;}5{+dbGC|>d_o-u}3sN{J_@l`2W_g z7@QI|4H>LLM{#eGs)#uZA=5IXsCV#N~1-c}<5JH2;Dy}6PS#aoK_WdbdPp z@bVdgQEVtSZ$p5wS^KqZufsfV4V6yC;!xbjp{ljCu;0(f%WpdSn!96$s_+>2Ml^5}{-aNiMkZ-E3 zN;@dmzjVaz2UB*R*pTrOp7|FKhx9UZWEDINnlaE3<9(T~cQ)$XQ|t0R=hgSRXa%o1 z!1aQFoxi$ftD-16Xp_HT#ZorEZ(H)ZkA5BZEUgJrHU!Y$`oRx&`$@G))r5@vmWBSE z6HX<5A8iS&zdXRDbsV6sAMJ^H&ucMrurS=_bu=gsFzV8ur}^x1V7Ml)@z<`iBLK3s zSpYrrQL%V@^h52X70XS*X+`Jl2{H}@#Sq??Z1LQvW$(7+F_w*?UdH#ZJiXuLjs(dv zjE7SE|F@bt^_qV zf`U7N;X%;wslp<0s6gl%lm8X&`fb2<-iDmu0wh!VC)JJFDXbfBRbLWVOMIXs;O${$7(aFE7&DJ{ zzqrg+%7Y!ns%PE&7L%U5|HWy!#k2%3AHq3b!nr99Yu+~qt)oO2p3FJMoVlp9&*?jj z;YX12CuqDPFarqSx&^{7-iJkZ-|((r5CH?|V1I(6xqHpJYu|6b-&ZK+@>B9gSkP;N zbTC0Jgur?OM^`8TTOI}$NFH~^^_#r1Biomi@FKRmyih5~EpHt8ad=O+cc1?-E%2`X=S&!E3yt`6Qw`gUGIXA@d|l{McGWb)a7 zKxcGJ+4T2*C9mc>ONq^G{fr2LdL%(3ilAQ1@s@ay@Fw%u_*j5a3_WD^N$Nif@7l^n?gOjQ7UniejUv-#nJz+F6PC ztrJ8=5nR)$YU5mYd=FW(0@iMNPkydXl9Mt0+dYYX7GGH!+08VEr;Xgz^ zc1cA};k)xKHOsE=A?~}JQ(`EdhCPx__zzco2>h@ms({g>|O{R56^>4taWiwP2M1WKSw5V!-i z9AE}odYpWbf+_eB|;N0BcOC17b-M+RHD!Z26loO;X z2yl{C!X#MS0xzx#n+;=&J0>Wnci8NpkXYT_5BV`y?miu=Ca`J%2&ixYvmfc3FpL2+6u%Ob#t0fspoIcAn%Hwb1!vD2xjrq6 z67J=Y68T2B_?@8fgK(~i*PcI^a~$R$!>z5B8$wdu0ou%Oy_x-2ck!y8PwAc@$h?P4 zrHnE+W$j+>oqMgL+^zO~`!z|BpCT}pxdaP@knCR*+!oMHg zMT%{YS;K{O4}!m~+4))4vu%kW>49OOjV|~xN&l>kZM$*i0U{!?zu2N&hDPe@8eraV zxXaX5o4-`KPx?3SS2Gp)RtO-;Ga-b;%&t7Xx!vQ3(4L9F>V0I37euLUK5OFtaR|)N zkA3|c?R#&9cV61>`p>fV9vdRdmZ%8wrbJK&Gy(~xM>7QE{r>uI;-K6_u&7NuDZx?p8CrUaH8MeY$lDmp$wxBx5?#8)liq8A=E4DP?ge*UfR_n%JZ{ctFNxKDq~ zR%gBXn)$%i?cG{o#EXprg8~S&YxmaJM$Iawc2nb((iOH{Gv^%g)+ zL-rQ>7hc>UTDkvohhx#TFm|+*-rZg|CZZYk^F+z8mgc!=qDBl+J(kFPM+6W;9P|N{ z6#pf=#1nx43}$k5NyAj`mTPtH+B46{qQ-ojo8nB(<3N`-cpv)tJGtu0J&WAx`s(Lok&4Gdo-pu4;|vR@}b)IQFRMBIJ;w=Dd_OeJch5gF-3fO2QRJc5slvGe*7q^%nh_abP zi7X=Hqo80mjL|B%T~}v>2UY3BuhYwEii#QK$+)oZxnd4cx(y&NXoFyiZF`-6bwR|| z$FDx$D9t4*g>X&tA;Q^<^7~DRcAYbK-m{mSb?@gz7dQ#+Q%h=V9ljAHG{5O?%_E+3 zAml@1z~x3_^2YAZ@0gV~78>zrn4alNWk&;X?7sv*`(=EsQxtJXKYp`-s8L9iDdtFH zvk^uvI-HkPn2AcHk*pI-bzk~E5+&RDVApIvZtC>wvnIXcr_YAr2d}z|U{??!TVEnj zvieK6&~wG6E81<-@8;bM71<8NRFx9Xl@ZlqIOh1~`A}=|!?eHh_N>VRg(t0ceJw60 zsyYxVh>*>}uFS|zxPFa$PTeLk%ezNvqO%TF5*4b5z!d7m(55$&S(imN#k%i~{^#J5 z-?2kZJV-luue#Mr()osK?VVo@K7FhvO4eYlsfDpM05UxAkLqA;0G`_1K-X9g*=?gw zOy5sB^g^vgvBfht{u5EYmK)GQ*S8WQ4zQ_i7jHIbt#NNPttVa%VEYWsfgaF2qM9RD>I2P!%7J|M~YrqsLpi2Zy-30I}22f%pdZt z3rIuHoi{t*?Uxp^!eJNvp!$B6)~nSdh%G*_@P3iPX8>apfAbcYQOQu>IRX={S>)lw3-y#&@saPO}~kf0c?Q0P>CHaCDcB?c-Fp?9r!0D7v(YxzN?=6lyXtwO z!U9n)Kxh#Tq=%5mN0IV9`NxMD@0N(nzeK>ZEJHsqp<(brp&!w0`*Ly3 zOP)&(Q)YKctJkj(m0yq~tx0k=Bz0So#0_Z5+Mb?NaVA}KAu)pZ1zn-yB?em3 zL4u1}4TE%LrELbj`CPtcEy==&Uf?0HbhphoaX^N&OZU$;HjURD53_SL@S4>&ba=nm8WvQYs z36_i>>Ay8~P!FkGntJ!?iC?uq){o!j*T4DuV-LLgzXxuH(&_L1}=iBCY0otQyiO%+3D~r*S8P$-JZS8oko)bipd`)7ct^%Rw_t|}sx!}}x z>Gzf%)$J`Of=R&W3n9T3(9jrhT)%Mp7-6vRSz?yT^t!p3<~7Z_7!M8>83*;DAsQ*twcq*Nhpk3@8cn+BCIq+E`_2#!n3w8kagQi0wTvnnsdJC#k#uEZ|btzz1 z#fIKtN_|XMP_x;fY9WdFkpzL}A`(_pzykQtFeQ$bx1`s~a$orM=w5`q_IuM}603y7 zDkVvMK*BTJ?QBT!w|H4`O~T!{lLpNS*$Y`^B$aZKbOlTSNhX<19t4*1*%3+-QSkBH z2;v7?mbGhsRacQz?DzpmO;ss;_;(C1q^2+);Gowj{6-Kptej*%+%Ui9zRA*j1I7uU4Zkt9En81*En&m=`pcHNv+L8s%F zY=YF|8Y6~6Ms>}^Bj+1P7aK`xO)x+Rh>zn0WYOKIs=VdJi)Xm(n9-Vl=9)=r4ulq% z`Tr$mkn;KL_nB?e#lmwg;_n7h{98%NZ6wKdl0pZG*-3&Balf#j9EJx)d)Fy>T#~Q- z_{r36LucDucNexpyZ^UC59y(|=g;BFKjw%FGh`&_q}<#nc2p%Z#27DEhQdduGqXpY@HS(gB%9w>=2q10;n(lGG4M zb(o~+BQQc*V%d^CRLeK87N`CHgA}lxQ%5(*B`3JOq74B4{n7V`RcYaKq#%n9gyg5#SKO?f1}o2el(#0!+mJPE$&z+t zrahVIK!y|65h^m9+`8|^DdlhTyLY z8G|W8`DaX{2yOmn<8hNwt!IZwwmUDIo2_#ttGJOh-gC&FK|JM$<|FD$4K388+If{; zop2}1d5|?c$&7SCV9Y{RBSXr${LQgzf#2Zpn9#s#r7qNVuj}V= zS)-ub^0vx9m)TDK=0)M&GP=#zZ9)UTycpeXuSffzVM*)K=+o|kzd1#}XS&v& z(BygB;}B2QC}5x9MOHog9H00tKX%BRx_JKBQ;SF*lvjVMF?;)xfr(D`VgBq%Mgmzm zk<3aWGn2_6I0*R1_b^46*apDupy7rNr5u0THz;H!)Gh>uZeE*0zL-jusNxRdhNHK> z$tG6$-lLi2r+2>Y;F0~FMrOU{1y#0f8Y|QM8!d&Fa?fi{SaXoG+Qxjghz(vheYbP0gtYa{3#(z)pB1!yVZG~k?m`%48$M&{^d)K zDJ6r8QU>#*YY7W!>d4jhsBd?@?$k?34HV}Xmy?+lWRO&8&cGKVk4P+3?Yb396{ZA+lEEKx^wK>VDM>OHd^rNEM$WhrQvPv^qqJ^v+&QZ;a zp?5Cuy*7GD)_6P@Yj|sm$DgWJvPv6Sp`EM}&SA%8kCE?6_KO}VwdrHK{oP56pi|S) zLDtB^fU4eaP5%iTz3bJmvYMeHuK zImM=KvPKVCqnE5ui2&XNzZ&b5rN|pZ*BHO096D=ZN%%sBFnu3P8`P2pISuf-@?r!x zbbX}t&k%NXF=lBKPT}&toUD)}yMt{Yayz?{KtfI?rJxFE_k%6xC8Kcn2 z6`tY|HM-`%YeUvZ>0|ec!(_Dqu23A3r^e6^9adCGG>>ZE;+3l1%Yh;`%sB+yOVtsG zlwS~Nc<(*}3y2I!v#&4%{}nm>_ZDM&O*!aqiLQ_EvPZnbDZjEYvc@+u<2zaU2N}TK zay7RsjZ!wP&l?ighrMxXA`%v4!{BfDVH8$=fv>_1LKk zl?E+6)p)=&MV9(W29?iW*b+B4G?|9~LU{cyTBk9(=f%w;N)7X}*Uu}Ni@(XLX(SMG z;q{!~rg^bt>;4eCErz%D5Zk!W8rESJ$=K`Oy@b=pf0<3a{6l8WkO3_+i*2=4$dA|4 zq8mHM-%r0?dAYXMog6$zR+%TOEs)_-4Z4YE&|VFx=Xlfno<#p`9Yan0`-0ig)ikn5 z@UmyC>G=V z?@s~QN7n^j2XHGbeXJNo{x>VxD+xj2K{-#4al{;tcBO!3mm3AxO#i3Sg(}RS$GhJ9 zz;VY}Z=0Hq-WqqxMGuOUCq>$i3rf*}`537+lBvE3hQ zCEG{aplIy6_u(c5A#VyR2nP-aZNzS~;wiC%HG>H*|Kl6>bqJ;cgDE2p7M9?`9O+7urN>$tEGSb z-k`N@BJ=O58-|bLtb-_0uPM^eY{8T@wwAh(%lYa#P@GX4Qt?7fi0DEoQ!D30+RcL;?UN`WXx7z{JWc7b<^MLDz@p1l$W?N68AA!k)xY&63u%r_KR zt{7=y?sTcMhr-~+(0@$oJ3jKtM^MxQ*di(5NMJI#C}AJwi;S-Up37#jql&IfzD*Bx<6hODd!qol$s9fYK^;&+n&MVssFLzTm z&R*$xM^X900j#}i&Ie|krq1YGptpY)RImOg4*PEW|NC7XWGB6a^y+-gwm(I~o?0 z|JCk=)Pi6h1@eVhbxKSs@hu^mkb^PDUVU%SN@CvM<`ldrt+a7Vb3O$^odwwLxN}zz zQ+Xbl2-l05x-%qMD6dLY8^XQTjZkU{ENl7Pv+lbKU0_u6ku&N!oUHj0*i93qAK2s_UrA8f7I0V zr$@+5q(8HXBGXI(Tzd+7R>>OxXH-&(i9*(Qs1kA!F1D6;JoRuWGK zJa^v`!pK0Q{2*bgR$X#bT-ZkBQq4zEwoVGGiy~9Uo5lt*=&?6MQ=Ut`P8T*3j<>%) zb+ely*+XHB3u5PPmGJ$!{xx263ixAIX(zvC7qg)om0y!HyJK~EEnM18sZAd4rCj_% zQSYND^izPcl*c&$zpHNojICAfQs#yS@4m^i30MS++{rO-dsfYc4xbg8m@4P{{B(IM zLy~nn?>9Tjliu00Ex*DeOEuS^|A>nHAhxSvv*jPIaBdIdOS9-#4=ItXS0AEi3{#{> zC~Bh=i!RzC4~Mz!P?mwR9IFFJN^syO`>%n${_7~f!)Zvof_UgTX;o)Hyy zNPkP%L%9lJ>kp-ed`|-6>s7IJ6hRsc7|*`WHphT z!O}55`D&b^IziF&5tyW4ge#*dcr(-}H$#7O?hO15PnA1qSD2!+_&)k4MbnPs7mNTX zt-!~nUO$c)4F0UyEMFA7cXILUYYyb(y|C>A<1ps~3HsK&9b0*(DXiZV#(NGdtzF*0 z6lqSqmV2}#rL_6V%-%l~sTm675N7{dxsZv3{LKeFbx~~*r4(JOb&sy!UU>AC1LbuK zT6!{mseh2$qI=-W^RsgliFpch0Y(w(h+}y+y%Xds_;r#w4>eoX$sTTDU!w{iKvEbeP?;^mmrFLyzRC0Cf!S^ zd}iA(?|MzLrh;{{q5jW0K^{)ua8#*VD{vRzWeIAv*70#$D$9<_vZum+cc4Pt&DanM zqkz!wM^HLL-fm}i2wQsZ@gBUvR`6TU!;vcKL_O!sak#GW5gvO-X)B zh%;4vfE#4j)SK^w_SR;v_xQebJo&IrNGbRBYfnG=mnc_nr%+DhE-OYJ@%sK_EN#4*x>;%)J?{ScgaES1)qCrpmpf z2E%avTcHTvjCgz6o{V-3YVGEuY2M2__AG=d9ZHo7qcZ$>py+@F^0oI{e?~HnZ&cxN zNl{^|UO1IC!1aa-yvTop7D&JE_80YTlU?lAr($4QTSUd&U^ z8H;slw47>@yl1(o;w|-JG*zmJRKW}3HM^(3Ja1b4 zuvOiV+qbzaBqoNc5=)iwzZSruNm`b1mY`_h`X7UwEwF!~CJcz54k&!=wOWV1R#Al zTR&54TQH$(GrzZpT0LdomB1-3>%8XoppXYXA;-n%s+AfGC=Kpf&lY%-}`<6rd7SNeCmBzwEv zE}%k1l0w)_S|$&)%+aUXhsN8GdcdKhclYu;`ow*tDi=|i#Z(|(LWvZJHt_#(-}gvg^plAGPnC{XHxe zSwoeorOMY)Wj;}r>#5AoRAvJe>bW$+9sv9`=n$Ae0x*GBK8g*(@F~4V&jh<^_FE(i z;iu7cQ%50^A3TYb^3g$u1Ua$_e!}ivNE2a)c$IzTTH_WH_=xcMr*TK}7 z_@fnJ5823OW$yC(5o6)G@hVdu1E*!{0AdjXo*}_F8kn3AobRZ@TV6 z>=(^bn)y|=bkznnG-+M?F^X<2botj+r=q-O$9}40DnFd)4Jj7$feP28R6gfB>WSIA zedj@oI>Y~bkojBD)f5^eIJ6~yfXW=CGKZ*8{9yAi^z_l)y9c4!XR|IVHEMnEGAQZ& z`75vP=Lq#;JrUp(Y_zF)^}Sk#2E2P8GZk8_N2&5(sjM-oY%|q{vtAg2khXrlZ*@CQ zW?psP)w}<+#pZ8R2$+52Mryy_Un$azwxn?iP4W|E*t&2?Oh;*!e44;)Rp~jl&nGtS zJC*f=${eRc*b3@?PQW@%upn`%8oxaqcqO$7tKN>uz8ZI+|4!x%MgmIz{eAv zSw9}}-WF}X<<~gV%ftSY%KU{*#WcL)0RWnSQx1LFCdR+@qfL9`sT$!NKT#)u`@m6y67Tn6R-fE@$NOl^cId+zg6p51INrZh<}$YJ{RE*A zf6l~)%bwbOA!$f0@4}19^(#~mv3WuJ@BVLwW_Mf-$dG$#wNRp%IB9u@YE6^0pT%4_<#)RqMWo z15L$|#%LA9%KsQWc~_MlmG8YEPO~r3av61^v7Biai#c3q;0rv`HI62u-ZKBot-Hkh zBs4-OrF-SFU1<;!gLZeCla$IyYlnWDo{;)zY-i*~Q*)<5=;Dij2mCbn6d;A{wRhBa zVEFyUF5Y20o&Yc?Bw6-vo+^M z1cON1y7jR)jrkI2uG~KGMsq0si?PFG59n1MH&FM8{SjMymeFwCmj-a*0s-`h>!o~4 zSmW?f-*3fYqJsT?G^Rfd0?Ppu_|oMQCpHm$9M0GtVSjwrHhJk4O+A1n6-Z+S!Ry&y z)3D3Lze+D~%>|7DEynfVZjNt+CHgxizipu03#Q4Y)~yuBr>kD8nb_;BBT^Cv^#?)u|#mdA@wgG`VB7Rc90~lo31on^!-3% zOcQ|r+56NvuXEmXSZBzMW6~;aK9dGk45q()pCU@^kg!MbXFB(e>E6qtsk{+5gR~5y z+2dMA=|&A5(~QT$Te4}8V}Mkfs}j4sw-;KO>>kwNzV57(Lj!>j7(o6Kx6bFcGZ!r% z%Vd934LOoaQ_rITq9%qbp9YvZ9rReR|J9inOWd@W{trqePahS~)Cy^ka`_1JV+=!4 zM1!n4Bwdo+e*QGtePn%2XHW0~C+m4JO}>Q2_=FQIg$Lmtt&8k&iB+PpkK~^BW_L$S zABZfYG0U;lyvmT%nU*)O7ye@PWz(N}r?AA|6*T!u8e^GHunK!Wz=bX;(rUiv@CefG zWj`y^-#1rHW7W{4YH3mhY<1YYfWj~^{fpSpo|x^dPsvwlj8BH zEG=r0AQbI!fuyt&Xft(P^NmHqw;e2=wqaL9bRTw`p3K@LPUJq*E%2Wq-~)Zf&N?wa_HP zsI~&F&~hj{h+^MtZTdDTrqi_r?^=ICj?zX0Y75LDt9@ce#q`I8WcGE{<+sXm+G!U% zXew3QrC5@pMe?b`z>CvYlnk`C>^qn~-brJ2(ZIg0658(SR8+3)m};)OzhGk3VAtPG zJ6BEafgKOo_*I*Nf?QwM4`w>v^#a+_xvvgk1q4(ev(DOY)a56;=g~NU<(!MXG?gzj zwPa!dM<2{IhyqZhTUffb9%8bi2McwRhUfa&kv)4xmFy-;e9treolv~@b3ctWKvN&2 z$<^`tLkJ)4+NoBA^uWV=5*jaEJfdgyym5#I<>%fBqu+zx(z#D!_ZTW};KDT~77WuQ zM`&!mFwRln&~BY8nyH_{-ptQ^KC{`QhKy#9 z+xlEcjBBEv>AheeH{kdc#()MHtZy)HSO)9gLvJ0^qcP57(9`$6dV@RpDOo!ZCFV4+pyya&*?uj*%{i! zSsHVW2FW7u1?E@H1eOX~!2VjTcZ9NU#MOqL5MB;C$61ix;r4csCbdM905xnF0FZ4q zfMRva@HC{5u-p6RlUjvbPFqBWX8KfAj+8a5(4aaLEVa&{BU8E?L)q@f7L`;#R$zZY zm$Ify+0ZX^az}8z;DEu2d6Ta0k+fWVM^>k3)~~htp^^e&58TRDm@SBN+LCHI_o7}x{3Ev z5+BMGSFcw!3^No@6_n7N}SMjB@{OB^_9L4Ngzt_7W-*mPAlKEWiHy(dF>lK|5KvxNbjtU3S!S~RIkb)1N;A=Vr()B?l1p;qq zJ>R;V;X?{s1r3caTub7UoGvgl5}dx_Stm5lWW{qpL)-g=61_ zTEdt-a3Egr4IK`p)gZY!$~RBGnZI}9rZCsqvgb1FHzMc&z6NH?-D}0e57)XM@w)A`R%U1QyA+CD4AOKw_R1MX(q*FPY6aYH=@^w7@*?`t@H>yRbytfrpxNY2 zx$^8zHkYp~Bna(@i}?$Q|I_AHHHGnc(gyE@n#`HsV(5~wbjEjnEK2sN=wYQ#QI*NN zQ~e?V#cB2L=(4TsP$ll9NYRCPGu`LW!k3+8bo@)+av=|sJ1<5asYDu_%v`t@*x(aK zSB|GkCeY;)>FTSvHMl^!DD~QId5`~FEQ@>QrehJAM3+vcOV@I|r(;ljZAc~n7NLm) zB`Mw6-IJ}&a=POC&W#+cltO2v(lyfP40j5MngD)M+A&)5h@Ehc1(WZr(4wGw06SVR zI~cg(wXJ#aBc2U+@3?JGr_0#!%Oj>@;l@k5rO5{#_LrMD*QaIBWk=b;+fhwW-{i0? zxAH1>O=!r|IfU;n9@3zxCZli8EUKeR zeWFYBkQ=#Sm2bZK*su90SN?@SFNxX%Ded)imCtm^20D~u{Y_e;!mecrYCaR^3_tNE zwpq%&BT2fEuF*t?I*ZFZ&2;b<0Y-+*FFg3zY0R4|oUD{pF85HQg?_G;F55!w5G8bFZfX}r=|jyN4Yf!=_Kg;D9;9=g;x7i4?3 z?0L7Tz#T`eeJ!xU^4>boOV{{9*NA58gRz4sKddEkGq=rBo1|@m+1j*e`=rrm_Qo1bnx$=Q9+PHiOia=yT~ZJgQQ1TV z5!n=xMPwBf1aScb6p%$gTu?S;Q#L_BfA7z|_~c2yeO|v;{(7G|+nhOb&gXpAnJ3!a zFJ5#*XK)EG{ZI6_S3I%hZ*M6MU+zB?eP3N&+IRo!(GK^bPWPfNw_mp#mfRk!AAHb< zKDZ6OHN_>QY32?uNDF9Kl5@!P_JPaUm));iaWCw3)1L=?pWb>}_i^KMH}1dR_1q7B z_Fr7Xbf0@}ro11EAB-(=LHN7tl>qBo_kCr0^2h$axH^$LgYNlP-Sab5*D&?(ec{#0r)R!cxA6ymFMO*nko$A+qxnPb`NQrf;}j#b zxjv%5DJ=bOcwfD8q|&g84pNI*vJ5@-~*f zu&ML;l49BOF9n6YIDC9}uVcbJw?cOVRBkzrK6qmIEiGHMwBc^QM~gquJbLfH7Eik8 zPr08RQ%v&Hxa*9K;$h*xX3u-|t{?vVb1`xaPNf&=R7#^ z;a^`o{!qr?PaaF1=Pxb{HwK9K#n8L-y?Af%f)E?MGV=R(=4SmS>*jUktyNNM&+Ru;wypTtd$}@^|4CCi(mFG zxp}=#qYdUuv%Q0V+hg+PjGEMvYn!g;uNR*U5$A=9i&~8Xu$W+@|G@nB@h|^A z8K60L@r7H5<66T+zi<(37FigdyQkN0t4-fjQroCJt4=>1A;R};>=6{!ZD(Mb#%ixHC~)oFp#XF8b{d{gOq$ouXfgh)+Wt<#&msr~mw;&r(G! zWAC5c;18LGTyHuNn$LxAttiy4`^TkM@YA#J{{69Zac+h@PI#!t8`TlFk1NYAQ?2m~< z1>)j;;(|EEehl<;cu9YWfi^ujF#pGoZHZieXU>tdLyN2j#Frx-`1+gDv9Rb^<^!|8 zo3%LSv9iCPDHLBW5@!u4;W;J*)ZY?+(l8yqIP{r*^`HIy4~h$lMYs@_h%nMDIfUNf z4ubptvYk_pZw?IJ^utJ7l;86SrI<|PVVWhcKFpdtR1))S`Ng%SrygG|?PhIuiaYm-NK>#Hqq}a_ATGz#!SVvJ$I+Q+!gTC*}P-_9h*YWiTGvhc{GPf zj%fSr`ryu~kDgduApPpdJ)YU&!z$q~2X+@;T>i-`k5Zuw-{<_qFek&a}YFz1Qd zbH5GG*!tY|1?%s;_~7^2i3(l(A1VYp-CrBlEB>kuD$SeMx+ecOtxsGM7bM6!@LHF@ zw~SV+;JNFr<@OVm4<g{v^VEAE5%2ggpsG_`ltUUIjp%&+ z%g~HDeCo@4YIW+&E)gC_-RKL7aq_Pe7HvIoGap-Uh(--<1xGUd&Y}@ z`pR>^4XZd(^3=ZqhPOU4)hFUVTKyp8A1(d!mxAf~A4)#2&|khsuU-B?et~sBoHr;U zB0ra6^8E+C)A+Lfg(vgFHhzViTKRUO`C8oYv=l3o>>x*_gKo(mVYFs42ui) zDiHlR@YRBrzNF*1_iugd>OUSd9U2kmH*yG(v&6h28+d&}F5h!7>1W%59vBtzoAC~V zu%{&G%`e^x{rrI!-m^sh;H8_gh$OJ zHu-z+yz?G@+K$(HcS1b2-T%7tZ;xd~j-SHPl+#9 znx7CZEttLjSF2x}1Ant;e(X8&?zH&iO>tJ1p6tonHox@2I_36Xy!WBa`iEbwKYdHY zx7?09guqYkxxOv;%qN4d-8=Exq2>qtB~U7;W^de-4?p$DJ*jgRI{x_bQ*9#w(t;Hd z{vDa;>JWv;?~VREbo&FcORonyBi~&V7AU>2Qkt_$TF_$46};Z{_<1Q8I56-~?uF>r z!gpRzUo9=jF(4AVb!jjER_eL_h&!Wy=CFJ<7$o_vk??KfV2M7j1lunBki3ykjr|LC zbKjqDuv=>f?ynZs zeRb`NyIR~Ibca6PCKDcg^|9ecKRvM{@k&P5=&_3pkO-#BP#a*(}XJt}Kv4wdLBo{pz)UUKw7dsC@D9<9F0VNwDcfOJFFL%zPBl z_4&`t?`KHSL+_Fh?ibYkY4O_MrsC}!cy0LM|0lV!>gArd@D3|`I1EG z=_G0HcIl-Z($kT;WC>&eKL!C^*lX7BoVj}M?N5c{h0*1o2fTT);!)3=Pw$Q`OOfU# z%68GrdjH4fJ!D^-^OQ03Gmvx7mmmBvb4^@=QTSKV-{!02|D0%j@vg~mO~io?m9X%W zU;eJ+*VVn@fA~lEs%yXhI8}PN%81WC`#4j8boP(V?=e_Sdwe{i9ty58dIB`Ax<`a7)dh3b@R0kp9*~Q z4fn#c%{oDSebY0!H5+n2`cud_IAL^d@YHs-7x-8Fk9FU$Vlx9to_wH0dg+iftI2@>ISF06o`1XO(~oEUX~Ubz z6`KmjLT&gqdL!3#?XIu1zY+e~WPPHk!Y1t9_1DFJt6Bf?(b&w|N4D%OER_}>mgXOk zW*wF0?11G`pQk!TlkpioKt>J^O@I0LtJ+sD{Nj(Q-9c4*e*Ir%(!xd=zEF4nt4DYL zCH^oyxf3f-V@Nx;i^sc}%n)#PE@oHa{zxn%#ocRk|ZS1*OymI^G-;= zKBEdypOo0zFEA{hD_TYV{0}p~daeCe4=)Y)Eat@G8fj4rhePsr$0A$azRqtL`QguA zc<}MfjkVHC{fat?1woyIfOElbOZ54a`(l1nvQ>O-{+USgDI%Tq828&t-g#%)hZMIj zY#xZzResa3g%36cTW`oZ!766)=M}NsMQwn&l;7jpYHl&sThq)ZU0IGO*(OyL zm*;5YD$SR;)zTQZR=TJ=C=269R6F$fwrF(_ci7gfuTuBv%XRE5-8jxIXv*%oTu%TEZ@CPV1A?Ql_xEG6A%rv4z$vOZn*`SQ1y-nsntg1!^~ zOCp&cYx~Z7|3X2h_uh%Wn%;@9W|)Ki`xb7&g>o5k7AVIf^a?Bt$TjPuWGsSmBIPWO za$`UmWjHZ9LuNF zCMng;_EE~)TQQ{ymAj0r6e(4Wq0d~X+-UCNFUhaV*%9Q)iY=^?uv*UQsdgyWC}*vd zGo@sgfW})wzNJ_m;Jn?Iro78~U0$!m1YV^!f%0i1yH0g8gltQOqgeiR-AnR*zFyg5 zMcoOiOACgrP+(CN3QhJ)_;x7LvNZ}82GrB5NOYw+cDU$O(VaHidaOM*7J*W()t;qi z(UfX;m#f%TN?oxP7}<8DWXTGaMtIi7vIy51Sq@Np!a;>Tq0?SA0BkKS2!=dyS1ym#61cm0;YWc{b5e)JJ6>|er1-~YyIEujud z73>6Ije<1+`J>h`O{1Hgr*sy7P=*)UjF z>(;y0C=NQR#Eq^_*GW^8`ij2a5F!n$CSAkoX-lyElzW$nO`%`oS$Bl{s&c=(gim&E zGEH)|Qk8H*QD>VL(~RsUjR0d@p_DP*AivUf);4I16%xe)@qjkg9BGNg&!SMqrI^Q{ zI6_JuC>@YT$y#JAlJdRFE*dFWww-My#EVKGEa6!a;YkO}0(xIH?bv?X*RT4#60bT3 zrQEQiLcB`7 z+cI?9tP#>lVL~{AeZNs)ja0u`$<9+P9|fSX>~Li%sTP(jr~qsC)^f2+go!%V3&e82 zDrW+izJ|5>nqSQ#A71RnhK?hEA>rn=(@vGz5v0+&X=TdrFgJt2V4MZg%ex zqpex`Th35!k9vipU!S1d?aXqr4C;B%ecCZ9=9}3*T*(foSTP~C+yQJvytgdA$%Ykr zjB@doCO8>0C5Xk`kTFwz#Mz(4dv$+AkzSw2i2Cm+@3 z%PZwmmQ~gjiV$nCHAj(PJ+J6iOet0?*DE8H(aM9$94?9UL>f^Q(woLUNb+-DT zx=wdVGpUZT$J*00M>G|hYx`R?CB{9ja#gKypR2)`s5|L8r5-Yl8K;e7 z+(n(gJH&lZ7H>*0#qp8OB=>fAnrT`VsYq62oAO|GDRDQM%H5Ith^gJ(=cXe#R0tQ^ zxoG!xp-2`a=BkT@qe8P#W6Kv0h#f+wkgpFghnp{m!>S~6k66H66|aeD<{@!Ztm5*` zZJIIhhIo#f5-)LQ&3k2m(wOO(8B?Dk52qT=Iaxo)E>c;CiggoWgIoqGrnPj?w{T+|8>IY9HM=%bJ_6(ejMsF< zRyOV}bF=B0vRgpa8nH?htoL^en8z)R_!^WN?XNgl5Ft*&wS?={EDXri3RuVyNbwEE zPMl>dl1h;m4U}i`EnE~4^H17T@N)ZuH)#m`X4QhpFVKwZM|3 z9MepzaYP(Nj(oc|N!u$-s#yiq13yp&^xd)Ue^O0UhCW&dTR3)(N&@sddDcZan9-|h zR`Q?DFmK@F(&g{a2j%DwqJA?Oe)NIfZyaXBGxsQ?cX*0p*JrLL2`}i`G*A^|Y_?9} zg9(ZHEe_m0P=j%t*Hq#wr%2HVgDEG)gj5LSq&V5OnUZ9*=MyZ!?pBGVA&)NrXOpgB zS=6G~a?rx^DOI2uGO{DoX03sh5u&dO!W<<#PBohK0X(akDLDyLU(TWU&8Hs0U=Pq%5*3H5yeYJf=bJK8B)2-TKx~AG{8c`*gZkapnXZ0!CWNoPN zkbVzHYrA4X5#}mZH|Z0c+nhHQefnY5m@VA}GTcsg%{H+fAa->(x7r;g+pb_&aIHLI zKcer_p0u_Q7dQ!$%w5n2iL3!n^Z0&4fwRzgM3ZiB;hGKSHFdIlc>o`(&Eh-2WKY`b z#YQn&Npz(LWV}W}jCPc)iYw7If~cQ!o#QUxDF$`Z#>28>sxhupR<8=?WA)qkI6hN9 zEn8z*%SCg+&N^MQzE9s|nzW6W*i{;Bnu3i0`5;G|7Vl(?@^FyfAS`yWDWEz>vB5$| zMkwe}6pj8Sa+L$hlcrTdm1a_hcK%xQanMq1IRb7NX?kB%I40$VLNR|sN!*~8W&NkM z{N<8Af9Ut=M@#SzPNcrEc-K-#=sc9rAKRaBqn4dev4a29)%#07LnOm{AARcgHRJy2 zH+qag52`{T*mhhhSK-AAc$lpi*tg{TlV~8@wJaIPt)+QOp&Vc;VK>LJ2y?aU0O3j- zJ3@F+&B_Q-uWANQ%wQeRM<24VQ_}Hbp~~;ZKm!yLh#xbsZEjtGu?p{ zXkb3Xty5~&g)4q$o%K*jmAXJ`b+o%!FRpZf#vDb3so2nD3{wSI+6**x? z7iv29yZ3ROh82oYFaycXMt*|Jb&#-i+}6n55Fs>xFWzRPH9+hHt0B^Y2hO1TM@T7- zZPqiyC1%q7BPH-~Sx6Djmrq!2XGMe{J|$jMvcrUUu}6V&;uuFb@Qla2r8-tc7^7m1 z7_p6r8Ohec)+|1jBNi$NGINzK&v6OIXc%9o>(h6slPv5cwW`yxMxbz8fFe2gwh*<^ zMgkiNQfF-JG-~n9x(W?QYAdxot78{{*n$^zT~5qQ2d=m@*Fhz_OywADFJX_C4H8Ck zY%k_PL40_v7$Gllvuo6%h1;ZJBUEEd$0iBU@)ltLeul2cUE5^d!*mtW@(9N*n?K|e zb`~`tD|wI0Ae3<392kpWq+ZD~q!}s=#0ResQtUJzN1Uw&VswbPN|twnhfkxtqtM~)pi93WWeoB#Hjd%5GFNhl)hphQ7Vz#alVf1Psh%lbB5?gZ4)uFq@ zb%MukbF7v|@rSnw%y73k#GPW>?2dG%N^OP|cZ51p5d>BUtf+gFrB*)xlHRY6~zMNnR-fkgqiC|$Ik#ZbySE3s6D zl@d=miTZUqwu5rAIFt)+@I*KTK|7+_B}vvleStMWP>iBJ_};#yuWhHB5b@HVq>rOHtpa1-I4 zvaEOFV9cf#6LOYEIA&(WK;L11h*BM@U^_d46ePbGRhS%a>=@-23RpkKk)kK5B0QmI zwS<`t)og>@?mxIIE-yNktD#Ymf99zT<*y$@2q1re; z+?r-ebytcB*iD)0XfDs)tgjaX%voHLnO&s2rP^2z;h>6LA;d`gfQA6$h$>2UMBhle z5r^&-bG1Fpl*8RLuzr+-$!v45tCZ??4e8l9wFN78i?D!WD-FPUnACt^mAkRC*jmcN z`&bWj6qye=qhz6A;Om`(hEZ*UtlN1_)n+)YAtoi$U8idliFr5ZjlFvg*1DR0DH zX@L;J!f~azA&ceq%BE$zITk_v``g(jAQ!LC6@fdVU@N-@Gj!i!qAgD^(T zb`tJ4uw8_B`ZOS@Lb@SckGGnIEAEtKwZ!tNJYCNUfRCkXMh*GgK3Bhy1egh~QFTxj z$H%(YLTJl`z_!<&!PT3ZO_BT!Q<~;D*r@FSG0z+L8?rceg?I$a3yEU`Vy5nfSZdAy zdp@Y!D+`j^WSz2W<^frzKFqS#vWvT=2a~^_Mv_ z^p&g(REnb=%W9CPE0!m!OTCPKFVtWC{EPytj@sdAn`W??5L`qnP(JERb45Da4D3AR zV*W1zK{e24C#9e)<5@SA#amf7*6L4_WnuCG%b4M&A=pSXyVx3qbvy*oZUl-vqT3|e zl4dhmk-?3a*4b}sQB#C|ZoOD-Z-&4|BI|%S1lhfMMng*T(kY9Q24pL_HI@qKMK6Fw z1NFZ`<7n0w39O&SfhQRxgoV2a0j_3Ojw#z7=1fGtH^C~_$u>!A4TqHF%2qiWL$7={C~>}OtxJz1XCM$X`HZPU$5v4uXk;)@*8&ke>wrEw7>bl?t@esB z$Wf(f(}v?bX5mztVe}W-W~6vJbD%VhL0XomXWM`ZI=yPF-t#LS*D5;U5{##HxwahT zh@EZJvBH1n1@Y%Wzjv1{d-uboe(yhwuMoWbfAWJ#=#dN1LRGqp?pZ8nX_SK#K*7?H z;;ZFpu1Yz}pmY}R4?&t`QVnQjj4T%^S(}XI1LZTCG^}4-X`A)?4NWEp;qoe7JSfvS z&@@(r5=FIro0CpFoT(+aR$dm1%vt=1^`aIv%BiPfOOo-RrBr0css6MP>I|tt)@5R~ zxTdvQ59E8e5`NIY8j!|lnv5(F=k52RAoP$}<1a$6akV-E^=+~cQ-mH$3jUg7n;0)9 zxwB0L5M%1J8O9>MO1+Eg(Qb2DVX%e`0exc`Lka?a5U4A=PNiV1$0@Jb zx|6?RWu4fs$_RBaXvH3*m${vyTA-HGKwlq?q_Pg>>gDVv<Wu;v#WCV1h$%jkQ4v2o^?V0r<%>_8wQnZ*#Fo%GqRM z2QfFQom`(g(L(R!EUYJNGuX;+DS2$6?l8oyKzX72x_XSHuXtQ>F?I|ffyyDbB?0*| zt-n`hCq`_YuFG7jVR0DPcOt?1K>MZ`cSfp|FU+p4U$ z*9xS`s&UsEo9rY@ZV}^bYzO)^B{+6CLd+GaHZfa%U92~(ac?${+Q)=*!e%ko$x>(x z7*!h3H`$TIUPHs5O`~epluPAqmP560ROSH{A)0t8P#x=n_9vh6@iGdiF6kve2ns2$ z)XhpMuf*tGkQGRCsW#{ps;Ct5e+FJV2=jo9ounL$V1U?JV$fE)`V^R*TFMX9vnIkY zCu=6ev7JQ=2Fg%whu*7464)gwxgld+gg7KG6Jq(7`i>ru#a_z6J+2W#lQIJ2oAtq1 z?raQcFg8eCpQ$xXIpq?R=^L>S!t(wVe!C1vjD$>FH?m{PNBhG6`Ur}wpX}BaLfU%^FTQ7D% z=51D%s~VN5W@5KV3vmf!7~_IT;{Z0SS-;H*24*9AwcS?2ljuSQyk4*Q&S$zKGu&;n z9ovlB^xV-js)H81`B?BL-*Ss=rw3`oz#)dGP=~uEmI2g~9gr*%8_i^Xx-R#cpE9Wi zlz)2&Q_L)n5H!6IDDSbPN-G2`u_DUF0xAZAYJ>{xC{lczJ&r%&W>rWl>Yd%rOsH(Z zWuC;f>6`WmvS*UrvR*l3rKm+6qUB9QeHx%zVa=2SdU6qXdy!wFbQXUclgrK$--*dN z4dsi1UfB#s-+?+_`RBT_ksowtz_QTE?NxLd+8kl}DNBgE#x|u{g*%X;Y(SA|?AK$- zchcP^?W_yv#+_`4TC_t#V-rZ3Z_A}* zWAVwRWLG80bhC|~6?UI#Y6)ZBEubOSLRQ>%vCm9qK;qZBtR%mpUOt|X&(j|yxg@}h zbfGXtYS%o`~34RudA8fu|e=Tq!N#Q&EVw1K+B z0@(;Ok!=%71z0zUk?i7cvyo)m#IT}K=Y=f8QOhYym6L?iF~c;>;VY~G#sF7>^^lSn z_+slmXyh(fdtGDPEtkI=`Zoxf>9)hR9blI8-Q^~T^|mTgg}cj?tWMLc5E?Wag!7s_ zsGtgkDxt+5sJ$diDPz1=jd6RO{v5RW&B`QmF_-Dc(p8!pyvFpi&u!{NX<~qB- zl@%aY;j{RAt%3WgZIPLk5SD@H0(JYiG{Z4S!XzDMt1}%VT(2tE!H%H}<|?nzy^`ur ziR=VnjhWREHgc?iFvZ5s0{J1xG9b+7DedF5*hMPG&guYqRko~)QavK}XE&8yHnSY8 zO&k#u@)j=Nc2a|rmZ11X0R0lX|`Oum^W4i@kgJOB9e509+^4=#KKwSkX z;D+>>M)1!YF^@hq`4~#D_Ve{2cD8Hg(6~-{t(rPJ4xVwOX^b}rVPU)l{9du^x``~w zz4k0iopo9jXgMg>8OpR}nydB`+A7$PFYCy5+@!whx@Zn^kli@KG3mNx%d?)6nx!#a ztPMv`fCUFbwSnxB{jhHm&0vAZqxoietT5HvK5O1xZBIHh)SXE?S2DM-Ty+}&v7qi0?nODGPY z-!}5ChA=r9+cIE`41kPH=EzpaZsFD{ev>JH4s{plvkt-hctaTiX`Upq4r{k-+BoVW zV_S;NXKW+gPK9YeQEV7=N4tw~q~)rKE>0<{T5U^MJ=klJ)e9}0S!!(Y%B^Zk0SZ8p;KtvB8#nu;MKsiBdQVFSfe&S6<1 z$BHraiU1=2nko_>5>UdEW*C#1NVNj>yX7niDJTqrtu3^yQ*b3)4Wl_Rr`SRnbdA?| zV&?G3!ZqJ(^6KofDV-r?IC`us7ir^dQclM5uTA$eL_7g}i#A>?Gz`nuayQ)rmT}vl zGu!}SA)orWC1B}eD)S_TEz(e&)>zpo%FQw)%b>z&q!v~7Vxi47EFQPBHeAcnZLEW8*H}v(tdnwj zVWXj%L`e(rNiEvWln*{`fbv&zL0(}z16EDSzo}r?EbPGlefTW>V#%N1LqH{5h5USf z(fP(fG>Uz$ta4<5`j9>pw;M*cpg#vK*fZmFiv}Z`0_r*qSH()4-2s-BrU*4@B-T6g zU2K}_U`lQgHkp{e6%TYBCSJAzDV&rER`fbVlmid33VE_XBMYLk4lU^fSTNG633;{M zr(Ig(%7*NMJh{*B0$Sm4s$D2ViRh^ci%)jI$u=WT)?;MRKK{;EMEE~wLv3My+4&~)p*FW`&e@#m3tIgYoo#X$F=qU%qTP zJd!_J`hRK%im0bm7FJ9MN`D9lxzHySt~B}NLLc42Qae0E+?y- zsZ~!1+e9-^kt-(ZuRwf?*RvxuxA7c{CL$1}W34E+7l34h=;HWv18I-O#AI25bqCk$ zs&Es-AIX>U%}RfFBNz~N5t?pQv%c9ynv6r_?7^`%^ug7W4(A-DE|OmE0^OGg)DCsL z4uqit*U$#AF2VpO>mkf=uq!|=SH#Hrkm4g8!|D+=>$iSu>N!LmdDZQq*cLGCRdX@$ z$SV37vke0#Oa1=sh;1MXshwjo<-Lob8)t~e0Kp_d8X0|uV__0}T~@@S}yYIco2*5aT&znF2SnLJ@9_w%&5)C@RG) zKHhc6dJQ&-LE}*!oqi+Gzpv8|Df=8LwovYXdl$Fc$#$YQex+-G1nU&K11tflgcT;1 zPKe`ZHz6q7Htc3~vwm3CDDK8FMdXz;w>$tH#FaW^x)RXO*SQ z%9<#r&B)FGXB-s2en}JXCdK6M!0xex=yrIutYzFvOEnJcYoRLti)Z1em z&rg)vcSh!_v7N#_i5&BWjd%BZb9<8mf#Zi)Q@Q{PlW1fRuBdl?= zQ6OK<(OzO>l!s+>iLCzFrgG_mb=>aV;Nw(_l!`FbPExIS1G_a-+ux4Srn+(WVp1j- z!P^2><^bgK>-5=hbYsCtQ@`t|rdOvELOFRbd(4!Kke3Q-Y{K=ES%w2nlECUAgZ039 zt=n0}XIPILTa0aRJ&uN-NQ^2&bBkXCI3fp8*WlKBssS+6kn;~tDL)v07G_H6P ziv@CF@(wH8PC3w8?I4V`u@owqvcS-mPC0O?-VVdg-PQ6{#_LLQ>T5GZD9EjkM1ad? za_$QkqTM~*3dewA&=BGX60gG5k2c%5p;WQk*<`G-WjV<$kY!Mh+wCly5Sp`GARnXl zdfDV5&28hc<@Ql2SoLDcIUM7sr_|=3IJyZ)27J&jy95^YE_zj>d;HYR%uC*N3 zXTb4r3~H@HVXJbjA%?75)#MRL@@%C%-N>qGDTZ>D1}w!^>YZK&Yop$e3hX=~mRma^ z1nN$pg?x3x?c?SV^$Gn+Q-`YGFsvF@uM!H?LC!tSQmenT(Z$XYw{n(;7yD&u+iPb9 z*et3wmQFCAuoh{&wCd_i|06(!kIIo1gPkVz=waxvsT}8KB*qLYJoGN|A{qFyI#4w( z#a63llhm?U6^yccvPDeenh)T;;)1^ewY-jWE06-)Oiz6nGs#LYI;cT{#Q#SP5`>!G zEl4<`#TTtHTeLkliP)gwGo=wTSc-nEBdTDl&(nWM91+RNPS%WAuFMH{C#jzsHmnz6 zy=o>OS#Wq8(3VRx9}w9V>f5K#jWMzqT*1EF?oKzvLeDhr+yT3uobCSiWA1-(Z0~-$ z?4xg-bV)QW@Ifg+>rUP6C;^{}k%%Udwy)KU8*Q6yEERQq#3s$xijHPqbiwVznec0nCr|*<_66cSl*%6>7cuW!=;E2I?q1fZP}q8j^N+& z?7K$Y6!B~;Z6xn<9!8GuMU7I|LtbYc*2A-%|Gq?sb$)-@zxj@hQ-`q}oBZ};86vg> z3a|htm;#D=$hXj|za-yiqv#0l%MU~uO?uD_1_R;j(5_@T^aMjjm}%D{586U94PmRU z$CcWrWNDN~Tgw!rYGGm29<)4y5G>jzLOA3^166dgj@x=TjdGEPj)U^aGTKF(nZ;NNhWhyJ^HEBvTFy$ti?5tx|!?68QZ_$W<~-O=od2&& z-Pfws|1I4v`S`tWY{K>A0Xk!h+l_u9t4GOv&N3{M?n44Wq(qMJFnR8w5nzmC#LEN{ zbDD)5ewELSCWqRS$@Q|iQr>N51ymagx0eVb>J~xig{=WTejiHUBoQTJ2Poy`9tx52 z9x23^M{{2L!$IVkVvI@f(IwI|;a&6vrfKzs|z?Q@O@1ixvda2wiOb=2yj2I(8`4M}EgU)+4O1W5LtSnMy;LHKMdx( z2toSNfT|({-el<`VgGC4up82m$JJRe?%h-?%)<5%VjjxL7rmG}rW%F>nW-kXP?kew zby}7W1j8@|WenR(dBYaA59nKQ`;q$Y0Vi>lc|wb7GC+cfm&eyH4}o~v{6Z!0o+?LBxl7+*+EN% z$!ljkM>S&LsD)!dT`v|m$>tXfml1N`VeQn;yW2XbUZR?H5@J@nf&7r(YdWaHe#QFj zv8)hqhhC}yR$!12Hr1;$Erx*HS;S_rG2F}40^jC7F-k`41X&zA;efD`+btnh0nT`A zm|B5J8YP4>Wpbt$f48sqKtklNCd9f82Kshm3d#Q1KOxAGUlo1Smqk#yS1}ezEwBzE zu^+fmCsLb{!$-Tl&yr5=FVPAXOSR(MED5L}#oJ|5w*tnCni<9Xb}9$6mI5@BhJo}8 zkxo(-hrkK%gsl}!XRnsD3|<{WD%H=Ivt+U;w{Tm{EDbq4No_rFGNIBco@Emva4Zk# zr3g4n1eT90-&@#=lrmXHmit)yhzYA`Kb5W1K>*%|S=F93$MM(1LKrd2;So;mu4sRN zS`jmNTj|aUkwb5>gb*$`rPNEJ4*tA{ky7~PVg=SQJBn+>VC;q>fR$72a*0(C;tfX< zqZw);wt-l3FyR)`$3Qf$q8e>*-3D?;g*H2@@wQd5Q-rv4BT&`srOziFw{%lRCr8iNfj&Q;bCjxvDVw!Z8D4J(@U~g~GUY`oSRd8$D%1xl2Yl3!`&-|96iwA+ zl(}jjQCDf3C9jjy1a$~q{3PANYwEp8sc{?5bbpa<2K6fCc-LDI*f4XYtIxerc8*Uo z9k!9u_`Kp03?|(iIgjKCZL)(hwgN4EhTGNDN3x6s5km2kOHy+J)QsY{et`AV1%${5 zpo3Hqx1(ptszvr|;)XK>ik~f(XDNMlEpNPSB(;Q8wTUpq!D^re0I5G=V^Ne7re<3R zG5gzqLZKl6P9DSXY7F8sIG=~(VXp_=TCTzdPse!F@nlf{0aHPUWOkt`NQTqNOFKWLwDOBc7+&f@p;4c zsz$Zs5nCnnIVf_tcb&6h( z)5{=S@Ndg;g3$`Y5vU+_C`lt=U8`tR82brAsD)|?_bOODAp(&b2{D!D2;q7&jP}ZF z-s963SHUiz#3%Q)BXx&wE%^>`UljN474`3t+_bJJE}PhGvYL8V*Cq79$IHB1CXdKD z#@2~ESY&hXl*C{Yql6qP=>dWgBM5Uc;5_teFh~6+Pmltyw5T7!4byTI8=t))O{@DG2HHrpJt)>;h9PJv4Q@x>?(%jSpYD2Yf zaRlE~r)|?-)OKilw7uGX?TB`rE?&1?SIq6wW$B7^M|D+*-=gT$3y4pJbF|``Zk3** zQ^UN`sYA*LeGDR0)AgB%QeDYqBU1H{{)qk<&eSHj2~(WvZV32S^=k}k4F^==hET&! zgjN(9iVS7m0E;F=tKmEu_F+UHgwIz1KV}$*3v-|`z#Fr=&KQoE)osRjV>;Y5GmW{% zLO5;K8Yy_NJOyam?}&e z+({VOYe8f#n@SbErV;Soq4=c&MX_!cQiM!_B3PS@%|fkkR)1PUF|0!~QLHiMtxzze znkThsh}EO$)lzdMln&$|P0_1e=5BM2{)(AmSZ|nN9<>A^j`iy()Fgqt-n}lD}eX zv4~cVvr)A2?wNSyd|MDl(aJj@3&Ogj8MjT^iVXqwb@mv08Mj@PVo$ec+mF~`Rspj? z(aKHs7W)Pe*lI(oz0H1(FVKwGeX+_b93}iZM~H(=Y!tJcvLq?qMAE5$4ih!nL<%0!AMy zQp!u3A_T6E+soZxN{>^W1_Uh=!WXX^_>(H=2rv0f0HHk& z1IGn;-UMR zTxzA)S%W)5C_>y_Ev3Bv_@`(znDqwAsm2k&8Yu^nIL$L9t%L~{mPZ0`uD0FDn7@oM zcE<(DuU(pZQF`){G`mBZ-6_rPl4f^HvsG%1R;M=@FH$WT>yi8}OLMPCi!Mn&oymKt zSMuwV7W7Lm4oEK#N>5&;ruz5s-CSRrFRn>`L(<}5>Ddu!_9zwF^ls5t<{Xp!u1j;q zrNtA{>>G632lYRC*jM(>q~tdxy*N#|`X_vOzq~2=-IC_{dlm(FX0Py|8N4V9(;Uo>xbtR&Hh#>pY9sdtSBR zI>h4_>UnBJ`mL{rSHnDh;huRBp1A>@duMKQ_Xdw&r03<0p4po`vp0M2ICtEszsp;n zmwvE3%HtR9nYYFBRDkD?GcDeV@%U}^EROX&xy>^>js_hd)4%_b?-u`z_xL4v<|TTb zO7c7#;Bo(ArqR!~d;E5I7L7=DZ#~XzO7{5e^vp@|JUJn~Kl3!ZJabY#Pa=XN&EuEu znVaFkYk6qqwfug!$1l?}Z;xkTmS=H*=c8rM_-^%=cNOlXE%Cozt=YlJ$^-=c?W57-k2HnYsDVF z63?PTo+nFba`f-N?CbMShdq8rJoAovo;^l0^K19aV4g4Y_?3I+R(P=N=FANISI0em zm7c|=o=<#jKd$olReR>0@GL&*SrFiv|MX1TxiucYTF<;X&vOBur89YNdspcx&x`dQ UzXp%rMcEk({vauny~^1C2QS~dUjP6A diff --git a/src/main/java/me/trouper/armorsmp/ArmorSMP.java b/src/main/java/me/trouper/armorsmp/ArmorSMP.java index 4ff1cda..34ed7d7 100644 --- a/src/main/java/me/trouper/armorsmp/ArmorSMP.java +++ b/src/main/java/me/trouper/armorsmp/ArmorSMP.java @@ -3,6 +3,7 @@ package me.trouper.armorsmp; import io.github.itzispyder.pdk.PDK; import io.github.itzispyder.pdk.utils.misc.Timer; import me.trouper.armorsmp.server.Manager; +import org.bukkit.NamespacedKey; import org.bukkit.plugin.java.JavaPlugin; public final class ArmorSMP extends JavaPlugin { @@ -40,6 +41,9 @@ public final class ArmorSMP extends JavaPlugin { public static ArmorSMP getInstance() { return instance; } + public NamespacedKey getNameSpace() { + return new NamespacedKey(getInstance(),"armor_smp"); + } public Manager getManager() { return manager; } diff --git a/src/main/java/me/trouper/armorsmp/data/Unique.java b/src/main/java/me/trouper/armorsmp/data/Unique.java index 0ac2ff0..8449c0a 100644 --- a/src/main/java/me/trouper/armorsmp/data/Unique.java +++ b/src/main/java/me/trouper/armorsmp/data/Unique.java @@ -1,6 +1,7 @@ package me.trouper.armorsmp.data; import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import io.github.itzispyder.pdk.utils.DisplayUtils; import io.github.itzispyder.pdk.utils.misc.SoundPlayer; import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; import me.trouper.armorsmp.ArmorSMP; @@ -9,6 +10,8 @@ import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Verbose; import me.trouper.armorsmp.utils.ItemUtils; import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; @@ -28,17 +31,17 @@ public enum Unique { .lore(Text.legacyColor("&bAbilities:")) .lore(Text.legacyColor("&3| &75 Extra Hearts")) .lore(Text.legacyColor("&3| &7Fire Resistence")) - .enchant(Enchantment.BINDING_CURSE,1) - .enchant(Enchantment.PROTECTION,4) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.RESPIRATION,3) - .enchant(Enchantment.AQUA_AFFINITY,1) + .enchant(Enchantment.BINDING_CURSE, 1) + .enchant(Enchantment.PROTECTION, 4) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) + .enchant(Enchantment.RESPIRATION, 3) + .enchant(Enchantment.AQUA_AFFINITY, 1) + .attribute(Attribute.MAX_HEALTH, new AttributeModifier(ArmorSMP.getInstance().getNameSpace(),10, AttributeModifier.Operation.ADD_NUMBER)) .customModelData(2) .build(), "Netherite Helmet", (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,21,0,true,false,false)); - p.addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST,25,2,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 21, 0, true, false, false)); }, (p) -> { }, 50), DRAGON_EGG(ItemBuilder.create() @@ -48,33 +51,34 @@ public enum Unique { .lore(Text.legacyColor(" &1- &7Shoot Dragon's Breath for 7 Seconds")) .lore(Text.legacyColor("&3| &7Resistence I")) .lore(Text.legacyColor("&3| &7Strength I")) - .enchant(Enchantment.BINDING_CURSE,1) - .enchant(Enchantment.PROTECTION,4) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.BINDING_CURSE, 1) + .enchant(Enchantment.PROTECTION, 4) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) .customModelData(3) .build(), "Dragon Egg", (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH,21,0,true,false,false)); - p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE,21,0,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, 21, 0, true, false, false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE, 21, 0, true, false, false)); }, (p) -> { World world = p.getWorld(); - + Location eyeLocation = p.getEyeLocation(); Vector direction = eyeLocation.getDirection(); - - Location hit = CustomDisplayRaytracer.trace(eyeLocation,direction,30,point -> { + + Location hit = CustomDisplayRaytracer.trace(eyeLocation, direction, 30, point -> { Location particleLocation = point.getLoc(); world.spawnParticle(Particle.DRAGON_BREATH, particleLocation, 10, 0.2, 0.2, 0.2, 0.01); return !point.getBlock().isPassable(); }).getLoc(); - + AreaEffectCloud cloud = (AreaEffectCloud) world.spawnEntity(hit, EntityType.AREA_EFFECT_CLOUD); cloud.setRadius(3.0f); - cloud.setDuration(200); + cloud.setDuration(200); cloud.setParticle(Particle.DRAGON_BREATH); - cloud.addCustomEffect(PotionEffectType.INSTANT_DAMAGE.createEffect(1,1),true); + cloud.addCustomEffect(PotionEffectType.INSTANT_DAMAGE.createEffect(1, 1), true); cloud.setOwnerUniqueId(p.getUniqueId()); + p.getWorld().playSound(p.getLocation(),Sound.ENTITY_ENDER_DRAGON_GROWL,SoundCategory.MASTER,10,1); }, 50), LEGGINGS(ItemBuilder.create() .material(Material.NETHERITE_LEGGINGS) @@ -82,59 +86,54 @@ public enum Unique { .lore(Text.legacyColor("&3| &7Back-Up")) .lore(Text.legacyColor(" &1- &7Create a shield around you knocking players away")) .lore(Text.legacyColor("&3| &7Resistence I")) - .enchant(Enchantment.BINDING_CURSE,1) - .enchant(Enchantment.PROTECTION,4) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.SWIFT_SNEAK,3) + .enchant(Enchantment.BINDING_CURSE, 1) + .enchant(Enchantment.PROTECTION, 4) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) + .enchant(Enchantment.SWIFT_SNEAK, 3) .customModelData(4) .build(), "Netherite Leggings", (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE,21,0,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE, 21, 0, true, false, false)); }, (p) -> { - Stream toKnockBack = p.getNearbyEntities(10,10,10).stream().filter(target -> { - if (!(target instanceof Player v)) return false; - boolean tooClose = target.getLocation().distance(p.getLocation()) < 10; - boolean self = target.getUniqueId().equals(p.getUniqueId()); - boolean trusted = ArmorSMP.getInstance().getManager().trust.getTrustees(p).contains(v.getUniqueId().toString()); - return tooClose && !self && !trusted; - }); - toKnockBack.forEach((target -> { - Vector direction = target.getLocation().toVector().subtract(p.getLocation().toVector()); - direction.normalize(); - direction.multiply(2); - direction.setY(direction.getY() + 0.5); - - target.setVelocity(direction); - })); AtomicBoolean cancelShield = new AtomicBoolean(); - Bukkit.getScheduler().runTaskLater(ArmorSMP.getInstance(),(task)->{ + Bukkit.getScheduler().runTaskLater(ArmorSMP.getInstance(), task -> { cancelShield.set(true); - },120); - Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(), (task) -> { - if (cancelShield.get()) task.cancel(); + p.getWorld().playSound(p.getLocation(),Sound.BLOCK_RESPAWN_ANCHOR_DEPLETE,SoundCategory.MASTER,5,1); + }, 120); + p.getWorld().playSound(p.getLocation(),Sound.BLOCK_BEACON_ACTIVATE,SoundCategory.MASTER,5,1.5F); + Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(), task -> { + if (cancelShield.get()) { + task.cancel(); + return; + } + World w = p.getWorld(); Particle.DustOptions dust = new Particle.DustOptions(Color.AQUA, 0.5F); - Display.sphere(p.getEyeLocation(), 5.0, 0.5, 0.5, point -> { - w.spawnParticle(Particle.DUST, point, 1, 0, 0, 0, 0, dust); - }); - List targets = new ArrayList<>(w.getNearbyEntities(p.getLocation(), 10, 10, 10, entity -> - entity instanceof LivingEntity living && !living.isDead() && living != p && living.getLocation().distance(p.getLocation()) < 5 - )); + Display.sphere(p.getEyeLocation(), 5.0, 0.5, 0.5, point -> + w.spawnParticle(Particle.DUST, point, 1, 0, 0, 0, 0, dust) + ); + + w.getNearbyEntities(p.getLocation(), 10, 10, 10).stream() + .filter(entity -> entity instanceof LivingEntity living + && !ArmorSMP.getInstance().getManager().trust.getTrustees(p).contains(living.getUniqueId().toString()) + && !living.getUniqueId().equals(p.getUniqueId()) + && !living.isDead() + && living.getLocation().distance(p.getLocation()) < 5) + .map(entity -> (LivingEntity) entity) + .forEach(living -> { + new SoundPlayer(living.getLocation(), Sound.ITEM_SHIELD_BLOCK, 1, 1).playWithin(16); + Vector direction = living.getLocation().toVector() + .subtract(p.getEyeLocation().toVector()) + .normalize() + .multiply(0.5) + .setY(0.1); + living.setVelocity(direction); + w.spawnParticle(Particle.POOF, living.getLocation().clone().add(0, 1, 0), 10, 0.2, 1, 0.2, 0.1); + }); + }, 0, 2); - targets.forEach(target -> { - if (target instanceof LivingEntity living) { - SoundPlayer blockSound = new SoundPlayer(target.getLocation(), Sound.ITEM_SHIELD_BLOCK, 1, 1); - Vector direction = target.getLocation().toVector().subtract(p.getEyeLocation().toVector()).normalize(); - double strength = 2.0; - double verticalMultiplier = 0.5; - living.setVelocity(direction.multiply(strength).setY(verticalMultiplier)); - blockSound.playWithin(10); - w.spawnParticle(Particle.POOF,target.getLocation().clone().add(0,1,0),10,0.2,1,0.2,0.1); - } - }); - }, 0,2); }, 45), BOOTS(ItemBuilder.create() .material(Material.NETHERITE_BOOTS) @@ -142,74 +141,94 @@ public enum Unique { .lore(Text.legacyColor("&3| &7Dash")) .lore(Text.legacyColor(" &1- &7Launch yourself forwards")) .lore(Text.legacyColor("&3| &7Speed 1")) - .enchant(Enchantment.BINDING_CURSE,1) - .enchant(Enchantment.PROTECTION,4) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.SOUL_SPEED,3) - .enchant(Enchantment.FEATHER_FALLING,4) - .enchant(Enchantment.DEPTH_STRIDER,3) + .enchant(Enchantment.BINDING_CURSE, 1) + .enchant(Enchantment.PROTECTION, 4) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) + .enchant(Enchantment.SOUL_SPEED, 3) + .enchant(Enchantment.FEATHER_FALLING, 4) + .enchant(Enchantment.DEPTH_STRIDER, 3) .customModelData(5) .build(), "Netherite Boots", (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,21,0,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 21, 0, true, false, false)); }, (p) -> { - Vector direction = p.getLocation().getDirection(); - Vector velocity = direction.multiply(4); // TODO: Test Vector + Vector direction = p.getLocation().getDirection(); + Vector velocity = direction.multiply(3).setY(1.5); - p.setVelocity(velocity); + p.setVelocity(velocity); + p.getWorld().playSound(p.getLocation(), Sound.ENTITY_BAT_TAKEOFF,5,1); + DisplayUtils.wave(p.getLocation(),3,(point)->{ + point.getWorld().spawnParticle(Particle.WHITE_SMOKE,point,1,0,0,0,0.02); + },0.2); + Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(),(task)->{ + if (p.isOnGround()) { + Verbose.send("Canceling because on ground"); + task.cancel(); + return; + } + p.getWorld().spawnParticle(Particle.WHITE_ASH,p.getLocation(),1,0,0,0,0.2); + },3,1); }, 50), MACE(ItemBuilder.create() .material(Material.MACE) .lore(Text.legacyColor("&bAbilities:")) .lore(Text.legacyColor("&3| &7Speed 1")) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.WIND_BURST,2) - .enchant(Enchantment.DENSITY,3) - .enchant(Enchantment.MENDING,1) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.WIND_BURST, 2) + .enchant(Enchantment.DENSITY, 3) + .enchant(Enchantment.MENDING, 1) .customModelData(6) .build(), "Mace", (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,21,0,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 21, 0, true, false, false)); }, (p) -> { - + }, 50), SWORD(ItemBuilder.create() .material(Material.NETHERITE_SWORD) .lore(Text.legacyColor("&bAbilities:")) .lore(Text.legacyColor("&3| &7Go Wild")) .lore(Text.legacyColor(" &1- &7Strength 2 for 7 seconds")) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.SHARPNESS,5) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) + .enchant(Enchantment.SHARPNESS, 5) .customModelData(7) .build(), "Netherite Sword", (p) -> { }, (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH,20*7,1,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, 20 * 7, 1, true, false, false)); + p.getWorld().playSound(p.getLocation(),Sound.ENTITY_ZOMBIE_VILLAGER_CURE,SoundCategory.MASTER,3,2); + DisplayUtils.helix(p.getLocation(),0.7,(point)->{ + point.getWorld().spawnParticle(Particle.FLAME,point,1,0,0,0,0.01); + }, ((double) 2)/144,2); }, 50), AXE(ItemBuilder.create() .material(Material.NETHERITE_AXE) .lore(Text.legacyColor("&bAbilities:")) .lore(Text.legacyColor("&3| &7Rampage")) .lore(Text.legacyColor(" &1- &7Haste 6 for 5 seconds")) - .enchant(Enchantment.UNBREAKING,3) - .enchant(Enchantment.MENDING,1) - .enchant(Enchantment.SHARPNESS,5) - .enchant(Enchantment.EFFICIENCY,5) + .enchant(Enchantment.UNBREAKING, 3) + .enchant(Enchantment.MENDING, 1) + .enchant(Enchantment.SHARPNESS, 5) + .enchant(Enchantment.EFFICIENCY, 5) .customModelData(8) .build(), "Netherite Axe", (p) -> { }, (p) -> { - p.addPotionEffect(new PotionEffect(PotionEffectType.HASTE,20*5,5,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.HASTE, 20 * 5, 5, true, false, false)); + p.getWorld().playSound(p.getLocation(),Sound.BLOCK_BEACON_ACTIVATE,SoundCategory.MASTER,3,2); + DisplayUtils.helix(p.getLocation(),0.7,(point)->{ + point.getWorld().spawnParticle(Particle.HAPPY_VILLAGER,point,1,0,0,0,0.01); + }, ((double) 2)/144,2); }, 50); - + private final ItemStack inGame; private final String canonical; private final Consumer passiveAbility; private final Consumer ability; private final int abilityCooldownSeconds; - + Unique(ItemStack inGame, String canonical, Consumer passiveAbility, Consumer ability, int abilityCooldownSeconds) { this.inGame = inGame; this.canonical = canonical; @@ -217,38 +236,36 @@ public enum Unique { this.ability = ability; this.abilityCooldownSeconds = abilityCooldownSeconds; } - + public ItemStack getInGameItem() { return inGame; } - + public static boolean isUnique(ItemStack i) { if (i == null) return false; - Verbose.send("Checking if item is unique %s",i.getType()); + Verbose.send("Checking if item is unique %s", i.getType()); for (Unique value : values()) { - if (ItemUtils.isSimilar(value.getInGameItem(),i)) return true; + if (ItemUtils.isSimilar(value.getInGameItem(), i)) return true; if (i.getType().equals(Material.DRAGON_EGG)) return true; } Verbose.send("Item did not match any unique material..."); 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()); + if (i == null || i.isEmpty()) return null; + + Verbose.send("Matching Unique, Item Type: %s", i.getType()); Unique match = null; for (Unique value : values()) { - if (ItemUtils.isSimilar(value.getInGameItem(),i)) { + if (ItemUtils.isSimilar(value.getInGameItem(), i)) { match = value; - Verbose.send("Matched with, Unique: %s",match); + Verbose.send("Matched with, Unique: %s", match); } } if (i.getType().equals(Material.DRAGON_EGG)) { match = Unique.DRAGON_EGG; - Verbose.send("Matched with dragon egg: Unique: %s",match); + Verbose.send("Matched with dragon egg: Unique: %s", match); } return match; } @@ -264,7 +281,7 @@ public enum Unique { public Consumer getPassiveAbility() { return passiveAbility; } - + public int getAbilityCooldownSeconds() { return abilityCooldownSeconds; } diff --git a/src/main/java/me/trouper/armorsmp/data/io/Config.java b/src/main/java/me/trouper/armorsmp/data/io/Config.java index b44a146..55631cb 100644 --- a/src/main/java/me/trouper/armorsmp/data/io/Config.java +++ b/src/main/java/me/trouper/armorsmp/data/io/Config.java @@ -33,49 +33,4 @@ public class Config implements JsonSerializable { public String prefix = "&9ArmorSMP> &7"; public String pluginName = "ArmorSMP"; public boolean fancyAlerts = true; - - public Tips tips = new Tips(); - public class Tips { - public boolean tipsEnabled = true; - public boolean broadcastTips = true; - public int tipInterval = 1200; - public List tipList = Arrays.asList( - "Kill players to obtain Armor Upgraders and progress through armor tiers!", - "Right-click an Armor Upgrader to upgrade your armor to the next tier!", - "When you die, you'll drop an Armor Upgrader and be downgraded one tier.", - "Enchants stay when upgrading armor, but are lost when downgrading after death.", - "Armor cannot be crafted, removed, dropped, or moved in your inventory!", - "Found armor in the world cannot be equipped - you must use the upgrade system.", - "Craft Armor Upgraders using diamond blocks, ominous keys, and enchanted golden apples!", - "Netherite armor and tools are special event rewards with powerful abilities!", - "The Dragon Egg grants a special Netherite Chestplate with the Bad Breath ability!", - "Bad Breath summons damaging dragon breath for 7 seconds with a 50-second cooldown.", - "Netherite Helmet grants 5 extra hearts and permanent Fire Resistance!", - "Use Back Up ability (Netherite Leggings) to create a protective shield for 10 seconds.", - "Dash forward 10 blocks with Netherite Boots' ability (30-second cooldown).", - "Netherite Sword's Go Wild gives 7 seconds of Strength 2 for massive damage!", - "Activate Rampage with Netherite Axe for 5 seconds of Haste 6 attacks!", - "Trust players to prevent your abilities from affecting them with /trust commands.", - "The Mace is a powerful weapon that can only be crafted once when enabled!", - "Netherite items cannot be stored in containers - they must be kept in your inventory.", - "Losing Netherite items makes you lose their abilities - be careful when dropping them!", - "Use /armorsmp commands to manage armor tiers and special items (OPs only).", - "Higher armor tiers provide better protection and more powerful abilities!", - "Strategize with teammates - trusted players won't be affected by your abilities!", - "The Dragon Egg holder becomes a high-value target - protect your Netherite Chestplate!", - "Combine abilities for powerful combos - Dash in then use Go Wild for surprise attacks!", - "Manage your cooldowns wisely - abilities are powerful but have long wait times.", - "Upgrade through all tiers: None → Leather → Chainmail → Gold → Iron → Diamond!", - "Players with no armor (naked) don't drop Armor Upgraders when killed.", - "Your armor progress is saved even when you log out or the server restarts!", - "Netherite tools have both combat utility and special abilities - use them wisely!", - "The Mace's Wind Burst can knock enemies away while you maintain Speed 1!", - "Ominous Keys are valuable - save them for crafting Armor Upgraders!", - "Higher tier armor makes you a bigger target - balance protection with strategy!", - "Use terrain to your advantage while abilities are on cooldown!", - "Team up to take down players with Netherite gear and share the upgrades!", - "The End and Nether can be disabled by admins to focus on overworld PvP!" - ); - } - } diff --git a/src/main/java/me/trouper/armorsmp/server/Manager.java b/src/main/java/me/trouper/armorsmp/server/Manager.java index 8059967..f33249c 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -4,9 +4,9 @@ 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.crafting.CustomMace; import me.trouper.armorsmp.server.events.*; import me.trouper.armorsmp.server.systems.*; import org.bukkit.Bukkit; @@ -17,9 +17,9 @@ public class Manager { public TrustBackend trust; public TierBackend tiers; - public Broadcaster broadcaster; public UniquesBackend uniques; public ArmorUpgrade upgrade; + public CustomMace mace; public Manager() { io = new IO(); @@ -32,16 +32,14 @@ public class Manager { trust = new TrustBackend(); tiers = new TierBackend(); //uniques = new UniquesBackend(); - broadcaster = new Broadcaster(); uniques = new UniquesBackend(); upgrade = new ArmorUpgrade(); + mace = new CustomMace(); registerCommands(); registerEvents(); registerCrafting(); - - Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(),broadcaster::broadcastTip,0,io.config.tips.tipInterval); - Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(), uniques::applyPersistence,0,20); + startPolling(); } @@ -56,6 +54,7 @@ public class Manager { new TrustEvents().register(); new DropItemEvent().register(); new ContainerEvents().register(); + new DimensionEvents().register(); } private void registerCommands() { @@ -63,13 +62,20 @@ public class Manager { new AdminCommand().register(); new TrustCommand().register(); new AbilityCommand().register(); - new TipsCommand().register(); } private void registerCrafting() { ArmorSMP.getInstance().getLogger().info("Registering Crafts"); upgrade.removeRecipe(); + mace.removeRecipe(); + upgrade.addRecipe(); + mace.addRecipe(); + } + + private void startPolling() { + Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(), uniques::applyPersistence,0,20); + // ArmorSMP.getInstance().getServer().getScheduler().runTaskTimer(ArmorSMP.getInstance(),uniques::pollUniques,0,1); } } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java index 5337a87..c756e60 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java @@ -25,21 +25,23 @@ public class AbilityCommand implements CustomCommand { public void dispatchCommand(CommandSender sender, Command command, String label, Args args) { final Unique piece = args.get(0).toEnum(Unique.class); Player p = (Player) sender; + final boolean bypass = args.getSize() > 1 && args.get(1).toBool() && p.isOp(); + if (piece == null) { - Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid unique. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); + Text.sendMessage(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 the {0}.",piece.getCanonical()); + if (!bypass && !p.getUniqueId().toString().equals(ArmorSMP.getInstance().getManager().io.storage.uniques.owners.get(piece))) { + Text.sendMessage(Text.Pallet.WARNING, sender, "You do not own the {0}.",piece.getCanonical()); return; } - if (abilityCooldown.isOnCooldown(getCooldownString(p.getUniqueId(),piece))) { - Text.sendMessage(false, Text.Pallet.WARNING, sender, "The ability for your {0} is on cooldown for {1} seconds.",piece.getCanonical(),abilityCooldown.getCooldownSec(getCooldownString(p.getUniqueId(),piece))); + if (!bypass && abilityCooldown.isOnCooldown(getCooldownString(p.getUniqueId(),piece))) { + Text.sendMessage(Text.Pallet.WARNING, sender, "The ability for your {0} is on cooldown for {1} seconds.",piece.getCanonical(),abilityCooldown.getCooldownSec(getCooldownString(p.getUniqueId(),piece))); return; } piece.getAbility().accept(p); abilityCooldown.addCooldown(getCooldownString(p.getUniqueId(),piece),piece.getAbilityCooldownSeconds() * 1000L); - Text.sendMessage(false, Text.Pallet.SUCCESS,sender,"Successfully used your {0}'s ability!",piece.getCanonical()); + Text.sendMessage(Text.Pallet.SUCCESS,sender,"Successfully used your {0}'s ability!",piece.getCanonical()); } @Override diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java index d1a4721..ec84a48 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -107,7 +107,7 @@ public class AdminCommand implements CustomCommand { config.debugMode = result = !config.debugMode; config.save(); - Text.sendMessage(false, Text.Pallet.SUCCESS,sender,"Toggled debug mode {0}.",result ? "on" : "off"); + Text.sendMessage(Text.Pallet.SUCCESS,sender,"Toggled debug mode {0}.",result ? "on" : "off"); } case "exclude" -> { if (args.getSize() < 3) { @@ -118,7 +118,7 @@ public class AdminCommand implements CustomCommand { config.debuggerExclusions.add(exclusion); config.save(); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Excluded {0} from the debugger.", exclusion); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Excluded {0} from the debugger.", exclusion); } case "include" -> { if (args.getSize() < 3) { @@ -129,13 +129,13 @@ public class AdminCommand implements CustomCommand { config.debuggerExclusions.remove(exclusion); config.save(); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed exclusion for {0} on the debugger.", exclusion); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Removed exclusion for {0} on the debugger.", exclusion); } } } private void handleReload(CommandSender sender, Args args) { - Text.sendMessage(false, Text.Pallet.NEUTRAL,sender,"Reloading IO..."); + Text.sendMessage(Text.Pallet.NEUTRAL,sender,"Reloading IO..."); ArmorSMP.getInstance().getManager().io.loadAll(); } @@ -153,12 +153,12 @@ public class AdminCommand implements CustomCommand { return; } if (tier == null) { - Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid armor tier. Please choose from these values: ", args.get(2).toString(), Arrays.toString(ArmorTier.values())); + Text.sendMessage(Text.Pallet.ERROR, sender, "Error: {0} is not a valid armor tier. Please choose from these values: ", args.get(2).toString(), Arrays.toString(ArmorTier.values())); return; } ArmorSMP.getInstance().getManager().tiers.setTier(target, tier); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Changed armor tier to {0} for {1}", tier, target.getName()); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Changed armor tier to {0} for {1}", tier, target.getName()); } private void handleGive(CommandSender sender, Args args) { @@ -187,7 +187,7 @@ public class AdminCommand implements CustomCommand { } target.getInventory().addItem(ArmorSMP.getInstance().getManager().upgrade.getItem()); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}", target.getName()); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}", target.getName()); } private void handleGiveUnique(CommandSender sender, Args args) { @@ -197,7 +197,7 @@ public class AdminCommand implements CustomCommand { } 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 unique piece. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); + Text.sendMessage(Text.Pallet.ERROR, sender, "Error: {0} is not a valid unique piece. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); return; } @@ -208,10 +208,10 @@ public class AdminCommand implements CustomCommand { return; } - ArmorSMP.getInstance().getManager().uniques.setOwner(piece, target); + ArmorSMP.getInstance().getManager().uniques.setOwner(piece, target,true); 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()); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Set the owner of unique {0} to {1}.", piece.getCanonical(), target.getName()); } private void handleToggle(CommandSender sender, Args args) { @@ -227,12 +227,12 @@ public class AdminCommand implements CustomCommand { case "end" -> { config.endEnabled = result = !config.endEnabled; config.save(); - feature = "The End"; + feature = "The End Disabler"; } case "nether" -> { config.netherEnabled = result = !config.netherEnabled; config.save(); - feature = "The Nether"; + feature = "The Nether Disabler"; } case "mace" -> { config.maceCraftingEnabled = result = !config.maceCraftingEnabled; @@ -240,12 +240,12 @@ public class AdminCommand implements CustomCommand { feature = "Mace Crafting"; } default -> { - Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid feature.", feature); + Text.sendMessage(Text.Pallet.ERROR, sender, "Error: {0} is not a valid feature.", feature); return; } } - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled {0} {1}.", feature, result ? "on" : "off"); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Toggled {0} {1}.", feature, result ? "on" : "off"); } @@ -256,7 +256,7 @@ public class AdminCommand implements CustomCommand { } ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(Unique.MACE); - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Reset Mace"); } private void handleRemove(CommandSender sender, Args args) { @@ -293,6 +293,6 @@ public class AdminCommand implements CustomCommand { 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()); + Text.sendMessage(Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.getCanonical(), target.getName()); } } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java deleted file mode 100644 index b208740..0000000 --- a/src/main/java/me/trouper/armorsmp/server/commands/TipsCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.trouper.armorsmp.server.commands; - -import io.github.itzispyder.pdk.commands.Args; -import io.github.itzispyder.pdk.commands.CommandRegistry; -import io.github.itzispyder.pdk.commands.CustomCommand; -import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.utils.Text; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandRegistry(value = "tips",playersOnly = true) -public class TipsCommand implements CustomCommand { - @Override - public void dispatchCommand(CommandSender sender, Command command, String s, Args args) { - Player p = (Player) sender; - boolean result = false; - - if (ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(p.getUniqueId().toString())) { - ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.remove(p.getUniqueId().toString()); - result = true; - } else { - ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.add(p.getUniqueId().toString()); - } - - ArmorSMP.getInstance().getManager().io.storage.save(); - - Text.sendMessage(false, Text.Pallet.SUCCESS,sender,"Successfully {0} tips.", result ? "enabled" : "disabled"); - } - - @Override - public void dispatchCompletions(CommandSender sender, Command command, String s, CompletionBuilder completionBuilder) { - - } -} diff --git a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java index d747462..321e540 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/TrustCommand.java @@ -43,10 +43,10 @@ public class TrustCommand implements CustomCommand { } if (ArmorSMP.getInstance().getManager().trust.addTrust((Player) sender,trustee.getUniqueId())) { - Text.sendMessage(true, Text.Pallet.SUCCESS,sender,"Successfully trusted {0}.",target); - if (trustee.isOnline())Text.sendMessage(true, Text.Pallet.SUCCESS,(Player) trustee,"Successfully trusted {0}.",sender.getName()); + Text.sendMessage(Text.Pallet.SUCCESS,sender,"Successfully trusted {0}.",target); + if (trustee.isOnline())Text.sendMessage(Text.Pallet.SUCCESS,(Player) trustee,"{0} has trusted you.",sender.getName()); } else { - Text.sendMessage(true, Text.Pallet.NEUTRAL,sender,"You already have {0} trusted.",target); + Text.sendMessage(Text.Pallet.NEUTRAL,sender,"You already have {0} trusted.",target); } } case "remove" -> { @@ -67,10 +67,10 @@ public class TrustCommand implements CustomCommand { } if (ArmorSMP.getInstance().getManager().trust.removeTrust((Player) sender,trustee.getUniqueId())) { - Text.sendMessage(true, Text.Pallet.SUCCESS,sender,"Successfully un-trusted {0}.",target); - if (trustee.isOnline())Text.sendMessage(true, Text.Pallet.SUCCESS,(Player) trustee,"{0} has un-trusted you.",sender.getName()); + Text.sendMessage(Text.Pallet.SUCCESS,sender,"Successfully un-trusted {0}.",target); + if (trustee.isOnline())Text.sendMessage(Text.Pallet.SUCCESS,(Player) trustee,"{0} has un-trusted you.",sender.getName()); } else { - Text.sendMessage(true, Text.Pallet.NEUTRAL,sender,"You do not have {0} trusted.",target); + Text.sendMessage(Text.Pallet.NEUTRAL,sender,"You do not have {0} trusted.",target); } } case "list" -> { @@ -79,7 +79,7 @@ public class TrustCommand implements CustomCommand { for (String trustee : trustees) { names.add(Bukkit.getOfflinePlayer(UUID.fromString(trustee)).getName()); } - Text.sendMessage(false, Text.Pallet.NEUTRAL,sender,"You currently have {0} players trusted: {1}",trustees.size(), Arrays.toString(names.toArray())); + Text.sendMessage(Text.Pallet.NEUTRAL,sender,"You currently have {0} players trusted: {1}",trustees.size(), Arrays.toString(names.toArray())); } } } diff --git a/src/main/java/me/trouper/armorsmp/server/crafting/CustomMace.java b/src/main/java/me/trouper/armorsmp/server/crafting/CustomMace.java new file mode 100644 index 0000000..d4e94ce --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/crafting/CustomMace.java @@ -0,0 +1,42 @@ +package me.trouper.armorsmp.server.crafting; + +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.Unique; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; + +public class CustomMace { + private ItemStack customMace; + public final NamespacedKey key; + public final ShapedRecipe recipe; + + public CustomMace() { + this.key = new NamespacedKey(ArmorSMP.getInstance(), "mace_recipe"); + this.customMace = Unique.MACE.getInGameItem(); + this.recipe = new ShapedRecipe(key, customMace); + } + + public void addRecipe() { + recipe.shape("C", "B"); + + recipe.setIngredient('C', Material.HEAVY_CORE); + recipe.setIngredient('B', Material.BREEZE_ROD); + + + ArmorSMP.getInstance().getServer().addRecipe(recipe); + } + + public void removeRecipe() { + ArmorSMP.getInstance().getServer().removeRecipe(key); + } + + public ItemStack getItem() { + if (!customMace.getType().equals(Material.NETHER_STAR)) { + customMace = Unique.MACE.getInGameItem(); + return customMace; + } + return customMace; + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java b/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java index 0396c8f..f1004b1 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java +++ b/src/main/java/me/trouper/armorsmp/server/events/CraftEvents.java @@ -3,17 +3,33 @@ 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.ItemUtils; import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.Verbose; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; +import org.bukkit.event.block.CrafterCraftEvent; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.PrepareSmithingEvent; import org.bukkit.inventory.ItemStack; public class CraftEvents implements CustomListener { + @EventHandler + public void onCrafter(CrafterCraftEvent e) { + ItemStack result = e.getRecipe().getResult(); + + Verbose.send("Handling crafter, result: %s", result.getType().name()); + + if (!ItemUtils.isUnique(result) && !ItemUtils.isArmor(result) && !result.getType().equals(Material.MACE)) return; + + Verbose.send("A crafter attempted to craft a disabled item."); + + e.setCancelled(true); + } + @EventHandler public void onCraft(CraftItemEvent e) { ItemStack result = e.getRecipe().getResult(); @@ -23,6 +39,7 @@ public class CraftEvents implements CustomListener { Verbose.send("Handling craft for %s, result: %s", p.getName(), result.getType().name()); if (result.getType().equals(Material.MACE)) { + if (!ArmorSMP.getInstance().getManager().io.config.maceCraftingEnabled) { e.setCancelled(true); p.closeInventory(); @@ -36,15 +53,12 @@ public class CraftEvents implements CustomListener { return; } - - result.addEnchantments(Unique.MACE.getInGameItem().getEnchantments()); - result.lore(Unique.MACE.getInGameItem().lore()); - result.setItemMeta(Unique.MACE.getInGameItem().getItemMeta()); - + Text.sendMessage(Text.Pallet.INFO,p,"Congratulations! You have crafted up the unique mace. There is only one of each in the whole server!"); + ArmorSMP.getInstance().getManager().uniques.setOwner(Unique.MACE,p,false); return; } - if (isUnique(result)) return; + if (!ItemUtils.isUnique(result) && !ItemUtils.isArmor(result)) return; Verbose.send("%s Attempted to craft a disabled item.", p.getName()); @@ -52,15 +66,4 @@ public class CraftEvents 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/DeathEvents.java b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java index 406cc60..0953620 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java +++ b/src/main/java/me/trouper/armorsmp/server/events/DeathEvents.java @@ -26,18 +26,19 @@ public class DeathEvents implements CustomListener { if (ArmorSMP.getInstance().getManager().uniques.isOwner(p,Unique.DRAGON_EGG)) { e.getDrops().add(new ItemStack(Material.DRAGON_EGG)); } + + ArmorSMP.getInstance().getManager().uniques.dropAllUniques(p); 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); + Text.sendMessage(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().tiers.downTier(p)) { Verbose.send("They have been down-tiered"); e.getDrops().add(ArmorSMP.getInstance().getManager().upgrade.getItem()); - e.deathMessage(Text.getMessage(false, Text.Pallet.INFO,"{0} has died, and dropped an {1}!", LegacyComponentSerializer.legacyAmpersand().serialize(p.name()),"Armor Upgrader")); + e.deathMessage(Text.getMessage(Text.Pallet.INFO,"{0} has died, and dropped an {1}!", LegacyComponentSerializer.legacyAmpersand().serialize(p.name()),"Armor Upgrader")); } - ArmorSMP.getInstance().getManager().uniques.dropAllUniques(p); } @EventHandler diff --git a/src/main/java/me/trouper/armorsmp/server/events/DimensionEvents.java b/src/main/java/me/trouper/armorsmp/server/events/DimensionEvents.java new file mode 100644 index 0000000..78a93c9 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/DimensionEvents.java @@ -0,0 +1,78 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.itzispyder.pdk.utils.misc.Cooldown; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.PortalType; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityPortalEnterEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.world.PortalCreateEvent; + +import java.util.Locale; +import java.util.UUID; + +public class DimensionEvents implements CustomListener { + + Cooldown messageCooldown = new Cooldown<>(); + + @EventHandler + public void onPortalEnter(EntityPortalEnterEvent e) { + if ((ArmorSMP.getInstance().getManager().io.config.endEnabled && e.getPortalType().equals(PortalType.ENDER)) + || (ArmorSMP.getInstance().getManager().io.config.netherEnabled && e.getPortalType().equals(PortalType.NETHER))) { + e.setCancelled(true); + if (e.getEntity() instanceof Player p && !messageCooldown.isOnCooldown(p.getUniqueId())) { + Text.sendWarning(p,"{0} portals are disabled.",e.getPortalType().name()); + messageCooldown.addCooldown(p.getUniqueId(),3000); + } + } + } + + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent e) { + World targetWorld = e.getTo().getWorld(); + if (targetWorld == null) return; + + World.Environment env = targetWorld.getEnvironment(); + if ((ArmorSMP.getInstance().getManager().io.config.netherEnabled && env == World.Environment.NETHER) + || (ArmorSMP.getInstance().getManager().io.config.endEnabled && env == World.Environment.THE_END)) { + e.setCancelled(true); + Text.sendWarning(e.getPlayer(),"The {0} is disabled. You have been moved to the overworld.", targetWorld.getEnvironment().name()); + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + Player player = e.getPlayer(); + World world = player.getWorld(); + + if ((ArmorSMP.getInstance().getManager().io.config.netherEnabled && world.getEnvironment() == World.Environment.NETHER) + || (ArmorSMP.getInstance().getManager().io.config.endEnabled && world.getEnvironment() == World.Environment.THE_END)) { + World overworld = Bukkit.getWorlds().stream() + .filter(w -> w.getEnvironment() == World.Environment.NORMAL) + .findFirst() + .orElse(Bukkit.getWorlds().get(0)); + + if (overworld != null) { + player.teleport(overworld.getSpawnLocation()); + Text.sendWarning(player,"The {0} is disabled. You have been moved to the overworld.", world.getEnvironment().name()); + } + } + } + + @EventHandler + public void onPortalCreate(PortalCreateEvent e) { + if ((ArmorSMP.getInstance().getManager().io.config.endEnabled && e.getReason().equals(PortalCreateEvent.CreateReason.END_PLATFORM)) + || (ArmorSMP.getInstance().getManager().io.config.netherEnabled && e.getReason().equals(PortalCreateEvent.CreateReason.FIRE)) + || (ArmorSMP.getInstance().getManager().io.config.netherEnabled && e.getReason().equals(PortalCreateEvent.CreateReason.NETHER_PAIR))) { + e.setCancelled(true); + if (e.getEntity() instanceof Player p) Text.sendWarning(p,"You cannot create that portal."); + } + } + +} 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 219e7af..67fb0f5 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/JoinEvent.java @@ -32,14 +32,24 @@ public class JoinEvent implements CustomListener { Verbose.send("Checking for updates needed on %s",p.getName()); final Map armorCache = ArmorSMP.getInstance().getManager().io.storage.armorUpdateCache; final Set uniquesCache = ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache; - if (!ArmorSMP.getInstance().getManager().tiers.verifyArmor(p)) { - Verbose.send("Updating armor"); - ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); - } + if (!ArmorSMP.getInstance().getManager().uniques.verifyUniques(p)) { Verbose.send("Updating uniques"); ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); } + + if (!ArmorSMP.getInstance().getManager().tiers.verifyArmor(p)) { + Verbose.send("Updating armor"); + ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); + } + + if (uniquesCache.contains(p.getUniqueId().toString())) { + Verbose.send("Updating uniques from cache"); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); + ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString()); + ArmorSMP.getInstance().getManager().io.storage.save(); + } + if (armorCache.containsKey(p.getUniqueId().toString())) { Verbose.send("Updating armor from cache"); ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,armorCache.getOrDefault(p.getUniqueId().toString(),true)); @@ -47,11 +57,6 @@ public class JoinEvent implements CustomListener { ArmorSMP.getInstance().getManager().io.storage.save(); } - if (uniquesCache.contains(p.getUniqueId().toString())) { - Verbose.send("Updating uniques"); - ArmorSMP.getInstance().getManager().uniques.queueUpdate(p); - ArmorSMP.getInstance().getManager().io.storage.uniqueUpdateCache.remove(p.getUniqueId().toString()); - ArmorSMP.getInstance().getManager().io.storage.save(); - } + } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java index b12e112..e469f4b 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java @@ -5,6 +5,7 @@ import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.utils.Text; import me.trouper.armorsmp.utils.ItemUtils; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityPickupItemEvent; @@ -22,15 +23,14 @@ 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()); - 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())); + ArmorSMP.getInstance().getManager().uniques.setOwner(match,p,false); + Text.sendMessage(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().getLogger().info(LegacyComponentSerializer.legacySection().serialize(Text.getMessage(Text.Pallet.INFO,"{0} is the new owner of the unique {1}.",p.getName(),match.getCanonical()))); if (ItemUtils.isArmor(match.getInGameItem())) { - p.getInventory().remove(i); + e.setCancelled(true); + e.getItem().remove(); ArmorSMP.getInstance().getManager().tiers.queueUpdate(p,true); } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/TrustEvents.java b/src/main/java/me/trouper/armorsmp/server/events/TrustEvents.java index 3d25561..d0eb5b7 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/TrustEvents.java +++ b/src/main/java/me/trouper/armorsmp/server/events/TrustEvents.java @@ -2,6 +2,9 @@ package me.trouper.armorsmp.server.events; import io.github.itzispyder.pdk.events.CustomListener; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.utils.Verbose; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -13,15 +16,23 @@ public class TrustEvents implements CustomListener { @EventHandler public void onDamage(EntityDamageByEntityEvent e) { if (!(e.getEntity() instanceof Player v)) return; - Set trustees = ArmorSMP.getInstance().getManager().trust.getTrustees(v); - String damager = e.getDamager().getUniqueId().toString(); + Verbose.send("Detected damage on %s", v.getName()); - if (trustees.contains(damager)) { - e.setCancelled(true); - return; + if (e.getDamager() instanceof Player a) { + Set trustees = ArmorSMP.getInstance().getManager().trust.getTrustees(a); + String victim = v.getUniqueId().toString(); + + if (trustees.contains(victim)) { + e.setCancelled(true); + return; + } } + if (e.getDamager() instanceof AreaEffectCloud aoe && aoe.getOwnerUniqueId() != null) { - if (trustees.contains(aoe.getOwnerUniqueId().toString())) { + Verbose.send("Detected AOE damage from owner %s", aoe.getOwnerUniqueId()); + OfflinePlayer a = Bukkit.getOfflinePlayer(aoe.getOwnerUniqueId()); + Set trustees = ArmorSMP.getInstance().getManager().trust.getTrustees(a); + if (trustees.contains(v.getUniqueId().toString())) { e.setCancelled(true); return; } 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 d2411d5..01e257c 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java @@ -30,10 +30,10 @@ public class UpgradeRedeemEvent implements CustomListener { if (ArmorSMP.getInstance().getManager().tiers.upTier(p)) { holding.setAmount(holding.getAmount() - 1); Verbose.send("Successfully updated player"); - Text.sendMessage(true, Text.Pallet.INFO,p,"Successfully redeemed armor upgrade! Tier {0} -> Tier {1}",tier,ArmorSMP.getInstance().getManager().tiers.getTier(p)); + Text.sendMessage(Text.Pallet.INFO,p,"Successfully redeemed armor upgrade! Tier {0} -> Tier {1}",tier,ArmorSMP.getInstance().getManager().tiers.getTier(p)); } else { Verbose.send("Failed to update player (tier manager refused)"); - Text.sendMessage(true, Text.Pallet.ERROR,p,"Unable to upgrade. You are already at the maximum Armor Tier!"); + Text.sendMessage(Text.Pallet.ERROR,p,"Unable to upgrade. You are already at the maximum Armor Tier!"); } } } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java b/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java deleted file mode 100644 index e408ab6..0000000 --- a/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.trouper.armorsmp.server.systems; - -import io.github.itzispyder.pdk.utils.misc.Randomizer; -import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.data.io.IO; -import me.trouper.armorsmp.utils.Text; -import org.bukkit.entity.Player; - -public class Broadcaster { - - 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; - onlinePlayer.sendMessage(Text.getMessage(false, Text.Pallet.NEUTRAL,tip)); - } - } -} 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 7395772..93792c5 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -3,11 +3,11 @@ 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.utils.Verbose; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class TrustBackend { private final Storage storage = ArmorSMP.getInstance().getManager().io.storage; @@ -28,7 +28,7 @@ public class TrustBackend { return removed; } - public Set getTrustees(Player target) { + public Set getTrustees(OfflinePlayer target) { return storage.userData.playerTrust.getOrDefault(target.getUniqueId().toString(),new HashSet<>()); } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java index d78f378..f83b261 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java @@ -6,13 +6,17 @@ 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.Material; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class UniquesBackend { @@ -24,7 +28,6 @@ public class UniquesBackend { storage.uniqueUpdateCache.add(target.getUniqueId().toString()); ArmorSMP.getInstance().getManager().io.storage.save(); } - } private void updateUniques(Player p) { @@ -57,7 +60,7 @@ public class UniquesBackend { private void equipOwnedArmor(Player p) { storage.uniques.owners.forEach((unique, ownerId) -> { - if (ownerId.equals(p.getUniqueId().toString()) && Unique.isArmor(unique)) { + if (unique != null && unique.getInGameItem() != null && !unique.getInGameItem().isEmpty() && ownerId.equals(p.getUniqueId().toString()) && ItemUtils.isArmor(unique.getInGameItem())) { 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()); @@ -68,8 +71,8 @@ public class UniquesBackend { private void addMissing(Player p) { storage.uniques.owners.forEach((unique, ownerId) -> { - if (ownerId.equals(p.getUniqueId().toString())) { - if (!Unique.isArmor(unique) && !hasItem(p, unique)) { + if (unique != null && unique.getInGameItem() != null && ownerId.equals(p.getUniqueId().toString())) { + if (!ItemUtils.isArmor(unique.getInGameItem()) && !hasItem(p, unique)) { p.getInventory().addItem(unique.getInGameItem()); } } @@ -96,38 +99,55 @@ public class UniquesBackend { public void applyEffects(Player p) { storage.uniques.owners.forEach((unique, owner) -> { - if (p != null && owner.equals(p.getUniqueId().toString()) && p.isOnline()) { + if (unique != null && unique.getPassiveAbility() != null && p != null && owner.equals(p.getUniqueId().toString()) && p.isOnline()) { unique.getPassiveAbility().accept(p); } }); } - public void dropUnique(Player p, Unique dropped) { + public synchronized void dropUnique(Player p, Unique dropped) { storage.uniques.owners.remove(dropped); storage.save(); + clearUnique(p,dropped); + } + + public void clearUnique(Player p, Unique unique) { + Verbose.send("Clearing %s of the unique %s",p.getName(),unique.getCanonical()); + p.getInventory().remove(unique.getInGameItem()); + ItemStack head = p.getEquipment().getItem(EquipmentSlot.HEAD); + ItemStack chest = p.getEquipment().getItem(EquipmentSlot.CHEST); + ItemStack legs = p.getEquipment().getItem(EquipmentSlot.LEGS); + ItemStack feet = p.getEquipment().getItem(EquipmentSlot.FEET); + if (ItemUtils.isSimilar(head,unique.getInGameItem())) p.getEquipment().setHelmet(new ItemStack(Material.AIR)); + if (ItemUtils.isSimilar(chest,unique.getInGameItem())) p.getEquipment().setChestplate(new ItemStack(Material.AIR)); + if (ItemUtils.isSimilar(legs,unique.getInGameItem())) p.getEquipment().setLeggings(new ItemStack(Material.AIR)); + if (ItemUtils.isSimilar(feet,unique.getInGameItem())) p.getEquipment().setBoots(new ItemStack(Material.AIR)); } public void dropAllUniques(Player p) { - storage.uniques.owners.forEach((unique,owner)->{ + Map clone = new HashMap<>(storage.uniques.owners); + clone.forEach((unique,owner)->{ if (owner.equals(p.getUniqueId().toString())) { - storage.uniques.owners.remove(unique); + dropUnique(p,unique); } }); - storage.save(); } - public void setOwner(Unique u, OfflinePlayer p) { + public void setOwner(Unique u, OfflinePlayer p, boolean update) { storage.uniques.owners.put(u, p.getUniqueId().toString()); storage.save(); - if (p.isOnline()) updateUniques(p.getPlayer()); + if (p.isOnline() && update) updateUniques(p.getPlayer()); } public boolean verifyUniques(Player p) { List checks = new ArrayList<>(); - ArmorSMP.getInstance().getManager().io.storage.uniques.owners.forEach(((unique, id) -> { + Map owners = ArmorSMP.getInstance().getManager().io.storage.uniques.owners; + + // Check if player has all uniques they own + owners.forEach((unique, id) -> { if (id.equals(p.getUniqueId().toString())) { Verbose.send(1, "They own the unique, checking if they have it: ", p.getInventory().contains(unique.getInGameItem())); - if (hasItem(p,unique)) { + if (hasItem(p, unique)) { Verbose.send(1, "They have it"); checks.add(true); } else { @@ -135,9 +155,38 @@ public class UniquesBackend { checks.add(false); } } - })); + }); + + // Check if player has any uniques they don't own + for (ItemStack item : p.getInventory().getContents()) { + if (item != null && ItemUtils.isUnique(item)) { + Unique unique = Unique.matchUnique(item); + if (unique != null && !owners.getOrDefault(unique, "").equals(p.getUniqueId().toString())) { + Verbose.send(1, "Player has unique they don't own: ", unique.getCanonical()); + checks.add(false); + } + } + } + + // Check armor slots too + for (ItemStack armor : p.getInventory().getArmorContents()) { + if (armor != null && ItemUtils.isUnique(armor)) { + Unique unique = Unique.matchUnique(armor); + if (unique != null && !owners.getOrDefault(unique, "").equals(p.getUniqueId().toString())) { + Verbose.send(1, "Player has unique armor they don't own: ", unique.getCanonical()); + checks.add(false); + } + } + } + return !checks.contains(false); } + public void pollUniques() { + for (Player player : ArmorSMP.getInstance().getServer().getOnlinePlayers()) { + updateUniques(player); + } + } + } \ No newline at end of file diff --git a/src/main/java/me/trouper/armorsmp/utils/ItemUtils.java b/src/main/java/me/trouper/armorsmp/utils/ItemUtils.java index 65bc8f7..7af21ec 100644 --- a/src/main/java/me/trouper/armorsmp/utils/ItemUtils.java +++ b/src/main/java/me/trouper/armorsmp/utils/ItemUtils.java @@ -30,39 +30,53 @@ public class ItemUtils { } private static boolean isDragonEggEquivalent(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); return m.equals(Unique.DRAGON_EGG.getInGameItem().getType()); } public static boolean isArmor(ItemStack i) { + if (i == null || i.isEmpty()) return false; + return isHelmet(i) || isChestplate(i) || isLeggings(i) || isBoots(i); } public static boolean isHelmet(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); String n = m.name(); return n.contains("HELMET"); } public static boolean isChestplate(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); String n = m.name(); return n.contains("CHESTPLATE"); } public static boolean isLeggings(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); String n = m.name(); return n.contains("LEGGINGS"); } public static boolean isBoots(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); String n = m.name(); return n.contains("BOOTS"); } public static boolean isUnique(ItemStack i) { + if (i == null || i.isEmpty()) return false; + Material m = i.getType(); List uniqueMets = new ArrayList<>(); for (Unique value : Unique.values()) { @@ -73,6 +87,8 @@ public class ItemUtils { } public static boolean isUniqueArmor(ItemStack i) { + if (i == null || i.isEmpty()) return false; + return isUnique(i) && isArmor(i); } diff --git a/src/main/java/me/trouper/armorsmp/utils/Text.java b/src/main/java/me/trouper/armorsmp/utils/Text.java index 23774ab..f4ef6a4 100644 --- a/src/main/java/me/trouper/armorsmp/utils/Text.java +++ b/src/main/java/me/trouper/armorsmp/utils/Text.java @@ -1,12 +1,14 @@ package me.trouper.armorsmp.utils; -import io.github.itzispyder.pdk.utils.misc.Randomizer; +import io.github.itzispyder.pdk.utils.misc.SoundPlayer; import me.trouper.armorsmp.ArmorSMP; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.Sound; +import org.bukkit.SoundCategory; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -28,41 +30,35 @@ public class Text { } public static void sendWarning(CommandSender sender, String warning, Object... args) { - sendMessage(false, Pallet.WARNING, sender, warning, args); + sendMessage(Pallet.WARNING, sender, warning, args); } public static void sendError(CommandSender sender, String error, Object... args) { - sendMessage(false, Pallet.ERROR, sender, error, args); + sendMessage(Pallet.ERROR, sender, error, args); } - public static void sendMessage(boolean allowTip, CommandSender sender, String text, Object... args) { - sendMessage(false, Pallet.NEUTRAL, sender, text, args); + public static void sendMessage(CommandSender sender, String text, Object... args) { + sendMessage(Pallet.NEUTRAL, sender, text, args); } - public static void sendMessage(boolean allowTip, Pallet pallet, CommandSender sender, String text, Object... args) { + public static void sendMessage(Pallet pallet, CommandSender sender, String text, Object... args) { text = formatArgs(pallet, text, args); - sendMessage(allowTip,sender, text); + sendMessage(sender, text); + if (sender instanceof Player p) p.playSound(p.getLocation(),pallet.sound.sound, SoundCategory.VOICE,10f,pallet.sound.pitch); } - public static void sendMessage(boolean allowTip, CommandSender sender, String text) { - if (sender instanceof Player player) { - allowTip = allowTip - && ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled - && !ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(player.getUniqueId().toString()); - } else { - allowTip = false; - } - Component message = getMessage(allowTip,text); + public static void sendMessage(CommandSender sender, String text) { + Component message = getMessage(text); sender.sendMessage(message); } - public static Component getMessage(boolean addFancyTip, Pallet pallet, String text, Object... args) { - return getMessage(addFancyTip,formatArgs(pallet,text,args)); + public static Component getMessage(Pallet pallet, String text, Object... args) { + return getMessage(formatArgs(pallet, text, args)); } - - public static Component getMessage(boolean addFancyTip, String text) { + + public static Component getMessage(String text) { if (ArmorSMP.getInstance().getManager().io.config.fancyAlerts) { - return formatFancyMessage(text, addFancyTip); + return formatFancyMessage(text); } else { return color(ArmorSMP.getInstance().getManager().io.config.prefix + text); } @@ -101,14 +97,9 @@ public class Text { return LegacyComponentSerializer.legacyAmpersand().serialize(message); } - public static Component formatFancyMessage(String text, boolean addTip) { + public static Component formatFancyMessage(String text) { Component message = Component.empty().appendNewline(); - if (addTip) { - String tip = new Randomizer().getRandomElement(ArmorSMP.getInstance().getManager().io.config.tips.tipList); - text = text + " &r&7&o" + tip; - } - List wrappedLines = wrapText(text, 50, (int) Math.round((ArmorSMP.getInstance().getManager().io.config.pluginName.length() + 3) * 1.3)); message = message @@ -116,7 +107,6 @@ public class Text { .append(Component.text(ArmorSMP.getInstance().getManager().io.config.pluginName + " ", NamedTextColor.WHITE, TextDecoration.BOLD)) .append(color(wrappedLines.getFirst())); - String active = getActiveFormatting(wrappedLines.getFirst()); wrappedLines.removeFirst(); @@ -211,44 +201,47 @@ public class Text { NamedTextColor.RED, NamedTextColor.YELLOW, NamedTextColor.GOLD, - NamedTextColor.DARK_RED - ), + NamedTextColor.DARK_RED, + new SoundData(Sound.BLOCK_NOTE_BLOCK_BASS,1)), WARNING( NamedTextColor.YELLOW, NamedTextColor.GOLD, NamedTextColor.RED, - NamedTextColor.DARK_RED - ), + NamedTextColor.DARK_RED, + new SoundData(Sound.BLOCK_NOTE_BLOCK_BIT,0.5F)), INFO( NamedTextColor.GRAY, NamedTextColor.WHITE, NamedTextColor.AQUA, - NamedTextColor.DARK_AQUA - ), + NamedTextColor.DARK_AQUA, + new SoundData(Sound.BLOCK_NOTE_BLOCK_BELL,1)), SUCCESS( NamedTextColor.GREEN, NamedTextColor.DARK_GREEN, NamedTextColor.YELLOW, - NamedTextColor.GOLD - ), + NamedTextColor.GOLD, + new SoundData(Sound.BLOCK_NOTE_BLOCK_CHIME,1)), NEUTRAL( NamedTextColor.GRAY, NamedTextColor.WHITE, NamedTextColor.DARK_AQUA, - NamedTextColor.BLUE - ); + NamedTextColor.BLUE, + new SoundData(Sound.BLOCK_NOTE_BLOCK_BELL,1)); private final TextColor mainText; private final TextColor argDefault; private final TextColor arg2; private final TextColor arg3; + private final SoundData sound; - Pallet(TextColor mainText, TextColor argDefault, TextColor arg2, TextColor arg3) { + Pallet(TextColor mainText, TextColor argDefault, TextColor arg2, TextColor arg3, SoundData sound) { this.mainText = mainText; this.argDefault = argDefault; this.arg2 = arg2; this.arg3 = arg3; + this.sound = sound; } } -} - + + public record SoundData(Sound sound, float pitch){}; +} \ No newline at end of file