From bcbe3c01ab7a7624b7e8094d6e742d7241e32abf Mon Sep 17 00:00:00 2001 From: netbenixcn Date: Sun, 31 May 2020 10:48:07 +0200 Subject: [PATCH] Initial Commit --- .classpath | 15 + .project | 17 + README.md | 24 + bin/ml/codenoodles/lmve/Main.class | Bin 0 -> 9912 bytes .../lmve/modules/CustomRecipes.class | Bin 0 -> 90244 bytes .../lmve/modules/EnragedMobs.class | Bin 0 -> 12557 bytes .../codenoodles/lmve/modules/Hardcore.class | Bin 0 -> 3483 bytes .../lmve/modules/Leaderboard.class | Bin 0 -> 5426 bytes .../codenoodles/lmve/modules/Messages.class | Bin 0 -> 1971 bytes .../lmve/modules/NetherPortal.class | Bin 0 -> 2746 bytes .../lmve/modules/PlayerHeads.class | Bin 0 -> 2955 bytes .../codenoodles/lmve/modules/PlayerList.class | Bin 0 -> 2077 bytes .../lmve/modules/PlayerStatistics.class | Bin 0 -> 11294 bytes .../lmve/modules/PreventMobGriefing.class | Bin 0 -> 6850 bytes .../codenoodles/lmve/modules/SQLHandler.class | Bin 0 -> 4403 bytes .../lmve/modules/SleepVoteSystem.class | Bin 0 -> 3587 bytes .../lmve/modules/StatCounter.class | Bin 0 -> 16336 bytes .../lmve/modules/UUIDReference.class | Bin 0 -> 4800 bytes .../codenoodles/lmve/other/ConsoleColor.class | Bin 0 -> 731 bytes .../codenoodles/lmve/other/GlobalMute.class | Bin 0 -> 1553 bytes .../lmve/other/RemoveVanillaRecipes.class | Bin 0 -> 1967 bytes .../lmve/other/WelcomeBossBar$1.class | Bin 0 -> 1954 bytes .../lmve/other/WelcomeBossBar.class | Bin 0 -> 2558 bytes .../lmve/sounds/ChatNotification.class | Bin 0 -> 2772 bytes config.yml | 98 ++++ plugin.yml | 9 + src/ml/codenoodles/lmve/Main.java | 253 +++++++++ .../lmve/modules/CustomRecipes.java | 247 +++++++++ .../codenoodles/lmve/modules/EnragedMobs.java | 139 +++++ src/ml/codenoodles/lmve/modules/Hardcore.java | 65 +++ .../codenoodles/lmve/modules/Leaderboard.java | 133 +++++ src/ml/codenoodles/lmve/modules/Messages.java | 31 ++ .../lmve/modules/NetherPortal.java | 49 ++ .../codenoodles/lmve/modules/PlayerHeads.java | 57 ++ .../codenoodles/lmve/modules/PlayerList.java | 46 ++ .../lmve/modules/PlayerStatistics.java | 247 +++++++++ .../lmve/modules/PreventMobGriefing.java | 46 ++ .../codenoodles/lmve/modules/SQLHandler.java | 127 +++++ .../lmve/modules/SleepVoteSystem.java | 63 +++ .../codenoodles/lmve/modules/StatCounter.java | 495 ++++++++++++++++++ .../lmve/modules/UUIDReference.java | 138 +++++ .../codenoodles/lmve/other/ConsoleColor.java | 15 + src/ml/codenoodles/lmve/other/GlobalMute.java | 24 + .../lmve/other/RemoveVanillaRecipes.java | 34 ++ .../lmve/other/WelcomeBossBar.java | 53 ++ .../lmve/sounds/ChatNotification.java | 40 ++ 46 files changed, 2465 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 README.md create mode 100644 bin/ml/codenoodles/lmve/Main.class create mode 100644 bin/ml/codenoodles/lmve/modules/CustomRecipes.class create mode 100644 bin/ml/codenoodles/lmve/modules/EnragedMobs.class create mode 100644 bin/ml/codenoodles/lmve/modules/Hardcore.class create mode 100644 bin/ml/codenoodles/lmve/modules/Leaderboard.class create mode 100644 bin/ml/codenoodles/lmve/modules/Messages.class create mode 100644 bin/ml/codenoodles/lmve/modules/NetherPortal.class create mode 100644 bin/ml/codenoodles/lmve/modules/PlayerHeads.class create mode 100644 bin/ml/codenoodles/lmve/modules/PlayerList.class create mode 100644 bin/ml/codenoodles/lmve/modules/PlayerStatistics.class create mode 100644 bin/ml/codenoodles/lmve/modules/PreventMobGriefing.class create mode 100644 bin/ml/codenoodles/lmve/modules/SQLHandler.class create mode 100644 bin/ml/codenoodles/lmve/modules/SleepVoteSystem.class create mode 100644 bin/ml/codenoodles/lmve/modules/StatCounter.class create mode 100644 bin/ml/codenoodles/lmve/modules/UUIDReference.class create mode 100644 bin/ml/codenoodles/lmve/other/ConsoleColor.class create mode 100644 bin/ml/codenoodles/lmve/other/GlobalMute.class create mode 100644 bin/ml/codenoodles/lmve/other/RemoveVanillaRecipes.class create mode 100644 bin/ml/codenoodles/lmve/other/WelcomeBossBar$1.class create mode 100644 bin/ml/codenoodles/lmve/other/WelcomeBossBar.class create mode 100644 bin/ml/codenoodles/lmve/sounds/ChatNotification.class create mode 100644 config.yml create mode 100644 plugin.yml create mode 100644 src/ml/codenoodles/lmve/Main.java create mode 100644 src/ml/codenoodles/lmve/modules/CustomRecipes.java create mode 100644 src/ml/codenoodles/lmve/modules/EnragedMobs.java create mode 100644 src/ml/codenoodles/lmve/modules/Hardcore.java create mode 100644 src/ml/codenoodles/lmve/modules/Leaderboard.java create mode 100644 src/ml/codenoodles/lmve/modules/Messages.java create mode 100644 src/ml/codenoodles/lmve/modules/NetherPortal.java create mode 100644 src/ml/codenoodles/lmve/modules/PlayerHeads.java create mode 100644 src/ml/codenoodles/lmve/modules/PlayerList.java create mode 100644 src/ml/codenoodles/lmve/modules/PlayerStatistics.java create mode 100644 src/ml/codenoodles/lmve/modules/PreventMobGriefing.java create mode 100644 src/ml/codenoodles/lmve/modules/SQLHandler.java create mode 100644 src/ml/codenoodles/lmve/modules/SleepVoteSystem.java create mode 100644 src/ml/codenoodles/lmve/modules/StatCounter.java create mode 100644 src/ml/codenoodles/lmve/modules/UUIDReference.java create mode 100644 src/ml/codenoodles/lmve/other/ConsoleColor.java create mode 100644 src/ml/codenoodles/lmve/other/GlobalMute.java create mode 100644 src/ml/codenoodles/lmve/other/RemoveVanillaRecipes.java create mode 100644 src/ml/codenoodles/lmve/other/WelcomeBossBar.java create mode 100644 src/ml/codenoodles/lmve/sounds/ChatNotification.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..b2984e4 --- /dev/null +++ b/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..9e710a1 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + little-minecraft-vanilla-extension + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9623c75 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# **L**ittle **M**inecraft **V**anilla **E**xtension + +A litte fun project of mine to add some features and +crafting recipes to Minecraft. + +Used API: *Spigot-1.15.2* + +Minecraft Version: *1.15.2* + +Plugin Version: *Beta-1.1.0* + +#### Features: +- Custom Crafting Recipes! +- Player Statistics that all players can view via the chat +- Join and Quit Messages +- A Hardcore Mode with double damage (more Hardcore features coming soon!) +- A Sleep Vote System, players can vote to change the time to day via going to Bed +- Enraged Mobs, these Mobs are stronger and more resistant to damage(right now only Zombies and Zombie Pigmans but more Mobs are coming soon!) +- Mob Griefing Prevention, to prevent creepers, withers and wither skulls destroying blocks +- PlayerHeads, there is a small chance that a player head drops if the player dies +- A Chat Notification sound! +- A prevention that Nether portals are build above the Nether ceiling +- A Global mute, to mute the whole chat if needed +- And a BossBar that greets the player on join diff --git a/bin/ml/codenoodles/lmve/Main.class b/bin/ml/codenoodles/lmve/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..5c533d6dbedb1a0530c84521ebffeb2347585c76 GIT binary patch literal 9912 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 literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/CustomRecipes.class b/bin/ml/codenoodles/lmve/modules/CustomRecipes.class new file mode 100644 index 0000000000000000000000000000000000000000..1121c751cd58dedb68eff6fefec7feff7d86ba1e GIT binary patch literal 90244 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 literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/EnragedMobs.class b/bin/ml/codenoodles/lmve/modules/EnragedMobs.class new file mode 100644 index 0000000000000000000000000000000000000000..15ccb95dfe6f5c1352dc057952d9b8d4a299c5ce GIT binary patch literal 12557 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 Pc&S~10>7cd2;TfJ=NyNl literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/Leaderboard.class b/bin/ml/codenoodles/lmve/modules/Leaderboard.class new file mode 100644 index 0000000000000000000000000000000000000000..604032ac9d32ec65371533027e2aeca33b2f1a2f GIT binary patch literal 5426 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 b-p3@H8lyvkIL2^3O6v=cl5-(A%O&MM6hxyG literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/Messages.class b/bin/ml/codenoodles/lmve/modules/Messages.class new file mode 100644 index 0000000000000000000000000000000000000000..bcb978a3b830607db464f0e8281182977c7f3b3c GIT binary patch literal 1971 zcma)-{Z<=A7{;GTQZ`vO(56sIOWUBeB&4t^^)ppI1GNU)CN)ZHtCM611DjpWX2LnW z058JJut(FQp5q00Q6AsPmrEehKXx`V`_41J_nl`ZfB*BxUjXi5-$01rcHOZnURAiB zS9L_gcIwB%u6xy{?re)jgV#jEK!oAq0YB!p!`+(wsC*zQ%D@Q2wCC6Ca`W&|Dq9>2 zSJ`>lP{I{HL!{27%Wy4!)*9RNEz2-+U%FC#$#5ezJS<%zv2~&}5k}lX3}X!8RJs%c zaak}BWf;#(SL`(FW#K>NWk)b1@?M2ICGJbz?+!-PzHBhuIdiqa#0hZpp(ovLAsFta z@~09$a`-FZ+mG8X9i7v4$ZF{6Leo{UE=sZ?31QWBJ;jyuTq3x2TB$wp0e5L9{H%#< zm@#mj;p(vZS-63l4Dp&!>z=zOYnxK%y_8A^wJYsUO~1Xcy+l3Z@>3~Epsi6`&mCr3?HE?9Bu)1sF3oIL; zGcXs(t#g>p_LhYetTM!?vK`kk%$(eFGN4qix}MCAVjVdH8)T*63c(l)o7iF)BgqZf z(97=dI(cb=bO$$vs_+$=C3!$z7uBTN7s;aVkA*+0tMavlyq1b8uTu-1-;RYxcue{Y zp#mlwVhB1pjMhHk;{U4$9n*MG@yg*gKk6Ry(I-u*-u~F?=-#o7;#;C zc&2wQT*z%i@x3;~0-52Z-oYQv-NF7cQE-M!Nk{Cdll6OviiK*gQ~`+d%h4C7a+pQ0 z=~qPOK8W}3@kPCpn59cIOwR>+Li+BczXRQm!K8MSdYd#JqPIE!2G)G$H;n&6y$~)@ zJ4Ug(jbNN+TttF;S31$Sj0x(|ytb-VpKO1dqOlRuzDjSc{}X9w{gwG&G2X&-;#Lc@ zKVvELC+2qFApIKiExez&*TToI@frQhv~d4-tTE6?;sG@+JZxcGQ-uRm6T~!$WlROA zR{B&cc!B~^6x*}dG9f(0H`JbsR~p3oPUAff;=SnO{n*1R58_=Xycxo~ITTL>@fh}q HG=$o}(4zt3 literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/NetherPortal.class b/bin/ml/codenoodles/lmve/modules/NetherPortal.class new file mode 100644 index 0000000000000000000000000000000000000000..f93cd3dfb726ba8b60bba6534fabde510e7f083e GIT binary patch literal 2746 zcma)7>r)d~96dLLtb|n*1;IysfSLd?TCHt~r9ucA8v+H2LLYPqD=aL#bhBW!FWXxC zez#iNjx%=p_|h*jEgkxy0 zs~{v$Z#(1h(b=gf!;R~6y5+_*M&8ve-4O^*YlbDTBeRyDZmuN+LMIK&aN7iSN7grs z4iYR$reTy}qlyY_5-5vA2P;5cDimxGsLB|Yo}HZ@)tv!t)YJv4Gj>ih2Q|l#kISUa(9$I_*+YmV`V*ec!C* z8q@lqkvGVw-Lh;~a}C=fp*{CQc^l7Y7K7s?!q|ab3U&(AttY37-FQHtVqABVwspZ6 z7dRG)`f+pK^sM7KjbAWKJ>JDf!Fp*ru>pGpj{4(&c&2dv*o>DB`It6p&*?EspKx_2 zmeUQ>u*SpKk46Oz0&$-x|Hq?>12`xUChrd0Hg%0jQxnOoh#i1UvVcCbPDYB@g9|a;-0sD zX02X{B)U|b#uoeYnMC72U}Cjx^+zcv`yYRq-UK zj0~bjfK8>;hmRa(AHbl3r%K&)lQJ8Dsp1^Y6S_T3z#6~QMGML{jAs-)El}&@>2smt zSv)78@h#XzmGkLB%*G*bk|NJVzwjDRrGxF;$!%k`vP^tm4G5%Axw##oGz~mfh{GsgX}F7J8kjSPnudjud^Lh`Z^)@ z@t!W@znuSoysnu*0e)8?%x5J>T^tAa4mbSY#OtKkPjnxO|@nZF>>LOk% zM>F@lDRl@!>d@sqccDt&^ZYen50iZ_FSvcYqV}^?8`zE;+29Va?Ht4;4&f@-K0_03 z(duWk;0}&>`t=pmSk`YIZ{r>6)qs!iF5aVp5x(EY2h_e9*YF|dgRIXne2h;R$2PM0 zl*l1^YQ*RGg8F|+j_NYTbz^!d%H`hNjNg4t65 literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/PlayerHeads.class b/bin/ml/codenoodles/lmve/modules/PlayerHeads.class new file mode 100644 index 0000000000000000000000000000000000000000..5765b56bae7b915ce9c56993e6273ce1c4b497b9 GIT binary patch literal 2955 zcmb7GSyL2O6#nke&@eP&MASh9T$ur3VqB6iK!Soo!eT%{$YPqA23mT$Nl%YTHnW&L zntjpaDKB}+i>YKNLRHG={H9cr@AeGP187wqX1VvCbME=R^PSWE*FS&!3E%{NR1p$r zPFwM$lQL|_Nm)iFZl$jp@wAi5%Eft0Uo_l)Lr-N?C<5EB=vVc)rQ5Udk?AW&(o<0; z5OLhu_;hxD-t^+eRm1k;gJ#AvY{L~$(zr_5Hm>KxDA9q~ z0K?|f6A)aejFu-&OtFYAW5~kz*9D@IWkIP_jd^-c$>R#7b5NL}A>B|d_ zqBFh4f?j(K-J9!^LQF{2L`JhbO&jB8#-s*%Y}@gCvMGVa&7pk9e&%QyE_r`apk_UT zOuJ!AA*Ceo2@Rd-5(tyS(~e^qI@8~hM=C|&DGjyQ6-E!vs5mVU4OHx*C^Yn3}Q&2^88@W zWZ&rJ{=S}GA`5c0YMBV*EJkEIo+r~qm02?xh>c6DQ4M3bz^GDk%wx##bb%wqNY+zL z^VrW<+7S~gc`%Ub2E(!WtYt|{6_;8`4OIo zO;zF|G8#N&nQF%HSZJnNQ%JyXQOO{?Nm^dha2<;rwzM3%W^+*FvHJ7-K}7Htse#ut zypA`h0s5|Mpt(pl8!EeM=I40>Z>xB#nD8R;Yj_9mk^&Mw;kXtdOU46P`MZfq+`xMp z-p2=dJ<6wqoWB%DvH9u&JwC!GDn8~o+!#&6r?|yCQyfn+TY-@xKx;9Ad90(9E`CoY ziV`irlBaSqvLG!%|A$Tt>A*=@7j!7nB@L803SFQnXtPyP96XuT<`Ou(wYlG{Ydt8V zTfT;B15Ide<+ zDdi_5-w*iKBi9v>)3}nWv)m8yH{7xWt)=yMRNvz&gh%+jjkZ7y6zrr&Ep~9VD{sx+ zom|n+k1C^cuoq(9=c<%v$69_vbq>3C?8~9Cv!rVUhbNcNJlwWDl|%HDa#Int%HE$) zu5|s3(vq(FU+7fgU){pM;HyOyBB(|kcJm#g5%oBLeTbrgkK9JI@%aT-Cgx}aIH0mr-xT?cJf#BD@z#eP$EhW&)vtxj?xuO z5dUOHS)^pqa3v*iMpa(Mkf3lCU=ZYbT~Sx=F(%iI^q{^Q0g{ zthb0%(%7Fzw^rTTxQ)+TN&X?e8rnj;u5~bH!MLnM({1ZBWK?; bnnut3&K>SZviZ8b{cpU^*2G;dL-^r8w#NyJ literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/PlayerList.class b/bin/ml/codenoodles/lmve/modules/PlayerList.class new file mode 100644 index 0000000000000000000000000000000000000000..786651760b774607fd1cfda0219a19d491824a83 GIT binary patch literal 2077 zcmah}Yf~Fl7=BJz*pM!zO=)SM)zl&-v?Xf2CWullmYRf1XlifjCOOiD&2HG;Ak=aE z9Zsj8{n9VqsOXG8z#nCOPL@Cr(An9ud*1u|yqCZJ{{2q?Z{r&s5rN^Fovyf5>9}sy zmVVl-=gX_ILTZ;l!u3|t<;L2Y6{O{c zbb_=}kdE{Ow3=x-0t30DyyVHt3UrNIjulJ@TpT%GELEbhDaIK?2YL*2F!IkM2Gm8G|AmTf5z&$$)TE}5RC?z==Scx?FsM|(S*Iz#MUk-=omZ8$;G z>70)90{#1F6a&w4R&F*dyDGgX1_X@NYPpi}*KI41nHc(ULB)Jg;Ot25-+I|pDTY^Z zNk>xP{BcMbcny~YdKk*I8JM%K^2OXoQlUZ1P0w1k%*OCKuILz6F{pCw(hZCtMTk@; zW#6?Mfm|?y#{zvV1I@aInb1f-t{S+8>#UDiuS=&YaQ&#z4`s89LNBZJG;l+IF}#cSb-X8Vt{F3NOHX^&hV=5LW3EWgzz4{L$xpeC!`8E0 z_EqZmh?I$a(QG%yF`?tb15I4qVxQIwe1wl#SGU3Hp4|g;fh7$Xo-}LBkjs~5 z9>p+?SsgQ!-HWxjn48(G$hwNkz$YrV7=g}9-)HnO%;8fVw*}6$D$-`$Ku-0AURVBX zCyIi=jp9shW@E5!%nPrDfnA?z6w-rmV1!78}yr;ynF# zF_xs?u!EuuX!{{P*YT*`_8!;37x*zQMBrmyzgm4T`OiLY1{;ykAkIdZV( zl;~pvmRc8`72EZ>6vQ0uSJ*~-7yUFXM^vovbKV&v>YpcJKSPv1= z{Gi6j`q~6r5K=1QaS65Y_8=gyhn1+T<;{9?W$B>1w&fcR4STHUHoS^dW6#p=FY7T? zGF;+j?BLtUH=-6Kw|<2G-H7o#!P_kF5q@K%FJO#b{T01GHf2upJV{;P6f~TsMw}0D zE|kU@^zlZ$rd0xpv*a~xil3>WllSZo^xumoUSM$a7xZr9m2C`dV>CXdjyHI0D+2#(aPT=38A6KtZ5p@n1mE)8!9;-x^z!T{H$naY#xRImxIn2S3WT)8 zEo|a48)^tXH|-M)<2ziz_gt?}akU9ky$SBKU6_2rRK_adc}lP0Uy9z=VDo;Pa~b{( zVGA`lgT^h;a} WDLNJu4PG0O0wIwaTeJ|tlYanYp8LlD literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/PlayerStatistics.class b/bin/ml/codenoodles/lmve/modules/PlayerStatistics.class new file mode 100644 index 0000000000000000000000000000000000000000..a8126a7ffecfd282b0d91d22c51b3aff7b68e2ba GIT binary patch literal 11294 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 TPq*v&f4m)${xU)9l2`r-Q>?Fn literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/PreventMobGriefing.class b/bin/ml/codenoodles/lmve/modules/PreventMobGriefing.class new file mode 100644 index 0000000000000000000000000000000000000000..bcd21c94fb4e4fd2788bbf431130d2a2edb0506c GIT binary patch literal 6850 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 literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/SleepVoteSystem.class b/bin/ml/codenoodles/lmve/modules/SleepVoteSystem.class new file mode 100644 index 0000000000000000000000000000000000000000..41766d9b14bc07b9749da76e090742de0698c1e2 GIT binary patch literal 3587 zcma)9TX!2*75rJI6%QG{UpO&-I@zWy~w>Z)h(2KS?FTK*R zb6n;H#IS%?of6pg=t$#M$G80X^drHB0fAV-v>btZM^-~QN*ULzIbu1Me^g*c=be{z zWvOhCekKsb1|4nKC=l)J%Ct9{fzWx zm7B@Vu0~hF>4CNQ2n-E71vWJJ847jm!hHg5R5EHl5jtH8U=3^7P3sLi7}Dj)D5wwU zXhlNco)OEDW97o6^v2CeTMBF(adW1fH9bp>tCKN*+M@2BRYP=#d^5Q5A;*_qkhi|h zM)$%bhiR
  • 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 Qu|j!a${9w)Gb6+FKj6rtng9R* literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/modules/UUIDReference.class b/bin/ml/codenoodles/lmve/modules/UUIDReference.class new file mode 100644 index 0000000000000000000000000000000000000000..229e45b2e62b55d81e79777489199ff7a2ac24b9 GIT binary patch literal 4800 zcma)9YjjlA75>g-CU<6X18F3{K#)OsBqT7XJTyTtk3oh`CLxmq1ZkbjT*8H!JHyPK zK&ql5ty;8CwWYSD4_nl#fW_eWpslTKwbF-eDeda2%dW1~AN|o^U0utyH2uz&fed*&z`qFeE9-^wYaRnCeWCO`=ZI1W+aobxR&w76T_M>k&I>KOMic$ zvsc@zr8Og}DXXuSHD-l>(k*ddN4JJ#aubecG^Qn7*K%F*QR= z3)mA8-4Iw1oNA#ierpw|+^8G6xk+GA!}Mm219a9wsBToCT7?U<1S%RD2V5X76$+dJ zvxB;!g|dl3E!`IxjB5h5!DKWNABd!N`Cb^boBQ;PK+}|~O}Trbtm;T>5mWOUW_m=R zxgj`d*Qt19L`(a6tlPGvZun&|S|xH%Z`LsNgf^gObmC|;jHDSc^`t=jh?67)xJN+$fzo&14>kf);^!7?0(Ra>3#3kaVRw+guP z+0Cqu4NA`&+}MVof{zQ#wLlY>uQRO=Yw50t5gF3bD!LHLXR#w`7!)um$SN>B0_kGh zwAF>BXzabqWTDY%Wc zC9L7?LI2^XmXfGc?3TH3GnrjlCPVaY?7=4$d_v$VYX&J-=3K=cGVV%Bt`|3)7!+6= z_6PkPecpzS?*33;!^%eQChwX?@0Q-~F0VNlFGSC~W2?W{@0Hcgd$V_Q6=K+{fVCsP z%)|(&7y@ZqlS*r;NLmY1#ae zREBm^r1#@q75B+?lmcQI{rgoM!>3s-qE^K%MeK@=l*Y-c2UyJu$u8x(E$mGv4@Hx# zyjP~Y3J>A9g3p%kyyQ;C@L_?5ne$l+6j%QoYesP?8Kp0%_#(bUs*}6{$&D$iK|q>5 zs^T$uk~yOBWJYu1D?ASZp|HQV&l?E!b(cqSpe@+%4|^M=)KADF@-W}yP~j8W z*wwPqVF`Q23jRCzZ}o)aHI2g4welQhk7DsCmW7&g zXcB0#^S(x46l+@?73-B(aMNwIt>sVCsFuUAfCIbnR%8gzb2v(L1YG-> z93CY0BG4V4s@g|#_&jmCB=#>0NPzAML2yq9LdlyIrN85YaTu#`6svKZ>begOj)pPqJw~g&Xh;e-l234S0b)@Y_`BMQkLJ&A5bH@E+Rm zFM9nCI`9EHg^fLEJ+_EN2na9R%|-;pS~iv&(JgL8j|j0r45L>h5Ece@h(knwFI&Bb zu}eIG-QpR(pT_MXhdtr~8@kJE*4{-_`~xxZAsZ|TO4M*~lt)oed^&}vC?JP;A5Rml z4K?E5_yL|}Jm!mk68p21)V1QTc%DxV?!N-38P7`S;_<@Ma`9)J@(`3p|3w#X3j@5o&&><`3~%JCt!*(=Cu{JGtEt%_9we7`lDVhJpQ46CWH%6}l|j2C6`A5MxP!FL z@^{uScCiPKl8teU$ljZ++MV=s7aqagRKpQ^J4%1|lPSk|P(NTDM91W@LiH98qKo)F z86`N^O=bLnx_O$_A^+4=&`1SWywB2zMEn%~$QgE`skb=jAeI{~UOI?qwZ-#FVyd^8 ztPoAn?i>$8sU?TS)orL8qq)Q41$j5l&qbv{lFs7f5t3qzRjgpFU|sRcR(_dJ{Fk^Z H8~*e^Y8u2- literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/other/ConsoleColor.class b/bin/ml/codenoodles/lmve/other/ConsoleColor.class new file mode 100644 index 0000000000000000000000000000000000000000..af096ede6669c8c57f064e2871ad5acebbd477c0 GIT binary patch literal 731 zcma)(T~8B16o%hv*>yG&ro>`t=X^1qB1 zCSLdh{87etx+d(UyUEOXpE>8uIcI+V`S}aL20CRF1YShS3G|tawLVjF?5OBUIy$|O ziPP2bSS#7pN+)H^2+UvlSH7eC_}n=dUCJO8uzGIa9SGFD>$85Egz@=D9&USE-93St z$&~tWI`q{<+NkiTdAi<-1d2WPvyEB?-Vj(jJ=fj0F`uEgM5Png^A3(}+{)NG+03?g z$!BkxJ9$X7=AVlz23Tz{c|+}-Z&`{Q|^_j&jAn-{MDe1S&}G7Q&;f#1`8p|tJ? zBJzXbuJEr<7U?{e9j|UwdO1nS!nKfH7Vpupa+tI=a;7me8bBh~G1;fp9 z>sZY@0pBCWR-!%Cdl;{+{XNS^!-AiCG*U(mMMp-GpsXmR4L4FNLUQGJxY+SNSJaWP z;o=hJ9el)a@iZPiT*k)?`GGJ^t)9rinzZ%T%awHOUVJnP^%<(^x|11dRE|+` z0EIe1>MPlhB^j0aGO{A>m$WKb1(zZb?uxKx6MbhB(Fh%i|1Ynn#<9@cT6VLGBx+aikifE0LQr#rUOKY92WEe0I!n@n7X3N7>x;iH4IYUpz z-XL@-W@w#*OYdpgt1*TvPBCo!`r@A`j4@ZdGRDL?w(^#)R6{e?Qf+6L& zO{3n~-j<#rc7^R3CE50bEnJ3Ji%Xl~WNB2kGM(iZCT>Yvddm!_)8oxDH40WBya_}x zts{;@4AFF^76;+dp<$9CS(3K6-)Yr_yTR+0V3;X6Cbw$bl}hd@W8M?lX1Fpk+xQj` z)LGYWO_|b|E^m0f<}lnym)_`tv{f@4_nGm)6+7G&MNhN}%57C0V-vplH$(c4cezayb8`ut#3>DP3@65QSI23bVVG_Tui)4X*<6#VE7#JQ zaBR~*>bQPlqd_KyvI{(V>f9vGGMpVnjinZEw)o|`<(S(EoW}7z`Ifx&OyQ$49uzps9>Beujl~aj5wRzUsW{adVp{o5pn=H}Ek- zoIC@X5hKO{4Gaj~O?;-|Q--;b=mIkxIo#?8Zg(t?;rzJ3VNA>TQo|PvXGX>zSn9}Q zC8&7g*$%Po_;Bzt_XJ%>D;LLYtZ7(fI1-B3Kh|*vcNwP2`8(zO4!7v`3~?veRz2?A*RhTV0m7OTztAj)5r#(6CyBD7JQX$kD)lP_ zc#O5G?rR;jP!Wa7YQC)W-|Bdz^wE5=lE5;)Q~T_Dy2nFXWKdtGrfB!0j>q_k=GIn( z2MX*FtBX@ziuQ*3LIZDra z^hDHZrvIG?{f;9+?K#LpJPu=qq}jk4M{txR z^7EroX*lMe9VgucNhj#5;_s2Sir>usfn*n{nfWfxJ;&x^7nh>@xE#T2lu5X@k53r7 z`1}P5T@;_=CMnC4T|D%48^7YHQp5&|-!Q9U{DtL5FYwJCHuv#E1PXi<3j8b;4T6zG l3a4m6S22eM=0im^2Sqf&Q76zQc}yVk52`aHZIKj#_z%SECOZHC literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/other/WelcomeBossBar$1.class b/bin/ml/codenoodles/lmve/other/WelcomeBossBar$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9fe22bc43b19bf9dc09ab8127b7570edbe75fed7 GIT binary patch literal 1954 zcma)6TT|Os5dID}wlRm`8WIAzaEViFb5TgsTbwqnjY$ZG5TK@{x5)CTEs!OTBzuOZ z_N@on z8-}7;Rbg6I)ew$iG}=P3+`6!pU14ZeL*y;T$*Xp1DT*+|4a=@6mDa(5?kbK}7uA+Q zs(J5Vt7V#M#SjeruHFz116yT?xOLr0-6E*cd9iW~!)?__?OVE8A^3`FGfb2M&>JfG zZ>pN8u8BiZ@0aQXoCzw4wlH0#X{d)3;-)7ak;kGuCY#7T-PGL=8Jg+yM;7$o8$|Ht zOyo?NAzUEN2f*+KM-(ynHo`H0xO}_FF$f+<2xA;WxXchrXUg(sf}*LU4HwAVM#s1{JGOhEfFsvyJf~PjT=$SP=Eo}yJhA`;U+`8CS1Qa z81ANn>Gu-TQxjQEg=!|MzHM$0v&ck|X1E%FdQFcbi#ditLfy2jnk^j4jCfg&-2d~* z-``S8OGgUFEi93m6I2VQmow!k-eMTrSKF#$sAf&sc5U6PZyDb!WBU>TOp@jmWSt3B8%7B?6!1v5TX%1KZ6I6eS1Rzz(!g;`}-NSFQxeq7lX znw!f6j(TFr#qbfsz(chyrdC?!wDg#l9t*EH>RO%QNLm&-R`7r!=2~5S$}asnwpWH# zjz?G{U1D!XcjY8s3`YJEupGxa9!Ehe%m$b`tLr&7@r1IHV5B)jy z!rA87!6yvd77eQ{UfNyj={1_=fLVq@o5n83r`Tf{>KdMQX|LrgUHUXm1NIrm=W^g8 znrdpoAQ#)NsvWGWO@E}~+g8ig#ELG-8R=b-i?YTvoJCVJEQgwFUAT3t8byU6ecs*2 zQ3bgk>SpT$&Nvu|6lE5o2?^6f`vXWM9doOV3XT04(E_uI$k2_dC!NWe!JP|v>jIT*zw1d(Kw!AxnE$?PKc$(d# zSi;ZztU{CrXnZ6o*NLi0T6)u%#|$lj6!N$U4QUw2;2T;@-(e2lV*x*4F_8IlKl3lh hM+D*2Xl9mJ`jWo-@D-ks3_~S9U(=gxKFJ9E{sWRL04D$d literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/other/WelcomeBossBar.class b/bin/ml/codenoodles/lmve/other/WelcomeBossBar.class new file mode 100644 index 0000000000000000000000000000000000000000..d915526343f34e7c66a5645b19b858f614c01aae GIT binary patch literal 2558 zcma)83s)OO6#gbamxQHQN@;=CQpGj|=oafcwY7vmq2VFVVpZHELs;0%ru#rqwCd0B zU&zs*a`XrEM|r%n8_F(SIPN*w*_pZb&i%f7=ia>d_pg5dyn~+=BpA|FQ!80zE-b5T zaz`_(J6yBeO>S$e+$>pDK4v-2m~Ja*W_WE&-_bQw7Zq);xW!AZf^!T#mR-?`-uAZP zYJ7(aS1TBf%LTU?nyb1Y75acNJV^xO^O#Mb|b&Wy~|oGPhgtI)l1Jt`sSZMcrOc zp%49%z8ege(uI?H&N> z+K2WeviMlRJ+dDnH@B&~Im@(c75DLgp=EL*pPyyu4s-ZYDBFsML`@?V`z_HgS;$Ei z#!r9`z?=bI`ZJ+oQl8p8Iae4@VG55GOjB%5yRs?@n4ud%vB_Ct!>CLc@~Yj9hP>o& zdA6VB+6IYeQZCSFEEAGBLgH|Hhub59(mI7tv8Z5y=ne7ne{88(!g7#=Mu-cTKM1E9i7D z7xR-d`PrrX`1QKYV}3nWu?d4hRkFG69+h&2 zUm~d+DJLBHdx0EinCzf<)dx_czb=C(FxY6=6Jsn}$DQ)tyN3BE)vO-#+md5DPM&!<_ z@g(0C>LVx8HHwrWwP<;Ei3f$@V)UQHZCSzz&Xk~k2su-C9PZ!-b@3+pwa_min>nFR z(039kdbiPRg60VtQ<(#(nW5j&@vAR$f!^my7wAMYE|NwUeF5EpG_7>ejP!h~gc_Ip zz00(Aj%HVAl=ffHOj_AHM9*60H*_4LZ>{s%0j>|#@y4G>Gt_arj<*l+-psJvJiv$h z_=pxeKdEDEA9?zeigi5doULP?7D;>`EBpAo>2DPOKshkAmB1ltYnkDp1K3g{*#)nT zuUC%|brTaH-v+4RaP-20hVL-yBkK?Re2Hw2cJ>I#0G{A`{NVHSoU{}85kJu=8LZJr F&wuIL-53A> literal 0 HcmV?d00001 diff --git a/bin/ml/codenoodles/lmve/sounds/ChatNotification.class b/bin/ml/codenoodles/lmve/sounds/ChatNotification.class new file mode 100644 index 0000000000000000000000000000000000000000..45052f907ff734bb03e362073a913520dc6c48ab GIT binary patch literal 2772 zcma)8X;%|h7=A7UM#3PK3L1Co77#L8?V{0EK&i0-tSl9~&`B7=$YcgH6ExjdyYGvq z_Vi;@m7z|WDBr|j0_dfT1pLe@||NHx&01o1cf*OInc}vSW z6Nc?L6PDp>R({sdT&HMHxLWU&?hQDeIca8f&va}B5rO;8>$AFM>2^*V%$zr}o`QOT zm{Z7Und0=c>1oESVS8HIbUnj13IdV5ZrTDH(#svyPgzo+{)lOt-eUrr<14GRj}okx z#zs+#CKU}>El?Y8A8i2bQlVg#Ky%u(je%l5V-$wsR7Z#b#^~Xv!I0uVYV|xjs{Ja3J0u#?Jbp zV!=OHo1}^+^@1Jc<>V@CBdyZ{PHrKnwYPFMuj`VYfh(ru8_E zW#~+b)_8g`pN71GY3Gvd=c0(CLqWU1n$Q_NetN0ci%!}_ltJ5KtOJtC-g^4zgB3l~ z(s~`sVsL2nT9ih#yKl;Xib0$voaY4kcd}MSX~ZF%Q89#JmLH=&Vw)F= zMvAt#R6O(pJ~EOzP6K6+NR;wc6iJ+wJz`8?PuR&aY?W=S&M2P2a|)ilYi^I}d230r zsCXXZOjpa%Czc2Vy32=G!f>}jtiq;Ky1>T7kl}f(4>vL7x97w{D=JBfvMMIPN^c-V zK|%>^B0(#q8?*Tkaw?`|3>0n}(DN+r^T;Zg7U&G`^Beli%8gAzY}YFk^DGM$9*P2WJ>3JR1_={(V^NDR7g17hiK!EU;mk62 z4m-A?;zhh9AXpu3VT1(*CgLl2O~I?28+QPxcpYz$8C&<*5G{d@cxri!B^*m=pW3%n zyp4C5-jX-DDsXJcxLDvKj2iMSyzHa4kIDx0u8Q~YJ`J1F-2uPXZ~~sAlRO|1-V==B z|A`vMnG%TEJU1-a8tzMS>IG^;98^?Y9h6QbpBKdAF6A7GVWfMR3p}8S(AnvJeWpB} zqfGHa)(B=->q4TJ?;#1<64@(LHt!d`mhQR+&5Fo~V>_<`wfxobS0ir(yzA8Py#Z1F zH}b2G-!*(jJFY|R*!vrrfA)3O@P9S;0w1BJeza~@9#$n}w6{W_jL9EnA4;N0Q5SY4IY3xO7o{TBPUIU_KS zN#6D5VEQjVAlAusCiOMUM6O}>240@Wn-S2i%K}$#XCx)Hkd*8u5x_D2Q(lvC{F16Q_zGY1DdTyO<@?RC*ncG%2{-@% literal 0 HcmV?d00001 diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..5c14df2 --- /dev/null +++ b/config.yml @@ -0,0 +1,98 @@ +###################################### +# Little Minecraft Vanilla Extension # +###################################### + +########## +# VALUES # +########## +#Name of the Server +server-name: "Minecraft Server" + + +############ +# GAMEPLAY # +############ +#Hardcore +#Hardcore Mode in this plugins comes with double damage for players from everything +Hardcore: + enabled: false + +#SleepVoteSystem +#min-perc = minimum of all players that have to be in bed +Sleep: + min-perc: 20 + +#NetherPortal Stuff +NetherPortal: + prevent-portals-above-nehter-ceiling: true + +#Enraged Mobs +#Have Buffs but transform on Hit, with specific chance +#chance range 1-100 +EnragedMobs: + enabled: true + chance: 2 + +#Prevent Mob Griefing +#prevents that certain mobs cant destroy blocks by explosion etc. +PreventMobGriefing: + creeper: true + wither: true + +#Drop Player Heads +#If a player died, there is a specific chance to get that players head +#Chance range 1-100 +PlayerHeads: + enabled: true + chance: 5 + +############ +# MESSAGES # +############ +#All Options for the Join and Quit messages +JoinMessage: + enabled: true +QuitMessage: + enabled: true + + +########### +# RECIPES # +########### +#Removes Minecraft Vanilla Recipes +RemoveVanillaRecipes: + magma-block: true + +#Enable/Disable the Recipes that are Added by the Plugin +#ice01 = with snowballs | ice02 = with snowblocks +LMVE-Recipes: + Crafting: + magma-block: true + mycelium: true + cobweb: true + ice01: true + ice02: true + strings: true + elytra: true + black-dye: true + Stonecutter: + wood-stairs: true + wood-slabs: true + Campfire: + cooked-cod: true + cooked-salmon: true + + +########## +# SOUNDS # +########## +#Default all enabled +Sounds: + chat: true + + +######## +# CHAT # +######## +Chat: + global-mute: false \ No newline at end of file diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..73bb44c --- /dev/null +++ b/plugin.yml @@ -0,0 +1,9 @@ +name: LittleMinecraftVanillaExtension +main: ml.codenoodles.lmve.Main +api-version: 1.15 +author: netbenix +version: Beta-1.1.0 +commands: + lmve: + usage: / + description: LMVE Main Command \ No newline at end of file diff --git a/src/ml/codenoodles/lmve/Main.java b/src/ml/codenoodles/lmve/Main.java new file mode 100644 index 0000000..16a534d --- /dev/null +++ b/src/ml/codenoodles/lmve/Main.java @@ -0,0 +1,253 @@ +package ml.codenoodles.lmve; + + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.NamespacedKey; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; + +import ml.codenoodles.lmve.modules.CustomRecipes; +import ml.codenoodles.lmve.modules.EnragedMobs; +import ml.codenoodles.lmve.modules.Hardcore; +import ml.codenoodles.lmve.modules.Leaderboard; +import ml.codenoodles.lmve.modules.Messages; +import ml.codenoodles.lmve.modules.NetherPortal; +import ml.codenoodles.lmve.modules.PlayerHeads; +import ml.codenoodles.lmve.modules.PlayerList; +import ml.codenoodles.lmve.modules.PlayerStatistics; +import ml.codenoodles.lmve.modules.PreventMobGriefing; +import ml.codenoodles.lmve.modules.SQLHandler; +import ml.codenoodles.lmve.modules.SleepVoteSystem; +import ml.codenoodles.lmve.modules.StatCounter; +import ml.codenoodles.lmve.modules.UUIDReference; +import ml.codenoodles.lmve.other.ConsoleColor; +import ml.codenoodles.lmve.other.GlobalMute; +import ml.codenoodles.lmve.other.RemoveVanillaRecipes; +import ml.codenoodles.lmve.other.WelcomeBossBar; +import ml.codenoodles.lmve.sounds.ChatNotification; + + + +public class Main +extends JavaPlugin +implements Listener +{ + FileConfiguration cfg = this.getConfig(); + NamespacedKey Nkey = new NamespacedKey(this, this.getDescription().getName()); + SQLHandler sql = new SQLHandler(); + public void onEnable() { + this.saveDefaultConfig(); + registerEvents(); + File PlayerDB = new File(getDataFolder().getAbsoluteFile() + "/" + "Players.db"); + if(!PlayerDB.exists()) { + sql.createDefaultDatabase(getDataFolder().getAbsolutePath()); + } + System.out.println(ConsoleColor.BLUE + "[LMVE]Plugin Enabled!" + ConsoleColor.RESET); + } + + + public void onDisable() { + System.out.println(ConsoleColor.BLUE + "[LMVE]Plugin Disabled!" + ConsoleColor.RESET); + } + + public void registerEvents() { + //Modules + this.getServer().getPluginManager().registerEvents(new CustomRecipes(this), this); + this.getServer().getPluginManager().registerEvents(new PlayerStatistics(this), this); + this.getServer().getPluginManager().registerEvents(new StatCounter(this), this); + this.getServer().getPluginManager().registerEvents(new Messages(this), this); + this.getServer().getPluginManager().registerEvents(new Hardcore(this), this); + this.getServer().getPluginManager().registerEvents(new PlayerList(this), this); + this.getServer().getPluginManager().registerEvents(new SleepVoteSystem(this), this); + this.getServer().getPluginManager().registerEvents(new UUIDReference(this), this); + this.getServer().getPluginManager().registerEvents(new EnragedMobs(this), this); + this.getServer().getPluginManager().registerEvents(new PreventMobGriefing(this), this); + this.getServer().getPluginManager().registerEvents(new PlayerHeads(this), this); + //Sounds + this.getServer().getPluginManager().registerEvents(new ChatNotification(this), this); + //Other Stuff + this.getServer().getPluginManager().registerEvents(new NetherPortal(this), this); + this.getServer().getPluginManager().registerEvents(new GlobalMute(this), this); + this.getServer().getPluginManager().registerEvents(new RemoveVanillaRecipes(this), this); + this.getServer().getPluginManager().registerEvents(new WelcomeBossBar(this), this); + } + + //Getter + public FileConfiguration getConfigFile() { + return cfg; + } + + ////////// RVC = RemoveVanillaRecipes + // VARS // + ////////// + public boolean RVC_magmablock = cfg.getBoolean("RemoveVanillaRecipes.magma-block"); + public boolean snd_chatnotify = cfg.getBoolean("Sounds.chat"); + ////////////// + // Commands // + ////////////// + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { + + if(cmd.getName().equalsIgnoreCase("lmve")) { + if(args.length == 0) { + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE MAIN COMMANDS"); + sender.sendMessage(ChatColor.RED + "/lmve info" + ChatColor.WHITE + " - Shows the plugin information"); + sender.sendMessage(ChatColor.RED + "/lmve stats" + ChatColor.WHITE + " - Shows the Player Stats"); + sender.sendMessage(ChatColor.RED + "/lmve leaderboard" + ChatColor.WHITE + " - Shows the Leaderboard Infos"); + sender.sendMessage(ChatColor.RED + "/lmve settings" + ChatColor.WHITE + " - Shows the Player Settings"); + sender.sendMessage(ChatColor.RED + "/lmve version" + ChatColor.WHITE + " - Shows the plugin version"); + sender.sendMessage(ChatColor.GRAY + "================"); + return true; + } + + if(args[0].equalsIgnoreCase("info")) { + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE INFO"); + sender.sendMessage(ChatColor.YELLOW + "Name: " + + ChatColor.RED + "L" + ChatColor.WHITE + "ittle " + + ChatColor.RED + "M" + ChatColor.WHITE + "inecraft " + + ChatColor.RED + "V" + ChatColor.WHITE + "anilla " + + ChatColor.RED + "E" + ChatColor.WHITE + "xtension" + ); + sender.sendMessage(ChatColor.YELLOW + "Author: " + ChatColor.WHITE + "netbenix"); + sender.sendMessage(ChatColor.GRAY + "================"); + return true; + } + + if(args[0].equalsIgnoreCase("stats")) { + if(args.length == 1) { + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE STATS"); + sender.sendMessage(ChatColor.YELLOW + "Usage: " + ChatColor.AQUA + "/lmve stats "); + sender.sendMessage(ChatColor.YELLOW + "Sub-Commands:"); + sender.sendMessage(ChatColor.RED + "show" + ChatColor.WHITE + " - Shows your Stats"); + sender.sendMessage(ChatColor.RED + "show " + ChatColor.WHITE + " - Shows another players Stats"); + + sender.sendMessage(ChatColor.GRAY + "================"); + return true; + } + + if(args[1].equalsIgnoreCase("show")) { + if(args.length >= 4) { + sender.sendMessage(ChatColor.RED + "Too many Arguments."); + return true; + } + if(args.length == 2) { + if(!(sender instanceof Player)) { + sender.sendMessage("Please use: /lmve stats show "); + return true; + } + Player p = (Player) sender; + PlayerStatistics pStats = new PlayerStatistics(this); + UUIDReference uuidRef = new UUIDReference(this); + UUID uuid = uuidRef.getUUID(p.getName()); + pStats.outputStats(sender, uuid); + } + if(args.length == 3) { + PlayerStatistics pStats = new PlayerStatistics(this); + UUIDReference uuidRef = new UUIDReference(this); + UUID uuid; + if(uuidRef.getUUID(args[2]) == null) { + sender.sendMessage(ChatColor.RED + "Player was never on this Server!"); + return true; + } else { + uuid = uuidRef.getUUID(args[2]); + } + pStats.outputStats(sender, uuid); + } + + return true; + } + return true; + } + + if(args[0].equalsIgnoreCase("leaderboard")){ + if(args.length == 1){ + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE LEADERBOARD INFO"); + sender.sendMessage(ChatColor.YELLOW + "Usage : " + ChatColor.AQUA + "/lmve leaderboard "); + sender.sendMessage(ChatColor.YELLOW + "Categorys: "); + sender.sendMessage(ChatColor.RED + "time-played"); + sender.sendMessage(ChatColor.RED + "deaths"); + sender.sendMessage(ChatColor.RED + "damage-taken"); + return true; + } + if(args.length > 2){ + sender.sendMessage(ChatColor.RED + "Too many Arguments."); + return true; + } + if(args.length == 2){ + PlayerList playerList = new PlayerList(this); + int totalPlayers = 0; + totalPlayers = playerList.getAmount(); + Leaderboard lb = new Leaderboard(this); + lb.show(sender, totalPlayers, args); + } + return true; + } + + + if(args[0].equalsIgnoreCase("settings")) { + if(!(sender instanceof Player)) { + sender.sendMessage("Command is only for Players!"); + return true; + } + if(args.length == 1) { + Player p = (Player) sender; + File playerStat = new File(getDataFolder() + "/Players", p.getUniqueId() + ".yml"); + @SuppressWarnings("static-access") + FileConfiguration player_stat = new YamlConfiguration().loadConfiguration(playerStat); + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE SETTINGS"); + sender.sendMessage(ChatColor.YELLOW + "Usage: " + ChatColor.AQUA + "/lmve settings "); + sender.sendMessage(ChatColor.YELLOW + "Your Settings: "); + sender.sendMessage(ChatColor.RED+ "ChatNotify: " + ChatColor.WHITE + player_stat.getBoolean(p.getUniqueId() + ".Settings.Sounds.ChatNotify")); + sender.sendMessage(ChatColor.GRAY + "================"); + return true; + } + if(args.length > 2) { + sender.sendMessage(ChatColor.RED + "Too many Arguments."); + return true; + } + if(args[1].equalsIgnoreCase("ChatNotify")) { + Player p = (Player) sender; + File PlayerStat = new File(getDataFolder() + "/Players", p.getUniqueId() + ".yml"); + @SuppressWarnings("static-access") + FileConfiguration player_stat = new YamlConfiguration().loadConfiguration(PlayerStat); + if(player_stat.getBoolean(p.getUniqueId() + ".Settings.Sounds.ChatNotify")) { + player_stat.set(p.getUniqueId() + ".Settings.Sounds.ChatNotify", false); + sender.sendMessage(ChatColor.YELLOW + "Setting now changed to: " + ChatColor.RED + "false"); + } else { + player_stat.set(p.getUniqueId() + ".Settings.Sounds.ChatNotify", true); + sender.sendMessage(ChatColor.YELLOW + "Setting now changed to: " + ChatColor.RED + "true"); + } + try { + player_stat.save(PlayerStat); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return true; + } + + if(args[0].equalsIgnoreCase("version")) { + sender.sendMessage(ChatColor.GRAY + "Current " + ChatColor.GOLD + "" + ChatColor.BOLD + "LMVE" + ChatColor.GRAY + " version running: " + ChatColor.RED + this.getDescription().getVersion()); + return true; + } + return true; + } + + + return false; + } +} diff --git a/src/ml/codenoodles/lmve/modules/CustomRecipes.java b/src/ml/codenoodles/lmve/modules/CustomRecipes.java new file mode 100644 index 0000000..6997901 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/CustomRecipes.java @@ -0,0 +1,247 @@ +package ml.codenoodles.lmve.modules; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.server.ServerLoadEvent; +import org.bukkit.inventory.CampfireRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.StonecuttingRecipe; +import org.bukkit.inventory.RecipeChoice.MaterialChoice; + +import ml.codenoodles.lmve.Main; +import ml.codenoodles.lmve.other.ConsoleColor; + +public class CustomRecipes implements Listener{ + + + private Main main; + public CustomRecipes(Main main) { + this.main = main; + } + + MaterialChoice wool = new MaterialChoice(Material.BLACK_WOOL, Material.BLUE_WOOL, Material.BROWN_WOOL, Material.CYAN_WOOL, Material.GRAY_WOOL, Material.GREEN_WOOL, Material.LIGHT_BLUE_WOOL, + Material.LIGHT_GRAY_WOOL, Material.LIME_WOOL, Material.MAGENTA_WOOL, Material.ORANGE_WOOL, Material.PINK_WOOL, Material.PURPLE_WOOL, Material.RED_WOOL, Material.WHITE_WOOL, Material.YELLOW_WOOL); + + private CampfireRecipe getCampfireRecipe(String name) { + switch(name){ + case "COOKED_COD":{ + CampfireRecipe cookedCod = new CampfireRecipe(new NamespacedKey(main, "cfcod"), new ItemStack(Material.COOKED_COD, 1), Material.COD, 0, 400); + return cookedCod; + } + case "COOKED_SALMON":{ + CampfireRecipe cookedSalmon = new CampfireRecipe(new NamespacedKey(main, "cfsalmon"), new ItemStack(Material.COOKED_SALMON, 1), Material.SALMON, 0, 400); + return cookedSalmon; + } + default: { + return null; + } + } + } + + private ShapelessRecipe getShapelessRecipe(String name) { + switch(name) { + case "BLACK_DYE":{ + ShapelessRecipe blackinkRecipe = new ShapelessRecipe(new NamespacedKey(main, "blackink"), new ItemStack(Material.BLACK_DYE, 1)) + .addIngredient(Material.COAL); + return blackinkRecipe; + } + case "STRINGS":{ + ShapelessRecipe stringsRecipe = new ShapelessRecipe(new NamespacedKey(main, "strings"), new ItemStack(Material.STRING, 4)) + .addIngredient(wool); + return stringsRecipe; + } + default:{ + return null; + } + } + } + + private ShapedRecipe getShapedRecipe(String name) { + switch(name) { + case "COBWEB":{ + ShapedRecipe cobwebRecipe = new ShapedRecipe(new NamespacedKey(main, "cobweb"), new ItemStack(Material.COBWEB, 4)) + .shape("s s", " s ", "s s") + .setIngredient('s', Material.STRING); + return cobwebRecipe; + } + case "ELYTRA":{ + ShapedRecipe elytraRecipe = new ShapedRecipe(new NamespacedKey(main, "elytra"), new ItemStack(Material.ELYTRA, 1)) + .shape("pnp", "psp", "p p") + .setIngredient('p', Material.PHANTOM_MEMBRANE) + .setIngredient('s', Material.STICK) + .setIngredient('n', Material.NETHER_STAR); + return elytraRecipe; + } + case "ICE01":{ + ShapedRecipe iceRecipe01 = new ShapedRecipe(new NamespacedKey(main, "ice01"), new ItemStack(Material.ICE, 4)) + .shape("sss", "sws", "sss") + .setIngredient('s', Material.SNOWBALL) + .setIngredient('w', Material.WATER_BUCKET); + return iceRecipe01; + } + case "ICE02":{ + ShapedRecipe iceRecipe02 = new ShapedRecipe(new NamespacedKey(main, "ice02"), new ItemStack(Material.ICE, 4)) + .shape(" ", "sws", " ") + .setIngredient('s', Material.SNOW_BLOCK) + .setIngredient('w', Material.WATER_BUCKET); + + return iceRecipe02; + } + case "MAGMA_BLOCK":{ + ShapedRecipe magmablockRecipe = new ShapedRecipe(new NamespacedKey(main, "magmablock"), new ItemStack(Material.MAGMA_BLOCK, 1)) + .shape(" m ", " c ", " l ") + .setIngredient('m', Material.MAGMA_CREAM) + .setIngredient('c', Material.COBBLESTONE) + .setIngredient('l', Material.LAVA_BUCKET); + return magmablockRecipe; + } + case "MYCELIUM":{ + ShapedRecipe myceliumRecipe = new ShapedRecipe(new NamespacedKey(main, "mycelium"), new ItemStack(Material.MYCELIUM, 1)) + .shape("brb", "rdr", "brb") + .setIngredient('b', Material.BROWN_MUSHROOM) + .setIngredient('r', Material.RED_MUSHROOM) + .setIngredient('d', Material.DIRT); + return myceliumRecipe; + } + default:{ + return null; + } + } + } + + private StonecuttingRecipe getStonecuttingRecipe(Material mat) { + switch(mat) { + case OAK_SLAB: { + StonecuttingRecipe oakWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scoakwoodslabs"), new ItemStack(Material.OAK_SLAB, 2), Material.OAK_PLANKS); + return oakWoodSlabs; + } + case BIRCH_SLAB:{ + StonecuttingRecipe birchWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scbirchwoodslabs"), new ItemStack(Material.BIRCH_SLAB, 2), Material.BIRCH_PLANKS); + return birchWoodSlabs; + } + case JUNGLE_SLAB:{ + StonecuttingRecipe jungleWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scjunglewoodslabs"), new ItemStack(Material.JUNGLE_SLAB, 2), Material.JUNGLE_PLANKS); + return jungleWoodSlabs; + } + case SPRUCE_SLAB:{ + StonecuttingRecipe spruceWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scsprucewoodslabs"), new ItemStack(Material.SPRUCE_SLAB, 2), Material.SPRUCE_PLANKS); + return spruceWoodSlabs; + } + case DARK_OAK_SLAB:{ + StonecuttingRecipe darkoakWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scdarkoakwoodslabs"), new ItemStack(Material.DARK_OAK_SLAB, 2), Material.DARK_OAK_PLANKS); + return darkoakWoodSlabs; + } + case ACACIA_SLAB:{ + StonecuttingRecipe acaciaWoodSlabs = new StonecuttingRecipe(new NamespacedKey(main, "scacaciawoodslabs"), new ItemStack(Material.ACACIA_SLAB, 2), Material.ACACIA_PLANKS); + return acaciaWoodSlabs; + } + case OAK_STAIRS:{ + StonecuttingRecipe oakWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scoakwoodstairs"), new ItemStack(Material.OAK_STAIRS), Material.OAK_PLANKS); + return oakWoodStairs; + } + case BIRCH_STAIRS:{ + StonecuttingRecipe birchWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scbirchwoodstairs"), new ItemStack(Material.BIRCH_STAIRS), Material.BIRCH_PLANKS); + return birchWoodStairs; + } + case JUNGLE_STAIRS:{ + StonecuttingRecipe jungleWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scjunglewoodstairs"), new ItemStack(Material.JUNGLE_STAIRS), Material.JUNGLE_PLANKS); + return jungleWoodStairs; + } + case SPRUCE_STAIRS:{ + StonecuttingRecipe spruceWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scsprucewoodstairs"), new ItemStack(Material.SPRUCE_STAIRS), Material.SPRUCE_PLANKS); + return spruceWoodStairs; + } + case DARK_OAK_STAIRS:{ + StonecuttingRecipe darkoakWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scdarkoakwoodstairs"), new ItemStack(Material.DARK_OAK_STAIRS), Material.DARK_OAK_PLANKS); + return darkoakWoodStairs; + } + case ACACIA_STAIRS:{ + StonecuttingRecipe acaciaWoodStairs = new StonecuttingRecipe(new NamespacedKey(main, "scacaciawoodstairs"), new ItemStack(Material.ACACIA_STAIRS), Material.ACACIA_PLANKS); + return acaciaWoodStairs; + } + default:{ return null; } + } + } + + + + @EventHandler + private void RegisterCampfireRecipes(ServerLoadEvent e) { + if(main.getConfigFile().getBoolean("LMVE-Recipes.Campfire.cooked-cod")){ + Bukkit.addRecipe(getCampfireRecipe("COOKED_COD")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "COOKED_COD" + ConsoleColor.BLUE + " CampfireRecipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Campfire.cooked-salmon")){ + Bukkit.addRecipe(getCampfireRecipe("COOKED_SALMON")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "COOKED_SALMON" + ConsoleColor.BLUE + " CampfireRecipe." + ConsoleColor.RESET); + } + } + + @EventHandler + private void RegisterShapelessRecipes(ServerLoadEvent e) { + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.black-dye")) { + Bukkit.addRecipe(getShapelessRecipe("BLACK_DYE")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "BLACK_DYE" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.strings")) { + Bukkit.addRecipe(getShapelessRecipe("STRINGS")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "STRINGS" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + } + + @EventHandler + private void RegisterShapedRecipes(ServerLoadEvent e) { + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.cobweb")) { + Bukkit.addRecipe(getShapedRecipe("COBWEB")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "COBWEB" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.elytra")) { + Bukkit.addRecipe(getShapedRecipe("ELYTRA")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "ELYTRA" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.ice01")) { + Bukkit.addRecipe(getShapedRecipe("ICE01")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "ICE01" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.ice02")) { + Bukkit.addRecipe(getShapedRecipe("ICE02")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "ICE02" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.magma-block")) { + Bukkit.addRecipe(getShapedRecipe("MAGMA_BLOCK")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "MAGMA_BLOCK" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Crafting.mycelium")) { + Bukkit.addRecipe(getShapedRecipe("MYCELIUM")); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "MYCELIUM" + ConsoleColor.BLUE + " Recipe." + ConsoleColor.RESET); + } + } + + @EventHandler + private void RegisterStonecuttingRecipe(ServerLoadEvent e) { + if(main.getConfigFile().getBoolean("LMVE-Recipes.Stonecutter.wood-slabs")) { + Bukkit.addRecipe(getStonecuttingRecipe(Material.OAK_SLAB)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.BIRCH_SLAB)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.JUNGLE_SLAB)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.SPRUCE_SLAB)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.DARK_OAK_SLAB)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.ACACIA_SLAB)); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "WOOD_SLAB" + ConsoleColor.BLUE + " StonecuttingRecipe." + ConsoleColor.RESET); + } + if(main.getConfigFile().getBoolean("LMVE-Recipes.Stonecutter.wood-stairs")) { + Bukkit.addRecipe(getStonecuttingRecipe(Material.OAK_STAIRS)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.BIRCH_STAIRS)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.JUNGLE_STAIRS)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.SPRUCE_STAIRS)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.DARK_OAK_STAIRS)); + Bukkit.addRecipe(getStonecuttingRecipe(Material.ACACIA_STAIRS)); + System.out.println(ConsoleColor.BLUE + "[LMVE]Loaded " + ConsoleColor.YELLOW + "WOOD_STAIRS" + ConsoleColor.BLUE + " StonecuttingRecipe." + ConsoleColor.RESET); + } + + } +} diff --git a/src/ml/codenoodles/lmve/modules/EnragedMobs.java b/src/ml/codenoodles/lmve/modules/EnragedMobs.java new file mode 100644 index 0000000..a9c1d4a --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/EnragedMobs.java @@ -0,0 +1,139 @@ +package ml.codenoodles.lmve.modules; + +import java.util.ArrayList; +import java.util.Random; + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.PigZombie; +import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import ml.codenoodles.lmve.Main; + + +public class EnragedMobs implements Listener{ + + private Main main; + public EnragedMobs(Main main) { + this.main = main; + } + + private boolean checkIfTrigger() { + int chance = main.getConfig().getInt("EnragedMobs.chance");; + boolean trigger = false; + Random rand = new Random(); + int n = rand.nextInt(100); + n += 1; + if(n < chance) { + trigger = true; + } else { + trigger = false; + } + return trigger; + } + + private boolean checkCustomName(String name) { + if(name == null) { + return false; + } + if(name.startsWith("Enraged")) { + return true; + } else { + return false; + } + } + + @EventHandler + private void ChangeExpDrop(EntityDeathEvent e) { + if(!main.getConfig().getBoolean("EnragedMobs.enabled")) { + return; + } + if(e.getEntity().getCustomName() == null) { return; } + if(e.getEntity().getCustomName().startsWith("Enraged")) { + e.setDroppedExp(e.getDroppedExp() * 2); + } + } + + @EventHandler + private void TransformToEnraged(EntityDamageByEntityEvent e) { + if(!main.getConfig().getBoolean("EnragedMobs.enabled")) { + return; + } + if(e.getDamager().getType() != EntityType.PLAYER) { + return; + } + ArrayList triggerItems = new ArrayList(); + triggerItems.add(Material.IRON_SWORD); + triggerItems.add(Material.IRON_AXE); + triggerItems.add(Material.DIAMOND_SWORD); + triggerItems.add(Material.DIAMOND_AXE); + boolean correctItem = false; + for(int i = 0; i < triggerItems.size(); i++) { + Player p = (Player) e.getDamager(); + if(p.getInventory().getItemInMainHand().getType() == triggerItems.get(i)) { + correctItem = true; + } + } + if(!correctItem) { + return; + } + + boolean causeTrigger = false; + switch(e.getCause()) { + case ENTITY_ATTACK: { causeTrigger = true; break;} + case ENTITY_SWEEP_ATTACK: { causeTrigger = true; break;} + case PROJECTILE: { causeTrigger = true; break;} + case THORNS: { causeTrigger = true; break;} + default:{ causeTrigger = false; break;} + } + if(causeTrigger) { + switch(e.getEntity().getType()) { + case ZOMBIE:{ + Zombie zombie = (Zombie) e.getEntity(); + boolean trigger = checkIfTrigger(); + if(trigger) { + if(!checkCustomName(zombie.getCustomName())) { + World world = zombie.getWorld(); + world.strikeLightningEffect(zombie.getLocation()); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 9999, 3)); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 9999, 1)); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.HARM, 60, 1)); + zombie.setHealth(zombie.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + zombie.setCustomName("Enraged Zombie"); + zombie.setCustomNameVisible(true); + } + } + return; + } + case PIG_ZOMBIE:{ + PigZombie pigzombie = (PigZombie) e.getEntity(); + boolean trigger = checkIfTrigger(); + if(trigger) { + if(!checkCustomName(pigzombie.getCustomName())) { + World world = pigzombie.getWorld(); + world.strikeLightningEffect(pigzombie.getLocation()); + pigzombie.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 9999, 3)); + pigzombie.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 9999, 1)); + pigzombie.addPotionEffect(new PotionEffect(PotionEffectType.HARM, 60, 1)); + pigzombie.setHealth(pigzombie.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + pigzombie.setCustomName("Enraged Zombie Pigman"); + pigzombie.setCustomNameVisible(true); + } + } + return; + } + default:{ } + } + } + } + +} diff --git a/src/ml/codenoodles/lmve/modules/Hardcore.java b/src/ml/codenoodles/lmve/modules/Hardcore.java new file mode 100644 index 0000000..be3f604 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/Hardcore.java @@ -0,0 +1,65 @@ +package ml.codenoodles.lmve.modules; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.server.ServerLoadEvent; + +import ml.codenoodles.lmve.Main; + +public class Hardcore implements Listener{ + + private Main main; + + public Hardcore(Main main) { + this.main = main; + } + + @EventHandler + private void DisableMessage(ServerLoadEvent e) { + if(!main.getConfigFile().getBoolean("Hardcore.enabled")) { + for(Player players : Bukkit.getOnlinePlayers()){ + players.playSound(players.getLocation(), Sound.ENTITY_VILLAGER_CELEBRATE, 10, 0.8f); + players.sendMessage(ChatColor.YELLOW + "ATTENTION! Hardcore Mode: Disabled."); + } + } + } + + @EventHandler + private void onPlayerDamage(EntityDamageEvent e) { + if(main.getConfigFile().getBoolean("Hardcore.enabled")) { + Entity entity = e.getEntity(); + if (entity instanceof Player) { + e.setDamage(e.getDamage() * 2); + } + } + } + + @EventHandler + private void WarnMessageOnJoin(PlayerJoinEvent e) { + if(main.getConfigFile().getBoolean("Hardcore.enabled")) { + e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ENTITY_PHANTOM_AMBIENT, 10, 0); + e.getPlayer().sendMessage(ChatColor.RED + "WARNING! HARCORE IS ENABLED!"); + e.getPlayer().sendMessage(ChatColor.RED + "The damage you get is doubled!"); + } + } + + @EventHandler + private void EnableMessage(ServerLoadEvent e) { + if(main.getConfigFile().getBoolean("Hardcore.enabled")) { + System.out.println("[VMVE]HARDCORE MODE ACTIVATED."); + for(Player players : Bukkit.getOnlinePlayers()){ + players.playSound(players.getLocation(), Sound.ENTITY_PHANTOM_AMBIENT, 10, 0); + players.sendMessage(ChatColor.RED + "WARNING! HARCORE IS ENABLED!"); + players.sendMessage(ChatColor.RED + "The damage you get is doubled!"); + } + } + } + +} diff --git a/src/ml/codenoodles/lmve/modules/Leaderboard.java b/src/ml/codenoodles/lmve/modules/Leaderboard.java new file mode 100644 index 0000000..30bdccc --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/Leaderboard.java @@ -0,0 +1,133 @@ +package ml.codenoodles.lmve.modules; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import ml.codenoodles.lmve.Main; +import ml.codenoodles.lmve.other.ConsoleColor; + +public class Leaderboard { + + private Main main; + public Leaderboard(Main main) { + this.main = main; + } + + + public void show(CommandSender sender, int totalPlayers, String[] args) { + + Connection conn; + int playerAmount = totalPlayers; + int unknown = 0; + String player[] = new String[playerAmount]; + UUID uuid[] = new UUID[playerAmount]; + String path = "jdbc:sqlite:" + main.getDataFolder().getAbsolutePath() + "/" + "Players.db"; + try {//Try Connection + conn = DriverManager.getConnection(path); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + for(int i = 1; i <= totalPlayers; i++) { + try { //Get Players + String query = "SELECT Name AS playerName, UUID AS uuid FROM tblPlayers WHERE ID = ?"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setLong(1, i); + ResultSet rs = pst.executeQuery(); + rs.next(); + player[i-1] = rs.getString("playerName"); + uuid[i-1] = UUID.fromString(rs.getString("uuid")); + rs.close(); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + } + + float value[] = new float[playerAmount]; + sender.sendMessage(ChatColor.GRAY + "=====[ LEADERBOARD ]====="); + switch(args[1]){ + case "time-played":{ + sender.sendMessage(ChatColor.GRAY + "Category: " + ChatColor.AQUA + "Time Played" + ChatColor.GRAY + "(in hours)"); + for(int i = 1; i < playerAmount; i++) { + File playerFile = new File(main.getDataFolder() + "/Players", uuid[i] + ".yml"); + FileConfiguration playerStat = YamlConfiguration.loadConfiguration(playerFile); + value[i] = playerStat.getInt(uuid[i] + ".TimePlayed"); + } + break; + } + case "deaths":{ + sender.sendMessage(ChatColor.GRAY + "Category: " + ChatColor.AQUA + "Deaths"); + for(int i = 1; i <= playerAmount; i++) { + try { + String query = "SELECT Deaths AS count FROM tblPlayerStats WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid[i-1].toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + value[i-1] = rs.getLong("count"); + rs.close(); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + } + break; + } + case "damage-taken":{ + sender.sendMessage(ChatColor.GRAY + "Category: " + ChatColor.AQUA + "Damage Taken"); + for(int i = 1; i <= playerAmount; i++) { + try { + String query = "SELECT DamageTaken AS count FROM tblPlayerStats WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid[i-1].toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + value[i-1] = rs.getLong("count"); + rs.close(); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + } + break; + } + default:{ + sender.sendMessage(ChatColor.RED + "Category unknown."); + unknown = 1; + break; + } + } + String temp_str; + float temp = 0; + if(unknown == 0) { + for(int i=0; i < playerAmount; i++){ + for(int j=1; j < (playerAmount-i); j++){ + if(value[j-1] < value[j]){ + temp = value[j-1]; + temp_str = player[j-1]; + value[j-1] = value[j]; + player[j-1] = player[j]; + value[j] = temp; + player[j] = temp_str; + } + } + } + for(int i = 0; i < playerAmount; i++) { + sender.sendMessage(ChatColor.YELLOW + player[i] + ChatColor.WHITE + " - " + ChatColor.RED + value[i]); + } + } + sender.sendMessage(ChatColor.GRAY + "================"); + + } +} diff --git a/src/ml/codenoodles/lmve/modules/Messages.java b/src/ml/codenoodles/lmve/modules/Messages.java new file mode 100644 index 0000000..3462bfc --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/Messages.java @@ -0,0 +1,31 @@ +package ml.codenoodles.lmve.modules; + +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import ml.codenoodles.lmve.Main; + +public class Messages implements Listener{ + + private Main main; + public Messages(Main main) { + this.main = main; + } + + @EventHandler + private void JoinMessage(PlayerJoinEvent e) { + if(main.getConfigFile().getBoolean("JoinMessage.enabled") == true) { + e.setJoinMessage(ChatColor.GREEN + "[+]" + ChatColor.GRAY + e.getPlayer().getDisplayName() + " joined the Server!"); + } + } + + @EventHandler + private void QuitMessage(PlayerQuitEvent e) { + if(main.getConfigFile().getBoolean("QuitMessage.enabled")) { + e.setQuitMessage(ChatColor.RED + "[-]" + ChatColor.GRAY + e.getPlayer().getDisplayName() + " left the Server!"); + } + } +} diff --git a/src/ml/codenoodles/lmve/modules/NetherPortal.java b/src/ml/codenoodles/lmve/modules/NetherPortal.java new file mode 100644 index 0000000..5ddc349 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/NetherPortal.java @@ -0,0 +1,49 @@ +package ml.codenoodles.lmve.modules; + +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.PortalCreateEvent; + +import ml.codenoodles.lmve.Main; + +public class NetherPortal implements Listener{ + + private Main main; + public NetherPortal(Main main) { + this.main = main; + } + + @EventHandler + private void PreventPortalActivate(PortalCreateEvent e) { + if(main.getConfig().getBoolean("NetherPortal.prevent-portals-above-nehter-ceiling") == true) { + if(e.getWorld().getEnvironment() == Environment.NETHER) { + List block = e.getBlocks(); + World world = e.getWorld(); + Location loc = null; + for(int i = 0; i < block.size(); i++) { + BlockState state = block.get(i); + loc = state.getLocation(); + if(state.getLocation().getBlockY() >= 128) { + Block blockk = state.getBlock(); + blockk.setType(Material.AIR); + world.spawnParticle(Particle.EXPLOSION_NORMAL, loc.getX(), loc.getY(), loc.getZ(), 10); + } + } + if(loc.getY() > 127) { + world.playSound(loc, Sound.ENTITY_GENERIC_EXPLODE, 100, 1); + e.setCancelled(true); + } + } + } + } +} diff --git a/src/ml/codenoodles/lmve/modules/PlayerHeads.java b/src/ml/codenoodles/lmve/modules/PlayerHeads.java new file mode 100644 index 0000000..7c0f025 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/PlayerHeads.java @@ -0,0 +1,57 @@ +package ml.codenoodles.lmve.modules; + +import java.util.ArrayList; +import java.util.Random; + +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import ml.codenoodles.lmve.Main; + +public class PlayerHeads implements Listener{ + + private Main main; + public PlayerHeads(Main main) { + this.main = main; + } + + private boolean checkIfTrigger() { + int chance = main.getConfig().getInt("PlayerHeads.chance");; + boolean trigger = false; + Random rand = new Random(); + int n = rand.nextInt(100); + n += 1; + if(n < chance) { + trigger = true; + } else { + trigger = false; + } + return trigger; + } + + @EventHandler + private void PlayerHeadDrop(PlayerDeathEvent e) { + if(!main.getConfig().getBoolean("PlayerHeads.enabled")) { + return; + } + boolean trigger = checkIfTrigger(); + if(trigger) { + OfflinePlayer p = e.getEntity(); + ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1); + SkullMeta skullMeta = (SkullMeta) head.getItemMeta(); + ArrayList lore = new ArrayList(); + lore.add("Head of " + p.getName()); + skullMeta.setLore(lore); + skullMeta.setOwningPlayer(p); + head.setItemMeta(skullMeta); + e.getEntity().getWorld().dropItem(e.getEntity().getLocation(), head); + } + } + + +} diff --git a/src/ml/codenoodles/lmve/modules/PlayerList.java b/src/ml/codenoodles/lmve/modules/PlayerList.java new file mode 100644 index 0000000..d27526a --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/PlayerList.java @@ -0,0 +1,46 @@ +package ml.codenoodles.lmve.modules; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.bukkit.event.Listener; + +import ml.codenoodles.lmve.Main; + +public class PlayerList implements Listener{ + + private Main main; + public PlayerList(Main main) { + this.main = main; + } + + public int getAmount() { + int totalPlayers; + Connection conn; + String path = "jdbc:sqlite:" + main.getDataFolder().getAbsolutePath() + "\\" + "Players.db"; + try { //Try Connection + conn = DriverManager.getConnection(path); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return 0; + } + + try { //Count Players + String query = "SELECT COUNT(Name) AS totalPlayers FROM tblPlayers;"; + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(query); + rs.next(); + totalPlayers = rs.getInt("totalPlayers"); + rs.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return 0; + } + + return totalPlayers; + } + +} diff --git a/src/ml/codenoodles/lmve/modules/PlayerStatistics.java b/src/ml/codenoodles/lmve/modules/PlayerStatistics.java new file mode 100644 index 0000000..3793f50 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/PlayerStatistics.java @@ -0,0 +1,247 @@ +package ml.codenoodles.lmve.modules; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.Statistic; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import ml.codenoodles.lmve.Main; +import ml.codenoodles.lmve.other.ConsoleColor; + +public class PlayerStatistics implements Listener{ + + private Main main; + public PlayerStatistics(Main main) { + this.main = main; + } + + @EventHandler + private void UpdateLastJoined(PlayerJoinEvent e) { + UUID player_uuid = e.getPlayer().getUniqueId(); + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); + LocalDateTime now = LocalDateTime.now(); + File playerStats = new File(main.getDataFolder() + "/Players", player_uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + player_stat.set(player_uuid + ".LastJoined", dtf.format(now)); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + + @EventHandler + private void SaveOnQuit(PlayerQuitEvent e) { + Player p = (Player) e.getPlayer(); + UUID uuid = p.getUniqueId(); + + File playerStats = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + player_stat.set(uuid + ".General.DisplayName", p.getName()); + player_stat.set(uuid + ".General.Health", p.getHealth()); + player_stat.set(uuid + ".General.World", p.getWorld().getName()); + player_stat.set(uuid + ".General.Location.X", p.getLocation().getX()); + player_stat.set(uuid + ".General.Location.Y", p.getLocation().getY()); + player_stat.set(uuid + ".General.Location.Z", p.getLocation().getZ()); + float pTime = p.getStatistic(Statistic.PLAY_ONE_MINUTE); + pTime = pTime / 20; + pTime = pTime / 60; + pTime = pTime / 60; + player_stat.set(uuid + ".TimePlayed", pTime); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + + @EventHandler(priority = EventPriority.LOW) + private void checkName(PlayerJoinEvent e) throws IOException { + UUID uuid = e.getPlayer().getUniqueId(); + File pStatFile = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration pStat = YamlConfiguration.loadConfiguration(pStatFile); + if(pStat.getString(uuid + ".DisplayName") != e.getPlayer().getName()) { + String oldName = pStat.getString(uuid + ".DisplayName"); + String newName = e.getPlayer().getName(); + pStat.set(uuid + ".DisplayName", newName); + + File uRefFile = new File(main.getDataFolder(), "uuid_reference.yml"); + FileConfiguration uRef = YamlConfiguration.loadConfiguration(uRefFile); + uRef.set(oldName, null); + uRef.set(newName, uuid.toString()); + try { + pStat.save(pStatFile); + uRef.save(uRefFile); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + + Path pListPath = Paths.get(main.getDataFolder() + "/playerList.txt"); + Charset charset = StandardCharsets.UTF_8; + String content = new String(Files.readAllBytes(pListPath), charset); + content = content.replaceAll(("\\b" + oldName + "\\b"), newName); + Files.write(pListPath, content.getBytes(charset)); + } + } + + + public void outputStats(CommandSender sender, UUID uuid) { + + Connection conn; + int columnCountStats = 0; + int columnCountStatsF = 0; + int columnCountStatsN = 0; + int columnCountStatsH = 0; + try { //Try Connection + conn = DriverManager.getConnection("jdbc:sqlite:" + main.getDataFolder().getAbsolutePath() + "/" + "Players.db"); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.PURPLE + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + + String columnNameStats[]; + String columnNameStatsF[]; + String columnNameStatsN[]; + String columnNameStatsH[]; + + try { //Get Columncounts + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM tblPlayerStats;"); + ResultSetMetaData rsmd = rs.getMetaData(); + columnCountStats = rsmd.getColumnCount() - 2; + columnNameStats = new String[columnCountStats]; + for(int i = 1; i <= columnCountStats; i++) { + columnNameStats[i-1] = rsmd.getColumnName(i+2); + } + rs.close(); + ResultSet rsF = stmt.executeQuery("SELECT * FROM tblPlayerFKills;"); + ResultSetMetaData rsmdF = rsF.getMetaData(); + columnCountStatsF = rsmdF.getColumnCount() - 2; + columnNameStatsF = new String[columnCountStatsF]; + for(int i = 1; i <= columnCountStatsF; i++) { + columnNameStatsF[i-1] = rsmdF.getColumnName(i+2); + } + rsF.close(); + ResultSet rsN = stmt.executeQuery("SELECT * FROM tblPlayerNKills;"); + ResultSetMetaData rsmdN = rsN.getMetaData(); + columnCountStatsN = rsmdN.getColumnCount() - 2; + columnNameStatsN = new String[columnCountStatsN]; + for(int i = 1; i <= columnCountStatsN; i++) { + columnNameStatsN[i-1] = rsmdN.getColumnName(i+2); + } + rsN.close(); + ResultSet rsH = stmt.executeQuery("SELECT * FROM tblPlayerHKills;"); + ResultSetMetaData rsmdH = rsH.getMetaData(); + columnCountStatsH = rsmdH.getColumnCount() - 2; + columnNameStatsH = new String[columnCountStatsH]; + for(int i = 1; i <= columnCountStatsH; i++) { + columnNameStatsH[i-1] = rsmdH.getColumnName(i+2); + } + rsH.close(); + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + return; + } + + + String columnValueStats[] = new String[columnCountStats]; + String columnValueStatsF[] = new String[columnCountStatsF]; + String columnValueStatsN[] = new String[columnCountStatsN]; + String columnValueStatsH[] = new String[columnCountStatsH]; + + + try { //Get Stats + String query = "SELECT * FROM tblPlayerStats WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid.toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + sender.sendMessage(ChatColor.GRAY + "================"); + sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "STATS"); + sender.sendMessage(ChatColor.RED + "=== General ==="); + for(int i = 1; i <= columnCountStats; i++) { + columnValueStats[i-1] = rs.getString(i+2); + sender.sendMessage(ChatColor.YELLOW + columnNameStats[i-1] + ": " + ChatColor.AQUA + columnValueStats[i-1]); + } + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Get F Kills + String query = "SELECT * FROM tblPlayerFKills WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid.toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + sender.sendMessage(ChatColor.RED + "=== Kills ==="); + sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "[Friendly]"); + for(int i = 1; i <= columnCountStatsF; i++) { + columnValueStatsF[i-1] = rs.getString(i+2); + sender.sendMessage(ChatColor.YELLOW + columnNameStatsF[i-1] + ": " + ChatColor.AQUA + columnValueStatsF[i-1]); + } + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Get N Kills + String query = "SELECT * FROM tblPlayerNKills WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid.toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "[Neutral]"); + for(int i = 1; i <= columnCountStatsN; i++) { + columnValueStatsN[i-1] = rs.getString(i + 2); + sender.sendMessage(ChatColor.YELLOW + columnNameStatsN[i-1] + ": " + ChatColor.AQUA + columnValueStatsN[i-1]); + } + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Get H Kills + String query = "SELECT * FROM tblPlayerHKills WHERE UUID = ?;"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid.toString()); + ResultSet rs = pst.executeQuery(); + rs.next(); + sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "[Hostile]"); + for(int i = 1; i <= columnCountStatsH; i++) { + columnValueStatsH[i-1] = rs.getString(i + 2); + sender.sendMessage(ChatColor.YELLOW + columnNameStatsH[i-1] + ": " + ChatColor.AQUA + columnValueStatsH[i-1]); + } + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + sender.sendMessage(ChatColor.GRAY + "================"); + } + +} diff --git a/src/ml/codenoodles/lmve/modules/PreventMobGriefing.java b/src/ml/codenoodles/lmve/modules/PreventMobGriefing.java new file mode 100644 index 0000000..7574468 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/PreventMobGriefing.java @@ -0,0 +1,46 @@ +package ml.codenoodles.lmve.modules; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ExplosionPrimeEvent; + +import ml.codenoodles.lmve.Main; + +public class PreventMobGriefing implements Listener{ + + private Main main; + public PreventMobGriefing(Main main) { + this.main = main; + } + + @EventHandler + private void PreventExplosion(ExplosionPrimeEvent e) { + boolean change = false; + switch(e.getEntityType()) { + case CREEPER:{ + if(main.getConfig().getBoolean("PreventMobGriefing.creeper")) { + change = true; + } + break; + } + case WITHER:{ + if(main.getConfig().getBoolean("PreventMobGriefing.wither")) { + change = true; + } + break; + } + case WITHER_SKULL:{ + if(main.getConfig().getBoolean("PreventMobGriefing.wither")) { + change = true; + } + break; + } + default: {change = false; break;} + } + + if(change) { + e.setRadius(0); + e.setFire(false); + } + } +} diff --git a/src/ml/codenoodles/lmve/modules/SQLHandler.java b/src/ml/codenoodles/lmve/modules/SQLHandler.java new file mode 100644 index 0000000..850beb4 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/SQLHandler.java @@ -0,0 +1,127 @@ +package ml.codenoodles.lmve.modules; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +import ml.codenoodles.lmve.other.ConsoleColor; + +public class SQLHandler { + + + public SQLHandler() { + } + + + public void createDefaultDatabase(String dbPath) { + Connection conn; + int successfullQuerys = 0; + + String finalPath = "jdbc:sqlite:" + dbPath + "/" + "Players.db"; + try { //Try Connection + conn = DriverManager.getConnection(finalPath); + if(conn != null) { + System.out.println(ConsoleColor.PURPLE + "[LMVE]Connected to Database!" + ConsoleColor.RESET); + } + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return; + } + + try { //Create Playertable + String query = "CREATE TABLE tblPlayers(" + + "ID INTEGER PRIMARY KEY, " + + "Name TEXT NOT NULL," + + "UUID TEXT);"; + Statement stmt = conn.createStatement(); + stmt.execute(query); + System.out.println(ConsoleColor.PURPLE + "[LMVE]Player Table created!" + ConsoleColor.RESET); + successfullQuerys++; + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + } + + try { //Create PlayerStatsTable + String query = "CREATE TABLE tblPlayerStats(" + + "ID INTEGER PRIMARY KEY, " + "UUID TEXT NOT NULL," + + "Displayname TEXT," + "Health REAL," + + "World TEXT," + + "FirstJoined TEXT," + "LastJoined TEXT," + + "Deaths INTEGER," + "DamageTaken REAL);"; + Statement stmt = conn.createStatement(); + stmt.execute(query); + System.out.println(ConsoleColor.PURPLE + "[LMVE]Player Stats Table created!" + ConsoleColor.RESET); + successfullQuerys++; + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + } + + try { //Create FriendlyKillTable + String query = "CREATE TABLE tblPlayerFKills(" + + "ID INTEGER PRIMARY KEY," + "UUID TEXT NOT NULL," + + "Sheep INTEGER, " + "Pig INTEGER, " + "Chicken INTEGER, " + + "Bat INTEGER, " + "Cat INTEGER, " + "Cod INTEGER, " + + "Cow INTEGER, " + "Donkey INTEGER, " + "Fox INTEGER, " + + "Horse INTEGER, " + "Mooshroom INTEGER, " + "Mule INTEGER, " + + "Ocelot INTEGER, " + "Parrot INTEGER, " + "Rabbit INTEGER, " + + "Salmon INTEGER, " + "Skeleton_Horse INTEGER, " + "Squid INTEGER, " + + "Tropical_Fish INTEGER, " + "Turtle INTEGER, " + "Villager INTEGER, " + + "Wandering_Trager INTEGER, " + "Snowman INTEGER);"; + Statement stmt = conn.createStatement(); + stmt.execute(query); + System.out.println(ConsoleColor.PURPLE + "[LMVE]Player KillStats F Table created!" + ConsoleColor.RESET); + successfullQuerys++; + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Create NeutralKillTable + String query = "CREATE TABLE tblPlayerNKills(" + + "ID INTEGER PRIMARY KEY," + "UUID TEXT NOT NULL," + + "Enderman INTEGER, " + "Pufferfish INTEGER, " + "Dolphin INTEGER, " + + "Llama INTEGER, " + "Panda INTEGER, " + "Polar_Bear INTEGER," + + "Trader_Llama INTEGER, " + "Wolf INTEGER, " + "Iron_Golem INTEGER," + + "Zombie_Pigman INTEGER, " + "Bee INTEGER);"; + Statement stmt = conn.createStatement(); + stmt.execute(query); + System.out.println(ConsoleColor.PURPLE + "[LMVE]Player KillStats N Table created!" + ConsoleColor.RESET); + successfullQuerys++; + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Create HostileKillTable + String query = "CREATE TABLE tblPlayerHKills(" + + "ID INTEGER PRIMARY KEY," + "UUID TEXT NOT NULL," + + "Blaze INTEGER, " + "Creeper INTEGER, " + "Drowned INTEGER, " + + "Elder_Guardian INTEGER, " + "Endermite INTEGER, " + "Evoker INTEGER, " + + "Ghast INTEGER, " + "Guardian INTEGER, " + "Husk INTEGER, " + + "Magma_Cube INTEGER, " + "Phantom INTEGER, " + "Pillager INTEGER, " + + "Ravager INTEGER, " + "Shulker INTEGER, " + "Silverfish INTEGER, " + + "Skeleton INTEGER, " + "Slime INTEGER, " + "Stray INTEGER, " + + "Vex INTEGER, " + "Vindicator INTEGER, " + "Witch INTEGER, " + + "Wither_Skeleton INTEGER, " + "Zombie INTEGER, " + "Zombie_Villager INTEGER);"; + Statement stmt = conn.createStatement(); + stmt.execute(query); + System.out.println(ConsoleColor.PURPLE + "[LMVE]Player KillStats H Table created!" + ConsoleColor.RESET); + successfullQuerys++; + }catch(SQLException sqlEx) { + System.out.println(ConsoleColor.RED + "[LMVE]" + sqlEx.getMessage() + ConsoleColor.RESET); + } + + try { //Close Connection + conn.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + } + + if(successfullQuerys == 5) { + System.out.println(ConsoleColor.GREEN + "[LMVE]Default Database successfully created!" + ConsoleColor.RESET); + } else { + System.out.println(ConsoleColor.RED + "[LMVE]Oops.. Something went wrong during the creation of the Default Database." + ConsoleColor.RESET); + } + + } + +} diff --git a/src/ml/codenoodles/lmve/modules/SleepVoteSystem.java b/src/ml/codenoodles/lmve/modules/SleepVoteSystem.java new file mode 100644 index 0000000..4c19f0c --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/SleepVoteSystem.java @@ -0,0 +1,63 @@ +package ml.codenoodles.lmve.modules; + +import org.bukkit.ChatColor; +import org.bukkit.Statistic; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerBedLeaveEvent; + +import ml.codenoodles.lmve.Main; + +public class SleepVoteSystem implements Listener{ + + + private int playersInBed = 0; + private Player players[]; + private Main main; + public SleepVoteSystem(Main main) { + this.main = main; + players = new Player[main.getServer().getMaxPlayers()]; + } + + @EventHandler + private void EnterBed(PlayerBedEnterEvent e) { + World world = e.getPlayer().getWorld(); + if((world.getTime() > 12540) || (world.isThundering() == true)) { + int pib = playersInBed; + float onlinePlayers = main.getServer().getOnlinePlayers().size(); + pib = pib + 1; + playersInBed = pib; + main.getServer().broadcastMessage(ChatColor.GOLD + e.getPlayer().getName() + ChatColor.GRAY + " is now sleeping!"); + double calc = ((onlinePlayers / 100.0) * main.getConfig().getDouble("Sleep.min-perc")); + int neededPlayers = (int) calc; + players[playersInBed - 1] = e.getPlayer(); + if(playersInBed >= neededPlayers) { + for(int i = 0; i < playersInBed; i++) { + players[i].setBedSpawnLocation(players[i].getLocation()); + players[i].setStatistic(Statistic.TIME_SINCE_REST, 0); + } + main.getServer().broadcastMessage(ChatColor.GRAY + "Time was set to Day!"); + e.getPlayer().getWorld().setTime(1000); + e.getPlayer().getWorld().setStorm(false); + e.getPlayer().getWorld().setThundering(false); + playersInBed = 0; + for(int i = 0; i < main.getServer().getMaxPlayers(); i++) { + players[i] = null; + } + } else { + main.getServer().broadcastMessage(ChatColor.GOLD + "" + (neededPlayers - playersInBed) + ChatColor.GRAY + " more Players are needed to change Time to day!"); + } + } else { + e.getPlayer().sendMessage(ChatColor.GRAY + "You can only sleep at Night or during a Thunderstorm"); + } + } + + @EventHandler + private void BedLeave(PlayerBedLeaveEvent e) { + main.getServer().broadcastMessage(ChatColor.GOLD + e.getPlayer().getName() + ChatColor.GRAY + " is no longer sleeping!"); + } + +} diff --git a/src/ml/codenoodles/lmve/modules/StatCounter.java b/src/ml/codenoodles/lmve/modules/StatCounter.java new file mode 100644 index 0000000..056e263 --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/StatCounter.java @@ -0,0 +1,495 @@ +package ml.codenoodles.lmve.modules; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +import org.bukkit.GameMode; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.PlayerDeathEvent; + +import ml.codenoodles.lmve.Main; + +public class StatCounter implements Listener{ + + private Main main; + public StatCounter(Main main) { + this.main = main; + } + + @EventHandler + private void BlockDestroyCounter(BlockBreakEvent e) { + Player p = e.getPlayer(); + UUID uuid = p.getUniqueId(); + File playerStats = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + long counter = player_stat.getInt(uuid + ".Statistics.Blocks.Destroyed"); + counter++; + player_stat.set(uuid + ".Statistics.Blocks.Destroyed", counter); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + + @EventHandler + private void BlockPlaceCounter(BlockPlaceEvent e) { + Player p = e.getPlayer(); + UUID uuid = p.getUniqueId(); + File playerStats = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + long counter = player_stat.getInt(uuid + ".Statistics.Blocks.Placed"); + counter++; + player_stat.set(uuid + ".Statistics.Blocks.Placed", counter); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + + @EventHandler + private void PlayerDamageCounter(EntityDamageEvent e) { + Entity entity = e.getEntity(); + if (entity instanceof Player) { + Player p = (Player) e.getEntity(); + if(p.getGameMode() == GameMode.SURVIVAL || p.getGameMode() == GameMode.ADVENTURE) { + UUID uuid = p.getUniqueId(); + File playerStats = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + double damage = player_stat.getDouble(uuid + ".Statistics.DamageTaken"); + damage = damage + e.getDamage(); + player_stat.set(uuid + ".Statistics.DamageTaken", damage); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + } + } + + @EventHandler + private void PlayerDeathCounter(PlayerDeathEvent e) { + Player p = (Player) e.getEntity(); + UUID uuid = p.getUniqueId(); + File playerStats = new File(main.getDataFolder() + "/Players", uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + int deaths = player_stat.getInt(uuid + ".Statistics.Deaths"); + deaths = deaths + 1; + player_stat.set(uuid + ".Statistics.Deaths", deaths); + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } + + @EventHandler + private void EntityKillCounter(EntityDeathEvent e) { + String ent_type = e.getEntity().getType().toString(); + Player p = (Player) e.getEntity().getKiller(); + UUID player_uuid; + if(p != null) { + player_uuid = p.getUniqueId(); + } else { + return; + } + File playerStats = new File(main.getDataFolder() + "/Players", player_uuid + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + //Friendly + int sheep, pig, chicken, bat, cat, cod, cow, donkey, fox, horse, mooshroom, mule, + ocelot, parrot, rabbit,salmon, skeletonhorse, squid, tropicalfish, turtle, villager, wanderingtrader, snowgolem; //PRE 1.15 + //Neutral + int enderman, pufferfish, dolphin, llama, panda, polarBear, traderLlama, wolf, ironGolem, zombiePigman; //PRE 1.15 + int bee; //1.15 + + //Hostile + int blaze, creeper, drowned, elderGuardian, endermite, evoker, ghast, guardian, husk, + magmaCube, phantom, pillager, ravager, shulker, silverfish, skeleton, slime, + stray, vex, vindicator, witch, witherSkeleton, zombie, zombieVillager; //PRE 1.15 + //Boss + int enderDragon, wither; + switch(ent_type) { + case "SHEEP":{ + sheep = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Sheep"); + sheep++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Sheep", sheep); + break; + } + case "PIG":{ + pig = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Pig"); + pig++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Pig", pig); + break; + } + case "CHICKEN":{ + chicken = player_stat.getInt(player_uuid + "Statistics.Kills.Friendly.Chicken"); + chicken++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Chicken", chicken); + break; + } + case "BAT":{ + bat = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Bat"); + bat++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Bat", bat); + break; + } + case "CAT":{ + cat = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Cat"); + cat++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Cat", cat); + break; + } + case "COD":{ + cod = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Cod"); + cod++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Cod", cod); + break; + } + case "COW":{ + cow = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Cow"); + cow++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Cow", cow); + break; + } + case "DONKEY":{ + donkey = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Donkey"); + donkey++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Donkey", donkey); + break; + } + case "FOX":{ + fox = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Fox"); + fox++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Fox", fox); + break; + } + case "HORSE":{ + horse = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Horse"); + horse++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Horse", horse); + break; + } + case "MOOSHROOM":{ + mooshroom = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Mooshroom"); + mooshroom++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Mooshroom", mooshroom); + break; + } + case "MULE":{ + mule = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Mule"); + mule++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Mule", mule); + break; + } + case "OCELOT":{ + ocelot = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Ocelot"); + ocelot++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Ocelot", ocelot); + break; + } + case "PARROT":{ + parrot = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Parrot"); + parrot++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Parrot", parrot); + break; + } + case "RABBIT":{ + rabbit = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Rabbit"); + rabbit++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Rabbit", rabbit); + break; + } + case "SALMON":{ + salmon = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Salmon"); + salmon++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Salmon", salmon); + break; + } + case "SKELETON_HORSE":{ + skeletonhorse = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Skeleton_Horse"); + skeletonhorse++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Skeleton_Horse", skeletonhorse); + break; + } + case "SQUID":{ + squid = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Squid"); + squid++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Squid",squid); + break; + } + case "TROPICAL_FISH":{ + tropicalfish = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Tropical_Fish"); + tropicalfish++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Tropical_Fish", tropicalfish); + break; + } + case "TURTLE":{ + turtle = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Turtle"); + turtle++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Turtle", turtle); + break; + } + case "VILLAGER":{ + villager = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Villager"); + villager++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Villager", villager); + break; + } + case "WANDERING_TRADER":{ + wanderingtrader = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Wandering_Trader"); + wanderingtrader++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Wandering_Trader", wanderingtrader); + break; + } + case "SNOWMAN":{ + snowgolem = player_stat.getInt(player_uuid + ".Statistics.Kills.Friendly.Snowman"); + snowgolem++; + player_stat.set(player_uuid + ".Statistics.Kills.Friendly.Snowman", snowgolem); + break; + } + case "ENDERMAN":{ + enderman = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Enderman"); + enderman++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Enderman", enderman); + break; + } + case "PUFFERFISH":{ + pufferfish = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Pufferfish"); + pufferfish++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Pufferfish", pufferfish); + break; + } + case "DOLPHIN":{ + dolphin = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Dolphin"); + dolphin++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Dolphin", dolphin); + break; + } + case "LLAMA":{ + llama = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Llama"); + llama++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Llama", llama); + break; + } + case "PANDA":{ + panda = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Panda"); + panda++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Panda", panda); + break; + } + case "POLAR_BEAR":{ + polarBear = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Polar_Bear"); + polarBear++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Polar_Bear", polarBear); + break; + } + case "TRADER_LLAMA":{ + traderLlama = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Trader_Llama"); + traderLlama++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Trader_Llama", traderLlama); + break; + } + case "WOLF":{ + wolf = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Wolf"); + wolf++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Wolf", wolf); + break; + } + case "IRON:GOLEM":{ + ironGolem = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Iron_Golem"); + ironGolem++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Iron_Golem", ironGolem); + break; + } + case "PIG_ZOMBIE":{ + zombiePigman = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Zombie_Pigman"); + zombiePigman++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Zombie_Pigman", zombiePigman); + break; + } + case "BEE":{ + bee = player_stat.getInt(player_uuid + ".Statistics.Kills.Neutral.Bee"); + bee++; + player_stat.set(player_uuid + ".Statistics.Kills.Neutral.Bee", bee); + break; + } + case "BLAZE":{ + blaze = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Blaze"); + blaze++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Blaze", blaze); + break; + } + case "CREEPER":{ + creeper = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Creeper"); + creeper++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Creeper", creeper); + break; + } + case "DROWNED":{ + drowned = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Drowned"); + drowned++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Drowned", drowned); + break; + } + case "ELDER_GUARDIAN":{ + elderGuardian = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Elder_Guardian"); + elderGuardian++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Elder_Guardian", elderGuardian); + break; + } + case "ENDERMITE":{ + endermite = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Endermite"); + endermite++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Endermite", endermite); + break; + } + case "EVOKER":{ + evoker = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Evoker"); + evoker++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Evoker", evoker); + break; + } + case "GHAST":{ + ghast = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Ghast"); + ghast++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Ghast", ghast); + break; + } + case "GUARDIAN":{ + guardian = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Guardian"); + guardian++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Guardian", guardian); + break; + } + case "HUSK":{ + husk = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Husk"); + husk++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Husk", husk); + break; + } + case "MAGMA_CUBE":{ + magmaCube = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Magma_Cube"); + magmaCube++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Magma_Cube", magmaCube); + break; + } + case "PHANTOM":{ + phantom = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Phantom"); + phantom++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Phantom", phantom); + break; + } + case "PILLAGER":{ + pillager = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Pillager"); + pillager++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Pillager", pillager); + break; + } + case "RAVAGER":{ + ravager = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Ravager"); + ravager++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Ravager", ravager); + break; + } + case "SHULKER":{ + shulker = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Shulker"); + shulker++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Shulker", shulker); + break; + } + case "SILVERFISH":{ + silverfish = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Silverfish"); + silverfish++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Silverfish", silverfish); + break; + } + case "SKELETON":{ + skeleton = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Skeleton"); + skeleton++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Skeleton", skeleton); + break; + } + case "SLIME":{ + slime = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Slime"); + slime++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Slime", slime); + break; + } + case "STRAY":{ + stray = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Stray"); + stray++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Stray", stray); + break; + } + case "VEX":{ + vex = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Vex"); + vex++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Vex", vex); + break; + } + case "VINDICATOR":{ + vindicator = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Vindicator"); + vindicator++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Vindicator", vindicator); + break; + } + case "WITCH":{ + witch = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Witch"); + witch++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Witch", witch); + break; + } + case "WITHER_SKELETON":{ + witherSkeleton = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Wither_Skeleton"); + witherSkeleton++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Wither_Skeleton", witherSkeleton); + break; + } + case "ZOMBIE":{ + zombie = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Zombie"); + zombie++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Zombie", zombie); + break; + } + case "ZOMBIE_VILLAGER":{ + zombieVillager = player_stat.getInt(player_uuid + ".Statistics.Kills.Hostile.Zombie_Villager"); + zombieVillager++; + player_stat.set(player_uuid + ".Statistics.Kills.Hostile.Zombie_Villager", zombieVillager); + break; + } + case "ENDER_DRAGON":{ + enderDragon = player_stat.getInt(player_uuid + ".Statistics.Kills.Boss.Ender_Dragon"); + enderDragon++; + player_stat.set(player_uuid + ".Statistics.Kills.Boss.Ender_Dragon", enderDragon); + break; + } + case "WITHER":{ + wither = player_stat.getInt(player_uuid + ".Statistics.Kills.Boss.Wither"); + wither++; + player_stat.set(player_uuid + ".Statistics.Kills.Boss.Wither", wither); + break; + } + } + try { + player_stat.save(playerStats); + } catch (IOException ex) { + // TODO Auto-generated catch block + ex.printStackTrace(); + } + } +} diff --git a/src/ml/codenoodles/lmve/modules/UUIDReference.java b/src/ml/codenoodles/lmve/modules/UUIDReference.java new file mode 100644 index 0000000..c12c78a --- /dev/null +++ b/src/ml/codenoodles/lmve/modules/UUIDReference.java @@ -0,0 +1,138 @@ +package ml.codenoodles.lmve.modules; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import ml.codenoodles.lmve.Main; + +public class UUIDReference implements Listener{ + + private Main main; + public UUIDReference(Main main) { + this.main = main; + } + + @EventHandler + private void CreateEntry(PlayerJoinEvent e) { + Player p = (Player) e.getPlayer(); + String dbPath = main.getDataFolder().getAbsolutePath(); + String playerName = p.getName(); + String uuid = p.getUniqueId().toString(); + + Connection conn; + boolean entryExists = false; + String path = "jdbc:sqlite:" + dbPath + "/" + "Players.db"; + try { //Try Connection + conn = DriverManager.getConnection(path); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return; + } + + try { //Check if Player is already listed + String query = "SELECT (COUNT(*) > 0) FROM tblPlayers WHERE UUID = ?"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, uuid); + ResultSet rs = pst.executeQuery(); + if(rs.next()) { + boolean found = rs.getBoolean(1); + if(found) { + entryExists = true; + } else { + entryExists = false; + } + } + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return; + } + + if(entryExists) { + + try { //Change Existing Entry + String query = "UPDATE tblPlayers SET Name = ? WHERE UUID = ?"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, playerName); + pst.setString(2, uuid); + pst.execute(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return; + } + } else { + int totalPlayers = 0; + try { //Get Total Players + Statement stmt = conn.createStatement(); + ResultSet res = stmt.executeQuery("SELECT COUNT(*) AS rowcount FROM tblPlayers"); + + res.next(); + totalPlayers = res.getInt("rowcount"); + res.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return; + } + + try { //Add Entry for new Player + Statement stmt = conn.createStatement(); + String query = "INSERT INTO tblPlayers VALUES (" + + (totalPlayers + 1) + "," + + "'" + playerName + "'," + + "'" + uuid + "');"; + stmt.execute(query); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + } + + try { //Close Connection + conn.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + } + } + } + + public UUID getUUID(String username) { + UUID uuid; + Connection conn; + String finalPath = "jdbc:sqlite:" + main.getDataFolder().getAbsolutePath() + "/" + "Players.db"; + try { //Try connection + conn = DriverManager.getConnection(finalPath); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return null; + } + + try { //Get Player + String query = "SELECT UUID AS uuid FROM tblPlayers WHERE Name = ?"; + PreparedStatement pst = conn.prepareStatement(query); + pst.setString(1, username); + ResultSet res = pst.executeQuery(); + res.next(); + uuid = UUID.fromString(res.getString("uuid")); + res.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx.getMessage()); + return null; + } + + try { //Close connection + conn.close(); + }catch(SQLException sqlEx) { + System.out.println("[LMVE]" + sqlEx); + } + + return uuid; + } + +} diff --git a/src/ml/codenoodles/lmve/other/ConsoleColor.java b/src/ml/codenoodles/lmve/other/ConsoleColor.java new file mode 100644 index 0000000..380534d --- /dev/null +++ b/src/ml/codenoodles/lmve/other/ConsoleColor.java @@ -0,0 +1,15 @@ +package ml.codenoodles.lmve.other; + +public class ConsoleColor { + + public static String RESET = "\u001B[0m"; + public static final String BLACK = "\u001B[30m"; + public static final String RED = "\u001B[31m"; + public static final String GREEN = "\u001B[32m"; + public static final String YELLOW = "\u001B[33m"; + public static final String BLUE = "\u001B[34m"; + public static final String PURPLE = "\u001B[35m"; + public static final String CYAN = "\u001B[36m"; + public static final String WHITE = "\u001B[37m"; + +} diff --git a/src/ml/codenoodles/lmve/other/GlobalMute.java b/src/ml/codenoodles/lmve/other/GlobalMute.java new file mode 100644 index 0000000..0731bb8 --- /dev/null +++ b/src/ml/codenoodles/lmve/other/GlobalMute.java @@ -0,0 +1,24 @@ +package ml.codenoodles.lmve.other; + +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import ml.codenoodles.lmve.Main; + +public class GlobalMute implements Listener{ + + private Main main; + public GlobalMute(Main main) { + this.main = main; + } + + @EventHandler + public void GlobalChatMute(AsyncPlayerChatEvent e) { + if(main.getConfigFile().getBoolean("Chat.global-mute")) { + e.getPlayer().sendMessage(ChatColor.GOLD + "Chat is disabled on this server."); + e.setCancelled(true); + } + } +} diff --git a/src/ml/codenoodles/lmve/other/RemoveVanillaRecipes.java b/src/ml/codenoodles/lmve/other/RemoveVanillaRecipes.java new file mode 100644 index 0000000..78bd92f --- /dev/null +++ b/src/ml/codenoodles/lmve/other/RemoveVanillaRecipes.java @@ -0,0 +1,34 @@ +package ml.codenoodles.lmve.other; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.inventory.ItemStack; + +import ml.codenoodles.lmve.Main; + +public class RemoveVanillaRecipes implements Listener{ + + private Main main; + public RemoveVanillaRecipes(Main main) { + this.main = main; + } + + // 1 2 3 Inventory IDs + // 4 5 6 -> 0 + // 7 8 9 + + @EventHandler + public void removeMinecraftRecipes(PrepareItemCraftEvent e) { + if(main.getConfigFile().getBoolean("RemoveVanillaRecipes.magma-block")) { + if(e.getInventory().getItem(0) != null){ + if(e.getRecipe().getResult().getType().equals(Material.MAGMA_BLOCK) && (e.getView().getItem(5).getType() == Material.MAGMA_CREAM || e.getView().getItem(1).getType() == Material.MAGMA_CREAM)) { + e.getInventory().setResult(new ItemStack(Material.AIR)); + } + } + } + } + + +} diff --git a/src/ml/codenoodles/lmve/other/WelcomeBossBar.java b/src/ml/codenoodles/lmve/other/WelcomeBossBar.java new file mode 100644 index 0000000..d3e2ba3 --- /dev/null +++ b/src/ml/codenoodles/lmve/other/WelcomeBossBar.java @@ -0,0 +1,53 @@ +package ml.codenoodles.lmve.other; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.NamespacedKey; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import ml.codenoodles.lmve.Main; + +public class WelcomeBossBar implements Listener{ + + private Main main; + public WelcomeBossBar(Main main) { + this.main = main; + } + + @EventHandler + public void PlayerWelcome(PlayerJoinEvent e) { + NamespacedKey joinbossbar = new NamespacedKey(main, "joinbossbar_" + e.getPlayer().getUniqueId()); + Bukkit.createBossBar(joinbossbar,ChatColor.GREEN + "Welcome on " + ChatColor.GOLD + main.getConfigFile().getString("server-name"), BarColor.PURPLE, BarStyle.SEGMENTED_10).addPlayer(e.getPlayer()); + new BukkitRunnable() { + int times = 0; + @Override + public void run() { + if(times < 5) { + Bukkit.getBossBar(joinbossbar).setProgress(Bukkit.getBossBar(joinbossbar).getProgress() + 0.19f); + } + if(times == 5) { + Bukkit.getBossBar(joinbossbar).setProgress(1.0f); + } + if(times == 6) { + Bukkit.getBossBar(joinbossbar).setTitle(ChatColor.GREEN + "Have Fun!"); + } + + if(times == 8) { + Bukkit.getBossBar(joinbossbar).removePlayer(e.getPlayer()); + Bukkit.removeBossBar(joinbossbar); + this.cancel(); + } + times++; + } + }.runTaskTimer(main, 0L, 20L); + + } + + + +} diff --git a/src/ml/codenoodles/lmve/sounds/ChatNotification.java b/src/ml/codenoodles/lmve/sounds/ChatNotification.java new file mode 100644 index 0000000..3d82f98 --- /dev/null +++ b/src/ml/codenoodles/lmve/sounds/ChatNotification.java @@ -0,0 +1,40 @@ +package ml.codenoodles.lmve.sounds; + +import java.io.File; + +import org.bukkit.Bukkit; +import org.bukkit.Instrument; +import org.bukkit.Note; +import org.bukkit.Note.Tone; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import ml.codenoodles.lmve.Main; + +public class ChatNotification implements Listener{ + + private Main main; + public ChatNotification(Main main) { + this.main = main; + } + + @EventHandler + private void ChatNotifiy(AsyncPlayerChatEvent e) { + if(!main.getConfigFile().getBoolean("Chat.global-mute")) { + for(Player players : Bukkit.getOnlinePlayers()){ + File playerStats = new File(main.getDataFolder() + "/Players", players.getUniqueId() + ".yml"); + FileConfiguration player_stat = YamlConfiguration.loadConfiguration(playerStats); + if(player_stat.getBoolean(players.getUniqueId() + ".Settings.Sounds.ChatNotify")) { + if(players.getPlayer().getName() != e.getPlayer().getName()) { + players.playNote(players.getLocation(), Instrument.BANJO, Note.natural(1, Tone.C)); + } + } + } + } + } + +}