From 9f36ac3e4baf4773ab5385b98af903cdc41e0de4 Mon Sep 17 00:00:00 2001 From: hdvt Date: Thu, 3 Jul 2025 02:40:14 +0300 Subject: [PATCH] some improvments, bugs and bugfixed ) --- .classpath | 18 ++ .gradle/8.14.1/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/8.14.1/checksums/md5-checksums.bin | Bin 23497 -> 0 bytes .gradle/8.14.1/checksums/sha1-checksums.bin | Bin 32861 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/8.14.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.14.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/8.14.1/gc.properties | 0 .gradle/8.8/checksums/checksums.lock | Bin 40 -> 0 bytes .gradle/8.8/checksums/md5-checksums.bin | Bin 23647 -> 0 bytes .gradle/8.8/checksums/sha1-checksums.bin | Bin 20603 -> 0 bytes .../8.8/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 40 -> 0 bytes .gradle/8.8/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.8/fileHashes/fileHashes.bin | Bin 18997 -> 0 bytes .gradle/8.8/fileHashes/fileHashes.lock | Bin 40 -> 0 bytes .gradle/8.8/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 - .idea/hotswap_agent.xml | 6 + .idea/modules/BlockAndSeek.iml | 8 + .project | 34 +++ .../hdvtdev/blockAndSeek/BlockAndSeek.java | 8 +- .../blockAndSeek/BlockAndSeekGame.java | 33 ++- .../hdvtdev/blockAndSeek/CommandListener.java | 16 +- src/main/java/hdvtdev/blockAndSeek/Utils.java | 35 +++ .../eventListeners/DefaultEventListener.java | 269 +++++++++++++++++ .../eventListeners/EventListener.java | 230 +-------------- .../blockAndSeek/managers/FreezeManager.java | 4 +- .../blockAndSeek/managers/GamesManager.java | 44 +-- .../blockAndSeek/managers/ItemManager.java | 1 + .../roulette/RouletteCreator.java | 272 +++++++----------- src/main/resources/localization.yml | 2 + 33 files changed, 526 insertions(+), 456 deletions(-) create mode 100644 .classpath delete mode 100644 .gradle/8.14.1/checksums/checksums.lock delete mode 100644 .gradle/8.14.1/checksums/md5-checksums.bin delete mode 100644 .gradle/8.14.1/checksums/sha1-checksums.bin delete mode 100644 .gradle/8.14.1/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.14.1/fileChanges/last-build.bin delete mode 100644 .gradle/8.14.1/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.14.1/gc.properties delete mode 100644 .gradle/8.8/checksums/checksums.lock delete mode 100644 .gradle/8.8/checksums/md5-checksums.bin delete mode 100644 .gradle/8.8/checksums/sha1-checksums.bin delete mode 100644 .gradle/8.8/dependencies-accessors/gc.properties delete mode 100644 .gradle/8.8/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.8/fileChanges/last-build.bin delete mode 100644 .gradle/8.8/fileHashes/fileHashes.bin delete mode 100644 .gradle/8.8/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.8/gc.properties delete mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .idea/hotswap_agent.xml create mode 100644 .idea/modules/BlockAndSeek.iml create mode 100644 .project create mode 100644 src/main/java/hdvtdev/blockAndSeek/Utils.java create mode 100644 src/main/java/hdvtdev/blockAndSeek/eventListeners/DefaultEventListener.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..bb5e6bd --- /dev/null +++ b/.classpath @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/.gradle/8.14.1/checksums/checksums.lock b/.gradle/8.14.1/checksums/checksums.lock deleted file mode 100644 index 3226b9691d9157899ef1d7ec60049f54a1541cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZQxsN1qF{h&@Y0~j!t0st`%1W^D0 diff --git a/.gradle/8.14.1/checksums/md5-checksums.bin b/.gradle/8.14.1/checksums/md5-checksums.bin deleted file mode 100644 index e39ec970895f64840ea4408f8abc018a7d62f9a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23497 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 IeTdor1CN>RjQ{`u diff --git a/.gradle/8.14.1/checksums/sha1-checksums.bin b/.gradle/8.14.1/checksums/sha1-checksums.bin deleted file mode 100644 index 50dda50613a1642e22ac07838ea97bef270e20f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32861 zcmeI4c{EjD|Hm(xWr!$>z7-;5N`(eWLZ-|zPZ=`Hm^nj{gfbSINJ)bs6(vQc=#nvG zl9JLuMDjc5?tRYlJomEJvs%wzzh$rWJ=gc`^E&UnKW9(poGWDlVKw_aEQEg*u7CZw z^wUxXmNKxEfu#&AWnd`-OBqKzyjGs-1MU^MKtH-4 z)6ZmPmJDt=2J_~z4$~9#U7!6^*g+5CHHI-gX^J&bFJeF#=pjRxo-BN8w@JW>Dxllm z!u6yNMhPDi@`0{vjp^s|xsSg%dt4Cc{?(YCqW5F&b4;xk&;$2idTKkDPM%nv3p_vW zn&^~pM5aicnG_33A9odH9~h7K+Z$uFuh~vdTnD|WdO>Xe5-_mRN#LcW=88y@@<4|Mk;T+bH1mT$QFB+yNaF#WDy zgNys_ab$i$i`6)$7gO2azGLLh2z0Z9xL$NUE1q`>jtgs3OfPAteLJ|P?FEQ;zJlpx z>I9CH?mF**Zg~^ewQOvw-|apNbkAm7Kg@7_eG=zQpj!*#`nS?miQGbafNp@#OApHU z9M{=9QUTqV6N`W7vr+lTSY{f~ee-d>vf^aG{1Z6O=-~aKe0<>Hm!!*YLA;hF7GH7a z@b&A(vNS+7R=L=y=;Z_?rQvQNhJN~XC=0f~ZI5bt&k*9ZBJ zPwZEo2fD8}ra!awU-2tC5?uwejCI0psK0o`{Orq?@ur7sse1Luuk8C>tRRNAoj z*Z_$4Ovm&FGj;aO*UOIrU1tQ-U&Zfr8{7Kv8PJa$#dIRIEUU;hMmUe@?8o%iT-@}g zuYKTh>)Vg%Z44EeF}8^?&z5-J+NC}^%_%rj0tz6x|*QB3dZ+T?rv zMZF}@?eKY{>yO>Bxf^HTdV25@7T@h#qmX5(ycxusJj3+|jw8>)G~l{#Foo%FTn>G| z5j|fF;!Wu>y@x9}hFRj&4WMh|Rt+#Pf&kOkjKtGJndqW4-v9^VNh4ndf3Omn`U2l6b z_nCAMZ~X$(--TZcuXeM%0CdxQOn<-US&%DnEsS@4iRmLBBa|)g-H!$F?)Z58ura=n z$tmj_(EUDR@t+uHC$|1fgZmbTVO-xfLHpj&5sojrN4VbcqTS6(au%G&q7~D}N=wuU zvN{KWZk>qfpB++~``x#x1O3=~T)!b!`N1NB7wBG|nEs_IgqQtidnM2v@$2%X&%W2G z<9rg(?KffZxFKmLn3o<|8PVW)4ztNn<@<6hj~y>#`GUXbOxQo z<^KzGH*%cO|OH>bJCK%o0^;qgDqWwL~cjj*2PnEun0hI2q_ z3f5n58KzIgbPW2w3a=pl{zT@HfKzbYIfjp~X`c$qy`E3td3@}#_+LInH;;;TCV*5n|@yC8)I@95aXOqG@ z^%$(b&T(8nY zu$~6%a6P73;tTs)SRXG1Oy~a0I6EWH?*`7})PU)$He27fq`lM*>)D3uA#ZZ3c_eoL zT^;YYt0j-Uwm&K43G^_0+^tsWv1Y2}h4*Darr3FS_=(ab)_ib3Y;h6SYj#GtUTFyi z=donObY7MpB7^#8;d*Mm5!2U<*6{o0bii?Bi(i+uJoSb{cW!S2=P|+OleNZoFIB8B zfb*~;zFw?-9JuV!ktn!MImTe;UpsbMcdWvJ37kj22-EpfrPSn`q@01SijS8K!oGS; zzs=czZt9K2Z;;~RkS9!u0^NEJ*JG_`OvNK;fNp~K+l`k;8?Q=K^#a{29E%sQ?W&X# zWcmg4gZO+U;P2MsvH5}#&<{Pq;sxnU%H*(-mUq8JRshy7mF9-?+SQX z67mP=fq4FfOh>Dtwrqy`Rqs$d-gNTNLHWHJAU>cK(>Il+(HtC~`T_J%eB5oCOJMsa zGzYfVSPhF8UO(WKxXIiQ#Ji^A`uO3qB|lD206hp_FE(!&@MGR|ZW++MKVk8kZ9K2s zq@%eC^uzePw>d(#Wq5G)HJ}^B;qg(a-?0xTD&eH7gJn7hZWOrS?sqo};5YRPlWBRsE`SNo% zKj3|bQ68qt33;-O%}1UG@jjWjo}iqty!jFwM`rkbL;jfS3&m$KDIi|=B^JL^(y%J! zbsb!%wD9?AXH(j=|MC?VLA-Vs7Qaiw;7-(0J9uAjgU@5T`sibX-tIdL;=O3`_}?as z!GgEpx_Ow0>3cNVC$pRttUhv~}Ffis2?*HmHr16+^18p*sV2If=S71xWx*5<#M zC<5_EE@Aq9F9Fk6jq>n*S%U@F1DmOsFAu|Ur-{#dDo1FxwT`ZY&s!Yu>#KT_Q-<&5 z33z^0CG0$EboSZ<%iP3)uNK~))dbkTXWeyw0Q8_2czkw-?*0~&TR^vE#&mTxW)Y2U zD!3nWwZ`;==~m{ZPn2XqyuS&iYkp9>llp7bb)dVP!gQ_uId)!+iSj_#ro#2ZdUuYl zQoRIpO?;ec6*k(9#qtUP-5~&r*LKr+l5?`U59p@5FkNTQ&Vkwv19<xF2xF^I#st^C9F<@*xm^9G}Om2v+V^ zqP0yxKYAQHkClkkY0J1ZaGtT!#PxWU=@lF^FG0MgIIfTMmohW!?*{rYBTTo6OJ@5N zJ{b>m4+BiMRXQGt;~){1#kbpky=3e%6oUA?_g z-2{$z<4{a@{F5_mVf+HF3*Pv;35c=GB<)Y3mq$ zr~lz3(CzT~*=xUz;<1K-=Rnv0h{bz<7#$5PxpEiihbA%oSnw71ca3gkKtDc?=|0O7 ztg?2hbOBxO8m?OjIYw>hi~za?K9BjN55?+g`q}~An-h!oi@DM!$>j$3Q6c#F_2*+e z^>i*Bt}p)hKFweLlxWU@W_Z2aS77JycauDyh!2ZDUgbQW{H7Y_|L6#&2Nhe{bS%??`$qFwOb^+b zJ9fRES^%71PY%~#?sm(f7W)WvcRc^0Djoj)0_*C49wdmxhnf^S1odt00lM28OvgS6 z1RnT|4@4{-mol)Ffu#&AWnd`-OBqn6WghgZy8XfCcK=A0vVu= zK|ZDbONyAcVR5RSaqT}Y`L2Jg2NaUorv#KUS;8xmULQ=`6{y z>A7`&RB2l-$*YMPzPXn~-&m35a8ZhQR~xizAxhfr^78Io$Em_C%j8X7a%c!TW+QKb zkajgKTMa1jX-cm}DdJuDE^{Gj#A|;D!8^_2`j3clrqh}Y%M4NfDAfp2qp0x7)~rHJ>A0I!88)~?~Mk@^MJ$pcK?_n%dJd}B^$MLUv;4V!4>-i8G*9^hFFN?fZjBzL z*P;}$2!1bQA*zReWWQ1f2e+zDpQ7ZST))*)gN)D%ejAl_fj++|MJ$G6c_E6B7?pKY zXq2ahNp>PVdGhpHuGR|RMGyO-9@?|Wa=0i(ERF;@T!=a*&YwIO$oh8Z*s^^Wdczz} zf9XNqx}(>NsQ^%Gk}16wrHIAwUGhSdL;vmNoUDV26$%XsH(uD%%B(9x`Z(&vxEy%V zT2Xo}N)b!oyUvBE(VtXb_bW*B>Zr~U#q;)0Psq-~>&0*ycrDMM^jef6mTX^~S}ylS z)xEG&!zS(bPS>K%Q$K6!EkL`N?*WSO4W-wj6tN_9amw&h?`7V-t=5G*RupA;=>3*7 zH`W4P%i-I4!F)=uMJZwle0RPO^)pIZ@==9%b4{B<@mVR(H(L&VwzB?krXZfjvIFglSo@E`nrO}89E?WuP1@-_8 zgXlMn$#S?TMJ!V$c`Znpx779g)Hqk{GEq@FqbU2}k(V3N7tkE83?os?cA_%@nb)Ee zu?&pL1*!ME+|{)^S_O17ob$wIPmZRYj}?Jly(BM*PINXU^IDW5mPId4C1$hy;gKjF zupQ~H?;DwZlp*AW%zvbIm6Irfav1VS=CvqAEK6FPiWG}Jcs{hA`hfh4+_3#KY98h4 zX26RRnLm(1(`}6$$-EY&h!4QtWYYIc@dvlp;iO} z?E>qvS>RLGsCM1#L#@*X9cdixto0syLkfOZj{}_v$ZD9sPCH&V)mgkQqVK}9D{*V5 z#UHGK6xt_{!h!4w$f@;K9G&08yGy>_+f7h;W z>1G+p!XNHN$`-8;UDNV&da$e-)=-;NL4x2%${PM1mG=+B%ex0O{K|!W6EiG^XTQz{ zApH;Nhr}wl`;r!=^s3z5S?jbbXv!4Q?$%;USexHrZ%i`?jLZJe)Z9n(2IcD#ZkrL^3dW%ro zWNtKj0E*=#C6#jZxTjl$QhA<%joxng>_?%qDAek|^g?q8sfD~!sn=Nq z`)%mjw=y8jG4u80K9?lqPX6D$R-pTOvUWLGKQYy%nY(+0_K=L-@b2k-vGUg;MFch6 zCO}EK?t44h^i{8U&b!;tTPq`$Gfo%T%aFX<0L36lN%?QMwc<$6w&sSxPf`0+&KDfj zPjUKBN{@k(dThlf5^=tIBIVDSD@HqC3Z86bz;f6Dyu5BxQcYahw`HEbw;%kG7j>=O z|MESmL!^GV|4-8|Kna}x?`(^Q+LggqI!fBY%56lg*APo!+XXAXP| zJWGk|b9Js+v7(prk=*5>lPi_01C*p5Mh%27?)GC#o zE2zN+DR>vKGmDb)6>w&|I1#tUAaPFY=`a9}!|CN%qTlPKe4Lm(w{8yfthhN$ay`)KARBZoHdesop1jUV& z40ieCb?gu?c5^i8)I_MbyZ`9G)u9RovS+RI2^9(=r#2m`>0k+G@_{+D z1JrWG|CQI@GgNi-(9c28!0==0$JWBStR*Mne_!; zGT=S+DZK@@3+#IdEMt`I`a5dhef4{?w3)MKZm?~1OrTH6zUco9!O!~K@Mcs zi*q;EHWqISX5FWS!_4hmmA(0HE|5}08RXyEmqQL@6pPESyh%;LNa>G|W~QA{j5b^c zk#?Zh>p8l^Lke>}av-Dfxkm3jXFDaAo+PPcKYD>#_Czo;LzAd%5=7t%p`<<%4n9y! z>l)b1Unx5GWXk}1Lf>6TH3N!yKP7d?;dklnhYWwpP8RIV%?xu|GdKtCMv2vMb>O@~ zNk#TZjg-y4&6j>GE}1S z-_wsHSwM4G{TNW3XwM?cyg+TAdX__$ePmdkL*7m*`j?TZ@Oo9F{SPV3=o1Sv>QtQU zX(uJ=?<3fvz3ziz|HDEcVmhndVLSKT34_5@99^_oQu}5 zMjKF!u9Vc}%6`?9m9nBCXLNRNI!Npre!dx*J<%1my8=*~o>Nl8FQ2z4M0Z@+=g$47 zg+WhPD>}g*P;cO0Z1N!Ye&p>c8(@lM`NaBo;(!tB_W5v?#x5}=ccdCd0xxQG<|fNV zz)D8p9S?t|B2OQU-|b>xY&zVi2q`!pGB0qwtO{I*+tbg~CVe{~ksxsG@yPUjEQjD8 zmcTwh=@mYAU~60Ns$2dM_1|)zGs-wjy+-Z~Ni~EN0}Ul5Q*@h2LwRDW5Pf&nl+(^m zy;U~xkV1D|NMS+u^)CNULYS8Sry65S+ zOqn0sOKZk%4mec3NA6Glonk`vaO7TJJ41LqclJ02ht`xuX8+%Vz#LGn2j77J4CjZM4{KLk?tK ze@6+wy|-gat@QvM?@61+weeqjPwF69Ahm0pWJO>=`#zaht8iZ1cK;OF)K?v@JRgsw z7JvA)0#aWg#Xw1IoBMR|+8UW}8&X`>yJWOTue)%V4N{YUq7|d0CMPxpKd`OJy8q*- zH-qa5le>TZTnE&PwSZz=2gn_qDq-IIWU?=udr4y zHVQ%htQhgya@NRP5l|fHuKB;C&}<-g+i3aUQLe|Iw00PVXsrGip6fH#?GX|y4p-P( zq>rG5!5uk})$p!ghC_fobx_NdzQp&uVeJ1zKavDFtOZXv38Je1E2_4;U^JD^#Zf3y zYrW6dsi+W>@D0$*1Favjel2j7Z!3v@{QTwcE!#&$G(MXv`?_W4kv@)I<=TsYVzNX& z$=X%rL*E-eu=4jSowoI179W(4sC`g})FnXC8d6fhYKfbtW*Lg&yHDwH=iEA*+_na} zgCcod1=K!t9V7FaFWg&pkZJ7|rr(l&?25Ph)OU3uBZEZc0*VpoVdRuVeZ<>OhrE7X zKASlj*!V)mnD?|Nq+S8a=)?bt5~!a@jinU~et6o2>U-93@VlPPhfg@`RspZ&3q0Z6f3wF@(rS-s)a(35TjYOFdq&@Y zJH0v`KruH`)=)@p`<=FunrAhQ?Gp(rpNzzooIut_H1l=7Bh+C-&6>yJFmN4@H$ND!6m z0=tyIqec$}zvQJ$YUYu)YaJS2{`6{IF+21+O7bFbj#Ad}oNq|No$BYjveYlldi{E3 zKRY}^o`R5Sm<6a+Xidr5^>EGprB|Y- z=W40!gn&Tg_!XKu4Lg&OGwF^+9 z=P0SXIK^I5r9uJ6c99FVOmp80T!WDPAX>u)NJ&{yQkoWV-Z!2O4+giW`+V-4qxVP~ zJPj#0A4;cFQbo63`@h~H>OcC=T?fvy*Nq7hpO94!-S-mtkZ9y4TNi!aMwa=-D5Qo; zi&N_#>|bu5s4}WvGcIdTGRn?icodm6N$o<{W2AU2kon6aqi^DcRM!=CTW9#L{c$yr z?<&$B5~TttO?1SN)llk}YUjmuU7Rn|y;5x^qQ} z`Elex)~?9Y`&+mEY&45+r@k|s@LE;G?sE^MvPlrthC7s$j%=RNRSnrL;k}2HBz1c1 zJSx-uA%#8mBrjSZN%pPVYFeRoqdRP^`2e^9i% z$m~N-8R~pqO~Xphlw)l0so@l>8~?U1tdN4cb+;W-N7;nxB6|dGmv~GC` zERcGJL?cCW06CDgt5(-zh<>DO!#9Sb$&QHvWvPyDy&(l>YyotiNJecibTz*1ach^C zWZX^LGMRL`zEU+vwIR{S4M%ShB^7$fw@7yP&yINNH*y1lKdJ)Lq>LejKD|Op{Q^7l zS;l}9V(d>Zn=gx%sgD*Nr?q@p3#n;94eKMHWHs#YynRN-ZM#H?+=cYdHwO|kMknt< z>Nkm^$&{p|oP4_F@@S}yDh{>qZd~JA#}y;K15$Iqi}5KX)hB9IDtezSr>Cg0j56$^)+Maru8&Vu3 zih6DVuUPTbx;~Pj{9C@?n&J}8VBu4K#tbPmcStc!K@Mb@H>obve;)Yuob=|dfYGU! zFGp_CA@d-qT{0wyuoWGhWK`PD0T!M7saRqe?OT5Bj@9%tZcqM$T1JQFl8g%cnd_t) zsq;K1NK9J)Ef?Q}crbF`Px3;p8(RFFkpmf3{`+FM&*;PTEBO1@56B*l+Ni>dj4KkQ zK!ON6kam(&7ItGHw04G%e_SosaPJ=X{BYBD^?y)XoVHU^1sQ8&PtR=oaZNRC`+L2y z+K24JGwa_^vQwMUcSk;e0o(j`#@ccjMTl;8uN8oT?c=NtQ2`^>(uwa4izrTzy+rHQQW zKXMhzzN?N^=MdoIlxrGm@)521`^O4diF>EtWe=Q9hSX~+5=Bt?OiA(Y^%LqyVY__iLUKxTZtD5% zXRdt&Ua$24wQ+%L@TtcB5t^Y>(QvC^8(V)mcCTQ{W=P#2Q8X$3lwM8}{;Q1$zC5(5 zdsoICw4ok*)bQ~(ggNqVKrqP+L9Ua3+QAYX-IkmiyyCtRf z*}f;mZ&`namXFi_z6wWWCo*CXUfmyAamlHcUE3R#B$-0p9{O`enLpZ~wOPs!cy;EY z6oG~vrO9d-=r^~ullz1x<87DcIR%a!Zd!&&#?cyfPLU`=(-0+<`tInt4z>fQ*6$y< z=%{ZkU=Z1ctUM^yh3q?!LbbM+lKP_6>|!wV{f_C0j2ttMZz7S~KfxZ=l})0Sz1>Gi z@zH5n-)OI1`yw>cq(`jr#hCz!!_eysi6XFEqonR;nry17GIjCzn(XVL^j@iud5tWf zx)lMXQc6k1gip9l?@hY!eaneWyT7(Du1SeRdJ@{MZggcuN~kw-Aj{#g*&}a#fA96z zJgIqTT4_jEy8LV(q&|@#!WMLoLq^rb>mGj~-sl;r^mF8s*nu|>gxR$K^=22KwxaU~ z8THDQ-XZ8awP^ni&ZF0K3iG4Hp2Gdcn=^n~kMtFCO5lrJNV3(b5MCXaGZgqf$6C)TZt6xiV2+_zs|YqyUwI?n%jN_>8B8GsB%~{G0x1 z{{1vM-*44DV1N`l4g?SAQ<_9No4`Id7H$QVXz*o$6Wq!=b42eNFO8r~A_{Jquk zt#uj4XEw*G7XDmhT%lASx-Ue26zimrUyroh~6sm z`Vp-K#lWlIibT<@NB6&E?aHCr_}$ufbC3mV9rxuIwIcB%&ygUshW)om6k#*sO-@-C zrqP~zpQ`xu=5({r^O!*C&^OR)0Io#qu2NFvN~UvnEBz`f&(jy(P04IfK6b4McnzR; z8c1;oL=I#%9QxFPeExHC ztkY)y`0=wekyeoUL!zjxJSnMQ=Ri)y`lQxr)or@zF1_7TWoMAxB6L(UgN6f4Cf~_LoIrpPi zUF4gt0O~D03K1B;Eifv3v|E!j>n4jvo_(24c|1_XEi4K%Ka8vrXz6uC4rE?#wI_{C z!nnL-MqERy3PeXnB1RqqulLBTgO+uhkOLXDlFxCq+_50t_SGM+eae(hn0dxI45$ys zNDxQvEG6~9{y{nt$1Y5sP*6oeQJ6!=aZcCz;sozIF$+B_!_rxD1B$-kqsz=dNlu8;@z9FT=6J?B0Xw;-h zNK{hsluSj)l)n4iy?5WAbNmIrb@p1e*2{jK&pGdN&faG&yA=$Ey!aSujQ=&6|NTh+ zL?=KeKqo*aKqo*aKqo*aKqo*aKqo*aKqo*aKqo*aKqo*aKqo*aKqo*a@c$(NCvYJ` z@M7e(d5Isyf*A}QVerGI@Lp?CCE4a0_|I-4`2Piiy(JBhxvh|R7J-#C-fnAEXO=XTz;tm`^kC8ts}^ruh z(QNaoL@i-D9Qb`Lr0pyu7C+jpilz!Q+_wVcuS}xxX^p z5g4+I`GBFm?@&w>81MQ{l$+lzqvGkgpoW{F!TU!L0B1P9uH{^X~q#$3rTS z?U1{*V%{rhbYgh4j|I7NA?7cs>^?{td zbDVeabzcy?F9NyKOw5%A&!(qbIfdp2w;ar;4dmV(yLIgg9B*?0b7fr_Nj=7h7UYgv zn9o@Mv`lxV&^J`K4fB~vGd<-UdeHw(JMYI_t!L)&gXJ8wT)CQJuIaTSCx0RzdTy<4 zFxU3@{PtkUs%XMZ-_2gh5fV7|2J z=-0o5CD8nAQH8nj9bf8em13gtYM=3u+_t$P2=0VKxchkb_ zpThCZ{h05$=IPZo!MXu*+ozcS&5Yj5)V^B|xzjt$@!t%FU=jQ`x~CJM6QC2I6QC2I z6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I6QC2I z6QC2I6QC2I6QC1-2@so7HNcQIf!g(lsFQK7jpt-t)!uD^c|jj`9z z5SvCdI(;t4-caN0uRAMtsAqC2*zXH!H1R`$;X&-1CY_bp>=F%^Xpz~GrvC;Q4W6ih z1|Qm4IVpr{v`w@Q*)(I<1k>G<6aIFxFoVW~Qdq=%BGpKHvq&nfB;`y2v*C&8ybiG2 zl6zMFKtq<;HAyqFOHftm?7a9{6KtsWSY8<_IbeVqo(xC8bBZirh zUSLNdQDcHUG-iFJ8pVwcm%bg}eq6V0dEOVjk%bb8xtqbgorOL&y2QUI=$FqkMS2T^K`>X+H;0yc6aqJ(oa zyWFk84r#&=KszdhiJjD>tSaAeCaI_t=&Nt=3qGy(U>P(7h2eGZds2<*LHjL)_2cHEQuOI=b@pHLNy+_{!A6pUrFf z>Fs6bdt%X4Xb4|{#>{h6LwWu3#ri72jqJ?Pxgo)8&~qhn8PzDE8pSbJ+AnH`vzBTK zj+I?C{swD^20&w?B-My8QOX_COW4(T=lsdI=;lw*5JN8r-$AM|+OR6_VcG{C*`%a@ z8$8^>PHG}6aeG)p%9v_Q6$yHrQ`V~TB}l_oh9~MU*Jvq6d&MOisYal5beG2YvTJ)g zRTG`cPYOb#0`2ma*-kY~&OZNJ$8D2Koww=Evp!z;QH^|fR+6q%BdFlwu7`StdxW$+ z)E$>OTcH{@(3m+uHF{$L=ax3SP)pa5JM)k7Yyo7nLPOvW^A+zj#X`BBT>G~gIkN|h z=4|=hZ~#XjKfC(B>g=}j(v_E+wvA>w~v>S{atNSDu`q=E=Dch{P zZ1Bv2`_WPX5+IrgvBR5Wlv>Q%;4kN6)~rj;KXTPU3>e;CZ3M2#l!)DvyS5zvup zD6Eco@E@~QA1i?yq1C#MU^(Ju70DGCbG4|(ZpB(<@8>S%Q(p^zZ>V1Y-fzOF^nwQG z4b@;-9a0~V-}Cxl#b1&^6D{ES(NZ}d8Wk;6gCQ?*qOgATG}VkRt=2As;iv}jbbuD{ z9dxAYi0fUb-Q>Mw=hM_r_J^)2fMfpOdoJ-Gs=;SrqvBB-8}_P+LqAxJ-un)c3*TZLRZd1oD+kwG!t~B8h2{OY7(9&8?_e&MzK$2 z`u=|9EJ7n08ks!qW1U<7%E;H76HsF?h-wfSfwq$P%@mUH`D_x8zOjYEYR{0hmpK(X~Yw-N(yF|P$N9{c8-lt7zkzpM!tK-pi z5Kjka3ul0ibXEgOiu>e3S*wL#YxrG=2xg)h&$t3ZegpHM&|})%&Izc-2()DVya+%OS%M8uCl1h9-|c%gTO9v(HXV_H89^J7f?u zG-#}Qpd(#JqH0*tiNeZw0Z!nS8|(GavwQa>S76A18INoXjTLvch6>wrss_YYFUY%! zYBWQGWlA;PD`_Z|*BWbH>Svb(r%uU+MiqLlr1Gf7=3#||1zu%sa~2s+7jE(}K*k(Y zqmOFz-Mp`8TIOQ*Fys`c%_9k{0z|r1YoH|%H?dH?M@;=Njgsm+O~cj5D1n9)aqmg#mfX5g!w5_Y)~qZ~SR~Z+4jIJL0UApc zbR;7+m1)(qPvXJ(H~WqLJyrNL}TA(AYZVp-jGfUFx;>gkk!t zV*)fLfg_M>)XRvA8S@?6{Y=BBpXcSEH8k4qKtm18Eo7r)aG8aKlwXhJ$^*;m`rWwe zx#_R=AZQ5u;eLoQts1J*a-V&T;(K#*Y!-N1xz}L>4M9I@jf~;euho20A}@wi-?;VQ zO*t|mp}`A|Kt8JgrPr@N#_IO3dJ-F`8G0$85%T^CeV@Y;M^mxEDlDf#dXQ|^@sQ4d%WY>HgN+TJ8>)F0)?3Mzh8$CQHyj|)_c{X-vv~3ci&C? zQ2xX0Ff!2n5bvfMsj_16Kk8q+WmE~sg;%Ww_nLdW0={ zvTQ69g*9pvp&|B%IkAmr!oZOM0S~1F@wl6fG3YvKz$`>GQLvJd&x$!#=qLA~&o<0x z_N@6+iw#i?Ct^H7|$p$N3vyl<`;A`u3@3zdfG1HN;pDQqAIaFi0(V>x#o}t5T zeO1!ulIy`Y0+DV_FEk{dP>t>L+Zh(Is-lC5IyL8G{5K*4yo*E=C+0>{y4THe($C1b zhfQyf9FWg9dIXJHFvk;3iw!!GVG}U<+o^_WiYsi@xBUnx1;-|?ycVogMB{e`9jQjw z1DSWdwE-=DLvgpNE0*IL;O!-vpcv>##tdii`7IqSJ{D3#8_znd0bhIE8uz&Z!{rs# z`1RIkdA_P%_UfEIqixdm;46=7bVFkaVUlXFMt}ZnX>8-wiFkF&#y6;8ci6u!f)$2qoQ8%8u_};i6gV+Q?&y}zOZUA!n0ddy9U67u`-Eu1 zDWD@6p`lp=J>QEbT`@C_HmN^=X6icdE)tE^06LPw(*MBtb=ST_jco-R>=!L#5G>)vpPRNzt;@XJ?0qrN^IzwknD#64Xw|Is+C?v9$50pb#S%yUK36A`KA zeu#@CnCD;Ox-Sfg-a?Q6HRfmc)TcOdPMxR6X~q1fTdZm8#v67Z?rwTmE(CG6TbOrT76twFQnCzjk6O&7r?}>MLaSr+ z`D@_7wyEbi`dT9vYWsEpn*0UX8f$ z0sg>f_x+yrFUD^|TojA>q?A<~_m$@x8wn71pO3k9aa!e}fmyOHBna_H z%gas&9Lxpj>D)y({@9AR$N=+MmM>mDWPeVNBPzpOxLe2ev$~z<(D}kJ z%suCMRq7fgCL->76?5+=y6gRlOR=9v@5B z;J|%xvsXni;%;`Bhh|K5-W%PRhqy;7=G)RGb(zwUbYFQ)!92WSnO`p32R}yznB#YX zP^5bujR<=%00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq z00UqE41fVJ00zJS7ytuc01SWuFaQSrp9XBnXTYcKz|c2sMq3)Rw`z^paA)W$0h8yj+tSq`=oXD@3%o!aF* zEk{RvV#as z4?g}X`k7jSd#$2R9Jv}mmb!#eBGRe+{koer*fu6VxLGwPE6;?d#fx;bE6FPD@ z3o~C%Hp&f>29YaN6!wPBR_#O+)7NIs>t9mj{Zc0HHnn{$Rqq`vJno&py5jIQy?33# z@dp~-Y(oxJ>`=;(S~Vl*aCo(b*HP``q%O`oxcWlRJ5Kz;oUqZ>_t^9m_MzPkx;+RIrkrI zR-BXB5fz;9cY7U5shy%S1Ywv=?&MM$Gunjf^IOEr(%;PtIXCr9Ph}0cYJ{q#epVJD z*lo>3oT3?H5Y0?j~Qam%&_l@I-Yf%e!Sm<36&S)~(zI^)%E0ogmLRY9Wo0*C+ z-{qDXS;Ly=P?Zzq(kI$*(bXTNbjUQhDcxSmOa&K&=Aiy zEB=D2`V^k9b5}Z@x-3g6*km$O0gYGNd&DV4YrD%!`kd^}mu*@{j!o6ljgqAlXSOg? zNm(NY4XlbfmrHNg+>!Q{WteOtdqI}EC`%D@qnN43WAv|7PjBLRWvtG%=-=Iyo*F-e zPNCIqRxQ+OJ~0+))Ly;^-sqLZZT7!+2te`M(8WA`(S3zh??Lo!NyI!Op5Trc> z6(tiDA)S*PgA{7G)LK+z^00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P-n{B2dCFL?tXH z-5{qItK5W`)HL>LiXNnu<*X2H+h4HX4?;_Jcd*gaDdYu7EDyW-eC?lAJH+ujS^n^7 zq&_6`UlhkjSUx#cdn;?twIgC~W4T4&705m3+bqu0!14octv}qC3TwpiH7s|TzqK2* z$0~%pFoETDy`#s!Zi^0z<2zZ-wHYf7iOM-~{%)4DGa)jWa1TcaKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izzz`rG6 z=3iIO@0oPh6wFMxX1y!F)XtAr-q~*D=vu1RPSX=13SEFd8si%_PtV=6`ySVa4mMve zcP2;az*vJs?@1f>?~}vC;q$Lq)NDtum>JuFwx#5GpC zz0$^5-ii13xeROX;l52aeP##$<^RAKi@B^r z*O)Cd=J(Qu%G6&fZLF{OS-ns)TU QN_a`!NV1~5=>002Ab1#tiX literal 17 UcmZQhY`Gk`{>!NV1_)pR06QH7%m4rY diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 528a962..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sat Jun 21 03:09:22 MSK 2025 -gradle.version=8.14.1 diff --git a/.idea/hotswap_agent.xml b/.idea/hotswap_agent.xml new file mode 100644 index 0000000..88fa3d9 --- /dev/null +++ b/.idea/hotswap_agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules/BlockAndSeek.iml b/.idea/modules/BlockAndSeek.iml new file mode 100644 index 0000000..c72e27f --- /dev/null +++ b/.idea/modules/BlockAndSeek.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..3fa369c --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + BlockAndSeek + Project BlockAndSeek created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + 1750464766576 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java index bd6eab2..54478eb 100644 --- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java +++ b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java @@ -1,5 +1,6 @@ package hdvtdev.blockAndSeek; +import hdvtdev.blockAndSeek.eventListeners.DefaultEventListener; import hdvtdev.blockAndSeek.eventListeners.EventListener; import hdvtdev.blockAndSeek.eventListeners.ForceControlEventListener; import hdvtdev.blockAndSeek.managers.ConfigManager; @@ -66,15 +67,12 @@ public class BlockAndSeek extends JavaPlugin { getLogger().severe("Failed to save some .yml configs!"); } - - getLogger().warning(ConfigManager.getConfig().toString()); - PluginCommand command = Objects.requireNonNull(getCommand("blockandseek")); command.setExecutor(new CommandListener()); PluginManager manager = getServer().getPluginManager(); - if (ConfigManager.getConfig().forceControl()) manager.registerEvents(new ForceControlEventListener(), this); - manager.registerEvents(new EventListener(), this); + manager.registerEvents(ConfigManager.getConfig().forceControl() ? new ForceControlEventListener() : new EventListener(), this); + manager.registerEvents(new DefaultEventListener(), this); } diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java index 534a836..227b703 100644 --- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java +++ b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java @@ -14,10 +14,7 @@ import org.bukkit.persistence.PersistentDataType; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -113,6 +110,10 @@ public class BlockAndSeekGame { return players.values().stream().filter(type -> type == PlayerType.HIDER).count(); } + private long getSeekersCount() { + return players.values().stream().filter(type -> type == PlayerType.SEEKER).count(); + } + private List getSeekers() { return players.entrySet().stream().filter(entry -> entry.getValue() == PlayerType.SEEKER).map(Map.Entry::getKey).toList(); } @@ -136,7 +137,7 @@ public class BlockAndSeekGame { PlayerInventory inventory = hider.getInventory(); inventory.clear(); inventory.addItem(Localization.translateItem(hider, ItemManager.getFreezeItem())); - RouletteCreator.createRoulette(hider, null, true, map.getBlocks()); + new RouletteCreator(hider, map.getBlocks()); } } @@ -154,6 +155,7 @@ public class BlockAndSeekGame { if (defaultInventory) ItemManager.defaultInventory(player); player.setGlowing(false); player.setInvulnerable(false); + Utils.setLevelWithBar(player, 0); player.setVisibleByDefault(true); player.setGameMode(GameMode.SURVIVAL); player.teleport(serverLobby); @@ -163,23 +165,31 @@ public class BlockAndSeekGame { } private void preEnd() { + for (Player player : players.keySet()) { + player.setInvulnerable(true); + } for (Player hider : getHiders()) { hider.getInventory().clear(); FreezeManager.unfreezeIfFrozen(hider); hider.setGlowing(true); - hider.setInvulnerable(true); } } public void selectRandomSeekers(int count) { - ArrayList playerList = new ArrayList<>(players.keySet()); - Collections.shuffle(playerList); - List seekers = playerList.subList(0, Math.min(count, playerList.size())); - for (Player seeker : seekers) { + ArrayList rawSeekers = new ArrayList<>(); + Set playerSet = players.keySet(); + for (Player player : playerSet) { + if (!GamesManager.triggerSeekerImmune(player)) rawSeekers.add(player); + } + Collections.shuffle(rawSeekers); + + for (Player seeker : rawSeekers.subList(0, Math.min(count, playerSet.size()))) { players.put(seeker, PlayerType.SEEKER); ItemManager.setSeekerSet(seeker); + Utils.setLevelWithBar(seeker, 100); seeker.setInvulnerable(false); seeker.getPersistentDataContainer().set(Keys.SEEKER, PersistentDataType.BOOLEAN, true); + GamesManager.addSeekerImmune(seeker); } } @@ -235,7 +245,10 @@ public class BlockAndSeekGame { } } + if (getSeekersCount() == 0) duration = 0; + if (duration == 0) { + preEnd(); if (getHidersCount() == 1) { Localization.sendTitle( diff --git a/src/main/java/hdvtdev/blockAndSeek/CommandListener.java b/src/main/java/hdvtdev/blockAndSeek/CommandListener.java index 9012737..33edc39 100644 --- a/src/main/java/hdvtdev/blockAndSeek/CommandListener.java +++ b/src/main/java/hdvtdev/blockAndSeek/CommandListener.java @@ -76,10 +76,22 @@ public class CommandListener implements TabExecutor { DisguiseAPI.disguiseToAll(player, new MiscDisguise(DisguiseType.FALLING_BLOCK, new ItemStack(material))); } } - + + case "damage" -> { + if (sender instanceof Player player && args.length == 2) { + player.damage(Double.parseDouble(args[1])); + } + } + + case "health" -> { + if (sender instanceof Player player && args.length == 2) { + player.setHealth(Double.parseDouble(args[1])); + } + } + case "new" -> { if (sender instanceof Player player) { - RouletteCreator.newCreateRoulette(player, List.of( + new RouletteCreator(player, List.of( new BlockAndSeekMap.Block(new ItemStack(Material.STONE), 10), new BlockAndSeekMap.Block(new ItemStack(Material.DIRT), 10), new BlockAndSeekMap.Block(new ItemStack(Material.LANTERN), 10), diff --git a/src/main/java/hdvtdev/blockAndSeek/Utils.java b/src/main/java/hdvtdev/blockAndSeek/Utils.java new file mode 100644 index 0000000..91319ba --- /dev/null +++ b/src/main/java/hdvtdev/blockAndSeek/Utils.java @@ -0,0 +1,35 @@ +package hdvtdev.blockAndSeek; + +import hdvtdev.blockAndSeek.managers.FreezeManager; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.MiscDisguise; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public final class Utils { + + private Utils() { + } + + public static void setLevelWithBar(Player p, int level) { + p.setLevel(level); + p.setExp(0.9998f * ((float) level / 100)); + } + + public static boolean isInOneTeam(Player p1, Player p2) { + var c1 = p1.getPersistentDataContainer(); + var c2 = p2.getPersistentDataContainer(); + return (c1.has(Keys.HIDER) && c2.has(Keys.HIDER)) || (c1.has(Keys.SEEKER) && c2.has(Keys.SEEKER)); + } + + public static boolean playerInGame(Player player) { + return player.getPersistentDataContainer().has(Keys.GAME); + } + + public static void firstDisguise(Player player, ItemStack prop) { + DisguiseAPI.disguiseToAll(player, new MiscDisguise(DisguiseType.FALLING_BLOCK, prop)); + FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData()); + } + +} diff --git a/src/main/java/hdvtdev/blockAndSeek/eventListeners/DefaultEventListener.java b/src/main/java/hdvtdev/blockAndSeek/eventListeners/DefaultEventListener.java new file mode 100644 index 0000000..df9d59f --- /dev/null +++ b/src/main/java/hdvtdev/blockAndSeek/eventListeners/DefaultEventListener.java @@ -0,0 +1,269 @@ +package hdvtdev.blockAndSeek.eventListeners; + +import hdvtdev.blockAndSeek.BlockAndSeek; +import hdvtdev.blockAndSeek.Keys; +import hdvtdev.blockAndSeek.Utils; +import hdvtdev.blockAndSeek.managers.FreezeManager; +import hdvtdev.blockAndSeek.managers.GamesManager; +import hdvtdev.blockAndSeek.managers.GuiManager; +import hdvtdev.blockAndSeek.roulette.RouletteCreator; +import org.bukkit.Bukkit; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDismountEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import static hdvtdev.blockAndSeek.Utils.isInOneTeam; +import static hdvtdev.blockAndSeek.Utils.playerInGame; + +public class DefaultEventListener implements Listener { + + private static final BukkitScheduler scheduler = Bukkit.getScheduler(); + private static final Set coolDown = ConcurrentHashMap.newKeySet(); + + @Deprecated(forRemoval = true) + private static final ConcurrentHashMap tasks = new ConcurrentHashMap<>(); + + @Deprecated(forRemoval = true) + public static void createTask(Player player, BukkitTask bukkitTask) { + tasks.put(player, bukkitTask); + } + + @Deprecated(forRemoval = true) + public static void stopTask(Player player) { + BukkitTask task = tasks.remove(player); + task.cancel(); + } + + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (player.getVehicle() instanceof ArmorStand armorStand) { + PersistentDataContainer armorStandContainer = armorStand.getPersistentDataContainer(); + if (armorStandContainer.has(Keys.FROZEN_PLAYER)) { + armorStandContainer.remove(Keys.FROZEN_PLAYER); + armorStand.remove(); + } + } + } + + @EventHandler + public void onBlockDamage(BlockDamageEvent event) { + Player player = event.getPlayer(); + if (player.getPersistentDataContainer().has(Keys.SEEKER)) { + if (FreezeManager.unfreeze(event.getBlock().getBlockData())) { + event.setCancelled(true); + } else { + player.damage(2); + Utils.setLevelWithBar(player, (int) Math.round(player.getHealth() * 5)); + } + } + } + + @EventHandler + public void onRightClick(PlayerInteractEvent event) { + if (event.getHand() != EquipmentSlot.HAND) return; + Action action = event.getAction(); + Player player = event.getPlayer(); + if (action.isRightClick() && !coolDown.contains(player)) { + + + ItemStack itemInHand = player.getInventory().getItemInMainHand(); + ItemMeta meta = itemInHand.getItemMeta(); + + if (meta != null) { + PersistentDataContainer itemData = meta.getPersistentDataContainer(); + if (itemData.has(Keys.FREEZE_ITEM) && playerInGame(player)) { + coolDown.add(player); + scheduler.runTaskLater(BlockAndSeek.getInstance(), () -> coolDown.remove(player), 3L); + FreezeManager.freeze(player); + event.setCancelled(true); + } else if (itemData.has(Keys.MENU_ITEM)) { + GuiManager.Menu.open(player); + event.setCancelled(true); + } else if (itemData.has(Keys.LEAVE_ITEM)) { + String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING); + GamesManager.get(game).removePlayer(player); + event.setCancelled(true); + } + } + + + } + + } + + @EventHandler + public void onEntityDismount(EntityDismountEvent event) { + Player player = (Player) event.getEntity(); + if (event.getDismounted() instanceof ArmorStand armorStand && armorStand.getPersistentDataContainer().has(Keys.FROZEN_PLAYER)) { + FreezeManager.freeze(player); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + PersistentDataContainer container = player.getPersistentDataContainer(); + + String arena = container.get(Keys.GAME, PersistentDataType.STRING); + if (arena != null) { + GamesManager.get(arena).removePlayer(player); + FreezeManager.removePlayerDisguise(player); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getPlayer(); + String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING); + if (game != null) { + event.deathMessage(null); + event.setDroppedExp(0); + event.getDrops().clear(); + scheduler.runTask(BlockAndSeek.getInstance(), () -> GamesManager.get(game).setSpectator(player, player.getKiller())); + //without scheduler strange things are happening idk + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + + Player player = (Player) event.getPlayer(); + InventoryHolder holder = event.getInventory().getHolder(); + + + if (holder instanceof RouletteCreator rouletteCreator) { + if (rouletteCreator.isClosedByPlayer()) { + RouletteCreator.Task task = rouletteCreator.getTask(); + + if (!task.rouletteTask().isCancelled()) { + task.cancelBoth(); + Utils.firstDisguise(player, rouletteCreator.randomPropItem()); + } else Utils.firstDisguise(player, rouletteCreator.randomMidPropItem()); //FIXME THIS FUCKING LINE AAAA + + } else Utils.firstDisguise(player, rouletteCreator.randomMidPropItem()); + } + + + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + Inventory inventory = event.getClickedInventory(); + + + if (inventory != null) { + + InventoryHolder holder = inventory.getHolder(); + int slot = event.getSlot(); + ItemStack item = inventory.getItem(slot); + + if (holder instanceof RouletteCreator rouletteCreator) { + RouletteCreator.Task task = rouletteCreator.getTask(); + + if (task.rouletteTask().isCancelled()) { + if (slot == 21 || slot == 23 || slot == 25) { + task.autoCloseTask().cancel(); + Utils.firstDisguise(player, inventory.getItem(slot)); + rouletteCreator.closeInventoryByPlayer(); + } + event.setCancelled(true); + return; + } else { + if (slot == 36) { + task.rouletteTask().cancel(); + Utils.firstDisguise(player, rouletteCreator.randomPropItem()); + rouletteCreator.closeInventory(); + event.setCancelled(true); + return; + } + } + + + } + + + if (item != null) { + ItemMeta meta = item.getItemMeta(); + if (meta != null) { + PersistentDataContainer itemData = meta.getPersistentDataContainer(); + + if (itemData.has(Keys.GAME_PAGE)) { + GuiManager.Menu.Games.open(player); + event.setCancelled(true); + } else if (itemData.has(Keys.GAME)) { + String game = itemData.get(Keys.GAME, PersistentDataType.STRING); + if (game != null) { + GamesManager.get(game).addPlayer(player); + event.setCancelled(true); + } + } + } + } + + } + + //TODO MOVE TO EVENT LISTENER + if (player.getPersistentDataContainer().has(Keys.GAME)) { + event.setCancelled(true); + } + + + } + + @EventHandler + public void onRegainHealth(EntityRegainHealthEvent event) { + if (event.getEntity() instanceof Player player) { + if (player.getPersistentDataContainer().has(Keys.SEEKER)) { + event.setCancelled(true); + } + } + } + + + @EventHandler + public void onPlayerDamage(EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Player damager && event.getEntity() instanceof Player victim) { + if (isInOneTeam(damager, victim)) { + event.setCancelled(true); + } else if (victim.getPersistentDataContainer().has(Keys.SEEKER)) { + event.setDamage(0); + } else if (damager.getPersistentDataContainer().has(Keys.SEEKER)) { + double maxHealth = 20.0; + double currentHealth = damager.getHealth(); + if (currentHealth < maxHealth) { + double newHealth = Math.min(currentHealth + event.getDamage(), maxHealth); + damager.setHealth(newHealth); + Utils.setLevelWithBar(damager, (int) Math.round(damager.getHealth() * 5)); + } + } + } + } + +} diff --git a/src/main/java/hdvtdev/blockAndSeek/eventListeners/EventListener.java b/src/main/java/hdvtdev/blockAndSeek/eventListeners/EventListener.java index fa5345d..3040b8c 100644 --- a/src/main/java/hdvtdev/blockAndSeek/eventListeners/EventListener.java +++ b/src/main/java/hdvtdev/blockAndSeek/eventListeners/EventListener.java @@ -1,176 +1,30 @@ package hdvtdev.blockAndSeek.eventListeners; - -import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.Keys; -import hdvtdev.blockAndSeek.managers.FreezeManager; -import hdvtdev.blockAndSeek.managers.GamesManager; -import hdvtdev.blockAndSeek.managers.GuiManager; -import hdvtdev.blockAndSeek.managers.ItemManager; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import org.bukkit.Bukkit; -import org.bukkit.entity.ArmorStand; +import hdvtdev.blockAndSeek.Utils; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDismountEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; -import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.scheduler.BukkitTask; - -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - public class EventListener implements Listener { - private static final BukkitScheduler scheduler = Bukkit.getScheduler(); - - private static final Set coolDown = ConcurrentHashMap.newKeySet(); - - private static final ConcurrentHashMap tasks = new ConcurrentHashMap<>(); - private static final ConcurrentHashMap soundCoolDown = new ConcurrentHashMap<>(); - - private static final ItemStack menuItem = ItemManager.getMenuItem(); - - public static void createTask(Player player, BukkitTask bukkitTask) { - tasks.put(player, bukkitTask); - } - - public static void stopTask(Player player) { - BukkitTask task = tasks.remove(player); - task.cancel(); - } - - private static boolean playerInGame(Player player) { - return player.getPersistentDataContainer().has(Keys.GAME); - } - - private static boolean isInOneTeam(Player p1, Player p2) { - var c1 = p1.getPersistentDataContainer(); - var c2 = p2.getPersistentDataContainer(); - return (c1.has(Keys.HIDER) && c2.has(Keys.HIDER)) || (c1.has(Keys.SEEKER) && c2.has(Keys.SEEKER)); - } - @EventHandler public void onDrop(PlayerDropItemEvent event) { if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); } - @EventHandler - public void onBlockDamage(BlockDamageEvent event) { - if (event.getPlayer().getPersistentDataContainer().has(Keys.SEEKER)) { - if (FreezeManager.unfreeze(event.getBlock().getBlockData())) event.setCancelled(true); - } - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - if (player.getVehicle() instanceof ArmorStand armorStand) { - PersistentDataContainer armorStandContainer = armorStand.getPersistentDataContainer(); - if (armorStandContainer.has(Keys.FROZEN_PLAYER)) { - armorStandContainer.remove(Keys.FROZEN_PLAYER); - armorStand.remove(); - } - } - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - PersistentDataContainer container = player.getPersistentDataContainer(); - - String arena = container.get(Keys.GAME, PersistentDataType.STRING); - if (arena != null) { - GamesManager.get(arena).removePlayer(player); - FreezeManager.removePlayerDisguise(player); - } - } - - @EventHandler - public void onPlayerDeath(PlayerDeathEvent event) { - Player player = event.getPlayer(); - String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING); - if (game != null) { - event.deathMessage(null); - event.setDroppedExp(0); - event.getDrops().clear(); - scheduler.runTask(BlockAndSeek.getInstance(), () -> GamesManager.get(game).setSpectator(player, player.getKiller())); - //without scheduler strange things are happening idk - } - } - - @EventHandler - public void onEntityDismount(EntityDismountEvent event) { - Player player = (Player) event.getEntity(); - if (event.getDismounted() instanceof ArmorStand armorStand && armorStand.getPersistentDataContainer().has(Keys.FROZEN_PLAYER)) { - FreezeManager.freeze(player); - } - } - @EventHandler public void onFoodLevelChange(FoodLevelChangeEvent event) { - if (event.getEntity() instanceof Player player && playerInGame(player)) { + if (event.getEntity() instanceof Player player && Utils.playerInGame(player)) { event.setCancelled(true); event.getEntity().setFoodLevel(20); } } - - @EventHandler - public void onRightClick(PlayerInteractEvent event) { - if (event.getHand() != EquipmentSlot.HAND) return; - Action action = event.getAction(); - Player player = event.getPlayer(); - if (action.isRightClick() && !coolDown.contains(player)) { - - - ItemStack itemInHand = player.getInventory().getItemInMainHand(); - ItemMeta meta = itemInHand.getItemMeta(); - - if (meta != null) { - PersistentDataContainer itemData = meta.getPersistentDataContainer(); - if (itemData.has(Keys.FREEZE_ITEM) && playerInGame(player)) { - coolDown.add(player); - scheduler.runTaskLater(BlockAndSeek.getInstance(), () -> coolDown.remove(player), 3L); - FreezeManager.freeze(player); - event.setCancelled(true); - } else if (itemData.has(Keys.MENU_ITEM)) { - GuiManager.Menu.open(player); - event.setCancelled(true); - } else if (itemData.has(Keys.LEAVE_ITEM)) { - String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING); - GamesManager.get(game).removePlayer(player); - event.setCancelled(true); - } - } - - - } - - } - @EventHandler public void onBlockPlacement(BlockPlaceEvent event) { if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); @@ -181,85 +35,5 @@ public class EventListener implements Listener { if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); } - @EventHandler - public void onPlayerDamage(EntityDamageByEntityEvent event) { - if (event.getDamager() instanceof Player damager && event.getEntity() instanceof Player victim) { - if (isInOneTeam(damager, victim)) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - Player player = (Player) event.getWhoClicked(); - Inventory inventory = event.getClickedInventory(); - - - if (inventory != null) { - - ItemStack item = inventory.getItem(event.getSlot()); - - - if (item != null) { - ItemMeta meta = item.getItemMeta(); - if (meta != null) { - PersistentDataContainer itemData = meta.getPersistentDataContainer(); - - if (itemData.has(Keys.GAME_PAGE)) { - GuiManager.Menu.Games.open(player); - event.setCancelled(true); - } else if (itemData.has(Keys.GAME)) { - String game = itemData.get(Keys.GAME, PersistentDataType.STRING); - if (game != null) { - GamesManager.get(game).addPlayer(player); - event.setCancelled(true); - } - } - } - } - - } - - if (player.getPersistentDataContainer().has(Keys.GAME)) { - event.setCancelled(true); - } - - if (player.hasMetadata("RollingMenu")) { - event.setCancelled(true); - int slot = event.getSlot(); - if (slot == 21 || slot == 23 || slot == 25) { - if (!tasks.containsKey(player)) { - ItemStack prop = event.getInventory().getItem(slot); - FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData()); - MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, prop); - DisguiseAPI.disguiseToAll(player, miscDisguise); - player.closeInventory(InventoryCloseEvent.Reason.UNKNOWN); - } - } - } - - - } - - @EventHandler - public void onInventoryClose(InventoryCloseEvent event) { - - Player player = (Player) event.getPlayer(); - if (player.hasMetadata("RollingMenu")) { - if (!tasks.containsKey(player)) { - player.removeMetadata("RollingMenu", BlockAndSeek.getInstance()); - if (!event.getReason().equals(InventoryCloseEvent.Reason.UNKNOWN)) { - ItemStack prop = event.getInventory().getItem(21); - FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData()); - MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, prop); - DisguiseAPI.disguiseToAll(player, miscDisguise); - } - } else { - Bukkit.getScheduler().runTaskLater(BlockAndSeek.getInstance(), () -> player.openInventory(event.getInventory()), 0L); - } - - } - } } diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java index b6f0ec6..3302709 100644 --- a/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java +++ b/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java @@ -56,7 +56,7 @@ public class FreezeManager { location.getWorld().setBlockData(blockLocation, data.blockData); player.getPersistentDataContainer().remove(Keys.FROZEN_PLAYER); - + player.setFreezeTicks(0); data.armorStand.remove(); player.setInvulnerable(false); @@ -110,6 +110,8 @@ public class FreezeManager { DisguiseAPI.disguiseToAll(player, hideDisguise); + player.setFreezeTicks(40); + frozenPlayers.put(player, new FreezeData(armorStand, blockData, disguise)); } else return false; diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java index bfc4c3d..2ce45a7 100644 --- a/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java +++ b/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java @@ -3,13 +3,9 @@ package hdvtdev.blockAndSeek.managers; import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.BlockAndSeekGame; import hdvtdev.blockAndSeek.BlockAndSeekMap; -import hdvtdev.blockAndSeek.Localization; import org.bukkit.Bukkit; import org.bukkit.WorldCreator; -import org.bukkit.scoreboard.Criteria; -import org.bukkit.scoreboard.DisplaySlot; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.entity.Player; import java.io.File; import java.util.Set; @@ -18,9 +14,14 @@ import java.util.concurrent.ConcurrentHashMap; public class GamesManager { private static final ConcurrentHashMap games = new ConcurrentHashMap<>(); + private static final Set seekerImmune = ConcurrentHashMap.newKeySet(); - public static boolean isExist(String name) { - return games.containsKey(name); + public static boolean triggerSeekerImmune(Player player) { + return seekerImmune.remove(player); + } + + public static void addSeekerImmune(Player player) { + seekerImmune.add(player); } public static Set getAvailableGames() { @@ -51,33 +52,4 @@ public class GamesManager { return games.get(name); } - private static Scoreboard updateScoreboard(Scoreboard scoreboard, int players, int maxPlayers) { - Objective objective = scoreboard.getObjective(DisplaySlot.SIDEBAR); - for (String o : scoreboard.getEntries()) { - scoreboard.resetScores(o); - } - - - objective.getScore(" ").setScore(3); - objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); - objective.getScore(" ").setScore(1); - objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); - - return scoreboard; - } - - private static Scoreboard newLobbyScoreboard(String name, int players, int maxPlayers) { - Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); - Objective objective = scoreboard.registerNewObjective(name, Criteria.DUMMY, Localization.getComponent(" game-title", "{title}", name)); - objective.setDisplaySlot(DisplaySlot.SIDEBAR); - - objective.getScore(" ").setScore(3); - objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); - objective.getScore(" ").setScore(1); - objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); - - - return scoreboard; - } - } diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/ItemManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/ItemManager.java index 99b4d79..2fb6783 100644 --- a/src/main/java/hdvtdev/blockAndSeek/managers/ItemManager.java +++ b/src/main/java/hdvtdev/blockAndSeek/managers/ItemManager.java @@ -94,6 +94,7 @@ public class ItemManager { meta.setColor(Color.RED); meta.setUnbreakable(true); meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 10, true); + meta.addEnchant(Enchantment.THORNS, 3, true); meta.displayName(Component.text("seeker-armor")); return meta; diff --git a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java index 123cda9..ee88f4c 100644 --- a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java +++ b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java @@ -2,35 +2,74 @@ package hdvtdev.blockAndSeek.roulette; import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.BlockAndSeekMap; -import hdvtdev.blockAndSeek.eventListeners.EventListener; -import me.libraryaddict.disguise.DisguiseAPI; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import net.kyori.adventure.text.Component; +import hdvtdev.blockAndSeek.Localization; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; +import java.util.Random; -public class RouletteCreator implements InventoryHolder { +public final class RouletteCreator implements InventoryHolder { - public static void newCreateRoulette(Player player, List blocks) { - final Inventory gui = Bukkit.createInventory(null, 45); - new BukkitRunnable() { + private static final int[] slots = {3, 5, 7, 12, 14, 16, 21, 23, 25, 30, 32, 34, 39, 41, 43}; + private static final int[] midSlots = {21, 23, 25}; + private static final Random random = new Random(); + private final Inventory roulette; + private Task task; + private volatile boolean closedByPlayer = true; + + public RouletteCreator(@NotNull Player player, List blocks) { + roulette = Bukkit.createInventory(this, 45, Localization.getComponent(player, "roulette-title")); + this.createUnoptimizedRoulette(roulette, player, blocks); + } + + public @NotNull Task getTask() { + return task; + } + + public boolean isClosedByPlayer() { + return closedByPlayer; + } + + @Override + public @NotNull Inventory getInventory() { + return roulette; + } + + public void closeInventory() { + closedByPlayer = false; + roulette.close(); + } + + public void closeInventoryByPlayer() { + closedByPlayer = true; + roulette.close(); + } + + public ItemStack randomPropItem() { + return roulette.getItem(slots[random.nextInt(0, 15)]); + } + + public ItemStack randomMidPropItem() { + return roulette.getItem(midSlots[random.nextInt(0, 3)]); + } + + @ApiStatus.Experimental + private void createUnoptimizedRoulette(Inventory gui, Player player, List blocks) { + + BukkitTask rouletteTask = new BukkitRunnable() { - int i = 0; final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks); final List> rows = List.of( @@ -39,57 +78,58 @@ public class RouletteCreator implements InventoryHolder { new RouletteList<>(rouletteGenerator.getRandomRow(15)) ); - final List items = List.of( - new ItemStack[]{ - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next() - }, - new ItemStack[]{ - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next() - }, - new ItemStack[]{ - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next() + final List items; + + { + List rawItems = new ArrayList<>(); + for (int j = 0; j < 3; j++) { + ItemStack[] itemStacks = new ItemStack[5]; + for (int l = 0; l < 5; l++) { + itemStacks[l] = rows.get(j).next(); } - ); + rawItems.add(j, itemStacks); + } + items = rawItems; + } - private volatile boolean finished = false; - private long startTime = System.currentTimeMillis(); - private long lastActionTime = startTime; - private long nextDelay = 0; + final long startTime = System.currentTimeMillis(); + double currentSpeed = 0; + int i = 0; - private final long baseDelay = 30; - private final long maxDelay = 450; - private final double k = 0.2; @Override public void run() { - if (finished) this.cancel(); - long now = System.currentTimeMillis(); - long elapsedSeconds = (now - startTime) / 1000; - if (elapsedSeconds >= 10) { - finished = true; - return; + double elapsed = (now - startTime) / 1000.0; + + if (elapsed >= 9.5) { + this.cancel(); } + double speed; + if (elapsed < 3.0) speed = 1.0; + else if (elapsed < 3.5) speed = 0.8; + else if (elapsed < 4.0) speed = 0.6; + else if (elapsed < 4.5) speed = 0.5; + else if (elapsed < 5.0) speed = 0.4; + else if (elapsed < 5.5) speed = 0.33; + else if (elapsed < 6.0) speed = 0.28; + else if (elapsed < 6.5) speed = 0.25; + else if (elapsed < 7.0) speed = 0.22; + else if (elapsed < 7.5) speed = 0.2; + else if (elapsed < 8.0) speed = 0.12; + else speed = 0.05; - nextDelay = (long) (baseDelay + (maxDelay - baseDelay) * (1 - Math.exp(-k * elapsedSeconds))); + task(speed); - if (now - lastActionTime >= nextDelay) { - i++; + i++; + } + + private void task(double speed) { + if (currentSpeed >= 1) { + currentSpeed = 0; for (int j = 0; j < 5; j++) { gui.setItem(3 + j * 9, items.getFirst()[j]); gui.setItem(5 + j * 9, items.get(1)[j]); @@ -107,136 +147,24 @@ public class RouletteCreator implements InventoryHolder { items.getFirst()[0] = rows.getFirst().next(); items.get(1)[0] = rows.get(1).next(); items.get(2)[0] = rows.get(2).next(); - lastActionTime = now; - } - - i++; + } else currentSpeed += speed; } + }.runTaskTimer(BlockAndSeek.getInstance(), 0, 1); - }.runTaskTimer(BlockAndSeek.getInstance(), 0, 4); + + task = new Task(rouletteTask, Bukkit.getScheduler().runTaskLater(BlockAndSeek.getInstance(), this::closeInventory, 300)); player.openInventory(gui); } - @Deprecated - public static void createRoulette(Player player, Inventory inventory, boolean openInventory, List blocks) { - - Inventory gui = inventory == null ? new RouletteCreator().getInventory() : inventory; - - - EventListener.createTask(player, new BukkitRunnable() { - - int i = 0; - final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks); - - final List> rows = List.of( - new RouletteList<>(rouletteGenerator.getRandomRow(15)), - new RouletteList<>(rouletteGenerator.getRandomRow(15)), - new RouletteList<>(rouletteGenerator.getRandomRow(15)) - ); - - final List items = List.of( - new ItemStack[]{ - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next(), - rows.getFirst().next() - }, - new ItemStack[]{ - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next(), - rows.get(1).next() - - }, - new ItemStack[]{ - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next(), - rows.get(2).next() - } - ); - - @Override - public void run() { - - for (int j = 0; j < 5; j++) { - gui.setItem(3 + j * 9, items.getFirst()[j]); - gui.setItem(5 + j * 9, items.get(1)[j]); - gui.setItem(7 + j * 9, items.get(2)[j]); - } - - player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 0.5f, 2f); - - - if (i == 30) { - player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 0.5f, 0.5f); - EventListener.stopTask(player); - } - - for (int j = 4; j >= 1; j--) { - items.getFirst()[j] = items.getFirst()[j - 1]; - items.get(1)[j] = items.get(1)[j - 1]; - items.get(2)[j] = items.get(2)[j - 1]; - } - - - items.getFirst()[0] = rows.getFirst().next(); - items.get(1)[0] = rows.get(1).next(); - items.get(2)[0] = rows.get(2).next(); - - i++; - } - - - }.runTaskTimer(BlockAndSeek.getInstance(), 0, 3L)); - - new BukkitRunnable() { - - @Override - public void run() { - - Inventory inventory = player.getOpenInventory().getTopInventory(); - - if (inventory.getHolder() instanceof RouletteCreator) { - inventory.close(); - MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, inventory.getItem(21)); - DisguiseAPI.disguiseToAll(player, miscDisguise); - } - - } - - - }.runTaskLater(BlockAndSeek.getInstance(), 300L); - - if (openInventory) { - player.openInventory(gui); - player.setMetadata("RollingMenu", new FixedMetadataValue(BlockAndSeek.getInstance(), "RollingMenu")); + public record Task(BukkitTask rouletteTask, BukkitTask autoCloseTask) { + public void cancelBoth() { + rouletteTask.cancel(); + autoCloseTask.cancel(); } - - } - @Override - public @NotNull Inventory getInventory() { - - Inventory gui = Bukkit.createInventory(this, 45, Component.text("РулетОЧКА")); - - ItemStack filler = new ItemStack(Material.BLUE_STAINED_GLASS_PANE); - ItemMeta fillerMeta = filler.getItemMeta(); - fillerMeta.displayName(Component.text("")); - fillerMeta.lore(null); - fillerMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - filler.setItemMeta(fillerMeta); - for (int i = 0; i < 45; i++) { - gui.setItem(i, filler); - } - return gui; - } } diff --git a/src/main/resources/localization.yml b/src/main/resources/localization.yml index fd2b31b..c175e11 100644 --- a/src/main/resources/localization.yml +++ b/src/main/resources/localization.yml @@ -36,3 +36,5 @@ en-US: game-player-count: "{players} of {max-players} players" leave-item: "Leave game" + roulette-title: "Props Roulette" +