From 8c4b8c7eaea5879d5014bdf2384c267a2760a03d Mon Sep 17 00:00:00 2001 From: arkonsadter Date: Tue, 3 Feb 2026 16:36:08 +0600 Subject: [PATCH] initial commit --- .gradle/8.9/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.9/checksums/md5-checksums.bin | Bin 0 -> 22747 bytes .gradle/8.9/checksums/sha1-checksums.bin | Bin 0 -> 38153 bytes .../8.9/dependencies-accessors/gc.properties | 0 .gradle/8.9/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.9/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.9/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/vcs-1/gc.properties | 0 .vscode/settings.json | 3 + README.md | 51 +++++++ build.gradle | 69 +++++++++ gradle.properties | 4 + settings.gradle | 11 ++ src/main/java/com/example/pvpmod/PvPMod.java | 85 +++++++++++ .../example/pvpmod/client/ModKeyBindings.java | 45 ++++++ .../pvpmod/client/gui/ModMenuScreen.java | 139 ++++++++++++++++++ .../com/example/pvpmod/config/ModConfig.java | 34 +++++ .../example/pvpmod/features/AimAssist.java | 82 +++++++++++ .../java/com/example/pvpmod/features/ESP.java | 60 ++++++++ .../java/com/example/pvpmod/features/HUD.java | 133 +++++++++++++++++ .../pvpmod/features/HitboxExpander.java | 46 ++++++ .../com/example/pvpmod/features/KillAura.java | 91 ++++++++++++ .../example/pvpmod/features/TriggerBot.java | 39 +++++ .../com/example/pvpmod/util/RenderUtil.java | 100 +++++++++++++ .../com/example/pvpmod/util/RotationUtil.java | 48 ++++++ src/main/resources/META-INF/mods.toml | 25 ++++ .../resources/assets/pvpmod/lang/en_us.json | 7 + 29 files changed, 1074 insertions(+) create mode 100644 .gradle/8.9/checksums/checksums.lock create mode 100644 .gradle/8.9/checksums/md5-checksums.bin create mode 100644 .gradle/8.9/checksums/sha1-checksums.bin create mode 100644 .gradle/8.9/dependencies-accessors/gc.properties create mode 100644 .gradle/8.9/fileChanges/last-build.bin create mode 100644 .gradle/8.9/fileHashes/fileHashes.lock create mode 100644 .gradle/8.9/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 settings.gradle create mode 100644 src/main/java/com/example/pvpmod/PvPMod.java create mode 100644 src/main/java/com/example/pvpmod/client/ModKeyBindings.java create mode 100644 src/main/java/com/example/pvpmod/client/gui/ModMenuScreen.java create mode 100644 src/main/java/com/example/pvpmod/config/ModConfig.java create mode 100644 src/main/java/com/example/pvpmod/features/AimAssist.java create mode 100644 src/main/java/com/example/pvpmod/features/ESP.java create mode 100644 src/main/java/com/example/pvpmod/features/HUD.java create mode 100644 src/main/java/com/example/pvpmod/features/HitboxExpander.java create mode 100644 src/main/java/com/example/pvpmod/features/KillAura.java create mode 100644 src/main/java/com/example/pvpmod/features/TriggerBot.java create mode 100644 src/main/java/com/example/pvpmod/util/RenderUtil.java create mode 100644 src/main/java/com/example/pvpmod/util/RotationUtil.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/pvpmod/lang/en_us.json diff --git a/.gradle/8.9/checksums/checksums.lock b/.gradle/8.9/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..e6c80de1b63cc03611ddf037957d68c16360e2a9 GIT binary patch literal 17 VcmZQB4BK_J{q2=Z1~6c}2mn5+1>FDu literal 0 HcmV?d00001 diff --git a/.gradle/8.9/checksums/md5-checksums.bin b/.gradle/8.9/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..619cbcd85d2983c2f40a9187572d8cc5f2c99ad9 GIT binary patch literal 22747 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 l#ah%+j1+OF2Ek*#k#FCaLZ_%{|iLdH^LN+F^Q zB}GxBh{*Wv(>`ZE|Nq@Nzvt&(*0a|8uJ&5aZGF1F``Y_D`|RPIYXyTbR`54b82>3^ z|M~C8|3)G(5`mEjj6`500wWO^iNHt%Mj|j0fsqJ|L|`NWBM}&hz(@o}A}|txkqC@L zU?c(~5%_;40;ZrNys$H46-MFz5!lLL%)uB8Hutdkyk$Di`V`=w{jWW)xOfwVK(@7O#eUHyRH)>hIgG zI*6Z#JkkT%SAV$f_CbFeTS$((f-1Qu?_e50xbC3rugC9!$D( z5_021h+8_R3&m$-K<+M$xUGEG?VM5akUM-pyxb|=q|G1z@)Xpbf|i1?`q}(JkXuh7 z?GL+ao(Y$`J{9u#MIRqaa^pb_&pZ#Jvk&l z&bxTFVeFXGkedi0EV+;Td8F;k4VWl;`s_d^|41 zgc#?k*AY+1TK#M69b&$6K8g5;!FLwlofgCTO@c{YzR<3yyinyX#(3xnT5AAoL=dPkNasRZ&O*4u5(Q|#7gCl?3%DuXf zCoduExh!t<=KYMjiy#j{>)Pc-y#?ZL-FZm>uL^ zX#TGXeLAaD;(-+8n+!?&E2|EP@xJl!f!sYB@vsZQjZ5o^`{g*DDRY2~J=E<6UbsW6CuHlgHlqcU*{v_K7}N|rz@CP;B7#xo4e3`sXs59^n!B>F`sy&vjGghnTdSL1La+%SPHi z-dAAJHsLvO-xJD6{*wHTF?T>mavFCi$}!9m&$cCy8}1_yEb9 zo!v&w%?>8woP31jt)pbp7F_lv;$Vj6w-=vvf;1A`iS=SVnt$3=WV$UZzwCg1^>>l= zwCi|hSU*++XAQhKcOY(78T2ydT?yn?$Zz}2fSG1ST&E!4=8WvW)~Oz<&?27SR11>7 zR9?|*=AU&C+DE-cd_ki8ig}X6{OPe5@pGpc<(dh{puNsgl6TaM`eYKbIu3HvSdw>Q z7HsdPSP10qG`)0(_NzXSyla$waHf4v^b-@W8?nf&<&u^-!v`r9Mns!}F*=@zWt9nIVCeOB+Wm@-iba(fiF z_dXpDqvLN9^FtJhPp_=$8Ah%cG0%h?C;j$r_bIxuT+0pC<8cS^hn$%r_q2(1&6Azv zeeDjeKGXIR>$O!Y$v+4$*K3*kjyOO1qXqk;o1p3YTd9q(eorsbzJEzV;H!pb{gC_L zM_jLNnYe}JY{(7J`uJ($+^POvF*=a1Nh9q)w`R8s&wa82@+9PUpme8`;gjl5kjGvj z?Y}$@IO8yXFF)j~E|L7}c-dcpQF+pk$7qv$Fnh<9C66W(`;d(XNdB#Fic+tZSQxYq zLi^Ys0md73vo-Z0x2PuVe|)ijd9BduHspRXB>&0KUUuV00Wl7v(ft3L%a@mJntTql z*F*CpTg~;o)vm4~ko&G8>tPoTX>pEJd{6i_BRL1B&z|<_9mITPgq}OjK*2S7(PxQy z+fbUc=REi+tBL*6Dp-#tT6ef?-%Qp&@@)|EHS(lAx6+Z@l^@q9KyHSfBi;#@_zrjE z5&M()LehRr*2AA07OsZo3|9}tPm6Xk{KmAwKctBLhi_|6%V7}fax@x0V;*!io_h0= zh=V;E&zOV8)pW(hny?-#Zn7S%;Cx0wbsi7o2I#rq<9s|mb)be=M*`bOd;SH^S=Ls8 zSE0Qz8vg=X$1lsVcjOWEFCpy(xz|r0y=*VRccFDz@LbwJV^~onwBO)N+6!HJ$}2Q@ z!w>RkRKKu>XWZUzfy91httx3RoXyC5IOpzNXdiftZ=i*EKVws4)I-94(=L*W@r$pY!)_f6?R`Z^F0qog%Di}h zcpg)FNIq7{sPM&BE@B=wtVF!`iofA}J2P0%E;QaGPsALY)1@~W@=X<_y=3F}HuJlu zi2Z>57?O``?R1IqsSt+t_FG9l{+GL5#EjbIkh`INNnNbvc4}85{F=Wd?WLX_wa>k; z%?0gU(0G=5xgbtLem!xX-TsrbmsTzu7rbPS0kn^uh`2}K+vXE)#5rQKDaj`~Tb;U< zo=M!t=tCr*#J*y0+OmVHu%5N~h%evjch72_1LQuOB%i!E_tgx!{Z}B5FhqQ!^NNN=8uW_(@vJ;Q{!4!-Zc^b z0_{UTkbGL$1dWC>6OKZ@{U+j7<93I=HChRI_;Qj@_e;xP*;PcG`*u~5T)x0zyK??K z;(7GWB>4=jw3oRHI{jfi`e;1N(EsqQ$7EnKHk+KDHkC`N&H=R8> z-6ca0a=&WCy`ygnYtD;;d`|=7S7I7kQVNK1V(^;e^Rp+Y)s7dM1nr~HdOiQ;V2O`i z8?kQgtR?MLj(VM+zQ>QakK2dV9+-;qn&FOfK_tawPi5^~>A#5ajO+PqgH znW!fR@mlr4SouO?zhM|na`g+Y`!9Z+(GBe*(EP8#uCVj4@pEEdXJkj(Yq*s1K2j?o z_7!2%5s#Afh&~_a3G3O4)^Sa7U&C4I>xl6j-$L3iJ)#~mjpr8e+!>+qx$L!Q#5dlR zFJV3Im8AW0(L5+IWSMPO$gSL%#HXhk$Bm% z*~C0%z6$YLbFqBw!B}V?BSi9*=3TtuOVrIE4?l@`MTMAp6C1J5iAC+vzQpBX7Wx)je!Gs3$Z^UyK&PUe2YHr%Xy0hZ8(C<2X#IH;7DbM#H z#-Sb>Z>!$l_bD1Qkc9R+FG+jdB*(fs8tq0=PSEqWe*8T*!jX&Z$M6R?Ae&UDR zIuY^Q(lOzZ{7)d?hMtQxXA0_ejNKXrdB7CXel2(1`{skHiy-%lN8GFMMEAsZ#P~@x zBe`MF;Jn>Vy0y^W4b79r^YdliJA)Jk7>J6#L@WyozQ+Y zx?g5IEujIEEv7=g(S@wXO!#SaJ?97Fxl4G9_;TJmr44rozoC(c2jsJT_|8G>qg>GZ zY}PN;xMa)16j*;Mii5@TT&K)x4iU&B(0;?JdE10$&9Ov(6RXMkt$zD&e4amtcn=m8 zL~`r><^6oTF-5SRP5mU_aA2*jbmcChze$QDw+UkNxVydg0kjWB{k7$0E4Y7hhA8BA zH%a@Ani5=mZ zC++PYw|xHn<7g1%ThQ}v|1?15*@l~~keegF4m16Q@A}2&681~TdK@mcmP!S0&x72> zhUAVZ>m=@1Eqny|#z!P~D#9Kv757HK{jxyw zoAcmV?Y7qW#C#PLLE3McbdX)#)a5g*C+0NbHeQkQqKt@nAZ`}ox5B*r-C{YRy)KD= zyDYbpSuw3X8*)oW@((T-{2oj^=8ftc7-_^?zKXLw> zjX<$Cv=2jmy+)V%@8{DZ&Y`P2NP91V{PNswMZ|$QVHM&Hg+^uv9hzZ1tI+9w`?yTfers@E)@#Yva*(eVBY8jrr_%h- zLd1I>y(W@xoA27Sdq#jOw0HUs?+ah)Gx|HR{|rkd?E@v<{qjD&CZ3~BXg&;l7`00` zuXhQoCm@lu51FmX8F4|2*f)le_;;w$xmTN}7PmwDb@#|Wgt~29Gj@WUEaVBHBqx6v zjLCE1-$t$@5g3WUNCZYAFcN{02#iEvBmyH57>U401V$q8e|rR!K?i1mfA}F#R`iE% z!HmASGC{I;1FaH@_p#SF#DTZzZ2P8gt$zi3%2ow_mHw^j)-@JXqZbn=c`9FNqF02a z5~kc`v+2Cm|46M$_iAyW$eF-vjQ8}VCOxpH%8Sl5xl3weQD#j2b6L6xt=NVtf{h} zukh`S^O|khYjyp5znRm*q=+@pm#)~5D~3A$4wK2(g{F2tJK2m6Zz8N?FVDGn=)&gP zN>HUoe1Yb{-%K*87;D~m^xW`Z2-Y>rcNE-ZTg@3@0#xY-L^i?qm2C5m{A(46#%lOA zky5q${*1ux?jx6O`j*=$x$w8@YYY-G)K`H05?VRj7YE0l{pmg%>~ncN5_7VRBz5j@ z25(037P@LfmG;2DR)H4kcl~V@O$`4_G*+H3j6BOb-I>QKO2}@Jxmid${$`gg{otI0 z8?c4KkB9e*Mg@GW#bXD`-&3)6zckm?EHDiySSA!aZj(@a?}E|Z4o~4YG&loWs8|Ai zna1JAv8M`bYJMuTp36D#ILo{%wVdY)R2dTA$v9UGSDjP3^yS*!QvIKRK7NPxbSO^5rcj!2&BDgB$XzxWXEgP!vxcNJSN z0u^|^GQg~Z7ashJ2~#v^RKVBzi9;evRcz2>h3ljAYo*vPC-2`rHe}jjg_*F0>m8u# zgUWDU4%wS|$IsN2-u3!Kf`)cw8{4UZL$HPEV2t2pSp&E*wU9;yTDalVkcd+C^35AH z(LR1f&)w%dYz1z1`>h*z0e$V63RTYd_iiR%G%DcBCW2nYS_@f=VNR3E=xpw9>z)c* z+zJf0P;JDzS8SGbi zIBcQDui^coQGtHBR?w?nDLCZF%BxTJc)~3^cW;5{>(-Opz!y+?;(IkvIKVu@e7{&z zslP5-TDMBcGit}^{e{O}7wtG7xdZmA^7xP|#;#q%ebJ~u3!~!ywu-eFCWMAY8nLZu zpCVIuYUPCkGa6nWyaQtxgYQ8>;laN-GL3oGR7I1gIQ-hUCr|Nks%T?r@=mAGhr#Y2 zzh8;dhg>muDP}g-R8}<`qJ-ymb*=uD9vydVZmgAT_L-1hZM`E`9jG!5xn?gI60r$P`qwJZuS~dB zQmQPAE9NKJnlLIB$wyB&ywSwBgV!JWnuA9H6igFbm|94q0={zb^%#`Dr=p3*f9cm7 zasGgxN571Yl4%xS^`vFikFWJ0D-&NGVuN7|dGLKAQ@_S2u0oD5qy8axBccR4=w&Zo!v zA=0l^T5Y#!-Du^WlMC`thQ>x6R0&@G*DBzv96t+zLZ!-@^5guXTRjG{Tt%HXbSk$j zxn4d9eIPN~QgxB~{M4&P{o&gh+WvOplYFJTanDIG~F6 zHuz=oMWX_~Zr~>kP^eT#F0?GW?{{d>!(Gx;c30?)`ctD~h<@FLDltXy%jAnjh5I`C zw^iGZ_FR(smTPOe<3UNy`MZywA9@S!6MmO7*q|@b=fhiQ!K0YNwI?XUer)Syd0*id z5!*^mKvgDj@^$YUuA=b;`c?1t$G&hCzNZ0&%9omi*vC&FPEX^=W6S&0?U(D<_7Uuo z@qT6FJ6G`E+26pGDe^Qb;OlW4y-M+Rc>7yJpMkuj?C!w2o66?n;=q`|=Z&O=Ln?+D zn2VWx(Wrp0r^LDP@2Q@}mQ0bZeQF?-;&Jizxb2-rKTRcIG;;J|3m1d^B6ACARG@_~ z#PYn^!60U*E7} zN$AmI!`-xff4}1aDC$NL~yS{kT+qUpt+}IfHVHVr;K)e2%QQvFOuk`kXCp4ii zl?3q16b-SHAHJQqmaZbv7koLvR)hCx`9fh_bwI><1))kGuA=b;`Zaj(kA3}rRTREx zTKHd7Gm)J)0n1EZ<|wp=^Rj>2)r!8Kie?fFB%o_#T_*y`im;o`ZY6j zboviPkxQ>jMkz%4CMB1aA|V`z7`K?6iApv3CLz6K*XyoH@Do zMlU#NfTuG5CcgHA|4MHB*DBx(gKty+qN+O}rThD{^n^q6Go2F^WYebwu1dEAJ?&Ik-ON+hB1<|`?uXO!|yU^p$Ith;YE8MxG>%2h^nO(ZRu8WQlC0c zk1HL2PjAy<@WvKbiM<>WF}Qt)t8UsI-1nrw#cHa;#A@Tok4hbLzVtwq%mJuUNgA%= z>NQ*55R$8#Ve|3uzQv~bE}Kk1-MFu5novdcUNpnWkfHVTM23Bm%#&|FRa7-ARtd>ir>Ws`_{0a?Mq1bmseriVLdvELf8-0_JtL^g}{U{Lt5o2Jp)iLmCz6mj<|R zc%f3g4JezY_eA0LI#V_G70dX07dE^DPb2Qjbv9I~aDrbZUo++a|MZgz$12Y4xw0Kd$`^V&qMg^i_ zj=$vrg-SI>AWvrQSv|GL@A=v(K1L^HqNBlm0^?9r0K^h6RHrr?74T&lNU!=Hf7?s* z$7z9}=;zZiH7k|Hzh{8h;bYz#f4>IGXa#U#>KBa)_l2MTL7`HGE}DCb?bohC?`5BU z)(1VT^^&X0hWBgzHK^iy3VxY<)#YE@_I$;!%a)Rkf@f)*pBbfiG7u2ZO@(Y7w|H^=s<^+y0&U$E$lS zwr%-Q+94b?ao!TB@|ZcK8gKY%xGE)c|Fllym0V@cVWOQbI&vE`^1(Yw+?N+Py@A4E zNpY^^)+tNxulZz=DCySZeCTIX;~VQdsM?J0{y}*j3NB17Ob+v16#Ug>noP5B`-EMl zA#s`K!I;2(`Q;9Y*pE`E&We3>XYc8*ak7g|z3_hRnjV9rZBP~SWJtyErFc?=_UD}{ zpJXKx?bl$qHE2@b%#_V~P!)G)NHuHY=;19iX*zi5&Che=_s)^MUEnouTu0JcHK>X| z4SkIPJ6h&`ZCg@b+}@@=pt3&i!W6aAnI%Ct@UtH1SHfbbYAGD9YVtmrpzNutSf;iw zv**~0(C-Q}GpY7=k9 z*0=a%R%F^2??1n&p7%IZW#Ic=@L#@t!&UinUhR*2`dL@gO(}2N^;pK4pjP}u4_bH> zuCSul-want-;;hBey}nv|8dFAw3WAFi-l8afC{{GxB%Z{GlY5mwF>w;-36>cp;DcZ zF><$&_ene6E4ACxXk~Sd?hSdu7ruW2W%OQfVTuNg3ivu-IwYc0$#&0<#gt=q`HEDm z^lA9T=~LTOM1i z+SL1HE5nB;v-nAd2aLugJmR2C)(01+$kV8Ruj=8(XXT2)6JYn7KjW;Rd@F=4f2|Qg1RxP3Ntv zrjz6{=ba-%2eE(ZSvTI!&TSb?sET860%i(neR!_XGYw8 z=d-|02v_y?;wlDXEy@;5V3Z%a;GYMGZ4vTo_dPH?)$RsA1^L<|uyXZ;=3 z@o-sv;-fQd$@A8-dE9gs-;(oEFVlCH^R)w(>Yb8~NBx~82v?`3< z1xAA^hm$tr4&wsPG+wAOBx&;xF|Id5BFbz`+Dt->SA0lCnMp{Kjk#|M#!IYvRN0uU zW%tplFn;h%J{3H(w)%z&cvZ`oR zm>6*;qRPdh&8ou0$HEp;z5Alg?ZG6Jp^7T2iZ<^H8#@S9RQYVQIZN2M8&E}+=|r2S zhe;Vj6;=MBkB5YPWR8eIg(PZg>uYv!RZ$qoX=I)2SsIqie%Oj#yVRMHL4IqXT*+;D9 z_Ry*@WnzV;dbiA4ZV#;ro2LR}_y-w5V2)BPhbpR!Al5QxXjRz4SJ2lVR!TAy|R5>s-xgsDM z|CGN$tHQMMp|8J}VM3dif@z(AzNqq2XtO>roheZDM_C`3jtNvzWthLm-UC-^(JP%{{<2z!`ut_kgu50$LSj*9iMXm3zQio&&84 zv+IPusInti%X6SrVGhLVKy@0W&2zw<@v{&pR3}8%G8Sl6n41>#^#^$lV9a|GZ|A5o z7Ff#%pjBZ$#G4ALECSXt7HCzNPY8?#Rh|QFJ^*aU=tnrR$*hnIcKsGcZy)Szp# z_y?1c<9@DSpMj70RLvn@qBSput7vi$z?a8=$|9guVSCmN`TCRG1K{hQvIuB%53sa& z=!+_2fwe3GS{0Ta41MXp0KZI;r^zA!{rabT09qBc*Ja2TW$poMc@DHHECYP)#0yn+ z1Z%kmv??r<_)bKX=fGO-0j&zlBxX^nJO|b?7HCyi7QQMl7=JO(fi^n=+XudcgYp-% zBWQCfumj-hG+zE7rvi-mf69)a$;1G2)B*V3hBBvuwR`~9GBIdXSROnDQ08yYwh+t3 z->}nUEU=cp@t1Q&utNN+5@;e-t_ZC!q@v18VJ%nWFXyFTM-qqnMVXgE>kB&qzl>1k Uz_6ChLaV}xD`5+VUS}))ADiu{KL7v# literal 0 HcmV?d00001 diff --git a/.gradle/8.9/dependencies-accessors/gc.properties b/.gradle/8.9/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.9/fileChanges/last-build.bin b/.gradle/8.9/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/8.9/fileHashes/fileHashes.lock b/.gradle/8.9/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..27690336cea472aab2acd3a2bfacbda98e60e008 GIT binary patch literal 17 TcmZRsn{fDhyx#pO3{U_7JRt{q5gE1_)pT05G-$DF6Tf literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..58211ea --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Feb 03 16:21:29 OMST 2026 +gradle.version=8.9 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c5f3f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..20fa7eb --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# PvP Mod для Minecraft Forge 1.20.1 + +Мод для улучшения PvP с различными функциями. + +## Функции + +### Основные возможности: +1. **KillAura** - автоматическая атака ближайших врагов +2. **TriggerBot** - автоматическая атака при наведении на цель +3. **Hitbox Expander** - увеличение хитбоксов для легкого попадания +4. **Aim Assist** - помощь в прицеливании +5. **ESP** - подсветка игроков и мобов через стены +6. **HUD** - информационный интерфейс + +### HUD включает: +1. **TargetHUD** - информация о текущей цели +2. **Keybinds** - статус горячих клавиш +3. **Potions** - активные эффекты зелий +4. **Armor** - состояние брони + +## Управление + +- **Правый Shift** - открыть меню настроек +- **R** - переключить KillAura +- **T** - переключить TriggerBot +- **B** - переключить ESP + +## Настройки + +В меню настроек (Правый Shift) можно настроить: +- Радиус KillAura (3.0 - 6.0 блоков) +- Скорость атак KillAura (6-20 атак в секунду) +- Размер хитбоксов (1.0 - 2.0x) +- Включение/выключение всех функций +- Настройки HUD + +## Установка + +1. Установите Minecraft Forge 1.20.1 +2. Скомпилируйте мод: `./gradlew build` +3. Поместите .jar файл из `build/libs/` в папку `mods` + +## Компиляция + +```bash +./gradlew build +``` + +## Предупреждение + +Этот мод предназначен только для образовательных целей и использования на приватных серверах. Использование на публичных серверах может нарушать правила сервера. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f32cb66 --- /dev/null +++ b/build.gradle @@ -0,0 +1,69 @@ +buildscript { + repositories { + // These repositories are only for Gradle plugins, put any other repositories in the repository block further below + maven { url = 'https://maven.minecraftforge.net' } + gradlePluginPortal() + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + } +} + +plugins { + id 'eclipse' + id 'maven-publish' +} + +apply plugin: 'net.minecraftforge.gradle' + +version = '1.0.0' +group = 'com.example.pvpmod' +archivesBaseName = 'pvpmod' + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +minecraft { + mappings channel: 'official', version: '1.20.1' + + runs { + client { + workingDirectory project.file('run') + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + mods { + pvpmod { + source sourceSets.main + } + } + } + } +} + +repositories { + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you + + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } +} + +dependencies { + minecraft 'net.minecraftforge:forge:1.20.1-47.2.0' +} + +jar { + manifest { + attributes([ + "Specification-Title": "PvP Mod", + "Specification-Vendor": "Example", + "Specification-Version": "1", + "Implementation-Title": project.name, + "Implementation-Version": "${version}", + "Implementation-Vendor": "Example", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..878bf1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..413db1a --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'MinecraftForge' + url = 'https://maven.minecraftforge.net/' + } + } +} + +rootProject.name = 'pvpmod' \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/PvPMod.java b/src/main/java/com/example/pvpmod/PvPMod.java new file mode 100644 index 0000000..9cb990d --- /dev/null +++ b/src/main/java/com/example/pvpmod/PvPMod.java @@ -0,0 +1,85 @@ +package com.example.pvpmod; + +import com.example.pvpmod.client.ModKeyBindings; +import com.example.pvpmod.client.gui.ModMenuScreen; +import com.example.pvpmod.config.ModConfig; +import com.example.pvpmod.features.*; +import net.minecraft.client.Minecraft; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLEnvironment; + +@Mod("pvpmod") +public class PvPMod { + public static final String MODID = "pvpmod"; + + public static ModConfig config = new ModConfig(); + public static KillAura killAura = new KillAura(); + public static TriggerBot triggerBot = new TriggerBot(); + public static HitboxExpander hitboxExpander = new HitboxExpander(); + public static AimAssist aimAssist = new AimAssist(); + public static ESP esp = new ESP(); + public static HUD hud = new HUD(); + + public PvPMod() { + if (FMLEnvironment.dist == Dist.CLIENT) { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientSetup); + MinecraftForge.EVENT_BUS.register(this); + } + } + + private void clientSetup(final FMLClientSetupEvent event) { + ModKeyBindings.register(); + } + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null) return; + + if (config.killAuraEnabled) { + killAura.onTick(); + } + + if (config.triggerBotEnabled) { + triggerBot.onTick(); + } + + if (config.aimAssistEnabled) { + aimAssist.onTick(); + } + } + + @SubscribeEvent + public void onKeyInput(InputEvent.Key event) { + if (ModKeyBindings.OPEN_MENU.consumeClick()) { + Minecraft.getInstance().setScreen(new ModMenuScreen()); + } + } + + @SubscribeEvent + public void onRenderLevel(RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { + if (config.espEnabled) { + esp.render(event.getPoseStack(), event.getPartialTick()); + } + } + } + + @SubscribeEvent + public void onRenderGui(RenderGuiOverlayEvent.Post event) { + if (config.hudEnabled) { + hud.render(event.getGuiGraphics()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/client/ModKeyBindings.java b/src/main/java/com/example/pvpmod/client/ModKeyBindings.java new file mode 100644 index 0000000..6fa8f30 --- /dev/null +++ b/src/main/java/com/example/pvpmod/client/ModKeyBindings.java @@ -0,0 +1,45 @@ +package com.example.pvpmod.client; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.client.ClientRegistry; +import org.lwjgl.glfw.GLFW; + +public class ModKeyBindings { + public static final String CATEGORY = "key.categories.pvpmod"; + + public static final KeyMapping OPEN_MENU = new KeyMapping( + "key.pvpmod.open_menu", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_RIGHT_SHIFT, + CATEGORY + ); + + public static final KeyMapping TOGGLE_KILLAURA = new KeyMapping( + "key.pvpmod.toggle_killaura", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_R, + CATEGORY + ); + + public static final KeyMapping TOGGLE_TRIGGERBOT = new KeyMapping( + "key.pvpmod.toggle_triggerbot", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_T, + CATEGORY + ); + + public static final KeyMapping TOGGLE_ESP = new KeyMapping( + "key.pvpmod.toggle_esp", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_B, + CATEGORY + ); + + public static void register() { + ClientRegistry.registerKeyBinding(OPEN_MENU); + ClientRegistry.registerKeyBinding(TOGGLE_KILLAURA); + ClientRegistry.registerKeyBinding(TOGGLE_TRIGGERBOT); + ClientRegistry.registerKeyBinding(TOGGLE_ESP); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/client/gui/ModMenuScreen.java b/src/main/java/com/example/pvpmod/client/gui/ModMenuScreen.java new file mode 100644 index 0000000..7cd8bf9 --- /dev/null +++ b/src/main/java/com/example/pvpmod/client/gui/ModMenuScreen.java @@ -0,0 +1,139 @@ +package com.example.pvpmod.client.gui; + +import com.example.pvpmod.PvPMod; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Checkbox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; + +public class ModMenuScreen extends Screen { + private Checkbox killAuraCheckbox; + private Checkbox triggerBotCheckbox; + private Checkbox hitboxExpanderCheckbox; + private Checkbox aimAssistCheckbox; + private Checkbox espCheckbox; + private Checkbox hudCheckbox; + + private Button killAuraRangeButton; + private Button killAuraSpeedButton; + private Button hitboxSizeButton; + + public ModMenuScreen() { + super(Component.literal("PvP Mod Settings")); + } + + @Override + protected void init() { + int centerX = this.width / 2; + int startY = 50; + + // Feature toggles + killAuraCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("KillAura"), this.font) + .pos(centerX - 100, startY) + .selected(PvPMod.config.killAuraEnabled) + .build()); + + triggerBotCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("TriggerBot"), this.font) + .pos(centerX - 100, startY + 25) + .selected(PvPMod.config.triggerBotEnabled) + .build()); + + hitboxExpanderCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("Hitbox Expander"), this.font) + .pos(centerX - 100, startY + 50) + .selected(PvPMod.config.hitboxExpanderEnabled) + .build()); + + aimAssistCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("Aim Assist"), this.font) + .pos(centerX - 100, startY + 75) + .selected(PvPMod.config.aimAssistEnabled) + .build()); + + espCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("ESP"), this.font) + .pos(centerX - 100, startY + 100) + .selected(PvPMod.config.espEnabled) + .build()); + + hudCheckbox = addRenderableWidget(Checkbox.builder(Component.literal("HUD"), this.font) + .pos(centerX - 100, startY + 125) + .selected(PvPMod.config.hudEnabled) + .build()); + + // Settings buttons + killAuraRangeButton = addRenderableWidget(Button.builder( + Component.literal("Range: " + PvPMod.config.killAuraRange), + button -> { + PvPMod.config.killAuraRange += 0.5f; + if (PvPMod.config.killAuraRange > 6.0f) { + PvPMod.config.killAuraRange = 3.0f; + } + button.setMessage(Component.literal("Range: " + PvPMod.config.killAuraRange)); + }) + .pos(centerX + 20, startY) + .size(100, 20) + .build()); + + killAuraSpeedButton = addRenderableWidget(Button.builder( + Component.literal("Speed: " + PvPMod.config.killAuraSpeed), + button -> { + PvPMod.config.killAuraSpeed += 2; + if (PvPMod.config.killAuraSpeed > 20) { + PvPMod.config.killAuraSpeed = 6; + } + button.setMessage(Component.literal("Speed: " + PvPMod.config.killAuraSpeed)); + }) + .pos(centerX + 20, startY + 25) + .size(100, 20) + .build()); + + hitboxSizeButton = addRenderableWidget(Button.builder( + Component.literal("Hitbox: " + PvPMod.config.hitboxSize), + button -> { + PvPMod.config.hitboxSize += 0.1f; + if (PvPMod.config.hitboxSize > 2.0f) { + PvPMod.config.hitboxSize = 1.0f; + } + button.setMessage(Component.literal("Hitbox: " + String.format("%.1f", PvPMod.config.hitboxSize))); + }) + .pos(centerX + 20, startY + 50) + .size(100, 20) + .build()); + + // Close button + addRenderableWidget(Button.builder(Component.literal("Close"), button -> this.onClose()) + .pos(centerX - 50, this.height - 40) + .size(100, 20) + .build()); + } + + @Override + public void tick() { + super.tick(); + + // Update config based on checkboxes + PvPMod.config.killAuraEnabled = killAuraCheckbox.selected(); + PvPMod.config.triggerBotEnabled = triggerBotCheckbox.selected(); + PvPMod.config.hitboxExpanderEnabled = hitboxExpanderCheckbox.selected(); + PvPMod.config.aimAssistEnabled = aimAssistCheckbox.selected(); + PvPMod.config.espEnabled = espCheckbox.selected(); + PvPMod.config.hudEnabled = hudCheckbox.selected(); + } + + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + this.renderBackground(guiGraphics); + + // Title + guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, 20, 0xFFFFFF); + + // Instructions + guiGraphics.drawCenteredString(this.font, "Press Right Shift to open this menu", this.width / 2, this.height - 60, 0x888888); + + super.render(guiGraphics, mouseX, mouseY, partialTick); + } + + @Override + public boolean isPauseScreen() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/config/ModConfig.java b/src/main/java/com/example/pvpmod/config/ModConfig.java new file mode 100644 index 0000000..eb8edc2 --- /dev/null +++ b/src/main/java/com/example/pvpmod/config/ModConfig.java @@ -0,0 +1,34 @@ +package com.example.pvpmod.config; + +public class ModConfig { + // Feature toggles + public boolean killAuraEnabled = false; + public boolean triggerBotEnabled = false; + public boolean hitboxExpanderEnabled = false; + public boolean aimAssistEnabled = false; + public boolean espEnabled = false; + public boolean hudEnabled = true; + + // KillAura settings + public float killAuraRange = 4.0f; + public int killAuraSpeed = 10; // attacks per second + public boolean killAuraTargetPlayers = true; + public boolean killAuraTargetMobs = false; + + // Hitbox settings + public float hitboxSize = 1.0f; + + // HUD settings + public boolean showTargetHUD = true; + public boolean showKeybinds = true; + public boolean showPotions = true; + public boolean showArmor = true; + public int hudX = 10; + public int hudY = 10; + + // Colors (ARGB format) + public int espPlayerColor = 0xFF00FF00; // Green + public int espMobColor = 0xFFFF0000; // Red + public int hudBackgroundColor = 0x80000000; // Semi-transparent black + public int hudTextColor = 0xFFFFFFFF; // White +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/AimAssist.java b/src/main/java/com/example/pvpmod/features/AimAssist.java new file mode 100644 index 0000000..f327024 --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/AimAssist.java @@ -0,0 +1,82 @@ +package com.example.pvpmod.features; + +import com.example.pvpmod.PvPMod; +import com.example.pvpmod.util.RotationUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +import java.util.List; + +public class AimAssist { + private final Minecraft mc = Minecraft.getInstance(); + private static final double AIM_RANGE = 6.0; + private static final float AIM_STRENGTH = 0.3f; + + public void onTick() { + if (mc.player == null || mc.level == null) return; + + LivingEntity target = findNearestTarget(); + if (target == null) return; + + // Get current and target rotations + Vec3 targetPos = target.getEyePosition(); + Vec3 playerPos = mc.player.getEyePosition(); + float[] targetRotations = RotationUtil.getRotationsToPosition(playerPos, targetPos); + + float currentYaw = mc.player.getYRot(); + float currentPitch = mc.player.getXRot(); + + // Calculate rotation difference + float yawDiff = RotationUtil.getAngleDifference(currentYaw, targetRotations[0]); + float pitchDiff = RotationUtil.getAngleDifference(currentPitch, targetRotations[1]); + + // Apply smooth aim assist + float newYaw = currentYaw + (yawDiff * AIM_STRENGTH); + float newPitch = currentPitch + (pitchDiff * AIM_STRENGTH); + + mc.player.setYRot(newYaw); + mc.player.setXRot(newPitch); + } + + private LivingEntity findNearestTarget() { + if (mc.player == null || mc.level == null) return null; + + Vec3 playerPos = mc.player.position(); + AABB searchBox = new AABB( + playerPos.x - AIM_RANGE, playerPos.y - AIM_RANGE, playerPos.z - AIM_RANGE, + playerPos.x + AIM_RANGE, playerPos.y + AIM_RANGE, playerPos.z + AIM_RANGE + ); + + List entities = mc.level.getEntities(mc.player, searchBox); + LivingEntity closestTarget = null; + double closestDistance = Double.MAX_VALUE; + + for (Entity entity : entities) { + if (!(entity instanceof LivingEntity living)) continue; + if (living.isDeadOrDying()) continue; + + boolean isValidTarget = false; + + if (PvPMod.config.killAuraTargetPlayers && entity instanceof Player && entity != mc.player) { + isValidTarget = true; + } else if (PvPMod.config.killAuraTargetMobs && entity instanceof Monster) { + isValidTarget = true; + } + + if (isValidTarget) { + double distance = mc.player.distanceTo(entity); + if (distance < closestDistance && distance <= AIM_RANGE) { + closestDistance = distance; + closestTarget = living; + } + } + } + + return closestTarget; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/ESP.java b/src/main/java/com/example/pvpmod/features/ESP.java new file mode 100644 index 0000000..f83524c --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/ESP.java @@ -0,0 +1,60 @@ +package com.example.pvpmod.features; + +import com.example.pvpmod.PvPMod; +import com.example.pvpmod.util.RenderUtil; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class ESP { + private final Minecraft mc = Minecraft.getInstance(); + + public void render(PoseStack poseStack, float partialTick) { + if (mc.player == null || mc.level == null) return; + + Vec3 cameraPos = mc.gameRenderer.getMainCamera().getPosition(); + + for (Entity entity : mc.level.entitiesForRendering()) { + if (!(entity instanceof LivingEntity living)) continue; + if (living == mc.player) continue; + if (living.isDeadOrDying()) continue; + + int color = getESPColor(entity); + if (color == 0) continue; + + // Get entity position + Vec3 entityPos = entity.position(); + double x = entityPos.x - cameraPos.x; + double y = entityPos.y - cameraPos.y; + double z = entityPos.z - cameraPos.z; + + // Get entity bounding box + AABB boundingBox = entity.getBoundingBox(); + double width = boundingBox.getXsize(); + double height = boundingBox.getYsize(); + + // Render ESP box + RenderUtil.drawESPBox(poseStack, x, y, z, width, height, color); + + // Render name tag + if (entity instanceof Player player) { + String name = player.getGameProfile().getName(); + RenderUtil.drawNameTag(poseStack, name, x, y + height + 0.3, z, color); + } + } + } + + private int getESPColor(Entity entity) { + if (entity instanceof Player && entity != mc.player) { + return PvPMod.config.espPlayerColor; + } else if (entity instanceof Monster) { + return PvPMod.config.espMobColor; + } + return 0; // No ESP for this entity + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/HUD.java b/src/main/java/com/example/pvpmod/features/HUD.java new file mode 100644 index 0000000..aa1baf2 --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/HUD.java @@ -0,0 +1,133 @@ +package com.example.pvpmod.features; + +import com.example.pvpmod.PvPMod; +import com.example.pvpmod.client.ModKeyBindings; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +public class HUD { + private final Minecraft mc = Minecraft.getInstance(); + + public void render(GuiGraphics guiGraphics) { + if (mc.player == null) return; + + int x = PvPMod.config.hudX; + int y = PvPMod.config.hudY; + + // Render background + guiGraphics.fill(x - 5, y - 5, x + 200, y + 150, PvPMod.config.hudBackgroundColor); + + // Title + guiGraphics.drawString(mc.font, "PvP Mod", x, y, PvPMod.config.hudTextColor); + y += 15; + + // Target HUD + if (PvPMod.config.showTargetHUD) { + renderTargetHUD(guiGraphics, x, y); + y += 30; + } + + // Keybinds + if (PvPMod.config.showKeybinds) { + renderKeybinds(guiGraphics, x, y); + y += 40; + } + + // Potions + if (PvPMod.config.showPotions) { + renderPotions(guiGraphics, x, y); + y += 30; + } + + // Armor + if (PvPMod.config.showArmor) { + renderArmor(guiGraphics, x, y); + } + } + + private void renderTargetHUD(GuiGraphics guiGraphics, int x, int y) { + LivingEntity target = PvPMod.killAura.getCurrentTarget(); + + guiGraphics.drawString(mc.font, "Target:", x, y, PvPMod.config.hudTextColor); + + if (target != null) { + String targetName = target.getName().getString(); + float health = target.getHealth(); + float maxHealth = target.getMaxHealth(); + + guiGraphics.drawString(mc.font, targetName, x + 50, y, PvPMod.config.hudTextColor); + guiGraphics.drawString(mc.font, String.format("HP: %.1f/%.1f", health, maxHealth), x, y + 10, PvPMod.config.hudTextColor); + + // Health bar + int barWidth = 100; + int barHeight = 4; + float healthPercent = health / maxHealth; + + guiGraphics.fill(x, y + 20, x + barWidth, y + 20 + barHeight, 0xFF333333); + guiGraphics.fill(x, y + 20, x + (int)(barWidth * healthPercent), y + 20 + barHeight, 0xFF00FF00); + } else { + guiGraphics.drawString(mc.font, "None", x + 50, y, 0xFF888888); + } + } + + private void renderKeybinds(GuiGraphics guiGraphics, int x, int y) { + guiGraphics.drawString(mc.font, "Keybinds:", x, y, PvPMod.config.hudTextColor); + + String killAuraStatus = PvPMod.config.killAuraEnabled ? "ON" : "OFF"; + String triggerBotStatus = PvPMod.config.triggerBotEnabled ? "ON" : "OFF"; + String espStatus = PvPMod.config.espEnabled ? "ON" : "OFF"; + + guiGraphics.drawString(mc.font, "KillAura [R]: " + killAuraStatus, x, y + 10, + PvPMod.config.killAuraEnabled ? 0xFF00FF00 : 0xFF888888); + guiGraphics.drawString(mc.font, "TriggerBot [T]: " + triggerBotStatus, x, y + 20, + PvPMod.config.triggerBotEnabled ? 0xFF00FF00 : 0xFF888888); + guiGraphics.drawString(mc.font, "ESP [B]: " + espStatus, x, y + 30, + PvPMod.config.espEnabled ? 0xFF00FF00 : 0xFF888888); + } + + private void renderPotions(GuiGraphics guiGraphics, int x, int y) { + guiGraphics.drawString(mc.font, "Effects:", x, y, PvPMod.config.hudTextColor); + + int effectY = y + 10; + for (MobEffectInstance effect : mc.player.getActiveEffects()) { + String effectName = effect.getEffect().getDisplayName().getString(); + int duration = effect.getDuration() / 20; // Convert to seconds + int amplifier = effect.getAmplifier() + 1; + + String effectText = String.format("%s %d (%d:%02d)", effectName, amplifier, duration / 60, duration % 60); + guiGraphics.drawString(mc.font, effectText, x, effectY, PvPMod.config.hudTextColor); + effectY += 10; + } + } + + private void renderArmor(GuiGraphics guiGraphics, int x, int y) { + guiGraphics.drawString(mc.font, "Armor:", x, y, PvPMod.config.hudTextColor); + + ItemStack[] armorItems = { + mc.player.getInventory().getArmor(3), // Helmet + mc.player.getInventory().getArmor(2), // Chestplate + mc.player.getInventory().getArmor(1), // Leggings + mc.player.getInventory().getArmor(0) // Boots + }; + + String[] armorNames = {"Helmet", "Chest", "Legs", "Boots"}; + + for (int i = 0; i < armorItems.length; i++) { + ItemStack armor = armorItems[i]; + String armorText; + + if (armor.isEmpty()) { + armorText = armorNames[i] + ": None"; + } else { + int durability = armor.getMaxDamage() - armor.getDamageValue(); + int maxDurability = armor.getMaxDamage(); + armorText = String.format("%s: %d/%d", armorNames[i], durability, maxDurability); + } + + guiGraphics.drawString(mc.font, armorText, x, y + 10 + (i * 10), PvPMod.config.hudTextColor); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/HitboxExpander.java b/src/main/java/com/example/pvpmod/features/HitboxExpander.java new file mode 100644 index 0000000..35bd6c3 --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/HitboxExpander.java @@ -0,0 +1,46 @@ +package com.example.pvpmod.features; + +import com.example.pvpmod.PvPMod; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class HitboxExpander { + + @SubscribeEvent + public void onEntityConstruct(EntityEvent.EntityConstructing event) { + if (!PvPMod.config.hitboxExpanderEnabled) return; + + Entity entity = event.getEntity(); + if (entity == null) return; + + // Expand hitbox for all entities except the player + if (entity != net.minecraft.client.Minecraft.getInstance().player) { + expandHitbox(entity); + } + } + + private void expandHitbox(Entity entity) { + AABB originalBox = entity.getBoundingBox(); + float expansion = PvPMod.config.hitboxSize - 1.0f; + + if (expansion > 0) { + AABB expandedBox = originalBox.inflate(expansion); + entity.setBoundingBox(expandedBox); + } + } + + public void updateHitboxes() { + if (!PvPMod.config.hitboxExpanderEnabled) return; + + net.minecraft.client.Minecraft mc = net.minecraft.client.Minecraft.getInstance(); + if (mc.level == null) return; + + for (Entity entity : mc.level.entitiesForRendering()) { + if (entity != mc.player) { + expandHitbox(entity); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/KillAura.java b/src/main/java/com/example/pvpmod/features/KillAura.java new file mode 100644 index 0000000..6e09f77 --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/KillAura.java @@ -0,0 +1,91 @@ +package com.example.pvpmod.features; + +import com.example.pvpmod.PvPMod; +import com.example.pvpmod.util.RotationUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +import java.util.List; + +public class KillAura { + private final Minecraft mc = Minecraft.getInstance(); + private long lastAttackTime = 0; + private LivingEntity currentTarget = null; + + public void onTick() { + if (mc.player == null || mc.level == null) return; + + // Find target + currentTarget = findTarget(); + + if (currentTarget != null) { + // Rotate towards target + Vec3 targetPos = currentTarget.getEyePosition(); + Vec3 playerPos = mc.player.getEyePosition(); + float[] rotations = RotationUtil.getRotationsToPosition(playerPos, targetPos); + + mc.player.setYRot(rotations[0]); + mc.player.setXRot(rotations[1]); + + // Attack if cooldown is ready + long currentTime = System.currentTimeMillis(); + long attackDelay = 1000 / PvPMod.config.killAuraSpeed; + + if (currentTime - lastAttackTime >= attackDelay) { + if (mc.player.getAttackStrengthScale(0.5f) > 0.9f) { + mc.gameMode.attack(mc.player, currentTarget); + mc.player.swing(mc.player.getUsedItemHand()); + lastAttackTime = currentTime; + } + } + } + } + + private LivingEntity findTarget() { + if (mc.player == null || mc.level == null) return null; + + Vec3 playerPos = mc.player.position(); + double range = PvPMod.config.killAuraRange; + + AABB searchBox = new AABB( + playerPos.x - range, playerPos.y - range, playerPos.z - range, + playerPos.x + range, playerPos.y + range, playerPos.z + range + ); + + List entities = mc.level.getEntities(mc.player, searchBox); + LivingEntity closestTarget = null; + double closestDistance = Double.MAX_VALUE; + + for (Entity entity : entities) { + if (!(entity instanceof LivingEntity living)) continue; + if (living.isDeadOrDying()) continue; + + boolean isValidTarget = false; + + if (PvPMod.config.killAuraTargetPlayers && entity instanceof Player && entity != mc.player) { + isValidTarget = true; + } else if (PvPMod.config.killAuraTargetMobs && entity instanceof Monster) { + isValidTarget = true; + } + + if (isValidTarget) { + double distance = mc.player.distanceTo(entity); + if (distance < closestDistance && distance <= range) { + closestDistance = distance; + closestTarget = living; + } + } + } + + return closestTarget; + } + + public LivingEntity getCurrentTarget() { + return currentTarget; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/features/TriggerBot.java b/src/main/java/com/example/pvpmod/features/TriggerBot.java new file mode 100644 index 0000000..c62dbdc --- /dev/null +++ b/src/main/java/com/example/pvpmod/features/TriggerBot.java @@ -0,0 +1,39 @@ +package com.example.pvpmod.features; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; + +public class TriggerBot { + private final Minecraft mc = Minecraft.getInstance(); + private long lastAttackTime = 0; + private static final long ATTACK_DELAY = 100; // milliseconds + + public void onTick() { + if (mc.player == null || mc.level == null) return; + + // Check if we're looking at an entity + HitResult hitResult = mc.hitResult; + if (hitResult == null || hitResult.getType() != HitResult.Type.ENTITY) return; + + EntityHitResult entityHit = (EntityHitResult) hitResult; + if (!(entityHit.getEntity() instanceof LivingEntity target)) return; + + // Don't attack ourselves + if (target == mc.player) return; + + // Check if target is alive + if (target.isDeadOrDying()) return; + + // Attack with delay to prevent spam + long currentTime = System.currentTimeMillis(); + if (currentTime - lastAttackTime >= ATTACK_DELAY) { + if (mc.player.getAttackStrengthScale(0.5f) > 0.9f) { + mc.gameMode.attack(mc.player, target); + mc.player.swing(mc.player.getUsedItemHand()); + lastAttackTime = currentTime; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/util/RenderUtil.java b/src/main/java/com/example/pvpmod/util/RenderUtil.java new file mode 100644 index 0000000..7f33de1 --- /dev/null +++ b/src/main/java/com/example/pvpmod/util/RenderUtil.java @@ -0,0 +1,100 @@ +package com.example.pvpmod.util; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.Component; +import org.joml.Matrix4f; + +public class RenderUtil { + + public static void drawESPBox(PoseStack poseStack, double x, double y, double z, double width, double height, int color) { + poseStack.pushPose(); + poseStack.translate(x - width/2, y, z - width/2); + + float red = ((color >> 16) & 0xFF) / 255.0f; + float green = ((color >> 8) & 0xFF) / 255.0f; + float blue = (color & 0xFF) / 255.0f; + float alpha = ((color >> 24) & 0xFF) / 255.0f; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableDepthTest(); + + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = tesselator.getBuilder(); + Matrix4f matrix = poseStack.last().pose(); + + // Draw outline + buffer.begin(VertexFormat.Mode.DEBUG_LINES, DefaultVertexFormat.POSITION_COLOR); + + // Bottom face + buffer.vertex(matrix, 0, 0, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, 0, 0).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, 0, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, 0, (float)width).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, 0, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, 0, (float)width).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, 0, 0, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, 0, 0).color(red, green, blue, alpha).endVertex(); + + // Top face + buffer.vertex(matrix, 0, (float)height, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, (float)height, 0).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, (float)height, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, 0, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, (float)height, 0).color(red, green, blue, alpha).endVertex(); + + // Vertical lines + buffer.vertex(matrix, 0, 0, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, (float)height, 0).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, 0, 0).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, (float)height, 0).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, (float)width, 0, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, (float)width, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + + buffer.vertex(matrix, 0, 0, (float)width).color(red, green, blue, alpha).endVertex(); + buffer.vertex(matrix, 0, (float)height, (float)width).color(red, green, blue, alpha).endVertex(); + + tesselator.end(); + + RenderSystem.enableDepthTest(); + RenderSystem.disableBlend(); + + poseStack.popPose(); + } + + public static void drawNameTag(PoseStack poseStack, String text, double x, double y, double z, int color) { + Minecraft mc = Minecraft.getInstance(); + + poseStack.pushPose(); + poseStack.translate(x, y, z); + poseStack.mulPose(mc.gameRenderer.getMainCamera().rotation()); + poseStack.scale(-0.025f, -0.025f, 0.025f); + + Matrix4f matrix = poseStack.last().pose(); + + MultiBufferSource.BufferSource bufferSource = mc.renderBuffers().bufferSource(); + + int textWidth = mc.font.width(text); + mc.font.drawInBatch(text, -textWidth / 2.0f, 0, color, false, matrix, bufferSource, false, 0, 15728880); + + bufferSource.endBatch(); + + poseStack.popPose(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/pvpmod/util/RotationUtil.java b/src/main/java/com/example/pvpmod/util/RotationUtil.java new file mode 100644 index 0000000..8199ce3 --- /dev/null +++ b/src/main/java/com/example/pvpmod/util/RotationUtil.java @@ -0,0 +1,48 @@ +package com.example.pvpmod.util; + +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class RotationUtil { + + public static float[] getRotationsToPosition(Vec3 from, Vec3 to) { + double deltaX = to.x - from.x; + double deltaY = to.y - from.y; + double deltaZ = to.z - from.z; + + double distance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ); + + float yaw = (float) Math.toDegrees(Math.atan2(deltaZ, deltaX)) - 90.0f; + float pitch = (float) -Math.toDegrees(Math.atan2(deltaY, distance)); + + return new float[]{yaw, pitch}; + } + + public static float getAngleDifference(float current, float target) { + float diff = target - current; + + // Normalize angle difference to [-180, 180] + while (diff > 180) diff -= 360; + while (diff < -180) diff += 360; + + return diff; + } + + public static float normalizeAngle(float angle) { + angle = angle % 360.0f; + if (angle < 0) { + angle += 360.0f; + } + return angle; + } + + public static Vec3 getVectorForRotation(float pitch, float yaw) { + float f = pitch * ((float)Math.PI / 180F); + float f1 = -yaw * ((float)Math.PI / 180F); + float f2 = Mth.cos(f1); + float f3 = Mth.sin(f1); + float f4 = Mth.cos(f); + float f5 = Mth.sin(f); + return new Vec3(f3 * f4, -f5, f2 * f4); + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..689d6b8 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,25 @@ +modLoader="javafml" +loaderVersion="[47,)" +license="MIT" + +[[mods]] +modId="pvpmod" +version="${file.jarVersion}" +displayName="PvP Mod" +description=''' +PvP enhancement mod with KillAura, Triggerbot, Hitbox, Aim, ESP, and HUD features. +''' + +[[dependencies.pvpmod]] +modId="forge" +mandatory=true +versionRange="[47,)" +ordering="NONE" +side="BOTH" + +[[dependencies.pvpmod]] +modId="minecraft" +mandatory=true +versionRange="[1.20.1,1.21)" +ordering="NONE" +side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/pvpmod/lang/en_us.json b/src/main/resources/assets/pvpmod/lang/en_us.json new file mode 100644 index 0000000..6918af5 --- /dev/null +++ b/src/main/resources/assets/pvpmod/lang/en_us.json @@ -0,0 +1,7 @@ +{ + "key.categories.pvpmod": "PvP Mod", + "key.pvpmod.open_menu": "Open Menu", + "key.pvpmod.toggle_killaura": "Toggle KillAura", + "key.pvpmod.toggle_triggerbot": "Toggle TriggerBot", + "key.pvpmod.toggle_esp": "Toggle ESP" +} \ No newline at end of file