From f63d748a3d5d5bd55adf1b6ba07fb2070e7ca4a1 Mon Sep 17 00:00:00 2001 From: Brandon <46827438+disclearing@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:52:19 +0100 Subject: [PATCH] !! --- .classpath | 12 + .project | 17 ++ .settings/org.eclipse.jdt.core.prefs | 11 + bin/com/houndpvp/hub/Hub.class | Bin 0 -> 6039 bytes .../hub/commands/BuilderCommand.class | Bin 0 -> 1787 bytes .../houndpvp/hub/commands/ClearCommand.class | Bin 0 -> 1162 bytes .../hub/commands/GamemodeCommand.class | Bin 0 -> 4107 bytes .../hub/commands/InvSelectorCommand.class | Bin 0 -> 1228 bytes .../houndpvp/hub/commands/MsgCommand.class | Bin 0 -> 3923 bytes .../hub/commands/RawcastCommand.class | Bin 0 -> 2114 bytes .../houndpvp/hub/commands/ReplyCommand.class | Bin 0 -> 2774 bytes .../hub/commands/SetSpawnCommand.class | Bin 0 -> 1465 bytes .../houndpvp/hub/commands/SoundsCommand.class | Bin 0 -> 1678 bytes .../hub/commands/TeleportCommand.class | Bin 0 -> 3134 bytes .../hub/commands/TogglePMCommand.class | Bin 0 -> 1787 bytes .../hub/inventory/SelectorInventory.class | Bin 0 -> 3656 bytes .../hub/listeners/DoubleJumpListener$1.class | Bin 0 -> 1460 bytes .../hub/listeners/DoubleJumpListener.class | Bin 0 -> 3789 bytes .../houndpvp/hub/listeners/Listeners$1.class | Bin 0 -> 1481 bytes .../houndpvp/hub/listeners/Listeners.class | Bin 0 -> 13057 bytes .../hub/scoreboard/ScoreboardProvider.class | Bin 0 -> 3577 bytes .../providers/PlayerScoreboard.class | Bin 0 -> 6282 bytes .../providers/ScoreboardEntryProvider.class | Bin 0 -> 330 bytes .../providers/ScoreboardManager.class | Bin 0 -> 6430 bytes .../providers/reflection/Reflection$1.class | Bin 0 -> 1910 bytes .../providers/reflection/Reflection$2.class | Bin 0 -> 1538 bytes .../providers/reflection/Reflection$3.class | Bin 0 -> 1498 bytes .../Reflection$ConstructorInvoker.class | Bin 0 -> 345 bytes .../reflection/Reflection$FieldAccessor.class | Bin 0 -> 527 bytes .../reflection/Reflection$MethodInvoker.class | Bin 0 -> 353 bytes .../providers/reflection/Reflection.class | Bin 0 -> 10473 bytes .../reflection/ReflectionConstants.class | Bin 0 -> 3622 bytes bin/com/houndpvp/hub/tablist/Azazel$1.class | Bin 0 -> 1277 bytes bin/com/houndpvp/hub/tablist/Azazel.class | Bin 0 -> 5219 bytes bin/com/houndpvp/hub/tablist/AzazelTask.class | Bin 0 -> 5588 bytes .../tablist/tab/Provider/TabProvider.class | Bin 0 -> 1805 bytes .../tablist/tab/Tab$TabEntryPosition.class | Bin 0 -> 923 bytes .../Tab$UpdatedPacketPlayOutPlayerInfo.class | Bin 0 -> 492 bytes bin/com/houndpvp/hub/tablist/tab/Tab.class | Bin 0 -> 8731 bytes .../houndpvp/hub/tablist/tab/TabAdapter.class | Bin 0 -> 225 bytes .../hub/tablist/tab/TabTemplate.class | Bin 0 -> 2409 bytes bin/com/houndpvp/hub/utils/Bungee$1.class | Bin 0 -> 1351 bytes bin/com/houndpvp/hub/utils/Bungee$2.class | Bin 0 -> 1834 bytes bin/com/houndpvp/hub/utils/Bungee.class | Bin 0 -> 4178 bytes bin/com/houndpvp/hub/utils/ItemBuilder.class | Bin 0 -> 6547 bytes bin/com/houndpvp/hub/utils/SpawnUtils.class | Bin 0 -> 2422 bytes bin/com/houndpvp/hub/utils/SpigotUtils.class | Bin 0 -> 7605 bytes bin/config.yml | 80 +++++ bin/plugin.yml | 22 ++ config.yml | 72 +++++ out/HoundHub.jar | Bin 0 -> 57247 bytes plugin.yml | 22 ++ src/com/houndpvp/hub/Hub.java | 107 +++++++ .../houndpvp/hub/commands/BuilderCommand.java | 47 +++ .../houndpvp/hub/commands/ClearCommand.java | 19 ++ .../hub/commands/GamemodeCommand.java | 125 ++++++++ .../hub/commands/InvSelectorCommand.java | 26 ++ src/com/houndpvp/hub/commands/MsgCommand.java | 93 ++++++ .../houndpvp/hub/commands/RawcastCommand.java | 48 +++ .../houndpvp/hub/commands/ReplyCommand.java | 47 +++ .../hub/commands/SetSpawnCommand.java | 27 ++ .../houndpvp/hub/commands/SoundsCommand.java | 31 ++ .../hub/commands/TeleportCommand.java | 71 +++++ .../hub/commands/TogglePMCommand.java | 32 ++ .../hub/inventory/SelectorInventory.java | 50 ++++ .../hub/listeners/DoubleJumpListener.java | 66 +++++ src/com/houndpvp/hub/listeners/Listeners.java | 275 ++++++++++++++++++ .../hub/scoreboard/ScoreboardProvider.java | 57 ++++ .../providers/PlayerScoreboard.java | 112 +++++++ .../providers/ScoreboardEntryProvider.java | 9 + .../providers/ScoreboardManager.java | 94 ++++++ .../providers/reflection/Reflection.java | 200 +++++++++++++ .../reflection/ReflectionConstants.java | 60 ++++ src/com/houndpvp/hub/tablist/Azazel.java | 101 +++++++ src/com/houndpvp/hub/tablist/AzazelTask.java | 105 +++++++ .../hub/tablist/tab/Provider/TabProvider.java | 60 ++++ src/com/houndpvp/hub/tablist/tab/Tab.java | 218 ++++++++++++++ .../houndpvp/hub/tablist/tab/TabAdapter.java | 9 + .../houndpvp/hub/tablist/tab/TabTemplate.java | 104 +++++++ src/com/houndpvp/hub/utils/Bungee.java | 122 ++++++++ src/com/houndpvp/hub/utils/ItemBuilder.java | 249 ++++++++++++++++ src/com/houndpvp/hub/utils/SpawnUtils.java | 52 ++++ src/com/houndpvp/hub/utils/SpigotUtils.java | 224 ++++++++++++++ src/config.yml | 80 +++++ src/plugin.yml | 22 ++ 85 files changed, 3178 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 bin/com/houndpvp/hub/Hub.class create mode 100644 bin/com/houndpvp/hub/commands/BuilderCommand.class create mode 100644 bin/com/houndpvp/hub/commands/ClearCommand.class create mode 100644 bin/com/houndpvp/hub/commands/GamemodeCommand.class create mode 100644 bin/com/houndpvp/hub/commands/InvSelectorCommand.class create mode 100644 bin/com/houndpvp/hub/commands/MsgCommand.class create mode 100644 bin/com/houndpvp/hub/commands/RawcastCommand.class create mode 100644 bin/com/houndpvp/hub/commands/ReplyCommand.class create mode 100644 bin/com/houndpvp/hub/commands/SetSpawnCommand.class create mode 100644 bin/com/houndpvp/hub/commands/SoundsCommand.class create mode 100644 bin/com/houndpvp/hub/commands/TeleportCommand.class create mode 100644 bin/com/houndpvp/hub/commands/TogglePMCommand.class create mode 100644 bin/com/houndpvp/hub/inventory/SelectorInventory.class create mode 100644 bin/com/houndpvp/hub/listeners/DoubleJumpListener$1.class create mode 100644 bin/com/houndpvp/hub/listeners/DoubleJumpListener.class create mode 100644 bin/com/houndpvp/hub/listeners/Listeners$1.class create mode 100644 bin/com/houndpvp/hub/listeners/Listeners.class create mode 100644 bin/com/houndpvp/hub/scoreboard/ScoreboardProvider.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$1.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$2.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$3.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$ConstructorInvoker.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$FieldAccessor.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$MethodInvoker.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.class create mode 100644 bin/com/houndpvp/hub/scoreboard/providers/reflection/ReflectionConstants.class create mode 100644 bin/com/houndpvp/hub/tablist/Azazel$1.class create mode 100644 bin/com/houndpvp/hub/tablist/Azazel.class create mode 100644 bin/com/houndpvp/hub/tablist/AzazelTask.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/Provider/TabProvider.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/Tab$TabEntryPosition.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/Tab$UpdatedPacketPlayOutPlayerInfo.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/Tab.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/TabAdapter.class create mode 100644 bin/com/houndpvp/hub/tablist/tab/TabTemplate.class create mode 100644 bin/com/houndpvp/hub/utils/Bungee$1.class create mode 100644 bin/com/houndpvp/hub/utils/Bungee$2.class create mode 100644 bin/com/houndpvp/hub/utils/Bungee.class create mode 100644 bin/com/houndpvp/hub/utils/ItemBuilder.class create mode 100644 bin/com/houndpvp/hub/utils/SpawnUtils.class create mode 100644 bin/com/houndpvp/hub/utils/SpigotUtils.class create mode 100644 bin/config.yml create mode 100644 bin/plugin.yml create mode 100644 config.yml create mode 100644 out/HoundHub.jar create mode 100644 plugin.yml create mode 100644 src/com/houndpvp/hub/Hub.java create mode 100644 src/com/houndpvp/hub/commands/BuilderCommand.java create mode 100644 src/com/houndpvp/hub/commands/ClearCommand.java create mode 100644 src/com/houndpvp/hub/commands/GamemodeCommand.java create mode 100644 src/com/houndpvp/hub/commands/InvSelectorCommand.java create mode 100644 src/com/houndpvp/hub/commands/MsgCommand.java create mode 100644 src/com/houndpvp/hub/commands/RawcastCommand.java create mode 100644 src/com/houndpvp/hub/commands/ReplyCommand.java create mode 100644 src/com/houndpvp/hub/commands/SetSpawnCommand.java create mode 100644 src/com/houndpvp/hub/commands/SoundsCommand.java create mode 100644 src/com/houndpvp/hub/commands/TeleportCommand.java create mode 100644 src/com/houndpvp/hub/commands/TogglePMCommand.java create mode 100644 src/com/houndpvp/hub/inventory/SelectorInventory.java create mode 100644 src/com/houndpvp/hub/listeners/DoubleJumpListener.java create mode 100644 src/com/houndpvp/hub/listeners/Listeners.java create mode 100644 src/com/houndpvp/hub/scoreboard/ScoreboardProvider.java create mode 100644 src/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.java create mode 100644 src/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.java create mode 100644 src/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.java create mode 100644 src/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.java create mode 100644 src/com/houndpvp/hub/scoreboard/providers/reflection/ReflectionConstants.java create mode 100644 src/com/houndpvp/hub/tablist/Azazel.java create mode 100644 src/com/houndpvp/hub/tablist/AzazelTask.java create mode 100644 src/com/houndpvp/hub/tablist/tab/Provider/TabProvider.java create mode 100644 src/com/houndpvp/hub/tablist/tab/Tab.java create mode 100644 src/com/houndpvp/hub/tablist/tab/TabAdapter.java create mode 100644 src/com/houndpvp/hub/tablist/tab/TabTemplate.java create mode 100644 src/com/houndpvp/hub/utils/Bungee.java create mode 100644 src/com/houndpvp/hub/utils/ItemBuilder.java create mode 100644 src/com/houndpvp/hub/utils/SpawnUtils.java create mode 100644 src/com/houndpvp/hub/utils/SpigotUtils.java create mode 100644 src/config.yml create mode 100644 src/plugin.yml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..81a5f98 --- /dev/null +++ b/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..2b3d759 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + HoundPvP Hub + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bin/com/houndpvp/hub/Hub.class b/bin/com/houndpvp/hub/Hub.class new file mode 100644 index 0000000000000000000000000000000000000000..ad961ae111b47122c7faac977c9f1b531c4fd999 GIT binary patch literal 6039 zcmbtYd0-q>8UMXa(n&W1l%$k`g>Gp}lazKSr4+kuDWnAoNs~6ErA39=&2%$lcV?NH z-4H-gLGcC;R6IeEiXw6~ZKxnt1x36S@B2VJ@D>#WfA7ugW;eSDt?nQ5_IvNU-gmw4 zy+@zB|3Lt!ie?QlfthJHXAHUpXCPn98-st&2oVQ9z>jC{6`u^r=5 zvuGOU@zbYZfo9wB1Jg-c0<*g7aY_m_`=-b&KgCtkR@ZT*}iYP zj?q{COQOc~pcx1pUynvE8D0DkZ(6G0WGsrGTPwa0*je8=OCd--{Jc5r2+W@hvtO=X zAc-X7)wW{?YXutGJGN1uE_c9+qXBI?j=+rR5I9PQhGzNiXdTlL7dWEZcC1Z>T*~sc znyD8-qcc_GosU4UU|S<2cOKaJ;~g6(&DRSzbp1^8}`6tf1S? zWGqi$PJ2hUa)jKUk>#xIWQ=e%*^K$bSTe;gj)hpH;Y5MilX20}jt&8B*z_Fo=2qK7 ziCL49`U8)X$&PK!SS;|Ot=vq4ag#{9o|PCh{Y1*LoJ7tXu$r+%;MiTRmk0)}#D>eQ zTwk#-vB?UCU2iCn8fk_>-g0fgDq2}LpR=4G5m;t!o`z+Nz?z5(T{`ZlI8MfL>5)?f zj%lxTEMu99N*|r3<1id9@lV(BV$7gRv#vQHmy$Y~Fim=4jgGZABQ$rv9Zco_bmn}`E*qCi83lj1XDS%j7lG#BM=Ycw#)Sf zTCfr4YdB9}VTB@-GtkkE9)aULD`WeC<@FYVj7yh=Nz24>94jkev{&vcVi)2h>$zJ) zFPTo_l2F??HetCm=@uO=(52#AbzA@@P+6Oe4q4P{bMql-Q%Cc0ONM)p_B1nAw={uc zdC4j-M!S6hnk~wJo*A$_CF9)Ig*tX%r@#!~3JUr0g2ilRnb;{&UZUfr5@otVkyT30 zUaaF1m|Aku2O5K1$4*;>o1YLnnx+zISQ-ZCy^2sc7*ZX(K%ttO zm%E|Ds}5a!Z%9imYz%3*lv#C%T0|UlWRYWrq}}|;dTW^W366V0i{hcREA^S52%si8pWlO^q0xN6u@@1h-xu!Q@%3bPs3FLOQ#|pCmG+-l~~@4t69|#>|SwTcUG0`ZGDLYyH{Q%KP;z9mc=oGSII5E zT44Bp+wu!+VS^KRBPFHk)*@M~uhsDyyq3wxIvb^YxOE=!)v+CAdlgbr!|MbV)EG#{ zg{&98QK}q%9M_?(1#iTgHN1)8R1x#_IO})|t`|7GRDL%Ud8#qIPp`5S4?HI*%ShHK zXra0)4&ExTWC~5!y9Krp=M{4KlFo75fVO75g9)E1*jYxdtU~Y9@h-fZ2||l?xw)L_ zu#lWq?`*GBhk_-h5$Y4s(R}X_Xs=N!LY8fp5*wk%ag)rI_v3>aJ|K{&FkwVd&0fdN zxJ96aMU*j^E(9*~cu|!BOLUQh5}N8uKFsclq^jZ5@DU!q#IEjgBXVYr6{vn9;uFWM zG6z0N%X#K-+VlerADeQgTSBxl{q557pWum*^D`PgSue=S!h8HoneI+WcMtni&&p>< zG~6d}A`vH1dy7OW)7~p-_p)pCWhd`z7^Ar+C+=5RW$JyB`ct%7#>`ncHo6)foYH3J zM0jNm4@eH5p~Gya=v!GUO^0dttiVZ=E3wfj_D85?J_jV9hXrCmUc(or)L|=W^R8D4 z#N%7JLWa)9_vP z;uRTD#ZJffWiK8dveQGM09q%XXJ0+J1_Fom2WEPx$ISCU$*6{>>!|Rch%0AmpTYhwIh4L$`5tY~p zXskcKWmX>Sjj{#5$5R^qQ1@0lfwhi5;!nKHQMbwlP+(nUrR>U@zF)Vg42dky8i*K| zPqH}vg1>3_tH9#g4Ngj?RakazI0RFaVU&d*So9Nzu&K=`<~@JwT}DBmwSPp|66*QS#mA6DJ{6M{9ZA; zUYN`KVweoFxo4`MM65bm*54M-42qCFKaaTjgyR~8mx1u!#IUTVO_)OE2aGt&wwJc# zt$;dG)ul25FppW)z!#k+G|PJ||3N-XsFBYSYUE{%V@zIwIku33j~M(ONoWJ-1;-;g z_oB5^?7>X=nRT}!n9Xl18u^{e?*hJaoJbaPaSUhlkPOEvp{y_^ma!NWAxkm14|7^i z7{vlPc1Gh#(YQ1k<$C9SoV`>=To{f*epwe9kA(RPY@*(g$tqZpL`o&C6s)c%gWDC|XXKSl^$DS5rT^%Z;Z z%6+(IKd$5I>pRErh6X732EuO(;m+2#kK)GtxQSEm9mV@PTR)`WTP2Iz)WmKzaXS${ zuHZWqd?(?%6nwXW?p|hZKB(@aGi#c?Ca0_=^gDRKbrC z{tDr7UlrLH154=srSyh@*?jOwU>P5DPQmF|j@4Mf*MZY;Ayy*CcMuP&FpMOw;mUPb zgBx)MZo@i^vPwUUEXyR#=lDfLyq4Hf_O#B$4AXI=$JOk`q`9O*!)Xx* z;;X#lxh-E0B3@TVycRJ&e>sL<@i2UH48Mz^yL0g<{`?T0l!ST)gO^OOms zPlR-ML{aJFnG;FoE0VBwm7OeNqM;7)tck=6>k>B#S?(r=*XD`Di|P`~f*ljue*r_0 B$NvBT literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/BuilderCommand.class b/bin/com/houndpvp/hub/commands/BuilderCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..02602e08eab6ad3b46ecec9d0d5a1b608d6665d2 GIT binary patch literal 1787 zcma)6TXWM!7(MHIV&!UrNo#^gxY%*9N}(5UnnF@2El$gfJE5dcYiY5S*ej2;$}~Tv z`2)Q0(92Ajv@@NS$Nr`c!?&_R-C#mJBTM^T_nbZ7{{7;&KLA|EW)=yCvhDS(ju%R& zzt^`qVap;zk4q=8)JoyHKH=1a=X@T-{<=cH&Atkv8LOWT!p@1xH>9kwK3F5Nad=1 z>p_?A3%|Zb`MFiQ>q=LxF(k{CEr!&F=ZGw(7z!ggj$;xt24-O}WLBfZF)*AmkVTGR zs^LoURoH6@{~O-w(w=4;p3S>k+;{alGL9pO8ET|DE&*F^{9iUTT2IC#F+460Bcmev z1dcdt3Q5OMKOv$%AS*hTrt)3cu7CHssj{8LS%x!j;xLDE3@gu{*pIx>?1h0cTf*dK zKO)#vo*4$h)IiO6gS9-)V=0S826L$B$n6`rfQtepCZ!!| zvKH$mj}j^dmQiJx=H`PlQ1Ln>iO zE8{%_SMffH%J!tem@yi& zN6M_})EfqF>eM86oE%me&Od*`^$A3ILXJqIKAJ{BQ?+=4Dq`JGX}jkzluigGIWk)d z{NMSGbwt|cew)A-MktE1`V8+37yj>5(or=Pw|6&rKc1m{Td4SAp`yidWzh1qyWrYr z&s%PQ@unC0wz%u+aV^As;wh_XY$RCXgPt@!V|vh|H;}+MQnbp$Aj<^ZkX5qjU;cMY zK6-}fUr_jomI=(!e};m9DV&ZhpcP#saiT?U?M*K~L-BaZM3kaKDFA0MPj8|S@6tbY zWkqU`A)BoJh0*~gsjxC$ z&ub6K{oyh9!7KO2+Fg&`si)L2839|zG<_F{nNtLB4l}gFBJFO8#%~2@QGkPtm(dYjhzbHJ!u(@oAAL6WBVXesyz0Bh literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/ClearCommand.class b/bin/com/houndpvp/hub/commands/ClearCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..fe4f6c25044a54449ec31933367363d194348815 GIT binary patch literal 1162 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 literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/MsgCommand.class b/bin/com/houndpvp/hub/commands/MsgCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..ec2afa882355ea3932116ab7ae0ef27df96c2e38 GIT binary patch literal 3923 zcma)9>vt689e&>0Ldx{*d#{DLL`z9bV(?&h?C7^Gq5|e?96g$ zZM8~UZ?$Ue1$vX-(u>uCHYB3dQ+xWM$M&4|tA9XGPtWPso}Sj)=bhP2CM2MT!|eP1 z-rxP6KmPBns{roAZ&fG)4H-9|9Cu63XyIfbIbIq`5|B5YQ7_r=WmDl$5CmIABONiD zH({i@OLmUpYtewXhGzOV?`3PT30qWbo|9)GzK&M35pJC*nK`dF>$pWLWqR~lUGqXZ zX}DcL! zt79?hai5O8Qq#pAwdfCRlrFqq$3FDY?vrM&WDSfld!h=4h1;ys#V?EOVI4>D2$3_caenTIO>&3Ly(fPI>upB%|gj%XNj6zmJo?iMdo~vWOZCe4tcVog&!Z9 zGB2sUtD_*jrjLZ3YDk7x1Ka7XO*@-=if-O$8fy&GsuhPd4%!2lu)^P@(WkSiAc(Q+|=5&_10dDEL4(C~x zl1WD`9>o__d|sgO6A|cmOjd?Wy>w}8%swsC<%>F=kWi`GelySBya{J@dx=ui|-uHGa`_yqxJ#J#w1(3@N)Wt0z*)m4}WRd=uYR@h$e%$a7kbPaWrQUf`zm zU@EmIo$eXzJG!^`U@)U*XMKR#5!+>e!>u0Q)A4=$fDw`@7`zE=nUg3plB4Q`TzYz1 zhBRDYS+E~#_>sVBW8CzNLeV}+e;MT_=^5_WSeu5Q2y7+dVYg&tOlPBCc{e;aZ@G?T zoU;9K8VCA4BOK?W8YUPG(j8=kjIdG++cO;3H{5a~s+QeU=6HQnNlst65LMQi z^6;d#nLOLmnj4_9K?^pW`1}xa7@5T^6JW&xW0h0|`XI`9ZkbWG=TptZJjRtlLl*2< zqL-7(ry$vFmZW_%bDY~&uwAH_7BC{AU(iYwSE$JKu~fXy?T%3_W~?4tE;37Jx5hS^ z#aPb`Xc7Nc@mnKTBA#owfGVivFBhYkyUsh;qsU$1nX4AR%SdsAG=jeyHeJT@D_C*( zGV0#I%9+!unbYcvfq*squB2f3jo}uuTE%|}rt50lMyMXL!&RRL5f`i@~-_FB1bYfLqP^w}()Cp`zR7-slu{w3@6ne=w z-XHSh_t05Y)TurC2k~Y?o5rBPIdSe1Rwt^aaadpyN6w>e z_8yypIf=1D5<>Jj7~wsNQQ>jyU5re^IVakpbQLK6nb4Ls#ZSb&K>4aElqT`HP=Be$ z<5CUjm`OYt|4KsT&lH{xyp*US;n&K9+8jb^6D1@?nKmH2gq39rr5ORDG-_qps2Q;m zxat~9EB9GTE09Ud*yJbZ)M>mZa0%ate@CCjcdIagBT{2&X8aXKXGV5s{D+~56~iX5 zEwJs!vjC{Vv!BFN1CGq&-&7S+t&rOez_%chx?Un z=u>u}UpayS#Xc*@~ literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/RawcastCommand.class b/bin/com/houndpvp/hub/commands/RawcastCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..9a210f402e0fdda02e6a6f00205c84cb24aeb999 GIT binary patch literal 2114 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 literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/SoundsCommand.class b/bin/com/houndpvp/hub/commands/SoundsCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..6767e68fdd90aa88d7bed13efa93a63d6780b682 GIT binary patch literal 1678 zcma)6OH&kA6#g#r=wWC?2SG4IN8)1!krqXKjKK$BL}tWfgp|0t({t@<=;0e`AbQqJpG_(o|Q#E?$_sh=bW$4Ie-86*Jl7@cr2lf;hbtU zm4@Y+_0~#DX?Qh-fF?KVj#BkeXEHoWNHQE=;wxM+xTz^~wI!jt64DHVmaQo@Z+TgF zH=UKpYx;#yJ=d}s(l>QecPAJUh2jE3a?+}cEE4FDAtA%iRn|@M&}-I&{g~Gb!H_Fk zDmNCmt^4N)Ou7x-VJMdWXWAu(cFT;iVR%+3@1JZ{m~~;74zMVdw*;uVwr*;rr@Nuz zqJ(aSzE~t-y1KijJTmy2uruf(J)A(@ERLaHLfMl&s2Omc^m z=_%|Lv>o5$q=XX;r}r19;%Jc=GJ23_=nknoS2vXV+-X#JtJHxU24(z!(+nM&aOX|^ zxhH1o^iK-KnEm|x%v33hvnWV7$8aPNC(b0Jh#}%oEz{+?>CB3?9odI%R4OiJF^mxj z7dB~vCcA4{hTx_Q1s55l6>fN9?ioXGVKK@hZWg3+NycT2QJb|qm*HAmsVG)VyUpmk zA-}3|8CP+Qs7L~avwKj*lZd$dI&R1)`E{qmU*~iEC}YCsO537ot%wY6GYoxQSD#p3 zepNS&ylLeP%hZIOZwPMZo5FFpCh}pIjQD@#u8c`ck(v(mX(jx=L(Qlsiwhatqc-@u z&SU(mdouf-81y~O@d2G5%?62~HmMH=4lt#WW2!&CyJm&Pp4%FYZ}%QkLtZV0<8k6` zQ$w_!RhO&F)S=Nb$kK+gRdG)b*2T7UHR1=yDNw?6rD)-`(UUd}-P`G;(38K_|V-p#ct|i%v9%I6`-FX19qnP1yVMUy!?zx{y1%f!^16`2hp{sZTh? zuz@pg(6e<;{)zJ&82xn%*}#=A7!L94uc5@h+>F^JBG3L*?$#&VX~Q~(_p{xMLblU^ zZSr@@GC`F9<3UZGl(%0`7fw<=qtsQi=*ANq#WJk}7rj`eh4dTx@CyBShk?LrBCIx2 zg6hUkxF4wV9y54A()!pe$`s3gtKcD$ D_~Ecs literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/TeleportCommand.class b/bin/com/houndpvp/hub/commands/TeleportCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..be8622e7f0624c6928d96b420d851a79ebda1fbc GIT binary patch literal 3134 zcma)8TZ|J`82-+-+bP{5YhhW+%@MV97ifXyUIf_%WOaenMUds@YLLsJxtxK7c^XO2ua^^9tmE3lv;lC<2SJDDCfjY;W*(M1Xh z(jf)ih-+BT#I5f*iiKE2yF6Vr%*tTivK={KRLD$MvQ@}1mIy?c!<1WAt~(IJ15xP8 z$?Sqr8J13|Sg90kD}rTsSi?gC_ctKy_c9p8BS?_4ymWo60;yKv8aZlOTSh}tp!-gm z`m05g+=kIhG>Pnig4D|%7kUKCu~MmE)eI{;s79otSdBH*kx?!)O9HD}qM9LWCX7CT zd3x5anmOIFU42aI<4X4_<$Qe<8?aFz?Aku}9GmQ!PI3gB!S!tsSYk;xUCNzUPvKj6 zDbq%|m>wt?EEm&uqS%T@1s1!GVO31Sl{-vVIu;vVx6(dEygWHDJw%JBDv{fxcuW!0 zQQ_kE%1Xt^dkOB3VgNf8@>;nPT9d+Sx!L8(FViy`#%>l{Le|S$=Jdp76=6>lgNg%< zncruWWEfA9g@n{yTc5P6j&8CXU8*M)#$GB%Ph>4yFW(jw&HL4aY|)x9%wkSAoP4#! z@D=tv#kx04GmH_|bs{x+9soZ~B`re_Lk zjEN>qzM3no=%QLzdXje}S&^Rpq-9t0g~nMqTTi=X-J^*}JE!wo5Qr!G8ZyV!)QTvv zIgFDk%*I4%)jj@&VKNNUU-zi*k!CpzOJJj(=Umh-&wmIc#mkzARG$f(lvIC=VVD>Ikc! zLA6bt1GCK3T?X=`2$*B!BsRS)xm{Dwj5N2!c2Cz__QFQjwXz%bwm3Q#F85}V;T!0u z!(YY#_aJu7ZHQRcB=^Y?*T|mQYm~jiPs1Amdc%g@a-AC9B9xg&X*jFloWP>HR1~3( zu;R0FcTpY0^XmGj9ik~!W_S>!i@$bWC))VtDbD9Cex>;qe7E;rMdS;wJIZIsGtS0r zwxj+4+=n^*q6%?8pPU@HK!*`}oW0^3#J04@gE!hQ$!>*s_P0;G4;5Db=R=zI<~dp6Y*s{6mP$d z9c?&td%`X?A#@#&3#d6y+&Sk}H8M6d<;3<3`=$)Xi8Odw1U#g}9?}np^ywPXiEB7; zBX|kN_&&U4){PC}zy|FTbjN3PX=@eyI;1x>(WP~TKf3k1HzRiq&$7F|Fdyd?9FG}y zK*X;eqU>!%_|Y@SDZ|$a+l*`lTC#<=br9>9mx z>Ls2qpW|U%<>+sbz)#%pe?by|pa*~P!on-1h+?Hk@sM4El-Q2dqM!GTVcr`?uudGs zdSPILc#B8mIcyRauvvVGt>P-r`R}kz{EY45H#{c(#13&2{cRoC=?Q(@7jsSMlr<`F zmH64JVuF>UTF>JQ*QZ*OIEx@cZ5m#{i!6l{j^QP?LPQ$D%c@13%kTf`7hRaUQ+*H MgmBN(eH-5WA8e^8n*aa+ literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/commands/TogglePMCommand.class b/bin/com/houndpvp/hub/commands/TogglePMCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..aa62cb7b07d16c3d15d1c8f65213c59b02f866f7 GIT binary patch literal 1787 zcma)7T~iZR7=8{UYzV7h_$XK`5j7@KTxn~i#?os1q9#HOM4{7hPBw?l!e%$_2UBJ` zolY-$(eV%1Kj2Mo^di+>biD3w>U8?%8eSgb$=fj6K+#?80O0Vn|P67&@v-F3|sl~yXjVi*${T|2#;d9CqdP< zbyF*TbI?@SlrYLL8M{fCuI}zBs|Mc_b_(MRDK}8K-AdyWYj-d`3_t0YmN(s5prT%a5Zd;~G9^kn17;n$J6EgUuAa zAgJ7x4a>_m`L4)@d1z$!EYHrigyV2cIN6+PZEdA-9VH1j7*3hORa%Y5m#ODWO$ddz zb*0qgZpkt%TgFY?VwiSqZaM~c#dX6Kwn;C+&wkrc|D4a4Vqr#w91kEe`N_W{<1Usd zaSnAyB_y>kab18~3ilY!{dYv%GO6r*KtZ!%_K1dyT9O1)TU2w?N4Qd_Gu59P2U?Wo z4YxIld-RZIrBiK&lX2j;nw4OWRb8&`P&Y(VC|#ulsp7Wo&#AF}lk%c}Jx+rt(>F=e zwvSdCa`YUeokA<4HF@E8q+bL-%k&%wjANe#LlipLm52JNW2f&(guCZ!q7%)n~}{to@PSRB|Mj zS$c&pU*mQkp5si8Gi8HVi@I6iphv_qd8RETwQQW~8HZYEFF@eXl zYBce-F^TUng&%3e{Y2|8G`jrQm%{j>*eOz!Q3>>Tiu+h0F@4)AzNS0R&xV$Sls#$%ka=!=rxzyq3}O literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/inventory/SelectorInventory.class b/bin/com/houndpvp/hub/inventory/SelectorInventory.class new file mode 100644 index 0000000000000000000000000000000000000000..bceab7f186276d6826e2439cfe47a64f254bdeb0 GIT binary patch literal 3656 zcmb7G`EwIx7=FIAWz(=qEr?VKa7pnqRk1A~kx-D7VyTMTbZHm1yK%Fr)ce5u zzVG|M`#=pXC?e{N2&z!4q6X6hW+Y78=*kZF8*aDWZy5sh2`8mnJ-TbkbK$bu z8!|Hjt%?6*Q=7mkPTH_1j1-s`O*rnL)}P(G*Yq?xV|t_7R!bi>+_qRx1gBx9f_j0| z0#qG7v5HwZo%W_&L-&k;$asm!$q-GDY;>#vijT*Fsw>d7DL6x5QJIHX&$KdH+%twd zvZfSOiw4Y9aHhb_fSH?V7Gq|qXv92*G1=W7?^?fZ*JX+JWOCQm_OA5;rw2_aGPFf7 z8)wOUED)Ge;>`p}tS5{`Oy7dz2hNw|O)8qPL_oTss5(3SV^}n;EhvutD!Bvdv z$+cBz1rhY(8Wp>6Eu9Vd&IC3z6{q40 zfej_*28M2N7iF&th^Ro&V;a|UITUGuGlQh1`yh8#@(L^nl2ni;CGF!shf*lTV%LK7 zrIWMbOe3otNafh$wBXEPvz*F;i7kUI!ryl`>*>P697#G^H)Y7F&v{k0uD8m{!9vhS zZu~%qzqpU{sqm!nE%>fkb_n55{m&6T~M1bm;uQ!O(ygEwRrfABPo?-o%v zcMNrjs*4YxX?f!j%t^JzG>7Hm(5kRMBpU1HzINj0F`Sn}Tm9M` z+BdgUjpMQq#<5voP4xl%)KEQ+q`)!sc1d9^N6^>1VhmRwf?hw6!|ojRjKdCL3@)|Q zEh!<$mJnP|3rarUT>N~iFFJVCuwIfkcmc>W+>uFm02I<%%{ zc?sV;MZWh!XsGesm5zKU@cfCD%jo~7A?%Pbu7Zql7iRL=z(~$zY`MwvZxQBm+it`% z-mPNN*7Bwgi*XB@*gBf=3zpzFEXD7<`x7zIz*T)QTEucLwlY_j7fdaoJVF=&-3yrlmW&i*H literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/listeners/DoubleJumpListener$1.class b/bin/com/houndpvp/hub/listeners/DoubleJumpListener$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9492d4b14a164dff359540061cfb74d09926dfe6 GIT binary patch literal 1460 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 a_<&L^_z?f*+QYYHuIlqR@3Q|K?*AX_`Si#D literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/listeners/Listeners$1.class b/bin/com/houndpvp/hub/listeners/Listeners$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8887b3dcdaf271e991503522ff0a1997a72440e7 GIT binary patch literal 1481 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 literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/ScoreboardProvider.class b/bin/com/houndpvp/hub/scoreboard/ScoreboardProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..dc19d2b83c3afff1cc7182c47a362a5afb725194 GIT binary patch literal 3577 zcmcgu*>)3G7Two2l#mNTj7@+hBR0qrMF+Z@MucD-AWnpl<6r`rx+In5!lf#u1_zTl zq&w-(JSSuxA@hilLz0!Ztkpc^EAkb+R=fADl96P~8D9E9rK&rev+q6o>~sG8-*3JL zum#^KXb{+#bqd;;6WF=pL{S?HGMbllTqEP?ZcZCM|C)B42{UK73Yr9#AJHdt&C>0> zwm);k$odKv3taU}mWt*5UX{(=w(m~P8Wvbww1T{83#?4dvvh5cNeaY#qfoST-ynok zh#~MzOG}xa&)FrzX5QBQz~yxNoayb+cL;gdcTGE=+#wBGy60P_%^fZCR}j*6(>DDb z0;?1CF?EgzH1#_0*#{$E0%yJRV+bVzWqUk zf|$SsDIysR3K_$_QO{T*C?~61Bf4wK@A6=iKW2IYo8}|>#mMovt$D+*gj8O?Y0y$n zBIUSwEfb87o4#h)zUfbDX-l6p++^pRi=>sEzhimbdv8WN)+^``ShbK}6&sKcPzZQX zFYqQ>6J;dTA&jF7Jqo%7))x%Tn+<N`MxYzZx30ErkBZ1W8ri#tjBG62`1GeYuc9xJ=5puo7$v8IQ&no_ctt2hC^gH&b znHSj14OJJC4Tl3)_f5yvMor7m_V5v{E)OST*d`FK1U`=K*rDJm0qu91QgJnQ3M?g{ zC_^M$nMn&@P$l`Au?yEI=oeU4p}gF$VmJ2i!cE`cIUJYCJsZey_dt0(*^Fy(oq_=- zV#UJjtcvTAVxrl`Q6j3PLL@**1%oxZ6dfUkG@W-iw#@Mk1vdy>6q>JM(XPO>C~Ps@ z$jt3arQ#UDO$rVQTs$v&60@i63hcaLs5pef5tsTYp9I!c@2Upk*oRwG+=|=C=Ly{k zjQyi>?Lb|c4dHK6Mf3%%jl?m8tcsk>j+pO6$CNHcRpc>77p_5xl>ED<8czS1?hYHw z3Q{v!MfsZXI*4L8LK*CEb$h%+^43yO05w`>Cin8xmocEW;cErc8qYX)TH1sjSiY9! zq$XD|wCyOWxC4y7%)En+YvrOaR#7w@4O4@p2`~|@O&e|@RH(W>ikvk)Po{@l7`@WQ zQ5;h+DUhgxtL`2Zcj0adFwv!5v!J_^dtE0evO4~{)>To7uJ6VD3honFTgUbJD^c+P z9%Qc2UFc^x7#%f_3T&c(AISZEnR2PcIXT)I*nCb-KVkUi*Wf`K3mYl=PEwixOp{Nu?81&WF_5jGcLiU z{FiUiInRj82&$p%{0ix+;W*(e0z^>uvafp@>jX;Z{1GQg(5CRGmcLFRIgLK1Vbe(* zUEMT|y#haA-(b)3^}Q|o&tm9M%Ww$?O1Sw9Zl6MC3Py`5heHG7H0el_H0E_r;m#@C zQ^IjBtqhg$k10GFZ7t!+mggfFG&GGD8*orMeMR8J%tI$}t_p})7(>>|Fl}L=w&Dux$2#iQeU8F!LXjiC63e^Vxfj`65 ajg?`{@GSF}oth!-tC!KkS=w#DxBmm!74O&p literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.class b/bin/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.class new file mode 100644 index 0000000000000000000000000000000000000000..d70fb57c7d08186517ddcbb01c4db3be3a2abf4c GIT binary patch literal 6282 zcmb_h33yc175?vRFBu+Wh!7YO)F^=@5C5BB?d2D*HSP%N%@#k6?X*B_4!8eu)2 z@U=y>9eO-?;*|o2fM>flsQDsVwA7C}+UBh-waxyZz-bpZWh8>hxDoBH z7I5{Ox&-Dl#p2z*u7TcOBk9wlNh7%RIxMb_{t?f%wlj=`Q;Pk06(;#C|Z_)a6f&B3-$%$x*WRNQhh=71|P>UF0jyDVB z)Py2N)JU!pu$Pu~3OMRxVO_z@QC?d<oNY zTn2#a4Cn~~Z)w@Z*)cdFSgqg;>Kq%qx&b4?Y{*rLRh)&hX=gHK8Nnq>%T9LEjTtCW zF&_&A6m#9yZ36R4vm~w5RgXLQbd;$m$3hxilM2Vo?769=mUZURrV173z{fbY`-A=t zfr9aUbK`U@QBjF=sa5Om*Q1PiMYh(rv?vvTYN_HpsbblfnQ42n+_N5K&nyt&s8*ikRzoG+o|S1}dS^^vB& z=4eZ-wZHAM3*+sHV6tOi!(iv-8?U%%$EKZ|7cZ$icjW?<&{aUC;_mTSgV$p=fVC{@btj|KrhNKZmsMv~23DLOu zLSR8@;3Qa$S2fbPE)`RtDj>2~P8h8=B1Jdz)H;yN(5qDeWG^>DsLw?=3vmLmywziI_qu0INXtysWh9Aqq;%olhXM)<2v6F z=xFliVh~p-xLjcQOYQtg#`7dqq`E;|sp2Y=>{+}W zMlzyHPp(n%PU%VExSrH9o2@Nwyc@d}Tq`g=vzG*-N!>JZKHfu;E)8Tef9fTdeJ^fM za6MUKV*HwWd8V>e+=!dFdnd^17PbXSODCooORl=CQ^ETP@rl;`1-A*TI2Cg{bgj>gJ(h`g zs<=xoIwNb*6Q?L?)kjr)ObW~zDfuek);>&nK#>Ci33gt08px`Uy(o?B8(?~a-v`X%4D!wi& zYGzhNnL~5?lQs8@if>4X?0v$LII&eqv2UsP_Sn+2#4G}qzI{iQ=67WUjbhqV4dvkb z0+7e_AE-DY{dGn3Xm_$lKKhZ0ALA!1k;Fh(!t9?+!XBk3b>z*#PX%mG?32@euHps! zf*TOQl-Ot_d2kq2zNsl?n`I~QOBKJuuX$=^Dx263nVkxAII2fT&&b+VQ;%d6eyiel zG71G*;WQbnt=-=kxJZh;q~hgqMS>d|DdNT-@n;2p5;*&<&S%zosgv1C{AJ9(pE75> z(8%@ws^V|su5aZ@iu^;xt7Ap1T$)!m{)N{Syq1Qk+4eST$sQGN;NQe2+f()crGY@1 z>?PSf%1ZEzMLS<5WEU+^eM&T90$FmAT!0&`Y+=(WbD5ee&CV;knc2~wZfNF>F{kF_ zgs!4;XDFg;QMXV;t|D@HddOm|IgByo5aE-oCm~ds+b|z%unSBGFw5(DCQd1a2`|` z_h4)w9?}~P*+|VCyQ`feiA+EZ@DoP7o+(P`2}R6d&L>B@obBLmt0(U<%y~;1x|F|>-gt8IH;v$8x`s(;opza;=Nw^E$b{GP zgqPQ0Axp}R;KeGJeB*Ulm6Umz27^n2ftQRAzwx>x8cY!Wo@0l{GlD;)9=zgpQELW= zUY7|(Ga6M2!{Oy6qwDWp#gkVQPR|&^(_V$qv@p)W2CpK~#i&^E_2iAtLRBqj} zo+REJW^La^Y=9N1utsy3<=HrwC|XL?oF~7}v4)qUnUb4{o-RJ`B_jHn>RqhkYxwqh zR_#r!`CHI{+sOv^p^<300FM$o&+^075v=FgpqX29i*WD@mIrO37#9j3zeKG-P}HJB zv|)qL&?#crD6T+_xDlJgt>%irPDy}bPYSQI#Z@?pV+7g)t|!^WMk^QNINl^)`^4PT zvt2kwK&pIp4PK|ED!sjlcPlw^(#{uCqa!E~>N8p9!kGhGWjYdg3&&?Z@VNeU#S zraQ<+1%+vtzp_Y4r&K0Ul2MwBpXGzKBf@o1sDg+8d>bS!HfCsJKFI>uLgy~wUa^&g zaVZHvV`#Q8aUmumj8^C-1)OQwk_xGf3ASi@DrrO(xy^Kw|6Mo=r>NjR86+dw#4ItJ OzivjMPk2S4EB8NxMc@1Y literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.class b/bin/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..215683281deb669ab9c20e34d49c207838a4a9aa GIT binary patch literal 330 zcmb7=K~BR!3`IQ!nzn3Mu;c(Bp?bqEfY`t)5|wg-Nn%aihMCCmM9S4zZ~zX47y_!) zCAmXDGD-CuM25v}tEDytHuQG1_ z78#rxxY*gjVr#v_*J?+#8n|?%#}TI9!0mMr#9Od&SI6}Z7p;F<%ncYgNnZjm>A*9X PC!ZxZgGExyNv*yCZcb%o literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.class b/bin/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.class new file mode 100644 index 0000000000000000000000000000000000000000..e0f53bdc129b4f2e71774fe9c1856a58b5dac726 GIT binary patch literal 6430 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 LpBY*^vz7k<(cIz{ literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$2.class b/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$2.class new file mode 100644 index 0000000000000000000000000000000000000000..641ab3e929816b23b5eaccaf33410630e63ae313 GIT binary patch literal 1538 zcmbtUTTc@~6#k|Zmafai0)kw$DoR@}t9ZqNC0;o`s|~B zL=%NX5`Fha8PDu)=n~+mo9yn)cg}q0J7>FU)+ zS+ASI<7HuZ72Wkj)2eWQDARaDlUra0gpgW5Fg$y$Ihj22t*B3XLqUts83v>eNS#xRk+*e$oikX#iNo&rOU z1_j+JI?$&fg?@&PtaRurS`OcA)XLl|8D*O@q>I8d>>b0iyE<7T(2@iJ;tBNW}<76GaRhE@&75q>7roC&ukqhbO#Wf5n@ zsZ?;6VW5@&NnuE|Z+Ls$m(9?!N17Q@WNg&9<5NcroU>;PjQVIOw)BLWI-qCUH_U?# z!;M-?-4+ecR;)j?#M0WNFGk*diDL^M_GE6W1fj5NglBBmmxO_+% zg(Gs@!+fxE3is*OPLSs~9^w(LeN3xK>MJE+d_uDX7Vwn*NffYz=QK(aCXMTE9oRt2vGQ5#H}6ik4S5TCZ&v0W%L&33o=sQ*Y4 zg+vm4_eUAeY#X`;q7QAd+nF=xeCM0*oU^}vfByks4X-qW7&a_FG? zeXw{#)m_63!+7_6&vk53eeKzGYLFQ2P;kK%Lb~ZT>2#n}=>(>6S4la?Fd8gH8zrAT zP#*I-7LcK9n~eq+6^7-Y>ovFji$h*P>o(s7;}6 zHkhm2`Z5~-10s{3A^-pY literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$ConstructorInvoker.class b/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$ConstructorInvoker.class new file mode 100644 index 0000000000000000000000000000000000000000..d8dad8d84fad32b2164298747371b6c255c94f2a GIT binary patch literal 345 zcmbtQu}%U(5PgGqCkT=F4JJb4Hg=RGCL{zCEv@$UMmaopF0*&n`&$-%03T&oC@_JN zX69wyyu5j{`TO|=@Q7iG4q@r!%dDjFdDT{C)nq0(QO?9_ZYq_w$XSC?elOY8g?RIF zfOj+Tq1MLLqI2KMCu@o>VYIfbHKp|*<~dtO86he5JmG%)wm7DzlhYBQ|0<0-ekw{P z-2A&f?Bs;O+Kr7w#sLF-eJ;Fw^AYT=)TglsGA( zXu5MV%(>^Db6@WtuWtY@aOk2(m<#p7GF6vJ)l@92V`hZXGFDtCtkSB<6R8c;^0|;= zm8+6He1A`7xh#?!A*3-%yVxR3mb~Gt;AP70GbX|6$af9!CT~M$yc?O zgyT)3CwFVTF6;m*vjLdDbL%!3Dc|Svg>`_ z4H1U(vXuI^;KoSfVxJKHW6OlmuRS{iJHI_4(6<}khGVg7Q4a%)J@{xZv4dfofzg`T R{mK|)VzF-(ggqQM-X{tbl+^$L literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$MethodInvoker.class b/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection$MethodInvoker.class new file mode 100644 index 0000000000000000000000000000000000000000..f350fce67c32c9cdb049536ae71cd2a1579fe0a0 GIT binary patch literal 353 zcmbtQyKcfj5S-;<0|6x;ks>r)lP02!gk%X6DU?)ad%-5ot#yap^IH^r03U_8P=J6k z&F*MscQvzz<8BY&9fJ@JLX^m_%A_)BS(hrSV&xLC9E-N8Dy`Ic%GN2%%Yu_lE=GM{ z;OmSxnWT}a<%eyE7U5;BYpn`xR_ZHW`wc>npLN2=+w@)?FCMAkBSq-VrLqZ6@`4G^ zR|})Ri-dk;4BO8_JI5}>6Jh+1T!g_*vVcHn`lkWZ+M&rf)l=m*^s DqNHjN literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.class b/bin/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.class new file mode 100644 index 0000000000000000000000000000000000000000..1c2f0728ded9989514c0715b67d63d6901dcbc8f GIT binary patch literal 10473 zcmcgy33yc3b^b3J>5YcRCILbQ*)kSb(g?{2jBQC^gp6!C5)esX3+%YV=t&wgnvrM0 z;Dy!>rZH*UCQj1g*m3OGAxYzefHP7ZfuS6Qbzt}4P~YA?3QGsNhkNe0??CrpU-z#5-3qnt;B+by zr3&NDv9^7oRLV)j$iv?ijz(gU)DDHR#-;-bzMlA~6TmX8u&`WVMLaRyb~t_HNF>#^ zOFwK>p<1DG+(`{NiK9+JVO3*Ozd`3VcLq>~RW??mhGIzF6AdMk3e_ae8>1UZT8p(7 zu2NW5&}CyC>S!v*?+b;GgvK3LT%OEpCXZ`yt%Z8(T-0e}J+4!*$YoDxk}OuvQNr_R zB@{N;C`W}K*DI{1Nv*Ewt>HvyEakrY(ZumFC)GL`i8;EXHK`pDKoFZOw9E;o%iBgP z+NeOnnTm$ORN%Ho(+Lxy#E|nq+KGjo&iUF+uNew&wqc3FTNL2OjS8w&?6}G17n^TU zu;#{(24C9x)f@(mx@7QV+U@fs)Y1ZBuZ5`nW}n{J!OhVcZ%?C z83*hFD!B0{We?_a>g z5_B`*y%8rms_>X;g^N1F)1FyIi%Zh95Cs~v=8IOfh=>$FTQrB>Y zA}uX&LSi08yM~85cXVDxZC!=|26K;%KI~O^yhycopjT(#Wz>lttVo3t zj49{1;X5}}1WioO?aDEU`0(*5dU^F+ys^#0+{(i7;%A}H=MK%*^+SR6#X%@;xf1w! z@zR(nR;0MaFzhl$Cy$telJpNTmzs$2)G)JHHg1(+sSIvno-)U{1cf2F+?aa$(q45v zHg_hvZF=5aPLO8-S00ItI>(sK`xG89oia~6FSl1dcxkW9qls(5<@bpsqftpl_bR-6 zY3)kI?EhWkT8!J6K!gd4Y3nv891SI$QC$~U-qtlX9Wv1EEf3ptH`g;qWIYqjR%*RC zoI@h(jhKx%rkEJHdpWKyaV z%W`ibJ}FBiLpANpPM6Pd8xP@Og(XQRZ`0H^SN(ey_O z{O;jQR6K>JZ2TyGj3Ek5O*t_xMdmE1vLQ0;oTCMCa0(x?@w6;p{i(Ry8Nf-rU!h!U zlw08!Lxd%5$xw<5=Yi0au6!2GC|or^>fD9>fRmbtQ`7gF?)Qu;Qnb_L<^g3v%O+QP zU+if7h$G9UQ~x(Dq@pjZzRguc^3TU@JdaOskLAsw(X6MQHg$BJQ0yq9#U;7Yo(oLs zK)R*1Vk(pfO)^DP6^kuc;LK-0@xaUJV1@S;d9n2Jw@8o69cxala5VJLLkiEnLzN0+ zD;iyKH6;Un#>QvylZ>iSU|du()ODpRjN8xD@`{w0&nv9S=gMrBb!mj;oQ*GLbL^nQ z?MuupA7zM1_p3I(gp6C^_6fuso-GIk<#V51keIY6n@smGkD3u&naA!_ncQ{ zm~T@~uEhB9^9on**M+q{6?Y2>UBvuazad%QxFOlpDh~NY8(+sSNtHMU*HxC zpS1A13TsU<1vGBf?1{&csYE)Qiu2&;=p__&^U%U_j3F>zQjWh9!3$3+C1gt#`9mAu zz*`DwQ;RE85lU#F@NkjbE0nEDNSBoLCpP{Rf5w%Uk+KX@=8g4p^F|g)1`(0}7kJge zUvj?Yr(g*}p<{;ls|99=EdhKBe3|=9uW)_AybtHWU(d;!O8^Rs zjV>mYOR%Q~-=9L_Y2jZK>Pt;XQ&XPOF$()*vY;K+7%ZJXiZ*WGIeT``-aTb%mETsCqP|5GiL3o;F%>lTD%>HcC4{S5s?c1*FGggB zClc`oW#h-{W+@)}*XJjcmbfRL>XpllTv6k$BAj)a8)?PEHWQPj$8}n26%X0+?6dZc zjX8;cT8UnsPpdVys#UxTuvpB(6LP_@#WbMDJS{g1qIXl3I-Z%wLxvc*+@cuN-9G zE1g}o+OBxpv%=kt8odg;O*fmN=`8lk_jmkGTXm~l)JgWu+J=K7{5D(dR=rFTuJGYd zgvT50^GYoa$F8&>g|S_U57G2^IyIH1>1&Gg^9XZWW8tBleE;kc}TvH6AvRDdn**8qqxyh!wP*15u^{6 zviA|3!*jkZb=LyfyE}%Q2}|aDV>45C8ShMe2*?#1-vV-TrJua2(ofzR@ma;ItHrQM zzl2{AJqoyG21_$onZcS2uD*bV^Ju8rSk;(8^99`CezfzWYHO7|E?`^L%`@n@fSq3? zlSSCY-_;ZhT;S#AtGrhH5^g{SH)9$-ngSHa%O_848=t&VLwWNwcIR1C=tjRDBBUh1 z?YM)_N}f#KNkQ+@%=)$NhiR?Y>~9XXl+9q^9N){dDlVU8noqq;gMD~6`{f#Mkp2+f zehjf~5r+A`nonujhy8rIeFxYka_`E?y<5vYSD6E9xG$&rgVHB$AyX`F7!-~$*V31_;t;>aNGS;4s?mQU=lv78SfB7>O}n%=%E)gEK7x-@ zN+(`&@s#P$o`v|5Z8@kx#l_AlkwzpUBc?Xl;S z&G9y;?41U0KR%U1a+bH><1K!3@g!8@w2ofg z+FCq(eSu&&e+JhGye@2-!SopqSYNq_*EF!+$O9|m0&9r|7Kwj`xcb^i)tlw7p=_iq zI5gs8<1Y-&;FqWI>v?RoQ-5#<)G+SX)6ScSmmWsGkC+%@`@Nj8qnwd3gpuIeDL(T! zJDu~*X=HtK8oxn4lEzMJFA2`N@SFIpIXIJ%F3yC0Kj{T$qo|mRGYh}1k@Gu+NMnbE zR|IS9S~iQd2H1>2gj5GH ztv-Xfa1DBTujEGkAMlUVJf8xDN z*M)^*{%Z#RTNtxbT1Iw)x-u&9-6B4>v%CnOI!VLlal;H|nTo5nW>i@-|1lqzV1C+Q zUZ=Ax(W5FZ#k}DiF@LHA^MGt-3p_BTJp|M@&nW9$f3}oVs{jq~bPrA|`weZM59MkZ zZQVs%m+F%GG{=9KzW<03je500N27xORjW!>bEL$dNq4u!(E-_)vrP)+6C5pzt(l8z z<;b*J-G3fCDYRzbEIvw9tF?Qo)wP>4>bf&nOt*IU&SHDDx<1#^AT7aa)g&#?U|nAQ zAk}B1xL!)(d2H+OF%7CsAIIjFjM_{on_k4mW_i!3t;<`VN38^})@QhvgFAdJLAI%z zGph4065smFY@{WaQ9XC@=k`1<@8o(EEEIlLqUCrN)p(9G<9Qa_PoR;h?MBX*4wjSc zEG4(&WhTY5aPS#C!DIQ4;d4aovpl2zJeQqc(4M@5bDw_kVByC(b%*Ms*Ouec-1f=} zvKAju@1j@B$iGbW^UX&I**6E>UYq#74%T;2ZK;)(TK6_;Sb|rqe_PU8@WyX5AdA!h ri596nYA>JdWc3K2^7oqi;GvfOQ~Q`q2P-Po5TE<`AXl6nZlYk&9(=-hMUAl1V(m&u2aP9F{6=^youn8W{N#C!k?!8~%`s!Bm$G^Y)2H*z1 z380Q)QnxolYj)9E&Tr*IYsIBdLAM=a$=00ZP~Ne(%w@wVgdAffXXvhJTcNaPMr^C# zYL;6Fpn>7ky0)c-a++#pJ}@Xe1k(jV?yw;Y^0%bbQ|- zlG6%>F@~0mxoT-{(J>g>56+Jd-JvDts>e(wGTHP@B%4e#q~bNa)J6GLPEmJlCuVKg z8-_z!yQ*eQgr}nn_i9QvWg5BVu&x`0f-N#F9$&O^Uj;L+V_K_YqJq_TB^%4e>1BGV zzG#?sE}3As|NoGSS+224br$R{_y|nKGO2iYzEV2_M=$b=;rx+H)eiO@xh9p&#MJ9| z_||2k;pvi;{Y6vbeg^Fay;RcPgTtk_RnunIVjA85$z?veAqoYHTS@-!R-%PJ56nx*4wv zt7d9$8LfB@!vS1j7^|VbafEP{y6>vtPMemYJKBmX+b=`kKxM-i^bM&l-2#Sd9F1rS z;0D9V16^FOyv6Z6USK#uNqp^;q3F+`!Yx!J7_6!2zI>(jEf|k-w4gPB@v@6bbwxq> z4#!J)nW32|%a+WLuOwT+HC7wh^5!piPH;Q{F04t86T+Ips{y=1JGNiwy?)6NLla3T zJD-XQk9!;^!J9G7(0_=SCe1=#2uxnkq$%N+m?Rs~w*=v0=*(WNY%qZ>Q`aox+;JJ44|)K!iiwc6x( zN?98mPYY6;484btk_Slm+Z@j*R_}0}Q>+Rc=T)R4#|34*%kiwT9&lU)Cuzs&fFz2W zONNuxmU2Wg7`JsTH>)|Oz%>$|wQgWCjxWA(du zaR*^(H%L1|_BNtw;%+c5JrmnVc%CT&CC@b3-s)^{R<54g#+!LpmFFYJlv-w6avzT la1pyq3-AaZ)3Xkr$lp)#89jr9KPOsW(k1W}Js&r<{09uMv`7E| literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/tablist/Azazel$1.class b/bin/com/houndpvp/hub/tablist/Azazel$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4b393873ccea3076613da5611bd9e24bcafa5a48 GIT binary patch literal 1277 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 literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/tablist/tab/Provider/TabProvider.class b/bin/com/houndpvp/hub/tablist/tab/Provider/TabProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..9fc7ee713eebaea8343f77c162d5255273f28cd1 GIT binary patch literal 1805 zcmb7EOK%%h6#lOB@Wh$sVVVbN0_iihQ#_<;Dbyvrj6Vp6Oc!{y+*164iW*FbG zsKko@z>Xb@NUZ24DO3U}3l>Q15F7pmJ0!%pGj=j6X#}!-&%I~P{m$b%=l=5d4?hC9 zicgYAFw9ily0PsBj^#ByV>_rA(yZ8`A(b@BzS|TQ_l9mO<$;UOW7&6MT23sbfV*S{9WP=mig?2jp9Q>V zQAIM@Qb7tX6c-B`#u=bcU()e1CaJPEe;^s=GLdP>*qZc(Q~N(zX*kEwbFh1D zS;)HSC2@gac({)uj37Zmu{3F!|8U#V^^r=)Jy$Tn}c0@otyQB$ITrLZ!!#05o9CJ zKc^;ZdU=OS4R0}=ifnI_y4)-)vTo^^S7de9g=N`X!y<7_R%PF;N>L@n62;*ip6(oi zEQ&_e^(_tWG7OVDD>}!0DhDMUca?)KU(~iKidFJO_;(hTG`vSc7;e@gr4(>M0nY32M)DUUebP zf|8(r7rkr=lJthq+CwLUB#i{Ra{EX<4nOO(c8AJ7oT9xR8K4jSbRu{R(n^=v@93l- zSo$f_Tl+YDclvt_F|1rppV`C2{b$A5Q27++x6&8)F_q3e!R0+%*~4qcS>K41HzP5( zhqoiZm{JGm@G-O2-Fp$ldMLg-tmK!N zr2QZjJWcf*qPJ`q6Bxk-jAELetwoGs8E0@0Ami-9!fAXMU z5IlJF(1YODzazfch8EI5@i6oI&GO#+y?L`of4_VMu#LMVuHcghp)m|CprvDumqO&+>tAXZqSo2y*=e80^%K4lj~3*KTzDO zty5GxiFDB05wLnHc|%04POP;Xc2yYy3pNTU3M{sCpkAc=o{BhksEkPHyTgtfX>*=@ zw35D#1s=Bk+x^7BTQl^sjglE!q^0M^uv4p_wQP`AZOoxelUq?Ki_1jeWP#Le7)SM9X|B=UE_~3SynQg5{kG_U@OF zaukhK_(*OXtEcO%B(g&@OFYyBdWM`_XhWe@GbdBBIa!$>Py5rGp8TOwpmC~=c4q?B z{ey`>ZIDFdql#7=buEdsKIu*DW{nN^cfPb50 zHl#~k3~O@#qX(5Mf%ecCvV&NqDWx8|0y}>V6WIR!a@Yks=dS>>C>%3-tYoQy`r!+j i&m5@0XDrgd2UZx{<-5+jTISbE>|mYQFUvQuiPjgmii5KN literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/tablist/tab/Tab.class b/bin/com/houndpvp/hub/tablist/tab/Tab.class new file mode 100644 index 0000000000000000000000000000000000000000..bc296ebc2f911b78ae69d87b66d11846b2cad348 GIT binary patch literal 8731 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 dMm!cH;0s!IUp_jY%6S8*C`-t-J^6GTkh_DoZ& z8=PUtZR<{InmE-rk`@?Z`9Px%6JDuVl*m4LNtajPRJNWk|CTH&{0)4dBxkSb9*a@D5+Wv&Dhp#U3~W@ zBO*+O3xj9&Unw<90fcSOjA0z_OE}ALqEE#@I~gC~97CeT-KuHO>6?ajz-?kbm(J{{ zeRyuVx_h7m>xE&Q#{~(KgnOgXGA`m0gXC~~-=|He543&FPqCuvj$4T1LwqdZBZiTe zS7fA-VTkH3w>8(YDNX52-|mgxJTc@jB_Yp{JZ3mrm2nvgCBfuBxC~=Q42EX5lxqC} zZ@2{sGo*mO)t|1pwr;j!_ykuZ%rQ)g2wRrbGPpv+JoRD1Gb7XvqtCU}p zKfI~ATGewq9vzma!(O{}#kRGBV{{>k1%`N_Zi$M)jiZ2T5|$X!Z%ZO$8P`d%hc;<; zXKRh&R5}o>FD~+A6f0B!L4B1hyD5$;$+(GCx`Jzo$o%V(Y-ECB9G_uB!aBp5*ZD!l z=eR}wa=6*t^oy#@9Y-1_e zR@mxZUOs#nd1VL9ZfGI!fnQhCF|9tsY-K7r-^F4G zQ#t=d8^W`Tk?~0O4~!&lOm$IY=wdB`0Ic?dUx6a>3d7?UzY<){^|*7%+sEYPd_Ya- z9Z`$$!VuwA{O25LbA{BoiV4h9`&mF1i6YfV8@dzdS zL?!SuR`Cng@Eg{BnU;m#IPA$Zff}}OhlILFEZf8qCe{Ufg|A7pN67edj2KS(b0OTN q-D3zxUr>g^5^a>o&-fSL(9RuN3(@FXdPk_C-ot$wiEN5A(eHnaUCM6& literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/utils/Bungee.class b/bin/com/houndpvp/hub/utils/Bungee.class new file mode 100644 index 0000000000000000000000000000000000000000..7813211bfa3cb35a8edcbb5be8fd83d47ed82bf2 GIT binary patch literal 4178 zcmb7H33n6M75>JHMwTZ83k()T-H_KR>$b;pPGK;Bc zX}Z$A>6(^wPZzq-Hkd{>ahs-F+NSIO>1j{D_hw{|Y;zzw$I{#Gcklh~@}A%P->a_y zIEa6%s8eunt~8sTE_qhIJXcOndsAu8HH%KV&$9}Kp`t;-=JWcTo-XQEAw4{G-pIKs zA_@+a>_U3Vo0&1)bh+piOe;NWIF8OiA$>+J49U4MXgaQ88McCme^9};!F6g+cvBe# zs$okZ+^zw7+TS$A%QJ)tXB#)LBTy5nh;ZQuY#6Usldq?+R-LX?b2`;Hi^-F8a88- zg1ZMz%Q)@LP8s&7K2;>C@xf9~FOKQ9DdxdqBDry}Qe!dH``AehDxxYn6?Ci%Y&f6x z9Ec%>Zs9|Zf_H9!96p`7mEuMwu=wN!+5rs@;_V7F+p|V>XJ*u#6}k3Ea&Ucy`gxf- zc`_B=baK;1-YXh5vtH!0K*^|h=(gTG7-JoESFPD9W(OEVciLoPbgZ|&#yJJsOIA&x zoHcTWIcMZqT**+*1ql($;>hItLUpKUmr=s zqj)zn$avP%i!`(~tjw?QOzQC%jw7q$1T#m3v`{J)ibk5l*^-quOXdL$j3ErGIIUpcE!EYEXgGuSuw&4K{JGHq z1zVG;^{hoPqM+F)s$cX1q3E23F^mVYENNMO*%&4;sp9c!8OdG}6ugG_;t2}O=|#^N zeuf<^nGI{J_61RHPic4>Ix!^;O!Bq;GqZjrj1`0+iX0<)+;B(ymKX&qw61%Xh-^W_ zG)x7JPPu5({C#01LB6CWLu!Jx7-lf5qFBue*aB9^Nln$p_ZtaFqZS#RnBAhsD7UY4|WcBK#|t4T~k#6IN1{SjSjkT}D8B zOh9~GL3?fJYuu0rKcV51A~mCK$=_t+*m3JBCy0N+iZqyH zVb__Kf;+D;CX?e$t=JLqZ(8P%ydud{R-BNzc3PhmO3X5wS(%YjaMy^d=Vo|m2A2X4 zT6sV03eq*LwzfB|_g35+$MH=K-@>;E95jt#&z0rU%_6>i1Mp90qWCUZ=`WGl91Hs; z{6NL`6(sKzK*JA3@3EaLk_!%y)uc9VkPW-Z6ntsGfu z3k+U+m>umU{9MB?@JougCDAWsrIFKQYO=2x*KtF|0ue&@R1J9=euY<9NrLN|i$Y!y zAu0b^6}-B_-6hCtaX~P^3}<~wwC2t`r@9<#=hutIdA37YY2JkFG3k z@R}3P!ltTE^7;!4t-cL=Yrul_4e&x4UcCk6%abay;(?fX>o`H!1WatCl6z!dMZ zX8(TQFM25N+br|m?l0<&V>sB&mt8&o8qvUSKF9bzY7!4a&YC%{gLo$L3Ai%9n{z${ zSLQ90i6V|IT-i#A{v!SM>}tbwP3XSI*-)hZT#Lu1Ay&R*+zf_ z_Q)L&E`hxP=tV>%?EcP0+~3*t3id4{HPP9%h_0@tt=M0|1LMm$C|3@Nm3LI|@c62Z zopcSjhfcQB{GBwnhqDK$E6dR-sdJmJ0f&*{Szy1Ug9U(Iyvw&kd4WVVac`k3ex!n< zFQVak&k_a>HzXQvVvzqCG$tD3XSs6)UDc(C7>p`7q$VP7;Nk*05|LJQ36E9q3@L9>|0zQY&Q}T_wZNc+GTX%1&&n8-G{GnH;S(ldovnh|HV-iLn@B#{0|1` z%N4vBrIYs`wM$AhchWf0o6zM;-+l7O>-Gg8CH| zk*nJ!m?*|3`~`nqk$iKlWXD>`wvgoCLXv-9E4h2EG^)jmf literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/utils/ItemBuilder.class b/bin/com/houndpvp/hub/utils/ItemBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..5b2011772fbffd103d031cc2346f607ed2b4b3ab GIT binary patch literal 6547 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 literal 0 HcmV?d00001 diff --git a/bin/com/houndpvp/hub/utils/SpawnUtils.class b/bin/com/houndpvp/hub/utils/SpawnUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..271fc3c66c72cb273407c73fd727c259442c3525 GIT binary patch literal 2422 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 T0Juv*q13@2l+Vtu4SM%4#V+g4 literal 0 HcmV?d00001 diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..ba7be3b --- /dev/null +++ b/plugin.yml @@ -0,0 +1,22 @@ +name: Hub +version: 1.0 +main: com.houndpvp.hub.Hub +commands: + builder: + setspawn: + rawcast: + gamemode: + gmc: + sounds: + aliases: [togglesounds, toggles] + gms: + gma: + msg: + aliases: [tell, message, t, w, wisper] + reply: + aliases: [r] + togglepm: + sounds: + invselector: + tp: + clear: \ No newline at end of file diff --git a/src/com/houndpvp/hub/Hub.java b/src/com/houndpvp/hub/Hub.java new file mode 100644 index 0000000..bfa5348 --- /dev/null +++ b/src/com/houndpvp/hub/Hub.java @@ -0,0 +1,107 @@ +package com.houndpvp.hub; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +import com.houndpvp.hub.commands.BuilderCommand; +import com.houndpvp.hub.commands.ClearCommand; +import com.houndpvp.hub.commands.GamemodeCommand; +import com.houndpvp.hub.commands.InvSelectorCommand; +import com.houndpvp.hub.commands.MsgCommand; +import com.houndpvp.hub.commands.RawcastCommand; +import com.houndpvp.hub.commands.ReplyCommand; +import com.houndpvp.hub.commands.SetSpawnCommand; +import com.houndpvp.hub.commands.SoundsCommand; +import com.houndpvp.hub.commands.TeleportCommand; +import com.houndpvp.hub.listeners.DoubleJumpListener; +import com.houndpvp.hub.listeners.Listeners; +import com.houndpvp.hub.scoreboard.ScoreboardProvider; +import com.houndpvp.hub.scoreboard.providers.ScoreboardManager; +import com.houndpvp.hub.tablist.Azazel; +import com.houndpvp.hub.tablist.tab.Provider.TabProvider; +import com.houndpvp.hub.utils.Bungee; +import com.houndpvp.hub.utils.SpawnUtils; + +import lombok.Getter; +import net.milkbowl.vault.chat.Chat; +import net.milkbowl.vault.permission.Permission; + +public class Hub extends JavaPlugin { + + @Getter + static Hub instance; + @Getter + Permission perms = null; + @Getter + Chat chat = null; + @Getter + Bungee bungee; + private SpawnUtils spawn; + + @Override + public void onEnable() { + Bukkit.getLogger().warning("----------------------------"); + Bukkit.getLogger().warning("This hub core has been made"); + Bukkit.getLogger().warning("for the ExemPvP Network by"); + Bukkit.getLogger().warning("the development team!"); + Bukkit.getLogger().warning("----------------------------"); + (spawn = new SpawnUtils(this)).load(); + instance = this; + + Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + bungee = new Bungee(this); + Bukkit.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", bungee); + + setupPermissions(); + setupChat(); + getConfig().options().copyDefaults(true); + saveConfig(); + new Azazel(this, new TabProvider()); + + new ScoreboardManager(this, new ScoreboardProvider(this), "§5§lExemPVP §7| §7Hub-1"); + Bukkit.getPluginManager().registerEvents(new Listeners(), this); + Bukkit.getPluginManager().registerEvents(new DoubleJumpListener(), this); + + getCommand("builder").setExecutor(new BuilderCommand()); + getCommand("setspawn").setExecutor(new SetSpawnCommand(this)); + getCommand("rawcast").setExecutor(new RawcastCommand()); + getCommand("msg").setExecutor(new MsgCommand()); + getCommand("reply").setExecutor(new ReplyCommand()); + getCommand("sounds").setExecutor(new SoundsCommand()); + getCommand("gamemode").setExecutor(new GamemodeCommand()); + getCommand("invselector").setExecutor(new InvSelectorCommand()); + getCommand("tp").setExecutor(new TeleportCommand()); + getCommand("clear").setExecutor(new ClearCommand()); + } + + @Override + public void onDisable() { + for (Player pp : Bukkit.getOnlinePlayers()) { + pp.kickPlayer("§5ExemPvP §7| Our Hub is Restarting"); + } + + } + + + + + public SpawnUtils getSpawn() { + return this.spawn; + } + + public void setSpawn(SpawnUtils spawn) { + this.spawn = spawn; + } + + + private boolean setupPermissions() { RegisteredServiceProvider + rsp = getServer().getServicesManager().getRegistration(Permission.class); + perms = rsp.getProvider(); return perms != null; } + + private boolean setupChat() { RegisteredServiceProvider rsp = + getServer().getServicesManager().getRegistration(Chat.class); chat = + rsp.getProvider(); return chat != null; } + +} diff --git a/src/com/houndpvp/hub/commands/BuilderCommand.java b/src/com/houndpvp/hub/commands/BuilderCommand.java new file mode 100644 index 0000000..79f7298 --- /dev/null +++ b/src/com/houndpvp/hub/commands/BuilderCommand.java @@ -0,0 +1,47 @@ +package com.houndpvp.hub.commands; + +import java.util.ArrayList; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; + +import lombok.Getter; + +public class BuilderCommand implements CommandExecutor { + + @Getter public static ArrayList builders = new ArrayList(); + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + if(!(sender instanceof Player)) { + sender.sendMessage("§cYou must be a player to use this command."); + return true; + + } + + Player p = (Player) sender; + + if(!p.hasPermission("houndpvp.builder")) { + p.sendMessage("§cYou do not have permission for this command."); + return true; + } + + if(builders.contains(p)) { + builders.remove(p); + p.sendMessage("§cYou have disabled builder mode."); + return true; + } else if(!builders.contains(p)) { + builders.add(p); + p.sendMessage("§aYou have enabled builder mode."); + return true; + } + + + + return true; + } + +} diff --git a/src/com/houndpvp/hub/commands/ClearCommand.java b/src/com/houndpvp/hub/commands/ClearCommand.java new file mode 100644 index 0000000..12fbfae --- /dev/null +++ b/src/com/houndpvp/hub/commands/ClearCommand.java @@ -0,0 +1,19 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.md_5.bungee.api.ChatColor; + +public class ClearCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + Player p = (Player) sender; + p.getInventory().clear(); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aYour inventory has been cleared!")); + return true; + } +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/commands/GamemodeCommand.java b/src/com/houndpvp/hub/commands/GamemodeCommand.java new file mode 100644 index 0000000..e539ea0 --- /dev/null +++ b/src/com/houndpvp/hub/commands/GamemodeCommand.java @@ -0,0 +1,125 @@ +package com.houndpvp.hub.commands; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + + +public class GamemodeCommand implements CommandExecutor, TabExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + if(!(sender instanceof Player)) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYou must be a player to use this command.")); + return true; + } + + Player p = (Player) sender; + if (p.hasPermission("hub.command.gamemode")) { + + if(c.equalsIgnoreCase("gmc")) { + p.setGameMode(GameMode.CREATIVE); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYour gamemode has been set to &9%gamemode%") + .replace("%gamemode%", p.getGameMode().toString())); + return true; + } + + if(c.equalsIgnoreCase("gms")) { + p.setGameMode(GameMode.SURVIVAL); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYour gamemode has been set to &9%gamemode%") + .replace("%gamemode%", p.getGameMode().toString())); + return true; + } + + if(c.equalsIgnoreCase("gma")) { + p.setGameMode(GameMode.ADVENTURE); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYour gamemode has been set to &9%gamemode%") + .replace("%gamemode%", p.getGameMode().toString())); + return true; + } + + if(c.equalsIgnoreCase("gmc")) { + p.setGameMode(GameMode.CREATIVE); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYour gamemode has been set to &9%gamemode%") + .replace("%gamemode%", p.getGameMode().toString())); + return true; + } + + if(c.equalsIgnoreCase("gamemode")) { + if(args.length == 0) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cUsage: /" + c + " ")); + return true; + } + + if(args.length == 1) { + if(matchGameMode(args[0]) == null) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c" + args[0] + " is not a valid gamemode.")); + } else { + p.setGameMode(matchGameMode(args[0])); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYour gamemode has been set to &9%gamemode%") + .replace("%gamemode%", p.getGameMode().toString())); + } + return true; + } + + if(args.length == 2) { + if(matchGameMode(args[0]) == null) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c" + args[0] + " is not a valid gamemode.")); + return true; + } + Player target = Bukkit.getPlayer(args[1]); + + if(target != null && !target.isOnline()) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c" + args[1] + " is not online.")); + return true; + } + + target.setGameMode(matchGameMode(args[0])); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&9%player%s &egamemode has been set to &9%gamemode%") + .replace("%player%", target.getName()) + .replace("%gamemode%", p.getGameMode().toString())); + } + } + } + else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cNo permission")); + } + return true; + } + + private GameMode matchGameMode(String modeString) { + GameMode mode = null; + if(modeString.substring(0, 1).equals("s") || modeString.contains("" + 0)) { + mode = GameMode.SURVIVAL; + } else if(modeString.substring(0, 1).equals("c") || modeString.contains("" + 1)) { + mode = GameMode.CREATIVE; + } else if(modeString.substring(0, 1).equals("a") || modeString.contains("" + 2)) { + mode = GameMode.ADVENTURE; + } + + return mode; + } + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String c, String[] args) { + + if(args.length == 1) { + GameMode mode = matchGameMode(args[0]); + if(mode != null) { + return Arrays.asList(mode.toString().toLowerCase()); + } + } + + return Arrays.asList("creative", "survival", "adventure"); + } + +} diff --git a/src/com/houndpvp/hub/commands/InvSelectorCommand.java b/src/com/houndpvp/hub/commands/InvSelectorCommand.java new file mode 100644 index 0000000..a70db00 --- /dev/null +++ b/src/com/houndpvp/hub/commands/InvSelectorCommand.java @@ -0,0 +1,26 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.houndpvp.hub.inventory.SelectorInventory; + +public class InvSelectorCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + if(!(sender instanceof Player)) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYou must be a player to use this command.")); + return true; + } + + Player p = (Player) sender; + SelectorInventory.openInventory(p); + + + return true; + } +} diff --git a/src/com/houndpvp/hub/commands/MsgCommand.java b/src/com/houndpvp/hub/commands/MsgCommand.java new file mode 100644 index 0000000..1d259da --- /dev/null +++ b/src/com/houndpvp/hub/commands/MsgCommand.java @@ -0,0 +1,93 @@ +package com.houndpvp.hub.commands; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.md_5.bungee.api.ChatColor; +import ru.tehkode.permissions.bukkit.PermissionsEx; + +public class MsgCommand implements CommandExecutor { + + public static HashMap lastplayer; + public static HashMap sounds; + public static HashMap toggle; + + public MsgCommand() { + lastplayer = new HashMap(); + sounds = new HashMap(); + toggle = new HashMap(); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + Player p = (Player) sender; + StringBuilder str = new StringBuilder(); + + if(c.equalsIgnoreCase("msg") + || c.equalsIgnoreCase("m") + || c.equalsIgnoreCase("message") + || c.equalsIgnoreCase("tell") + || c.equalsIgnoreCase("w")) { + if(args.length == 0) { + p.sendMessage("§cUsage: /" + c + " "); + } else if(args.length == 1) { + p.sendMessage("§cUsage: /" + c + " "); + } else if(args.length >= 2) { + for (int i = 1; i < args.length; i++) { + str.append(args[i] + " "); + } + String message = str.toString(); + Player target = Bukkit.getPlayer(args[0]); + if(target != null) { + if(target.isOnline()) { + + if (!toggle.containsKey(p.getUniqueId())) { + toggle.put(p.getUniqueId(), true); + } + if (!toggle.containsKey(target.getUniqueId())) { + toggle.put(target.getUniqueId(), true); + } + + if(toggle.get(p.getUniqueId())) { + if(toggle.get(target.getUniqueId())) { + target.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&7(From &f%player%&7) %msg%". + replace("%player%", PermissionsEx.getUser(p).getSuffix() + p.getName()). + replace("%msg%", message))); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&7(To &f%player%&7) %msg%". + replace("%player%", PermissionsEx.getUser(target).getSuffix() + target.getName())). + replace("%msg%", message)); + lastplayer.put(p.getUniqueId(), target.getName()); + lastplayer.put(target.getUniqueId(), p.getName()); + if (!sounds.containsKey(target.getUniqueId())) { + sounds.put(target.getUniqueId(), true); + } + if(sounds.get(target.getUniqueId())) { + target.playSound(target.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "§c" + target.getName() + " has private messages off.")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "§cYou can't message someone with your PMs toggled")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "§cThat player is not online")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "§cThat player is not online")); + } + } + } + return true; + } + +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/commands/RawcastCommand.java b/src/com/houndpvp/hub/commands/RawcastCommand.java new file mode 100644 index 0000000..f338e67 --- /dev/null +++ b/src/com/houndpvp/hub/commands/RawcastCommand.java @@ -0,0 +1,48 @@ +package com.houndpvp.hub.commands; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +public class RawcastCommand + implements CommandExecutor +{ + + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) + { + if (args.length < 1) + { + sender.sendMessage(ChatColor.RED + "Usage: " + "/rawcast"); + return true; + } + String arg; + String requiredNode; + int position = 0; + if ((args.length > 2) && ((arg = args[0]).startsWith("-p"))) + { + int position1 = 1; + requiredNode = arg.substring(2, arg.length()); + } + else + { + position = 0; + requiredNode = null; + } + String message = StringUtils.join(args, ' ', position, args.length); + if (message.length() < 3) + { + sender.sendMessage(ChatColor.RED + "Broadcasts must be at least 3 characters."); + return true; + } + message = ChatColor.translateAlternateColorCodes('&', message); + if (requiredNode != null) { + Bukkit.broadcast(message, requiredNode); + } else { + Bukkit.broadcastMessage(message); + } + return true; + } +} diff --git a/src/com/houndpvp/hub/commands/ReplyCommand.java b/src/com/houndpvp/hub/commands/ReplyCommand.java new file mode 100644 index 0000000..169bf77 --- /dev/null +++ b/src/com/houndpvp/hub/commands/ReplyCommand.java @@ -0,0 +1,47 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import net.md_5.bungee.api.ChatColor; +import ru.tehkode.permissions.bukkit.PermissionsEx; + +public class ReplyCommand implements CommandExecutor { + + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + Player p = (Player) sender; + if(c.equalsIgnoreCase("r") || c.equalsIgnoreCase("reply")) { + if(args.length == 0) { + p.sendMessage("§cUsage: /" + c + " "); + } else if (args.length >= 1) { + String message = ""; + for (int i = 0; i < args.length; i++) { + if (message != "") message += " "; + String part = args[i]; + message += part; + } + if(MsgCommand.lastplayer.get(p.getUniqueId()) != null) { + Player target = Bukkit.getPlayer(MsgCommand.lastplayer.get(p.getUniqueId())); + if(target != null) { + if(target.isOnline()) { + target.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7(From &f%player%&7) %msg%".replace("%player%", PermissionsEx.getUser(p).getSuffix() + p.getName()).replace("%msg%", message))); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7(To &f%player%&7) %msg%".replace("%player%", PermissionsEx.getUser(target).getSuffix() + target.getName()).replace("%msg%", message))); + } else { + p.sendMessage("§cThat player is not online."); + } + } else { + p.sendMessage("§cThat player is not online."); + } + } else { + p.sendMessage("§cYou have not messaged anyone."); + } + } + } + return true; + } + +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/commands/SetSpawnCommand.java b/src/com/houndpvp/hub/commands/SetSpawnCommand.java new file mode 100644 index 0000000..a911af9 --- /dev/null +++ b/src/com/houndpvp/hub/commands/SetSpawnCommand.java @@ -0,0 +1,27 @@ +package com.houndpvp.hub.commands; + +import com.houndpvp.hub.*; + +import org.bukkit.Location; +import org.bukkit.command.*; +import org.bukkit.entity.*; + +public class SetSpawnCommand implements CommandExecutor { + + private Hub hub; + + public SetSpawnCommand(Hub Hub) { + this.hub = Hub; + } + + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (commandSender instanceof Player && commandSender.hasPermission("command.setspawn")) { + Player player = (Player)commandSender; + player.sendMessage(("§aYou have set the spawn location.")); + hub.getSpawn().setSpawn(player.getLocation()); + hub.getSpawn().save(); + return true; + } + return false; + } +} diff --git a/src/com/houndpvp/hub/commands/SoundsCommand.java b/src/com/houndpvp/hub/commands/SoundsCommand.java new file mode 100644 index 0000000..8b1d88b --- /dev/null +++ b/src/com/houndpvp/hub/commands/SoundsCommand.java @@ -0,0 +1,31 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SoundsCommand implements CommandExecutor { + + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + Player p = (Player) sender; + if(c.equalsIgnoreCase("sounds")) { + if (!MsgCommand.sounds.containsKey(p.getUniqueId())) { + MsgCommand.sounds.put(p.getUniqueId(), true); + } + if(MsgCommand.sounds.get(p.getUniqueId()).equals(true)) { + MsgCommand.sounds.remove(p.getUniqueId()); + MsgCommand.sounds.put(p.getUniqueId(), false); + p.sendMessage("§cYou will no longer hear message sounds."); + } else { + MsgCommand.sounds.remove(p.getUniqueId()); + MsgCommand.sounds.put(p.getUniqueId(), true); + p.sendMessage("§aYou will now hear message sounds."); + } + } + return true; + } + +} diff --git a/src/com/houndpvp/hub/commands/TeleportCommand.java b/src/com/houndpvp/hub/commands/TeleportCommand.java new file mode 100644 index 0000000..95ee02a --- /dev/null +++ b/src/com/houndpvp/hub/commands/TeleportCommand.java @@ -0,0 +1,71 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.md_5.bungee.api.ChatColor; + + + +public class TeleportCommand implements CommandExecutor { + + @SuppressWarnings("deprecation") + @Override + public boolean onCommand(CommandSender s, Command c, String lbl, String[] args) { + Player p = (Player) s; + + if (args.length == 2) { + if (args[0].equalsIgnoreCase("here")) { + if (p.hasPermission("hub.tphere")) { + Player t = Bukkit.getPlayer(args[1]); + if (t == null) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cThe player " + args[1] + " could not be found.")); + } else { + t.teleport(p); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eTeleported &9" + t.getName() + "&e to your location.")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &cno permission.")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cinvalid arguments.")); + } + } else if (args.length == 1) { + if (args[0].equalsIgnoreCase("all")) { + if (p.hasPermission("hcessentials.tpall")) { + if (!(Bukkit.getOnlinePlayers().length == 1)) { + for (Player allPlayers : Bukkit.getOnlinePlayers()) { + allPlayers.teleport(p); + } + Integer playerCount = Bukkit.getOnlinePlayers().length-1; + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eTeleported &9" + playerCount + "&e players to your location.")); + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cThere are not enough players to do /tp all")); + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cno permission.")); + } + } else { + Player t = Bukkit.getPlayer(args[0]); + if (t == null) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cThe player " + args[0] + " could not be found.")); + } else { + p.teleport(t); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&3Teleported to player &9" + t.getName())); + } + } + } else { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&m----------------------------------------")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &9Teleport Help")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &3* &7/tp [player] &f- &eteleports you the the player.")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &3* &7/tp all &f- &eteleports everyone to you.")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', " &3* &7/tp here [player] &f- &eteleports player to you.")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&m----------------------------------------")); + } + return true; + } + +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/commands/TogglePMCommand.java b/src/com/houndpvp/hub/commands/TogglePMCommand.java new file mode 100644 index 0000000..fd6f66a --- /dev/null +++ b/src/com/houndpvp/hub/commands/TogglePMCommand.java @@ -0,0 +1,32 @@ +package com.houndpvp.hub.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import net.md_5.bungee.api.ChatColor; + +public class TogglePMCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String c, String[] args) { + Player p = (Player) sender; + if (c.equalsIgnoreCase("togglepm")) { + if (!MsgCommand.toggle.containsKey(p.getUniqueId())) { + MsgCommand.toggle.put(p.getUniqueId(), true); + } + if (MsgCommand.toggle.get(p.getUniqueId()) == true) { + MsgCommand.toggle.put(p.getUniqueId(), false); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&7You have toggled your messages &coff")); + } else { + MsgCommand.toggle.put(p.getUniqueId(), true); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&7You have toggled your messages &aon")); + } + } + return true; + } + +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/inventory/SelectorInventory.java b/src/com/houndpvp/hub/inventory/SelectorInventory.java new file mode 100644 index 0000000..225697f --- /dev/null +++ b/src/com/houndpvp/hub/inventory/SelectorInventory.java @@ -0,0 +1,50 @@ +package com.houndpvp.hub.inventory; + +import java.util.Arrays; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import com.houndpvp.hub.Hub; +import com.houndpvp.hub.listeners.Listeners; +import com.houndpvp.hub.utils.Bungee; +import com.houndpvp.hub.utils.ItemBuilder; +import com.houndpvp.hub.utils.SpigotUtils; + +import net.md_5.bungee.api.ChatColor; + +public class SelectorInventory { + + public static void openInventory(Player p) { + Inventory inv = Bukkit.createInventory(null, 27); + + for(int x = 0; x < 27; x ++) { + inv.setItem(x, new ItemBuilder(Material.STAINED_GLASS_PANE).setName(" §7") + .setDurability((short) 15) + .toItemStack()); + } + + ConfigurationSection cs = Hub.getInstance().getConfig().getConfigurationSection("server-selector"); + for(String s : cs.getKeys(false)) { + ItemStack item = new ItemBuilder(Material.valueOf(cs.getString(s + ".type"))) + .setName(ChatColor.translateAlternateColorCodes('&', cs.getString(s + ".name"))) + .setLore(SpigotUtils.replaceArray(SpigotUtils.colorArray(cs.getStringList(s + ".lore")), "%count%", Bungee.getCount(cs.getString(s + ".server")) + "")) + .addEnchant(Enchantment.DURABILITY, 1) + .toItemStack(); + + inv.setItem(cs.getInt(s + ".slot"), item); + + } + p.openInventory(inv); + + + + } + +} diff --git a/src/com/houndpvp/hub/listeners/DoubleJumpListener.java b/src/com/houndpvp/hub/listeners/DoubleJumpListener.java new file mode 100644 index 0000000..ea65627 --- /dev/null +++ b/src/com/houndpvp/hub/listeners/DoubleJumpListener.java @@ -0,0 +1,66 @@ +package com.houndpvp.hub.listeners; + +import org.bukkit.Effect; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +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.PlayerMoveEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent; +import org.bukkit.plugin.Plugin; + +import com.houndpvp.hub.Hub; + + +public class DoubleJumpListener implements Listener { + + @EventHandler + public void onPlayerToggleFlight(final PlayerToggleFlightEvent event) { + final Player player = event.getPlayer(); + final Sound sound = Sound.BLAZE_HIT; + final Effect effect = Effect.EXPLOSION; + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + event.setCancelled(true); + player.setAllowFlight(false); + player.setFlying(false); + player.setVelocity(player.getLocation().getDirection().multiply(1.5).setY(1)); + player.playSound(player.getLocation(), sound, 1.0f, 0.0f); + player.playEffect(player.getLocation(), effect, (Object)null); + } + + @EventHandler + public void onPlayerMove(final PlayerMoveEvent event) { + final Player player = event.getPlayer(); + if (player.getGameMode() != GameMode.CREATIVE && player.getLocation().subtract(0.0, 1.0, 0.0).getBlock().getType() != Material.AIR && !player.isFlying()) { + player.setAllowFlight(true); + } + } + + @EventHandler + public void onFallDamage(final EntityDamageEvent e) { + if (e.getEntity() instanceof Player && e.getCause() == EntityDamageEvent.DamageCause.FALL) { + e.setCancelled(true); + } + } + + @EventHandler + public void move(final PlayerMoveEvent e) { + final Player f = e.getPlayer(); + if (e.getTo().getY() < 2.0) { + Hub.getInstance().getServer().getScheduler().scheduleSyncDelayedTask((Plugin)Hub.getInstance(), (Runnable)new Runnable() { + @Override + public void run() { + final double y = f.getLocation().getY() - 2.0; + final Location l = new Location(f.getLocation().getWorld(), f.getLocation().getX(), y, f.getLocation().getZ(), f.getLocation().getYaw(), f.getLocation().getPitch()); + f.getWorld().playEffect(l, Effect.ENDER_SIGNAL, 50, 30); + } + }, 10L); + } + } +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/listeners/Listeners.java b/src/com/houndpvp/hub/listeners/Listeners.java new file mode 100644 index 0000000..1e6477b --- /dev/null +++ b/src/com/houndpvp/hub/listeners/Listeners.java @@ -0,0 +1,275 @@ +package com.houndpvp.hub.listeners; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemDamageEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.weather.WeatherChangeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import com.houndpvp.hub.Hub; +import com.houndpvp.hub.commands.BuilderCommand; +import com.houndpvp.hub.inventory.SelectorInventory; +import com.houndpvp.hub.utils.Bungee; +import com.houndpvp.hub.utils.ItemBuilder; +import com.houndpvp.hub.utils.SpigotUtils; + +import lombok.Getter; +import me.signatured.ezqueuespigot.EzQueueAPI; +import net.md_5.bungee.api.ChatColor; + +public class Listeners implements Listener { + + @EventHandler + public void inventoryClick(InventoryClickEvent e) { + if(BuilderCommand.getBuilders().contains(e.getWhoClicked())) { + return; + } + e.setCancelled(true); + + } + @EventHandler + public void onMove(PlayerMoveEvent e) { + Player player = e.getPlayer(); + player.setFoodLevel(20); + player.setSaturation(20.0f); + } + + @EventHandler + public void inventoryDrag(InventoryDragEvent e) { + if(BuilderCommand.getBuilders().contains(e.getWhoClicked())) { + return; + } + e.setCancelled(true); + } + + @EventHandler + public void onDrop(PlayerDropItemEvent e) { + e.setCancelled(true); + + } + + @EventHandler + public void onDamage(PlayerItemDamageEvent e) { + e.setCancelled(true); + + + } + + + @EventHandler public void onChat(AsyncPlayerChatEvent e) { Player p = + e.getPlayer(); String group = + Hub.getInstance().getPerms().getPrimaryGroup(p); String prefix = + Hub.getInstance().getChat().getGroupPrefix(p.getWorld(), group); + + + + + e.setFormat(ChatColor.translateAlternateColorCodes('&', + Hub.getInstance().getConfig().getString("chat-format") .replace("%prefix%", + prefix) .replace("%player%", p.getName()) .replace("%message%", + ChatColor.stripColor(e.getMessage())))); + + + + } + + @EventHandler + public void onBreak(BlockBreakEvent e) { + if(BuilderCommand.getBuilders().contains(e.getPlayer())) { + return; + } + + e.setCancelled(true); + } + + @EventHandler + public void onPlace(BlockPlaceEvent e) { + if(BuilderCommand.getBuilders().contains(e.getPlayer())) { + return; + } + + e.setCancelled(true); + } + + @EventHandler + public void onClick(PlayerInteractEvent e) { + Player player = e.getPlayer(); + + if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) { + if(e.getItem() != null && e.getItem().isSimilar(selector)) { + SelectorInventory.openInventory(e.getPlayer()); + } else if(e.getItem() != null && e.getItem().isSimilar(enderbutt)) { + e.setCancelled(true); + + Item item = player.getWorld().dropItem(player.getLocation().add(0.0D, 0.5D, 0.0D), new ItemStack(Material.ENDER_PEARL, 16)); + item.setPickupDelay(10000); + item.setVelocity(player.getLocation().getDirection().normalize().multiply(1.5F)); + item.setPassenger(player); + player.getWorld().playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 1.0F, 1.0F); + this.setupEnderpearlRunnable(item); + player.updateInventory(); + + + } + + + } + } + + @EventHandler + public void onPearl(ProjectileLaunchEvent e) { + Entity projectile = (Entity) e.getEntity(); + if(e.getEntityType() == EntityType.ENDER_PEARL) { + Player p = (Player) e.getEntity().getShooter(); + projectile.setPassenger(p); + + } + + + + } + + @EventHandler + public void mobSpawn(CreatureSpawnEvent e) { + e.setCancelled(true); + } + + @EventHandler + public void damageEvent(EntityDamageEvent e) { + Entity entity = e.getEntity(); + if(entity instanceof Player) { + e.setCancelled(true); + } + + + + } + + @EventHandler + public void invClick(InventoryClickEvent e) { + ConfigurationSection cs = Hub.getInstance().getConfig().getConfigurationSection("server-selector"); + if(e.getCurrentItem() == null) { + return; + } + + for(String s : cs.getKeys(false)) { + ItemStack item = new ItemBuilder(Material.valueOf(cs.getString(s + ".type"))) + .setName(ChatColor.translateAlternateColorCodes('&', cs.getString(s + ".name"))) + .setLore(SpigotUtils.replaceArray(SpigotUtils.colorArray(cs.getStringList(s + ".lore")), "%count%", Bungee.getCount(cs.getString(s + ".server")) + "")) + .addEnchant(Enchantment.DURABILITY, 1) + .toItemStack(); + + if(e.getCurrentItem().isSimilar(item)) { + EzQueueAPI.addToQueue((Player) e.getWhoClicked(), s); + } + } + + + } + + @Getter static ItemStack selector = new ItemBuilder(Material.BOOK) + .setName("§5Server Selector §7(Right Click)") + .toItemStack(); + + @Getter static ItemStack enderbutt = new ItemBuilder(Material.ENDER_PEARL) + .setName("§5Enderpearl §7(Right Click)") + .toItemStack(); + + @EventHandler + public void onWeatherChange(WeatherChangeEvent e) { + e.setCancelled(true); + + + } + @EventHandler + public void FoodLevelChange(FoodLevelChangeEvent e) { + Player player = (Player) e.getEntity(); + player.setFoodLevel(20); + player.setSaturation(20.0f); + player.setHealth(20.0); + player.setSaturation(10.0f); + } + + + @EventHandler + public void onJoin(PlayerJoinEvent e) { + Player p = e.getPlayer(); + + e.setJoinMessage(null); + + p.getInventory().clear(); + + p.getInventory().setItem(4, selector); + p.getInventory().setItem(0, enderbutt); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&m---------------------------------")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Welcome &5" + p.getName() + " &7to the &5ExemPvP Network")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&5* &7Website: &fexempvp.net")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&5* &7Store: &fstore.exempvp.net")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&5* &7Discord: &fexempvp.net/discord")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&5* &7Teamspeak: &fts.exempvp.net")); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&m---------------------------------")); + p.teleport(Hub.getInstance().getSpawn().getSpawn()); + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 3)); + p.setGameMode(GameMode.ADVENTURE); + p.setHealth(20); + p.setFoodLevel(20); + } + + + @EventHandler + public void onJoin(PlayerQuitEvent e) { + Player p = e.getPlayer(); + + e.setQuitMessage(null); + } + + public void setupEnderpearlRunnable(final Item item) { + (new BukkitRunnable() { + public void run() { + if (item.isDead()) { + this.cancel(); + } + + if (item.getVelocity().getX() == 0.0D || item.getVelocity().getY() == 0.0D || item.getVelocity().getZ() == 0.0D) { + Player player = (Player)item.getPassenger(); + item.remove(); + if (player != null) { + player.teleport(player.getLocation().add(0.0D, 0.5D, 0.0D)); + } + + this.cancel(); + } + + } + }).runTaskTimer(Hub.getInstance(), 2L, 1L); + } + +} diff --git a/src/com/houndpvp/hub/scoreboard/ScoreboardProvider.java b/src/com/houndpvp/hub/scoreboard/ScoreboardProvider.java new file mode 100644 index 0000000..1a24816 --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/ScoreboardProvider.java @@ -0,0 +1,57 @@ +package com.houndpvp.hub.scoreboard; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import com.houndpvp.hub.Hub; +import com.houndpvp.hub.scoreboard.providers.ScoreboardEntryProvider; +import com.houndpvp.hub.utils.Bungee; + +import me.signatured.ezqueuespigot.EzQueueAPI; +import net.minecraft.util.org.apache.commons.lang3.text.WordUtils; +import ru.tehkode.permissions.bukkit.PermissionsEx; + +public class ScoreboardProvider implements ScoreboardEntryProvider +{ + private Hub plugin; + + private List template = new ArrayList<>(); + public static String lastline; + + public ScoreboardProvider(final Hub plugin) { + this.plugin = plugin; + } + + @Override + public List getScoreboardEntries(final Player player) { + List lines = new ArrayList(); + if(EzQueueAPI.getQueue(player.getName()) == null) { + for(String s : Hub.getInstance().getConfig().getStringList("scoreboard")) { + lines.add(ChatColor.translateAlternateColorCodes('&', s + .replace("%online%", Bungee.getCount("ALL") + "") + .replace("%rank%", Hub.getInstance().getChat().getGroupSuffix(player.getWorld(), Hub.getInstance().getPerms().getPrimaryGroup(player)) + WordUtils.capitalize(Hub.getInstance().getPerms().getPrimaryGroup(player)))) + .replace("%user%", player.getName())); + } + } else { + for(String s : Hub.getInstance().getConfig().getStringList("scoreboard-inqueue")) { + lines.add(ChatColor.translateAlternateColorCodes('&', s + .replace("%position%", EzQueueAPI.getPosition(player) + "") + .replace("%inqueue%", EzQueueAPI.getPlayersInQueue(EzQueueAPI.getQueue(player)).size() + "") + .replace("%online%", Bungee.getCount("ALL") + "") + .replace("%rank%", Hub.getInstance().getChat().getGroupSuffix(player.getWorld(), Hub.getInstance().getPerms().getPrimaryGroup(player)) + WordUtils.capitalize(Hub.getInstance().getPerms().getPrimaryGroup(player)))) + .replace("%user%", player.getName())); + } + } + + + return lines; + } + + + + + +} diff --git a/src/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.java b/src/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.java new file mode 100644 index 0000000..77d470a --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/providers/PlayerScoreboard.java @@ -0,0 +1,112 @@ +package com.houndpvp.hub.scoreboard.providers; + +import org.bukkit.entity.*; + +import com.houndpvp.hub.scoreboard.providers.reflection.ReflectionConstants; + +import org.bukkit.craftbukkit.v1_7_R4.entity.*; +import net.minecraft.server.v1_7_R4.*; +import org.apache.commons.lang.*; +import java.util.*; +import org.bukkit.*; + +public class PlayerScoreboard +{ + public static final String[] TEAM_NAMES; + private final Player player; + private final PlayerConnection connection; + private final String objectiveName; + private int lastSent; + private boolean valid; + + @SuppressWarnings("unchecked") + public PlayerScoreboard(final Player player) { + lastSent = 0; + valid = true; + this.player = player; + connection = ((CraftPlayer)player).getHandle().playerConnection; + objectiveName = "Sidebar-" + RandomStringUtils.random(8, "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789$_?*+-/()[]{}%!=&@<>~"); + final PacketPlayOutScoreboardObjective objective = new PacketPlayOutScoreboardObjective(); + ReflectionConstants.SCOREBOARD_OBJECTIVE_NAME.set(objective, objectiveName); + ReflectionConstants.SCOREBOARD_OBJECTIVE_TITLE.set(objective, ScoreboardManager.instance.getTitle()); + ReflectionConstants.SCOREBOARD_OBJECTIVE_ACTION.set(objective, 0); + this.connection.sendPacket((Packet)objective); + final PacketPlayOutScoreboardDisplayObjective displayObjective = new PacketPlayOutScoreboardDisplayObjective(); + ReflectionConstants.SCOREBOARD_DISPLAY_OBJECTIVE_NAME.set(displayObjective, this.objectiveName); + ReflectionConstants.SCOREBOARD_DISPLAY_OBJECTIVE_POSITION.set(displayObjective, 1); + connection.sendPacket((Packet)displayObjective); + for (int i = 0; i < 15; ++i) { + final PacketPlayOutScoreboardTeam team = new PacketPlayOutScoreboardTeam(); + ReflectionConstants.SCOREBOARD_TEAM_NAME.set(team, PlayerScoreboard.TEAM_NAMES[i]); + ReflectionConstants.SCOREBOARD_TEAM_PLAYERS.get(team).add(PlayerScoreboard.TEAM_NAMES[i]); + this.connection.sendPacket((Packet)team); + } + } + + public void send() { + if (!this.valid) { + return; + } + final List lines = ScoreboardManager.instance.getProvider().getScoreboardEntries(this.player); + if (this.lastSent != lines.size()) { + for (int i = 0; i < 15; ++i) { + final PacketPlayOutScoreboardScore score = new PacketPlayOutScoreboardScore(); + ReflectionConstants.SCOREBOARD_SCORE_NAME.set(score, PlayerScoreboard.TEAM_NAMES[i]); + ReflectionConstants.SCOREBOARD_SCORE_OBJECTIVE.set(score, this.objectiveName); + ReflectionConstants.SCOREBOARD_SCORE_ACTION.set(score, 1); + this.connection.sendPacket((Packet)score); + } + } + for (int i = 0; i < Math.min(lines.size(), 15); ++i) { + final String line = lines.get(i); + String right = ""; + String left; + if (line.length() < 17) { + left = line; + } + else { + left = line.substring(0, 16); + right = line.substring(16, line.length()); + if (left.endsWith("§")) { + left = left.substring(0, left.length() - 1); + right = "§" + right; + } + final String lastColors = ChatColor.getLastColors(left); + right = lastColors + right; + } + final PacketPlayOutScoreboardTeam team = new PacketPlayOutScoreboardTeam(); + ReflectionConstants.SCOREBOARD_TEAM_NAME.set(team, PlayerScoreboard.TEAM_NAMES[i]); + ReflectionConstants.SCOREBOARD_TEAM_PREFIX.set(team, left); + ReflectionConstants.SCOREBOARD_TEAM_SUFFIX.set(team, StringUtils.left(right, 16)); + ReflectionConstants.SCOREBOARD_TEAM_ACTION.set(team, 2); + this.connection.sendPacket((Packet)team); + final PacketPlayOutScoreboardScore score2 = new PacketPlayOutScoreboardScore(); + ReflectionConstants.SCOREBOARD_SCORE_NAME.set(score2, PlayerScoreboard.TEAM_NAMES[i]); + ReflectionConstants.SCOREBOARD_SCORE_SCORE.set(score2, 15 - i); + ReflectionConstants.SCOREBOARD_SCORE_OBJECTIVE.set(score2, this.objectiveName); + this.connection.sendPacket((Packet)score2); + } + this.lastSent = lines.size(); + } + + public void clean() { + for (int i = 0; i < 15; ++i) { + final PacketPlayOutScoreboardTeam team = new PacketPlayOutScoreboardTeam(); + ReflectionConstants.SCOREBOARD_TEAM_NAME.set(team, PlayerScoreboard.TEAM_NAMES[i]); + ReflectionConstants.SCOREBOARD_TEAM_ACTION.set(team, 4); + this.connection.sendPacket((Packet)team); + } + this.player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); + this.valid = false; + } + + static { + TEAM_NAMES = new String[15]; + final ChatColor[] colors = ChatColor.values(); + for (int i = 0; i < 15; ++i) { + final ChatColor left = colors[i]; + final ChatColor right = colors[15 - i]; + PlayerScoreboard.TEAM_NAMES[i] = left.toString() + ChatColor.RESET + right.toString() + ChatColor.RESET; + } + } +} diff --git a/src/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.java b/src/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.java new file mode 100644 index 0000000..99ffda5 --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/providers/ScoreboardEntryProvider.java @@ -0,0 +1,9 @@ +package com.houndpvp.hub.scoreboard.providers; + +import org.bukkit.entity.*; +import java.util.*; + +public interface ScoreboardEntryProvider +{ + List getScoreboardEntries(final Player p0); +} diff --git a/src/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.java b/src/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.java new file mode 100644 index 0000000..439da5a --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/providers/ScoreboardManager.java @@ -0,0 +1,94 @@ +package com.houndpvp.hub.scoreboard.providers; + +import java.util.*; +import org.bukkit.plugin.java.*; +import java.util.concurrent.*; +import org.bukkit.*; +import org.bukkit.plugin.*; +import org.bukkit.entity.*; +import org.bukkit.event.player.*; +import org.bukkit.event.server.*; +import org.bukkit.event.*; + +public class ScoreboardManager implements Listener +{ + public static ScoreboardManager instance; + public final ScoreboardEntryProvider provider; + private final String title; + private final Map scoreboards; + private final JavaPlugin plugin; + public boolean debugging; + + public ScoreboardManager(final JavaPlugin plugin, final ScoreboardEntryProvider provider, final String title) { + ScoreboardManager.instance = this; + this.plugin = plugin; + this.provider = provider; + this.debugging = true; + this.title = title; + this.scoreboards = new ConcurrentHashMap(); + Bukkit.getPluginManager().registerEvents((Listener)this, (Plugin)plugin); + UUID uniqueId; + for(Player pp : Bukkit.getOnlinePlayers()) { + if (this.debugging) { + plugin.getLogger().info("[ScoreboardManager] Loaded scoreboard for " + pp.getName() + "[" + pp.getUniqueId().toString() + "]"); + } + uniqueId = pp.getUniqueId(); + this.scoreboards.putIfAbsent(uniqueId, new PlayerScoreboard(pp)); + } + Bukkit.getScheduler().runTaskTimer(plugin, this::update, 0, 1L); + } + + @EventHandler + public void onJoin(final PlayerJoinEvent event) { + final Player player = event.getPlayer(); + final UUID uuid = player.getUniqueId(); + Bukkit.getScheduler().runTaskLater((Plugin)this.plugin, () -> { + if (this.debugging) { + this.plugin.getLogger().info("[ScoreboardManager] Loaded scoreboard for " + player.getName() + "[" + player.getUniqueId().toString() + "]"); + } + this.scoreboards.putIfAbsent(uuid, new PlayerScoreboard(player)); + }, 2L); + } + + @EventHandler + public void onQuit(final PlayerQuitEvent event) { + final Player player = event.getPlayer(); + final UUID uniqueId = player.getUniqueId(); + final PlayerScoreboard scoreboard; + if ((scoreboard = this.scoreboards.remove(uniqueId)) != null) { + if (this.debugging) { + this.plugin.getLogger().info("[ScoreboardManager] Deleted scoreboard of " + player.getName() + "[" + player.getUniqueId().toString() + "]"); + } + scoreboard.clean(); + } + } + + @EventHandler + public void onDisable(final PluginDisableEvent event) { + if (event.getPlugin() == this.plugin) { + this.scoreboards.forEach((id, board) -> board.clean()); + this.scoreboards.clear(); + HandlerList.unregisterAll((Listener)this); + } + } + + public void update() { + this.scoreboards.forEach((id, board) -> board.send()); + } + + public static ScoreboardManager getInstance() { + return ScoreboardManager.instance; + } + + public ScoreboardEntryProvider getProvider() { + return this.provider; + } + + public String getTitle() { + return this.title; + } + + public Map getScoreboards() { + return this.scoreboards; + } +} diff --git a/src/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.java b/src/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.java new file mode 100644 index 0000000..4f83e3b --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/providers/reflection/Reflection.java @@ -0,0 +1,200 @@ +package com.houndpvp.hub.scoreboard.providers.reflection; + +import java.util.*; +import java.lang.reflect.*; +import java.util.regex.*; +import org.bukkit.*; + +public final class Reflection { + private static String OBC_PREFIX; + private static String NMS_PREFIX; + private static String VERSION; + private static Pattern MATCH_VARIABLE; + + public static FieldAccessor getField(final Class target, final String name, final Class fieldType) { + return getField(target, name, fieldType, 0); + } + + public static FieldAccessor getField(final String className, final String name, final Class fieldType) { + return getField(getClass(className), name, fieldType, 0); + } + + public static FieldAccessor getField(final Class target, final Class fieldType, final int index) { + return getField(target, null, fieldType, index); + } + + public static FieldAccessor getField(final String className, final Class fieldType, final int index) { + return getField(getClass(className), fieldType, index); + } + + @SuppressWarnings("unchecked") + private static FieldAccessor getField(final Class target, final String name, final Class fieldType, + int index) { + for (final Field field : target.getDeclaredFields()) { + if ((name == null || field.getName().equals(name)) && fieldType.isAssignableFrom(field.getType()) + && index-- <= 0) { + field.setAccessible(true); + return new FieldAccessor() { + @Override + public T get(final Object target) { + try { + return (T) field.get(target); + } catch (IllegalAccessException e) { + throw new RuntimeException("Cannot access reflection.", e); + } + } + + @Override + public void set(final Object target, final Object value) { + try { + field.set(target, value); + } catch (IllegalAccessException e) { + throw new RuntimeException("Cannot access reflection.", e); + } + } + + @Override + public boolean hasField(final Object target) { + return field.getDeclaringClass().isAssignableFrom(target.getClass()); + } + }; + } + } + if (target.getSuperclass() != null) { + return (FieldAccessor) getField(target.getSuperclass(), name, (Class) fieldType, index); + } + throw new IllegalArgumentException("Cannot find field with type " + fieldType); + } + + public static MethodInvoker getMethod(final String className, final String methodName, final Class... params) { + return getTypedMethod(getClass(className), methodName, null, params); + } + + public static MethodInvoker getMethod(final Class clazz, final String methodName, final Class... params) { + return getTypedMethod(clazz, methodName, null, params); + } + + public static MethodInvoker getTypedMethod(final Class clazz, final String methodName, final Class returnType, + final Class... params) { + for (final Method method : clazz.getDeclaredMethods()) { + if ((methodName == null || method.getName().equals(methodName)) + && (returnType == null || method.getReturnType().equals(returnType)) + && Arrays.equals(method.getParameterTypes(), params)) { + method.setAccessible(true); + return new MethodInvoker() { + @Override + public Object invoke(final Object target, final Object... arguments) { + try { + return method.invoke(target, arguments); + } catch (Exception e) { + throw new RuntimeException("Cannot invoke method " + method, e); + } + } + }; + } + } + if (clazz.getSuperclass() != null) { + return getMethod(clazz.getSuperclass(), methodName, params); + } + throw new IllegalStateException( + String.format("Unable to find method %s (%s).", methodName, Arrays.asList(params))); + } + + public static ConstructorInvoker getConstructor(final String className, final Class... params) { + return getConstructor(getClass(className), params); + } + + public static ConstructorInvoker getConstructor(final Class clazz, final Class... params) { + for (final Constructor constructor : clazz.getDeclaredConstructors()) { + if (Arrays.equals(constructor.getParameterTypes(), params)) { + constructor.setAccessible(true); + return new ConstructorInvoker() { + @Override + public Object invoke(final Object... arguments) { + try { + return constructor.newInstance(arguments); + } catch (Exception e) { + throw new RuntimeException("Cannot invoke constructor " + constructor, e); + } + } + }; + } + } + throw new IllegalStateException( + String.format("Unable to find constructor for %s (%s).", clazz, Arrays.asList(params))); + } + + @SuppressWarnings("unchecked") + public static Class getUntypedClass(final String lookupName) { + final Class clazz = (Class) getClass(lookupName); + return clazz; + } + + public static Class getClass(final String lookupName) { + return getCanonicalClass(expandVariables(lookupName)); + } + + public static Class getMinecraftClass(final String name) { + return getCanonicalClass(Reflection.NMS_PREFIX + "." + name); + } + + public static Class getCraftBukkitClass(final String name) { + return getCanonicalClass(Reflection.OBC_PREFIX + "." + name); + } + + private static Class getCanonicalClass(final String canonicalName) { + try { + return Class.forName(canonicalName); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("Cannot find " + canonicalName, e); + } + } + + private static String expandVariables(final String name) { + final StringBuffer output = new StringBuffer(); + final Matcher matcher = Reflection.MATCH_VARIABLE.matcher(name); + while (matcher.find()) { + final String variable = matcher.group(1); + String replacement; + if ("nms".equalsIgnoreCase(variable)) { + replacement = Reflection.NMS_PREFIX; + } else if ("obc".equalsIgnoreCase(variable)) { + replacement = Reflection.OBC_PREFIX; + } else { + if (!"version".equalsIgnoreCase(variable)) { + throw new IllegalArgumentException("Unknown variable: " + variable); + } + replacement = Reflection.VERSION; + } + if (replacement.length() > 0 && matcher.end() < name.length() && name.charAt(matcher.end()) != '.') { + replacement += "."; + } + matcher.appendReplacement(output, Matcher.quoteReplacement(replacement)); + } + matcher.appendTail(output); + return output.toString(); + } + + static { + Reflection.OBC_PREFIX = Bukkit.getServer().getClass().getPackage().getName(); + Reflection.NMS_PREFIX = Reflection.OBC_PREFIX.replace("org.bukkit.craftbukkit", "net.minecraft.server"); + Reflection.VERSION = Reflection.OBC_PREFIX.replace("org.bukkit.craftbukkit", "").replace(".", ""); + Reflection.MATCH_VARIABLE = Pattern.compile("\\{([^\\}]+)\\}"); + } + + public interface FieldAccessor { + T get(final Object p0); + + void set(final Object p0, final Object p1); + + boolean hasField(final Object p0); + } + + public interface MethodInvoker { + Object invoke(final Object p0, final Object... p1); + } + + public interface ConstructorInvoker { + Object invoke(final Object... p0); + } +} diff --git a/src/com/houndpvp/hub/scoreboard/providers/reflection/ReflectionConstants.java b/src/com/houndpvp/hub/scoreboard/providers/reflection/ReflectionConstants.java new file mode 100644 index 0000000..4526e5d --- /dev/null +++ b/src/com/houndpvp/hub/scoreboard/providers/reflection/ReflectionConstants.java @@ -0,0 +1,60 @@ +package com.houndpvp.hub.scoreboard.providers.reflection; + +import java.util.*; + + +public class ReflectionConstants +{ + public static final Class SCOREBOARD_OBJECTIVE_CLASS; + public static final Reflection.ConstructorInvoker SCOREBOARD_OBJECTIVE_CONSTRUCTOR; + public static final Reflection.FieldAccessor SCOREBOARD_OBJECTIVE_NAME; + public static final Reflection.FieldAccessor SCOREBOARD_OBJECTIVE_TITLE; + public static final Reflection.FieldAccessor SCOREBOARD_OBJECTIVE_ACTION; + public static final Class SCOREBOARD_DISPLAY_OBJECTIVE_CLASS; + public static final Reflection.ConstructorInvoker SCOREBOARD_DISPLAY_OBJECTIVE_CONSTRUCTOR; + public static final Reflection.FieldAccessor SCOREBOARD_DISPLAY_OBJECTIVE_NAME; + public static final Reflection.FieldAccessor SCOREBOARD_DISPLAY_OBJECTIVE_POSITION; + public static final Class SCOREBOARD_TEAM_CLASS; + public static final Reflection.ConstructorInvoker SCOREBOARD_TEAM_CONSTRUCTOR; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_NAME; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_DISPLAY_NAME; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_PREFIX; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_SUFFIX; + @SuppressWarnings("rawtypes") + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_PLAYERS; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_ACTION; + public static final Reflection.FieldAccessor SCOREBOARD_TEAM_OPTIONS; + public static final Class SCOREBOARD_SCORE_CLASS; + public static final Reflection.ConstructorInvoker SCOREBOARD_SCORE_CONSTRUCTOR; + public static final Reflection.FieldAccessor SCOREBOARD_SCORE_NAME; + public static final Reflection.FieldAccessor SCOREBOARD_SCORE_OBJECTIVE; + public static final Reflection.FieldAccessor SCOREBOARD_SCORE_SCORE; + public static final Reflection.FieldAccessor SCOREBOARD_SCORE_ACTION; + + static { + SCOREBOARD_OBJECTIVE_CLASS = Reflection.getMinecraftClass("PacketPlayOutScoreboardObjective"); + SCOREBOARD_OBJECTIVE_CONSTRUCTOR = Reflection.getConstructor(ReflectionConstants.SCOREBOARD_OBJECTIVE_CLASS, (Class[])new Class[0]); + SCOREBOARD_OBJECTIVE_NAME = Reflection.getField(ReflectionConstants.SCOREBOARD_OBJECTIVE_CLASS, String.class, 0); + SCOREBOARD_OBJECTIVE_TITLE = Reflection.getField(ReflectionConstants.SCOREBOARD_OBJECTIVE_CLASS, String.class, 1); + SCOREBOARD_OBJECTIVE_ACTION = Reflection.getField(ReflectionConstants.SCOREBOARD_OBJECTIVE_CLASS, Integer.TYPE, 0); + SCOREBOARD_DISPLAY_OBJECTIVE_CLASS = Reflection.getMinecraftClass("PacketPlayOutScoreboardDisplayObjective"); + SCOREBOARD_DISPLAY_OBJECTIVE_CONSTRUCTOR = Reflection.getConstructor(ReflectionConstants.SCOREBOARD_DISPLAY_OBJECTIVE_CLASS, (Class[])new Class[0]); + SCOREBOARD_DISPLAY_OBJECTIVE_NAME = Reflection.getField(ReflectionConstants.SCOREBOARD_DISPLAY_OBJECTIVE_CLASS, String.class, 0); + SCOREBOARD_DISPLAY_OBJECTIVE_POSITION = Reflection.getField(ReflectionConstants.SCOREBOARD_DISPLAY_OBJECTIVE_CLASS, Integer.TYPE, 0); + SCOREBOARD_TEAM_CLASS = Reflection.getMinecraftClass("PacketPlayOutScoreboardTeam"); + SCOREBOARD_TEAM_CONSTRUCTOR = Reflection.getConstructor(ReflectionConstants.SCOREBOARD_TEAM_CLASS, (Class[])new Class[0]); + SCOREBOARD_TEAM_NAME = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, String.class, 0); + SCOREBOARD_TEAM_DISPLAY_NAME = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, String.class, 1); + SCOREBOARD_TEAM_PREFIX = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, String.class, 2); + SCOREBOARD_TEAM_SUFFIX = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, String.class, 3); + SCOREBOARD_TEAM_PLAYERS = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, Collection.class, 0); + SCOREBOARD_TEAM_ACTION = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, Integer.TYPE, 0); + SCOREBOARD_TEAM_OPTIONS = Reflection.getField(ReflectionConstants.SCOREBOARD_TEAM_CLASS, Integer.TYPE, 1); + SCOREBOARD_SCORE_CLASS = Reflection.getMinecraftClass("PacketPlayOutScoreboardScore"); + SCOREBOARD_SCORE_CONSTRUCTOR = Reflection.getConstructor(ReflectionConstants.SCOREBOARD_SCORE_CLASS, (Class[])new Class[0]); + SCOREBOARD_SCORE_NAME = Reflection.getField(ReflectionConstants.SCOREBOARD_SCORE_CLASS, String.class, 0); + SCOREBOARD_SCORE_OBJECTIVE = Reflection.getField(ReflectionConstants.SCOREBOARD_SCORE_CLASS, String.class, 1); + SCOREBOARD_SCORE_SCORE = Reflection.getField(ReflectionConstants.SCOREBOARD_SCORE_CLASS, Integer.TYPE, 0); + SCOREBOARD_SCORE_ACTION = Reflection.getField(ReflectionConstants.SCOREBOARD_SCORE_CLASS, (Class)Integer.TYPE, 1); + } +} diff --git a/src/com/houndpvp/hub/tablist/Azazel.java b/src/com/houndpvp/hub/tablist/Azazel.java new file mode 100644 index 0000000..01e0e02 --- /dev/null +++ b/src/com/houndpvp/hub/tablist/Azazel.java @@ -0,0 +1,101 @@ +package com.houndpvp.hub.tablist; + +import lombok.Getter; +import lombok.Setter; +import net.minecraft.server.v1_7_R4.EntityPlayer; +import net.minecraft.server.v1_7_R4.PacketPlayOutPlayerInfo; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import com.houndpvp.hub.tablist.tab.Tab; +import com.houndpvp.hub.tablist.tab.TabAdapter; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class Azazel implements Listener { + + @Getter private final JavaPlugin plugin; + private final Map tabs; + @Setter private TabAdapter adapter; + + @SuppressWarnings("deprecation") + public Azazel(JavaPlugin plugin) { + this.plugin = plugin; + this.tabs = new ConcurrentHashMap<>(); + + if (Bukkit.getMaxPlayers() < 60) { + Bukkit.getLogger().severe("There aren't 60 player slots, this will fuck up the tab list."); //TODO: Possibly set max players to 60? + } + + for (Player player : Bukkit.getOnlinePlayers()) { + if (((CraftPlayer)player).getHandle().playerConnection.networkManager.getVersion() < 47) { + if (!(tabs.containsKey(player.getUniqueId()))) { + tabs.put(player.getUniqueId(), new Tab(player, true, this)); + } + } + } + + new AzazelTask(this, plugin); + + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + public Azazel(JavaPlugin plugin, TabAdapter adapter) { + this(plugin); + + this.adapter = adapter; + } + + public Tab getTabByPlayer(Player player) { + return tabs.get(player.getUniqueId()); + } + + @SuppressWarnings("deprecation") + @EventHandler + public void onPlayerJoinEvent(PlayerJoinEvent event) { + for (Player player : Bukkit.getOnlinePlayers()) { + PacketPlayOutPlayerInfo packet = PacketPlayOutPlayerInfo.removePlayer(((CraftPlayer)event.getPlayer()).getHandle()); + ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet); + } + + new BukkitRunnable() { + @Override + public void run() { + tabs.put(event.getPlayer().getUniqueId(), new Tab(event.getPlayer(), true, Azazel.this)); + } + }.runTaskLater(plugin, 20L); + } + + @SuppressWarnings("deprecation") + @EventHandler + public void onPlayerQuitEvent(PlayerQuitEvent event) { + tabs.remove(event.getPlayer().getUniqueId()); + + for (Player other : Bukkit.getOnlinePlayers()) { + EntityPlayer entityPlayer = ((CraftPlayer)other).getHandle(); + + if (entityPlayer.playerConnection.networkManager.getVersion() >= 47) { + Tab tab = getTabByPlayer(event.getPlayer()); + + if (tab != null && tab.getElevatedTeam() != null) { + tab.getElevatedTeam().removeEntry(event.getPlayer().getName()); + } + } + + } + } + + public TabAdapter getAdapter() { + return adapter; + } +} diff --git a/src/com/houndpvp/hub/tablist/AzazelTask.java b/src/com/houndpvp/hub/tablist/AzazelTask.java new file mode 100644 index 0000000..9f159b7 --- /dev/null +++ b/src/com/houndpvp/hub/tablist/AzazelTask.java @@ -0,0 +1,105 @@ +package com.houndpvp.hub.tablist; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.Team; + +import com.houndpvp.hub.tablist.tab.Tab; +import com.houndpvp.hub.tablist.tab.TabAdapter; +import com.houndpvp.hub.tablist.tab.TabTemplate; + +import java.util.*; + +/* + TODO: Clean this thing up + */ +public class AzazelTask extends BukkitRunnable { + + private final Azazel azazel; + + public AzazelTask(Azazel azazel, JavaPlugin plugin) { + this.azazel = azazel; + + runTaskTimerAsynchronously(plugin, 0L, 5L); + } + + @Override + public void run() { + TabAdapter adapter = azazel.getAdapter(); + if (adapter != null) { + for (Player player : Bukkit.getOnlinePlayers()) { + Tab tab = azazel.getTabByPlayer(player); + if (tab != null) { + TabTemplate template = adapter.getTemplate(player); + + if (template == null || (template.getLeft().isEmpty() && template.getMiddle().isEmpty() && template.getRight().isEmpty())) { + for (Tab.TabEntryPosition position : tab.getPositions()) { + Team team = player.getScoreboard().getTeam(position.getKey()); + if (team != null) { + if (team.getPrefix() != null && !team.getPrefix().isEmpty()) { + team.setPrefix(""); + } + if (team.getSuffix() != null && !team.getSuffix().isEmpty()) { + team.setSuffix(""); + } + } + } + continue; + } + + for (int i = 0; i < 20 - template.getLeft().size(); i++) { + template.left(""); + } + + for (int i = 0; i < 20 - template.getMiddle().size(); i++) { + template.middle(""); + } + + for (int i = 0; i < 20 - template.getRight().size(); i++) { + template.right(""); + } + + List> rows = Arrays.asList(template.getLeft(), template.getMiddle(), template.getRight(), template.getFarRight()); + for (int l = 0; l < rows.size(); l++) { + for (int i = 0; i < rows.get(l).size(); i++) { + Team team = tab.getByLocation(l, i); + if (team != null) { + Map.Entry prefixAndSuffix = getPrefixAndSuffix(rows.get(l).get(i)); + String prefix = prefixAndSuffix.getKey(); + String suffix = prefixAndSuffix.getValue(); + + if (team.getPrefix().equals(prefix) && team.getSuffix().equals(suffix)) { + continue; + } + + team.setPrefix(prefix); + team.setSuffix(suffix); + } + } + } + } + } + } + } + + private Map.Entry getPrefixAndSuffix(String text) { + String prefix, suffix; + + text = ChatColor.translateAlternateColorCodes('&', text); + + if (text.length() > 16){ + int splitAt = text.charAt(15) == ChatColor.COLOR_CHAR ? 15 : 16; + prefix = text.substring(0, splitAt); + String suffixTemp = ChatColor.getLastColors(prefix) + text.substring(splitAt); + suffix = (suffixTemp.substring(0, Math.min(suffixTemp.length(), 16))); + } else { + prefix = text; + suffix = ""; + } + + return new AbstractMap.SimpleEntry<>(prefix, suffix); + } +} diff --git a/src/com/houndpvp/hub/tablist/tab/Provider/TabProvider.java b/src/com/houndpvp/hub/tablist/tab/Provider/TabProvider.java new file mode 100644 index 0000000..c8ad209 --- /dev/null +++ b/src/com/houndpvp/hub/tablist/tab/Provider/TabProvider.java @@ -0,0 +1,60 @@ +package com.houndpvp.hub.tablist.tab.Provider; + +import java.util.ArrayList; +import java.util.UUID; + +import org.bukkit.entity.Player; + +import com.houndpvp.hub.tablist.tab.TabAdapter; +import com.houndpvp.hub.tablist.tab.TabTemplate; +import com.houndpvp.hub.utils.Bungee; + +import net.md_5.bungee.api.ChatColor; + +public class TabProvider implements TabAdapter { + + public TabTemplate getTemplate(Player p) { + TabTemplate template = new TabTemplate(); + UUID id = p.getUniqueId(); + + // FIRST COLUMN + template.left(""); + template.left(""); + template.left(""); + template.left("§5Kitmap"); + template.left("§7Online: §f" + Bungee.getCount("kitmap")); + template.left(""); + template.left(""); + template.left("§5§lTeamspeak"); + template.left("§7ts.exempvp.net"); + + // MIDDLE + template.middle("§5§lExemPvP"); + template.middle(""); + template.middle(""); + template.middle("§5Practice"); + template.middle("§7Online: §f" + Bungee.getCount("practice")); + template.middle(""); + template.middle(""); + template.middle("§5§lDiscord"); + template.middle("§7discord.exempvp.net"); + template.middle(""); + template.middle(""); + + // RIGHT COLUMN + template.right(""); + template.right(""); + template.right(""); + template.right("§5HCF"); + template.right("§7Online: §f" + Bungee.getCount("HCF")); + template.right(""); + template.right(""); + template.right("§5§lStore"); + template.right("§7store.exempvp.net"); + + + return template; + } + + +} diff --git a/src/com/houndpvp/hub/tablist/tab/Tab.java b/src/com/houndpvp/hub/tablist/tab/Tab.java new file mode 100644 index 0000000..f823022 --- /dev/null +++ b/src/com/houndpvp/hub/tablist/tab/Tab.java @@ -0,0 +1,218 @@ +package com.houndpvp.hub.tablist.tab; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import net.minecraft.server.v1_7_R4.Packet; +import net.minecraft.server.v1_7_R4.PacketPlayOutPlayerInfo; +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import com.houndpvp.hub.tablist.Azazel; + +public class Tab { + private Scoreboard scoreboard; + private Team elevatedTeam; + private Map entries; + + public Scoreboard getScoreboard() { + return this.scoreboard; + } + + public Team getElevatedTeam() { + return this.elevatedTeam; + } + + public void setElevatedTeam(Team elevatedTeam) { + this.elevatedTeam = elevatedTeam; + } + + @SuppressWarnings("deprecation") + public Tab(Player player, boolean hook, Azazel azazel) { + this.entries = new ConcurrentHashMap(); + + this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + if ((hook) && (!player.getScoreboard().equals(Bukkit.getScoreboardManager().getMainScoreboard()))) { + this.scoreboard = player.getScoreboard(); + } + this.elevatedTeam = this.scoreboard.registerNewTeam((String) getBlanks().get(getBlanks().size() - 1)); + for (Player other : Bukkit.getOnlinePlayers()) { + getElevatedTeam(other, azazel).addEntry(other.getName()); + + Tab tab = azazel.getTabByPlayer(other); + if (tab != null) { + tab.getElevatedTeam(player, azazel).addEntry(player.getName()); + } + PacketPlayOutPlayerInfo packet = PacketPlayOutPlayerInfo.removePlayer(((CraftPlayer) other).getHandle()); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + } + player.setScoreboard(this.scoreboard); + + initialize(player); + } + + public Team getElevatedTeam(Player player, Azazel azazel) { + if (player.hasMetadata("HydrogenPrefix")) { + String prefix = ChatColor.getLastColors(player.getDisplayName().replace(ChatColor.RESET + "", "")); + + String name = (String) getBlanks().get(getBlanks().size() - 1) + prefix; + if (name.length() > 16) { + name = name.substring(0, 15); + } + Team team = this.scoreboard.getTeam(name); + if (team == null) { + team = this.scoreboard.registerNewTeam(name); + + team.setPrefix(prefix); + } + return team; + } + return this.elevatedTeam; + } + + public Set getPositions() { + return this.entries.keySet(); + } + + public Team getByLocation(int x, int y) { + for (TabEntryPosition position : this.entries.keySet()) { + if ((position.getX() == x) && (position.getY() == y)) { + return this.scoreboard.getTeam(position.getKey()); + } + } + return null; + } + + private void initialize(Player player) { + if (((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion() >= 47) { + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 20; y++) { + String key = getNextBlank(); + TabEntryPosition position = new TabEntryPosition(x, y, key, this.scoreboard); + + this.entries.put(position, key); + + ((CraftPlayer) player).getHandle().playerConnection + .sendPacket(getPlayerPacket((String) this.entries.get(position))); + + Team team = this.scoreboard.getTeam(position.getKey()); + if (team == null) { + team = this.scoreboard.registerNewTeam(position.getKey()); + } + team.addEntry((String) this.entries.get(position)); + } + } + } else { + for (int i = 0; i < 60; i++) { + int x = i % 3; + int y = i / 3; + + String key = getNextBlank(); + TabEntryPosition position = new TabEntryPosition(x, y, key, this.scoreboard); + this.entries.put(position, key); + + ((CraftPlayer) player).getHandle().playerConnection + .sendPacket(getPlayerPacket((String) this.entries.get(position))); + + Team team = this.scoreboard.getTeam(position.getKey()); + if (team == null) { + team = this.scoreboard.registerNewTeam(position.getKey()); + } + team.addEntry((String) this.entries.get(position)); + } + } + } + + private String getNextBlank() { + for (String blank : getBlanks()) { + if (this.scoreboard.getTeam(blank) == null) { + Iterator localIterator2 = this.entries.values().iterator(); + for (;;) { + if (!localIterator2.hasNext()) { + break; + } + String identifier = (String) localIterator2.next(); + if (identifier.equals(blank)) { + break; + } + } + return blank; + } + } + return null; + } + + public List getBlanks() { + List toReturn = new ArrayList(); + for (ChatColor color : ChatColor.values()) { + for (int i = 0; i < 4; i++) { + String identifier = StringUtils.repeat(new StringBuilder().append(color).append("").toString(), 4 - i) + + ChatColor.RESET; + toReturn.add(identifier); + } + } + return toReturn; + } + + private static Packet getPlayerPacket(String name) { + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(); + try { + Field action = PacketPlayOutPlayerInfo.class.getDeclaredField("action"); + Field username = PacketPlayOutPlayerInfo.class.getDeclaredField("username"); + Field player = PacketPlayOutPlayerInfo.class.getDeclaredField("player"); + + action.setAccessible(true); + username.setAccessible(true); + player.setAccessible(true); + + action.set(packet, Integer.valueOf(0)); + username.set(packet, name); + player.set(packet, new GameProfile(UUID.randomUUID(), name)); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + return null; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return packet; + } + + public static class TabEntryPosition { + private final int x; + private final int y; + private final String key; + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + public String getKey() { + return this.key; + } + + public TabEntryPosition(int x, int y, String key, Scoreboard scoreboard) { + this.x = x; + this.y = y; + this.key = key; + } + } + + public static class UpdatedPacketPlayOutPlayerInfo extends PacketPlayOutPlayerInfo { + } +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/tablist/tab/TabAdapter.java b/src/com/houndpvp/hub/tablist/tab/TabAdapter.java new file mode 100644 index 0000000..b330bfd --- /dev/null +++ b/src/com/houndpvp/hub/tablist/tab/TabAdapter.java @@ -0,0 +1,9 @@ +package com.houndpvp.hub.tablist.tab; + +import org.bukkit.entity.Player; + +public interface TabAdapter { + + TabTemplate getTemplate(Player player); + +} diff --git a/src/com/houndpvp/hub/tablist/tab/TabTemplate.java b/src/com/houndpvp/hub/tablist/tab/TabTemplate.java new file mode 100644 index 0000000..d67b892 --- /dev/null +++ b/src/com/houndpvp/hub/tablist/tab/TabTemplate.java @@ -0,0 +1,104 @@ +package com.houndpvp.hub.tablist.tab; + +import java.util.ArrayList; +import java.util.List; + +public class TabTemplate +{ + private final List left; + private final List middle; + private final List right; + private final List farRight; + + public List getLeft() + { + return this.left; + } + + public List getMiddle() + { + return this.middle; + } + + public List getRight() + { + return this.right; + } + + public List getFarRight() + { + return this.farRight; + } + + public TabTemplate() + { + this.left = new ArrayList(); + this.middle = new ArrayList(); + this.right = new ArrayList(); + this.farRight = new ArrayList(); + } + + public TabTemplate farRight(String string) + { + return farRight(this.farRight.size(), string); + } + + public TabTemplate farRight(int index, String string) + { + if (index > this.farRight.size()) { + for (int i = this.farRight.size(); i < index; i++) { + this.farRight.add(""); + } + } + this.farRight.add(index, string); + return this; + } + + public TabTemplate left(String string) + { + return left(this.left.size(), string); + } + + public TabTemplate middle(String string) + { + return middle(this.middle.size(), string); + } + + public TabTemplate right(String string) + { + return right(this.right.size(), string); + } + + public TabTemplate left(int index, String string) + { + if (index > this.left.size()) { + for (int i = this.left.size(); i < index; i++) { + this.left.add(""); + } + } + this.left.add(index, string); + return this; + } + + public TabTemplate middle(int index, String string) + { + if (index > this.middle.size()) { + for (int i = this.middle.size(); i < index; i++) { + this.middle.add(""); + } + } + this.middle.add(index, string); + return this; + } + + public TabTemplate right(int index, String string) + { + if (index > this.right.size()) { + for (int i = this.right.size(); i < index; i++) { + this.right.add(""); + } + } + this.right.add(index, string); + return this; + } +} diff --git a/src/com/houndpvp/hub/utils/Bungee.java b/src/com/houndpvp/hub/utils/Bungee.java new file mode 100644 index 0000000..ac08e7b --- /dev/null +++ b/src/com/houndpvp/hub/utils/Bungee.java @@ -0,0 +1,122 @@ +package com.houndpvp.hub.utils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.bukkit.scheduler.BukkitRunnable; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import com.houndpvp.hub.Hub; + +import lombok.Getter; + +public class Bungee implements PluginMessageListener { + + public Hub plugin; + @Getter static public List servers = new ArrayList(); + @Getter static public HashMap counts = new HashMap(); + @Getter static public HashMap ips = new HashMap(); + + public Bungee(Hub plugin) { + this.plugin = plugin; + + new BukkitRunnable() { + + @Override + public void run() { + if(Bukkit.getOnlinePlayers().length == 0) { + return; + } + + + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("GetServers"); + Player player = Bukkit.getOnlinePlayers()[0]; + player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); + + } + }.runTaskTimer(plugin, 0L, 20 * 5L); + + + new BukkitRunnable() { + + @Override + public void run() { + if(Bukkit.getOnlinePlayers().length == 0) { + return; + } + for(String s : servers) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("PlayerCount"); + out.writeUTF(s); + Player player = Bukkit.getOnlinePlayers()[0]; + player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); + out = ByteStreams.newDataOutput(); + out.writeUTF("ServerIP"); + out.writeUTF(s); + player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); + } + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("PlayerCount"); + out.writeUTF("ALL"); + Player player = Bukkit.getOnlinePlayers()[0]; + player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); + + } + }.runTaskTimer(plugin, 0, 20L); + + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] message) { + if (!channel.equals("BungeeCord")) { + return; + } + ByteArrayDataInput in = ByteStreams.newDataInput(message); + String subchannel = in.readUTF(); + if (subchannel.equals("PlayerCount")) { + + String server = in.readUTF(); + int count = in.readInt(); + if(server != null) { + counts.put(server, count); + } + + + } else if(subchannel.equals("GetServers")) { + servers = Arrays.asList(in.readUTF().split(", ")); + } else if(subchannel.equals("ServerIP")) { + String serverName = in.readUTF(); + String ip = in.readUTF(); + int port = in.readUnsignedShort(); + ips.put(serverName, ip + ":" + port); + } + + + } + + public static void sendServer(Player p, String server) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("Connect"); + out.writeUTF(server); + p.sendPluginMessage(Hub.getInstance(), "BungeeCord", out.toByteArray()); + + } + + public static int getCount(String server) { + if(counts.containsKey(server)) { + return counts.get(server); + } + return 0; + + + } + +} diff --git a/src/com/houndpvp/hub/utils/ItemBuilder.java b/src/com/houndpvp/hub/utils/ItemBuilder.java new file mode 100644 index 0000000..78adaee --- /dev/null +++ b/src/com/houndpvp/hub/utils/ItemBuilder.java @@ -0,0 +1,249 @@ +package com.houndpvp.hub.utils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.bukkit.Color; +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.SkullMeta; + +/** + * Easily create itemstacks, without messing your hands. + * Note that if you do use this in one of your projects, leave this notice. + * Please do credit me if you do use this in one of your projects. + * @author NonameSL + */ +public class ItemBuilder { + private ItemStack is; + /** + * Create a new ItemBuilder from scratch. + * @param m The material to create the ItemBuilder with. + */ + public ItemBuilder(Material m) { + this(m, 1); + } + /** + * Create a new ItemBuilder over an existing itemstack. + * @param is The itemstack to create the ItemBuilder over. + */ + public ItemBuilder(ItemStack is) { + this.is = is; + } + /** + * Create a new ItemBuilder from scratch. + * @param m The material of the item. + * @param amount The amount of the item. + */ + public ItemBuilder(Material m, int amount) { + is = new ItemStack(m, amount); + } + /** + * Create a new ItemBuilder from scratch. + * @param m The material of the item. + * @param amount The amount of the item. + * @param durability The durability of the item. + */ + public ItemBuilder(Material m, int amount, byte durability) { + is = new ItemStack(m, amount, durability); + } + /** + * Clone the ItemBuilder into a new one. + * @return The cloned instance. + */ + public ItemBuilder clone() { + return new ItemBuilder(is); + } + /** + * Change the durability of the item. + * @param dur The durability to set it to. + */ + public ItemBuilder setDurability(short dur) { + is.setDurability(dur); + return this; + } + /** + * Set the displayname of the item. + * @param name The name to change it to. + */ + public ItemBuilder setName(String name) { + ItemMeta im = is.getItemMeta(); + im.setDisplayName(name); + is.setItemMeta(im); + return this; + } + /** + * Add an unsafe enchantment. + * @param ench The enchantment to add. + * @param level The level to put the enchant on. + */ + public ItemBuilder addUnsafeEnchantment(Enchantment ench, int level) { + is.addUnsafeEnchantment(ench, level); + return this; + } + /** + * Remove a certain enchant from the item. + * @param ench The enchantment to remove + */ + public ItemBuilder removeEnchantment(Enchantment ench) { + is.removeEnchantment(ench); + return this; + } + /** + * Set the skull owner for the item. Works on skulls only. + * @param owner The name of the skull's owner. + */ + public ItemBuilder setSkullOwner(String owner) { + try { + SkullMeta im = (SkullMeta) is.getItemMeta(); + im.setOwner(owner); + is.setItemMeta(im); + } catch (ClassCastException expected) {} + return this; + } + /** + * Add an enchant to the item. + * @param ench The enchant to add + * @param level The level + */ + public ItemBuilder addEnchant(Enchantment ench, int level) { + ItemMeta im = is.getItemMeta(); + im.addEnchant(ench, level, true); + is.setItemMeta(im); + return this; + } + /** + * Add multiple enchants at once. + * @param enchantments The enchants to add. + */ + public ItemBuilder addEnchantments(Map < Enchantment, Integer > enchantments) { + is.addEnchantments(enchantments); + return this; + } + /** + * Sets infinity durability on the item by setting the durability to Short.MAX_VALUE. + */ + public ItemBuilder setInfinityDurability() { + is.setDurability(Short.MAX_VALUE); + return this; + } + /** + * Re-sets the lore. + * @param lore The lore to set it to. + */ + public ItemBuilder setLore(String...lore) { + ItemMeta im = is.getItemMeta(); + im.setLore(Arrays.asList(lore)); + is.setItemMeta(im); + return this; + } + /** + * Re-sets the lore. + * @param lore The lore to set it to. + */ + public ItemBuilder setLore(List < String > lore) { + ItemMeta im = is.getItemMeta(); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + /** + * Remove a lore line. + * @param lore The lore to remove. + */ + public ItemBuilder removeLoreLine(String line) { + ItemMeta im = is.getItemMeta(); + List < String > lore = new ArrayList < > (im.getLore()); + if (!lore.contains(line)) return this; + lore.remove(line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + /** + * Remove a lore line. + * @param index The index of the lore line to remove. + */ + public ItemBuilder removeLoreLine(int index) { + ItemMeta im = is.getItemMeta(); + List < String > lore = new ArrayList < > (im.getLore()); + if (index < 0 || index > lore.size()) return this; + lore.remove(index); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + /** + * Add a lore line. + * @param line The lore line to add. + */ + public ItemBuilder addLoreLine(String line) { + ItemMeta im = is.getItemMeta(); + List < String > lore = new ArrayList < > (); + if (im.hasLore()) lore = new ArrayList < > (im.getLore()); + lore.add(line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + /** + * Add a lore line. + * @param line The lore line to add. + * @param pos The index of where to put it. + */ + public ItemBuilder addLoreLine(String line, int pos) { + ItemMeta im = is.getItemMeta(); + List < String > lore = new ArrayList < > (im.getLore()); + lore.set(pos, line); + im.setLore(lore); + is.setItemMeta(im); + return this; + } + /** + * Sets the dye color on an item. + * * Notice that this doesn't check for item type, sets the literal data of the dyecolor as durability. + * @param color The color to put. + */ + @SuppressWarnings("deprecation") + public ItemBuilder setDyeColor(DyeColor color) { + this.is.setDurability(color.getData()); + return this; + } + /** + * Sets the dye color of a wool item. Works only on wool. + * @deprecated As of version 1.2 changed to setDyeColor. + * @see ItemBuilder@setDyeColor(DyeColor) + * @param color The DyeColor to set the wool item to. + */ + @Deprecated + public ItemBuilder setWoolColor(DyeColor color) { + if (!is.getType().equals(Material.WOOL)) return this; + this.is.setDurability(color.getData()); + return this; + } + /** + * Sets the armor color of a leather armor piece. Works only on leather armor pieces. + * @param color The color to set it to. + */ + public ItemBuilder setLeatherArmorColor(Color color) { + try { + LeatherArmorMeta im = (LeatherArmorMeta) is.getItemMeta(); + im.setColor(color); + is.setItemMeta(im); + } catch (ClassCastException expected) {} + return this; + } + /** + * Retrieves the itemstack from the ItemBuilder. + * @return The itemstack created/modified by the ItemBuilder instance. + */ + public ItemStack toItemStack() { + return is; + } +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/utils/SpawnUtils.java b/src/com/houndpvp/hub/utils/SpawnUtils.java new file mode 100644 index 0000000..e3e8297 --- /dev/null +++ b/src/com/houndpvp/hub/utils/SpawnUtils.java @@ -0,0 +1,52 @@ +package com.houndpvp.hub.utils; + +import com.houndpvp.hub.*; +import org.bukkit.*; + + +public class SpawnUtils { + + private Location location; + private Hub hub; + + public SpawnUtils(Hub Hub) { + hub = Hub; + } + + public void setSpawn(Location location) { + location = location; + } + + public void load() { + double x = hub.getConfig().getDouble("spawn.x"); + double y = hub.getConfig().getDouble("spawn.y"); + double z = hub.getConfig().getDouble("spawn.z"); + int yaw = hub.getConfig().getInt("spawn.yaw"); + int pitch = hub.getConfig().getInt("spawn.pitch"); + World world = Bukkit.getWorld(hub.getConfig().getString("spawn.world")); + if (location == null) { + location = new Location(world, x, y, z, yaw, pitch); + } + } + + public void save() { + if (location == null) { + location = new Location(Bukkit.getWorld("world"), 1.0, 100.0, 1.0, 1.0f, 1.0f); + } + hub.getConfig().set("spawn.x", location.getX()); + hub.getConfig().set("spawn.y", location.getY()); + hub.getConfig().set("spawn.z", location.getZ()); + hub.getConfig().set("spawn.yaw", location.getYaw()); + hub.getConfig().set("spawn.pitch", location.getPitch()); + hub.getConfig().set("spawn.world", location.getWorld().getName()); + hub.getConfig().set("spawn.isset", true); + hub.saveConfig(); + } + + public Location getSpawn() { + if (location == null) { + return new Location(Bukkit.getWorld("world"), 0.0, 100.0, 0.0, 0.0f, 0.0f); + } + return location; + } +} \ No newline at end of file diff --git a/src/com/houndpvp/hub/utils/SpigotUtils.java b/src/com/houndpvp/hub/utils/SpigotUtils.java new file mode 100644 index 0000000..8f87bb6 --- /dev/null +++ b/src/com/houndpvp/hub/utils/SpigotUtils.java @@ -0,0 +1,224 @@ +package com.houndpvp.hub.utils; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import net.md_5.bungee.api.ChatColor; + +public class SpigotUtils { + + static String UUIDAPI = "https://api.mojang.com/users/profiles/minecraft/"; + + /* + * Used to get the uuid of a player from the mojang servers + * + * @param The player you want to get the uuid from + * + * @return the players uuid + */ + public static UUID getUUID(Player p) { + try { + URL url = new URL(UUIDAPI + p.getName()); + URLConnection connection = url.openConnection(); + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line = in.readLine(); + line = line.replace("}", "").replace("{", "").substring(6, 38); + + line = line.substring(0, 8) + "-" + line.substring(8, 12) + "-" + line.substring(12, 16) + "-" + + line.substring(16, 20) + '-' + line.substring(20); + + return UUID.fromString(line); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static boolean isItem(ItemStack item, ItemStack item1) { + if(item != null && item1 != null) { + if(item.hasItemMeta() && item.getItemMeta().hasDisplayName()) { + if(item1.hasItemMeta() && item1.getItemMeta().hasDisplayName()) { + if(item.getItemMeta().getDisplayName().equalsIgnoreCase(item1.getItemMeta().getDisplayName())) { + return true; + } + } + + } + } + return false; + } + + /* + * Used to get the uuid of a player from the mojang servers + * + * @param The players name you want to get the uuid from + * + * @return the players uuid + */ + public static UUID getUUID(String p) { + try { + URL url = new URL(UUIDAPI + p); + URLConnection connection = url.openConnection(); + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line = in.readLine(); + line = line.replace("}", "").replace("{", "").substring(6, 38); + line = line.substring(0, 8) + "-" + line.substring(8, 12) + "-" + line.substring(12, 16) + "-" + + line.substring(16, 20) + '-' + line.substring(20); + + return UUID.fromString(line); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static String formatLocation(Location l) { + if (l == null) + return "None"; + + return l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ(); + } + + public static String formatLocationWithWorld(Location l) { + if (l == null) + return "None"; + + return l.getBlockX() + ", " + l.getBlockY() + ", " + l.getBlockZ() + " (" + l.getWorld().getName() + ")"; + } + + /* + * Used to get a players ping in milliseconds + * + * @param The player whose ping your retrieving + * + * @return The players ping in MiliSeconds + */ + public static int getPing(Player p) { + CraftPlayer cp = (CraftPlayer) p; + return cp.getHandle().ping; + } + + public static int roundToNine(int x) { + if(x < 9) { + return 9; + } + if(x < 18) { + return 18; + } + if(x < 27) { + return 27; + } + if(x < 36) { + return 36; + } + return 9; + } + + /* + * Used to ChatColor each line in an ArrayList + * + * @param The ArrayList to convert + * + * @return The coloured ArrayList + */ + public static ArrayList colorArray(List array) { + ArrayList newarray = new ArrayList<>(); + for (String s : array) { + newarray.add(ChatColor.translateAlternateColorCodes('&', s)); + } + return newarray; + } + + /* + * Used to ChatColor each line in an ArrayList + * + * @param The String list to convert + * + * @return The coloured String list + */ + public static String[] colorArray(String[] array) { + ArrayList newarray = new ArrayList<>(); + for (String s : array) { + newarray.add(ChatColor.translateAlternateColorCodes('&', s)); + } + return newarray.toArray(new String[0]); + } + + /* + * Used to replace Strings in an ArrayList + */ + + public static ArrayList replaceArray(List array, String oldChar, String newChar) { + ArrayList newarray = new ArrayList<>(); + for (String s : array) { + newarray.add(s.replaceAll(oldChar, newChar)); + } + + return newarray; + } + + /* + * Calculate chance out of 100 + * + * @param The chance + * + * @return whether the outcome happened + */ + + public static Boolean chance(int chance) { + Random rnd = new Random(); + int i = rnd.nextInt(100) + 1; + + if (i <= chance) { + return true; + } else { + return false; + } + } + + public static String getCountry(String ip) { + try { + URL url = new URL("http://ip-api.com/json/" + ip); + URLConnection connection = url.openConnection(); + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line = in.readLine(); + line = line.replace("}", ""); + line = line.replace("{", ""); + line = line.replace(line.substring(0, 1), ""); + HashMap info = new HashMap<>(); + String[] lines = line.split(","); + for (String s : lines) { + String[] split = s.split(":"); + info.put(split[0], split[1]); + } + return info.get("country"); + } catch (Exception e) { + return null; + } + + } + + public static void clearInventory(Player p) { + PlayerInventory inv = p.getInventory(); + inv.clear(); + inv.setHelmet(null); + inv.setChestplate(null); + inv.setLeggings(null); + inv.setBoots(null); + } + +} diff --git a/src/config.yml b/src/config.yml new file mode 100644 index 0000000..1b52465 --- /dev/null +++ b/src/config.yml @@ -0,0 +1,80 @@ +scoreboard: +- '&7&m--------------------' +- '&5&lConnected Players:' +- '&7%online%' +- '' +- '&5&lNetwork Rank' +- '&7%rank%' +- '' +- '&7&ostore.exempvp.net' +- '&7&m--------------------' +scoreboard-inqueue: +- '&7&m--------------------' +- '&5&lConnected Players:' +- '&7%online%' +- '' +- '&5&lQueue Info:' +- ' &7%position%/%inqueue%' +- '' +- '&5&lNetwork Rank' +- '&7%rank%' +- '' +- '&7&ostore.exempvp.net' +- '&7&m--------------------' +server-selector: + oghcf: + type: GOLD_SWORD + name: '&5Practice' + server: practice + lore: + - '' + - '&cOur practice server is currently being developed' + - '&cStay Tuned' + - '' + - '&5Connected Players: &7%count%/1000' + - '&5Click here to connect' + - '' + slot: 11 + newhcf: + type: DIAMOND_SWORD + name: '&5HCF (Squads)' + server: HCF + lore: + - '' + - '&7- &5MapKit: &7S1, P1' + - '&7- &5Border: &7Quite big I think' + - '&7- &5Faction Size: &75-Man' + - '&7- &5Faction Allies: &70' + - '' + - '&7- &7Events will take place daily' + - '' + - '&5Connected Players: &7%count%/1000' + - '&5Click here to connect' + - '' + slot: 13 + kitmap: + type: FISHING_ROD + name: '&5Kits' + lore: + - '' + - '&7- &5MapKit: &7S1, P1' + - '&7- &5Border: &7Quite big I think' + - '&7- &5Faction Size: &75-Man' + - '&7- &5Faction Allies: &70' + - '' + - '&7- &7Events will take place daily' + - '' + - '&5Connected Players: &7%count%/1000' + - '&7Click here to connect' + - '' + slot: 15 + server: kitmap +selector-name: '&7Select a server' +chat-format: '%prefix% %player%&7: %message%' +spawn: + x: -1625.0 + y: 198.0 + z: 1665.0 + yaw: 0.0 + pitch: 0.0 + world: world diff --git a/src/plugin.yml b/src/plugin.yml new file mode 100644 index 0000000..ba7be3b --- /dev/null +++ b/src/plugin.yml @@ -0,0 +1,22 @@ +name: Hub +version: 1.0 +main: com.houndpvp.hub.Hub +commands: + builder: + setspawn: + rawcast: + gamemode: + gmc: + sounds: + aliases: [togglesounds, toggles] + gms: + gma: + msg: + aliases: [tell, message, t, w, wisper] + reply: + aliases: [r] + togglepm: + sounds: + invselector: + tp: + clear: \ No newline at end of file