From c5a29b3eb20ce33103b7f61fc9d79599caa7e288 Mon Sep 17 00:00:00 2001 From: ImproperIssues Date: Sun, 16 Jul 2023 21:27:50 -0700 Subject: [PATCH] used json files for saving config --- build.gradle | 6 + .../explosionscontrol/ExplosionsControl.class | Bin 2911 -> 0 bytes .../explosionscontrol/commands/Commands.class | Bin 3451 -> 0 bytes .../explosionscontrol/commands/Tabs.class | Bin 2403 -> 0 bytes .../explosionscontrol/data/Config.class | Bin 897 -> 0 bytes .../data/ExplosionConfigFile.class | Bin 985 -> 0 bytes .../data/ExplosionConfiguration.class | Bin 4860 -> 0 bytes .../data/ExplosionMode.class | Bin 1788 -> 0 bytes .../data/ExplosionToggle.class | Bin 5917 -> 0 bytes .../events/OnExplode$1.class | Bin 1907 -> 0 bytes .../explosionscontrol/events/OnExplode.class | Bin 7169 -> 0 bytes .../events/OnInventory$1.class | Bin 999 -> 0 bytes .../events/OnInventory.class | Bin 6025 -> 0 bytes .../explosionscontrol/other/Item.class | Bin 2292 -> 0 bytes .../other/ServerSound$1.class | Bin 1055 -> 0 bytes .../other/ServerSound$2.class | Bin 1059 -> 0 bytes .../other/ServerSound$3.class | Bin 908 -> 0 bytes .../other/ServerSound$4.class | Bin 912 -> 0 bytes .../other/ServerSound$5.class | Bin 964 -> 0 bytes .../other/ServerSound$6.class | Bin 970 -> 0 bytes .../explosionscontrol/other/ServerSound.class | Bin 4574 -> 0 bytes build/libs/ExplosionsControl-3.0.jar | Bin 29960 -> 18495 bytes build/resources/main/config.yml | 18 - build/resources/main/plugin.yml | 11 +- .../compileJava/previous-compilation-data.bin | Bin 16291 -> 16185 bytes .../explosionscontrol/ExplosionsControl.java | 26 + .../commands/CmdExHandler.java | 14 + .../commands/TabComplBuilder.java | 60 ++ .../data/ExplosionConfig.java | 164 ++++++ .../explosionscontrol/data/Mode.java | 10 + .../utils/FileValidationUtils.java | 21 + .../explosionscontrol/utils/SoundPlayer.java} | 511 +++++++++--------- .../explosionscontrol/utils/Text.java | 96 ++++ .../explosionscontrol/ExplosionsControl.java | 51 -- .../explosionscontrol/commands/Commands.java | 43 -- .../explosionscontrol/commands/Tabs.java | 25 - .../explosionscontrol/data/Config.java | 19 - .../data/ExplosionConfigFile.java | 18 - .../data/ExplosionConfiguration.java | 139 ----- .../explosionscontrol/data/ExplosionMode.java | 44 -- .../data/ExplosionToggle.java | 110 ---- .../explosionscontrol/events/OnExplode.java | 216 -------- .../explosionscontrol/events/OnInventory.java | 118 ---- .../explosionscontrol/other/Item.java | 110 ---- src/main/resources/config.yml | 18 - src/main/resources/plugin.yml | 11 +- 46 files changed, 655 insertions(+), 1204 deletions(-) delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/ExplosionsControl.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/commands/Commands.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/commands/Tabs.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/data/Config.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfigFile.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfiguration.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/data/ExplosionMode.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/data/ExplosionToggle.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/events/OnExplode$1.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/events/OnExplode.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/events/OnInventory$1.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/events/OnInventory.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/Item.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$1.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$2.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$3.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$4.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$5.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$6.class delete mode 100644 build/classes/java/main/me/improper/explosionscontrol/other/ServerSound.class delete mode 100644 build/resources/main/config.yml create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/commands/CmdExHandler.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/commands/TabComplBuilder.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionConfig.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/FileValidationUtils.java rename src/main/java/{me/improper/explosionscontrol/other/ServerSound.java => io/github/itzispyder/explosionscontrol/utils/SoundPlayer.java} (86%) create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/Text.java delete mode 100644 src/main/java/me/improper/explosionscontrol/ExplosionsControl.java delete mode 100644 src/main/java/me/improper/explosionscontrol/commands/Commands.java delete mode 100644 src/main/java/me/improper/explosionscontrol/commands/Tabs.java delete mode 100644 src/main/java/me/improper/explosionscontrol/data/Config.java delete mode 100644 src/main/java/me/improper/explosionscontrol/data/ExplosionConfigFile.java delete mode 100644 src/main/java/me/improper/explosionscontrol/data/ExplosionConfiguration.java delete mode 100644 src/main/java/me/improper/explosionscontrol/data/ExplosionMode.java delete mode 100644 src/main/java/me/improper/explosionscontrol/data/ExplosionToggle.java delete mode 100644 src/main/java/me/improper/explosionscontrol/events/OnExplode.java delete mode 100644 src/main/java/me/improper/explosionscontrol/events/OnInventory.java delete mode 100644 src/main/java/me/improper/explosionscontrol/other/Item.java delete mode 100644 src/main/resources/config.yml diff --git a/build.gradle b/build.gradle index a0b1109..a93cea1 100644 --- a/build.gradle +++ b/build.gradle @@ -45,3 +45,9 @@ processResources { expand props } } + +compileJava.options.encoding = 'UTF-8' + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/build/classes/java/main/me/improper/explosionscontrol/ExplosionsControl.class b/build/classes/java/main/me/improper/explosionscontrol/ExplosionsControl.class deleted file mode 100644 index ec52b28cc38fb25dc66857d98492e52e3d85eb6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2911 zcmb7GYgZFT7=DJJ8>e5}#^!t;RGpb9 z^nz->2RqPjV5fy$$T2vZTPU<_k{NB2!I+u7bbGdNn<3Y(Jx4I?wy+0#8TQrqq98Gs zNAq5^Kr0pTAW{s+huS4OxN2fQ4j6dZ!a*Ej*p&kFa*Qd%&Qd6O+2tyl5=!x^VA#`1 z`J{=%IAXxIFrX82Zu78XU|X>#2w(Ml(!NcJs8Kg@RBIb#II|T+v$9(Cg-IDWZs7!m z73qjVoTBCkM3_$>ZP1q=o-=Tj;q?FX zc{0%EWVmdifJ_#X4CeYM(fGb+p@=Ekj*GEY<3X8{*r|=uPPsDXbP_lx5{lrQe&JAQ zN-7#%u?l74CNd^&W5&R&g%2>tV5jixXo{hida>|OxDASq;lu_s*F>5o*4Se3K4dt# zIe1NJ<;?ODc{iVUchAB{_?RXw*`)(gUH1j$lVPxSK_oM_(&pzreYDz7zk~E7IYf_&BXn2VxJJ}G z1__2^c!1;hkxtg*ecXz-)`~Yz(P~_hNIy#=T{o&9w!kR@Y&4~)uc@d90VIiQ)Q`rT wKrbPX<4@ss;TPIwDeT7x+dA!a;d6xauhXcAV>$kQiLYtTB>EeCi|=vZAB0*~1^@s6 diff --git a/build/classes/java/main/me/improper/explosionscontrol/commands/Commands.class b/build/classes/java/main/me/improper/explosionscontrol/commands/Commands.class deleted file mode 100644 index 4736ca2a69c2d38bd21a58d14526bd9c1235cf56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3451 zcmb7G+j|>F75|MTYbALdC(5OfYtnUY*h$(=3%IovT4F_RO=Qd1PMoHNGM2{j#;aX* zcjXJ=R&H&%-)U&Mm5YIzOZ{MKKk$_&Xup0u@CWpd;H`WRII~(=>sTb<&zhM%Gv~~? z{LY#4=FP1?0yu~DB-#*B5LMBR7{lIce39!Wx5|29_L?Yq46$>DWq1!WMEd$KClN(uy2eeH;b31#rMj(|{;P3l#A@2Sv}8MG$yIQa;c&=GVR?qP zqEDE7MK}o@#|Z@|RlFO03=dR z)b#nu>D(kkDipH-Mk&Japo$@681Aa@1wm{@?#&n;A;NM!Zg~{#li_FwoGmcff%oHK z1&^rs0M1h^LZP??-c!OV35PK1(qc@wE-#b8J3!UAhLR?W3kq^7M(`-ZzL3;mKX(`s zlq)kn;>gHGw$wbs)bobxQOrm2K?N68copHN^yQ_%DjJ@=vCva)jn1O{wEG)10ski{iYkX9^JvDp+JV);u^$cwH{k zyu#eDU9(DV=yVi=NtCgo;$yPBCJBoHqEqxLd|Vpy35JJSq|pE9&rjVk>x1la8?Ofy z-e(w&hP-l1{^gcMvE~ClS}*)vdBYOpwaTn;runR_KB>H2rH`j!)!-Hv-=H>v+Bl~Dg3@{MUewSIWBwoS~ z6#P(P^G6KFn>eQ@(_RpIJ=^MU!3ZzPHYK+D4b3zGYf%i1wIJPsS5q*{6o^3M8@VH^Q8rLi;9oix{Yl1}mieZqA zS`?Guk7)@-!h!o6`EEaSMd8CWo?I#gWwQ?>)}B!K1o%U;nVc?%b8kN8b3o{I?asc_EUcV zd)43mERAv-)CGQyMzwwbpT`&Ii{V*3M?+<`!&Vh)nqtoEzv$D_ig+ zVHGDNtrpOh>a=}n-{|EnT$hB?X~owkx)xa@E96`87Cjo*@fUxNK>B%vdU?oxo*H!% zhp;O)%9-L%H(C^3TNhGj_ z!+0KFq}AKhk$njdLLt5hlJymeDVP>SQLesg)K1^fRr#NgNS>^(}mxqN~y^ z-yvE%z6(&3+j&!VrhDk0b*bHZ{)uh{g@54eJ7B{K%KwtxeVKOmcfLb9MDRW0YQqZ@ n1K=cS@O`@R$Nu=TKmN=gf8me6^v7S54Ior8{06_nt4RL`;km&s diff --git a/build/classes/java/main/me/improper/explosionscontrol/commands/Tabs.class b/build/classes/java/main/me/improper/explosionscontrol/commands/Tabs.class deleted file mode 100644 index 6a0978342add9f1766f457d134a13e2a261e9acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2403 zcmc&$T~ixX7=BK^P7)RfP*PKBTPn2)v|Xf%N)X$o)?x##2BD>X9g;(`WwV>^Zm3*% z!raF zO```IN3VuH^fMf@ow~l(-qz;X}gAPxk~kdhfi3#U%9p)LqXX!^~Q2@L&)38D6c!Gq(M-CvBY z)^0(@p0k`i2w_eYpyG+@#)4@1b>t{BoO)RWIIc3JDn{KBUfZFL`2PQ>+6xlOnxeT@ z6Jz@tYiyDs-|cK4B&D#*zzn)5Dt6nc%4>#d`4q9^UQj2SF0(7P?YW*KS_{%^*fqC5 zft56F;||BFhP(KTx@hl4G^|Z~L+WK86|Z&SDHldHhq;CNaG#)YJmdY#SE<&iuC$MlrbyPn4-Py-@)%ZMrtO0ZU^Zd zWOgt-lgK4zcw{=6<2!ieC(?rNEi!pyEt71XnopW zCt}md;iR(6(Jw+j^{3_vTP_#R#hzdc_zn38R&w!QXgB7g&r*UwFJbG$Ff#Cv#kcgv zs%);)b5DrFY}D*M%=sR-@jfp3akg<8SBNMjE#WG8P2n4SfNSJ;829lZNfYEL;3kmG zlk6kfIg8leL{N%jisJ@H561w<0!P803=sBy?Js)Y7fCsSo0+ug5dxs9ahpP^L~|2F z;`sQ}SZ&H@^TH3{u}6qSef+WQ<|K%h!HY1*k_9S!9E0p37*C;$Ke diff --git a/build/classes/java/main/me/improper/explosionscontrol/data/Config.class b/build/classes/java/main/me/improper/explosionscontrol/data/Config.class deleted file mode 100644 index 25fe29bd8be63df4b7d4a9a4ba690842a78880f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmb7CT~8B16g|@xw%x7*6%`f5Dqh+6j*vsH5S*570!w5RN5RBb5-( z;9!4u?+wF?$k>Dri?cJ8bGk~Wg%vp!@{vj<-=*M+W^k{Ln+&V&YBx)ZMCop34jUJ=&yVS_QI=>k2|>QVJ*Nt+^3$`d+_?g71C6? z!qB9idwP-!9ZQDwPB?FflgAIIDtk?=XDL!z?ib^sv~R^QC8QOZSft0osxqH}wfvo$FziIv%by#89&wX$r|fY0ee|pJ z)GMYl)cbKd8$18V6gHOSRFHK}Vz(?on})GMW6a=}<4C(I?P-oFwkhMZGFlh5zk+?F zO$ARVmd9m$N-=O3u!(1sHL!)}gp|eYDK%lA;I(di!O{l;*&M+Nb?;pC+ME&*;Wym= Ujt2~%;gv1tE9#VmgjKNp2P_8X7ytkO diff --git a/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfigFile.class b/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfigFile.class deleted file mode 100644 index ede67649db55e5c74c27b7037f0d803fc7a2884f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 zcmbVLTTc@~6#k|cmbP1Zu~gJz1+BK_vR;X%#0QBa#swcR7=4?zV;Q>LZFZ-~v;V?h z;Il6xni!w`75)xm)H6$Kfj8Mr&Y3ya?_B2l@6TTWtYRgJ2%-jJCgPZ2$nNqzZaLiT zSkIcfqNNxnR;4S|LxyOzww=Tz5(bhcQZN~Ep5L*WgKk$U>ru!U5*?vlc)rsP81mJc z9Y!1|=~%W5R3n8cWDI0Y%Y_5XZ7hDowfBF1=p<3-Bt^mjq*0=GQ9*|AWGP85 nOj;zI6~qYNO*)mx>K1MjkUQj&LgbfziiMw;C(&IJMR4yg=DYaj diff --git a/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfiguration.class b/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionConfiguration.class deleted file mode 100644 index 13d37bcf83f4a021d07a16df46ec00446b3d72b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4860 zcmb7HTXPi075-YcSym&k)&_yGaj+%Ol@%5!kyl363JGjh!bSoG2zExRL5wuJv&@bp zMB>CaaT3SQ{boCfW1Nd~F$p+E5T`1Y=RD;#Z}|zXvh$Rb$=5wQ(s(pVN=32Vr@PPB zXU=!d>7&1W^xj_p^y5|%RjAfbqoWpe0(Z?C3r5;DiZkisQ?q8?6R7LAik5dspt`l~ zl!k;1Vne^2B+??g5Cmq+G7SLu)Z_Fr|0{67GSzu4=TFn@+BsAP3zh$ey);N_@ z@Uc;lHRN5>@XRrDQ37v53-)N(tD_Zd0(}KDZ52wcQ!?GOd8uSOWs4u0cZ#0t z*y(A*Gt$GsGF@=qnwfVEk7opG7k!_m)_P+TI?$=1OUFK>1-dtK%cwKW&)0^>2D7>0 z!vYWIHmaSGAGu%0!}9KgVcX8)MA4Ir2Xq{ii@I7Ia+gS{EjK=?<5O~@L2Zm!t~te- z+<8PtCahwbbd}tARL7xJl~Jo`<_%Zf@|cc6xl^yeWbpVJLpl!2^`u(Q+D?8hi4h#p za8$?RctRi@idb^6>h1J-a+f}B6zm8IjkaSB?|ICC(3gK`RaO5!A#+mkvzt&%vJr1Y!joGg)r zA){<28EI#9oW*AtGYf`2ZyrA{FcOz;8;_#|o)*}?#>h(CB=A{*9cy-j;7MRAURgy@ z0<1=Bm4h%!fM3zH2HTIN1TF|{TeGPGO2e$c-K#zuzLYmhGGCLhQP5D-;h;ovLm`n> zB~n1LlXGTfOjqE(p#02xmYue_%KDi0cUg)oxH`&`pM>Z5j3zOU1r3WjF3F0wUD*($ zO`aAFw@5e{PM39j4xeWsE1RtEdt-PDRTuvm$h5I=cHj#-z9CjGL}y*w$rZN|sv|=#WPyWo6?%1RGN2XiJXyJvLvMGTjMZ zA(eCThJDH)2mvaKH8M>FHv2XQ`9~C4NCozX@9-0=QceB*UXw8yl41r7(#Vi6R*2=9 z8t;O|#~`zz2>)1W5`-TVc`muwFzy-oxlyB3`M?BeQqJKPr-QP#s<;z4*t((XWtmqV z-V)#pxhgXRLMy63^Dzw01j!Xz3Q~r3Avnb}h5;8ql3Yi`(`KAX_V0v=gnRoN1j1PgG@elGo8QAno)^WVD=NhF^)4SkI zm$%g6w@LgCZ)>GxmNm|Z`$i2n1$O=KqwLFkhhR7R zgDMDo83~T;wAfcx$$mtQY(dn>jzf*?FVx6(LXB)5)W~LmV~RMn_zHi&3W$H98Z}(K z(|!x$&(KbH{0W-`-oqB)7VaMHT*kI#-1{2p{n@Tbjua1b*ge_qpT3Fa_IJ>J6W#vM z;}5<5(B}{R{xIMV*&Cg=F+A4Zl{&VJQ3=qMI>Fg8CT`=jMCwYN3&}l{p9#sml#P(w zM>!vo`zf0td4TdvNY1{6&7-$5$IrO94DSZrS%VTj;7fE7@2jyIU!!A+*va1}?(X34 zy>$IfbhB$di2E^sUF^3Wz$lyL36gXc4`Pa4vV~@1wGe497D(4~)cQ8s@dlrn>*&N^ z(S^UWmHj6Pd7m_XK*SHRA0MFyFY>knB&Z4hz}N8-?OMQPyo_&WyNZBi7UFV97!#v0jVE>W^X>#F|Lr`XJ2mhy@W)G~3JudjrcOmm>1V01OFt%R0f?EfrA zIU7~J7_0n7ta4vec|KP8YOHckRCy^@`OR46-l+1kvC2P>Rql@}Ux`)zMXYjnRQZKi p^615Pn`uwro{tg7Z;q;7lsLX6TUVnLol`;8fUsrGiU)Njzie-Fl--w~K9SDN?iecSYGziV#o+;cinO-B*$XqYun!fDFr zKZCkI=usy7wl{FL?g}iHN4(cOyWg*kD6A-S{cdeE0s|1fz*z(D;yru`NXU$gv4GA zs*P4XsqhYInAJk{7noG#;REP=`~hj@As-&n)Lxj0vVJ9+ephs1fN|%u>6n&~Z(Y9uw5WCfTOY`UiT~ Be<1(> diff --git a/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionToggle.class b/build/classes/java/main/me/improper/explosionscontrol/data/ExplosionToggle.class deleted file mode 100644 index 6f63cc2560f9c5193728319dd73c4050bd5a5614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5917 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 diff --git a/build/classes/java/main/me/improper/explosionscontrol/events/OnExplode$1.class b/build/classes/java/main/me/improper/explosionscontrol/events/OnExplode$1.class deleted file mode 100644 index 47f479e3e2585f718daa7eb373188e1ae3299996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 zcmbVMZExFD6n@-fb(7t;p=_*sWdp-n7eU-j*l;7&ec15B*b9TW8U{%e`YrEbwG?Pv zRdbcA5~dXUBQL40n@&R^AC%TX6mbxxbr9t#2kBbYGZd0OhJNHE^iLb5!rY2>cit%3 zddZS-;~7uK13kd-JWfcE!>Hy3jxQlKG_1>bLBg2_&ZeXKPOzq0q1~*m&v>q1)1oMh zvKYi^8E1Hk&Pq7f8Qsq0R30@b6PFGq;Gl_!^Ld5~Jjj>-BVuCGZmjsa8S>#G!zH{V zAv<5zO|7_6u__WS>pi)8@4@U+OBuH7@JbtfE$4DU_G&N?vU87Q=O}VWw_rg?zcf z9p_VSFuWrai+W|2=Gb$03?qv%jLVqd!G7IgYty7Mq$|V|aCGe+o+grV zlVOS{WxOLPbywND1j?aHpzwv1efwv~|7nH-iWKXjZs(^Bjef8Fe~)-1D0O4F#W2g4 zOIsyN)T&r1M zb)$;2>Ql@HjIiqX3r^&5zANmt6Q{aCcX^j*?XVeD-5HP1==Ng-p4vN z2z@-n$Aq8YQ+!7FIljP`gx}yhJSO}BKjRm|U-3KsAWY$X3SJ)}$YKy@@fFUaOstDO zo4!d5F3M!Nzz6eR28+wu!vQ;_Q4y=%!2)3#i!?3?$s#@=9H5=Lu#Edtrzx@Y(J diff --git a/build/classes/java/main/me/improper/explosionscontrol/events/OnExplode.class b/build/classes/java/main/me/improper/explosionscontrol/events/OnExplode.class deleted file mode 100644 index b0b1fc5febb9c8c655b5572f2528d3d7339b7ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7169 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 KyTruBCI17QhI%&u diff --git a/build/classes/java/main/me/improper/explosionscontrol/events/OnInventory$1.class b/build/classes/java/main/me/improper/explosionscontrol/events/OnInventory$1.class deleted file mode 100644 index 50ed7c962a57109a3c5376d113c540df4222d88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmb7CT~8B16g@*rw=D})KBS@|O8N4G1q3va7@M-#hIUJKE5z_nx7!IUEIZBa7WEhT ztR}`7!w>Km`DDDakdy~rNOtDjbMKwG=kA?9|9+hV*u={$`jAkNRMC$V!>9-jwO04! z#ErC?9r3`mJ%-eo?R9y`kY89ls9uxuDuXmK3bHB&pfaqUa?L&M1fs(OjeqKRB6Nix zI>L_v;c5Jg`%$RX{faLw5qvJJFiaJ!k8b1~)$C4zY7{PH6nZlH4k{UvJEUS5IfjAl zim5kC<)ZmkXBfX$muzoD#VE!Y6cMytU-pw&Sga_x%`kavpV^vc`-hq#tgdsk?Q*ZJ z2Z0D=rM!wevXWXdb$wSin`OPYB?EU=+>?Ps!)Qo8rQ$)HNW59A7<#E_#({?_9?8J? zex*^S3#=WzsyFHe8Sko9d9k#$!wMhV0Z=y1PCz+$VO1WELxLg1CeY3*-bEjhRJ3~hHQ4$*$ITI zwPMwlzFVKIt$k><+S-!ZB|vL!mDbv-t~AGTI&m7Y73&CZf7fqdDyGxwfz z?s=bc@8fSBc?iHdTIqv?NisYN3Q$Oxwp-n!`r~S%*WcQ`TZ>tQ!gYE=w=N<~s;chr z!HXgpJ_VDZ5LOswufKb+zhAff+8!-o`SpYt40E5qDf1SL>#_cjm?jkWYSz|1!=BQ5 z2#cz!o82@LmTv9yZyX#@6CwLOAY%$)&Ul#3adn?&3Vx<3I143&=}dc+@Yvpj#ko7= z;V&SF%up~Bvj{R1>Cm;kgvtpK1so&KL8*+n3g%%xZ|CAP&t48`FK-gnt++;*!MkL2 z9GtB>cKENwurU#?&g789lj z9SoW#D_bm`N_<|9SZb`FB`8CMu>VrRk}9`3Tmp8YFV4`O- ziczhg2FnPOnaO4&rdliyVRo*bGYf$toP!lI{0eGuE_P!CJx1 z)b^&XhW2Q*wWTZA+!Wj-*6I`l#G29+4TZbbciMau;X+&_<82BqM*W0p3yqmM=$M%u zG7_zCi-y{SK;s;xgo8M!U_Dsg*#m07#%Qe9t-966Zz)SnSSjJj<1zDioevwZQAU%3 zORy;?6*z85@CxTs^#s$L=cXC#Q_YBW#h{jmX@Tl(lMzOXj8+Akv4ya}WjU8eWzvHa zbJ2ZCj)vvAzVLrjihyPZi6APYT|o!7a=f^ew9U=+okFEGZcCpMiK8TfP6gYr zo$*;#HO^X?>DGdiFj;;Pke4aA99`@TDGo@L^%9SZeCMg!CX#3wR0Z84UxGoq~7adNz}=Frh4mGG}Q~?wnE*4MXf>T0du)D>yk(87M|)5NgxiDxFK#1|KR4iG3Ou}2biMJ$^8nx zfG=`#h--;ntIzJ2n#97F6nq&62}P;F?v!2NMdE166LvDbLb%{e0>O!>LDR0KJ`Cfl zqOzs!%rs6VqJ)j$u#6)Lj^b+*#+;oHQ~uU$XjE`{TTl_%t6Q zGu=tTo?mt5Bt?1{#?uO(5qZ~>QukoDK1(EyJm>Ta;Im`3+=%mN$)49)BIf1*3=Oe&Eja4-F32aqv z>YMn`#&wCSwVmruYO0;=$O`4Qkn8$r79s>D;5J`VFpA7ar3Qa9; zs9YS*JuNKPxrC7mV&Z_x8*4o}A5n>IQR^-Ojs^1+`K(%*3MC11bI@{%JC_5dz?*T! z7uGJe&t9BEZ9~g6JNJZRtCk(9ZIG!9XdQY=XQ!x7Bn-<=_3RT1b2hW>7!uEoYN98u znaq-pPd#Q#bNa1mt~9mPX2`3+?~KEphMJQE>+QN82y9E!1(sSHIsvA zcl@r!(f(q)Ybw)!yQW4-1l4#v!fqAt(oz`4)fqdE_1p1vQ622kqq({1nR&cOd+yH~>T>@mCQ|A`cT`?q~O&XQOfnwYY`hOz4i;sT53 z%9#U$xMeX%uy@%o-hLSGkg&D1U|AabZTK68@t!n3m_g^y580oUqr^UX1h=qWZcXF% z5qzS~yR6hZg3p!~3IYy?_c$EVBd5vXNjvT=xz}cOhKoI$`au`@`_g#8-u@_tJ4?NX z@L*lhFb)YGZ%E_oEA9g*#I_RVllfQ8zc&6|$-le!_XPi5<>iH?MWsb)JeRB?;i^7ID*MSuzT>T19&_O_-uYa#up1OWC4GcAMh>*@E2LYU*-qA(gFNU7V!7^ z0oxqFKV<>`njf&*0sKc6@L%}>3+g-vQN-7H*GkXgHSEVt_INWMwZ~(4#vYH;5;0N* zt+vNC6tc%girHh2bX<(w@pEKR9a>oXv-m_mn-7e0nEE^{#(cg7D&t#@1&E;>CI{?( zp1l!E_{da&d$AM`@Ga9poQ(%jg@@RpkMh;mF)YV%z9@PbEATpp@(I*Z0anoroJSRW z9aW9hv<7Ra5o;-e3+OV`Q49g#!l3<>Em z7}AqSO2=VI&x4Oy{Fmg5;@3I37EmF)G(#!ABokjIW3e<$MdX7AYo$AAGKm9B zSh|sl`K^$5zJjLk8^?w80!^i9Ow%hpO=pp~+9;Nupy{}p^V>}680)bflV~PGY{v8x zY!a_5{)=UVWo(d9CZp2%=bYf5QoEpJO4*x;$TUmFaFzXcf=%afV*w2^I}6QWs+?u1 zlt&NE<)=jRXukMjK1QgF-{$hl0*0xupOyBr%6`_+a$XmQ=n)<<%}eKypUy?;{{Tll B>4N|O diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/Item.class b/build/classes/java/main/me/improper/explosionscontrol/other/Item.class deleted file mode 100644 index 29ef88d1ffac3b30bc6dfaaeb30fc2c9c51a8431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2292 zcma)6T~`}b6x|oFkz|AtQlg?QQf!mZcC;UUC8a7zn;PgxTB_;OBuvwh$xPN{!jeb- zj}N+*F2o0afIq6seP#xdOcLZ}X6~JH_uglpbI-qT{{9C*2``hFz+?hb8s5S=g^RA& z)a%{7J zeM8|&E?Q9BdmcQ{h6c@{_S|=(gcB z^{Ve#PBU`gT@CNyeLBD+JqNCi@o#{qn6HVr4>Wv;iwX%MFd?$dM{Hf+vh|A9@yR8T zOBz1HvVvyp?h4nYZ8SSlte2yWIF5;quW0xfSHkR`J9W=A_KdnszNuVI%9%qxfr5rr zTvM3q$M7s!N1Idr zYl~GXRL~7dN=J3{UO$H*0#>E^4-e);b^l>-oc)42nKz9}8cJ#g>L~ z*F9EX77lhce}Nq%$c^7#!{54kV@ zX9}x_P=&%F5`QA~J9j4Vt?Xlx&jp^~Ohgvz!74a`4SdIy#BAa|@i>kc8R9;Ua5IHJ zkXk*$+yn~pd5G+bIQk`OTEaZF_RupY=ovgfIY8$$BC4pa$IusJ=#zcg^F%KYeRT}_ zLwry43Q;w_feby_;@396C-4ZrP}efo!W+-(QjE9Xvs>i7P2M|Wcpu{lQI(9oQRs_D zxO@uwU81iM{oWY#r>F+#I-W)7)yT7~lwt8NTs^||QwZ*}+z(jJavwqVq$pWD$4)@N z*%%SXTMSGJ!4W=H_${zd+DO_BOjrsW+MJBAl+4PgtTBW;!w9tz2w|aKkb%Q=G}4#D jNR6>bKM;wNmQN{pOw(P3U%49=I?T!*fu!(b5LNpRt@G%l diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$1.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$1.class deleted file mode 100644 index f5ca352e1b1f84ec5266154a4c3cb2aff3c0aac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmb7DO>fgc5Pch)q;Xst`VmM!D3Ab&OY24)Q*odI5h-nfph(iKGekc%2g+v$bPlKkWGdnt{zfyd%^6cMqjd#hsBVedO&#_9ml|NL(%xkzBZM(^%6&5qEM}wXueEhRU^r zu|MSfNkHUZrkU?2QhL3B6Z<0}Me>5dsMWg~wPfS2=EH=AGB$JAvayXF26w^RF_@Y( z!%pr0oajCw(3;oYfZYW$Pvo;&L4J>AEXzA^GWK+~exQRRdPrq3;D< zPYJ!BJ5Bwj49^#3QEfD-lWHOvmOF{(k50U3Uecn0Q9geybk~d5X6WGDn|j3TmGt$v z$-xOvhGE~vJ`SiQibvc_7QnC8`FTqks|F0r@1=jZ$R$s^%QIM(0dqDh91}vNLe7m-@JTaY)*t JJbefH{sDg%{muXY diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$2.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$2.class deleted file mode 100644 index d250d2ffb45c679a005b8c4436690d9be1394e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1059 zcmb7DOK;Oa5dJnXN#nRQ^btrO6i9%?rFC15sgR%o5h-nfph(iKbHo06MTX4f_PjD;LbhTO;v zD#{=5n1MC4$FeYs%M7OWM1gz4CBt$vl*dkI*zfzw;X?W9#CewZ>Lv=flEu7*1uQa@ z&jrR_k9UUwHUB8dd@&Tl?F5{<-}8m99x$Y9$T(5uNMw5~zt&H^e6JO80aBhpX-nb)| zI(sZUy>R0AfU92EwXlgTh8f8t?kYXU^$X_MXw=#ie8^+j?OY6!vQe&EJ2k7>Fo zS`WY=qWc931-*9(r!7l3JpuBjh!$`Y47W&nPP)!1*&Aapdv%Pgy*WnS{)ss|J;u`a zB&AG$eUHF9N`8+DNyS7j;WqA&MkVwcqp}Qlu{bFoAWafbwSQoVDEk#F#28Wj6xZxm zWHw$C%s0Y4#dVFAhDIw=HQ)pC_(<|6vVEqyUlL^NtmXu{N^u5Kfgc5Pch`apSs88k&@kLV*}aT!cXpr&dT%frym$(4a`%*f^`k#M!m{5y8&@ z2@vAOg)NQpejfs;&1J`4qAauCQMeZ*k2 z+5^p9vvEOlv%o?f4HMfoE^0n+$xIo{DCBP+hoMEZmu+0pEG3^yUxW+~TT4H^+a53! z57mhBuJi&aj2NBXF#4FiFB++Hd<&?uVN7io>Dm&R$ATsEvv^ONuR4E zWw5(aiuf?(Ng@(lr;6D$Z3Zps22ic)j^~z!j?efL3Y{6Yv3R_=p-lk=kc8@g-Na&-oUrO}bY^Vb`GDp>qMZ Va68B9xC1vw>ewS|QJl`7zJD!;(8d4& diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$4.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$4.class deleted file mode 100644 index b7b2e60babcff6244bede6e7168d3f5abe896573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmb7CO>fgc5Pch`N$a>x8k&@kLV*}aTtq;WQ!AuWfrym$(4a`%aGX_R;_O=Mbp(Hh z1C;uWuCcT`JI_1s&Cbl9zrTJ1*vI`9Ji~RuBKe|WGaU4E<-_&!o+<@!QBO;_l)|ogB92eD^ovm zbvWS(1MApuuv)~LgEA@%4XIAsgLFI&bvp@0e3(X*$g>PMNrmtS5vNS{LlNqy3|6z% zH{4YRmkc)xZPZXNV$;E8!`EIgQ%Wz6{Pzb@bf9e_zUttb;VA^Z2zbQsq`C0pJFPxL z{!k7n^Kv&7{5YKqxO#Q*mTFf9e$@9>X#6>tH>GBHyr`DDyGKP)sbE;`X+Ibr`SG06 zrar2GzX(kMEC03j!CQaoQ)bUaV5UHv9&tUALkCT?7)pxA+}Bw_7?zry>@~~BJkc*@ zq8Xfy5L_KbevqY0O`JuGIs#NGrt6ud!6P(BtBfr$T&Gi)d~H7y557Nm1 diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$5.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$5.class deleted file mode 100644 index 204e7fb19ab2d252ba247e043f96e471da5ca1cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcmb7DOK;Oa5dJm^N#nRQ^brUx&jfH>s9T|OX@vw0h)8KA2nyoH##uE>oOQIeBltU9 zI3tlFAwYl-2YwV{*3E%yERAP(#`Asi@}Iw-zX90CP7xVo3&`0xgFM5|NO*EI*5O!a zPrMliVI)Hp`Jsw+70X?Kz|O4EutOA}ogDga`Fl zjzq-3TE=7BSj1Td%Xl>J%fz^v7RoqRz_N`MtTNO>eeCs;;ZVk2IslH8X{#`hVrPNQqUD>lv>S|%-2aj}4P8ymR9;LTYCeJhp@;`z-^Lwm z(L}Wv3m!iRsQA3oY_&`=3r8Y~pM+7&V7HVK`XJy@BqC~7h6W4dNN6%Zxoj3A)wBkw zrX3}3hGYfTz;K;TPm!hF1*-1m6wKY2qTn{BD7l}o`;dmz=xxRVe4*g4sMD#E z-mAEQn{*=x^Aiv(!!4}N-~)nZ zRnoM+ql6!H{zL#CFccZ1FuxY$f>RosS`TB_J4ZBd-5fu4U` CBiyP0 diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$6.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound$6.class deleted file mode 100644 index 6aec798733f107119f1714b8c9b7814810399abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcmb7DOK;Oa5dJm}N#nRQ^brUx&jfH>s9PcB(h8}xAR?ueASj3%jgfjL+nW!*u!(>SIE>{z-x?w5@jTS>88H%{EO~IWxqjxp?f`t-HhSJ0f z8i^S5n1Qvm$Fi`9^9+{u3`CrG(&ywnG*Q8YB9<+zV3naBsuQ=Ljz%JJV}Hm8X+T*% z%nZ*`DZPF`VTC;*Me=~bu$w&%U$t;i6Ek6=hRa2)TiC!A26xUfD8nf5-o6mj2)Umy zRPyFXR&WChH|g{g25m4y06qlTrWX``Ln)k$e zimRHP%xpE>g_~Jw*d}dK IoUVbMe@g$~c>n+a diff --git a/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound.class b/build/classes/java/main/me/improper/explosionscontrol/other/ServerSound.class deleted file mode 100644 index 42c8fcdf0e84619b0592713ac63c2b66b581c7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4574 zcmbVPTWlOx8UBvF-i_CjG)cYdtYbGRy=1+1y3Nf^>yR{E*K~s~N$hTLnu5pcu|4s4 zcRM>95-5~X0;T0vu0<-Zt&k9+C~0bf5E4>BJR%{UK;nT19(Vu=Bm%U2|IF-oZ>GeS zJm<_g=l{O%|IdH^GyCgzfATW`$M9+tZD@}mq@e?0h3yyhOM2SU3rp##`HM#0Q3xM1 z3#M~ip*=Z}>%7ujD@oB@p zWZ2WiN?}1^i&f0)4i_oJ#*6k+dcLxp3%O8T^=UomWj&JsJm z%%Nm0WgxD0(9KM;=t&OLnp7u7qPPe5MsS~o`>{`9M~$e* z+<0&&2sBl&%!1+RD^oks-2JIIrj^bVEsGn(P>ytA0I3KDH4I_DLU*f0487?Xw(b<^ zYP=39>yHyBjRzw*py416DePRwsV-57EbHY-<1!P2`EXt=j%XOhLkgjSJKSBxuE`=I zC-AU_M=(Mi^z2;GwwMjFw#IjNl)?ER9*%$+cW2F9HFh%lsD_hxOyQ0Nv+U@FyfOVu zMYjzC?rObn1EUd)Djc}YbiMaL6d8=k+4zvcRC4?_?MJe;-qoes$UrWNEKWu6VGZM$ zc;B=1cyPKh-s$pkEnDy+pwL$z%aT=DG7C&@X&BQCrZk+!83oO*6lV1D%8a=xX@8-In2t|oL4xqiLH?h z$O-$?n_xd2#RbgDg8=#_0FFd4hrGyV)(&q%{;24m6Z)l1&<{tkh`cJ%x|JG?o&#z4ACEpKi-Aqs-@_N#;{Cj{s z84cS;$J5i& zeZi~{PO7DUDK%6}?*j5xoc3-&mgF(g&?M(xew-{Djz1Yn@~+}6M`~w%@K~LL9=0s+ z;__`WMvUUW;#77B))vGj7;DC2J4+im7Zzs@dq`MCfp4;2lqk0+T0~#3d|II0?TMZc z=Zh%$YNm)Ft9k}g*Qn$gg#9hJ>ZpAT- z@m7BtCs@!PbtUiRntt{#F%BV-6^PgIaa^Y8D;(X1_J7OgX!>86zQq_Sd?Ik@9p9ma zCWmGk96H(P(1Xnm^(W|i)yw*AedE3FH~RDhwP)$mDf%;xJSJ*<$^uX{(U!~{_LWJD zyU^yv_!b5!JcWmNoytj+Qnr7@j+c#cuz^3i z(B56s;k%>o5?*d$yyJ%r#(!#Q{H2!0u}0%Rw>0Jt*%r)^M%jO9Y5Zk;#Wy}qC#9N% zQ}^&TUO$3f_4zCJ{ckRUcl(8deGJR5dSWPiwKZ1FrS4(zlCqJ-Nw_fh&h(Q f9Df*P@EwjF1G%=cDHtc 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 A6aWAK literal 16291 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 W5~{;vRQN+G2Hh;LY@UPo$NnFz)p;ra diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java new file mode 100644 index 0000000..9f604fc --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java @@ -0,0 +1,26 @@ +package io.github.itzispyder.explosionscontrol; + +import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.logging.Logger; + +public final class ExplosionsControl extends JavaPlugin { + + public static final Logger logger = Bukkit.getLogger(); + public static final String starter = Text.color("&7[&6Ex&eC&7] &r"); + public static ExplosionsControl instance; + + @Override + public void onEnable() { + instance = this; + ExplosionConfig.updateAllWorlds(); + } + + @Override + public void onDisable() { + ExplosionConfig.updateAllWorlds(); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/commands/CmdExHandler.java b/src/main/java/io/github/itzispyder/explosionscontrol/commands/CmdExHandler.java new file mode 100644 index 0000000..07cb41c --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/commands/CmdExHandler.java @@ -0,0 +1,14 @@ +package io.github.itzispyder.explosionscontrol.commands; + +import org.bukkit.command.Command; + +public record CmdExHandler(Exception ex, Command cmd) { + + public String getHelp() { + String help = "§cError: §7"; + if (ex instanceof IndexOutOfBoundsException) help += "Unknown or incomplete command."; + else if (ex instanceof NullPointerException) help += "Command contains a null value."; + else help += ex.getMessage(); + return help + "\n§cCaused by: §7" + ex.getClass().getSimpleName() + "\n" + "§cUsage: §7" + cmd.getUsage(); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/commands/TabComplBuilder.java b/src/main/java/io/github/itzispyder/explosionscontrol/commands/TabComplBuilder.java new file mode 100644 index 0000000..710923b --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/commands/TabComplBuilder.java @@ -0,0 +1,60 @@ +package io.github.itzispyder.explosionscontrol.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import java.util.*; + +public class TabComplBuilder { + + private Map> entries = new HashMap<>(); + private final CommandSender sender; + private final Command command; + private final String alias; + private final String[] args; + + public TabComplBuilder(CommandSender sender, Command command, String alias, String[] args) { + this.sender = sender; + this.command = command; + this.alias = alias; + this.args = args; + } + + /** + * Adds to the tab completion + * @param atIndex should be a number above or equal to 1 + * @param entry string array + * @param condition condition + */ + public TabComplBuilder add(int atIndex, String[] entry, boolean condition) { + if (condition) add(atIndex,entry); + return this; + } + + /** + * Adds to the tab completion + * @param atIndex should be a number above or equal to 1 + * @param entry string array + */ + public TabComplBuilder add(int atIndex, String[] entry) { + atIndex = Math.max(1,atIndex); + entries.put(atIndex,Arrays.stream(entry).toList()); + return this; + } + + public TabComplBuilder add(int atIndex, List entry, boolean condition) { + if (condition) add(atIndex,entry); + return this; + } + + public TabComplBuilder add(int atIndex, List entry) { + entries.put(atIndex,entry); + return this; + } + + public List build() { + List list = new ArrayList<>(entries.get(args.length) != null ? entries.get(args.length) : new ArrayList<>()); + list.removeIf(s -> !s.toLowerCase().contains(args[args.length - 1].toLowerCase())); + return list; + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionConfig.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionConfig.java new file mode 100644 index 0000000..d53f2b4 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionConfig.java @@ -0,0 +1,164 @@ +package io.github.itzispyder.explosionscontrol.data; + +import com.google.gson.Gson; +import io.github.itzispyder.explosionscontrol.utils.FileValidationUtils; +import org.bukkit.Bukkit; +import org.bukkit.World; + +import java.io.*; + +import static io.github.itzispyder.explosionscontrol.ExplosionsControl.instance; +import static io.github.itzispyder.explosionscontrol.ExplosionsControl.logger; + +public class ExplosionConfig { + + private final String world; + private Mode minecartMode; + private Mode witherMode; + private Mode tntMode; + private Mode fireballMode; + private Mode creeperMode; + private Mode blockMode; + private Mode crystalMode; + + public ExplosionConfig(World world) { + this.world = world.getName(); + this.minecartMode = Mode.ENABLED; + this.witherMode = Mode.ENABLED; + this.tntMode = Mode.ENABLED; + this.fireballMode = Mode.ENABLED; + this.creeperMode = Mode.ENABLED; + this.crystalMode = Mode.ENABLED; + this.blockMode = Mode.ENABLED; + } + + public World getWorld() { + return Bukkit.getWorld(world); + } + + public Mode getMinecartMode() { + return minecartMode; + } + + public void setMinecartMode(Mode minecartMode) { + this.minecartMode = minecartMode; + } + + public Mode getWitherMode() { + return witherMode; + } + + public void setWitherMode(Mode witherMode) { + this.witherMode = witherMode; + } + + public Mode getTntMode() { + return tntMode; + } + + public void setTntMode(Mode tntMode) { + this.tntMode = tntMode; + } + + public Mode getFireballMode() { + return fireballMode; + } + + public void setFireballMode(Mode fireballMode) { + this.fireballMode = fireballMode; + } + + public Mode getCreeperMode() { + return creeperMode; + } + + public void setCreeperMode(Mode creeperMode) { + this.creeperMode = creeperMode; + } + + public Mode getBlockMode() { + return blockMode; + } + + public void setBlockMode(Mode blockMode) { + this.blockMode = blockMode; + } + + public Mode getCrystalMode() { + return crystalMode; + } + + public void setCrystalMode(Mode crystalMode) { + this.crystalMode = crystalMode; + } + + public File getFile() { + return getFileOf(getWorld()); + } + + public void save() { + save(this); + } + + public static File getFileOf(World world) { + return new File(instance.getDataFolder(), "worlds/" + world.getName() + ".json"); + } + + public static void updateAllWorlds() { + for (World world : Bukkit.getWorlds()) { + load(world).save(); + } + } + + private static T getOrDef(T val, T def) { + return val != null ? val : def; + } + + public static void save(ExplosionConfig config) { + File file = config.getFile(); + if (FileValidationUtils.validate(file)) { + try { + Gson gson = new Gson(); + String json = gson.toJson(config); + FileWriter fw = new FileWriter(file); + BufferedWriter bw = new BufferedWriter(fw); + + bw.write(json); + bw.close(); + } + catch (Exception ex) { + logger.warning("An error occurred while saving config for \"" + config.world + "\""); + ex.printStackTrace(); + } + } + } + + public static ExplosionConfig load(World world) { + return load(getFileOf(world)); + } + + public static ExplosionConfig load(File file) { + ExplosionConfig defaultConfig = new ExplosionConfig(Bukkit.getWorlds().get(0)); + + if (FileValidationUtils.validate(file)) { + try { + FileReader fr = new FileReader(file); + BufferedReader br = new BufferedReader(fr); + Gson gson = new Gson(); + String json = br.readLine(); + + ExplosionConfig config = json == null ? defaultConfig : gson.fromJson(json, ExplosionConfig.class); + + br.close(); + config.save(); + return config; + } + catch (Exception ex) { + logger.warning("An error occurred while loading config for \"" + file.getPath() + "\""); + ex.printStackTrace(); + } + } + + return defaultConfig; + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java new file mode 100644 index 0000000..d518482 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java @@ -0,0 +1,10 @@ +package io.github.itzispyder.explosionscontrol.data; + +public enum Mode { + + ENABLED, + DISABLED, + NONE, + DYNAMIC + +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/FileValidationUtils.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/FileValidationUtils.java new file mode 100644 index 0000000..410ee8f --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/FileValidationUtils.java @@ -0,0 +1,21 @@ +package io.github.itzispyder.explosionscontrol.utils; + +import java.io.File; + +public final class FileValidationUtils { + + public static boolean validate(File file) { + try { + if (!file.getParentFile().exists()) + if (!file.getParentFile().mkdirs()) + return false; + if (!file.exists()) + if (!file.createNewFile()) + return false; + return true; + } + catch (Exception ex) { + return false; + } + } +} diff --git a/src/main/java/me/improper/explosionscontrol/other/ServerSound.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/SoundPlayer.java similarity index 86% rename from src/main/java/me/improper/explosionscontrol/other/ServerSound.java rename to src/main/java/io/github/itzispyder/explosionscontrol/utils/SoundPlayer.java index bc7f2a3..a461eb7 100644 --- a/src/main/java/me/improper/explosionscontrol/other/ServerSound.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/SoundPlayer.java @@ -1,255 +1,256 @@ -package me.improper.explosionscontrol.other; - -import me.improper.explosionscontrol.ExplosionsControl; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -public class ServerSound { - - private Location location; - private Sound sound; - private float volume; - private float pitch; - - /** - * Constructs a new sound, this aims to add more methods to - * the Bukkit APIs Sound class, as they don't have many - * methods to use. - * - * @param location Location - * @param sound Sound - * @param volume float - * @param pitch float - */ - public ServerSound(Location location, Sound sound, float volume, float pitch) { - this.location = location; - this.sound = sound; - this.pitch = pitch; - this.volume = volume; - } - - - /** - * Plays a sound to a player but at the store location - * - * @param player Player - */ - public void play(Player player) { - player.playSound(this.location,this.sound,this.volume,this.pitch); - } - - /** - * Plays a sound to a player but at the player's location - * - * @param player Player - */ - public void playAt(Player player) { - player.playSound(player.getLocation(),this.sound,this.volume,this.pitch); - } - - /** - * Plays the sound to all players within a distance, but at the stored location. - * - * @param distance double - */ - public void playWithin(double distance) { - for (Player p : Bukkit.getOnlinePlayers()) { - if (p != null && p.getWorld() == this.location.getWorld() && p.getLocation().distanceSquared(this.location) < distance) { - p.playSound(this.location,this.sound,this.volume,this.pitch); - } - } - } - - /** - * Plays the sound to all players within a distance, but at the players' location. - * - * @param distance double - */ - public void playWithinAt(double distance) { - for (Player p : Bukkit.getOnlinePlayers()) { - if (p != null && p.getWorld() == this.location.getWorld() && p.getLocation().distanceSquared(this.location) < distance) { - p.playSound(p.getLocation(),this.sound,this.volume,this.pitch); - } - } - } - - - /** - * Plays the sound to all players on the server, but at the stored location. - */ - public void playAll() { - for (Player p : Bukkit.getOnlinePlayers()) p.playSound(this.location,this.sound,this.volume,this.pitch); - } - - /** - * Plays the sound to all players on the server, but at the players' location. - */ - public void playAllAt() { - for (Player p : Bukkit.getOnlinePlayers()) p.playSound(p.getLocation(),this.sound,this.volume,this.pitch); - } - - /** - * Repeats a sound to a player, but at the stored location. - * - * @param player Player - * @param times int - * @param tickDelay int - */ - public void repeat(Player player, int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - play(player); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - /** - * Repeats a sound to a player, but at the player's location. - * - * @param player Player - * @param times int - * @param tickDelay int - */ - public void repeatAt(Player player, int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - playAt(player); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - /** - * Repeats a sound to all players on the server, but at the stored location. - * - * @param times int - * @param tickDelay int - */ - public void repeatAll(int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - playAll(); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - /** - * Repeats a sound to all players on the server, but at the players' location. - * - * @param times int - * @param tickDelay int - */ - public void repeatAllAt(int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - playAllAt(); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - /** - * Repeats a sound to all players within a radius, but at the stored location. - * - * @param radius double - * @param times int - * @param tickDelay int - */ - public void repeatAll(double radius,int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - playWithin(radius); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - /** - * Repeats a sound to all players within a radius, but at the players' location. - * - * @param distance double - * @param times int - * @param tickDelay int - */ - public void repeatAllAt(double distance, int times, int tickDelay) { - new BukkitRunnable() { - int i = 0; - @Override - public void run() { - if (i < times) { - playWithinAt(distance); - i ++; - } else { - this.cancel(); - } - } - }.runTaskTimer(ExplosionsControl.getInstance(),0,tickDelay); - } - - public Sound getSound() { - return sound; - } - - public float getPitch() { - return pitch; - } - - public float getVolume() { - return volume; - } - - public Location getLocation() { - return location; - } - - public void setPitch(float pitch) { - this.pitch = pitch; - } - - public void setVolume(float volume) { - this.volume = volume; - } - - public void setSound(Sound sound) { - this.sound = sound; - } - - public void setLocation(Location location) { - this.location = location; - } -} +package io.github.itzispyder.explosionscontrol.utils; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import static io.github.itzispyder.explosionscontrol.ExplosionsControl.instance; + +public class SoundPlayer { + + private Location location; + private Sound sound; + private float volume; + private float pitch; + + /** + * Constructs a new sound, this aims to add more methods to + * the Bukkit APIs Sound class, as they don't have many + * methods to use. + * + * @param location Location + * @param sound Sound + * @param volume float + * @param pitch float + */ + public SoundPlayer(Location location, Sound sound, float volume, float pitch) { + this.location = location; + this.sound = sound; + this.pitch = pitch; + this.volume = volume; + } + + + /** + * Plays a sound to a player but at the store location + * + * @param player Player + */ + public void play(Player player) { + player.playSound(this.location,this.sound,this.volume,this.pitch); + } + + /** + * Plays a sound to a player but at the player's location + * + * @param player Player + */ + public void playAt(Player player) { + player.playSound(player.getLocation(),this.sound,this.volume,this.pitch); + } + + /** + * Plays the sound to all players within a distance, but at the stored location. + * + * @param distance double + */ + public void playWithin(double distance) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p != null && p.getWorld() == this.location.getWorld() && p.getLocation().distance(this.location) < distance) { + p.playSound(this.location,this.sound,this.volume,this.pitch); + } + } + } + + /** + * Plays the sound to all players within a distance, but at the players' location. + * + * @param distance double + */ + public void playWithinAt(double distance) { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p != null && p.getWorld() == this.location.getWorld() && p.getLocation().distance(this.location) < distance) { + p.playSound(p.getLocation(),this.sound,this.volume,this.pitch); + } + } + } + + + /** + * Plays the sound to all players on the server, but at the stored location. + */ + public void playAll() { + for (Player p : Bukkit.getOnlinePlayers()) p.playSound(this.location,this.sound,this.volume,this.pitch); + } + + /** + * Plays the sound to all players on the server, but at the players' location. + */ + public void playAllAt() { + for (Player p : Bukkit.getOnlinePlayers()) p.playSound(p.getLocation(),this.sound,this.volume,this.pitch); + } + + /** + * Repeats a sound to a player, but at the stored location. + * + * @param player Player + * @param times int + * @param tickDelay int + */ + public void repeat(Player player, int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + play(player); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + /** + * Repeats a sound to a player, but at the player's location. + * + * @param player Player + * @param times int + * @param tickDelay int + */ + public void repeatAt(Player player, int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + playAt(player); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + /** + * Repeats a sound to all players on the server, but at the stored location. + * + * @param times int + * @param tickDelay int + */ + public void repeatAll(int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + playAll(); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + /** + * Repeats a sound to all players on the server, but at the players' location. + * + * @param times int + * @param tickDelay int + */ + public void repeatAllAt(int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + playAllAt(); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + /** + * Repeats a sound to all players within a radius, but at the stored location. + * + * @param radius double + * @param times int + * @param tickDelay int + */ + public void repeatAll(double radius,int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + playWithin(radius); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + /** + * Repeats a sound to all players within a radius, but at the players' location. + * + * @param distance double + * @param times int + * @param tickDelay int + */ + public void repeatAllAt(double distance, int times, int tickDelay) { + new BukkitRunnable() { + int i = 0; + @Override + public void run() { + if (i < times) { + playWithinAt(distance); + i ++; + } else { + this.cancel(); + } + } + }.runTaskTimer(instance,0,tickDelay); + } + + public Sound getSound() { + return sound; + } + + public float getPitch() { + return pitch; + } + + public float getVolume() { + return volume; + } + + public Location getLocation() { + return location; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public void setVolume(float volume) { + this.volume = volume; + } + + public void setSound(Sound sound) { + this.sound = sound; + } + + public void setLocation(Location location) { + this.location = location; + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/Text.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/Text.java new file mode 100644 index 0000000..9144b0e --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/Text.java @@ -0,0 +1,96 @@ +package io.github.itzispyder.explosionscontrol.utils; + +import io.github.itzispyder.explosionscontrol.ExplosionsControl; + +public class Text { + + public static String of(String s) { + return s; + } + + public static String ofAll(String s) { + return builder(s).prefix().color().build(); + } + + /** + * Replaces all & with § to color the text + * @param s string + * @return result + */ + public static String color(String s) { + return s.replaceAll("&","§"); + } + + public static String asPath(String s) { + return s.toLowerCase() + .replaceAll(" ","_") + .replaceAll("[^.a-b0-9_-]","") + .trim(); + } + + public static String asDirectory(String s) { + return s.toLowerCase() + .replaceAll(" ","_") + .replaceAll("[^./a-b0-9_-]","") + .trim(); + } + + public static String prefixed(String s) { + return ExplosionsControl.starter + s; + } + + public static TextBuilder builder(String s) { + return new TextBuilder(s); + } + + public static TextBuilder builder() { + return builder(""); + } + + public static String removeColors(String msg) { + String s = msg; + while (s.length() >= 2 && s.contains("§")) { + int index = s.indexOf("§"); + s = s.replaceAll(s.substring(index, index + 2), ""); + } + return s; + } + + public static class TextBuilder { + + private String s; + + public TextBuilder(String s) { + this.s = s; + } + + public TextBuilder message(String s) { + this.s = s; + return this; + } + + public TextBuilder color() { + s = Text.color(s); + return this; + } + + public TextBuilder prefix() { + s = Text.prefixed(s); + return this; + } + + public TextBuilder asPath() { + s = Text.asPath(s); + return this; + } + + public TextBuilder asDirectory() { + s = Text.asDirectory(s); + return this; + } + + public String build() { + return s; + } + } +} diff --git a/src/main/java/me/improper/explosionscontrol/ExplosionsControl.java b/src/main/java/me/improper/explosionscontrol/ExplosionsControl.java deleted file mode 100644 index 43f95d2..0000000 --- a/src/main/java/me/improper/explosionscontrol/ExplosionsControl.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.improper.explosionscontrol; - -import me.improper.explosionscontrol.commands.Commands; -import me.improper.explosionscontrol.commands.Tabs; -import me.improper.explosionscontrol.data.Config; -import me.improper.explosionscontrol.data.ExplosionConfigFile; -import me.improper.explosionscontrol.data.ExplosionToggle; -import me.improper.explosionscontrol.events.OnExplode; -import me.improper.explosionscontrol.events.OnInventory; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; - -public final class ExplosionsControl extends JavaPlugin { - - public static String STARTER; - - @Override - public void onEnable() { - // Plugin startup logic - STARTER = Config.getPluginPrefix(); - Bukkit.broadcastMessage(STARTER + "aExplosionsControls has loaded!"); - ExplosionConfigFile.setup(); - ExplosionToggle.setup(); - - // Files - getConfig().options().copyDefaults(); - saveDefaultConfig(); - - // Events - Bukkit.getPluginManager().registerEvents(new OnExplode(),this); - Bukkit.getPluginManager().registerEvents(new OnInventory(),this); - - // Commands - getCommand("explosions").setExecutor(new Commands()); - getCommand("explosions").setTabCompleter(new Tabs()); - getCommand("loadworlds").setExecutor(new Commands()); - getCommand("loadworlds").setTabCompleter(new Tabs()); - } - - @Override - public void onDisable() { - // Plugin shutdown logic - Bukkit.broadcastMessage(STARTER + "cExplosionsControls has disabled! If this isn't a reload please consider restarting" + - " as your server is no longer being protected from explosions!"); - } - - public static Plugin getInstance() { - return Bukkit.getPluginManager().getPlugin("ExplosionsControl"); - } -} diff --git a/src/main/java/me/improper/explosionscontrol/commands/Commands.java b/src/main/java/me/improper/explosionscontrol/commands/Commands.java deleted file mode 100644 index 4e1b400..0000000 --- a/src/main/java/me/improper/explosionscontrol/commands/Commands.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.improper.explosionscontrol.commands; - -import me.improper.explosionscontrol.ExplosionsControl; -import me.improper.explosionscontrol.data.ExplosionConfigFile; -import me.improper.explosionscontrol.data.ExplosionToggle; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class Commands implements CommandExecutor { - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - String commandName = command.getName().toLowerCase().trim(); - - try { - switch (commandName) { - case "explosions" -> { - ((Player) sender).openInventory(ExplosionToggle.EXPLOSIONMENU); - return true; - } - case "loadworlds" -> { - ExplosionConfigFile.setup(); - sender.sendMessage(ExplosionsControl.STARTER + "6Reloaded all world explosions configurations!"); - for (World world : Bukkit.getWorlds()) sender.sendMessage(ChatColor.GOLD + " - " + ChatColor.YELLOW + world.getName()); - return true; - } - } - } catch (Exception exception) { - String message = ExplosionsControl.STARTER + ChatColor.DARK_RED + "Command error: " + ChatColor.RED; - if (exception instanceof NullPointerException) message += "Command contains a null value!"; - else if (exception instanceof IndexOutOfBoundsException) message += "Incomplete command! Not enough information was provided!"; - else message += exception.getMessage(); - sender.sendMessage(message); - return true; - } - - return false; - } -} diff --git a/src/main/java/me/improper/explosionscontrol/commands/Tabs.java b/src/main/java/me/improper/explosionscontrol/commands/Tabs.java deleted file mode 100644 index c468bc8..0000000 --- a/src/main/java/me/improper/explosionscontrol/commands/Tabs.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.improper.explosionscontrol.commands; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; - -import java.util.ArrayList; -import java.util.List; - -public class Tabs implements TabCompleter { - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - List list = new ArrayList<>(); - String commandName = command.getName().toLowerCase().trim(); - - switch (commandName) { - case "explosions","loadworlds" -> { - break; - } - } - - list.removeIf(i -> !i.toLowerCase().contains(args[args.length - 1].toLowerCase())); - return list; - } -} diff --git a/src/main/java/me/improper/explosionscontrol/data/Config.java b/src/main/java/me/improper/explosionscontrol/data/Config.java deleted file mode 100644 index 2824678..0000000 --- a/src/main/java/me/improper/explosionscontrol/data/Config.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.improper.explosionscontrol.data; - -import me.improper.explosionscontrol.ExplosionsControl; -import org.bukkit.configuration.file.FileConfiguration; - -public class Config { - - private static FileConfiguration CONFIG = ExplosionsControl.getInstance().getConfig(); - - /** - * This will return the current plugin prefix set - * in the plugin's configuration file. - * - * @return The plugin prefix - */ - public static String getPluginPrefix() { - return CONFIG.getString("config.plugin.prefix"); - } -} diff --git a/src/main/java/me/improper/explosionscontrol/data/ExplosionConfigFile.java b/src/main/java/me/improper/explosionscontrol/data/ExplosionConfigFile.java deleted file mode 100644 index e875163..0000000 --- a/src/main/java/me/improper/explosionscontrol/data/ExplosionConfigFile.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.improper.explosionscontrol.data; - -import org.bukkit.Bukkit; -import org.bukkit.World; - -public class ExplosionConfigFile { - - /** - * Creates a configuration for each existing world. - * These are saved to "plugins/ExplosionsControl/worldconfigurations". - */ - public static void setup() { - for (World world : Bukkit.getWorlds()) { - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - configuration.save(); - } - } -} diff --git a/src/main/java/me/improper/explosionscontrol/data/ExplosionConfiguration.java b/src/main/java/me/improper/explosionscontrol/data/ExplosionConfiguration.java deleted file mode 100644 index 69d6996..0000000 --- a/src/main/java/me/improper/explosionscontrol/data/ExplosionConfiguration.java +++ /dev/null @@ -1,139 +0,0 @@ -package me.improper.explosionscontrol.data; - -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.Serializable; - -public class ExplosionConfiguration implements Serializable { - - private String world; - private ExplosionMode allowTnt, allowCrystal, allowFireball, allowCreeper, allowMinecart, allowWither, allowBlock; - - /** - * Constructs a world configuration for explosions. - * Note that if the data file is null or does not exist it will create - * a new instance of this class instead of loading the data. - * - * @param world World - */ - public ExplosionConfiguration(World world) { - try { - File file = new File("plugins/ExplosionsControl/worldconfigurations/" + world.getName() + ".yml"); - if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); - if (!file.exists()) { - file.createNewFile(); - this.world = world.getName(); - this.allowTnt = ExplosionMode.ENABLED; - this.allowCrystal = ExplosionMode.ENABLED; - this.allowFireball = ExplosionMode.ENABLED; - this.allowCreeper = ExplosionMode.ENABLED; - this.allowMinecart = ExplosionMode.ENABLED; - this.allowWither = ExplosionMode.ENABLED; - this.allowBlock = ExplosionMode.ENABLED; - return; - } - FileConfiguration data = YamlConfiguration.loadConfiguration(file); - this.world = data.getString("worldconfig.world"); - this.allowTnt = ExplosionMode.valueOf(data.getString("worldconfig.allowTnt").toUpperCase()); - this.allowCrystal = ExplosionMode.valueOf(data.getString("worldconfig.allowCrystal").toUpperCase()); - this.allowFireball = ExplosionMode.valueOf(data.getString("worldconfig.allowFireball").toUpperCase()); - this.allowCreeper = ExplosionMode.valueOf(data.getString("worldconfig.allowCreeper").toUpperCase()); - this.allowMinecart = ExplosionMode.valueOf(data.getString("worldconfig.allowMinecart").toUpperCase()); - this.allowWither = ExplosionMode.valueOf(data.getString("worldconfig.allowWither").toUpperCase()); - this.allowBlock = ExplosionMode.valueOf(data.getString("worldconfig.allowBlock").toUpperCase()); - } catch (Exception exception) { - Bukkit.getLogger().warning(exception.toString()); - } - } - - /** - * Save the current configuration to a file config. - */ - public void save() { - try { - File file = new File("plugins/ExplosionsControl/worldconfigurations/" + world + ".yml"); - if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); - if (!file.exists()) file.createNewFile(); - FileConfiguration data = YamlConfiguration.loadConfiguration(file); - data.set("worldconfig.world",world); - data.set("worldconfig.allowBlock",allowBlock.name()); - data.set("worldconfig.allowCreeper",allowCreeper.name()); - data.set("worldconfig.allowCrystal",allowCrystal.name()); - data.set("worldconfig.allowFireball",allowFireball.name()); - data.set("worldconfig.allowMinecart",allowMinecart.name()); - data.set("worldconfig.allowTnt",allowTnt.name()); - data.set("worldconfig.allowWither",allowWither.name()); - data.save(file); - } catch (Exception exception) { - Bukkit.getLogger().warning(exception.toString()); - } - } - - public void setWorld(String world) { - this.world = world; - } - - public void setAllowBlock(ExplosionMode allowBlock) { - this.allowBlock = allowBlock; - } - - public void setAllowCreeper(ExplosionMode allowCreeper) { - this.allowCreeper = allowCreeper; - } - - public void setAllowCrystal(ExplosionMode allowCrystal) { - this.allowCrystal = allowCrystal; - } - - public void setAllowFireball(ExplosionMode allowFireball) { - this.allowFireball = allowFireball; - } - - public void setAllowMinecart(ExplosionMode allowMinecart) { - this.allowMinecart = allowMinecart; - } - - public void setAllowTnt(ExplosionMode allowTnt) { - this.allowTnt = allowTnt; - } - - public void setAllowWither(ExplosionMode allowWither) { - this.allowWither = allowWither; - } - - public String getWorld() { - return world; - } - - public ExplosionMode getAllowBlock() { - return allowBlock; - } - - public ExplosionMode getAllowCreeper() { - return allowCreeper; - } - - public ExplosionMode getAllowCrystal() { - return allowCrystal; - } - - public ExplosionMode getAllowFireball() { - return allowFireball; - } - - public ExplosionMode getAllowMinecart() { - return allowMinecart; - } - - public ExplosionMode getAllowTnt() { - return allowTnt; - } - - public ExplosionMode getAllowWither() { - return allowWither; - } -} diff --git a/src/main/java/me/improper/explosionscontrol/data/ExplosionMode.java b/src/main/java/me/improper/explosionscontrol/data/ExplosionMode.java deleted file mode 100644 index 7513226..0000000 --- a/src/main/java/me/improper/explosionscontrol/data/ExplosionMode.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.improper.explosionscontrol.data; - -import java.io.Serializable; - -public enum ExplosionMode implements Serializable { - - ENABLED(0), - DISABLED(1), - DYNAMIC(2), - NONE(3); - - /** - * Attempts to get an explosion mode from the index value provided. - * - * @param index int - * @return An explosion mode from the index value. - */ - public static ExplosionMode fromIndex(int index) { - for (ExplosionMode mode : ExplosionMode.values()) if (index == mode.getIndex()) return mode; - return fromIndex(0); - } - - private final int index; - - /** - * Constructs an explosion mode from the index provided. - * - * @param index int - */ - ExplosionMode(int index) { - this.index = index; - } - - /** - * Returns the index of the current explosion mode value. - * A number out of bounds will be read as 0! - * - * @return The index of the current value - */ - public int getIndex() { - if (index >= ExplosionMode.values().length || index < 0) return 0; - return index; - } -} diff --git a/src/main/java/me/improper/explosionscontrol/data/ExplosionToggle.java b/src/main/java/me/improper/explosionscontrol/data/ExplosionToggle.java deleted file mode 100644 index 10db6e7..0000000 --- a/src/main/java/me/improper/explosionscontrol/data/ExplosionToggle.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.improper.explosionscontrol.data; - -import me.improper.explosionscontrol.ExplosionsControl; -import me.improper.explosionscontrol.other.Item; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -public class ExplosionToggle { - - public static Inventory EXPLOSIONMENU; - - /** - * This will prepare the ExplosionsControl main toggle menu. - * Server staff members will be able to edit explosion configurations - * through this menu! - */ - public static void setup() { - Inventory menu = Bukkit.createInventory(null,54, ExplosionsControl.STARTER + "eConfigurations"); - - Item reload = new Item(new ItemStack(Material.COMPASS)); - reload.setDisplayName(ChatColor.AQUA + "Load Worlds"); - Item blank = new Item(new ItemStack(Material.DARK_OAK_SIGN)); - blank.setDisplayName(ChatColor.DARK_GRAY + "" + ChatColor.ITALIC + "Blank World"); - Item b = new Item(new ItemStack(Material.BLACK_STAINED_GLASS_PANE)); - b.setDisplayName(" "); - Item o = new Item(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE)); - o.setDisplayName(" "); - Item y = new Item(new ItemStack(Material.YELLOW_STAINED_GLASS_PANE)); - y.setDisplayName(" "); - Item a = new Item(new ItemStack(Material.AIR)); - - menu.setContents(new ItemStack[]{ - y,y,y,y,y,y,y,y,reload, - b,b,b,b,b,b,b,b,b, - o,a,a,a,a,a,a,a,o, - o,a,a,a,a,a,a,a,o, - o,a,a,a,a,a,a,a,o, - o,o,o,o,o,o,o,o,o - }); - - for (World world : Bukkit.getWorlds()) { - Item worldIcon = new Item(new ItemStack(Material.OAK_SIGN)); - worldIcon.setDisplayName(ChatColor.GRAY + world.getName()); - worldIcon.setLore(List.of(ChatColor.DARK_GRAY + "" + ChatColor.ITALIC + "(Click to config)")); - menu.setItem(menu.firstEmpty(),worldIcon); - } - - while (menu.firstEmpty() != -1) menu.setItem(menu.firstEmpty(),blank); - - EXPLOSIONMENU = menu; - } - - /** - * Open the toggle configuration menu for a player! - * - * @param player Player - * @param world World - */ - public static void openToggleMenu(Player player, World world) { - Inventory menu = Bukkit.createInventory(null,54, ExplosionsControl.STARTER + "eEditing " + world.getName()); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - - Item b = new Item(new ItemStack(Material.BLACK_STAINED_GLASS_PANE)); - b.setDisplayName(" "); - Item o = new Item(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE)); - o.setDisplayName(" "); - Item y = new Item(new ItemStack(Material.YELLOW_STAINED_GLASS_PANE)); - y.setDisplayName(" "); - Item blank = new Item(new ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE)); - blank.setDisplayName(" "); - Item a = new Item(new ItemStack(Material.AIR)); - Item back = new Item(new ItemStack(Material.ARROW)); - back.setDisplayName("<< Back to world menu"); - // toggles - Item creeper = new Item(new ItemStack(Material.CREEPER_HEAD)); - creeper.setDisplayName(configuration.getAllowCreeper().name()); - Item crystal = new Item(new ItemStack(Material.END_CRYSTAL)); - crystal.setDisplayName(configuration.getAllowCrystal().name()); - Item tnt = new Item(new ItemStack(Material.TNT)); - tnt.setDisplayName(configuration.getAllowTnt().name()); - Item minecart = new Item(new ItemStack(Material.TNT_MINECART)); - minecart.setDisplayName(configuration.getAllowMinecart().name()); - Item anchor = new Item(new ItemStack(Material.RESPAWN_ANCHOR)); - anchor.setDisplayName(configuration.getAllowBlock().name()); - Item fireball = new Item(new ItemStack(Material.FIRE_CHARGE)); - fireball.setDisplayName(configuration.getAllowFireball().name()); - Item wither = new Item(new ItemStack(Material.WITHER_SKELETON_SKULL)); - wither.setDisplayName(configuration.getAllowWither().name()); - - menu.setContents(new ItemStack[]{ - back,y,y,y,y,y,y,y,y, - b,b,b,b,b,b,b,b,b, - o,a,a,a,a,a,a,a,o, - o,creeper,crystal,tnt,minecart,anchor,fireball,wither,o, - o,a,a,a,a,a,a,a,o, - o,o,o,o,o,o,o,o,o - }); - - while (menu.firstEmpty() != -1) menu.setItem(menu.firstEmpty(),blank); - - player.openInventory(menu); - } -} diff --git a/src/main/java/me/improper/explosionscontrol/events/OnExplode.java b/src/main/java/me/improper/explosionscontrol/events/OnExplode.java deleted file mode 100644 index 8b756b6..0000000 --- a/src/main/java/me/improper/explosionscontrol/events/OnExplode.java +++ /dev/null @@ -1,216 +0,0 @@ -package me.improper.explosionscontrol.events; - -import me.improper.explosionscontrol.data.ExplosionConfiguration; -import me.improper.explosionscontrol.data.ExplosionMode; -import me.improper.explosionscontrol.other.ServerSound; -import org.bukkit.*; -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.FallingBlock; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockExplodeEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.util.Vector; - -public class OnExplode implements Listener { - - @EventHandler - public static void EntityExplodeEvent(EntityExplodeEvent e) { - Entity entity = e.getEntity(); - Location loc = e.getLocation(); - World world = loc.getWorld(); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - - switch (entity.getType()) { - case PRIMED_TNT -> { - switch (configuration.getAllowTnt()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - case FIREBALL,DRAGON_FIREBALL,SMALL_FIREBALL -> { - switch (configuration.getAllowFireball()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - case CREEPER -> { - switch (configuration.getAllowCreeper()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - case ENDER_CRYSTAL -> { - switch (configuration.getAllowCrystal()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - case MINECART_TNT -> { - switch (configuration.getAllowMinecart()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - case WITHER_SKULL -> { - switch (configuration.getAllowWither()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block block : e.blockList()) launchBlock(block, loc); - } - } - } - } - } - - @EventHandler - public static void BlockExplodeEvent(BlockExplodeEvent e) { - Block block = e.getBlock(); - Location loc = block.getLocation(); - World world = loc.getWorld(); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - - switch (configuration.getAllowBlock()) { - case DISABLED -> { - e.setCancelled(true); - fakeExplode(loc); - } - case NONE -> { - e.setCancelled(true); - } - case DYNAMIC -> { - for (Block b : e.blockList()) launchBlock(b, loc); - } - } - } - - @EventHandler - public static void EntityDamageByEntityEvent(EntityDamageByEntityEvent e) { - try { - Entity damager = e.getDamager(); - Location loc = e.getDamager().getLocation(); - World world = loc.getWorld(); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - - switch (damager.getType()) { - case PRIMED_TNT -> { - if (configuration.getAllowTnt().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - case FIREBALL,DRAGON_FIREBALL,SMALL_FIREBALL -> { - if (configuration.getAllowFireball().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - case CREEPER -> { - if (configuration.getAllowCreeper().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - case ENDER_CRYSTAL -> { - if (configuration.getAllowCrystal().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - case MINECART_TNT -> { - if (configuration.getAllowMinecart().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - case WITHER_SKULL -> { - if (configuration.getAllowWither().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - } - } catch (Exception exception) {} - } - - @EventHandler - public static void EntityDamageEvent(EntityDamageEvent e) { - try { - Entity entity = e.getEntity(); - Location loc = entity.getLocation(); - World world = loc.getWorld(); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - EntityDamageEvent.DamageCause cause = e.getCause(); - - switch (cause) { - case BLOCK_EXPLOSION -> { - if (configuration.getAllowBlock().equals(ExplosionMode.NONE)) e.setCancelled(true); - } - } - } catch (Exception exception) {} - } - - /** - * Attempts to launch a block as a falling block according to its original location - * This feature is in beta, expect many bugs! - * - * @param block Block - * @param origin Location - */ - public static void launchBlock(Block block, Location origin) { - Location loc = block.getLocation(); - Vector vector = origin - .toVector() - .subtract(loc.toVector()) - .normalize() - .add(new Vector(0,1,0)) - .multiply(new Vector(-0.7,0.7,-0.7)); - FallingBlock fb = origin.getWorld().spawnFallingBlock(block.getLocation(),block.getBlockData()); - fb.setVelocity(vector); - block.setType(Material.AIR); - } - - /** - * Plays a sound and displays the explosion particles at the provided world location. - * - * @param location Location - */ - public static void fakeExplode(Location location) { - ServerSound explosion = new ServerSound(location,Sound.ENTITY_GENERIC_EXPLODE,10,0.7F); - explosion.playWithin(5000); - location.getWorld().spawnParticle(Particle.EXPLOSION_LARGE,location,1,1,1,1,0); - location.getWorld().spawnParticle(Particle.EXPLOSION_HUGE,location,1,1,1,1,0); - location.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL,location,5,1,1,1,0); - } -} diff --git a/src/main/java/me/improper/explosionscontrol/events/OnInventory.java b/src/main/java/me/improper/explosionscontrol/events/OnInventory.java deleted file mode 100644 index 8d5aafd..0000000 --- a/src/main/java/me/improper/explosionscontrol/events/OnInventory.java +++ /dev/null @@ -1,118 +0,0 @@ -package me.improper.explosionscontrol.events; - -import me.improper.explosionscontrol.ExplosionsControl; -import me.improper.explosionscontrol.data.ExplosionConfigFile; -import me.improper.explosionscontrol.data.ExplosionConfiguration; -import me.improper.explosionscontrol.data.ExplosionMode; -import me.improper.explosionscontrol.data.ExplosionToggle; -import me.improper.explosionscontrol.other.Item; -import me.improper.explosionscontrol.other.ServerSound; -import org.bukkit.*; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; - -public class OnInventory implements Listener { - - @EventHandler - public static void InventoryClickEvent(InventoryClickEvent e) { - Player p = (Player) e.getWhoClicked(); - Inventory inv = e.getClickedInventory(); - String title = e.getView().getTitle(); - - try { - Item item = new Item(e.getCurrentItem()); - ServerSound reload = new ServerSound(p.getLocation(),Sound.BLOCK_ENCHANTMENT_TABLE_USE,10,10); - ServerSound click = new ServerSound(p.getLocation(),Sound.UI_BUTTON_CLICK,10,1); - ServerSound edit = new ServerSound(p.getLocation(),Sound.ITEM_DYE_USE,10,10); - - if (title.contains(ExplosionsControl.STARTER + "eConfigurations")) { - if (inv.getType().equals(InventoryType.PLAYER)) return; - e.setCancelled(true); - if (item.getDisplayName().equals(" ")) return; - if (item.getDisplayName().equals(ChatColor.AQUA + "Load Worlds")) { - p.closeInventory(); - ExplosionConfigFile.setup(); - ExplosionToggle.setup(); - p.openInventory(ExplosionToggle.EXPLOSIONMENU); - reload.play(p); - return; - } - if (item.getType().equals(Material.DARK_OAK_SIGN)) return; - if (item.getType().equals(Material.OAK_SIGN)) { - World world = Bukkit.getWorld(item.getDisplayName().replaceAll(ChatColor.GRAY + "","")); - ExplosionToggle.openToggleMenu(p,world); - click.play(p); - } - } - if (title.contains(ExplosionsControl.STARTER + "eEditing ")) { - if (inv.getType().equals(InventoryType.PLAYER)) return; - e.setCancelled(true); - if (item.getDisplayName().equals(" ")) return; - if (item.getType().equals(Material.DARK_OAK_SIGN)) return; - if (item.getDisplayName().equals("<< Back to world menu")) { - p.openInventory(ExplosionToggle.EXPLOSIONMENU); - click.play(p); - return; - } - World world = Bukkit.getWorld(title.substring((ExplosionsControl.STARTER + "eEditing ").length())); - ExplosionConfiguration configuration = new ExplosionConfiguration(world); - - switch (item.getType()) { - case FIRE_CHARGE -> { - configuration.setAllowFireball(ExplosionMode.fromIndex(configuration.getAllowFireball().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case CREEPER_HEAD -> { - configuration.setAllowCreeper(ExplosionMode.fromIndex(configuration.getAllowCreeper().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case TNT -> { - configuration.setAllowTnt(ExplosionMode.fromIndex(configuration.getAllowTnt().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case TNT_MINECART -> { - configuration.setAllowMinecart(ExplosionMode.fromIndex(configuration.getAllowMinecart().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case WITHER_SKELETON_SKULL -> { - configuration.setAllowWither(ExplosionMode.fromIndex(configuration.getAllowWither().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case END_CRYSTAL -> { - configuration.setAllowCrystal(ExplosionMode.fromIndex(configuration.getAllowCrystal().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - case RESPAWN_ANCHOR -> { - configuration.setAllowBlock(ExplosionMode.fromIndex(configuration.getAllowBlock().getIndex() + 1)); - configuration.save(); - ExplosionToggle.setup(); - ExplosionToggle.openToggleMenu(p,world); - edit.play(p); - } - } - } - } catch (Exception exception) {} - } -} diff --git a/src/main/java/me/improper/explosionscontrol/other/Item.java b/src/main/java/me/improper/explosionscontrol/other/Item.java deleted file mode 100644 index 79f7998..0000000 --- a/src/main/java/me/improper/explosionscontrol/other/Item.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.improper.explosionscontrol.other; - -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; -import java.util.Set; - -public class Item extends ItemStack { - - private ItemMeta meta = super.getItemMeta(); - - /** - * This creates in instance of this class, which is an extension - * or the ItemStack class, aiming to simplify the process of - * modifying an item's item meta. - * - * @param itemStack ItemStack - */ - public Item(ItemStack itemStack) { - super(itemStack); - } - - /** - * Set the display name of an item. - * - * @param displayName String - */ - public void setDisplayName(String displayName) { - meta.setDisplayName(displayName); - super.setItemMeta(meta); - } - - /** - * Set the lore of an item. - * - * @param lore List - */ - public void setLore(List lore) { - meta.setLore(lore); - super.setItemMeta(meta); - } - - /** - * Adds item flags to an item. - * - * @param flag ItemFlag... - */ - public void addItemFlags(ItemFlag... flag) { - meta.addItemFlags(flag); - super.setItemMeta(meta); - } - - /** - * Sets the unbreakable state of an item. - * - * @param unbreakable boolean - */ - public void setUnbreakable(boolean unbreakable) { - meta.setUnbreakable(unbreakable); - super.setItemMeta(meta); - } - - /** - * Sets the custom model data of an item. - * - * @param customModelData String - */ - public void setCustomModelData(int customModelData) { - meta.setCustomModelData(customModelData); - super.setItemMeta(meta); - } - - /** - * Returns the display name of the item. - * - * @return A string as the display name. - */ - public String getDisplayName() { - return meta.getDisplayName(); - } - - /** - * Returns the lore of the item. - * - * @return A string array as the lore. - */ - public List getLore() { - return meta.getLore(); - } - - /** - * Returns an array of the items flags of the item. - * - * @return An array of the item flags. - */ - public Set getItemFlags() { - return meta.getItemFlags(); - } - - /** - * Returns the custom model data of the item. - * - * @return The custom model data of the item. - */ - public int getCustomModelData() { - return meta.getCustomModelData(); - } -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index 57fcb63..0000000 --- a/src/main/resources/config.yml +++ /dev/null @@ -1,18 +0,0 @@ -# -# -# This is ExplosionsControl by ImproperIssues -# -# Please note that all the explosions configurations have been moved to -# "plugins/ExplosionsControl/worldconfigurations" and are no longer -# configured through this config! -# -# -# -# If you do enjoy this plugin, please star it on github! -# Visit and star https://github.com/ItziSpyder/ExplosionsControl -# -# - -config: - plugin: - prefix: '§7[§eExplosions§6Control§7] §' \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 020b4d6..cef9f88 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,16 +1,7 @@ name: ExplosionsControl version: '${version}' -main: me.improper.explosionscontrol.ExplosionsControl +main: io.github.itzispyder.explosionscontrol.ExplosionsControl api-version: 1.17 authors: [ ImproperIssues ] description: Manager server explosions with just a few simple clicks! website: github.com/ItziSpyder -commands: - explosions: - description: Opens up the explosions toggle menu - usage: /explosions - permission: explosionscontrol.commands.explosions - loadworlds: - description: Loads in all the configuration files in case they didn't load - usage: /loadworlds - permission: explosionscontrol.commands.loadworlds \ No newline at end of file