From d493fc42b052d9ca543ff03b020c0042e9443784 Mon Sep 17 00:00:00 2001 From: catfoolyou Date: Wed, 29 Jan 2025 14:56:27 -0500 Subject: [PATCH] 163 errors --- .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.0/fileHashes/fileHashes.bin | Bin 1952323 -> 1954373 bytes .gradle/8.0/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.0/fileHashes/resourceHashesCache.bin | Bin 880600 -> 882266 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/gradle.xml | 15 + .idea/jarRepositories.xml | 20 + .idea/misc.xml | 5 + .idea/vcs.xml | 6 + lwjgl-rundir/java-websocket.jar | Bin 0 -> 173621 bytes .../eaglercraft/sp/ipc/IPCInputStream.java | 69 ++++ .../eaglercraft/sp/ipc/IPCOutputStream.java | 54 +++ .../sp/ipc/IPCPacket00StartServer.java | 48 +++ .../sp/ipc/IPCPacket01StopServer.java | 32 ++ .../sp/ipc/IPCPacket02InitWorld.java | 68 ++++ .../sp/ipc/IPCPacket03DeleteWorld.java | 40 ++ .../sp/ipc/IPCPacket04RenameWorld.java | 52 +++ .../sp/ipc/IPCPacket05RequestData.java | 48 +++ .../sp/ipc/IPCPacket06RenameWorldNBT.java | 44 +++ .../sp/ipc/IPCPacket07ImportWorld.java | 53 +++ .../sp/ipc/IPCPacket09RequestResponse.java | 42 ++ .../sp/ipc/IPCPacket0ASetWorldDifficulty.java | 40 ++ .../eaglercraft/sp/ipc/IPCPacket0BPause.java | 40 ++ .../sp/ipc/IPCPacket0CPlayerChannel.java | 44 +++ .../sp/ipc/IPCPacket0DProgressUpdate.java | 44 +++ .../sp/ipc/IPCPacket0EListWorlds.java | 32 ++ .../sp/ipc/IPCPacket0FListFiles.java | 40 ++ .../sp/ipc/IPCPacket10FileRead.java | 40 ++ .../sp/ipc/IPCPacket12FileWrite.java | 44 +++ .../sp/ipc/IPCPacket13FileCopyMove.java | 48 +++ .../sp/ipc/IPCPacket14StringList.java | 80 ++++ .../sp/ipc/IPCPacket15ThrowException.java | 71 ++++ .../sp/ipc/IPCPacket16NBTList.java | 95 +++++ .../sp/ipc/IPCPacket17ConfigureLAN.java | 63 +++ .../sp/ipc/IPCPacket18ClearPlayers.java | 40 ++ .../eaglercraft/sp/ipc/IPCPacketBase.java | 33 ++ .../sp/ipc/IPCPacketFFProcessKeepAlive.java | 43 +++ .../eaglercraft/sp/ipc/IPCPacketManager.java | 79 ++++ .../minecraft/src/GuiScreenDirectConnect.java | 100 +++++ .../java/net/minecraft/src/GuiSlider2.java | 87 +++++ src/main/java/net/minecraft/src/GuiSlot.java | 3 +- .../net/minecraft/src/GuiSlotStatsBlock.java | 1 + .../minecraft/src/GuiSlotStatsGeneral.java | 2 + .../java/net/minecraft/src/GuiSnooper.java | 131 ------- .../net/minecraft/src/GuiSnooperList.java | 46 --- .../net/minecraft/src/GuiTexturePackSlot.java | 79 ++++ .../net/minecraft/src/GuiTexturePacks.java | 183 +++++++++ .../java/net/minecraft/src/GuiWorldSlot.java | 1 + .../java/net/minecraft/src/ITexturePack.java | 48 +++ .../java/net/minecraft/src/Minecraft.java | 9 - .../java/net/minecraft/src/Packet3Chat.java | 1 + src/main/java/net/minecraft/src/Rect2i.java | 49 +++ .../java/net/minecraft/src/RenderEngine.java | 359 ++++++++++++++++++ src/main/java/net/minecraft/src/Texture.java | 304 +++++++++++++++ .../net/minecraft/src/TexturePackDefault.java | 36 ++ .../net/minecraft/src/TexturePackFolder.java | 31 ++ .../src/TexturePackImplementation.java | 261 +++++++++++++ .../net/minecraft/src/TexturePackList.java | 287 ++++++++++++++ .../net/minecraft/src/TextureStitched.java | 213 +++++++++++ 62 files changed, 3526 insertions(+), 187 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 lwjgl-rundir/java-websocket.jar create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCInputStream.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCOutputStream.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket00StartServer.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket01StopServer.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket02InitWorld.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket03DeleteWorld.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket04RenameWorld.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket05RequestData.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket06RenameWorldNBT.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket07ImportWorld.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket09RequestResponse.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0ASetWorldDifficulty.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0BPause.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0CPlayerChannel.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0DProgressUpdate.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0EListWorlds.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0FListFiles.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket10FileRead.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket12FileWrite.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket13FileCopyMove.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket14StringList.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket18ClearPlayers.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketBase.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketFFProcessKeepAlive.java create mode 100644 src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java create mode 100644 src/main/java/net/minecraft/src/GuiScreenDirectConnect.java create mode 100644 src/main/java/net/minecraft/src/GuiSlider2.java delete mode 100644 src/main/java/net/minecraft/src/GuiSnooper.java delete mode 100644 src/main/java/net/minecraft/src/GuiSnooperList.java create mode 100644 src/main/java/net/minecraft/src/GuiTexturePackSlot.java create mode 100644 src/main/java/net/minecraft/src/GuiTexturePacks.java create mode 100644 src/main/java/net/minecraft/src/ITexturePack.java create mode 100644 src/main/java/net/minecraft/src/Rect2i.java create mode 100644 src/main/java/net/minecraft/src/RenderEngine.java create mode 100644 src/main/java/net/minecraft/src/Texture.java create mode 100644 src/main/java/net/minecraft/src/TexturePackDefault.java create mode 100644 src/main/java/net/minecraft/src/TexturePackFolder.java create mode 100644 src/main/java/net/minecraft/src/TexturePackImplementation.java create mode 100644 src/main/java/net/minecraft/src/TexturePackList.java create mode 100644 src/main/java/net/minecraft/src/TextureStitched.java diff --git a/.gradle/8.0/executionHistory/executionHistory.lock b/.gradle/8.0/executionHistory/executionHistory.lock index b6eecc824d27899a06400e62f6f49ae3faab5f16..72d231a98a3d1cae894db82520d3fa9139dbad8e 100644 GIT binary patch literal 17 VcmZQJ@DbZG(fUj^0~oMA1pp|Y1V;b> literal 17 VcmZQJ@DbZG(fUj^0~oMA1^_6X1VsP< diff --git a/.gradle/8.0/fileHashes/fileHashes.bin b/.gradle/8.0/fileHashes/fileHashes.bin index e611bd7597b9dba8514ab736b2aa71cc53e9a998..5bee1ddcf9f4a5d63387db709d012ffa3e05dfb7 100644 GIT binary patch delta 26116 zcmY*>2UyhC@-}NPz=A7^tB6=*7fp|iSfVi&(xW0G*rnMUO;8l2tdti)%Bs1h*oa9s z#u!4{O=2b96k{wzqbWAjbj$aioxv}Eo=2Z~XXebDGpCo|ew4T5lWj}(-0yE0yY~VA zcyH?~DgU|9JN=l4`3pGw*WQw@ANg2D?_Ks#>z6HgdmZ0f{H%lHrSU0hr0S=Q{dgt@x!v2^#gCSLvM^TSd970qLBxkkTlS>M9)IZ{rw?2_K1 z+Tv%0#yyxwbnQ&B(sU)OiO^~bccIMWCBsn356T!Z^G^c-)Q z;~JCD(BWrY+F(%kZfhSE?dmqJ;~N`J^la48;^C2h8+|`+HQV)OS;Nb1EfZZ^_BVW_ zfptxr0S)Hf9Fu9r#D9%l?Vo6J^cl->*Oj6sq4!yP^zcq<{ryPQ?&*5)qb3XLTTZw>{ItpB zNtSX~V8^BrO|5>e>`U+ebVoh!b}i}Iv?!onH(yuJ(M^xCb$ZoXm-Ni zda`1g!#1K)RKM8nnlZK6)8H=67Hftca`o!je2kC9>B@Pm`E$=%LR=Se znmb!sTR#8I3j>2TiPk}|1FW?pk)*b6pc_ZJVYT%UA%yAyL)bOz5laqRee{@trnv_o&D-d zRCeF8^~`}XcH$-cC?;)+@px3r9|2>Q%R$~b9jYd@FuK+6YO zvX73aHfdh`q0O%WFT|Z`a$ieIMNp1a9EDr_!UkFvxeg5Ss|d7C zsNB_VSc#7~IyeYu+c3p-A`p_wCr7F6xJ7yE-Sg zI@!k3y&~u*?=`Qsdi&MZzl^sGcK!Ni>)`s<%ptupk9JNH-NV5y+pX5cc2~kDt%tP0 zku83HE_-+X#?37+xH{hNAKJ{CG&=CHMN<+*{m2d1oWcH0TUhtJ^rCIru2@Yg9upFv@>Veao}1%QO9*^{h{K>FmFE zOyMk4+M3%@?{`ryg#CB1QiKDwbU8x>sknOB+m1qo3*q}beSAS^BDYFnWQXHi6B}+R zw_Lc5QG1-+K7WXd#RxvdI80UOM4%txMukOq?GMSoa?~7QM1EI6HoX57!7L0_stmqE z7{d*Jisf}U6T+H!UtuJYj}d6m zf6F!upNz>KO;Q=KK1)12`gwYISjM`B{o~)?-#h*AU+gs1A_J+*?d1 zplTQ^{h|tDa90I$5!|OuALDLqUBmOOrHO<-;x0?L_amiY3mbNmYYaOO=-JMW8ii4) zd4$d0)>ouk(X+3(Ekc-5Tac~PMpTh99%qSdPXv8zv%#yMc$_2L76?tV+c1P&<1rJ# zW%L-Y5LnkwTx4LsQpLEe)Kmlpi!=qHq>Qs{G20b2XMAjd-S*_J>Cp7}(pQ>Ys(fQ% z{uy^o<(w}OB@3KQSlXk(;(H-hyk6f9OMih8IO_DYV}Qcw0G460tb$&pcIw|MP)XU zmeIl32gSh*$^AnJn&8tC$q!2A*CKo|l`2$8R*oJmP}7a|agJP5!d3W3ZO%j4{8n~6 z@lahE!XFZ6F>sJF1t}CiUZ{Y@hEu9pjOs9sCDw-}GkK!qgAjXD8$!r6eikC9s-+zZ z6i$}0^<{-iap2*)!e3P?1woGpZv#S~=8P8oh&b3L4(g+7CTGbqa*cyBSYkMeR4Xh- z`|C_o|51^yz+D$(@qofLi0#3FdZxkxBt0sw;!vSf0lZFekh-lZ4#b1C)%P*6w*V10 z{p^TPh+MBNcH}DBfY%=ra}H^Wf2d$0Iux;ecONK5CLv^?1U5m6mYPY=j=lG!2M3Gg^*H0lS*i69v66?rLqxC$5lU@B^Uhr6 z?7XKEKAe?tMqxTCk5KA6R16g1;0MgcFon}m*_O(S6fQ^RP%&SMN~KnDw=2AKq*z%? zgF?jA8ieFAZLGpbjCq?4)u}KHj^k`G#}zv9Ylv7WN5JDkEyZ}Ha*(2w0|$$k-NTQI zj~onHLU>ocn#NJVGDf)5g!>FEuQLAw$QAEZe{dB$UExe5j1ixy*sat`)R6jD2$~{z z3BC7zN(}1+VMWDG8V)Dd7!F6t{cIc#h3oNHHP^HsDJ;avr^HV=yvEj*cZgC&h*v5f zTS*z;x-@Eo>d&}PxjI&S%SPIxBWfnGs6pezcZTbcacze6Gug;Pa-x{$^gf4e?NFkm z)XvdVf^>&mqdp0Pe`jmzmn2HE|D*Z%OAT$9My}X&F5(E6r!X61@8^jBslu5!og^MJ z;FBzwFOt}MqIL@dH#u4CI8Z%>oji-slrT+{JP@*w^V0{)U09d2=6y!@x+a|{tG&)C zVkrRwQ^e<7#3&Vqa-~)v_*r)6OR8Lk-D|n%XusR*CyaL}YUielk_8Y((g7w(XUKri9vq>%-BGu6C)?21Kl6 ze$FbKj-W`^Q;Re)u@*hj>cTl$sWN0K6^9R$T8V?BX~lE3xLPe?>xinC+1CauSNAJc zSVCIa5T{(7AzMn|w~%WhFdy%(7RTH$HR8gm(HapHq5T>WW8Wrxi{{^^?qZn!<2w&JgnpQT;L- z%1^hrlI6#)@P~0=?DmC){haI ze9f1bOq4mGUbdJ>fjwLNO~F%2tw5quMc6~iq?Y3^4VI(?BWN~zW}h74 z>Nc<$f*vAwD!HaXh9Tl2GrLh?CPJ>V>ONMOCGFvNh09QViSx^S4oN!$LmiUK6^MVI z)w4kbWw>^X1Mm9^x57D%MZTtR9UPA{)Ezg9m02kJhAy8~n1p#7>ng8QsUjRxYJ*uy z@bn{B%2Y1V;{vse1H(9SO_>r=v54-I37Zkhj@yFZp^aPO4b@qUn1yV0=M`?ktz7Y1 zgrTk3BSz(ktrAp(uuCmhn1K*)7G;ORXndR}HE}N|?hfgbFZt7L&_mLgA1Bx3Z!=yG zWEdAJEXTE2X5~K$3-NxwWMvtyDHVg=?b(I~7KmBye$Ah+RC^4$#_SsO?B2F5oCUJ; zi-%sKgNCSg~1#(bK>GW?Up29c+54N{)ri2A9***IM&KDeT8%DnX0Bn7*-tO@qywsA7K zreLwi*}`~bsgf=eSfSfk=^rR}ip0c*8gH)Bu4~dLR3y@V=OVF`jDbbscsgQ~Dn-rn zY>w|z#dIF+CcZMeUs7(ASg$8Xi|va=H%zz>Bjph;SSFBbvYQ4+Hp{+Bp~m-3g)4BV zSh6q~L3g=|^4~1UlF)Cn2(mEgXGVIZ3es`xCuVRLp~>K6w^K_yI1aKOpH*(MWTiKP zM%1^VMTyvS;MzIv*M=)B#N-lju?;D=c;Nbq3KH;v3fAJWcbF;9QZcXqv7fOw3|6=n zDF-NxQ#cboZ?HFRQ5cVROU3+LTvBQ=+LsA05fez663msn+TpI{&1F(9J%?+6iuqhI z9U<2QbCY{xSx_!00{-Pj!Cd zlvs&;RW9l_3C`G9X%5jX8F`1V^h-C}zdj@{v~5TkH1#&%(6E?2k_JI#srmkQ;GyTKkwT8wskq%_eO zr&K9|nlM3;suUqeq zz@IoJ&U81Jps$r|#=e2)R z(&r$_OaK!IjnYy{>IX+GCzDmGl#HS`#rte?GvqGfB-~M|9R1!B-pt&)vpN61RTr^@ z95$0(3MV0KDTjo!3VCrgjv;FCwkYRv-9YJZg?X6#w%ANTmQpzgna`&2ovLg`U>^>S zo-WC`998nm9*x}yxf_;)B?W+Azd$6Sq{mC^s0-oF_whFLP zsYS5PU@SgUl`K?LvP=A}kk?5wn3-Phidmg?S|WG`t7rQOe(T!ky~`epGl4X2dKg!PK>79fO_aiwFc1reJ$foEP3+oh;Ar{$Fj!x2!A zwrdGZnq(>AQ*d7rbh;{ORv=(1v-h0BaztMhXOSpVY6hxF856q0h(+i?o~;C26B8Mz z0tcA!ghoksH-WOdNl~s&D3fKEzgLs;pm`Ou_@lx#xP48$&qU1!EXwFwagmRRS`lpI zi3fYqP6~`OZG}ATY03HUjH*wA*8tY7?{!JNMh3TG3g=+bbupHSyARX-b`=z%QUw{P zC1o7wX>1b&6)@6+ZirhQ+`1!V5?g63xu!{l!}k*g!l{r8jl1lf#}xuY(%J4C-W26Y zIMa!J?IDHpF#e`wY7SCJ8Q)vnHCFFFSpMS4$YE+4u2w>0SgP3Z?kZQ0F&oN(Q1EZ! zBp3gfX*yEjWUTm2oGipnrKZ91DRcRks?3M)@8VsL*P5f^0*9Qi-^F4yI`rjQCtG2p zT<}#9n!M@BLtD5nRBxzK4x%?OE?xc*6N@qE56Q(;#3~gJr&2jMJ)aBA%c{H)S9`FE z0{@h>D-m>@ra}pgzeUofE#fa#l~yBZ3zgndI2nik6n`smS1DdO{3X0-RDR43nedl5 zC_%mo*5T?dR!|KE#+6PxO;P&`E5r7;s5|A5c7(#sNJ?O{U7~Oz;__LRR~53e|1D1A z&?klhuYbh0?ij6zSi&>tA>^9ov>b^Os1&b|&%mNNs%=%c4R^j`MSP`j9xneQwl|q$ zUH3@EI|HRMvEdC4vL&~~pFSJviqKCuQXM7N_~WT;Lv}68ZBd#kv3*)jQ3jA}lyXpO z-sDVIm@3hO!bKSR9Zh_$FatHWB`YbiTkU;EY->9SK+taXs&I0R?RZpo=UC)WCGBMG zWIyzgD#haD9kIC?UU!9BWX@vUMb1LJQgd~1s{`+Kyt=RYH8GkkZou;;H96bs*djqUj^LEB7Z?fE|o%7MjVce_tO*lM=cu@(`e zaG}9HQ4-<5dIygvK4jP{R4E1_zHET!6zahM?@ir#%0=&bVtW~QLg@A~6Aq;|aROi) zJ*CQ%aq?LXG1mIxPv_E3vilDq*OZwfs2PVAD9kmdzIO0v)-BC~V+(V`vo|-~1Rngk zokk+4f!#eU={)BF-$)LA(GA4edI_)(EPm`CWy;l4nQn5sQmtH_4EiDB3l3rR8;Y-R zz6TUvsTivi-$^M2zVH<35`@=hBfHIHCaSt)YY+E>n!b&Mt0$=SP&J#&+z4__*;mSq zajwEV9Js@E(I*OdER@F4@(+dcVQnlPCn7|tbuuqyHWqs+xxE)~!X+{}(G6WwMC7;O zHN5I9gYzlw9XmCVBoTP5iCEnVM>IQSx(af0LmYPOQ^c!ysu`<#^wg2T;?Z|NQ!$g4 zYkiG#uA(e=JLajGWF$rEqAhCA@FZccDs8~QrsBB}dLJ>Sm*hTpI*?i>~$y zHaT;997(Qeatm>WT^sodHzK$NNAdqET#hr|Qh2@>vkxK}c}-{` zPD{ioC)&q(7PgyQQ@jlL{z|7c3a22}tP^cEk#0iHpB%zQDBO%No7kR;Y^9=6rBnfG zo@B4~YAI=>U@c|i8KN*55y7+^uP_Ji&Nh>*!a3OAQY=rxWuLS)xR(b zC4S;#D#n*{O?6b^Rt$<`g<4vPv>bN|>0^MxC>%Jz!c13KjKEn84-_uO?pAeit083? z0wtP}{q;m@SeEgYbLMz4mY@OvJ9AS?rG#I&iYJm`y{?dpzIh<}X&3Ammv_ z>m`MJ$L23ib(ile7exmsH(AlMC9c2Ci-W70Djx}FX(XtPDCuzTBO~-P=z+hDPafR8BuVQ9wM#XvTE`?6;zDO`b)eHIdgew&fhf*8lf}C%?+!>xH7kbuq0#lJPn*Kr*#=zQy0p^{p zTR8z&%UW|f=?iVc_WkA zLCU2o;8t*czIhM{5zn#S=Gt0w<%)taE)k3yekfHd-F0Fa?($Qp!jndS-XafNg7YZtM%5CL6d({)K8(o&?%;t9K?5Ei?a0+n+53EOKdt2rc@NNmD-9bQpSZYof{$K4#y3z-jX^Gj%S&V zAqt(Sh+^}MS2!KDk8ydmRpC~Y`Ox!M3K!>9z?jEi{HZVpK2f4K9Ye|~m>eZ$m$}Q~ z(FBe@Y}r}L)jjNksJO)@`T@DdSuW-dWrw@2kY_kMXsPpbkxs+F>EfaYF-mPlxl*a} zjm9NaE<@iv930xukhGhz;&BdP6BL#q*1Q8;rEo5aW{Bk|_|D*DaX|%q9;bqJxe=rJ zI&P*EN(ZDTWmmjXxf`XZjbx*^i(FHv#RzK7es@-tbQ9N4E>K#`sw-QMS(1a*n5-1v z$|;qN50uJ9)o-kL&)Jd>-I}(LCD>qcC5*rBWZdEuZpuA4iq{8hg`lEU>&k2qwH%7|-FdREAwt~50lAAR1 zAh5r}2(H#S=S3-8i0pl=qB`Y`xZ9I;@|j8tQ8kd#zZE87ydPU%uX$p5qgh|^-5jCG z6F*=we=Xsg!jT|Hl?n<@uzVjXa^mV|EZ=dZUA~DJtW-MUNEw4VLV3%n`g_sh zMhBc`s6NKc!s_IC3rPd8v4$o&8KUSCkM=38{e^)pY-issyQE)!V;!Rv6#nVwS9TlmZ z0XL9qsz~3?y{|9~Uo*9dhSoFhy7q8C)^V|@r{VBW`hHg799T-|dyT>fSf_F@eMjL& z99t||;d8AFj&bdlh?PY+e1KNQ5t?WCdctN6#@VL6EwO5ey~V%k!%x0sdqdNf;tuy| zIInOCZY`;ccb}zo-lmc=CYDPltuL24JC=%jj<~}Z`_qI*DOr@7@nn(h+-I36IdS$B z%ksFwMEQJjp~4y1uuPme5HgEp`Bnw%ag73FHciZWAmS3^J#e|0U5u31c%u-ba4Kqt zbEGa;Sb)cV=Mm4B3bS*E#M#kcg(RJaz=KTspu$*;TOnD3f^y4tsZ>1>dFv{l!-OMCRu8c4h7uf{!6lP+_N^!OYrC=Q_(M3c(csYUtZ!Ti#t8O@PK0&w=uiOHHBS(PgT8CZVp?dh+ryu zq==m&^AUv|i&c<}EER0U2TEn<)|7JsUL{GBQJ%@Mf3U&@sG7(bE{@O?Ti?EQ;o&L| z#J8vt7tM>=NdKpBA}*~G?_1D5Rj5>Rg6EE>j(B<{yg60erlEHg>+J}k@uQOi&mhkE z+X~V|XF2@S#99I>%zisc1!?k8L7iR+cB$T6oK-3c)wO1}T`i_!aA_n1WZ=)rFDp~8vyZngMb3(qw|t%3C$+Iw-0*mEFG1#^+&$HRyBR1hr}$5#|i!;0=4 z8#<&*vYDvvNWV`Lno{dy`DX5iR)O{6`z`CW@7%KQnSS!Q=oP3iV`l+?zs~8`6agaLdqZdsJyMLW&sJ9~7oz zT&czGf8^`=@4u8gE2ug=YT3%XHzg;z&jRsN*q}$Q69-c;Wu17Qf*hr`BGa4-eNPqR zG*Jevg$RmgpY_i8KUv`eKJ#JoQ03~l*-EZV=aXxiJii|)l~Hy$zx~3-%4-z#&%`GgJ_ZL={ZM z9#W=wI#9Jh#V0%&yQP}>Na@V6u1}_vRwv4OaBksvGL>9Yu6Xp$Wh^%;Ou}oKb+OF+ zjxEa+G z*{_ln@;mB@Z2fO2jKZ;#gy$8`#;qI)!7S9i#yTJ65TlWp>JY(91boUoD23HkEI--%hEu`gu{G4I9OFDc)CVtIX%kawSC;4)hGNFJd0ctx=C0+nNB`XC4HF0j4fxzuB%d}Jfi9hNt26# z5Eo9wC>4crQl@Nr+x`H2&v78Qq-mC5x49Q-UnnLr@nE5taPV7k*4-)f3xBFsI8dwyMu&_K4c%PJh{9AvOtRSvN+fXtZXf1Q(qG{m^T9HwV1=8pvP66)W0z7J<@Zhgriv-A9{vX) z=)D#d)$A#)0E$ za!rk-;a~x)I!)mUY%UjPWr%x{ON*aW;4E;8>vE~?K8RnXI)Py0dldA=kK^jn8PyP}_2gS8?OJMfj_71D@hEtfx?t$5oW*~}7L5p_WPUAvQu(}$$|qEigIWrV zb)63awVk z^oA-_UIHBcRy>v?C5m19uEHFy%eYDnJ|WWO2shufMJg;p&95v?zCu1}cCohpt8j{` zOLwzk2mel->NQI@d1M>*os>&Ai2P34jIY_`njq%OH#$`cm*SWoFTrjoTmbhkL3KGP z%JJr#cYgk_a1tsq*u~c=Tx5O@%AJ*YGCW^a!E9VD=A04uy;$L|3p~wM8%k(Gr1|1H z&79Sys?stPe=o-P>m@Tdu3S{XRNPg;dh@eO|86z+$uq`;Q{pE|mU_DhjUT;=4wi47 zYE;RAgb^HGY^Np7D)c-pZl~jF4x8u_6--063W`ysR4Uqi$!hdEBWagne_s}Jh{7CH zm{6Y zL2^zNbKsw zHa_-8@u#0Q)RV*ZB<1Qo8jrrsFQ-+IYjTl}glAYG=M-+hKWcL|dS9rs9VjBtz#h*^w_X&uRmQOph5Ur`G~4?Eg*?Oiik<9bg{3%fQ5;RdRizRU^pkXi zav8gQky681J^CkcFck@W7KAcF(-L)-<70XAVPv&(^|^(gT;kOKS(2up?a$(Fg?za- zQw5nwQUTjJDPvgYb5GQa=0tg0HD}6W&%VEicl}=dKI$rIA? z3f*_7oU;f`bTo}szNFr(O365QS*)+e?aOw1;JWZHo@iNq`mNN=n_oRp*y)xYH1w64 zZ7fTZ(O1MHr}!(9BYiTdAC>N;-1yX$Wk)W}SR-eYtF6QzL3em);d`|%3i~%OM#B`Y z#iXl}v8fnmhPmx3Scgg#Y(y<7<450-^C_}fI1Rd1m%G{^)=8|wNvO}^Iw3p$TfI3Fvni}^_GRLY5JK0w7^s=}Wux*?_0)0vL)HEGxlu{a;S&#+fz6Pi3| z|LH1=*(&Agwjv&(Tlsz04NW>3&2NhLHS#g`3pd4PG-6f21AV1pF}0X;!evz{MBjXt zEATf-k%3C{TLYmAlO$8A3Rj}|x4J00KkB@wf*jmc0iW3YF2&T%AivxD= zt_<96g_F_Ke0ox&kl7r~{%HF{l(P`<8@t^Ih2aSML)!WGY9u7AsmB#VkLV0 zDQTygUx?%Msn7|_8|;+v3X`zzPf4~2`<0rF%Sy!|@Gp_BN2pTnkE1z9{w3xMO^G>2 zDlCTAeROX5TWU`~`t(G_U3Q59n?7FjEVg} zp@s5wT>W|?U5d8##8^D6-Pjmrs$e6MRInTsO3lYPQl_4CQCcP+81$_##?oZh8bN53 zbVo7;&RRCkTvdw1>-EKB39kLhKKX|VVqt9{f+&P2wZQz$2dBpdZQUDtJuva&?byu5 zd?3-Ft@~L`8GfBD$ftiA9-Gi%?C<93AM! zr~Qla`-kltwRImI$cIrD{?OweEXw#sVwu|vb99hG_^%FQk#)pgRf;h)yt@X|WP)zp zSW?eJ-^LMSI{1}m zTO3#6Z2a0(j5ra{OsF`FSE>XlN^L`JD(CIP&BR3v`m|;(-BlQY>Mz-CgPV(#-yJsL zGqOm9;aJgJESF)YQeilw)N1&8inI_Zud*eCc}j@%SIj!gNB-I5nh+IY$WnHYDusEt zyN3tBHxy1o#m5|QyLgH6JPh&@+mVP>iW^8$re=7lVg8!P!;{NQW4QY8jMseTcd!Dz zg}X>}56h#%Q040SUEc+zl54U!3B}&xH3f&2T7eze%Y^$AVJ}}P zp5D?dmN%|L$TbDgx8m{lp!*_btHL>ES;$?bLf#1ab4qF4LekDfU<+}@-@znhLaTF> zzg*6gP}6XAS?49ox}(a~(DD~!rmz|;HnF-EPJZW`KET$N|Ju0**aAK+Fgcy*y8UXv zD_+K&o?P=w0sgLt>myfyx5cf2xpwyctM3FX704e#u)9|83uw?>aOF{}-L?JWfXxk& zzQfDg-*LX;*{PfNfB2tQk9Z`E>CDq1OWq2f`7gqgXMKTB&V1+CM-dw%7IaJcZr&5& zjq0RQW&F)UesAvI?o@H$A0LgG=6&kP(92)k!9$-9IR7FqpCzq0;0B*pf&OEPhQ9jqrBjbr4EbO9 z(&;tR>y&VHKtsEK^)J(-e>~oGZrGuxp8mV#p;Pyy=3dm_mU*M=w+*7+4qN;7sY`9U zxo`N~<*VTbCjL|FCH;7ON6hy<9{+aZjJ$0-?xhXmb0`0j`{uuSJTq!Z)+g`&cU{Ao zd+$kO`H@86`kKIV1H&(#m=e(7_^rwNxZ?YF)|n$N_Z%9zprv#_-kHR!ls6);B_oOvF zt#<#?NB%n3eaNnC|5q|bJzG10bA+aKRy4KyHw$RH>bu2*KJ&iP;qUFw-adR!>hN!C z_rKNdfyaEqC-+~s>`IrE*B*WIo|I34?f#)v{f94neOs3=^1n`aV@T1?d(z+x)@Pga zEuPOU*H=gVcKMS3BMsg@ zxgx4gDh?XDPeJ|L&)b{x_u~^9f7|-TLsJ5K_ODaI)J{Hj|KWwBi?4qDdYj>X= zd}_Fn?p+)IGP2&SXAg8_T>g5*fY)ay9~s!Ito7n!Dt%QPSlvG;7kd8YiU^N4e=DeY z_`cff-@KitN-T-_>(GP$^%=nby7OO<`R8+K)pPal%v^T0$(d>K^8zY3+qj+XrjUQF z-6s@*!!uHohkdsb-R|IGPv&}CKHBTB)%eQad&&w1d=l~Gq7_AY^nYdjzO2O^93ww0t!%U7 s%*W5E(rFAm2XvI>@;;kT(>I$ySO{UkhDeFM&?3UM&|>-BdsRy8jS{;eB_MKDT8!`@J%|?@ zC7^tS^hQbFgpfko1{4b|h?SE6^X^Redvi|CnP+C+nR$EtwqVN}c^|*A^X3TKxZSrz z#0Txpyk=jBEgGZtMJ(F={cT@vu_f(Jtha^l{<5_q#8!*iQTE~1W*^&o+iZ_p19sX5 z1X(X++7^V`Qt*63*zm=nZkrYA_E|o{Hpbc<>>J}_U9kJ!-P`s)TK=!+aO<{z_UvX` z{L&C#{&%!q8q%q8yzP1GfjONL!>#ilb&3t}as7x3dEKwU9r@j-THkE!bgGx_-`3`| zPIq*)e#z=|eQ(?I7-@xHZ4IpNH06HVqt*x4bawk#uMFt?Wn`y>4z{&jvFPm{e=hdD zw=@5{Sibjm{pmqlg>`yO*VyZM?G3BV$FEz6)z{&-(`Nk;=J&SUb_ZtO>R4p$y~eMh zuWh2W>K}f!5!T{qerq~+daHx2_e|WppnHmy^{ij*TejKOCmuh0Un|$04}HWo%KCnVe{z_$@iYGyy4mbV z&FNWUW$p0qI^OoQb?~D9EWU zj2IR%ees=_0{9xCbKZ|r7$b1wMvVCz+%klHX?YKrS$KG?a<5w!T- zo*`S`?P(9St+W;mw7>7fzD~9XYs6Ul6aKbtDXy-5UNvjuWA^uk+5T%?v)cZb&ANS! zJ^5-|a*AtKSFtkcpxqjEFtj1WHpl8y8+yoQwbh0G<+2@0aoro>Rl%UOz7FewZjLU! zZLe7mUG4b9W_7&Q(d@vi0e%ry*jHlYnDAgDQo<}=wPmHU>k&X_ukZY29@YlJB!G@|u!pj|<82gI|GBN5>Hz(dyn2!~|h+YPgk2;;GS3xbN zobKdg@kz41I9e9!#3+S_G5()EPQ0wJ7_I-XIk81yCDPA}(Q2Glst|pD72aW-xj)#6 zmwpw?O>q9JvlAN>HemXYu1=II%tDsK-wB`JM7bW$-^5BIGFs{K85NY_Oi7Rvs}=5t z{r~8rkkFJ|sg#iuiO0G+a8bD}!tH|AN^%GPE-nrrx`E{|O<@b7!U;c8*oZHGmjDjI zQ_2$gO$F5m`a=X+7^Rd4_K_^ZC4Y$JN;Ji=CNdSKV_qpUepX>M#-HrzM87}V!?^QL zu~&v|Sp~XT;5RyS7#h%_gY5xp^o58UBQUKjV5)V} z(Q{TOpfVs4ot!-rY&}z4e`u4QJg}#?MdqM%4g*-Ount90%tnsFYHZAAY5t4`W@wudocsH}v$j{5%wY z!xBA3!QUFe0C;|4M~NCF++1k{;c&Y{9Eeq}Hkj^+9z*Uza!pst#@az*x(GR=S+gfp zkc&1IWFvZT&%wrBMSJVAx6;I%!QxJP>&-~$6zaeZa;2k31@v~pqc9zwJJ_}zLqvKE z1BZy)Mod=f7?vwlgB()EW0rUffGgkOK;TgEm@V8;#J=lvU?jQ5V-=z|(qp{Bdb~eW zTvQ@WsYaYqDiu-DA}vKMDdS8tat%C9A&#hPcP72pw_D|#pZlH6+V$$nCatJu@ohtL zSLU`XT72)v?5}*Cu-zzdAIg#goVZD0&ML5(Jgvx$IXAK)eELw{$yw2F`~A1)3->MB z{6|}RLx5{WxD$u2D0^;{I2+LVwVxA%Zjv(425f`-NA~ooj| z%k^-b@8v-LO+6h_=|^u8qlXcAvrv06QmK5zD^-YjH*ny}xLJ%hV&;o1;4_4#xa!1s z2PAyo!vWVVqU1qqJbU3o3Y+laE#jaFwtLy8Efv(DOa;xb-6|?snD-VPjK5VJWQc>? z;F=T?hWWQj@D-T)I+apXiS=UsLgBfV^>K_`lfzP6P@6f}_;PnA{&8D-9;V(V&T^4R z%49?*p+Ka-=0L+0P4{FD7{RyyPi{jHcQgIPkzWgM)}$VH5hCV;bK(MOuV5i)C?( zLN{h!&(Zi(PH~lo6s3+Luz_RLB~__GJXl*p?h<t)Mw;U96!JdWwZC6H!pRLX)|sY>KrVjdz#NZNdynaOEjqQXP4 zFQusjg&s4pIkEeSv}lA_K8&Vt&OALvij_JH87YGOh*PQo{#S7+v+at?)O%PLO$yz} zDy7suN(?ljD4Su7R+xdTUQ~WfVIh`|YR^%YQl)5B%8i6zR?_eoG37?g$4om@VLBez z!*-gia4!-o* zwkm~(aOyq@VjrUJ7pfewq)ZTbVz?LL=P)1Z?-vufh`oUei!wr^lrBm(xSrssV0%Eg zX~KO7wl5g}P2`IAoZq=peOh5A<~$%i%dkVKB6vvstq8gy`VD#?G)@dRis4|SY@^|+ zRxXaCTYo5Y-933ZqJO~`$p5Kv5H6mWAI($mX_|}zCPq+_qopNTp z_^uV-{or|wS#?bi-<8%K6MBvwDh+P_Trtnt{ROtQ;<=JiJ4ZJuq|4+Q^*tEz8(Y)R zd7@O@Za)5GCkLJ&*C^E@`8AGkA1mY<{ALdL`xR!Qah`arM96#zUW+IIt(#eJkIxr7 zHE>U1CtpTra(JaF#k|VtDONYGFiIkH0d5$>|K>0mWnVeL40OohEjRhq*NiI zA7*zxsmdPg_z%|{eHQ#r5spOs1B`7Fxh9W?5p|JWV}Zh2%`lMHdWPOn073C|4)QFnG&- zGr6V!^09A`IOd+HGnZAJ-xEP2`n)HCT1--^9Ek-CdY!5?VPqQ%uT8^aIQylmiW@85 zXU-hB%n@p+3 z5G4EC9T@kaSZ&76Hm>&P5}N!T^(u89gy>X`3_De+7;!E1)uON(WqrBY2wNg1N|E?1 z0~@Qb3{#d!B*(CVlrgI_Nhn%(v%u=9Y37%G5>e15#BS{3K=4voGN)nb18jbymWugu zGwbuDLt!>PSSsc#kgilFPAip%cE=ArEaHn*1)mSg>otlSL>GY~nI`6wqe zK^90jkIH=Dvs_G+z`0!frDB{?g_x^UBX*K9som|x8@G#DyvWpl<931TdG^x5D}AHUpy)CCWm?XR@xA zsKA4>F4Be9Z&jn#Ddu)<=z^pO}njtxpRqFkxNW?8}0 zjwH#Gjt5+HhCFY1wy^YvOCd zS5Yj+R~5G4>`aF8Uxf|GTq&U(!dazqv7-;$(6Civwo07Y;jQ)=?s_7m`;= zi_VAbYu0RqN^|hjDlwbMl@$fILXzcR)Vp;5oWfkphv=0ccp|68VhX&Ye8?ii*&uKN{cp>egi;NrR)L%IGF$=8(?PILe_ zkdKpV@|A}bn^|1TR7qD1tj{g1^K9j&N|89=3F3n7oF+|2%3RvNYK>Sb!LT*rI0G}3 zYKG_k*c$gy#q=FLO|i>Fe^R-+AoG!v#6D|9cdz)o9SL`E?J|j66E3Hc<;?p6g}G9^ z-zY3Z@mdMNf~$=Ss)%)xtQbSriQotx`;q1Tjtbl;|A7H+Co}4)~TtG0-LZMR(!yOn)q+!is-DLJ9uE3^E;jSvzK6@7n-%gJ;9jmWo>7>JX%l#6xmsZ@c784~X38vaQ3bgu zOJQXV{z6>UNQS$>ZgFmyMy`}&^6CI*)R9<6znzQTzvb|2Wi`Rquiv0&oO%>Jn%6k& z=J}fD0P4RGk97$8Qm877B4x59Lqi7#61FhSk}t(i18kQVOs2we{QM=SlCy*+jkd); zNcfhq_4`WFl;F;<#5xz06PWrv6*Oam3Opz$WlZR(eU}W#y}uR{9!$NDr9VMo2BH%< z;>;&BY4jYqlkB8-snT(Hj&kHXuCNRjzm_O;-Ffe}cH7goiJ%rktJ##lR>1+pwDMr9 zQDF-{e1laUvR#s8VElNRzguAq=1d`cRbc}X&EeF46;{E0j;3l9a!IpYva8Gg&d5m) zcVO5Kv7L$X%N!PFD6}yCYIf#L3VG;b&b})Y%3*iMoszT>y?07(axp=vX1KaC!I~>7 z^LDVi7ZaM&(?f)jNPNrBfy=6t1zRVk8JZ$W+Rf6CJdZa3PmpU`T@{A?z$xKlh1K{v zMSRzzQ7P_vcL}c<$tUUd@m*q3SDU@z`i@;@nR0ay<#Dq)J;+wB9@X}Q>uYk)k!!pc zz;CyhK90!^Y*+ucTLkr(p#lq=NSR#flB%~X?oLwEaF0o63YP1;KHo_CYRoeez$8MW zbWoJSkvNl+$pTd>!J2QxdzQH)@{VSEa9ODq4ECdy~O6MU^CgS(8A<5 zIV3bIfzo>v*5UCzVzU&>l&VI|%WN8Ts?vn0!5ka|EQwqX+Wips zGs}1cxu)C>qb!aw%u>ju-TUlJn-w0yK1;kbBKaIA=+1j3Sshvj($(z>4`b3^(W}A8 zM0U<~D%b;e6gM!X3Ue{@o*?I{REbEt>WyeE3UlB_a!o|_xIa~F9mP9J?MLu4EQ^Dx zas(+^>=J(|Y{IE$7|ad(#H`LbVTgW)RWyZMWA-?fJ;%~mp)lS0e4m~J?Zug =yI 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 diff --git a/.gradle/8.0/fileHashes/fileHashes.lock b/.gradle/8.0/fileHashes/fileHashes.lock index 9c617041173d9b2a76638f83ebf75367df3b88bf..cd2cff13a7e14708faad22406ddec075db792ad3 100644 GIT binary patch literal 17 VcmZS1Y(A6~(`3WW00QjBdH^e>1El}} literal 17 VcmZS1Y(A6~(`3WW00QhfO93nn1Qh@P diff --git a/.gradle/8.0/fileHashes/resourceHashesCache.bin b/.gradle/8.0/fileHashes/resourceHashesCache.bin index 173d71f00ae633256ba8f91c7eb870c929c22b4e..ec481a5fb8b8697cac4d3e0b7515b57f54482c4f 100644 GIT binary patch delta 2861 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 B-n#$* delta 956 zcmXZWZA_JA7zc2!=eck0=YGyPctYqL#F!6n&Dnwx$H4|u!`eCcvcX0#6G0@GZ80-T z=><4PKRC0^K=9_MFu@9Wn>?M?f7J)aC_PXr43|=rkxj^)(E55=D4{10R4?8ilBORZH7WjcE8r`!Yjq zozv23Ms0k;%tGUwcJ=~Ak$z5pECZXq)4vjYA};>&Sv8(4UcI_1sjS_F4_C8ryq0aNrYc#i?p8^^+FUKY>ixxm{9Jat ziTV&d&&aE0E-k7*qAbXILYJA2@HqQG5UCgXjS4l=Zv<54fRUpP4H!FA$)K?VWmBxg zq!zT@VxunX|BDs4aPblI$0M8by-dp*Rynt12kuFpv!3=Kt&|56(NxLTb6l_CcTE0H zoZj%Y@_b^3;Hl$Rlc)rumx_(Xf_oqiLNeGcgws^U0X67R^r8{<;{WF57xTQ#bd^1cdj9(2F#I zXD*3nGt^tzng<`>5v2z8+SYCs%lQ5gttY7yW6eghj(u%LKv&n=jcRNP8&Mb5^cV$h zya%I;wCow%%9Szp`>?S#g-#*$CnH4oeA-CNqOfh%|G)M*WD8M0qD~oFj+#}nC5cjO z>%NHT--_gdq(MwRF9XRczf$_qS}8wEq=0Qj1s0z#$f9m|Ps^x@`=82vD`|smjT literal 17 VcmZSH;5Bjcn=huq3}C=|0suL>1vdZy diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..dbb5ddd --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +eaglercraft \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fcb19bf --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..f9163b4 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fdc9bf7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lwjgl-rundir/java-websocket.jar b/lwjgl-rundir/java-websocket.jar new file mode 100644 index 0000000000000000000000000000000000000000..8fb33ad5dca94eb91369b2cd939bdf4d2aa71500 GIT binary patch literal 173621 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%0D)yP>=fj>O45`^I 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 eGMYxO%`Y4-#%f6-Vx7uLAA2tRAdbx1N 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 aBW_cIgH3 currentBuffer.length) { + throw new IOException("IPCInputStream buffer underflow" + (errorName == null ? "," : (" (while deserializing '" + errorName + "')")) + " tried to read " + len + " when there are only " + (currentBuffer.length - idx) + " bytes remaining", new ArrayIndexOutOfBoundsException(idx + len - 1)); + } + if(off + len > b.length) { + throw new ArrayIndexOutOfBoundsException(off + len - 1); + } + System.arraycopy(currentBuffer, idx, b, off, len); + idx += len; + return len; + } + + public void markIndex() { + markIDX = idx; + } + + public void rewindIndex() { + idx = markIDX; + } + + public byte[] getLeftover() { + if(currentBuffer.length - idx <= 0) { + return null; + } + + byte[] buf = new byte[currentBuffer.length - idx]; + System.arraycopy(currentBuffer, idx, buf, 0, currentBuffer.length - idx); + + return buf; + } + + public int getLeftoverCount() { + return currentBuffer.length - idx; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCOutputStream.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCOutputStream.java new file mode 100644 index 0000000..dc019d5 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCOutputStream.java @@ -0,0 +1,54 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.IOException; +import java.io.OutputStream; + +public class IPCOutputStream extends OutputStream { + + private String className = null; + private byte[] currentBuffer = null; + private int idx = 0; + private int originalSize = 0; + + public void feedBuffer(byte[] buf, String clazzName) { + currentBuffer = buf; + idx = 0; + originalSize = buf.length; + className = clazzName; + } + + public byte[] returnBuffer() { + if(className != null && currentBuffer.length != originalSize) { + System.err.println("WARNING: Packet '" + className + "' was supposed to be " + originalSize + " bytes but buffer has grown by " + (currentBuffer.length - originalSize) + " to " + currentBuffer.length + " bytes"); + } + return currentBuffer; + } + + void growBuffer(int i) { + int ii = currentBuffer.length; + int iii = i - ii; + if(iii > 0) { + byte[] n = new byte[i]; + System.arraycopy(currentBuffer, 0, n, 0, ii); + currentBuffer = n; + } + } + + @Override + public void write(int b) throws IOException { + if(idx >= currentBuffer.length) { + growBuffer(idx + 1); + } + currentBuffer[idx++] = (byte) b; + } + + @Override + public void write(byte b[], int off, int len) throws IOException { + if(idx + len > currentBuffer.length) { + growBuffer(idx + len); + } + System.arraycopy(b, off, currentBuffer, idx, len); + idx += len; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket00StartServer.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket00StartServer.java new file mode 100644 index 0000000..597551f --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket00StartServer.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket00StartServer implements IPCPacketBase { + + public static final int ID = 0x00; + + public String worldName; + public String ownerName; + public int initialDifficulty; + + public IPCPacket00StartServer() { + } + + public IPCPacket00StartServer(String worldName, String ownerName, int initialDifficulty) { + this.worldName = worldName; + this.ownerName = ownerName; + this.initialDifficulty = initialDifficulty; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + ownerName = bin.readUTF(); + initialDifficulty = bin.readByte(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + bin.writeUTF(ownerName); + bin.writeByte(initialDifficulty); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName) + IPCPacketBase.strLen(ownerName) + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket01StopServer.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket01StopServer.java new file mode 100644 index 0000000..08494d6 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket01StopServer.java @@ -0,0 +1,32 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket01StopServer implements IPCPacketBase { + + public static final int ID = 0x01; + + public IPCPacket01StopServer() { + } + + @Override + public void deserialize(DataInput bin) throws IOException { + } + + @Override + public void serialize(DataOutput bin) throws IOException { + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 0; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket02InitWorld.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket02InitWorld.java new file mode 100644 index 0000000..d688ce6 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket02InitWorld.java @@ -0,0 +1,68 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket02InitWorld implements IPCPacketBase { + + public static final int ID = 0x02; + + public String worldName; + public byte gamemode; + public byte worldType; + public String worldArgs; + public long seed; + public boolean cheats; + public boolean structures; + public boolean bonusChest; + + public IPCPacket02InitWorld() { + } + + public IPCPacket02InitWorld(String worldName, int gamemode, int worldType, String worldArgs, long seed, boolean cheats, boolean structures, boolean bonusChest) { + this.worldName = worldName; + this.gamemode = (byte)gamemode; + this.worldType = (byte)worldType; + this.worldArgs = worldArgs; + this.seed = seed; + this.cheats = cheats; + this.structures = structures; + this.bonusChest = bonusChest; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + gamemode = bin.readByte(); + worldType = bin.readByte(); + worldArgs = bin.readUTF(); + seed = bin.readLong(); + cheats = bin.readBoolean(); + structures = bin.readBoolean(); + bonusChest = bin.readBoolean(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + bin.writeByte(gamemode); + bin.writeByte(worldType); + bin.writeUTF(worldArgs); + bin.writeLong(seed); + bin.writeBoolean(cheats); + bin.writeBoolean(structures); + bin.writeBoolean(bonusChest); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName) + 1 + 1 + IPCPacketBase.strLen(worldArgs) + 8 + 1 + 1 + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket03DeleteWorld.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket03DeleteWorld.java new file mode 100644 index 0000000..d3f2a0b --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket03DeleteWorld.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket03DeleteWorld implements IPCPacketBase { + + public static final int ID = 0x03; + + public String worldName; + + public IPCPacket03DeleteWorld() { + } + + public IPCPacket03DeleteWorld(String worldName) { + this.worldName = worldName; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName); + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket04RenameWorld.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket04RenameWorld.java new file mode 100644 index 0000000..751c075 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket04RenameWorld.java @@ -0,0 +1,52 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket04RenameWorld implements IPCPacketBase { + + public static final int ID = 0x04; + + public String worldOldName; + public String worldNewName; + public String displayName; + public boolean copy; + + public IPCPacket04RenameWorld() { + } + + public IPCPacket04RenameWorld(String worldOldName, String worldNewName, String displayName, boolean copy) { + this.worldOldName = worldOldName; + this.worldNewName = worldNewName; + this.displayName = displayName; + this.copy = copy; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldOldName = bin.readUTF(); + worldNewName = bin.readUTF(); + displayName = bin.readUTF(); + copy = bin.readBoolean(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldOldName); + bin.writeUTF(worldNewName); + bin.writeUTF(displayName); + bin.writeBoolean(copy); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldOldName) + IPCPacketBase.strLen(worldNewName) + IPCPacketBase.strLen(displayName) + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket05RequestData.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket05RequestData.java new file mode 100644 index 0000000..00355aa --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket05RequestData.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket05RequestData implements IPCPacketBase { + + public static final int ID = 0x05; + + public static final byte REQUEST_LEVEL_DAT = 0x00; + public static final byte REQUEST_LEVEL_EAG = 0x01; + public static final byte REQUEST_LEVEL_MCA = 0x02; + + public String worldName; + public byte request; + + public IPCPacket05RequestData() { + } + + public IPCPacket05RequestData(String worldName, byte request) { + this.worldName = worldName; + this.request = request; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + request = bin.readByte(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + bin.writeByte(request); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName) + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket06RenameWorldNBT.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket06RenameWorldNBT.java new file mode 100644 index 0000000..27fb9d1 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket06RenameWorldNBT.java @@ -0,0 +1,44 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket06RenameWorldNBT implements IPCPacketBase { + + public static final int ID = 0x06; + + public String worldName; + public String displayName; + + public IPCPacket06RenameWorldNBT() { + } + + public IPCPacket06RenameWorldNBT(String worldName, String displayName) { + this.worldName = worldName; + this.displayName = displayName; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + this.worldName = bin.readUTF(); + this.displayName = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + bin.writeUTF(displayName); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName) + IPCPacketBase.strLen(displayName); + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket07ImportWorld.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket07ImportWorld.java new file mode 100644 index 0000000..c702b3d --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket07ImportWorld.java @@ -0,0 +1,53 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket07ImportWorld implements IPCPacketBase { + + public static final int ID = 0x07; + + public String worldName; + public byte[] worldData; + public byte worldFormat; + + public static final byte WORLD_FORMAT_EAG = 0x00; + public static final byte WORLD_FORMAT_MCA = 0x01; + + public IPCPacket07ImportWorld() { + } + + public IPCPacket07ImportWorld(String worldName, byte[] worldData, byte worldFormat) { + this.worldName = worldName; + this.worldData = worldData; + this.worldFormat = worldFormat; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + worldData = new byte[bin.readInt()]; + worldFormat = bin.readByte(); + bin.readFully(worldData); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + bin.writeInt(worldData.length); + bin.writeByte(worldFormat); + bin.write(worldData); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName) + worldData.length + 5; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket09RequestResponse.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket09RequestResponse.java new file mode 100644 index 0000000..e8e47db --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket09RequestResponse.java @@ -0,0 +1,42 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket09RequestResponse implements IPCPacketBase { + + public static final int ID = 0x09; + + public byte[] response; + + public IPCPacket09RequestResponse() { + } + + public IPCPacket09RequestResponse(byte[] dat) { + this.response = dat; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + response = new byte[bin.readInt()]; + bin.readFully(response); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeInt(response.length); + bin.write(response); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 4 + response.length; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0ASetWorldDifficulty.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0ASetWorldDifficulty.java new file mode 100644 index 0000000..6a549fe --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0ASetWorldDifficulty.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0ASetWorldDifficulty implements IPCPacketBase { + + public static final int ID = 0x0A; + + public byte difficulty; + + public IPCPacket0ASetWorldDifficulty() { + } + + public IPCPacket0ASetWorldDifficulty(byte difficulty) { + this.difficulty = difficulty; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + difficulty = bin.readByte(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeByte(difficulty); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0BPause.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0BPause.java new file mode 100644 index 0000000..5bf0028 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0BPause.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0BPause implements IPCPacketBase { + + public static final int ID = 0x0B; + + public boolean pause; + + public IPCPacket0BPause() { + } + + public IPCPacket0BPause(boolean pause) { + this.pause = pause; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + pause = bin.readBoolean(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeBoolean(pause); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0CPlayerChannel.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0CPlayerChannel.java new file mode 100644 index 0000000..ad9d681 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0CPlayerChannel.java @@ -0,0 +1,44 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0CPlayerChannel implements IPCPacketBase { + + public static final int ID = 0x0C; + + public String channel; + public boolean open; + + public IPCPacket0CPlayerChannel() { + } + + public IPCPacket0CPlayerChannel(String channel, boolean open) { + this.channel = channel; + this.open = open; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + channel = bin.readUTF(); + open = bin.readBoolean(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(channel); + bin.writeBoolean(open); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(channel) + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0DProgressUpdate.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0DProgressUpdate.java new file mode 100644 index 0000000..98f30f7 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0DProgressUpdate.java @@ -0,0 +1,44 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0DProgressUpdate implements IPCPacketBase { + + public static final int ID = 0x0D; + + public String updateMessage; + public float updateProgress; + + public IPCPacket0DProgressUpdate() { + } + + public IPCPacket0DProgressUpdate(String updateMessage, float updateProgress) { + this.updateMessage = updateMessage == null ? "" : updateMessage; + this.updateProgress = updateProgress; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + updateMessage = bin.readUTF(); + updateProgress = bin.readFloat(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(updateMessage); + bin.writeFloat(updateProgress); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(updateMessage) + 4; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0EListWorlds.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0EListWorlds.java new file mode 100644 index 0000000..8a81c70 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0EListWorlds.java @@ -0,0 +1,32 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0EListWorlds implements IPCPacketBase { + + public static final int ID = 0x0E; + + public IPCPacket0EListWorlds() { + } + + @Override + public void deserialize(DataInput bin) throws IOException { + } + + @Override + public void serialize(DataOutput bin) throws IOException { + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 0; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0FListFiles.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0FListFiles.java new file mode 100644 index 0000000..fb00b24 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket0FListFiles.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket0FListFiles implements IPCPacketBase { + + public static final int ID = 0x0F; + + public String path; + + public IPCPacket0FListFiles() { + } + + public IPCPacket0FListFiles(String path) { + this.path = path; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + this.path = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(path); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(path); + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket10FileRead.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket10FileRead.java new file mode 100644 index 0000000..75d8f3b --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket10FileRead.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket10FileRead implements IPCPacketBase { + + public static final int ID = 0x10; + + public String file; + + public IPCPacket10FileRead() { + } + + public IPCPacket10FileRead(String file) { + this.file = file; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + file = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(file); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(file); + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket12FileWrite.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket12FileWrite.java new file mode 100644 index 0000000..3bc5f5c --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket12FileWrite.java @@ -0,0 +1,44 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket12FileWrite implements IPCPacketBase { + + public static final int ID = 0x12; + + public String path; + public byte[] data; + + public IPCPacket12FileWrite() { + } + + public IPCPacket12FileWrite(String path, byte[] data) { + this.path = path; + this.data = data; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + path = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(path); + bin.writeInt(data.length); + bin.write(data); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(path) + 4 + data.length; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket13FileCopyMove.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket13FileCopyMove.java new file mode 100644 index 0000000..c239968 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket13FileCopyMove.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket13FileCopyMove implements IPCPacketBase { + + public static final int ID = 0x13; + + public String fileOldName; + public String fileNewName; + public boolean copy; + + public IPCPacket13FileCopyMove() { + } + + public IPCPacket13FileCopyMove(String fileOldName, String fileNewName, boolean copy) { + this.fileOldName = fileOldName; + this.fileNewName = fileNewName; + this.copy = copy; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + fileOldName = bin.readUTF(); + fileNewName = bin.readUTF(); + copy = bin.readBoolean(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(fileOldName); + bin.writeUTF(fileNewName); + bin.writeBoolean(copy); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(fileOldName) + IPCPacketBase.strLen(fileNewName) + 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket14StringList.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket14StringList.java new file mode 100644 index 0000000..f8992fe --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket14StringList.java @@ -0,0 +1,80 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class IPCPacket14StringList implements IPCPacketBase { + + public static final int ID = 0x14; + + public static final int FILE_LIST = 0x0; + public static final int LOCALE = 0x1; + public static final int STAT_GUID = 0x2; + public static final int SERVER_TPS = 0x3; + + public int opCode; + public final List stringList; + + public IPCPacket14StringList() { + stringList = new ArrayList<>(); + } + + public IPCPacket14StringList(int opcode, String[] list) { + stringList = new ArrayList<>(); + for(String s : list) { + s = s.trim(); + if(s.length() > 0) { + stringList.add(s); + } + } + this.opCode = opcode; + } + + public IPCPacket14StringList(int opcode, List list) { + stringList = new ArrayList<>(); + for(String s : list) { + s = s.trim(); + if(s.length() > 0) { + stringList.add(s); + } + } + this.opCode = opcode; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + stringList.clear(); + opCode = bin.readByte(); + int len = bin.readInt(); + for(int i = 0; i < len; ++i) { + stringList.add(bin.readUTF()); + } + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeByte(opCode); + bin.writeInt(stringList.size()); + for(String str : stringList) { + bin.writeUTF(str); + } + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + int len = 5; + for(String str : stringList) { + len += IPCPacketBase.strLen(str); + } + return len; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java new file mode 100644 index 0000000..ff4dad3 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket15ThrowException.java @@ -0,0 +1,71 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IPCPacket15ThrowException implements IPCPacketBase { + + public static final int ID = 0x15; + + public String errorMessage; + public final List stackTrace; + + public IPCPacket15ThrowException() { + stackTrace = new ArrayList<>(); + } + + public IPCPacket15ThrowException(String errorMessage, String[] list) { + stackTrace = new ArrayList<>(Arrays.asList(list)); + this.errorMessage = errorMessage; + } + + public IPCPacket15ThrowException(String errorMessage, List list) { + stackTrace = list; + this.errorMessage = errorMessage; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + stackTrace.clear(); + errorMessage = bin.readUTF(); + int len = bin.readInt(); + for(int i = 0; i < len; ++i) { + stackTrace.add(bin.readUTF()); + } + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(errorMessage); + bin.writeInt(stackTrace.size()); + for(String str : stackTrace) { + bin.writeUTF(str); + } + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + int len = 4 + IPCPacketBase.strLen(errorMessage); + for(String str : stackTrace) { + len += IPCPacketBase.strLen(str); + } + return len; + } + + public void log() { + System.err.println("Integrated server exception: " + errorMessage); + for(String s : stackTrace) { + System.err.println(" at " + s); + } + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java new file mode 100644 index 0000000..b248479 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket16NBTList.java @@ -0,0 +1,95 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.src.CompressedStreamTools; +import net.minecraft.src.NBTTagCompound; + +public class IPCPacket16NBTList implements IPCPacketBase { + + public static final int ID = 0x16; + + public static final int WORLD_LIST = 0x0; + + public int opCode; + public final List tagList; + public final List nbtTagList; + + public IPCPacket16NBTList() { + tagList = new LinkedList<>(); + nbtTagList = new LinkedList<>(); + } + + public IPCPacket16NBTList(int opcode, NBTTagCompound[] list) { + this(opcode, Arrays.asList(list)); + } + + public IPCPacket16NBTList(int opcode, List list) { + tagList = new LinkedList<>(); + nbtTagList = list; + for(int i = 0, size = list.size(); i < size; ++i) { + NBTTagCompound tag = list.get(i); + try { + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + CompressedStreamTools.write(tag, new DataOutputStream(bao)); + tagList.add(bao.toByteArray()); + }catch(IOException e) { + System.err.println("Failed to write tag '" + tag.getName() + "' (#" + i + ") in IPCPacket16NBTList"); + } + } + opCode = opcode; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + tagList.clear(); + nbtTagList.clear(); + opCode = bin.readInt(); + int count = bin.readInt(); + for(int i = 0; i < count; ++i) { + byte[] toRead = new byte[bin.readInt()]; + bin.readFully(toRead); + tagList.add(toRead); + try { + nbtTagList.add(CompressedStreamTools.read(new DataInputStream(new ByteArrayInputStream(toRead)))); + }catch(IOException e) { + System.err.println("Failed to read tag #" + i + " in IPCPacket16NBTList"); + } + } + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeInt(opCode); + bin.writeInt(tagList.size()); + for(byte[] str : tagList) { + bin.writeInt(str.length); + bin.write(str); + } + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + int len = 8; + for(byte[] str : tagList) { + len += 4; + len += str.length; + } + return len; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java new file mode 100644 index 0000000..1d3f1bd --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket17ConfigureLAN.java @@ -0,0 +1,63 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class IPCPacket17ConfigureLAN implements IPCPacketBase { + + public static final int ID = 0x17; + + public int gamemode; + public boolean cheats; + public final List iceServers; + + public IPCPacket17ConfigureLAN() { + iceServers = new ArrayList<>(); + } + + public IPCPacket17ConfigureLAN(int gamemode, boolean cheats, List iceServers) { + this.gamemode = gamemode; + this.cheats = cheats; + this.iceServers = iceServers; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + gamemode = bin.readUnsignedByte(); + cheats = bin.readBoolean(); + iceServers.clear(); + int iceCount = bin.readUnsignedByte(); + for(int i = 0; i < iceCount; ++i) { + iceServers.add(bin.readUTF()); + } + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeByte(gamemode); + bin.writeBoolean(cheats); + bin.writeByte(iceServers.size()); + for(int i = 0, l = iceServers.size(); i < l; ++i) { + bin.writeUTF(iceServers.get(i)); + } + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + int s = 0; + for(int i = 0, l = iceServers.size(); i < l; ++i) { + s += 2; + s += iceServers.get(i).length(); + } + return 2 + 1 + s; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket18ClearPlayers.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket18ClearPlayers.java new file mode 100644 index 0000000..f6651c4 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacket18ClearPlayers.java @@ -0,0 +1,40 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacket18ClearPlayers implements IPCPacketBase { + + public static final int ID = 0x18; + + public String worldName = null; + + public IPCPacket18ClearPlayers(String worldName) { + this.worldName = worldName; + } + + public IPCPacket18ClearPlayers() { + } + + @Override + public void deserialize(DataInput bin) throws IOException { + worldName = bin.readUTF(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeUTF(worldName); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return IPCPacketBase.strLen(worldName); + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketBase.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketBase.java new file mode 100644 index 0000000..f85a0bb --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketBase.java @@ -0,0 +1,33 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public interface IPCPacketBase { + + public void deserialize(DataInput bin) throws IOException; + public void serialize(DataOutput bin) throws IOException; + public int id(); + public int size(); + + public static int strLen(String s) { + int strlen = s.length(); + int utflen = 2; + int c; + + for (int i = 0; i < strlen; ++i) { + c = s.charAt(i); + if ((c >= 0x0001) && (c <= 0x007F)) { + ++utflen; + } else if (c > 0x07FF) { + utflen += 3; + } else { + utflen += 2; + } + } + + return utflen; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketFFProcessKeepAlive.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketFFProcessKeepAlive.java new file mode 100644 index 0000000..c5d6197 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketFFProcessKeepAlive.java @@ -0,0 +1,43 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class IPCPacketFFProcessKeepAlive implements IPCPacketBase { + + public static final int ID = 0xFF; + + public static final int KEEPALIVE = 0; + public static final int FAILURE = 0xFE; + + public int ack; + + public IPCPacketFFProcessKeepAlive() { + } + + public IPCPacketFFProcessKeepAlive(int ack) { + this.ack = ack; + } + + @Override + public void deserialize(DataInput bin) throws IOException { + ack = bin.readUnsignedByte(); + } + + @Override + public void serialize(DataOutput bin) throws IOException { + bin.writeByte(ack); + } + + @Override + public int id() { + return ID; + } + + @Override + public int size() { + return 1; + } + +} diff --git a/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java new file mode 100644 index 0000000..5e8f3d2 --- /dev/null +++ b/src/main/java/net/lax1dude/eaglercraft/sp/ipc/IPCPacketManager.java @@ -0,0 +1,79 @@ +package net.lax1dude.eaglercraft.sp.ipc; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.function.Supplier; + +public class IPCPacketManager { + + public static final HashMap> mappings = new HashMap<>(); + + public static final IPCInputStream IPC_INPUT_STREAM = new IPCInputStream(); + public static final IPCOutputStream IPC_OUTPUT_STREAM = new IPCOutputStream(); + + public static final DataInputStream IPC_DATA_INPUT_STREAM = new DataInputStream(IPC_INPUT_STREAM); + public static final DataOutputStream IPC_DATA_OUTPUT_STREAM = new DataOutputStream(IPC_OUTPUT_STREAM); + + static { + mappings.put(IPCPacket00StartServer.ID, () -> new IPCPacket00StartServer()); + mappings.put(IPCPacket01StopServer.ID, () -> new IPCPacket01StopServer()); + mappings.put(IPCPacket02InitWorld.ID, () -> new IPCPacket02InitWorld()); + mappings.put(IPCPacket03DeleteWorld.ID, () -> new IPCPacket03DeleteWorld()); + mappings.put(IPCPacket04RenameWorld.ID, () -> new IPCPacket04RenameWorld()); + mappings.put(IPCPacket05RequestData.ID, () -> new IPCPacket05RequestData()); + mappings.put(IPCPacket06RenameWorldNBT.ID, () -> new IPCPacket06RenameWorldNBT()); + mappings.put(IPCPacket07ImportWorld.ID, () -> new IPCPacket07ImportWorld()); + mappings.put(IPCPacket09RequestResponse.ID, () -> new IPCPacket09RequestResponse()); + mappings.put(IPCPacket0ASetWorldDifficulty.ID, () -> new IPCPacket0ASetWorldDifficulty()); + mappings.put(IPCPacket0BPause.ID, () -> new IPCPacket0BPause()); + mappings.put(IPCPacket0CPlayerChannel.ID, () -> new IPCPacket0CPlayerChannel()); + mappings.put(IPCPacket0DProgressUpdate.ID, () -> new IPCPacket0DProgressUpdate()); + mappings.put(IPCPacket0EListWorlds.ID, () -> new IPCPacket0EListWorlds()); + mappings.put(IPCPacket0FListFiles.ID, () -> new IPCPacket0FListFiles()); + mappings.put(IPCPacket10FileRead.ID, () -> new IPCPacket10FileRead()); + mappings.put(IPCPacket12FileWrite.ID, () -> new IPCPacket12FileWrite()); + mappings.put(IPCPacket13FileCopyMove.ID, () -> new IPCPacket13FileCopyMove()); + mappings.put(IPCPacket14StringList.ID, () -> new IPCPacket14StringList()); + mappings.put(IPCPacket15ThrowException.ID, () -> new IPCPacket15ThrowException()); + mappings.put(IPCPacket16NBTList.ID, () -> new IPCPacket16NBTList()); + mappings.put(IPCPacket17ConfigureLAN.ID, () -> new IPCPacket17ConfigureLAN()); + mappings.put(IPCPacket18ClearPlayers.ID, () -> new IPCPacket18ClearPlayers()); + mappings.put(IPCPacketFFProcessKeepAlive.ID, () -> new IPCPacketFFProcessKeepAlive()); + } + + public static byte[] IPCSerialize(IPCPacketBase pkt) throws IOException { + + IPC_OUTPUT_STREAM.feedBuffer(new byte[pkt.size() + 1], pkt.getClass().getSimpleName()); + IPC_OUTPUT_STREAM.write(pkt.id()); + pkt.serialize(IPC_DATA_OUTPUT_STREAM); + + return IPC_OUTPUT_STREAM.returnBuffer(); + } + + public static IPCPacketBase IPCDeserialize(byte[] pkt) throws IOException { + + IPC_INPUT_STREAM.feedBuffer(pkt); + int i = IPC_INPUT_STREAM.read(); + + Supplier pk = mappings.get(Integer.valueOf(i)); + if(pk == null) { + throw new IOException("Packet type 0x" + Integer.toHexString(i) + " doesn't exist"); + } + + IPCPacketBase p = pk.get(); + + IPC_INPUT_STREAM.nameBuffer(p.getClass().getSimpleName()); + + p.deserialize(IPC_DATA_INPUT_STREAM); + + int lo = IPC_INPUT_STREAM.getLeftoverCount(); + if(lo > 0) { + System.err.println("Packet type 0x" + Integer.toHexString(i) + " class '" + p.getClass().getSimpleName() + "' was size " + (pkt.length - 1) + " but only " + (pkt.length - 1 - lo) + " bytes were read"); + } + + return p; + } + +} diff --git a/src/main/java/net/minecraft/src/GuiScreenDirectConnect.java b/src/main/java/net/minecraft/src/GuiScreenDirectConnect.java new file mode 100644 index 0000000..09be543 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiScreenDirectConnect.java @@ -0,0 +1,100 @@ +package net.minecraft.src; + +import net.lax1dude.eaglercraft.EaglerAdapter; + +public class GuiScreenDirectConnect extends GuiScreen { + /** Needed a change as a local variable was conflicting on construct */ + private final GuiScreen guiScreen; + + /** Instance of ServerData. */ + private final ServerData theServerData; + private GuiTextField serverTextField; + + public GuiScreenDirectConnect(GuiScreen par1GuiScreen, ServerData par2ServerData) { + this.guiScreen = par1GuiScreen; + this.theServerData = par2ServerData; + } + + /** + * Called from the main game loop to update the screen. + */ + public void updateScreen() { + this.serverTextField.updateCursorCounter(); + } + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + public void initGui() { + StringTranslate var1 = StringTranslate.getInstance(); + EaglerAdapter.enableRepeatEvents(true); + this.buttonList.clear(); + this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 12, var1.translateKey("selectServer.select"))); + this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 12, var1.translateKey("gui.cancel"))); + this.serverTextField = new GuiTextField(this.fontRenderer, this.width / 2 - 100, this.height / 4 + 27, 200, 20); + this.serverTextField.setMaxStringLength(128); + this.serverTextField.setFocused(true); + this.serverTextField.setText(this.mc.gameSettings.lastServer); + ((GuiButton) this.buttonList.get(0)).enabled = this.serverTextField.getText().length() > 0 && this.serverTextField.getText().split(":").length > 0; + } + + /** + * Called when the screen is unloaded. Used to disable keyboard repeat events + */ + public void onGuiClosed() { + EaglerAdapter.enableRepeatEvents(false); + this.mc.gameSettings.lastServer = this.serverTextField.getText(); + this.mc.gameSettings.saveOptions(); + } + + /** + * Fired when a control is clicked. This is the equivalent of + * ActionListener.actionPerformed(ActionEvent e). + */ + protected void actionPerformed(GuiButton par1GuiButton) { + if (par1GuiButton.enabled) { + if (par1GuiButton.id == 1) { + this.guiScreen.confirmClicked(false, 0); + } else if (par1GuiButton.id == 0) { + this.theServerData.serverIP = this.serverTextField.getText(); + this.guiScreen.confirmClicked(true, 0); + } + } + } + + /** + * Fired when a key is typed. This is the equivalent of + * KeyListener.keyTyped(KeyEvent e). + */ + protected void keyTyped(char par1, int par2) { + if (this.serverTextField.textboxKeyTyped(par1, par2)) { + ((GuiButton) this.buttonList.get(0)).enabled = this.serverTextField.getText().length() > 0 && this.serverTextField.getText().split(":").length > 0; + } else if (par2 == 28) { + this.actionPerformed((GuiButton) this.buttonList.get(0)); + } + } + + /** + * Called when the mouse is clicked. + */ + protected void mouseClicked(int par1, int par2, int par3) { + super.mouseClicked(par1, par2, par3); + this.serverTextField.mouseClicked(par1, par2, par3); + } + + /** + * Draws the screen and all the components in it. + */ + public void drawScreen(int par1, int par2, float par3) { + StringTranslate var4 = StringTranslate.getInstance(); + this.drawDefaultBackground(); + this.drawCenteredString(this.fontRenderer, var4.translateKey("selectServer.direct"), this.width / 2, this.height / 4 - 60 + 20, 16777215); + this.drawString(this.fontRenderer, var4.translateKey("addServer.enterIp"), this.width / 2 - 100, this.height / 4 + 12, 10526880); + if(EaglerAdapter.isSSLPage()) { + this.drawCenteredString(this.fontRenderer, var4.translateKey("addServer.SSLWarn1"), this.width / 2, this.height / 4 + 30 + 28, 0xccccff); + this.drawCenteredString(this.fontRenderer, var4.translateKey("addServer.SSLWarn2"), this.width / 2, this.height / 4 + 30 + 40, 0xccccff); + } + this.serverTextField.drawTextBox(); + super.drawScreen(par1, par2, par3); + } +} diff --git a/src/main/java/net/minecraft/src/GuiSlider2.java b/src/main/java/net/minecraft/src/GuiSlider2.java new file mode 100644 index 0000000..fb55d03 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiSlider2.java @@ -0,0 +1,87 @@ +package net.minecraft.src; + +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.minecraft.src.Minecraft; + +public class GuiSlider2 extends GuiButton { + /** The value of this slider control. */ + public float sliderValue = 1.0F; + public float sliderMax = 1.0F; + + /** Is this slider control being dragged. */ + public boolean dragging = false; + + public GuiSlider2(int par1, int par2, int par3, int par4, int par5, float par6, float par7) { + super(par1, par2, par3, par4, par5, (int)(par6 * par7 * 100.0F) + "%"); + this.sliderValue = par6; + this.sliderMax = par7; + } + + /** + * Returns 0 if the button is disabled, 1 if the mouse is NOT hovering over this + * button and 2 if it IS hovering over this button. + */ + protected int getHoverState(boolean par1) { + return 0; + } + + /** + * Fired when the mouse button is dragged. Equivalent of + * MouseListener.mouseDragged(MouseEvent e). + */ + protected void mouseDragged(Minecraft par1Minecraft, int par2, int par3) { + if (this.drawButton) { + if (this.dragging) { + this.sliderValue = (float) (par2 - (this.xPosition + 4)) / (float) (this.width - 8); + + if (this.sliderValue < 0.0F) { + this.sliderValue = 0.0F; + } + + if (this.sliderValue > 1.0F) { + this.sliderValue = 1.0F; + } + + this.displayString = (int)(this.sliderValue * this.sliderMax * 100.0F) + "%"; + } + + if(this.enabled) { + EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(this.xPosition + (int) (this.sliderValue * (float) (this.width - 8)), this.yPosition, 0, 66, 4, 20); + this.drawTexturedModalRect(this.xPosition + (int) (this.sliderValue * (float) (this.width - 8)) + 4, this.yPosition, 196, 66, 4, 20); + } + } + } + + /** + * Returns true if the mouse has been pressed on this control. Equivalent of + * MouseListener.mousePressed(MouseEvent e). + */ + public boolean mousePressed(Minecraft par1Minecraft, int par2, int par3) { + if (super.mousePressed(par1Minecraft, par2, par3)) { + this.sliderValue = (float) (par2 - (this.xPosition + 4)) / (float) (this.width - 8); + + if (this.sliderValue < 0.0F) { + this.sliderValue = 0.0F; + } + + if (this.sliderValue > 1.0F) { + this.sliderValue = 1.0F; + } + + this.displayString = (int)(this.sliderValue * this.sliderMax * 100.0F) + "%"; + this.dragging = true; + return true; + } else { + return false; + } + } + + /** + * Fired when the mouse button is released. Equivalent of + * MouseListener.mouseReleased(MouseEvent e). + */ + public void mouseReleased(int par1, int par2) { + this.dragging = false; + } +} diff --git a/src/main/java/net/minecraft/src/GuiSlot.java b/src/main/java/net/minecraft/src/GuiSlot.java index df2efe6..83d5976 100644 --- a/src/main/java/net/minecraft/src/GuiSlot.java +++ b/src/main/java/net/minecraft/src/GuiSlot.java @@ -2,10 +2,11 @@ package net.minecraft.src; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import net.lax1dude.eaglercraft.adapter.Tessellator; public abstract class GuiSlot { - private final Minecraft mc; + public final Minecraft mc; /** * The width of the GuiScreen. Affects the container rendering, but not the overlays. diff --git a/src/main/java/net/minecraft/src/GuiSlotStatsBlock.java b/src/main/java/net/minecraft/src/GuiSlotStatsBlock.java index 10c3cd3..a2fd863 100644 --- a/src/main/java/net/minecraft/src/GuiSlotStatsBlock.java +++ b/src/main/java/net/minecraft/src/GuiSlotStatsBlock.java @@ -2,6 +2,7 @@ package net.minecraft.src; import java.util.ArrayList; import java.util.Iterator; +import net.lax1dude.eaglercraft.adapter.Tessellator; class GuiSlotStatsBlock extends GuiSlotStats { diff --git a/src/main/java/net/minecraft/src/GuiSlotStatsGeneral.java b/src/main/java/net/minecraft/src/GuiSlotStatsGeneral.java index 12eef33..658c352 100644 --- a/src/main/java/net/minecraft/src/GuiSlotStatsGeneral.java +++ b/src/main/java/net/minecraft/src/GuiSlotStatsGeneral.java @@ -1,5 +1,7 @@ package net.minecraft.src; +import net.lax1dude.eaglercraft.adapter.Tessellator; + class GuiSlotStatsGeneral extends GuiSlot { final GuiStats statsGui; diff --git a/src/main/java/net/minecraft/src/GuiSnooper.java b/src/main/java/net/minecraft/src/GuiSnooper.java deleted file mode 100644 index 9b57280..0000000 --- a/src/main/java/net/minecraft/src/GuiSnooper.java +++ /dev/null @@ -1,131 +0,0 @@ -package net.minecraft.src; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.TreeMap; -import java.util.Map.Entry; - -public class GuiSnooper extends GuiScreen -{ - /** Instance of GuiScreen. */ - private final GuiScreen snooperGuiScreen; - - /** Instance of GameSettings. */ - private final GameSettings snooperGameSettings; - private final List field_74098_c = new ArrayList(); - private final List field_74096_d = new ArrayList(); - - /** The Snooper title. */ - private String snooperTitle; - private String[] field_74101_n; - private GuiSnooperList snooperList; - private GuiButton buttonAllowSnooping; - - public GuiSnooper(GuiScreen par1GuiScreen, GameSettings par2GameSettings) - { - this.snooperGuiScreen = par1GuiScreen; - this.snooperGameSettings = par2GameSettings; - } - - /** - * Adds the buttons (and other controls) to the screen in question. - */ - public void initGui() - { - this.snooperTitle = I18n.getString("options.snooper.title"); - String var1 = I18n.getString("options.snooper.desc"); - ArrayList var2 = new ArrayList(); - Iterator var3 = this.fontRenderer.listFormattedStringToWidth(var1, this.width - 30).iterator(); - - while (var3.hasNext()) - { - String var4 = (String)var3.next(); - var2.add(var4); - } - - this.field_74101_n = (String[])var2.toArray(new String[0]); - this.field_74098_c.clear(); - this.field_74096_d.clear(); - this.buttonList.add(this.buttonAllowSnooping = new GuiButton(1, this.width / 2 - 152, this.height - 30, 150, 20, this.snooperGameSettings.getKeyBinding(EnumOptions.SNOOPER_ENABLED))); - this.buttonList.add(new GuiButton(2, this.width / 2 + 2, this.height - 30, 150, 20, I18n.getString("gui.done"))); - boolean var6 = this.mc.getIntegratedServer() != null && this.mc.getIntegratedServer().getPlayerUsageSnooper() != null; - Iterator var7 = (new TreeMap(this.mc.getPlayerUsageSnooper().getCurrentStats())).entrySet().iterator(); - Entry var5; - - while (var7.hasNext()) - { - var5 = (Entry)var7.next(); - this.field_74098_c.add((var6 ? "C " : "") + (String)var5.getKey()); - this.field_74096_d.add(this.fontRenderer.trimStringToWidth((String)var5.getValue(), this.width - 220)); - } - - if (var6) - { - var7 = (new TreeMap(this.mc.getIntegratedServer().getPlayerUsageSnooper().getCurrentStats())).entrySet().iterator(); - - while (var7.hasNext()) - { - var5 = (Entry)var7.next(); - this.field_74098_c.add("S " + (String)var5.getKey()); - this.field_74096_d.add(this.fontRenderer.trimStringToWidth((String)var5.getValue(), this.width - 220)); - } - } - - this.snooperList = new GuiSnooperList(this); - } - - /** - * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). - */ - protected void actionPerformed(GuiButton par1GuiButton) - { - if (par1GuiButton.enabled) - { - if (par1GuiButton.id == 2) - { - this.snooperGameSettings.saveOptions(); - this.snooperGameSettings.saveOptions(); - this.mc.displayGuiScreen(this.snooperGuiScreen); - } - - if (par1GuiButton.id == 1) - { - this.snooperGameSettings.setOptionValue(EnumOptions.SNOOPER_ENABLED, 1); - this.buttonAllowSnooping.displayString = this.snooperGameSettings.getKeyBinding(EnumOptions.SNOOPER_ENABLED); - } - } - } - - /** - * Draws the screen and all the components in it. - */ - public void drawScreen(int par1, int par2, float par3) - { - this.drawDefaultBackground(); - this.snooperList.drawScreen(par1, par2, par3); - this.drawCenteredString(this.fontRenderer, this.snooperTitle, this.width / 2, 8, 16777215); - int var4 = 22; - String[] var5 = this.field_74101_n; - int var6 = var5.length; - - for (int var7 = 0; var7 < var6; ++var7) - { - String var8 = var5[var7]; - this.drawCenteredString(this.fontRenderer, var8, this.width / 2, var4, 8421504); - var4 += this.fontRenderer.FONT_HEIGHT; - } - - super.drawScreen(par1, par2, par3); - } - - static List func_74095_a(GuiSnooper par0GuiSnooper) - { - return par0GuiSnooper.field_74098_c; - } - - static List func_74094_b(GuiSnooper par0GuiSnooper) - { - return par0GuiSnooper.field_74096_d; - } -} diff --git a/src/main/java/net/minecraft/src/GuiSnooperList.java b/src/main/java/net/minecraft/src/GuiSnooperList.java deleted file mode 100644 index 1e56472..0000000 --- a/src/main/java/net/minecraft/src/GuiSnooperList.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.minecraft.src; - -class GuiSnooperList extends GuiSlot -{ - final GuiSnooper snooperGui; - - public GuiSnooperList(GuiSnooper par1GuiSnooper) - { - super(par1GuiSnooper.mc, par1GuiSnooper.width, par1GuiSnooper.height, 80, par1GuiSnooper.height - 40, par1GuiSnooper.fontRenderer.FONT_HEIGHT + 1); - this.snooperGui = par1GuiSnooper; - } - - /** - * Gets the size of the current slot list. - */ - protected int getSize() - { - return GuiSnooper.func_74095_a(this.snooperGui).size(); - } - - /** - * the element in the slot that was clicked, boolean for wether it was double clicked or not - */ - protected void elementClicked(int par1, boolean par2) {} - - /** - * returns true if the element passed in is currently selected - */ - protected boolean isSelected(int par1) - { - return false; - } - - protected void drawBackground() {} - - protected void drawSlot(int par1, int par2, int par3, int par4, Tessellator par5Tessellator) - { - this.snooperGui.fontRenderer.drawString((String)GuiSnooper.func_74095_a(this.snooperGui).get(par1), 10, par3, 16777215); - this.snooperGui.fontRenderer.drawString((String)GuiSnooper.func_74094_b(this.snooperGui).get(par1), 230, par3, 16777215); - } - - protected int getScrollBarX() - { - return this.snooperGui.width - 10; - } -} diff --git a/src/main/java/net/minecraft/src/GuiTexturePackSlot.java b/src/main/java/net/minecraft/src/GuiTexturePackSlot.java new file mode 100644 index 0000000..5294b71 --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiTexturePackSlot.java @@ -0,0 +1,79 @@ +package net.minecraft.src; + +import java.util.List; + +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.adapter.Tessellator; + +class GuiTexturePackSlot extends GuiSlot { + final GuiTexturePacks parentTexturePackGui; + + public GuiTexturePackSlot(GuiTexturePacks par1GuiTexturePacks) { + super(par1GuiTexturePacks.mc, par1GuiTexturePacks.width, par1GuiTexturePacks.height, 32, par1GuiTexturePacks.height - 55 + 4, 36); + this.parentTexturePackGui = par1GuiTexturePacks; + } + + /** + * Gets the size of the current slot list. + */ + protected int getSize() { + return this.mc.texturePackList.availableTexturePacks().size(); + } + + /** + * the element in the slot that was clicked, boolean for wether it was double + * clicked or not + */ + protected void elementClicked(int par1, boolean par2) { + if (par1 == 0 || !this.isSelected(par1)) { + this.parentTexturePackGui.confirmClicked(false, par1); + } else { + this.mc.displayGuiScreen(new GuiYesNo(this.parentTexturePackGui, StatCollector.translateToLocal("texturePack.wannaDelete"), ((ITexturePack) this.mc.texturePackList.availableTexturePacks().get(par1)).getTexturePackFileName(), par1)); + } + } + + /** + * returns true if the element passed in is currently selected + */ + protected boolean isSelected(int par1) { + List var2 = this.mc.texturePackList.availableTexturePacks(); + return this.mc.texturePackList.getSelectedTexturePack() == var2.get(par1); + } + + /** + * return the height of the content being scrolled + */ + protected int getContentHeight() { + return this.getSize() * 36; + } + + protected void drawBackground() { + this.parentTexturePackGui.drawDefaultBackground(); + } + + protected void drawSlot(int par1, int par2, int par3, int par4, Tessellator par5Tessellator) { + ITexturePack var6 = (ITexturePack) this.mc.texturePackList.availableTexturePacks().get(par1); + var6.bindThumbnailTexture(this.mc.renderEngine); + EaglerAdapter.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + par5Tessellator.startDrawingQuads(); + par5Tessellator.setColorOpaque_I(16777215); + par5Tessellator.addVertexWithUV((double) par2, (double) (par3 + par4), 0.0D, 0.0D, 1.0D); + par5Tessellator.addVertexWithUV((double) (par2 + 32), (double) (par3 + par4), 0.0D, 1.0D, 1.0D); + par5Tessellator.addVertexWithUV((double) (par2 + 32), (double) par3, 0.0D, 1.0D, 0.0D); + par5Tessellator.addVertexWithUV((double) par2, (double) par3, 0.0D, 0.0D, 0.0D); + par5Tessellator.draw(); + String var7 = var6.getTexturePackFileName(); + + if (!var6.isCompatible()) { + var7 = EnumChatFormatting.DARK_RED + StatCollector.translateToLocal("texturePack.incompatible") + " - " + var7; + } + + if (var7.length() > 32) { + var7 = var7.substring(0, 32).trim() + "..."; + } + + this.parentTexturePackGui.drawString(this.mc.fontRenderer, var7, par2 + 32 + 2, par3 + 1, 16777215); + this.parentTexturePackGui.drawString(this.mc.fontRenderer, var6.getFirstDescriptionLine(), par2 + 32 + 2, par3 + 12, 8421504); + this.parentTexturePackGui.drawString(this.mc.fontRenderer, var6.getSecondDescriptionLine(), par2 + 32 + 2, par3 + 12 + 10, 8421504); + } +} diff --git a/src/main/java/net/minecraft/src/GuiTexturePacks.java b/src/main/java/net/minecraft/src/GuiTexturePacks.java new file mode 100644 index 0000000..e483c1a --- /dev/null +++ b/src/main/java/net/minecraft/src/GuiTexturePacks.java @@ -0,0 +1,183 @@ +package net.minecraft.src; + +import net.lax1dude.eaglercraft.EPKDecompiler; +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.EaglerInputStream; +import net.lax1dude.eaglercraft.adapter.vfs.VFile; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class GuiTexturePacks extends GuiScreen { + protected GuiScreen guiScreen; + private int refreshTimer = -1; + + /** the absolute location of this texture pack */ + private String fileLocation = ""; + + private boolean isSelectingPack = false; + + /** + * the GuiTexturePackSlot that contains all the texture packs and their + * descriptions + */ + private GuiTexturePackSlot guiTexturePackSlot; + private GameSettings field_96146_n; + + protected static final VFile texturePackListFile = new VFile("__LIST__"); + + public GuiTexturePacks(GuiScreen par1, GameSettings par2) { + this.guiScreen = par1; + this.field_96146_n = par2; + } + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + public void initGui() { + StringTranslate var1 = StringTranslate.getInstance(); + this.buttonList.add(new GuiSmallButton(5, this.width / 2 - 154, this.height - 48, var1.translateKey("texturePack.openFolder"))); + this.buttonList.add(new GuiSmallButton(6, this.width / 2 + 4, this.height - 48, var1.translateKey("gui.done"))); + this.mc.texturePackList.updateAvaliableTexturePacks(); + this.fileLocation = "texturepacks"; + this.guiTexturePackSlot = new GuiTexturePackSlot(this); + this.guiTexturePackSlot.registerScrollButtons(this.buttonList, 7, 8); + } + + /** + * Fired when a control is clicked. This is the equivalent of + * ActionListener.actionPerformed(ActionEvent e). + */ + protected void actionPerformed(GuiButton par1GuiButton) { + if (par1GuiButton.enabled) { + if (par1GuiButton.id == 5) { + isSelectingPack = true; + EaglerAdapter.openFileChooser("epk,.zip", null); + } else if (par1GuiButton.id == 6) { + // this.mc.renderEngine.refreshTextures(); + this.mc.displayGuiScreen(guiScreen); + } else { + this.guiTexturePackSlot.actionPerformed(par1GuiButton); + } + } + } + + /** + * Called when the mouse is clicked. + */ + protected void mouseClicked(int par1, int par2, int par3) { + super.mouseClicked(par1, par2, par3); + } + + /** + * Called when the mouse is moved or a mouse button is released. Signature: + * (mouseX, mouseY, which) which==-1 is mouseMove, which==0 or which==1 is + * mouseUp + */ + protected void mouseMovedOrUp(int par1, int par2, int par3) { + super.mouseMovedOrUp(par1, par2, par3); + } + + /** + * Draws the screen and all the components in it. + */ + public void drawScreen(int par1, int par2, float par3) { + this.guiTexturePackSlot.drawScreen(par1, par2, par3); + + if (this.refreshTimer <= 0) { + this.mc.texturePackList.updateAvaliableTexturePacks(); + this.refreshTimer += 20; + } + + StringTranslate var4 = StringTranslate.getInstance(); + this.drawCenteredString(this.fontRenderer, var4.translateKey("texturePack.title"), this.width / 2, 16, 16777215); + this.drawCenteredString(this.fontRenderer, var4.translateKey("texturePack.folderInfo"), this.width / 2 - 77, this.height - 26, 8421504); + super.drawScreen(par1, par2, par3); + } + + /** + * Called from the main game loop to update the screen. + */ + public void updateScreen() { + super.updateScreen(); + --this.refreshTimer; + if (isSelectingPack && EaglerAdapter.getFileChooserResultAvailable()) { + isSelectingPack = false; + String name = EaglerAdapter.getFileChooserResultName(); + String safeName = name.replaceAll("[^A-Za-z0-9_]", "_"); + if (texturePackListFile.exists()) { + texturePackListFile.setAllChars(texturePackListFile.getAllChars() + "\n" + safeName); + } else { + texturePackListFile.setAllChars(safeName); + } + try { + if (name.toLowerCase().endsWith(".zip")) { + try(ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(EaglerAdapter.getFileChooserResult()))) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + if (entry.isDirectory()) continue; + new VFile(fileLocation, safeName, entry.getName()).setAllBytes(EaglerInputStream.inputStreamToBytesNoClose(zipInputStream)); + } + } + } else { + EPKDecompiler epkDecompiler = new EPKDecompiler(EaglerAdapter.getFileChooserResult()); + EPKDecompiler.FileEntry file; + while ((file = epkDecompiler.readFile()) != null) { + new VFile(fileLocation, safeName, file.name).setAllBytes(file.data); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + EaglerAdapter.clearFileChooserResult(); + this.mc.displayGuiScreen(this); + } + } + + @Override + public void confirmClicked(boolean par1, int par2) { + this.mc.displayGuiScreen(this); + + List var3 = this.mc.texturePackList.availableTexturePacks(); + + if (par1) { + this.mc.texturePackList.setTexturePack((ITexturePack) var3.get(0)); + this.mc.renderEngine.refreshTextures(); + this.mc.renderGlobal.loadRenderers(); + String safeName = ((ITexturePack) var3.get(par2)).getTexturePackFileName(); + new VFile(fileLocation, safeName).deleteAll(); + if (texturePackListFile.exists()) { + String res = texturePackListFile.getAllChars().replaceFirst(safeName, "").replace("\n\n", "\n"); + if (res.isEmpty()) { + texturePackListFile.delete(); + } else { + texturePackListFile.setAllChars(res); + } + } + } else { + try { + this.mc.texturePackList.setTexturePack((ITexturePack) var3.get(par2)); + this.mc.renderEngine.refreshTextures(); + this.mc.renderGlobal.loadRenderers(); + } catch (Exception var5) { + var5.printStackTrace(); + this.mc.texturePackList.setTexturePack((ITexturePack) var3.get(0)); + this.mc.renderEngine.refreshTextures(); + this.mc.renderGlobal.loadRenderers(); + String safeName = ((ITexturePack) var3.get(par2)).getTexturePackFileName(); + new VFile(fileLocation, safeName).deleteAll(); + if (texturePackListFile.exists()) { + String res = texturePackListFile.getAllChars().replaceFirst(safeName, "").replace("\n\n", "\n"); + if (res.isEmpty()) { + texturePackListFile.delete(); + } else { + texturePackListFile.setAllChars(res); + } + } + } + } + } +} diff --git a/src/main/java/net/minecraft/src/GuiWorldSlot.java b/src/main/java/net/minecraft/src/GuiWorldSlot.java index 38828cf..3f1217c 100644 --- a/src/main/java/net/minecraft/src/GuiWorldSlot.java +++ b/src/main/java/net/minecraft/src/GuiWorldSlot.java @@ -1,6 +1,7 @@ package net.minecraft.src; import java.util.Date; +import net.lax1dude.eaglercraft.adapter.Tessellator; class GuiWorldSlot extends GuiSlot { diff --git a/src/main/java/net/minecraft/src/ITexturePack.java b/src/main/java/net/minecraft/src/ITexturePack.java new file mode 100644 index 0000000..2d5920d --- /dev/null +++ b/src/main/java/net/minecraft/src/ITexturePack.java @@ -0,0 +1,48 @@ +package net.minecraft.src; + +import java.io.IOException; +import java.io.InputStream; + +public interface ITexturePack +{ + /** + * Delete the OpenGL texture id of the pack's thumbnail image, and close the zip file in case of TexturePackCustom. + */ + void deleteTexturePack(RenderEngine var1); + + /** + * Bind the texture id of the pack's thumbnail image, loading it if necessary. + */ + void bindThumbnailTexture(RenderEngine var1); + + InputStream func_98137_a(String var1, boolean var2) throws IOException; + + /** + * Gives a texture resource as InputStream. + */ + byte[] getResourceAsBytes(String var1); + + /** + * Get the texture pack ID + */ + String getTexturePackID(); + + /** + * Get the file name of the texture pack, or Default if not from a custom texture pack + */ + String getTexturePackFileName(); + + /** + * Get the first line of the texture pack description (read from the pack.txt file) + */ + String getFirstDescriptionLine(); + + /** + * Get the second line of the texture pack description (read from the pack.txt file) + */ + String getSecondDescriptionLine(); + + boolean func_98138_b(String var1, boolean var2); + + boolean isCompatible(); +} diff --git a/src/main/java/net/minecraft/src/Minecraft.java b/src/main/java/net/minecraft/src/Minecraft.java index c5b7f11..c919c24 100644 --- a/src/main/java/net/minecraft/src/Minecraft.java +++ b/src/main/java/net/minecraft/src/Minecraft.java @@ -7,10 +7,8 @@ import net.lax1dude.eaglercraft.GuiScreenEditProfile; import net.lax1dude.eaglercraft.GuiScreenSingleplayerConnecting; import net.lax1dude.eaglercraft.GuiScreenSingleplayerLoading; import net.lax1dude.eaglercraft.GuiScreenVSyncWarning; -import net.lax1dude.eaglercraft.GuiVoiceOverlay; import net.lax1dude.eaglercraft.IntegratedServer; import net.lax1dude.eaglercraft.IntegratedServerLAN; -import net.lax1dude.eaglercraft.Voice; import net.lax1dude.eaglercraft.WorkerNetworkManager; import net.lax1dude.eaglercraft.adapter.Tessellator; import net.lax1dude.eaglercraft.glemu.FixedFunctionShader; @@ -131,7 +129,6 @@ public class Minecraft implements IPlayerUsage public final File mcDataDir; private final File fileAssets; private final String launchedVersion; - private final Proxy proxy; private ISaveFormat saveLoader; /** @@ -168,7 +165,6 @@ public class Minecraft implements IPlayerUsage /** Join player counter */ private int joinPlayerCounter; - private final boolean isDemo; private INetworkManager myNetworkManager; private boolean integratedServerIsRunning; @@ -2368,11 +2364,6 @@ public class Minecraft implements IPlayerUsage return this.session; } - public Proxy getProxy() - { - return this.proxy; - } - public TextureManager getTextureManager() { return this.renderEngine; diff --git a/src/main/java/net/minecraft/src/Packet3Chat.java b/src/main/java/net/minecraft/src/Packet3Chat.java index 50abf80..237d1c5 100644 --- a/src/main/java/net/minecraft/src/Packet3Chat.java +++ b/src/main/java/net/minecraft/src/Packet3Chat.java @@ -6,6 +6,7 @@ import java.io.IOException; public class Packet3Chat extends Packet { + public static int maxChatLength = 119; /** The message being sent. */ public String message; private boolean isServer; diff --git a/src/main/java/net/minecraft/src/Rect2i.java b/src/main/java/net/minecraft/src/Rect2i.java new file mode 100644 index 0000000..b8598c0 --- /dev/null +++ b/src/main/java/net/minecraft/src/Rect2i.java @@ -0,0 +1,49 @@ +package net.minecraft.src; + + + +public class Rect2i { + private int rectX; + private int rectY; + private int rectWidth; + private int rectHeight; + + public Rect2i(int par1, int par2, int par3, int par4) { + this.rectX = par1; + this.rectY = par2; + this.rectWidth = par3; + this.rectHeight = par4; + } + + public Rect2i intersection(Rect2i par1Rect2i) { + int var2 = this.rectX; + int var3 = this.rectY; + int var4 = this.rectX + this.rectWidth; + int var5 = this.rectY + this.rectHeight; + int var6 = par1Rect2i.getRectX(); + int var7 = par1Rect2i.getRectY(); + int var8 = var6 + par1Rect2i.getRectWidth(); + int var9 = var7 + par1Rect2i.getRectHeight(); + this.rectX = Math.max(var2, var6); + this.rectY = Math.max(var3, var7); + this.rectWidth = Math.max(0, Math.min(var4, var8) - this.rectX); + this.rectHeight = Math.max(0, Math.min(var5, var9) - this.rectY); + return this; + } + + public int getRectX() { + return this.rectX; + } + + public int getRectY() { + return this.rectY; + } + + public int getRectWidth() { + return this.rectWidth; + } + + public int getRectHeight() { + return this.rectHeight; + } +} diff --git a/src/main/java/net/minecraft/src/RenderEngine.java b/src/main/java/net/minecraft/src/RenderEngine.java new file mode 100644 index 0000000..615f1fa --- /dev/null +++ b/src/main/java/net/minecraft/src/RenderEngine.java @@ -0,0 +1,359 @@ +package net.minecraft.src; + +import java.io.IOException; +import java.nio.IntBuffer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.EaglerImage; +import net.lax1dude.eaglercraft.TextureLocation; +import net.lax1dude.eaglercraft.TextureTerrainMap; +import net.minecraft.src.Minecraft; + +public class RenderEngine { + private HashMap textureMap = new HashMap(); + + /** Texture contents map (key: texture name, value: int[] contents) */ + private HashMap textureContentsMap = new HashMap(); + + /** A mapping from GL texture names (integers) to BufferedImage instances */ + private IntHashMap textureNameToImageMap = new IntHashMap(); + + /** Stores the image data for the texture. */ + private IntBuffer imageData; + + /** A mapping from image URLs to ThreadDownloadImageData instances */ + private Map urlToImageDataMap = new HashMap(); + + /** Reference to the GameSettings object */ + private GameSettings options; + + /** Texture pack */ + private TexturePackList texturePack; + + /** Missing texture image */ + private EaglerImage missingTextureImage; + private final TextureTerrainMap textureMapBlocks; + private final TextureMap textureMapItems; + private int boundTexture; + + public RenderEngine(TexturePackList par1TexturePackList, GameSettings par2GameSettings) { + this.imageData = GLAllocation.createDirectIntBuffer(16777216 >> 2); + this.texturePack = par1TexturePackList; + this.options = par2GameSettings; + int[] missingTex = new int[256]; + for(int i = 0; i < 256; ++i) { + missingTex[i] = ((i / 16 + (i % 16)) % 2 == 0) ? 0xffff00ff : 0xff000000; + } + this.missingTextureImage = new EaglerImage(missingTex, 16, 16, true); + this.textureMapBlocks = new TextureTerrainMap(1024, "terrain", "textures/blocks/", this.missingTextureImage); + this.textureMapItems = new TextureMap(1, "items", "textures/items/", this.missingTextureImage); + } + + public int[] getTextureContents(String par1Str) { + ITexturePack var2 = this.texturePack.getSelectedTexturePack(); + int[] var3 = (int[]) this.textureContentsMap.get(par1Str); + + if (var3 != null) { + return var3; + } else { + byte[] var7 = var2.getResourceAsBytes(par1Str); + int[] var4; + + if (var7 == null) { + var4 = this.missingTextureImage.data; + } else { + //var4 = EaglerImage.loadImage(var7).data; + var4 = EaglerAdapter.loadPNG(var7).data; + } + + this.textureContentsMap.put(par1Str, var4); + return var4; + } + } + + + public void bindTexture(String par1Str) { + this.bindTexture(this.getTexture(par1Str)); + } + + public void bindTexture(int par1) { + if (par1 != this.boundTexture) { + EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, par1); + this.boundTexture = par1; + } + } + + public void resetBoundTexture() { + this.boundTexture = -1; + } + + public int getTexture(String par1Str) { + if (par1Str.equals("/terrain.png")) { + return this.textureMapBlocks.texture; + } else if (par1Str.equals("/gui/items.png")) { + this.textureMapItems.getTexture().bindTexture(0); + return this.textureMapItems.getTexture().getGlTextureId(); + } else { + Integer var2 = (Integer) this.textureMap.get(par1Str); + + if (var2 != null) { + return var2.intValue(); + } else { + String var8 = par1Str; + + try { + int var3 = GLAllocation.generateTextureNames(); + boolean var9 = par1Str.startsWith("%blur%"); + + if (var9) { + par1Str = par1Str.substring(6); + } + + boolean var5 = par1Str.startsWith("%clamp%"); + + if (var5) { + par1Str = par1Str.substring(7); + } + + byte[] var6 = this.texturePack.getSelectedTexturePack().getResourceAsBytes(par1Str); + + if (var6 == null) { + this.setupTextureExt(this.missingTextureImage, var3, var9, var5); + } else { + this.setupTextureExt(EaglerImage.loadImage(var6), var3, var9, var5); + } + + this.textureMap.put(var8, Integer.valueOf(var3)); + return var3; + } catch (Exception var7) { + var7.printStackTrace(); + int var4 = GLAllocation.generateTextureNames(); + this.setupTexture(this.missingTextureImage, var4); + this.textureMap.put(par1Str, Integer.valueOf(var4)); + return var4; + } + } + } + } + + /** + * Copy the supplied image onto a newly-allocated OpenGL texture, returning the + * allocated texture name + */ + public int allocateAndSetupTexture(EaglerImage par1BufferedImage) { + int var2 = GLAllocation.generateTextureNames(); + this.setupTexture(par1BufferedImage, var2); + this.textureNameToImageMap.addKey(var2, par1BufferedImage); + return var2; + } + + /** + * Copy the supplied image onto the specified OpenGL texture + */ + public void setupTexture(EaglerImage par1BufferedImage, int par2) { + this.setupTextureExt(par1BufferedImage, par2, false, false); + } + + public int makeViewportTexture(int w, int h) { + int t = EaglerAdapter.glGenTextures(); + this.bindTexture(t); + this.imageData.position(0).limit(w * h); + EaglerAdapter.glTexImage2D_2(EaglerAdapter.GL_TEXTURE_2D, 0, EaglerAdapter.GL_RGBA, w, h, 0, EaglerAdapter.GL_BGRA, EaglerAdapter.GL_UNSIGNED_INT_8_8_8_8_REV, this.imageData); + return t; + } + + public void setupTextureExt(EaglerImage par1BufferedImage, int par2, boolean par3, boolean par4) { + this.bindTexture(par2); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MIN_FILTER, EaglerAdapter.GL_NEAREST); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAG_FILTER, EaglerAdapter.GL_NEAREST); + + if (par3) { + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MIN_FILTER, EaglerAdapter.GL_LINEAR); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAG_FILTER, EaglerAdapter.GL_LINEAR); + } + + if (par4) { + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_S, EaglerAdapter.GL_CLAMP); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_T, EaglerAdapter.GL_CLAMP); + } else { + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_S, EaglerAdapter.GL_REPEAT); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_T, EaglerAdapter.GL_REPEAT); + } + + int var5 = par1BufferedImage.w; + int var6 = par1BufferedImage.h; + int[] var7 = par1BufferedImage.data; + + if (this.options != null && this.options.anaglyph) { + var7 = this.colorToAnaglyph(var7); + } + + this.imageData.clear(); + this.imageData.put(var7); + this.imageData.position(0).limit(var7.length); + EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 0, EaglerAdapter.GL_RGBA, var5, var6, 0, EaglerAdapter.GL_BGRA, EaglerAdapter.GL_UNSIGNED_INT_8_8_8_8_REV, this.imageData); + } + + public int setupTextureRaw(byte[] data, int w, int h) { + int e = GLAllocation.generateTextureNames(); + this.bindTexture(e); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MIN_FILTER, EaglerAdapter.GL_NEAREST); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAG_FILTER, EaglerAdapter.GL_NEAREST); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_S, EaglerAdapter.GL_CLAMP); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_T, EaglerAdapter.GL_CLAMP); + this.imageData.clear(); + int[] upload = new int[data.length / 4]; + for(int i = 0; i < upload.length; ++i) { + upload[i] = ((data[i*4+3] & 255) << 24) | ((data[i*4+2] & 255) << 16) | ((data[i*4+1] & 255) << 8) | (data[i*4] & 255); + } + this.imageData.put(upload).flip(); + EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 0, EaglerAdapter.GL_RGBA, w, h, 0, EaglerAdapter.GL_BGRA, EaglerAdapter.GL_UNSIGNED_INT_8_8_8_8_REV, this.imageData); + return e; + } + + private int[] colorToAnaglyph(int[] par1ArrayOfInteger) { + int[] var2 = new int[par1ArrayOfInteger.length]; + + for (int var3 = 0; var3 < par1ArrayOfInteger.length; ++var3) { + int var4 = par1ArrayOfInteger[var3] >> 24 & 255; + int var5 = par1ArrayOfInteger[var3] >> 16 & 255; + int var6 = par1ArrayOfInteger[var3] >> 8 & 255; + int var7 = par1ArrayOfInteger[var3] & 255; + int var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100; + int var9 = (var5 * 30 + var6 * 70) / 100; + int var10 = (var5 * 30 + var7 * 70) / 100; + var2[var3] = var4 << 24 | var8 << 16 | var9 << 8 | var10; + } + + return var2; + } + + public void createTextureFromBytes(int[] par1ArrayOfInteger, int par2, int par3, int par4) { + this.bindTexture(par4); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MIN_FILTER, EaglerAdapter.GL_NEAREST); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAG_FILTER, EaglerAdapter.GL_NEAREST); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_S, EaglerAdapter.GL_REPEAT); + EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_WRAP_T, EaglerAdapter.GL_REPEAT); + + if (this.options != null && this.options.anaglyph) { + par1ArrayOfInteger = this.colorToAnaglyph(par1ArrayOfInteger); + } + + this.imageData.clear(); + this.imageData.put(par1ArrayOfInteger); + this.imageData.position(0).limit(par1ArrayOfInteger.length); + EaglerAdapter.glTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, 0, 0, 0, par2, par3, EaglerAdapter.GL_BGRA, EaglerAdapter.GL_UNSIGNED_INT_8_8_8_8_REV, this.imageData); + } + + /** + * Deletes a single GL texture + */ + public void deleteTexture(int par1) { + this.textureNameToImageMap.removeObject(par1); + EaglerAdapter.glDeleteTextures(par1); + } + + public void updateDynamicTextures() { + this.textureMapBlocks.updateAnimations(); + this.textureMapItems.updateAnimations(); + } + + /** + * Call setupTexture on all currently-loaded textures again to account for + * changes in rendering options + */ + public void refreshTextures() { + TextureLocation.freeTextures(); + ITexturePack var1 = this.texturePack.getSelectedTexturePack(); + this.refreshTextureMaps(); + Iterator var2 = this.textureNameToImageMap.getKeySet().iterator(); + EaglerImage var4; + + while (var2.hasNext()) { + int var3 = ((Integer) var2.next()).intValue(); + var4 = (EaglerImage) this.textureNameToImageMap.lookup(var3); + this.setupTexture(var4, var3); + } + + var2 = this.textureMap.keySet().iterator(); + String var11; + + while (var2.hasNext()) { + var11 = (String) var2.next(); + + try { + int var12 = ((Integer) this.textureMap.get(var11)).intValue(); + boolean var6 = var11.startsWith("%blur%"); + + if (var6) { + var11 = var11.substring(6); + } + + boolean var7 = var11.startsWith("%clamp%"); + + if (var7) { + var11 = var11.substring(7); + } + + //byte[] b = var1.getResourceAsBytes(var11); //what the fuck + //if(b != null) { + EaglerImage var5 = EaglerAdapter.loadPNG(var1.getResourceAsBytes(var11)); + if(var5 == null) { + throw new IOException("Could not load PNG"); + } + this.setupTextureExt(var5, var12, var6, var7); + //}else { + // System.err.println("could not reload: "+var11); + //} + } catch (IOException var9) { + var9.printStackTrace(); + } + } + + var2 = this.textureContentsMap.keySet().iterator(); + + while (var2.hasNext()) { + var11 = (String) var2.next(); + + try { + var4 = EaglerAdapter.loadPNG(var1.getResourceAsBytes(var11)); + if(var4 == null) { + throw new IOException("Could not load PNG"); + } + System.arraycopy(var4.data, 0, (int[]) this.textureContentsMap.get(var11), 0, var4.data.length); + } catch (IOException var8) { + var8.printStackTrace(); + } + } + + Minecraft.getMinecraft().fontRenderer.readFontData(); + Minecraft.getMinecraft().standardGalacticFontRenderer.readFontData(); + } + + /** + * Returns a BufferedImage read off the provided input stream. Args: inputStream + */ + private EaglerImage readTextureImage(byte[] par1InputStream) throws IOException { + return null;//EaglerImage.loadImage(par1InputStream); + //return EaglerAdapter.loadPNG(par1InputStream); + } + + public void refreshTextureMaps() { + this.textureMapBlocks.refreshTextures(); + this.textureMapItems.refreshTextures(); + } + + public Icon getMissingIcon(int par1) { + switch (par1) { + case 0: + return this.textureMapBlocks.getMissingIcon(); + + case 1: + default: + return this.textureMapItems.getMissingIcon(); + } + } +} diff --git a/src/main/java/net/minecraft/src/Texture.java b/src/main/java/net/minecraft/src/Texture.java new file mode 100644 index 0000000..03d761d --- /dev/null +++ b/src/main/java/net/minecraft/src/Texture.java @@ -0,0 +1,304 @@ +package net.minecraft.src; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.EaglerImage; + +public class Texture { + private int glTextureId; + private int textureId; + private int textureType; + + /** Width of this texture in pixels. */ + private final int width; + + /** Height of this texture in pixels. */ + private final int height; + private final int textureDepth; + private final int textureFormat; + private final int textureTarget; + private final int textureMinFilter; + private final int textureMagFilter; + private final int textureWrap; + private final boolean mipmapActive; + private final String textureName; + private Rect2i textureRect; + private boolean transferred; + + /** + * Uninitialized boolean. If true, the texture is re-uploaded every time it's + * modified. If false, every tick after it's been modified at least once in that + * tick. + */ + private boolean autoCreate; + + /** + * False if the texture has been modified since it was last uploaded to the GPU. + */ + private boolean textureNotModified; + private ByteBuffer textureData; + + private Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, int par9) { + this.textureName = par1Str; + this.textureType = par2; + this.width = par3; + this.height = par4; + this.textureDepth = par5; + this.textureFormat = par7; + this.textureMinFilter = par8; + this.textureMagFilter = par9; + this.textureWrap = par6; + this.textureRect = new Rect2i(0, 0, par3, par4); + this.textureTarget = EaglerAdapter.GL_TEXTURE_2D; + this.mipmapActive = false; //par8 != 9728 && par8 != 9729 || par9 != 9728 && par9 != 9729; + + if (par2 != 2) { + this.glTextureId = EaglerAdapter.glGenTextures(); + EaglerAdapter.glBindTexture(this.textureTarget, this.glTextureId); + EaglerAdapter.glTexParameteri(this.textureTarget, EaglerAdapter.GL_TEXTURE_MIN_FILTER, par8); + EaglerAdapter.glTexParameteri(this.textureTarget, EaglerAdapter.GL_TEXTURE_MAG_FILTER, par9); + EaglerAdapter.glTexParameteri(this.textureTarget, EaglerAdapter.GL_TEXTURE_WRAP_S, par6); + EaglerAdapter.glTexParameteri(this.textureTarget, EaglerAdapter.GL_TEXTURE_WRAP_T, par6); + } else { + this.glTextureId = -1; + } + + this.textureId = TextureManager.instance().getNextTextureId(); + } + + public Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, EaglerImage par9BufferedImage) { + this(par1Str, par2, par3, par4, 1, par5, par6, par7, par8, par9BufferedImage); + } + + public Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, int par9, EaglerImage par10BufferedImage) { + this(par1Str, par2, par3, par4, par5, par6, par7, par8, par9); + + if (par10BufferedImage == null) { + if (par3 != -1 && par4 != -1) { + byte[] var11 = new byte[par3 * par4 * par5 * 4]; + + for (int var12 = 0; var12 < var11.length; ++var12) { + var11[var12] = 0; + } + + this.textureData = GLAllocation.createDirectByteBuffer(var11.length); + this.textureData.clear(); + this.textureData.put(var11); + this.textureData.position(0).limit(var11.length); + + if (this.autoCreate) { + this.uploadTexture(); + } else { + this.textureNotModified = false; + } + } else { + this.transferred = false; + } + } else { + this.transferred = true; + this.transferFromImage(par10BufferedImage); + + if (par2 != 2) { + this.uploadTexture(); + this.autoCreate = false; + } + } + } + + public final Rect2i getTextureRect() { + return this.textureRect; + } + + public void fillRect(Rect2i par1Rect2i, int par2) { + if (this.textureTarget != 32879) { + Rect2i var3 = new Rect2i(0, 0, this.width, this.height); + var3.intersection(par1Rect2i); + this.textureData.position(0); + + for (int var4 = var3.getRectY(); var4 < var3.getRectY() + var3.getRectHeight(); ++var4) { + int var5 = var4 * this.width * 4; + + for (int var6 = var3.getRectX(); var6 < var3.getRectX() + var3.getRectWidth(); ++var6) { + this.textureData.put(var5 + var6 * 4 + 0, (byte) (par2 >> 24 & 255)); + this.textureData.put(var5 + var6 * 4 + 1, (byte) (par2 >> 16 & 255)); + this.textureData.put(var5 + var6 * 4 + 2, (byte) (par2 >> 8 & 255)); + this.textureData.put(var5 + var6 * 4 + 3, (byte) (par2 >> 0 & 255)); + } + } + + if (this.autoCreate) { + this.uploadTexture(); + } else { + this.textureNotModified = false; + } + } + } + + public void writeImage(String par1Str) { + /* + BufferedImage var2 = new BufferedImage(this.width, this.height, 2); + ByteBuffer var3 = this.getTextureData(); + byte[] var4 = new byte[this.width * this.height * 4]; + var3.position(0); + var3.get(var4); + + for (int var5 = 0; var5 < this.width; ++var5) { + for (int var6 = 0; var6 < this.height; ++var6) { + int var7 = var6 * this.width * 4 + var5 * 4; + byte var8 = 0; + int var10 = var8 | (var4[var7 + 2] & 255) << 0; + var10 |= (var4[var7 + 1] & 255) << 8; + var10 |= (var4[var7 + 0] & 255) << 16; + var10 |= (var4[var7 + 3] & 255) << 24; + var2.setRGB(var5, var6, var10); + } + } + + this.textureData.position(this.width * this.height * 4); + + try { + ImageIO.write(var2, "png", new File(Minecraft.getMinecraftDir(), par1Str)); + } catch (IOException var9) { + var9.printStackTrace(); + } + */ + } + + public void copyFrom(int par1, int par2, Texture par3Texture, boolean par4) { + if (this.textureTarget != 32879) { + EaglerAdapter.glBindTexture(this.textureTarget, this.glTextureId); + ByteBuffer var5 = par3Texture.getTextureData(); + this.textureData.position(0); + var5.position(0); + + for (int var6 = 0; var6 < par3Texture.getHeight(); ++var6) { + int var7 = par2 + var6; + int var8 = var6 * par3Texture.getWidth() * 4; + int var9 = var7 * this.width * 4; + + if (par4) { + var7 = par2 + (par3Texture.getHeight() - var6); + } + + for (int var10 = 0; var10 < par3Texture.getWidth(); ++var10) { + int var11 = var9 + (var10 + par1) * 4; + int var12 = var8 + var10 * 4; + + if (par4) { + var11 = par1 + var10 * this.width * 4 + var7 * 4; + } + + this.textureData.put(var11 + 0, var5.get(var12 + 0)); + this.textureData.put(var11 + 1, var5.get(var12 + 1)); + this.textureData.put(var11 + 2, var5.get(var12 + 2)); + this.textureData.put(var11 + 3, var5.get(var12 + 3)); + } + } + + this.textureData.position(this.width * this.height * 4); + + if (this.autoCreate) { + this.uploadTexture(); + } else { + this.textureNotModified = false; + } + } + } + + public void func_104062_b(int par1, int par2, Texture par3Texture) { + EaglerAdapter.glBindTexture(this.textureTarget, this.glTextureId); + EaglerAdapter.glTexSubImage2D(this.textureTarget, 0, par1, par2, par3Texture.getWidth(), par3Texture.getHeight(), 0, EaglerAdapter.GL_UNSIGNED_BYTE, (ByteBuffer) par3Texture.getTextureData().position(0)); + this.textureNotModified = true; + } + + public void transferFromImage(EaglerImage par1BufferedImage) { + //if (this.textureTarget != 32879) { + int var2 = par1BufferedImage.w; + int var3 = par1BufferedImage.h; + + if (var2 <= this.width && var3 <= this.height) { + int[] var4 = new int[] { 3, 0, 1, 2 }; + int[] var5 = new int[] { 3, 2, 1, 0 }; + int[] var6 = var5; + byte[] var9 = new byte[this.width * this.height * 4]; + + for (int var10 = 0; var10 < this.height; ++var10) { + for (int var11 = 0; var11 < this.width; ++var11) { + int var12 = var10 * this.width + var11; + int var13 = var12 * 4; + var9[var13 + var6[0]] = (byte) (par1BufferedImage.data[var12] >> 24 & 255); + var9[var13 + var6[1]] = (byte) (par1BufferedImage.data[var12] >> 16 & 255); + var9[var13 + var6[2]] = (byte) (par1BufferedImage.data[var12] >> 8 & 255); + var9[var13 + var6[3]] = (byte) (par1BufferedImage.data[var12] >> 0 & 255); + } + } + + this.textureData = GLAllocation.createDirectByteBuffer(var9.length).order(ByteOrder.nativeOrder()); + this.textureData.clear(); + this.textureData.put(var9); + this.textureData.limit(var9.length); + + if (this.autoCreate) { + this.uploadTexture(); + } else { + this.textureNotModified = false; + } + } else { + System.err.println("transferFromImage called with a BufferedImage with dimensions (" + var2 + ", " + var3 + ") larger than the Texture dimensions (" + this.width + ", " + this.height + "). Ignoring."); + } + //} + } + + public int getTextureId() { + return this.textureId; + } + + public int getGlTextureId() { + return this.glTextureId; + } + + public int getWidth() { + return this.width; + } + + public int getHeight() { + return this.height; + } + + public String getTextureName() { + return this.textureName; + } + + public void bindTexture(int par1) { + if (this.textureDepth == 1) { + EaglerAdapter.glEnable(EaglerAdapter.GL_TEXTURE_2D); + } else { + //EaglerAdapter.glEnable(EaglerAdapter.GL_TEXTURE_3D); + } + + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit + par1); + EaglerAdapter.glBindTexture(this.textureTarget, this.glTextureId); + + if (!this.textureNotModified) { + this.uploadTexture(); + } + } + + public void uploadTexture() { + this.textureData.flip(); + + if (this.height != 1 && this.textureDepth != 1) { + //EaglerAdapter.glTexImage3D(this.textureTarget, 0, this.textureFormat, this.width, this.height, this.textureDepth, 0, this.textureFormat, EaglerAdapter.GL_UNSIGNED_BYTE, this.textureData); + } else { + EaglerAdapter.glTexImage2D(this.textureTarget, 0, this.textureFormat, this.width, this.height, 0, this.textureFormat, EaglerAdapter.GL_UNSIGNED_BYTE, this.textureData); + } + + this.textureNotModified = true; + } + + public ByteBuffer getTextureData() { + return this.textureData; + } +} diff --git a/src/main/java/net/minecraft/src/TexturePackDefault.java b/src/main/java/net/minecraft/src/TexturePackDefault.java new file mode 100644 index 0000000..a867a2b --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturePackDefault.java @@ -0,0 +1,36 @@ +package net.minecraft.src; + +import java.io.IOException; +import java.io.InputStream; + +import net.lax1dude.eaglercraft.EaglerAdapter; + +public class TexturePackDefault extends TexturePackImplementation { + public TexturePackDefault() { + super("default", null, "Default", (ITexturePack) null); + } + + /** + * Load texture pack description from /pack.txt file in the texture pack + */ + protected void loadDescription() { + this.firstDescriptionLine = "The default look of Minecraft"; + } + + public boolean func_98140_c(String par1Str) { + return EaglerAdapter.loadResource(par1Str) != null; + } + + public boolean isCompatible() { + return true; + } + + protected InputStream func_98139_b(String par1Str) { + return EaglerAdapter.loadResource(par1Str); + } + + @Override + public byte[] getResourceAsBytes(String par1Str) { + return EaglerAdapter.loadResourceBytes(par1Str); + } +} diff --git a/src/main/java/net/minecraft/src/TexturePackFolder.java b/src/main/java/net/minecraft/src/TexturePackFolder.java new file mode 100644 index 0000000..e59c756 --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturePackFolder.java @@ -0,0 +1,31 @@ +package net.minecraft.src; + +import net.lax1dude.eaglercraft.adapter.vfs.VFile; + +import java.io.IOException; +import java.io.InputStream; + +public class TexturePackFolder extends TexturePackImplementation { + public TexturePackFolder(String par1, VFile par2, ITexturePack par3ITexturePack) { + super(par1, par2, par2.getName(), par3ITexturePack); + } + + protected InputStream func_98139_b(String par1Str) throws IOException { + VFile var2 = new VFile(this.texturePackFile, par1Str.substring(1)); + + if (!var2.exists()) { + throw new IOException(par1Str); + } else { + return var2.getInputStream(); + } + } + + public boolean func_98140_c(String par1Str) { + VFile var2 = new VFile(this.texturePackFile, par1Str); + return var2.exists(); + } + + public boolean isCompatible() { + return true; + } +} diff --git a/src/main/java/net/minecraft/src/TexturePackImplementation.java b/src/main/java/net/minecraft/src/TexturePackImplementation.java new file mode 100644 index 0000000..f3e896d --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturePackImplementation.java @@ -0,0 +1,261 @@ +package net.minecraft.src; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.EaglerImage; +import net.lax1dude.eaglercraft.EaglerInputStream; +import net.lax1dude.eaglercraft.adapter.vfs.VFile; + +public abstract class TexturePackImplementation implements ITexturePack +{ + /** + * Texture pack ID as returnd by generateTexturePackID(). Used only internally and not visible to the user. + */ + private final String texturePackID; + + /** + * The name of the texture pack's zip file/directory or "Default" for the builtin texture pack. Shown in the GUI. + */ + private final String texturePackFileName; + + /** + * File object for the texture pack's zip file in TexturePackCustom or the directory in TexturePackFolder. + */ + protected final VFile texturePackFile; + + /** + * First line of texture pack description (from /pack.txt) displayed in the GUI + */ + protected String firstDescriptionLine; + + /** + * Second line of texture pack description (from /pack.txt) displayed in the GUI + */ + protected String secondDescriptionLine; + private final ITexturePack field_98141_g; + + /** The texture pack's thumbnail image loaded from the /pack.png file. */ + protected EaglerImage thumbnailImage; + + /** The texture id for this pcak's thumbnail image. */ + private int thumbnailTextureName = -1; + + protected TexturePackImplementation(String par1, VFile par2File, String par3Str, ITexturePack par4ITexturePack) + { + this.texturePackID = par1; + this.texturePackFileName = par3Str; + this.texturePackFile = par2File; + this.field_98141_g = par4ITexturePack; + this.loadThumbnailImage(); + this.loadDescription(); + } + + /** + * Truncate strings to at most 34 characters. Truncates description lines + */ + private static String trimStringToGUIWidth(String par0Str) + { + if (par0Str != null && par0Str.length() > 34) + { + par0Str = par0Str.substring(0, 34); + } + + return par0Str; + } + + /** + * Load and initialize thumbnailImage from the the /pack.png file. + */ + private void loadThumbnailImage() + { + InputStream var1 = null; + + try + { + var1 = this.func_98137_a("/pack.png", false); + if (var1 != null) { + this.thumbnailImage = EaglerImage.loadImage(EaglerInputStream.inputStreamToBytes(var1)); + } + } + catch (IOException var11) + { + ; + } + finally + { + try + { + if (var1 != null) + { + var1.close(); + } + } + catch (IOException var10) + { + ; + } + } + } + + /** + * Load texture pack description from /pack.txt file in the texture pack + */ + protected void loadDescription() + { + InputStream var1 = null; + BufferedReader var2 = null; + + try + { + var1 = this.func_98139_b("/pack.txt"); + var2 = new BufferedReader(new InputStreamReader(var1)); + this.firstDescriptionLine = trimStringToGUIWidth(var2.readLine()); + this.secondDescriptionLine = trimStringToGUIWidth(var2.readLine()); + } + catch (IOException var12) + { + ; + } + finally + { + try + { + if (var2 != null) + { + var2.close(); + } + + if (var1 != null) + { + var1.close(); + } + } + catch (IOException var11) + { + ; + } + } + } + + public InputStream func_98137_a(String par1Str, boolean par2) throws IOException + { + try + { + return this.func_98139_b(par1Str); + } + catch (IOException var4) + { + if (this.field_98141_g != null && par2) + { + return this.field_98141_g.func_98137_a(par1Str, true); + } + else + { + throw var4; + } + } + } + + /** + * Gives a texture resource as InputStream. + */ + public byte[] getResourceAsBytes(String par1Str) + { + InputStream is = null; + byte[] res = null; + try { + is = this.func_98137_a(par1Str, true); + if (is == null) return null; + res = EaglerInputStream.inputStreamToBytes(is); + } catch (IOException e) { + return null; + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ignored) { + // + } + } + } + return res; + } + + protected abstract InputStream func_98139_b(String var1) throws IOException; + + /** + * Delete the OpenGL texture id of the pack's thumbnail image, and close the zip file in case of TexturePackCustom. + */ + public void deleteTexturePack(RenderEngine par1RenderEngine) + { + if (this.thumbnailImage != null && this.thumbnailTextureName != -1) + { + par1RenderEngine.deleteTexture(this.thumbnailTextureName); + } + } + + /** + * Bind the texture id of the pack's thumbnail image, loading it if necessary. + */ + public void bindThumbnailTexture(RenderEngine par1RenderEngine) + { + if (this.thumbnailImage != null) + { + if (this.thumbnailTextureName == -1) + { + this.thumbnailTextureName = par1RenderEngine.allocateAndSetupTexture(this.thumbnailImage); + } + + EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, this.thumbnailTextureName); + par1RenderEngine.resetBoundTexture(); + } + else + { + par1RenderEngine.bindTexture("/gui/unknown_pack.png"); + } + } + + public boolean func_98138_b(String par1Str, boolean par2) + { + boolean var3 = this.func_98140_c(par1Str); + return !var3 && par2 && this.field_98141_g != null ? this.field_98141_g.func_98138_b(par1Str, par2) : var3; + } + + public abstract boolean func_98140_c(String var1); + + /** + * Get the texture pack ID + */ + public String getTexturePackID() + { + return this.texturePackID; + } + + /** + * Get the file name of the texture pack, or Default if not from a custom texture pack + */ + public String getTexturePackFileName() + { + return this.texturePackFileName; + } + + /** + * Get the first line of the texture pack description (read from the pack.txt file) + */ + public String getFirstDescriptionLine() + { + return this.firstDescriptionLine; + } + + /** + * Get the second line of the texture pack description (read from the pack.txt file) + */ + public String getSecondDescriptionLine() + { + return this.secondDescriptionLine; + } +} diff --git a/src/main/java/net/minecraft/src/TexturePackList.java b/src/main/java/net/minecraft/src/TexturePackList.java new file mode 100644 index 0000000..57ba6c1 --- /dev/null +++ b/src/main/java/net/minecraft/src/TexturePackList.java @@ -0,0 +1,287 @@ +package net.minecraft.src; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import net.lax1dude.eaglercraft.EPKDecompiler; +import net.lax1dude.eaglercraft.EaglerAdapter; +import net.lax1dude.eaglercraft.EaglerInputStream; +import net.lax1dude.eaglercraft.adapter.vfs.VFile; +import net.minecraft.src.Minecraft; + +public class TexturePackList +{ + /** + * An instance of TexturePackDefault for the always available builtin texture pack. + */ + private static final ITexturePack defaultTexturePack = new TexturePackDefault(); + + /** The Minecraft instance. */ + private final Minecraft mc; + + /** The directory the texture packs will be loaded from. */ + private final VFile texturePackDir; + + /** Folder for the multi-player texturepacks. Returns File. */ + private final VFile mpTexturePackFolder; + + /** The list of the available texture packs. */ + private List availableTexturePacks = new ArrayList(); + + /** + * A mapping of texture IDs to TexturePackBase objects used by updateAvaliableTexturePacks() to avoid reloading + * texture packs that haven't changed on disk. + */ + private Map texturePackCache = new HashMap(); + + /** The TexturePack that will be used. */ + private ITexturePack selectedTexturePack; + + /** True if a texture pack is downloading in the background. */ + private boolean isDownloading; + + public TexturePackList(Minecraft par2Minecraft) + { + this.mc = par2Minecraft; + this.texturePackDir = new VFile("texturepacks"); + this.mpTexturePackFolder = new VFile("texturepacks-mp-cache"); + this.mpTexturePackFolder.deleteAll(); + this.updateAvaliableTexturePacks(); + } + + /** + * Sets the new TexturePack to be used, returning true if it has actually changed, false if nothing changed. + */ + public boolean setTexturePack(ITexturePack par1ITexturePack) + { + if (par1ITexturePack == this.selectedTexturePack) + { + return false; + } + else + { + this.isDownloading = false; + this.selectedTexturePack = par1ITexturePack; + this.mc.gameSettings.skin = par1ITexturePack.getTexturePackFileName(); + this.mc.gameSettings.saveOptions(); + return true; + } + } + + /** + * filename must end in .zip + */ + public void requestDownloadOfTexture(String par1Str) + { + String var2 = par1Str.substring(par1Str.lastIndexOf("/") + 1); + + if (var2.contains("?")) + { + var2 = var2.substring(0, var2.indexOf("?")); + } + + if (var2.toLowerCase().endsWith(".zip") || var2.toLowerCase().endsWith(".epk")) + { + VFile var3 = new VFile(this.mpTexturePackFolder, var2.replaceAll("[^A-Za-z0-9_]", "_")); + this.downloadTexture(par1Str, var3); + } + } + + private void downloadTexture(String par1Str, VFile par2File) + { + this.isDownloading = true; + try { + byte[] data = EaglerAdapter.downloadURL(par1Str); + if (data == null) throw new IOException("Unable to download texture pack!"); + if (par2File.getName().toLowerCase().endsWith(".epk")) { + EPKDecompiler epkDecompiler = new EPKDecompiler(data); + EPKDecompiler.FileEntry file; + while ((file = epkDecompiler.readFile()) != null) { + new VFile(par2File, file.name).setAllBytes(file.data); + } + } else { + try(ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(data))) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + if (entry.isDirectory()) continue; + new VFile(par2File, entry.getName()).setAllBytes(EaglerInputStream.inputStreamToBytesNoClose(zipInputStream)); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + if (this.isDownloading) { + setSelectedTexturePack(this, new TexturePackFolder(TexturePackList.generateTexturePackID(this, par2File), par2File, defaultTexturePack)); + this.mc.scheduleTexturePackRefresh(); + } + } + + /** + * Return true if a texture pack is downloading in the background. + */ + public boolean getIsDownloading() + { + return this.isDownloading; + } + + /** + * Called from Minecraft.loadWorld() if getIsDownloading() returned true to prepare the downloaded texture for + * usage. + */ + public void onDownloadFinished() + { + this.isDownloading = false; + this.updateAvaliableTexturePacks(); + this.mc.scheduleTexturePackRefresh(); + } + + /** + * check the texture packs the client has installed + */ + public void updateAvaliableTexturePacks() + { + ArrayList var1 = new ArrayList(); + this.selectedTexturePack = defaultTexturePack; + var1.add(defaultTexturePack); + Iterator var2 = this.getTexturePackDirContents().iterator(); + + while (var2.hasNext()) + { + VFile var3 = (VFile)var2.next(); + String var4 = this.generateTexturePackID(var3); + + if (var4 != null) + { + Object var5 = (ITexturePack)this.texturePackCache.get(var4); + + if (var5 == null) + { + var5 = new TexturePackFolder(var4, var3, defaultTexturePack); + this.texturePackCache.put(var4, var5); + } + + if (((ITexturePack)var5).getTexturePackFileName().equals(this.mc.gameSettings.skin)) + { + this.selectedTexturePack = (ITexturePack)var5; + } + + var1.add(var5); + } + } + + this.availableTexturePacks.removeAll(var1); + var2 = this.availableTexturePacks.iterator(); + + while (var2.hasNext()) + { + ITexturePack var6 = (ITexturePack)var2.next(); + var6.deleteTexturePack(this.mc.renderEngine); + this.texturePackCache.remove(var6.getTexturePackID()); + } + + this.availableTexturePacks = var1; + } + + /** + * Generate an internal texture pack ID from the file/directory name, last modification time, and file size. Returns + * null if the file/directory is not a texture pack. + */ + private String generateTexturePackID(VFile par1File) + { + return (new VFile(par1File, "pack.txt")).exists() ? par1File.getName() + ":folder" : null; + } + + /** + * Return a List of file/directories in the texture pack directory. + */ + private List getTexturePackDirContents() + { + if (!GuiTexturePacks.texturePackListFile.exists()) return Collections.emptyList(); + String[] lines = GuiTexturePacks.texturePackListFile.getAllLines(); + List files = new ArrayList<>(); + for (String line : lines) { + files.add(new VFile(this.texturePackDir, line)); + } + return files; + } + + /** + * Returns a list of the available texture packs. + */ + public List availableTexturePacks() + { + return Collections.unmodifiableList(this.availableTexturePacks); + } + + public ITexturePack getSelectedTexturePack() + { + return this.selectedTexturePack; + } + + public boolean func_77300_f() + { + if (!this.mc.gameSettings.serverTextures) + { + return false; + } + else + { + ServerData var1 = this.mc.getServerData(); + return var1 == null ? true : var1.func_78840_c(); + } + } + + public boolean getAcceptsTextures() + { + if (!this.mc.gameSettings.serverTextures) + { + return false; + } + else + { + ServerData var1 = this.mc.getServerData(); + return var1 == null ? false : var1.getAcceptsTextures(); + } + } + + static boolean isDownloading(TexturePackList par0TexturePackList) + { + return par0TexturePackList.isDownloading; + } + + /** + * Set the selectedTexturePack field (Inner class static accessor method). + */ + static ITexturePack setSelectedTexturePack(TexturePackList par0TexturePackList, ITexturePack par1ITexturePack) + { + return par0TexturePackList.selectedTexturePack = par1ITexturePack; + } + + /** + * Generate an internal texture pack ID from the file/directory name, last modification time, and file size. Returns + * null if the file/directory is not a texture pack. (Inner class static accessor method). + */ + static String generateTexturePackID(TexturePackList par0TexturePackList, VFile par1File) + { + return par0TexturePackList.generateTexturePackID(par1File); + } + + static ITexturePack func_98143_h() + { + return defaultTexturePack; + } + + static Minecraft getMinecraft(TexturePackList par0TexturePackList) + { + return par0TexturePackList.mc; + } +} diff --git a/src/main/java/net/minecraft/src/TextureStitched.java b/src/main/java/net/minecraft/src/TextureStitched.java new file mode 100644 index 0000000..3866291 --- /dev/null +++ b/src/main/java/net/minecraft/src/TextureStitched.java @@ -0,0 +1,213 @@ +package net.minecraft.src; + +import java.util.ArrayList; +import java.util.List; + +import net.lax1dude.eaglercraft.EaglerMisc; +import net.minecraft.client.Minecraft; + +public class TextureStitched implements Icon { + private final String textureName; + + /** texture sheet containing this texture */ + protected Texture textureSheet; + protected List textureList; + private List listAnimationTuples; + protected boolean rotated; + + /** x position of this icon on the texture sheet in pixels */ + protected int originX; + + /** y position of this icon on the texture sheet in pixels */ + protected int originY; + + /** width of this icon in pixels */ + private int width; + + /** height of this icon in pixels */ + private int height; + private float minU; + private float maxU; + private float minV; + private float maxV; + private float widthNorm; + private float heightNorm; + protected int frameCounter = 0; + protected int tickCounter = 0; + + public static TextureStitched makeTextureStitched(String par0Str) { + return (TextureStitched) ("clock".equals(par0Str) ? new TextureClock() : ("compass".equals(par0Str) ? new TextureCompass() : new TextureStitched(par0Str))); + } + + protected TextureStitched(String par1) { + this.textureName = par1; + } + + public void init(Texture par1Texture, List par2List, int par3, int par4, int par5, int par6, boolean par7) { + this.textureSheet = par1Texture; + this.textureList = par2List; + this.originX = par3; + this.originY = par4; + this.width = par5; + this.height = par6; + this.rotated = par7; + float var8 = 0.01F / (float) par1Texture.getWidth(); + float var9 = 0.01F / (float) par1Texture.getHeight(); + this.minU = (float) par3 / (float) par1Texture.getWidth() + var8; + this.maxU = (float) (par3 + par5) / (float) par1Texture.getWidth() - var8; + this.minV = (float) par4 / (float) par1Texture.getHeight() + var9; + this.maxV = (float) (par4 + par6) / (float) par1Texture.getHeight() - var9; + this.widthNorm = (float) par5 / 16.0F; + this.heightNorm = (float) par6 / 16.0F; + } + + public void copyFrom(TextureStitched par1TextureStitched) { + this.init(par1TextureStitched.textureSheet, par1TextureStitched.textureList, par1TextureStitched.originX, par1TextureStitched.originY, par1TextureStitched.width, par1TextureStitched.height, par1TextureStitched.rotated); + } + + /** + * Returns the X position of this icon on its texture sheet, in pixels. + */ + public int getOriginX() { + return this.originX; + } + + /** + * Returns the Y position of this icon on its texture sheet, in pixels. + */ + public int getOriginY() { + return this.originY; + } + + @Override + public int getIconWidth() { + return this.originX; + } + + @Override + public int getIconHeight() { + return this.originY; + } + + /** + * Returns the minimum U coordinate to use when rendering with this icon. + */ + public float getMinU() { + return this.minU; + } + + /** + * Returns the maximum U coordinate to use when rendering with this icon. + */ + public float getMaxU() { + return this.maxU; + } + + /** + * Gets a U coordinate on the icon. 0 returns uMin and 16 returns uMax. Other + * arguments return in-between values. + */ + public float getInterpolatedU(double par1) { + float var3 = this.maxU - this.minU; + return this.minU + var3 * ((float) par1 / 16.0F); + } + + /** + * Returns the minimum V coordinate to use when rendering with this icon. + */ + public float getMinV() { + return this.minV; + } + + /** + * Returns the maximum V coordinate to use when rendering with this icon. + */ + public float getMaxV() { + return this.maxV; + } + + /** + * Gets a V coordinate on the icon. 0 returns vMin and 16 returns vMax. Other + * arguments return in-between values. + */ + public float getInterpolatedV(double par1) { + float var3 = this.maxV - this.minV; + return this.minV + var3 * ((float) par1 / 16.0F); + } + + public String getIconName() { + return this.textureName; + } + + /** + * Returns the width of the texture sheet this icon is on, in pixels. + */ + public int getSheetWidth() { + return this.textureSheet.getWidth(); + } + + /** + * Returns the height of the texture sheet this icon is on, in pixels. + */ + public int getSheetHeight() { + return this.textureSheet.getHeight(); + } + + public void updateAnimation() { + if (this.listAnimationTuples != null) { + Tuple var1 = (Tuple) this.listAnimationTuples.get(this.frameCounter); + ++this.tickCounter; + + if (this.tickCounter >= ((Integer) var1.getSecond()).intValue()) { + int var2 = ((Integer) var1.getFirst()).intValue(); + this.frameCounter = (this.frameCounter + 1) % this.listAnimationTuples.size(); + this.tickCounter = 0; + var1 = (Tuple) this.listAnimationTuples.get(this.frameCounter); + int var3 = ((Integer) var1.getFirst()).intValue(); + + if (var2 != var3 && var3 >= 0 && var3 < this.textureList.size()) { + this.textureSheet.func_104062_b(this.originX, this.originY, (Texture) this.textureList.get(var3)); + } + } + } else { + int var4 = this.frameCounter; + this.frameCounter = (this.frameCounter + 1) % this.textureList.size(); + + if (var4 != this.frameCounter) { + this.textureSheet.func_104062_b(this.originX, this.originY, (Texture) this.textureList.get(this.frameCounter)); + } + } + } + + public void readAnimationInfo(String path) { + ArrayList var2 = new ArrayList(); + try { + String var3 = EaglerMisc.bytesToString(Minecraft.getMinecraft().texturePackList.getSelectedTexturePack().getResourceAsBytes(path)).trim(); + + if (var3.length() > 0) { + String[] var4 = var3.split(","); + String[] var5 = var4; + int var6 = var4.length; + + for (int var7 = 0; var7 < var6; ++var7) { + String var8 = var5[var7]; + int var9 = var8.indexOf(42); + + if (var9 > 0) { + Integer var10 = Integer.valueOf(var8.substring(0, var9)); + Integer var11 = Integer.valueOf(var8.substring(var9 + 1)); + var2.add(new Tuple(var10, var11)); + } else { + var2.add(new Tuple(Integer.valueOf(var8), Integer.valueOf(1))); + } + } + } + } catch (Exception var12) { + System.err.println("Failed to read animation info for " + this.textureName + ": " + var12.getMessage()); + } + + if (!var2.isEmpty() && var2.size() < 600) { + this.listAnimationTuples = var2; + } + } +}