From 383eacce1f72653aa6be5ad270e99382db781168 Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:08:47 -0500 Subject: [PATCH 1/7] update deps, buildscript --- dependencies.gradle | 6 +++--- gradle.properties | 21 +++++++++++++++++---- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- settings.gradle | 2 +- 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2a3efc1..d582a7f 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,12 +34,12 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { -// api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-673-GTNH:dev") +// api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-723-GTNH:dev") api("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") - compileOnly("com.github.GTNewHorizons:BloodMagic:1.7.48:dev") + compileOnly("com.github.GTNewHorizons:BloodMagic:1.8.5:dev") compileOnly(rfg.deobf("curse.maven:botania-225643:2249359")) compileOnly(rfg.deobf("curse.maven:customnpcs-221826:2495406")) - compileOnly("com.github.GTNewHorizons:ThaumicEnergistics:1.7.11-GTNH:dev") + compileOnly("com.github.GTNewHorizons:ThaumicEnergistics:1.7.14-GTNH:dev") runtimeOnly("com.azanor.baubles:Baubles:1.0.1.10:deobf") } diff --git a/gradle.properties b/gradle.properties index 2639a8d..9c98157 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ modId = blightbuster modGroup = talonos.blightbuster # Whether to use modGroup as the maven publishing group. -# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods. +# When false, com.github.GTNewHorizons is used. useModGroupForPublishing = false # Updates your build.gradle and settings.gradle automatically whenever an update is available. @@ -76,13 +76,20 @@ accessTransformersFile = # Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! usesMixins = true +# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main. +# This can speed up compile times thanks to not running the mixin annotation processor on all input sources. +# Mixin classes will have access to "main" classes, but not the other way around. +separateMixinSourceSet = + # Adds some debug arguments like verbose output and class export. usesMixinDebug = false # Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise. mixinPlugin = -# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail! +# Specify the package that contains all of your Mixins. The package must exist or +# the build will fail. If you have a package property defined in your mixins..json, +# it must match with this or the build will fail. mixinsPackage = mixins # Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin! @@ -108,9 +115,15 @@ minimizeShadowedDependencies = true # If disabled, won't rename the shadowed classes. relocateShadowedDependencies = true -# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. +# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. includeWellKnownRepositories = true +# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated +# list of strings, with the acceptable keys being(case does not matter): +# cursemaven +# modrinth +excludeWellKnownRepositories = + # Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven. # Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables. # If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle. @@ -131,7 +144,7 @@ modrinthProjectId = # type can be one of [project, version], # and the name is the Modrinth project or version slug/id of the other mod. # Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech -# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true +# Note: UniMixins is automatically set as a required dependency if usesMixins = true. modrinthRelations = # Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 zcmY(qRX`kF)3u#IAjsf0xCD212@LM;?(PINyAue(f;$XO2=4Cg1P$=#e%|lo zKk1`B>Q#GH)wNd-&cJofz}3=WfYndTeo)CyX{fOHsQjGa<{e=jamMNwjdatD={CN3>GNchOE9OGPIqr)3v>RcKWR3Z zF-guIMjE2UF0Wqk1)21791y#}ciBI*bAenY*BMW_)AeSuM5}vz_~`+1i!Lo?XAEq{TlK5-efNFgHr6o zD>^vB&%3ZGEWMS>`?tu!@66|uiDvS5`?bF=gIq3rkK(j<_TybyoaDHg8;Y#`;>tXI z=tXo~e9{U!*hqTe#nZjW4z0mP8A9UUv1}C#R*@yu9G3k;`Me0-BA2&Aw6f`{Ozan2 z8c8Cs#dA-7V)ZwcGKH}jW!Ja&VaUc@mu5a@CObzNot?b{f+~+212lwF;!QKI16FDS zodx>XN$sk9;t;)maB^s6sr^L32EbMV(uvW%or=|0@U6cUkE`_!<=LHLlRGJx@gQI=B(nn z-GEjDE}*8>3U$n(t^(b^C$qSTI;}6q&ypp?-2rGpqg7b}pyT zOARu2x>0HB{&D(d3sp`+}ka+Pca5glh|c=M)Ujn_$ly^X6&u z%Q4Y*LtB_>i6(YR!?{Os-(^J`(70lZ&Hp1I^?t@~SFL1!m0x6j|NM!-JTDk)%Q^R< z@e?23FD&9_W{Bgtr&CG&*Oer3Z(Bu2EbV3T9FeQ|-vo5pwzwQ%g&=zFS7b{n6T2ZQ z*!H(=z<{D9@c`KmHO&DbUIzpg`+r5207}4D=_P$ONIc5lsFgn)UB-oUE#{r+|uHc^hzv_df zV`n8&qry%jXQ33}Bjqcim~BY1?KZ}x453Oh7G@fA(}+m(f$)TY%7n=MeLi{jJ7LMB zt(mE*vFnep?YpkT_&WPV9*f>uSi#n#@STJmV&SLZnlLsWYI@y+Bs=gzcqche=&cBH2WL)dkR!a95*Ri)JH_4c*- zl4pPLl^as5_y&6RDE@@7342DNyF&GLJez#eMJjI}#pZN{Y8io{l*D+|f_Y&RQPia@ zNDL;SBERA|B#cjlNC@VU{2csOvB8$HzU$01Q?y)KEfos>W46VMh>P~oQC8k=26-Ku)@C|n^zDP!hO}Y z_tF}0@*Ds!JMt>?4y|l3?`v#5*oV-=vL7}zehMON^=s1%q+n=^^Z{^mTs7}*->#YL z)x-~SWE{e?YCarwU$=cS>VzmUh?Q&7?#Xrcce+jeZ|%0!l|H_=D_`77hBfd4Zqk&! zq-Dnt_?5*$Wsw8zGd@?woEtfYZ2|9L8b>TO6>oMh%`B7iBb)-aCefM~q|S2Cc0t9T zlu-ZXmM0wd$!gd-dTtik{bqyx32%f;`XUvbUWWJmpHfk8^PQIEsByJm+@+-aj4J#D z4#Br3pO6z1eIC>X^yKk|PeVwX_4B+IYJyJyc3B`4 zPrM#raacGIzVOexcVB;fcsxS=s1e&V;Xe$tw&KQ`YaCkHTKe*Al#velxV{3wxx}`7@isG zp6{+s)CG%HF#JBAQ_jM%zCX5X;J%-*%&jVI?6KpYyzGbq7qf;&hFprh?E5Wyo=bZ) z8YNycvMNGp1836!-?nihm6jI`^C`EeGryoNZO1AFTQhzFJOA%Q{X(sMYlzABt!&f{ zoDENSuoJQIg5Q#@BUsNJX2h>jkdx4<+ipUymWKFr;w+s>$laIIkfP6nU}r+?J9bZg zUIxz>RX$kX=C4m(zh-Eg$BsJ4OL&_J38PbHW&7JmR27%efAkqqdvf)Am)VF$+U3WR z-E#I9H6^)zHLKCs7|Zs<7Bo9VCS3@CDQ;{UTczoEprCKL3ZZW!ffmZFkcWU-V|_M2 zUA9~8tE9<5`59W-UgUmDFp11YlORl3mS3*2#ZHjv{*-1#uMV_oVTy{PY(}AqZv#wF zJVks)%N6LaHF$$<6p8S8Lqn+5&t}DmLKiC~lE{jPZ39oj{wR&fe*LX-z0m}9ZnZ{U z>3-5Bh{KKN^n5i!M79Aw5eY=`6fG#aW1_ZG;fw7JM69qk^*(rmO{|Z6rXy?l=K=#_ zE-zd*P|(sskasO(cZ5L~_{Mz&Y@@@Q)5_8l<6vB$@226O+pDvkFaK8b>%2 zfMtgJ@+cN@w>3)(_uR;s8$sGONbYvoEZ3-)zZk4!`tNzd<0lwt{RAgplo*f@Z)uO` zzd`ljSqKfHJOLxya4_}T`k5Ok1Mpo#MSqf~&ia3uIy{zyuaF}pV6 z)@$ZG5LYh8Gge*LqM_|GiT1*J*uKes=Oku_gMj&;FS`*sfpM+ygN&yOla-^WtIU#$ zuw(_-?DS?6DY7IbON7J)p^IM?N>7x^3)(7wR4PZJu(teex%l>zKAUSNL@~{czc}bR z)I{XzXqZBU3a;7UQ~PvAx8g-3q-9AEd}1JrlfS8NdPc+!=HJ6Bs( zCG!0;e0z-22(Uzw>hkEmC&xj?{0p|kc zM}MMXCF%RLLa#5jG`+}{pDL3M&|%3BlwOi?dq!)KUdv5__zR>u^o|QkYiqr(m3HxF z6J*DyN#Jpooc$ok=b7{UAVM@nwGsr6kozSddwulf5g1{B=0#2)zv!zLXQup^BZ4sv*sEsn)+MA?t zEL)}3*R?4(J~CpeSJPM!oZ~8;8s_=@6o`IA%{aEA9!GELRvOuncE`s7sH91 zmF=+T!Q6%){?lJn3`5}oW31(^Of|$r%`~gT{eimT7R~*Mg@x+tWM3KE>=Q>nkMG$U za7r>Yz2LEaA|PsMafvJ(Y>Xzha?=>#B!sYfVob4k5Orb$INFdL@U0(J8Hj&kgWUlO zPm+R07E+oq^4f4#HvEPANGWLL_!uF{nkHYE&BCH%l1FL_r(Nj@M)*VOD5S42Gk-yT z^23oAMvpA57H(fkDGMx86Z}rtQhR^L!T2iS!788E z+^${W1V}J_NwdwdxpXAW8}#6o1(Uu|vhJvubFvQIH1bDl4J4iDJ+181KuDuHwvM?` z%1@Tnq+7>p{O&p=@QT}4wT;HCb@i)&7int<0#bj8j0sfN3s6|a(l7Bj#7$hxX@~iP z1HF8RFH}irky&eCN4T94VyKqGywEGY{Gt0Xl-`|dOU&{Q;Ao;sL>C6N zXx1y^RZSaL-pG|JN;j9ADjo^XR}gce#seM4QB1?S`L*aB&QlbBIRegMnTkTCks7JU z<0(b+^Q?HN1&$M1l&I@>HMS;!&bb()a}hhJzsmB?I`poqTrSoO>m_JE5U4=?o;OV6 zBZjt;*%1P>%2{UL=;a4(aI>PRk|mr&F^=v6Fr&xMj8fRCXE5Z2qdre&;$_RNid5!S zm^XiLK25G6_j4dWkFqjtU7#s;b8h?BYFxV?OE?c~&ME`n`$ix_`mb^AWr+{M9{^^Rl;~KREplwy2q;&xe zUR0SjHzKVYzuqQ84w$NKVPGVHL_4I)Uw<$uL2-Ml#+5r2X{LLqc*p13{;w#E*Kwb*1D|v?e;(<>vl@VjnFB^^Y;;b3 z=R@(uRj6D}-h6CCOxAdqn~_SG=bN%^9(Ac?zfRkO5x2VM0+@_qk?MDXvf=@q_* z3IM@)er6-OXyE1Z4sU3{8$Y$>8NcnU-nkyWD&2ZaqX1JF_JYL8y}>@V8A5%lX#U3E zet5PJM`z79q9u5v(OE~{by|Jzlw2<0h`hKpOefhw=fgLTY9M8h+?37k@TWpzAb2Fc zQMf^aVf!yXlK?@5d-re}!fuAWu0t57ZKSSacwRGJ$0uC}ZgxCTw>cjRk*xCt%w&hh zoeiIgdz__&u~8s|_TZsGvJ7sjvBW<(C@}Y%#l_ID2&C`0;Eg2Z+pk;IK}4T@W6X5H z`s?ayU-iF+aNr5--T-^~K~p;}D(*GWOAYDV9JEw!w8ZYzS3;W6*_`#aZw&9J ziXhBKU3~zd$kKzCAP-=t&cFDeQR*_e*(excIUxKuD@;-twSlP6>wWQU)$|H3Cy+`= z-#7OW!ZlYzZxkdQpfqVDFU3V2B_-eJS)Fi{fLtRz!K{~7TR~XilNCu=Z;{GIf9KYz zf3h=Jo+1#_s>z$lc~e)l93h&RqW1VHYN;Yjwg#Qi0yzjN^M4cuL>Ew`_-_wRhi*!f zLK6vTpgo^Bz?8AsU%#n}^EGigkG3FXen3M;hm#C38P@Zs4{!QZPAU=m7ZV&xKI_HWNt90Ef zxClm)ZY?S|n**2cNYy-xBlLAVZ=~+!|7y`(fh+M$#4zl&T^gV8ZaG(RBD!`3?9xcK zp2+aD(T%QIgrLx5au&TjG1AazI;`8m{K7^!@m>uGCSR;Ut{&?t%3AsF{>0Cm(Kf)2 z?4?|J+!BUg*P~C{?mwPQ#)gDMmro20YVNsVx5oWQMkzQ? zsQ%Y>%7_wkJqnSMuZjB9lBM(o zWut|B7w48cn}4buUBbdPBW_J@H7g=szrKEpb|aE>!4rLm+sO9K%iI75y~2HkUo^iw zJ3se$8$|W>3}?JU@3h@M^HEFNmvCp|+$-0M?RQ8SMoZ@38%!tz8f8-Ptb@106heiJ z^Bx!`0=Im z1!NUhO=9ICM*+||b3a7w*Y#5*Q}K^ar+oMMtekF0JnO>hzHqZKH0&PZ^^M(j;vwf_ z@^|VMBpcw8;4E-9J{(u7sHSyZpQbS&N{VQ%ZCh{c1UA5;?R} z+52*X_tkDQ(s~#-6`z4|Y}3N#a&dgP4S_^tsV=oZr4A1 zaSoPN1czE(UIBrC_r$0HM?RyBGe#lTBL4~JW#A`P^#0wuK)C-2$B6TvMi@@%K@JAT_IB^T7Zfqc8?{wHcSVG_?{(wUG%zhCm=%qP~EqeqKI$9UivF zv+5IUOs|%@ypo6b+i=xsZ=^G1yeWe)z6IX-EC`F=(|_GCNbHbNp(CZ*lpSu5n`FRA zhnrc4w+Vh?r>her@Ba_jv0Omp#-H7avZb=j_A~B%V0&FNi#!S8cwn0(Gg-Gi_LMI{ zCg=g@m{W@u?GQ|yp^yENd;M=W2s-k7Gw2Z(tsD5fTGF{iZ%Ccgjy6O!AB4x z%&=6jB7^}pyftW2YQpOY1w@%wZy%}-l0qJlOSKZXnN2wo3|hujU+-U~blRF!^;Tan z0w;Srh0|Q~6*tXf!5-rCD)OYE(%S|^WTpa1KHtpHZ{!;KdcM^#g8Z^+LkbiBHt85m z;2xv#83lWB(kplfgqv@ZNDcHizwi4-8+WHA$U-HBNqsZ`hKcUI3zV3d1ngJP-AMRET*A{> zb2A>Fk|L|WYV;Eu4>{a6ESi2r3aZL7x}eRc?cf|~bP)6b7%BnsR{Sa>K^0obn?yiJ zCVvaZ&;d_6WEk${F1SN0{_`(#TuOOH1as&#&xN~+JDzX(D-WU_nLEI}T_VaeLA=bc zl_UZS$nu#C1yH}YV>N2^9^zye{rDrn(rS99>Fh&jtNY7PP15q%g=RGnxACdCov47= zwf^9zfJaL{y`R#~tvVL#*<`=`Qe zj_@Me$6sIK=LMFbBrJps7vdaf_HeX?eC+P^{AgSvbEn?n<}NDWiQGQG4^ZOc|GskK z$Ve2_n8gQ-KZ=s(f`_X!+vM5)4+QmOP()2Fe#IL2toZBf+)8gTVgDSTN1CkP<}!j7 z0SEl>PBg{MnPHkj4wj$mZ?m5x!1ePVEYI(L_sb0OZ*=M%yQb?L{UL(2_*CTVbRxBe z@{)COwTK1}!*CK0Vi4~AB;HF(MmQf|dsoy(eiQ>WTKcEQlnKOri5xYsqi61Y=I4kzAjn5~{IWrz_l))|Ls zvq7xgQs?Xx@`N?f7+3XKLyD~6DRJw*uj*j?yvT3}a;(j_?YOe%hUFcPGWRVBXzpMJ zM43g6DLFqS9tcTLSg=^&N-y0dXL816v&-nqC0iXdg7kV|PY+js`F8dm z2PuHw&k+8*&9SPQ6f!^5q0&AH(i+z3I7a?8O+S5`g)>}fG|BM&ZnmL;rk)|u{1!aZ zEZHpAMmK_v$GbrrWNP|^2^s*!0waLW=-h5PZa-4jWYUt(Hr@EA(m3Mc3^uDxwt-me^55FMA9^>hpp26MhqjLg#^Y7OIJ5%ZLdNx&uDgIIqc zZRZl|n6TyV)0^DDyVtw*jlWkDY&Gw4q;k!UwqSL6&sW$B*5Rc?&)dt29bDB*b6IBY z6SY6Unsf6AOQdEf=P1inu6(6hVZ0~v-<>;LAlcQ2u?wRWj5VczBT$Op#8IhppP-1t zfz5H59Aa~yh7EN;BXJsLyjkjqARS5iIhDVPj<=4AJb}m6M@n{xYj3qsR*Q8;hVxDyC4vLI;;?^eENOb5QARj#nII5l$MtBCI@5u~(ylFi$ zw6-+$$XQ}Ca>FWT>q{k)g{Ml(Yv=6aDfe?m|5|kbGtWS}fKWI+})F6`x@||0oJ^(g|+xi zqlPdy5;`g*i*C=Q(aGeDw!eQg&w>UUj^{o?PrlFI=34qAU2u@BgwrBiaM8zoDTFJ< zh7nWpv>dr?q;4ZA?}V}|7qWz4W?6#S&m>hs4IwvCBe@-C>+oohsQZ^JC*RfDRm!?y zS4$7oxcI|##ga*y5hV>J4a%HHl^t$pjY%caL%-FlRb<$A$E!ws?8hf0@(4HdgQ!@> zds{&g$ocr9W4I84TMa9-(&^_B*&R%^=@?Ntxi|Ejnh;z=!|uVj&3fiTngDPg=0=P2 zB)3#%HetD84ayj??qrxsd9nqrBem(8^_u_UY{1@R_vK-0H9N7lBX5K(^O2=0#TtUUGSz{ z%g>qU8#a$DyZ~EMa|8*@`GOhCW3%DN%xuS91T7~iXRr)SG`%=Lfu%U~Z_`1b=lSi?qpD4$vLh$?HU6t0MydaowUpb zQr{>_${AMesCEffZo`}K0^~x>RY_ZIG{(r39MP>@=aiM@C;K)jUcfQV8#?SDvq>9D zI{XeKM%$$XP5`7p3K0T}x;qn)VMo>2t}Ib(6zui;k}<<~KibAb%p)**e>ln<=qyWU zrRDy|UXFi9y~PdEFIAXejLA{K)6<)Q`?;Q5!KsuEw({!#Rl8*5_F{TP?u|5(Hijv( ztAA^I5+$A*+*e0V0R~fc{ET-RAS3suZ}TRk3r)xqj~g_hxB`qIK5z(5wxYboz%46G zq{izIz^5xW1Vq#%lhXaZL&)FJWp0VZNO%2&ADd?+J%K$fM#T_Eke1{dQsx48dUPUY zLS+DWMJeUSjYL453f@HpRGU6Dv)rw+-c6xB>(=p4U%}_p>z^I@Ow9`nkUG21?cMIh9}hN?R-d)*6%pr6d@mcb*ixr7 z)>Lo<&2F}~>WT1ybm^9UO{6P9;m+fU^06_$o9gBWL9_}EMZFD=rLJ~&e?fhDnJNBI zKM=-WR6g7HY5tHf=V~6~QIQ~rakNvcsamU8m28YE=z8+G7K=h%)l6k zmCpiDInKL6*e#)#Pt;ANmjf`8h-nEt&d}(SBZMI_A{BI#ck-_V7nx)K9_D9K-p@?Zh81#b@{wS?wCcJ%og)8RF*-0z+~)6f#T` zWqF7_CBcnn=S-1QykC*F0YTsKMVG49BuKQBH%WuDkEy%E?*x&tt%0m>>5^HCOq|ux zuvFB)JPR-W|%$24eEC^AtG3Gp4qdK%pjRijF5Sg3X}uaKEE z-L5p5aVR!NTM8T`4|2QA@hXiLXRcJveWZ%YeFfV%mO5q#($TJ`*U>hicS+CMj%Ip# zivoL;dd*araeJK9EA<(tihD50FHWbITBgF9E<33A+eMr2;cgI3Gg6<-2o|_g9|> zv5}i932( zYfTE9?4#nQhP@a|zm#9FST2 z!y+p3B;p>KkUzH!K;GkBW}bWssz)9b>Ulg^)EDca;jDl+q=243BddS$hY^fC6lbpM z(q_bo4V8~eVeA?0LFD6ZtKcmOH^75#q$Eo%a&qvE8Zsqg=$p}u^|>DSWUP5i{6)LAYF4E2DfGZuMJ zMwxxmkxQf}Q$V3&2w|$`9_SQS^2NVbTHh;atB>=A%!}k-f4*i$X8m}Ni^ppZXk5_oYF>Gq(& z0wy{LjJOu}69}~#UFPc;$7ka+=gl(FZCy4xEsk);+he>Nnl>hb5Ud-lj!CNicgd^2 z_Qgr_-&S7*#nLAI7r()P$`x~fy)+y=W~6aNh_humoZr7MWGSWJPLk}$#w_1n%(@? z3FnHf1lbxKJbQ9c&i<$(wd{tUTX6DAKs@cXIOBv~!9i{wD@*|kwfX~sjKASrNFGvN zrFc=!0Bb^OhR2f`%hrp2ibv#KUxl)Np1aixD9{^o=)*U%n%rTHX?FSWL^UGpHpY@7 z74U}KoIRwxI#>)Pn4($A`nw1%-D}`sGRZD8Z#lF$6 zOeA5)+W2qvA%m^|$WluUU-O+KtMqd;Pd58?qZj})MbxYGO<{z9U&t4D{S2G>e+J9K ztFZ?}ya>SVOLp9hpW)}G%kTrg*KXXXsLkGdgHb+R-ZXqdkdQC0_)`?6mqo8(EU#d( zy;u&aVPe6C=YgCRPV!mJ6R6kdY*`e+VGM~`VtC>{k27!9vAZT)x2~AiX5|m1Rq}_= z;A9LX^nd$l-9&2%4s~p5r6ad-siV`HtxKF}l&xGSYJmP=z!?Mlwmwef$EQq~7;#OE z)U5eS6dB~~1pkj#9(}T3j!((8Uf%!W49FfUAozijoxInUE7z`~U3Y^}xc3xp){#9D z<^Tz2xw}@o@fdUZ@hnW#dX6gDOj4R8dV}Dw`u!h@*K)-NrxT8%2`T}EvOImNF_N1S zy?uo6_ZS>Qga4Xme3j#aX+1qdFFE{NT0Wfusa$^;eL5xGE_66!5_N8!Z~jCAH2=${ z*goHjl|z|kbmIE{cl-PloSTtD+2=CDm~ZHRgXJ8~1(g4W=1c3=2eF#3tah7ho`zm4 z05P&?nyqq$nC?iJ-nK_iBo=u5l#|Ka3H7{UZ&O`~t-=triw=SE7ynzMAE{Mv-{7E_ zViZtA(0^wD{iCCcg@c{54Ro@U5p1QZq_XlEGtdBAQ9@nT?(zLO0#)q55G8_Ug~Xnu zR-^1~hp|cy&52iogG@o?-^AD8Jb^;@&Ea5jEicDlze6%>?u$-eE};bQ`T6@(bED0J zKYtdc?%9*<<$2LCBzVx9CA4YV|q-qg*-{yQ;|0=KIgI6~z0DKTtajw2Oms3L zn{C%{P`duw!(F@*P)lFy11|Z&x`E2<=$Ln38>UR~z6~za(3r;45kQK_^QTX%!s zNzoIFFH8|Y>YVrUL5#mgA-Jh>j7)n)5}iVM4%_@^GSwEIBA2g-;43* z*)i7u*xc8jo2z8&=8t7qo|B-rsGw)b8UXnu`RgE4u!(J8yIJi(5m3~aYsADcfZ!GG zzqa7p=sg`V_KjiqI*LA-=T;uiNRB;BZZ)~88 z`C%p8%hIev2rxS12@doqsrjgMg3{A&N8A?%Ui5vSHh7!iC^ltF&HqG~;=16=h0{ygy^@HxixUb1XYcR36SB}}o3nxu z_IpEmGh_CK<+sUh@2zbK9MqO!S5cao=8LSQg0Zv4?ju%ww^mvc0WU$q@!oo#2bv24 z+?c}14L2vlDn%Y0!t*z=$*a!`*|uAVu&NO!z_arim$=btpUPR5XGCG0U3YU`v>yMr z^zmTdcEa!APX zYF>^Q-TP11;{VgtMqC}7>B^2gN-3KYl33gS-p%f!X<_Hr?`rG8{jb9jmuQA9U;BeG zHj6Pk(UB5c6zwX%SNi*Py*)gk^?+729$bAN-EUd*RKN7{CM4`Q65a1qF*-QWACA&m zrT)B(M}yih{2r!Tiv5Y&O&=H_OtaHUz96Npo_k0eN|!*s2mLe!Zkuv>^E8Xa43ZwH zOI058AZznYGrRJ+`*GmZzMi6yliFmGMge6^j?|PN%ARns!Eg$ufpcLc#1Ns!1@1 zvC7N8M$mRgnixwEtX{ypBS^n`k@t2cCh#_6L6WtQb8E~*Vu+Rr)YsKZRX~hzLG*BE zaeU#LPo?RLm(Wzltk79Jd1Y$|6aWz1)wf1K1RtqS;qyQMy@H@B805vQ%wfSJB?m&&=^m4i* zYVH`zTTFbFtNFkAI`Khe4e^CdGZw;O0 zqkQe2|NG_y6D%h(|EZNf&77_!NU%0y={^E=*gKGQ=)LdKPM3zUlM@otH2X07Awv8o zY8Y7a1^&Yy%b%m{mNQ5sWNMTIq96Wtr>a(hL>Qi&F(ckgKkyvM0IH<_}v~Fv-GqDapig=3*ZMOx!%cYY)SKzo7ECyem z9Mj3C)tCYM?C9YIlt1?zTJXNOo&oVxu&uXKJs7i+j8p*Qvu2PAnY}b`KStdpi`trk ztAO}T8eOC%x)mu+4ps8sYZ=vYJp16SVWEEgQyFKSfWQ@O5id6GfL`|2<}hMXLPszS zgK>NWOoR zBRyKeUPevpqKKShD|MZ`R;~#PdNMB3LWjqFKNvH9k+;(`;-pyXM55?qaji#nl~K8m z_MifoM*W*X9CQiXAOH{cZcP0;Bn10E1)T@62Um>et2ci!J2$5-_HPy(AGif+BJpJ^ ziHWynC_%-NlrFY+(f7HyVvbDIM$5ci_i3?22ZkF>Y8RPBhgx-7k3M2>6m5R24C|~I z&RPh9xpMGzhN4bii*ryWaN^d(`0 zTOADlU)g`1p+SVMNLztd)c+;XjXox(VHQwqzu>FROvf0`s&|NEv26}(TAe;@=FpZq zaVs6mp>W0rM3Qg*6x5f_bPJd!6dQGmh?&v0rpBNfS$DW-{4L7#_~-eA@7<2BsZV=X zow){3aATmLZOQrs>uzDkXOD=IiX;Ue*B(^4RF%H zeaZ^*MWn4tBDj(wj114r(`)P96EHq4th-;tWiHhkp2rDlrklX}I@ib-nel0slFoQO zOeTc;Rh7sMIebO`1%u)=GlEj+7HU;c|Nj>2j)J-kpR)s3#+9AiB zd$hAk6;3pu9(GCR#)#>aCGPYq%r&i02$0L9=7AlIGYdlUO5%eH&M!ZWD&6^NBAj0Y9ZDcPg@r@8Y&-}e!aq0S(`}NuQ({;aigCPnq75U9cBH&Y7 ze)W0aD>muAepOKgm7uPg3Dz7G%)nEqTUm_&^^3(>+eEI;$ia`m>m0QHEkTt^=cx^JsBC68#H(3zc~Z$E9I)oSrF$3 zUClHXhMBZ|^1ikm3nL$Z@v|JRhud*IhOvx!6X<(YSX(9LG#yYuZeB{=7-MyPF;?_8 zy2i3iVKG2q!=JHN>~!#Bl{cwa6-yB@b<;8LSj}`f9pw7#x3yTD>C=>1S@H)~(n_K4 z2-yr{2?|1b#lS`qG@+823j;&UE5|2+EdU4nVw5=m>o_gj#K>>(*t=xI7{R)lJhLU{ z4IO6!x@1f$aDVIE@1a0lraN9!(j~_uGlks)!&davUFRNYHflp<|ENwAxsp~4Hun$Q z$w>@YzXp#VX~)ZP8`_b_sTg(Gt7?oXJW%^Pf0UW%YM+OGjKS}X`yO~{7WH6nX8S6Z ztl!5AnM2Lo*_}ZLvo%?iV;D2z>#qdpMx*xY2*GGlRzmHCom`VedAoR=(A1nO)Y>;5 zCK-~a;#g5yDgf7_phlkM@)C8s!xOu)N2UnQhif-v5kL$*t=X}L9EyBRq$V(sI{90> z=ghTPGswRVbTW@dS2H|)QYTY&I$ljbpNPTc_T|FEJkSW7MV!JM4I(ksRqQ8)V5>}v z2Sf^Z9_v;dKSp_orZm09jb8;C(vzFFJgoYuWRc|Tt_&3k({wPKiD|*m!+za$(l*!gNRo{xtmqjy1=kGzFkTH=Nc>EL@1Um0BiN1)wBO$i z6rG={bRcT|%A3s3xh!Bw?=L&_-X+6}L9i~xRj2}-)7fsoq0|;;PS%mcn%_#oV#kAp zGw^23c8_0~ ze}v9(p};6HM0+qF5^^>BBEI3d=2DW&O#|(;wg}?3?uO=w+{*)+^l_-gE zSw8GV=4_%U4*OU^hibDV38{Qb7P#Y8zh@BM9pEM_o2FuFc2LWrW2jRRB<+IE)G=Vx zuu?cp2-`hgqlsn|$nx@I%TC!`>bX^G00_oKboOGGXLgyLKXoo$^@L7v;GWqfUFw3< zekKMWo0LR;TaFY}Tt4!O$3MU@pqcw!0w0 zA}SnJ6Lb597|P5W8$OsEHTku2Kw9y4V=hx*K%iSn!#LW9W#~OiWf^dXEP$^2 zaok=UyGwy3GRp)bm6Gqr>8-4h@3=2`Eto2|JE6Sufh?%U6;ut1v1d@#EfcQP2chCt z+mB{Bk5~()7G>wM3KYf7Xh?LGbwg1uWLotmc_}Z_o;XOUDyfU?{9atAT$={v82^w9 z(MW$gINHt4xB3{bdbhRR%T}L?McK?!zkLK3(e>zKyei(yq%Nsijm~LV|9mll-XHavFcc$teX7v);H>=oN-+E_Q{c|! zp
    JV~-9AH}jxf6IF!PxrB9is{_9s@PYth^`pb%DkwghLdAyDREz(csf9)HcVRq z+2Vn~>{(S&_;bq_qA{v7XbU?yR7;~JrLfo;g$Lkm#ufO1P`QW_`zWW+4+7xzQZnO$ z5&GyJs4-VGb5MEDBc5=zxZh9xEVoY(|2yRv&!T7LAlIs@tw+4n?v1T8M>;hBv}2n) zcqi+>M*U@uY>4N3eDSAH2Rg@dsl!1py>kO39GMP#qOHipL~*cCac2_vH^6x@xmO|E zkWeyvl@P$2Iy*mCgVF+b{&|FY*5Ygi8237i)9YW#Fp& z?TJTQW+7U)xCE*`Nsx^yaiJ0KSW}}jc-ub)8Z8x(|K7G>`&l{Y&~W=q#^4Gf{}aJ%6kLXsmv6cr=Hi*uB`V26;dr4C$WrPnHO>g zg1@A%DvIWPDtXzll39kY6#%j;aN7grYJP9AlJgs3FnC?crv$wC7S4_Z?<_s0j;MmE z75yQGul2=bY%`l__1X3jxju2$Ws%hNv75ywfAqjgFO7wFsFDOW^)q2%VIF~WhwEW0 z45z^+r+}sJ{q+>X-w(}OiD(!*&cy4X&yM`!L0Fe+_RUfs@=J{AH#K~gArqT=#DcGE z!FwY(h&+&811rVCVoOuK)Z<-$EX zp`TzcUQC256@YWZ*GkE@P_et4D@qpM92fWA6c$MV=^qTu7&g)U?O~-fUR&xFqNiY1 zRd=|zUs_rmFZhKI|H}dcKhy%Okl(#y#QuMi81zsY56Y@757xBQqDNkd+XhLQhp2BB zBF^aJ__D676wLu|yYo6jNJNw^B+Ce;DYK!f$!dNs1*?D^97u^jKS++7S z5qE%zG#HY-SMUn^_yru=T6v`)CM%K<>_Z>tPe|js`c<|y7?qol&)C=>uLWkg5 zmzNcSAG_sL)E9or;i+O}tY^70@h7+=bG1;YDlX{<4zF_?{)K5B&?^tKZ6<$SD%@>F zY0cl2H7)%zKeDX%Eo7`ky^mzS)s;842cP{_;dzFuyd~Npb4u!bwkkhf8-^C2e3`q8>MuPhgiv0VxHxvrN9_`rJv&GX0fWz-L-Jg^B zrTsm>)-~j0F1sV=^V?UUi{L2cp%YwpvHwwLaSsCIrGI#({{QfbgDxLKsUC6w@m?y} zg?l=7aMX-RnMxvLn_4oSB|9t;)Qf2%m-GKo_07?N1l^ahJ+Wf8C>h5~=-o1BJzV@5HBTB-ACNpsHnGt6_ku37M z{vIEB^tR=--4SEg{jfF=gEogtGwi&A$mwk7E+SV$$ZuU}#F3Y7t}o{!w4LJh8v4PW%8HfUK@dta#l*z@w*9Xzz(i)r#WXi`r1D#oBPtNM7M?Hkq zhhS1)ea5(6VY45|)tCTr*@yc$^Zc!zQzsNXU?aRN6mh7zVu~i=qTrX^>de+f6HYfDsW@6PBlw0CsDBcOWUmt&st>Z zYNJEsRCP1#g0+Htb=wITvexBY@fOpAmR7?szQNR~nM)?sPWIj)0)jG-EF8U@nnBaQZy z)ImpVYQL>lBejMDjlxA$#G4%y+^_>N;}r@Zoe2|u-9-x@vvD^ZWnV>Gm=pZa7REAf zOnomhCxBaGZgT+4kiE%aS&lH2sI1mSCM<%)Cr*Sli;#!aXcUb&@Z|Hj{VPsJyClqD%>hy`Y7z(GASs8Mqas3!D zSQE83*%uctlD|p%4)v`arra4y>yP5m25V*_+n)Ry1v>z_Fz!TV6t+N?x?#iH$q=m= z8&X{uW%LVRO87dVl=$Y*>dabJVq{o|Kx`7(D2$5DVX&}XGbg|Ua(*5b=;5qzW9;|w>m{hIO(Tu-z(ey8H=EMluJNyK4BJmGpX~ZM2O61 zk*O7js{-MBqwq>Urf0igN+6soGGc!Y?SP6hiXuJzZ1V4WZqE*?h;PG84gvG~dds6~484!kPM zMP87IP?dhdc;%|cS&LxY*Ib6P3%p|9)E3IgRmhhwtUR3eRK6iZ_6fiGW}jnL4(I|t ze`2yLvmuY42lNwO6>I#Son3$R4NOoP*WUm1R4jl#agtSLE}fSu-Z>{+*?pQIn7`s3LAzF#1pSxCAo?clr9 z9PUj#REq28*ZkJnxs$aK%8^5?P<_Q!#Z?%JH0FKVF;&zH3F#J^fz|ahl$Ycs~kFij_XP;U<`FcaDYyXYPM~&jEe1Xj1n;wyRdD;lmnq&FEro=;+Z$=v-&fYM9eK*S_D&oTXFW#b0 zRY}Y7R#bLzTfg9i7{s?=P9~qjA?$-U2p5;0?gPPu`1JY|*?*8IPO!eX>oiX=O#F!A zl`S%e5Y(csR1f)I(iKMf-;5%_rPP7h&}5Fc(8byKUH1*d7?9%QC|4aADj3L8yuo6GOv#%HDgU3bN(UHw1+(99&Om%f!DY(RYSf4&Uny% zH}*&rEXc$W5+eyeEg|I|E-HnkIO0!$1sV7Z&NXxiCZJ@`kH4eEi5}q~!Vv5qQq{MI zi4^`GYoUN-7Q(jy^SKXL4$G4K+FQXR)B}ee=pS0RyK=YC8c2bGnMA~rrOh&jd3_AT zxVaq37w^-;OU3+C`Kko-Z%l_2FC^maa=Ae0Fm@PEtXEg@cX*oka1Lt&h@jES<6?o1Oi1C9>}7+U(Ve zQ$=8RlzcnfCd59CsJ=gG^A!2Bb_PY~K2sSau{)?Ge03G7US&qrgV!3NUi>UHWZ*lo zS;~0--vn{ot+7UWMV{a(X3rZ8Z06Ps3$-sd|CWE(Y#l`swvcDbMjuReGsoA`rmZ`^ z=AaArdbeU0EtwnOuzq@u5P1rlZjH#gNgh6HIhG(>dX%4m{_!&DNTQE)8= zXD-vcpcSi|DSm3aUMnrV;DQY?svz?9*#GT$NXb~Hem=24iy>7xj367(!#RjnrHtrP-Q`T2W*PEvAR-=j ztY2|#<|JvHNVnM-tNdoS_yRSo=yFqukTZmB$|>Vclj)o=YzC9!ph8)ZOH5X=%Aq|9gNgc}^KFVLht!Lyw54v5u&D zW%vT%z`H{Ax>Ry+bD&QjHQke_wEA;oj(&E!s4|OURButQKSc7Ar-PzIiFa8F@ezkaY2J9&PH+VI1!G+{JgsQ7%da*_Gr!exT*OgJld)b-?cd)xI+|v_C`h(Cg`N~oj0`SQPTma z{@vc8L^D-rBXwS#00jT#@=-n1H-C3hvg61r2jx#ok&cr#BV~9JdPaVihyrGq*lb>bm$H6rIoc}ifaSn6mTD9% z$FRJxbNozOo6y}!OUci1VBv-7{TYZ4GkOM@46Y9?8%mSH9?l&lU59)T#Fjg(h%6I} z?ib zZ(xb8Rwr+vv>@$h{WglT2lL`#V=-9tP^c)cjvnz(g|VL^h8^CPVv12dE(o}WQ@0OP z^2-&ssBXP^#Oh`X5@F+~$PCB6kK-T7sFUK|>$lNDSkvAy%{y2qgq-&v zv}^&gm`wiYztWgMS<{^qQKYNV=>CQaOeglAY~EZvr}n~tW=yg)_+fzqF%~+*V_$3h z2hDW`e$qR;QMg?(wKE>%H_6ASS@6bkOi-m- zg6B7AzD;gBS1%OD7|47a%3BykN{w}P!Wn-nQOfpKUpx8Mk{$IO62D!%U9$kr!e%T> zlqQih?3(U&5%r!KZFZPdbwZ0laAJCj!c&pEFVzrH&_&i5m68Y_*J+-Qjlnz}Q{3oAD)`d14H zKUGmbwC|beC9Mtp>SbL~NVrlctU3WBpHz(UeIa~_{u^_4OaHs_LQt>bUwcyD`_Bbh zC=x|1vSjL)JvVHLw|xKynEvq2m)7O-6qdmjht7pZ*z|o%NA17v$9H*(5D5(MXiNo1 z72Tv}QASqr$!mY58s_Q{hHa9MY+QZ`2zX-FT@Kd?`8pczcV^9IeOKDG4WKqiP7N|S z+O977=VQTk8k5dafK`vd(4?_3pBdB?YG9*Z=R@y|$S+d%1sJf-Ka++I&v9hH)h#}} zw-MjQWJ?ME<7PR(G<1#*Z-&M?%=yzhQw$Lki(R+Pq$X~Q!9BO=fP9FyCIS8zE3n04 z8ScD%XmJnIv=pMTgt6VSxBXOZucndRE@7^aU0wefJYueY(Cb%?%0rz)zWEnsNsKhQ z+&o6d^x=R;Pt7fUa_`JVb1HPHYbXg{Jvux|atQ^bV#_|>7QZNC~P^IKUThB6{kvz2pr2*Cyxj zy37Nri8za8J!@Iw9rbt~#^<9zOaM8LOi$kPBcAGqPq-DB^-93Qeup{9@9&=zV6KQN zL)ic5S%n1!F(7b>MQ973$~<0|9MY-G!?wk?j-cQhMQlM2n{&7JoTBGsP;=fC6CBJn zxlpk^%x=B16rfb-W9pYV#9IRHQL9VG4?Uh>pN>2}0-MST2AB2pQjf*rT+TLCX-+&m z9I{ic2ogXoh=HwdI#igr(JC>>NUP|M>SA?-ux<2&>Jyx>Iko!B<3vS}{g*dKqxYW7 z0i`&U#*v)jot+keO#G&wowD!VvD(j`Z9a*-_RALKn0b(KnZ37d#Db7royLhBW~*7o zRa`=1fo9C4dgq;;R)JpP++a9^{xd)8``^fPW9!a%MCDYJc;3yicPs8IiQM>DhUX*; zeIrxE#JRrr|D$@bKgOm4C9D+e!_hQKj3LC`Js)|Aijx=J!rlgnpKeF>b+QlKhI^4* zf%Of^RmkW|xU|p#Lad44Y5LvIUIR>VGH8G zz7ZEIREG%UOy4)C!$muX6StM4@Fsh&Goa}cj10RL(#>oGtr6h~7tZDDQ_J>h)VmYlKK>9ns8w4tdx6LdN5xJQ9t-ABtTf_ zf1dKVv!mhhQFSN=ggf(#$)FtN-okyT&o6Ms+*u72Uf$5?4)78EErTECzweDUbbU)) zc*tt+9J~Pt%!M352Y5b`Mwrjn^Orp+)L_U1ORHJ}OUsB78YPcIRh4p5jzoDB7B*fb z4v`bouQeCAW#z9b1?4(M3dcwNn2F2plwC^RVHl#h&b-8n#5^o+Ll20OlJ^gOYiK2< z;MQuR!t!>`i}CAOa4a+Rh5IL|@kh4EdEL*O=3oGx4asg?XCTcUOQnmHs^6nLu6WcI zSt9q7nl*?2TIikKNb?3JZBo$cW6)b#;ZKzi+(~D-%0Ec+QW=bZZm@w|prGiThO3dy zU#TQ;RYQ+xU~*@Zj;Rf~z~iL8Da`RT!Z)b3ILBhnIl@VX9K0PSj5owH#*FJXX3vZ= zg_Zyn^G&l!WR6wN9GWvt)sM?g2^CA8&F#&t2z3_MiluRqvNbV{Me6yZ&X-_ zd6#Xdh%+6tCmSNTdCBusVkRwJ_A~<^Nd6~MNOvS;YDixM43`|8e_bmc*UWi7TLA})`T_F ztk&Nd=dgFUss#Ol$LXTRzP9l1JOSvAws~^X%(`ct$?2Im?UNpXjBec_-+8YK%rq#P zT9=h8&gCtgx?=Oj$Yr2jI3`VVuZ`lH>*N+*K11CD&>>F)?(`yr~54vHJftY*z?EorK zm`euBK<$(!XO%6-1=m>qqp6F`S@Pe3;pK5URT$8!Dd|;`eOWdmn916Ut5;iXWQoXE z0qtwxlH=m_NONP3EY2eW{Qwr-X1V3;5tV;g7tlL4BRilT#Y&~o_!f;*hWxWmvA;Pg zRb^Y$#PipnVlLXQIzKCuQP9IER0Ai4jZp+STb1Xq0w(nVn<3j(<#!vuc?7eJEZC<- zPhM7ObhgabN2`pm($tu^MaBkRLzx&jdh;>BP|^$TyD1UHt9Qvr{ZcBs^l!JI4~d-Py$P5QOYO&8eQOFe)&G zZm+?jOJioGs7MkkQBCzJSFJV6DiCav#kmdxc@IJ9j5m#&1)dhJt`y8{T!uxpBZ>&z zD^V~%GEaODak5qGj|@cA7HSH{#jHW;Q0KRdTp@PJO#Q1gGI=((a1o%X*{knz&_`ym zkRLikN^fQ%Gy1|~6%h^vx>ToJ(#aJDxoD8qyOD{CPbSvR*bC>Nm+mkw>6mD0mlD0X zGepCcS_x7+6X7dH;%e`aIfPr-NXSqlu&?$Br1R}3lSF2 zWOXDtG;v#EVLSQ!>4323VX-|E#qb+x%IxzUBDI~N23x? zXUHfTTV#_f9T$-2FPG@t)rpc9u9!@h^!4=fL^kg9 zVv%&KY3!?bU*V4X)wNT%Chr;YK()=~lc%$auOB_|oH`H)Xot@1cmk{^qdt&1C55>k zYnIkdoiAYW41zrRBfqR?9r^cpWIEqfS;|R#bIs4$cqA zoq~$yl8h{IXTSdSdH?;`ky6i%+Oc?HvwH+IS`%_a!d#CqQob9OTNIuhUnOQsX;nl_ z;1w99qO9lAb|guQ9?p4*9TmIZ5{su!h?v-jpOuShq!{AuHUYtmZ%brpgHl$BKLK_L z6q5vZodM$)RE^NNO>{ZWPb%Ce111V4wIX}?DHA=uzTu0$1h8zy!SID~m5t)(ov$!6 zB^@fP#vpx3enbrbX=vzol zj^Bg7V$Qa53#3Lptz<6Dz=!f+FvUBVIBtYPN{(%t(EcveSuxi3DI>XQ*$HX~O{KLK5Dh{H2ir87E^!(ye{9H&2U4kFxtKHkw zZPOTIa*29KbXx-U4hj&iH<9Z@0wh8B6+>qQJn{>F0mGnrj|0_{nwN}Vw_C!rm0!dC z>iRlEf}<+z&?Z4o3?C>QrLBhXP!MV0L#CgF{>;ydIBd5A{bd-S+VFn zLqq4a*HD%65IqQ5BxNz~vOGU=JJv|NG{OcW%2PU~MEfy6(bl#^TfT7+az5M-I`i&l z#g!HUfN}j#adA-21x7jbP6F;`99c8Qt|`_@u@fbhZF+Wkmr;IdVHj+F=pDb4MY?fU znDe##Hn){D}<>vVhYL#)+6p9eAT3T$?;-~bZU%l7MpPNh_mPc(h@79 z;LPOXk>e3nmIxl9lno5cI5G@Q!pE&hQ`s{$Ae4JhTebeTsj*|!6%0;g=wH?B1-p{P z`In#EP12q6=xXU)LiD+mLidPrYGHaKbe5%|vzApq9(PI6I5XjlGf<_uyy59iw8W;k zdLZ|8R8RWDc`#)n2?~}@5)vvksY9UaLW`FM=2s|vyg>Remm=QGthdNL87$nR&TKB*LB%*B}|HkG64 zZ|O4=Yq?Zwl>_KgIG@<8i{Zw#P3q_CVT7Dt zoMwoI)BkpQj8u(m!>1dfOwin(50}VNiLA>A2OG&TBXcP=H(3I;!WdPFe?r_e{%>bc6(Zk?6~Ew&;#ZxBJ| zAd1(sAHqlo_*rP;nTk)kAORe3cF&tj>m&LsvB)`-y9#$4XU=Dd^+CzvoAz%9216#f0cS`;kERxrtjbl^7pmO;_y zYBGOL7R1ne7%F9M2~0a7Srciz=MeaMU~ zV%Y#m_KV$XReYHtsraWLrdJItLtRiRo98T3J|x~(a>~)#>JHDJ z|4j!VO^qWQfCm9-$N29SpHUqvz62%#%98;2FNIF*?c9hZ7GAu$q>=0 zX_igPSK8Et(fmD)V=CvbtA-V(wS?z6WV|RX2`g=w=4D)+H|F_N(^ON!jHf72<2nCJ z^$hEygTAq7URR{Vq$)BsmFKTZ+i1i(D@SJuTGBN3W8{JpJ^J zkF=gBTz|P;Xxo1NIypGzJq8GK^#4tl)S%8$PP6E8c|GkkQ)vZ1OiB%mH#@hO1Z%Hp zv%2~Mlar^}7TRN-SscvQ*xVv+i1g8CwybQHCi3k;o$K@bmB%^-U8dILX)7b~#iPu@ z&D&W7YY2M3v`s(lNm2#^dCRFd;UYMUw1Rh2mto8laH1m`n0u;>okp5XmbsShOhQwo z@EYOehg-KNab)Rieib?m&NXls+&31)MB&H-zj_WmJsGjc1sCSOz0!2Cm1vV?y@kkQ z<1k6O$hvTQnGD*esux*aD3lEm$mUi0td0NiOtz3?7}h;Bt*vIC{tDBr@D)9rjhP^< zY*uKu^BiuSO%)&FL>C?Ng!HYZHLy`R>`rgq+lJhdXfo|df zmkzpQf{6o9%^|7Yb5v{Tu& zsP*Y~<#jK$S_}uEisRC;=y{zbq`4Owc@JyvB->nPzb#&vcMKi5n66PVV{Aub>*>q8 z=@u7jYA4Ziw2{fSED#t4QLD7Rt`au^y(Ggp3y(UcwIKtI(OMi@GHxs!bj$v~j(FZK zbdcP^gExtXQqQ8^Q#rHy1&W8q!@^aL>g1v2R45T(KErWB)1rB@rU`#n&-?g2Ti~xXCrexrLgajgzNy=N9|A6K=RZ zc3yk>w5sz1zsg~tO~-Ie?%Aplh#)l3`s632mi#CCl^75%i6IY;dzpuxu+2fliEjQn z&=~U+@fV4>{Fp=kk0oQIvBdqS#yY`Z+>Z|T&K{d;v3}=JqzKx05XU3M&@D5!uPTGydasyeZ5=1~IX-?HlM@AGB9|Mzb{{Dt@bUU8{KUPU@EX zv0fpQNvG~nD2WiOe{Vn=hE^rQD(5m+!$rs%s{w9;yg9oxRhqi0)rwsd245)igLmv* zJb@Xlet$+)oS1Ra#qTB@U|lix{Y4lGW-$5*4xOLY{9v9&RK<|K!fTd0wCKYZ)h&2f zEMcTCd+bj&YVmc#>&|?F!3?br3ChoMPTA{RH@NF(jmGMB2fMyW(<0jUT=8QFYD7-% zS0ydgp%;?W=>{V9>BOf=p$q5U511~Q0-|C!85)W0ov7eb35%XV;3mdUI@f5|x5C)R z$t?xLFZOv}A(ZjjSbF+8&%@RChpRvo>)sy>-IO8A@>i1A+8bZd^5J#(lgNH&A=V4V z*HUa0{zT{u-_FF$978RziwA@@*XkV{<-CE1N=Z!_!7;wq*xt3t((m+^$SZKaPim3K zO|Gq*w5r&7iqiQ!03SY{@*LKDkzhkHe*TzQaYAkz&jNxf^&A_-40(aGs53&}$dlKz zsel3=FvHqdeIf!UYwL&Mg3w_H?utbE_(PL9B|VAyaOo8k4qb>EvNYHrVmj^ocJQTf zL%4vl{qgmJf#@uWL@)WiB>Lm>?ivwB%uO|)i~;#--nFx4Kr6{TruZU0N_t_zqkg`? zwPFK|WiC4sI%o1H%$!1ANyq6_0OSPQJybh^vFriV=`S;kSsYkExZwB{68$dTODWJQ z@N57kBhwN(y~OHW_M}rX2W13cl@*i_tjW`TMfa~Y;I}1hzApXgWqag@(*@(|EMOg- z^qMk(s~dL#ps>>`oWZD=i1XI3(;gs7q#^Uj&L`gVu#4zn$i!BIHMoOZG!YoPO^=Gu z5`X-(KoSsHL77c<7^Y*IM2bI!dzg5j>;I@2-EeB$LgW|;csQTM&Z|R)q>yEjk@Sw% z6FQk*&zHWzcXalUJSoa&pgH24n`wKkg=2^ta$b1`(BBpBT2Ah9yQF&Kh+3jTaSE|=vChGz2_R^{$C;D`Ua(_=|OO11uLm;+3k%kO19EA`U065i;fRBoH z{Hq$cgHKRFPf0#%L?$*KeS@FDD;_TfJ#dwP7zzO5F>xntH(ONK{4)#jYUDQr6N(N< zp+fAS9l9)^c4Ss8628Zq5AzMq4zc(In_yJSXAT57Dtl}@= zvZoD7iq0cx7*#I{{r9m{%~g6@Hdr|*njKBb_5}mobCv=&X^`D9?;x6cHwRcwnlO^h zl;MiKr#LaoB*PELm8+8%btnC)b^E12!^ zMmVA!z>59e7n+^!P{PA?f9M^2FjKVw1%x~<`RY5FcXJE)AE}MTopGFDkyEjGiE|C6 z(ad%<3?v*?p;LJGopSEY18HPu2*}U!Nm|rfewc6(&y(&}B#j85d-5PeQ{}zg>>Rvl zDQ3H4E%q_P&kjuAQ>!0bqgAj){vzHpnn+h(AjQ6GO9v**l0|aCsCyXVE@uh?DU;Em zE*+7EU9tDH````D`|rM6WUlzBf1e{ht8$62#ilA6Dcw)qAzSRwu{czZJAcKv8w(Q6 zx)b$aq*=E=b5(UH-5*u)3iFlD;XQyklZrwHy}+=h6=aKtTriguHP@Inf+H@q32_LL z2tX|+X}4dMYB;*EW9~^5bydv)_!<%q#%Ocyh=1>FwL{rtZ?#2Scp{Q55%Fd-LgLU$ zM2u#|F{%vi%+O2^~uK3)?$6>9cc7_}F zWU72eFrzZ~x3ZIBH;~EMtD%51o*bnW;&QuzwWd$ds=O>Ev807cu%>Ac^ZK&7bCN;Ftk#eeQL4pG0p!W{Ri@tGw>nhIo`rC zi!Z6?70nYrNf92V{Y_i(a4DG=5>RktP=?%GcHEx?aKN$@{w{uj#Cqev$bXefo?yC6KI%Rol z%~$974WCymg;BBhd9Mv}_MeNro_8IB4!evgo*je4h?B-CAkEW-Wr-Q_V9~ef(znU& z{f-OHnj>@lZH(EcUb2TpOkc70@1BPiY0B#++1EPY5|UU?&^Vpw|C`k4ZWiB-3oAQM zgmG%M`2qDw5BMY|tG++34My2fE|^kvMSp(d+~P(Vk*d+RW1833i_bX^RYbg9tDtX` zox?y^YYfs-#fX|y7i(FN7js)66jN!`p9^r7oildEU#6J1(415H3h>W*p(p9@dI|c7 z&c*Aqzksg}o`D@i+o@WIw&jjvL!(`)JglV5zwMn)praO2M05H&CDeps0Wq8(8AkuE zPm|8MB6f0kOzg(gw}k>rzhQyo#<#sVdht~Wdk`y`=%0!jbd1&>Kxed8lS{Xq?Zw>* zU5;dM1tt``JH+A9@>H%-9f=EnW)UkRJe0+e^iqm0C5Z5?iEn#lbp}Xso ztleC}hl&*yPFcoCZ@sgvvjBA_Ew6msFml$cfLQY_(=h03WS_z+Leeh$M3#-?f9YT^Q($z z+pgaEv$rIa*9wST`WHASQio=9IaVS7l<87%;83~X*`{BX#@>>p=k`@FYo ze!K5_h8hOc`m0mK0p}LxsguM}w=9vw6Ku8y@RNrXSRPh&S`t4UQY=e-B8~3YCt1Fc zU$CtRW%hbcy{6K{>v0F*X<`rXVM3a{!muAeG$zBf`a(^l${EA9w3>J{aPwJT?mKVN2ba+v)Mp*~gQ_+Ws6= zy@D?85!U@VY0z9T=E9LMbe$?7_KIg)-R$tD)9NqIt84fb{B;f7C)n+B8)Cvo*F0t! zva6LeeC}AK4gL#d#N_HvvD& z0;mdU3@7%d5>h(xX-NBmJAOChtb(pX-qUtRLF5f$ z`X?Kpu?ENMc88>O&ym_$Jc7LZ> z#73|xJ|aa@l}PawS4Mpt9n)38w#q^P1w2N|rYKdcG;nb!_nHMZA_09L!j)pBK~e+j?tb-_A`wF8 zIyh>&%v=|n?+~h}%i1#^9UqZ?E9W!qJ0d0EHmioSt@%v7FzF`eM$X==#oaPESHBm@ zYzTXVo*y|C0~l_)|NF|F(If~YWJVkQAEMf5IbH{}#>PZpbXZU;+b^P8LWmlmDJ%Zu)4CajvRL!g_Faph`g0hpA2)D0|h zYy0h5+@4T81(s0D=crojdj|dYa{Y=<2zKp@xl&{sHO;#|!uTHtTey25f1U z#=Nyz{rJy#@SPk3_U|aALcg%vEjwIqSO$LZI59^;Mu~Swb53L+>oxWiN7J{;P*(2b@ao*aU~}-_j10 z@fQiaWnb}fRrHhNKrxKmi{aC#34BRP(a#0K>-J8D+v_2!~(V-6J%M@L{s?fU5ChwFfqn)2$siOUKw z?SmIRlbE8ot5P^z0J&G+rQ5}H=JE{FNsg`^jab7g-c}o`s{JS{-#}CRdW@hO`HfEp z1eR0DsN! zt5xmsYt{Uu;ZM`CgW)VYk=!$}N;w+Ct$Wf!*Z-7}@pA62F^1e$Ojz9O5H;TyT&rV( zr#IBM8te~-2t2;kv2xm&z%tt3pyt|s#vg2EOx1XkfsB*RM;D>ab$W-D6#Jdf zJ3{yD;P4=pFNk2GL$g~+5x;f9m*U2!ovWMK^U5`mAgBRhGpu)e`?#4vsE1aofu)iT zDm;aQIK6pNd8MMt@}h|t9c$)FT7PLDvu3e)y`otVe1SU4U=o@d!gn(DB9kC>Ac1wJ z?`{Hq$Q!rGb9h&VL#z+BKsLciCttdLJe9EmZF)J)c1MdVCrxg~EM80_b3k{ur=jVjrVhDK1GTjd3&t#ORvC0Q_&m|n>&TF1C_>k^8&ylR7oz#rG?mE%V| zepj0BlD|o?p8~LK_to`GINhGyW{{jZ{xqaO*SPvH)BYy1eH22DL_Kkn28N!0z3fzj z_+xZ3{ph_Tgkd)D$OjREak$O{F~mODA_D`5VsoobVnpxI zV0F_79%JB!?@jPs=cY73FhGuT!?fpVX1W=Wm zK5}i7(Pfh4o|Z{Ur=Y>bM1BDo2OdXBB(4Y#Z!61A8C6;7`6v-(P{ou1mAETEV?Nt< zMY&?ucJcJ$NyK0Zf@b;U#3ad?#dp`>zmNn=H1&-H`Y+)ai-TfyZJX@O&nRB*7j$ zDQF!q#a7VHL3z#Hc?Ca!MRbgL`daF zW#;L$yiQP|5VvgvRLluk3>-1cS+7MQ1)DC&DpYyS9j;!Rt$HdXK1}tG3G_)ZwXvGH zG;PB^f@CFrbEK4>3gTVj73~Tny+~k_pEHt|^eLw{?6NbG&`Ng9diB9XsMr(ztNC!{FhW8Hi!)TI`(Q|F*b z-z;#*c1T~kN67omP(l7)ZuTlxaC_XI(K8$VPfAzj?R**AMb0*p@$^PsN!LB@RYQ4U zA^xYY9sX4+;7gY%$i%ddfvneGfzbE4ZTJT5Vk3&1`?ULTy28&D#A&{dr5ZlZH&NTz zdfZr%Rw*Ukmgu@$C5$}QLOyb|PMA5syQns?iN@F|VFEvFPK321mTW^uv?GGNH6rnM zR9a2vB`}Y++T3Wumy$6`W)_c0PS*L;;0J^(T7<)`s{}lZVp`e)fM^?{$ zLbNw>N&6aw5Hlf_M)h8=)x0$*)V-w-Pw5Kh+EY{^$?#{v)_Y{9p5K{DjLnJ(ZUcyk*y(6D8wHB8=>Y)fb_Pw0v)Xybk`Sw@hNEaHP$-n`DtYP ziJyiauEXtuMpWyQjg$gdJR?e+=8w+=5GO-OT8pRaVFP1k^vI|I&agGjN-O*bJEK!M z`kt^POhUexh+PA&@And|vk-*MirW?>qB(f%y{ux z*d44UXxQOs+C`e-x4KSWhPg-!gO~kavIL8X3?!Ac2ih-dkK~Ua2qlcs1b-AIWg*8u z0QvL~51vS$LnmJSOnV4JUCUzg&4;bSsR5r_=FD@y|)Y2R_--e zMWJ;~*r=vJssF5_*n?wF0DO_>Mja=g+HvT=Yd^uBU|aw zRixHUQJX0Pgt-nFV+8&|;-n>!jNUj!8Y_YzH*%M!-_uWt6& z|Ec+lAD``i^do;u_?<(RpzsYZVJ8~}|NjUFgXltofbjhf!v&208g^#0h-x?`z8cInq!9kfVwJ|HQ;VK>p_-fn@(3q?e51Keq(=U-7C0#as-q z8Or}Ps07>O2@AAXz_%3bTOh{tKm#uRe}Sqr=w6-Wz$FCdfF3qNabEaj`-OfipxaL- zPh2R*l&%ZbcV?lv4C3+t2DAVSFaRo20^W_n4|0t(_*`?KmmUHG2sNZ*CRZlCFIyZbJqLdBCj)~%if)g|4NJr(8!R!E0iBbm$;`m;1n2@(8*E%B zH!g{hK|WK?1jUfM9zX?hlV#l%!6^p$$P+~rg}OdKg|d^Ed4WTY1$1J@WWHr$Os_(L z;-Zu1FJqhR4LrCUl)C~E7gA!^wtA6YIh10In9rX@LGSjnTPtLp+gPGp6u z3}{?J1!yT~?FwqT;O_-1%37f#4ek&DL){N}MX3RbNfRb-T;U^wXhx#De&QssA$lu~ mWkA_K7-+yz9tH*t6hj_Qg(_m7JaeTomk=)l!_+yTk^le-`GmOu delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..37f853b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4..b740cf1 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/settings.gradle b/settings.gradle index 1b1ee64..77bb6c2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,5 +17,5 @@ pluginManagement { } plugins { - id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.23' + id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.47' } From 19a994b2e29a024bcca7e47180636083945e01d2 Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:12:55 -0500 Subject: [PATCH 2/7] mult-dawnmachine support --- .../talonos/blightbuster/lib/Coordinates.java | 28 +++++++++++++ .../tileentity/DawnMachineTileEntity.java | 40 ++++++++++++++----- 2 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/main/java/talonos/blightbuster/lib/Coordinates.java diff --git a/src/main/java/talonos/blightbuster/lib/Coordinates.java b/src/main/java/talonos/blightbuster/lib/Coordinates.java new file mode 100644 index 0000000..c114363 --- /dev/null +++ b/src/main/java/talonos/blightbuster/lib/Coordinates.java @@ -0,0 +1,28 @@ +package talonos.blightbuster.lib; + +public class Coordinates { + public int x; + public int y; + public int z; + + public Coordinates(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Coordinates other)) return false; + return x == other.x && y == other.y && z == other.z; + } + + @Override + public int hashCode() { + int result = Integer.hashCode(x); + result = 31 * result + Integer.hashCode(y); + result = 31 * result + Integer.hashCode(z); + return result; + } +} diff --git a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java index 2cd5ebd..ad79086 100644 --- a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java +++ b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java @@ -5,13 +5,16 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.function.Function; +import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; @@ -49,6 +52,7 @@ import talonos.blightbuster.BlightBuster; import talonos.blightbuster.BlightbusterConfig; import talonos.blightbuster.lib.CleansingHelper; +import talonos.blightbuster.lib.Coordinates; import talonos.blightbuster.network.BlightbusterNetwork; import talonos.blightbuster.network.packets.SpawnCleanseParticlesPacket; import talonos.blightbuster.tileentity.dawnmachine.DawnMachineResource; @@ -76,7 +80,7 @@ public class DawnMachineTileEntity extends TileEntity implements IAspectSource, IAspectContainer, IEnergyReceiver, IEnergyStorage, ISparkAttachable, IFluidTank, IFluidHandler { - public static int[] coords = null; + private static final ArrayList dawnMachines = new ArrayList<>(); // FLUID INTEGRATION (Blood Magic) private static final int MAX_BLOOD = 100000; @@ -173,7 +177,7 @@ public class DawnMachineTileEntity extends TileEntity implements IAspectSource, // Denotes if waiting for chunk to load private boolean waiting = false; - public final ArrayList cleansedChunks = new ArrayList<>(); + public final Set cleansedChunks = new HashSet<>(); public boolean isActive = false; @@ -197,9 +201,11 @@ public void updateEntity() { return; } if (this.init) { + // this all has to wait for the first tick because the tileentity isn't fully initialized until then - coords = new int[] { this.xCoord, this.yCoord, this.zCoord }; - this.dawnMachineBlockCoords = new int[] { this.xCoord, this.zCoord }; + Coordinates coords = new Coordinates(this.xCoord, this.yCoord, this.zCoord); + dawnMachines.add(coords); + this.dawnMachineBlockCoords = new int[] { coords.x, coords.y }; this.scanlineCoords = this.generateScanlineCoords(); this.scanlineAerCoords = this.generateScanlineAerCoords(); this.dawnMachineChunkCoords = this.getDawnMachineChunkCoords(); @@ -248,7 +254,7 @@ public void updateEntity() { if (anythingToDo) { this.executeCleanse(chunk); try { - cleansedChunks.add(new int[] { this.chunkX, this.chunkZ }); + cleansedChunks.add(new ChunkCoordIntPair( this.chunkX, this.chunkZ )); } catch (Exception e) { BlightBuster.logger.error(e); worldObj.playerEntities.get(0) @@ -941,7 +947,7 @@ private void readCustomNBT(NBTTagCompound tag) { cleansedChunks.clear(); for (int i = 0; i < unpackedCoords.length - 1; i += 2) { try { - cleansedChunks.add(new int[] { unpackedCoords[i], unpackedCoords[i + 1] }); + cleansedChunks.add(new ChunkCoordIntPair(unpackedCoords[i], unpackedCoords[i + 1])); } catch (Exception e) { BlightBuster.logger.error(e); worldObj.playerEntities.get(0) @@ -970,9 +976,9 @@ private void writeCustomNBT(NBTTagCompound tag) { tag.setInteger("Mana", this.currentMana); // int[] tmpArray = ArrayUtils.toPrimitive(cleansedChunks.toArray(new Integer[0])); ArrayList unpackedCoords = new ArrayList<>(); - for (int[] coords : cleansedChunks) { - unpackedCoords.add(coords[0]); - unpackedCoords.add(coords[1]); + for (ChunkCoordIntPair coords : cleansedChunks) { + unpackedCoords.add(coords.chunkXPos); + unpackedCoords.add(coords.chunkZPos); } tag.setIntArray("CleansedChunks", ArrayUtils.toPrimitive(unpackedCoords.toArray(new Integer[0]))); } @@ -1424,8 +1430,22 @@ public void updatePos() { } public static void deconstruct(World world, int x, int y, int z) { - coords = null; + Coordinates coords = new Coordinates(x, y, z); + DawnMachineTileEntity.dawnMachines.remove(coords); } + public static ImmutableList getDawnMachines(World world) { + ImmutableList.Builder tiles = ImmutableList.builder(); + synchronized (dawnMachines) { + for (Coordinates coords : dawnMachines) { + DawnMachineTileEntity tile = (DawnMachineTileEntity) world.getTileEntity(coords.x, coords.y, coords.z); + if (tile != null) { + tiles.add(tile); + } + } + } + + return tiles.build(); + } // END MISC. FUNCTIONS } From a01f51ea99e62913e61604eda0c9c23dffebf399 Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:13:14 -0500 Subject: [PATCH 3/7] refactor mixins, support multiple dawnmachines --- .../mixins/late/MixinBlockTaintFibres.java | 55 ++++++++++--------- .../mixins/late/MixinFluxGoo.java | 23 ++++---- .../mixins/late/MixinTaintedCreeper.java | 31 ++++++----- .../mixins/late/MixinTaintedSheepAI.java | 20 +++---- .../mixins/late/MixinTileNode.java | 48 +++++++++------- 5 files changed, 92 insertions(+), 85 deletions(-) diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java index bfead72..25c4dea 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java @@ -2,9 +2,14 @@ import java.util.Random; +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.block.Block; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,38 +25,36 @@ public abstract class MixinBlockTaintFibres { @Inject(method = "taintBiomeSpread", at = @At(value = "HEAD", remap = false), cancellable = true) private static void taintBiomeSpreadMixin(World world, int x, int y, int z, Random rand, Block block, CallbackInfo ci) { - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - DawnMachineTileEntity tile = (DawnMachineTileEntity) world.getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - int chunkX = x / 16; - int chunkZ = z / 16; - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == chunkX && chunkCoords[1] == chunkZ) { - ci.cancel(); - return; - } - } + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + ci.cancel(); + return; } } } + @WrapOperation(method = "taintBiomeSpread", at = @At(value = "INVOKE", target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) + private static void stopTaintInChunk(World world, int x, int z, BiomeGenBase biome, Operation original) { + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + return; + } + } + original.call(world, x, z, biome); + } + @Inject(method = "spreadFibres", at = @At(value = "HEAD", remap = false), cancellable = true) private static void spreadFibresMixin(World world, int x, int y, int z, CallbackInfoReturnable cir) { - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - DawnMachineTileEntity tile = (DawnMachineTileEntity) world.getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - int chunkX = x / 16; - int chunkZ = z / 16; - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == chunkX && chunkCoords[1] == chunkZ) { - cir.setReturnValue(false); - return; - } - } + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + cir.setReturnValue(true); + return; } } } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java index 6394f7e..7c54f5d 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java @@ -2,6 +2,8 @@ import java.util.Random; +import com.google.common.collect.ImmutableList; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; @@ -17,19 +19,14 @@ public abstract class MixinFluxGoo { @Inject(method = "updateTick", at = @At(value = "HEAD"), cancellable = true) private void updateTickMixin(World world, int x, int y, int z, Random rand, CallbackInfo ci) { - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - DawnMachineTileEntity tile = (DawnMachineTileEntity) world.getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - int meta = world.getBlockMetadata(x, y, z); - if (meta >= 6 && world.isAirBlock(x, y + 1, z)) { - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == x / 16 && chunkCoords[1] == z / 16) { - ci.cancel(); - return; - } - } + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + for (DawnMachineTileEntity tile : tiles) { + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 6 && world.isAirBlock(x, y + 1, z)) { + if (tile.cleansedChunks.contains(chunk)) { + ci.cancel(); + return; } } } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java index 608abb7..28373ff 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java @@ -1,5 +1,9 @@ package talonos.blightbuster.mixins.late; +import com.google.common.collect.ImmutableList; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -10,27 +14,26 @@ import thaumcraft.common.entities.monster.EntityTaintCreeper; @Mixin(value = EntityTaintCreeper.class) -public abstract class MixinTaintedCreeper { +public abstract class MixinTaintedCreeper extends EntityMob { @Shadow(remap = false) private int timeSinceIgnited; + public MixinTaintedCreeper(World world) { + super(world); + } + @Inject(method = "onUpdate", at = @At(value = "HEAD")) private void onUpdateMixin(CallbackInfo c) { - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - EntityTaintCreeper tmp = (EntityTaintCreeper) (Object) this; - DawnMachineTileEntity tile = (DawnMachineTileEntity) tmp.worldObj - .getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == (int) tmp.posX / 16 && chunkCoords[1] == (int) tmp.posZ / 16) { - this.timeSinceIgnited = 0; - return; - } - } + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(this.chunkCoordX, this.chunkCoordZ); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + this.timeSinceIgnited = 0; + return; } } } + + } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java index c304f55..6e42bc1 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java @@ -1,7 +1,9 @@ package talonos.blightbuster.mixins.late; +import com.google.common.collect.ImmutableList; import net.minecraft.entity.EntityLiving; +import net.minecraft.world.ChunkCoordIntPair; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,18 +21,12 @@ public abstract class MixinTaintedSheepAI { @Inject(method = "shouldExecute", at = @At(value = "HEAD"), cancellable = true) private void updateTaskMixin(CallbackInfoReturnable cir) { - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - DawnMachineTileEntity tile = (DawnMachineTileEntity) entity.worldObj - .getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == entity.chunkCoordX && chunkCoords[1] == entity.chunkCoordZ) { - cir.setReturnValue(false); - return; - } - } + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(entity.worldObj); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(entity.chunkCoordX, entity.chunkCoordZ); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + cir.setReturnValue(false); + return; } } } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java index 0ecaa61..e0b3952 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java @@ -1,33 +1,41 @@ package talonos.blightbuster.mixins.late; +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.ChunkCoordIntPair; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.At; import talonos.blightbuster.tileentity.DawnMachineTileEntity; +import thaumcraft.api.TileThaumcraft; import thaumcraft.common.tiles.TileNode; @Mixin(value = TileNode.class, remap = false) -public abstract class MixinTileNode { +public abstract class MixinTileNode extends TileThaumcraft { + + @WrapMethod(method = "handleTaintNode") + private boolean handleTaintNodeMixin(boolean change, Operation original) { + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(this.xCoord / 16, this.zCoord / 16); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + return change; + } + } + return original.call(change); + } - @Inject(method = "handleTaintNode", at = @At(value = "HEAD", remap = false), cancellable = true) - private void handleTaintNodeMixin(boolean change, CallbackInfoReturnable cir) { - // BlightBuster.logger.info("Mixed into handleTaintNode"); - if (DawnMachineTileEntity.coords != null) { - int[] coords = DawnMachineTileEntity.coords; - TileNode tmp = (TileNode) (Object) this; - DawnMachineTileEntity tile = (DawnMachineTileEntity) tmp.getWorldObj() - .getTileEntity(coords[0], coords[1], coords[2]); - if (tile != null) { - for (int i = 0; i < tile.cleansedChunks.size(); i++) { - int[] chunkCoords = tile.cleansedChunks.get(i); - if (chunkCoords[0] == tmp.xCoord / 16 && chunkCoords[1] == tmp.zCoord / 16) { - cir.setReturnValue(false); - return; - } - } + @WrapOperation(method = "handleTaintNode", at = @At(value = "INVOKE", target="Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) + private void stopTaintNodeInChunk(net.minecraft.world.World world, int x, int z, net.minecraft.world.biome.BiomeGenBase biome, Operation original) { + ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + return; } } + original.call(world, x, z, biome); } } From 89d18a113ee73dcc4072cdd147267a330c53f607 Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:19:14 -0500 Subject: [PATCH 4/7] spotless --- .../talonos/blightbuster/lib/Coordinates.java | 1 + .../mixins/late/MixinBlockTaintFibres.java | 15 ++++++++++----- .../blightbuster/mixins/late/MixinFluxGoo.java | 3 ++- .../mixins/late/MixinTaintedCreeper.java | 5 +++-- .../mixins/late/MixinTaintedSheepAI.java | 5 +++-- .../blightbuster/mixins/late/MixinTileNode.java | 17 ++++++++++++----- .../tileentity/DawnMachineTileEntity.java | 4 ++-- 7 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/java/talonos/blightbuster/lib/Coordinates.java b/src/main/java/talonos/blightbuster/lib/Coordinates.java index c114363..61709e0 100644 --- a/src/main/java/talonos/blightbuster/lib/Coordinates.java +++ b/src/main/java/talonos/blightbuster/lib/Coordinates.java @@ -1,6 +1,7 @@ package talonos.blightbuster.lib; public class Coordinates { + public int x; public int y; public int z; diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java index 25c4dea..7013150 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java @@ -2,20 +2,21 @@ import java.util.Random; -import com.google.common.collect.ImmutableList; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.block.Block; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; - import net.minecraft.world.biome.BiomeGenBase; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.blocks.BlockTaintFibres; @@ -35,7 +36,11 @@ private static void taintBiomeSpreadMixin(World world, int x, int y, int z, Rand } } - @WrapOperation(method = "taintBiomeSpread", at = @At(value = "INVOKE", target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) + @WrapOperation( + method = "taintBiomeSpread", + at = @At( + value = "INVOKE", + target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) private static void stopTaintInChunk(World world, int x, int z, BiomeGenBase biome, Operation original) { ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java index 7c54f5d..df99cc9 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java @@ -2,7 +2,6 @@ import java.util.Random; -import com.google.common.collect.ImmutableList; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; @@ -11,6 +10,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.common.collect.ImmutableList; + import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.blocks.BlockFluxGoo; diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java index 28373ff..f3c949c 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java @@ -1,15 +1,17 @@ package talonos.blightbuster.mixins.late; -import com.google.common.collect.ImmutableList; import net.minecraft.entity.monster.EntityMob; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.common.collect.ImmutableList; + import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.entities.monster.EntityTaintCreeper; @@ -35,5 +37,4 @@ private void onUpdateMixin(CallbackInfo c) { } } - } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java index 6e42bc1..29b06dd 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java @@ -1,15 +1,16 @@ package talonos.blightbuster.mixins.late; -import com.google.common.collect.ImmutableList; import net.minecraft.entity.EntityLiving; - import net.minecraft.world.ChunkCoordIntPair; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.google.common.collect.ImmutableList; + import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.entities.ai.misc.AIConvertGrass; diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java index e0b3952..d445f21 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java @@ -1,13 +1,15 @@ package talonos.blightbuster.mixins.late; +import net.minecraft.world.ChunkCoordIntPair; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.world.ChunkCoordIntPair; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.api.TileThaumcraft; import thaumcraft.common.tiles.TileNode; @@ -27,8 +29,13 @@ private boolean handleTaintNodeMixin(boolean change, Operation original return original.call(change); } - @WrapOperation(method = "handleTaintNode", at = @At(value = "INVOKE", target="Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) - private void stopTaintNodeInChunk(net.minecraft.world.World world, int x, int z, net.minecraft.world.biome.BiomeGenBase biome, Operation original) { + @WrapOperation( + method = "handleTaintNode", + at = @At( + value = "INVOKE", + target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) + private void stopTaintNodeInChunk(net.minecraft.world.World world, int x, int z, + net.minecraft.world.biome.BiomeGenBase biome, Operation original) { ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); for (DawnMachineTileEntity tile : tiles) { diff --git a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java index ad79086..1b483fb 100644 --- a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java +++ b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java @@ -14,7 +14,6 @@ import java.util.Set; import java.util.function.Function; -import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; @@ -41,6 +40,7 @@ import org.apache.commons.lang3.ArrayUtils; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import WayofTime.alchemicalWizardry.AlchemicalWizardry; @@ -254,7 +254,7 @@ public void updateEntity() { if (anythingToDo) { this.executeCleanse(chunk); try { - cleansedChunks.add(new ChunkCoordIntPair( this.chunkX, this.chunkZ )); + cleansedChunks.add(new ChunkCoordIntPair(this.chunkX, this.chunkZ)); } catch (Exception e) { BlightBuster.logger.error(e); worldObj.playerEntities.get(0) From 13b21347bba5c7b896b16709ac23f39ab168ec3d Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Mon, 27 Oct 2025 23:41:55 -0500 Subject: [PATCH 5/7] refactor, mixin to Utils to block biome spread --- .../talonos/blightbuster/mixins/Mixins.java | 5 +++ .../mixins/late/MixinBlockTaintFibres.java | 30 +++--------------- .../mixins/late/MixinFluxGoo.java | 7 ++--- .../mixins/late/MixinTaintedCreeper.java | 22 +++++++++++-- .../mixins/late/MixinTaintedSheepAI.java | 6 ++-- .../mixins/late/MixinTileNode.java | 26 +++------------- .../blightbuster/mixins/late/MixinUtils.java | 31 +++++++++++++++++++ .../tileentity/DawnMachineTileEntity.java | 16 +++++----- 8 files changed, 78 insertions(+), 65 deletions(-) create mode 100644 src/main/java/talonos/blightbuster/mixins/late/MixinUtils.java diff --git a/src/main/java/talonos/blightbuster/mixins/Mixins.java b/src/main/java/talonos/blightbuster/mixins/Mixins.java index fb2f23b..da04b1b 100644 --- a/src/main/java/talonos/blightbuster/mixins/Mixins.java +++ b/src/main/java/talonos/blightbuster/mixins/Mixins.java @@ -38,6 +38,11 @@ public enum Mixins { .setSide(Side.BOTH) .setPhase(Phase.LATE) .addMixinClasses("MixinFluxGoo") + .setApplyIf(() -> true)), + DISABLE_BIOME_SPREAD(new Builder("Disables biome taint spread").addTargetedMod(TargetedMod.THAUMCRAFT) + .setSide(Side.BOTH) + .setPhase(Phase.LATE) + .addMixinClasses("MixinUtils") .setApplyIf(() -> true)); private final List mixinClasses; diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java index 7013150..6ed20f9 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinBlockTaintFibres.java @@ -1,11 +1,11 @@ package talonos.blightbuster.mixins.late; +import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -13,10 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.google.common.collect.ImmutableList; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; - import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.blocks.BlockTaintFibres; @@ -26,8 +22,8 @@ public abstract class MixinBlockTaintFibres { @Inject(method = "taintBiomeSpread", at = @At(value = "HEAD", remap = false), cancellable = true) private static void taintBiomeSpreadMixin(World world, int x, int y, int z, Random rand, Block block, CallbackInfo ci) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + List tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x >> 4, z >> 4); for (DawnMachineTileEntity tile : tiles) { if (tile.cleansedChunks.contains(chunk)) { ci.cancel(); @@ -36,26 +32,10 @@ private static void taintBiomeSpreadMixin(World world, int x, int y, int z, Rand } } - @WrapOperation( - method = "taintBiomeSpread", - at = @At( - value = "INVOKE", - target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) - private static void stopTaintInChunk(World world, int x, int z, BiomeGenBase biome, Operation original) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); - for (DawnMachineTileEntity tile : tiles) { - if (tile.cleansedChunks.contains(chunk)) { - return; - } - } - original.call(world, x, z, biome); - } - @Inject(method = "spreadFibres", at = @At(value = "HEAD", remap = false), cancellable = true) private static void spreadFibresMixin(World world, int x, int y, int z, CallbackInfoReturnable cir) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + List tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x >> 4, z >> 4); for (DawnMachineTileEntity tile : tiles) { if (tile.cleansedChunks.contains(chunk)) { cir.setReturnValue(true); diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java index df99cc9..57bf04e 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinFluxGoo.java @@ -1,5 +1,6 @@ package talonos.blightbuster.mixins.late; +import java.util.List; import java.util.Random; import net.minecraft.world.ChunkCoordIntPair; @@ -10,8 +11,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.google.common.collect.ImmutableList; - import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.blocks.BlockFluxGoo; @@ -20,8 +19,8 @@ public abstract class MixinFluxGoo { @Inject(method = "updateTick", at = @At(value = "HEAD"), cancellable = true) private void updateTickMixin(World world, int x, int y, int z, Random rand, CallbackInfo ci) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); + List tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x >> 4, z >> 4); for (DawnMachineTileEntity tile : tiles) { int meta = world.getBlockMetadata(x, y, z); if (meta >= 6 && world.isAirBlock(x, y + 1, z)) { diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java index f3c949c..98366d2 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedCreeper.java @@ -1,5 +1,8 @@ package talonos.blightbuster.mixins.late; +import java.util.List; + +import net.minecraft.block.Block; import net.minecraft.entity.monster.EntityMob; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; @@ -10,7 +13,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.entities.monster.EntityTaintCreeper; @@ -27,7 +31,7 @@ public MixinTaintedCreeper(World world) { @Inject(method = "onUpdate", at = @At(value = "HEAD")) private void onUpdateMixin(CallbackInfo c) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); + List tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); ChunkCoordIntPair chunk = new ChunkCoordIntPair(this.chunkCoordX, this.chunkCoordZ); for (DawnMachineTileEntity tile : tiles) { if (tile.cleansedChunks.contains(chunk)) { @@ -37,4 +41,18 @@ private void onUpdateMixin(CallbackInfo c) { } } + @WrapOperation( + method = "onUpdate", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;II)Z")) + private boolean wrapSetBlock(World world, int x, int y, int z, Block block, int meta, int flags, + Operation original) { + List tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x >> 4, z >> 4); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + return false; + } + } + return original.call(world, x, y, z, block, meta, flags); + } } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java index 29b06dd..e6262aa 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTaintedSheepAI.java @@ -1,5 +1,7 @@ package talonos.blightbuster.mixins.late; +import java.util.List; + import net.minecraft.entity.EntityLiving; import net.minecraft.world.ChunkCoordIntPair; @@ -9,8 +11,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.google.common.collect.ImmutableList; - import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.common.entities.ai.misc.AIConvertGrass; @@ -22,7 +22,7 @@ public abstract class MixinTaintedSheepAI { @Inject(method = "shouldExecute", at = @At(value = "HEAD"), cancellable = true) private void updateTaskMixin(CallbackInfoReturnable cir) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(entity.worldObj); + List tiles = DawnMachineTileEntity.getDawnMachines(entity.worldObj); ChunkCoordIntPair chunk = new ChunkCoordIntPair(entity.chunkCoordX, entity.chunkCoordZ); for (DawnMachineTileEntity tile : tiles) { if (tile.cleansedChunks.contains(chunk)) { diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java index d445f21..a11cd6f 100644 --- a/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinTileNode.java @@ -1,14 +1,13 @@ package talonos.blightbuster.mixins.late; +import java.util.List; + import net.minecraft.world.ChunkCoordIntPair; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import talonos.blightbuster.tileentity.DawnMachineTileEntity; import thaumcraft.api.TileThaumcraft; @@ -19,8 +18,8 @@ public abstract class MixinTileNode extends TileThaumcraft { @WrapMethod(method = "handleTaintNode") private boolean handleTaintNodeMixin(boolean change, Operation original) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(this.xCoord / 16, this.zCoord / 16); + List tiles = DawnMachineTileEntity.getDawnMachines(this.worldObj); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(this.xCoord >> 4, this.zCoord >> 4); for (DawnMachineTileEntity tile : tiles) { if (tile.cleansedChunks.contains(chunk)) { return change; @@ -28,21 +27,4 @@ private boolean handleTaintNodeMixin(boolean change, Operation original } return original.call(change); } - - @WrapOperation( - method = "handleTaintNode", - at = @At( - value = "INVOKE", - target = "Lthaumcraft/common/lib/utils/Utils;setBiomeAt(Lnet/minecraft/world/World;IILnet/minecraft/world/biome/BiomeGenBase;)V")) - private void stopTaintNodeInChunk(net.minecraft.world.World world, int x, int z, - net.minecraft.world.biome.BiomeGenBase biome, Operation original) { - ImmutableList tiles = DawnMachineTileEntity.getDawnMachines(world); - ChunkCoordIntPair chunk = new ChunkCoordIntPair(x / 16, z / 16); - for (DawnMachineTileEntity tile : tiles) { - if (tile.cleansedChunks.contains(chunk)) { - return; - } - } - original.call(world, x, z, biome); - } } diff --git a/src/main/java/talonos/blightbuster/mixins/late/MixinUtils.java b/src/main/java/talonos/blightbuster/mixins/late/MixinUtils.java new file mode 100644 index 0000000..36284f5 --- /dev/null +++ b/src/main/java/talonos/blightbuster/mixins/late/MixinUtils.java @@ -0,0 +1,31 @@ +package talonos.blightbuster.mixins.late; + +import java.util.List; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; + +import org.spongepowered.asm.mixin.Mixin; + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; + +import talonos.blightbuster.tileentity.DawnMachineTileEntity; +import thaumcraft.common.lib.utils.Utils; + +@Mixin(Utils.class) +public class MixinUtils { + + @WrapMethod(method = "setBiomeAt", remap = false) + private static void setBiomeAt(World world, int x, int z, BiomeGenBase biome, Operation original) { + List tiles = DawnMachineTileEntity.getDawnMachines(world); + ChunkCoordIntPair chunk = new ChunkCoordIntPair(x >> 4, z >> 4); + for (DawnMachineTileEntity tile : tiles) { + if (tile.cleansedChunks.contains(chunk)) { + return; + } + } + original.call(world, x, z, biome); + } +} diff --git a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java index 1b483fb..6e153dc 100644 --- a/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java +++ b/src/main/java/talonos/blightbuster/tileentity/DawnMachineTileEntity.java @@ -40,7 +40,6 @@ import org.apache.commons.lang3.ArrayUtils; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import WayofTime.alchemicalWizardry.AlchemicalWizardry; @@ -920,7 +919,7 @@ public static Chunk getChunk(World world, int x, int z) { } private int[] getDawnMachineChunkCoords() { - return new int[] { (int) Math.floor(this.xCoord / 16.0), (int) Math.floor(this.zCoord / 16.0) }; + return new int[] { this.xCoord >> 4, this.zCoord >> 4 }; } // END HELPER FUNCTIONS @@ -974,7 +973,6 @@ private void writeCustomNBT(NBTTagCompound tag) { tag.setInteger("CurrentRF", this.currentRF); tag.setInteger("Blood", this.fluid.amount); tag.setInteger("Mana", this.currentMana); - // int[] tmpArray = ArrayUtils.toPrimitive(cleansedChunks.toArray(new Integer[0])); ArrayList unpackedCoords = new ArrayList<>(); for (ChunkCoordIntPair coords : cleansedChunks) { unpackedCoords.add(coords.chunkXPos); @@ -1434,18 +1432,18 @@ public static void deconstruct(World world, int x, int y, int z) { DawnMachineTileEntity.dawnMachines.remove(coords); } - public static ImmutableList getDawnMachines(World world) { - ImmutableList.Builder tiles = ImmutableList.builder(); + public static List getDawnMachines(World world) { + ArrayList tiles = new ArrayList<>(); synchronized (dawnMachines) { for (Coordinates coords : dawnMachines) { - DawnMachineTileEntity tile = (DawnMachineTileEntity) world.getTileEntity(coords.x, coords.y, coords.z); - if (tile != null) { - tiles.add(tile); + TileEntity te = world.getTileEntity(coords.x, coords.y, coords.z); + if (te instanceof DawnMachineTileEntity) { + tiles.add((DawnMachineTileEntity) te); } } } - return tiles.build(); + return tiles; } // END MISC. FUNCTIONS } From b44f0b09ae3e3c73378d673df021cbb4a228990d Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Tue, 28 Oct 2025 00:03:52 -0500 Subject: [PATCH 6/7] compile error fix --- dependencies.gradle | 2 ++ .../blightbuster/handlers/TalonosWandTriggerManager.java | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index d582a7f..6f0ca27 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -41,5 +41,7 @@ dependencies { compileOnly(rfg.deobf("curse.maven:customnpcs-221826:2495406")) compileOnly("com.github.GTNewHorizons:ThaumicEnergistics:1.7.14-GTNH:dev") runtimeOnly("com.azanor.baubles:Baubles:1.0.1.10:deobf") + compileOnly(rfg.deobf("curse.maven:ubc-72744:2304497")) + compileOnly("curse.maven:cofhcore-69162:2388751") } diff --git a/src/main/java/talonos/blightbuster/handlers/TalonosWandTriggerManager.java b/src/main/java/talonos/blightbuster/handlers/TalonosWandTriggerManager.java index d1f08d3..3b30c9f 100644 --- a/src/main/java/talonos/blightbuster/handlers/TalonosWandTriggerManager.java +++ b/src/main/java/talonos/blightbuster/handlers/TalonosWandTriggerManager.java @@ -257,7 +257,7 @@ private void pairDawnChargerToDawnMachine(World world, ItemStack wand, int x, in } private boolean createDawnMachine(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) { - if (world.isRemote || DawnMachineTileEntity.coords != null) { + if (world.isRemote) { return false; } @@ -268,8 +268,7 @@ private boolean createDawnMachine(ItemStack stack, EntityPlayer player, World wo final Pair entry = BBBlock.dawnMachineMultiblock .getEntry(world, x, y, z, -1, block, meta); - if (entry != null && wand.consumeAllVisCrafting(stack, player, new AspectList().add(Aspect.ORDER, 20), true) - && !world.isRemote) { + if (entry != null && wand.consumeAllVisCrafting(stack, player, new AspectList().add(Aspect.ORDER, 20), true)) { BBBlock.dawnMachineMultiblock .convertMultiblockWithOrientationFromSideBlock(world, x, y, z, entry.getValue(), false, entry.getKey()); TileEntity newTile = world.getTileEntity(x, y, z); From 4b797825a961b95ff9a339982e8bcf42bc27b09f Mon Sep 17 00:00:00 2001 From: Midnight <23142346+Midnight145@users.noreply.github.com> Date: Tue, 28 Oct 2025 00:06:16 -0500 Subject: [PATCH 7/7] remove deprecated api package --- src/api/java/Zeno410Utils/BlockState.java | 14 -- src/api/java/Zeno410Utils/Zeno410Logger.java | 33 --- src/api/java/cofh/api/CoFHAPIProps.java | 11 - .../java/cofh/api/energy/EnergyStorage.java | 160 ------------ .../cofh/api/energy/IEnergyConnection.java | 22 -- .../cofh/api/energy/IEnergyContainerItem.java | 54 ----- .../java/cofh/api/energy/IEnergyHandler.java | 59 ----- .../java/cofh/api/energy/IEnergyProvider.java | 39 --- .../java/cofh/api/energy/IEnergyReceiver.java | 39 --- .../java/cofh/api/energy/IEnergyStorage.java | 46 ---- .../cofh/api/energy/ItemEnergyContainer.java | 110 --------- .../cofh/api/energy/TileEnergyHandler.java | 65 ----- .../java/cofh/api/energy/package-info.java | 9 - src/api/java/cofh/api/package-info.java | 8 - .../cofh/core/item/IEqualityOverrideItem.java | 9 - .../api/BiomeGenUndergroundBase.java | 47 ---- .../undergroundBiomes/api/BlockCodes.java | 48 ---- .../undergroundBiomes/api/NamedBlock.java | 67 ----- .../undergroundBiomes/api/NamedItem.java | 62 ----- .../undergroundBiomes/api/NamedSlabPair.java | 34 --- .../api/NamedVanillaBlock.java | 48 ---- .../undergroundBiomes/api/Names.java | 30 --- .../undergroundBiomes/api/NoiseGenerator.java | 79 ------ .../api/PerlinNoiseGenerator.java | 121 --------- .../undergroundBiomes/api/StrataLayer.java | 25 -- .../undergroundBiomes/api/UBAPIHook.java | 9 - .../UBDimensionalStrataColumnProvider.java | 6 - .../undergroundBiomes/api/UBIDs.java | 99 -------- .../api/UBOreTexturizer.java | 70 ------ .../api/UBSetProviderRegistry.java | 6 - .../undergroundBiomes/api/UBStoneCodes.java | 92 ------- .../undergroundBiomes/api/UBStrataColumn.java | 12 - .../api/UBStrataColumnProvider.java | 12 - .../api/UndergroundBiomeSet.java | 13 - .../api/UndergroundBiomeSetProvider.java | 7 - .../mcp/mobius/waila/api/IWailaBlock.java | 44 ---- .../waila/api/IWailaBlockDecorator.java | 9 - .../mobius/waila/api/IWailaConfigHandler.java | 29 --- .../mobius/waila/api/IWailaDataAccessor.java | 46 ---- .../mobius/waila/api/IWailaDataProvider.java | 43 ---- .../waila/api/IWailaEntityAccessor.java | 33 --- .../waila/api/IWailaEntityProvider.java | 21 -- .../mobius/waila/api/IWailaFMPAccessor.java | 37 --- .../mobius/waila/api/IWailaFMPDecorator.java | 8 - .../mobius/waila/api/IWailaFMPProvider.java | 18 -- .../mcp/mobius/waila/api/IWailaRegistrar.java | 58 ----- .../waila/api/IWailaSummaryProvider.java | 22 -- .../mcp/mobius/waila/api/SpecialChars.java | 40 --- .../mcp/mobius/waila/api/package-info.java | 4 - src/api/java/morph/api/Ability.java | 229 ------------------ src/api/java/morph/api/Api.java | 188 -------------- .../api/FactoryRegistry.java | 113 --------- .../minefactoryreloaded/api/HarvestType.java | 43 ---- .../api/IFactoryGrindable.java | 36 --- .../api/IFactoryHarvestable.java | 76 ------ .../api/ILiquidDrinkHandler.java | 8 - .../minefactoryreloaded/api/MobDrop.java | 19 -- .../minefactoryreloaded/api/ValuedItem.java | 65 ----- src/api/resources/CoFH_at.cfg | 77 ------ src/api/resources/MFR_at.cfg | 3 - src/api/resources/TConstruct_at.cfg | 43 ---- src/api/resources/ThaumicTinkerer_at.cfg | 36 --- 62 files changed, 2913 deletions(-) delete mode 100644 src/api/java/Zeno410Utils/BlockState.java delete mode 100644 src/api/java/Zeno410Utils/Zeno410Logger.java delete mode 100644 src/api/java/cofh/api/CoFHAPIProps.java delete mode 100644 src/api/java/cofh/api/energy/EnergyStorage.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyConnection.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyContainerItem.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyHandler.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyProvider.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyReceiver.java delete mode 100644 src/api/java/cofh/api/energy/IEnergyStorage.java delete mode 100644 src/api/java/cofh/api/energy/ItemEnergyContainer.java delete mode 100644 src/api/java/cofh/api/energy/TileEnergyHandler.java delete mode 100644 src/api/java/cofh/api/energy/package-info.java delete mode 100644 src/api/java/cofh/api/package-info.java delete mode 100644 src/api/java/cofh/core/item/IEqualityOverrideItem.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/BiomeGenUndergroundBase.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/BlockCodes.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/NamedBlock.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/NamedItem.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/NamedSlabPair.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/NamedVanillaBlock.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/Names.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/NoiseGenerator.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/PerlinNoiseGenerator.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/StrataLayer.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBAPIHook.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBDimensionalStrataColumnProvider.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBIDs.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBOreTexturizer.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBSetProviderRegistry.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBStoneCodes.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumn.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumnProvider.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSet.java delete mode 100644 src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSetProvider.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaBlock.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java delete mode 100644 src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java delete mode 100644 src/api/java/mcp/mobius/waila/api/SpecialChars.java delete mode 100644 src/api/java/mcp/mobius/waila/api/package-info.java delete mode 100644 src/api/java/morph/api/Ability.java delete mode 100644 src/api/java/morph/api/Api.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/HarvestType.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/MobDrop.java delete mode 100644 src/api/java/powercrystals/minefactoryreloaded/api/ValuedItem.java delete mode 100644 src/api/resources/CoFH_at.cfg delete mode 100644 src/api/resources/MFR_at.cfg delete mode 100644 src/api/resources/TConstruct_at.cfg delete mode 100644 src/api/resources/ThaumicTinkerer_at.cfg diff --git a/src/api/java/Zeno410Utils/BlockState.java b/src/api/java/Zeno410Utils/BlockState.java deleted file mode 100644 index 5afd238..0000000 --- a/src/api/java/Zeno410Utils/BlockState.java +++ /dev/null @@ -1,14 +0,0 @@ -package Zeno410Utils; - -import net.minecraft.block.Block; - -public class BlockState { - - public final Block block; - public final int metadata; - - public BlockState(Block block, int metadata) { - this.block = block; - this.metadata = metadata; - } -} diff --git a/src/api/java/Zeno410Utils/Zeno410Logger.java b/src/api/java/Zeno410Utils/Zeno410Logger.java deleted file mode 100644 index ea75b53..0000000 --- a/src/api/java/Zeno410Utils/Zeno410Logger.java +++ /dev/null @@ -1,33 +0,0 @@ -package Zeno410Utils; - -import java.util.logging.FileHandler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; - -public class Zeno410Logger { - - private static FileHandler fileTxt; - private static SimpleFormatter formatterTxt; - public static final boolean suppress = true; - private Logger logger; - - public static void crashIfRecording(RuntimeException toThrow) {} - - public static Logger globalLogger() { - Logger logger = Logger.getLogger("global"); - - logger.setLevel(Level.ALL); - - logger.info("Starting"); - return logger; - } - - public Logger logger() { - return this.logger; - } - - public Zeno410Logger(String name) { - this.logger = Logger.getLogger(name); - } -} diff --git a/src/api/java/cofh/api/CoFHAPIProps.java b/src/api/java/cofh/api/CoFHAPIProps.java deleted file mode 100644 index c32bfde..0000000 --- a/src/api/java/cofh/api/CoFHAPIProps.java +++ /dev/null @@ -1,11 +0,0 @@ -package cofh.api; - -public class CoFHAPIProps { - - private CoFHAPIProps() { - - } - - public static final String VERSION = "1.7.10R1.0.2"; - -} diff --git a/src/api/java/cofh/api/energy/EnergyStorage.java b/src/api/java/cofh/api/energy/EnergyStorage.java deleted file mode 100644 index 697bf3d..0000000 --- a/src/api/java/cofh/api/energy/EnergyStorage.java +++ /dev/null @@ -1,160 +0,0 @@ -package cofh.api.energy; - -import net.minecraft.nbt.NBTTagCompound; - -/** - * Reference implementation of {@link IEnergyStorage}. Use/extend this or implement your own. - * - * @author King Lemming - * - */ -public class EnergyStorage implements IEnergyStorage { - - protected int energy; - protected int capacity; - protected int maxReceive; - protected int maxExtract; - - public EnergyStorage(int capacity) { - - this(capacity, capacity, capacity); - } - - public EnergyStorage(int capacity, int maxTransfer) { - - this(capacity, maxTransfer, maxTransfer); - } - - public EnergyStorage(int capacity, int maxReceive, int maxExtract) { - - this.capacity = capacity; - this.maxReceive = maxReceive; - this.maxExtract = maxExtract; - } - - public EnergyStorage readFromNBT(NBTTagCompound nbt) { - - this.energy = nbt.getInteger("Energy"); - - if (energy > capacity) { - energy = capacity; - } - return this; - } - - public NBTTagCompound writeToNBT(NBTTagCompound nbt) { - - if (energy < 0) { - energy = 0; - } - nbt.setInteger("Energy", energy); - return nbt; - } - - public void setCapacity(int capacity) { - - this.capacity = capacity; - - if (energy > capacity) { - energy = capacity; - } - } - - public void setMaxTransfer(int maxTransfer) { - - setMaxReceive(maxTransfer); - setMaxExtract(maxTransfer); - } - - public void setMaxReceive(int maxReceive) { - - this.maxReceive = maxReceive; - } - - public void setMaxExtract(int maxExtract) { - - this.maxExtract = maxExtract; - } - - public int getMaxReceive() { - - return maxReceive; - } - - public int getMaxExtract() { - - return maxExtract; - } - - /** - * This function is included to allow for server -> client sync. Do not call this externally to the containing - * Tile Entity, as not all IEnergyHandlers - * are guaranteed to have it. - * - * @param energy - */ - public void setEnergyStored(int energy) { - - this.energy = energy; - - if (this.energy > capacity) { - this.energy = capacity; - } else if (this.energy < 0) { - this.energy = 0; - } - } - - /** - * This function is included to allow the containing tile to directly and efficiently modify the energy contained in - * the EnergyStorage. Do not rely on this - * externally, as not all IEnergyHandlers are guaranteed to have it. - * - * @param energy - */ - public void modifyEnergyStored(int energy) { - - this.energy += energy; - - if (this.energy > capacity) { - this.energy = capacity; - } else if (this.energy < 0) { - this.energy = 0; - } - } - - /* IEnergyStorage */ - @Override - public int receiveEnergy(int maxReceive, boolean simulate) { - - int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive)); - - if (!simulate) { - energy += energyReceived; - } - return energyReceived; - } - - @Override - public int extractEnergy(int maxExtract, boolean simulate) { - - int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); - - if (!simulate) { - energy -= energyExtracted; - } - return energyExtracted; - } - - @Override - public int getEnergyStored() { - - return energy; - } - - @Override - public int getMaxEnergyStored() { - - return capacity; - } - -} diff --git a/src/api/java/cofh/api/energy/IEnergyConnection.java b/src/api/java/cofh/api/energy/IEnergyConnection.java deleted file mode 100644 index 3ad83f2..0000000 --- a/src/api/java/cofh/api/energy/IEnergyConnection.java +++ /dev/null @@ -1,22 +0,0 @@ -package cofh.api.energy; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Implement this interface on TileEntities which should connect to energy transportation blocks. This is intended for - * blocks which generate energy but do not - * accept it; otherwise just use IEnergyHandler. - *

    - * Note that {@link IEnergyHandler} is an extension of this. - * - * @author King Lemming - * - */ -public interface IEnergyConnection { - - /** - * Returns TRUE if the TileEntity can connect on a given side. - */ - boolean canConnectEnergy(ForgeDirection from); - -} diff --git a/src/api/java/cofh/api/energy/IEnergyContainerItem.java b/src/api/java/cofh/api/energy/IEnergyContainerItem.java deleted file mode 100644 index 5374506..0000000 --- a/src/api/java/cofh/api/energy/IEnergyContainerItem.java +++ /dev/null @@ -1,54 +0,0 @@ -package cofh.api.energy; - -import net.minecraft.item.ItemStack; - -/** - * Implement this interface on Item classes that support external manipulation of their internal energy storages. - *

    - * A reference implementation is provided {@link ItemEnergyContainer}. - * - * @author King Lemming - * - */ -public interface IEnergyContainerItem { - - /** - * Adds energy to a container item. Returns the quantity of energy that was accepted. This should always return 0 if - * the item cannot be externally charged. - * - * @param container - * ItemStack to be charged. - * @param maxReceive - * Maximum amount of energy to be sent into the item. - * @param simulate - * If TRUE, the charge will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) received by the item. - */ - int receiveEnergy(ItemStack container, int maxReceive, boolean simulate); - - /** - * Removes energy from a container item. Returns the quantity of energy that was removed. This should always return - * 0 if the item cannot be externally - * discharged. - * - * @param container - * ItemStack to be discharged. - * @param maxExtract - * Maximum amount of energy to be extracted from the item. - * @param simulate - * If TRUE, the discharge will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) extracted from the item. - */ - int extractEnergy(ItemStack container, int maxExtract, boolean simulate); - - /** - * Get the amount of energy currently stored in the container item. - */ - int getEnergyStored(ItemStack container); - - /** - * Get the max amount of energy that can be stored in the container item. - */ - int getMaxEnergyStored(ItemStack container); - -} diff --git a/src/api/java/cofh/api/energy/IEnergyHandler.java b/src/api/java/cofh/api/energy/IEnergyHandler.java deleted file mode 100644 index 82945b3..0000000 --- a/src/api/java/cofh/api/energy/IEnergyHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package cofh.api.energy; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Implement this interface on Tile Entities which should handle energy, generally storing it in one or more internal - * {@link IEnergyStorage} objects. - *

    - * A reference implementation is provided {@link TileEnergyHandler}. - * - * @author King Lemming - * - */ -public interface IEnergyHandler extends IEnergyProvider, IEnergyReceiver { - - // merely a convenience interface (remove these methods in 1.8; provided here for back-compat via compiler doing - // things) - - /** - * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. - * - * @param from - * Orientation the energy is received from. - * @param maxReceive - * Maximum amount of energy to receive. - * @param simulate - * If TRUE, the charge will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) received. - */ - @Override - int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); - - /** - * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. - * - * @param from - * Orientation the energy is extracted from. - * @param maxExtract - * Maximum amount of energy to extract. - * @param simulate - * If TRUE, the extraction will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) extracted. - */ - @Override - int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); - - /** - * Returns the amount of energy currently stored. - */ - @Override - int getEnergyStored(ForgeDirection from); - - /** - * Returns the maximum amount of energy that can be stored. - */ - @Override - int getMaxEnergyStored(ForgeDirection from); - -} diff --git a/src/api/java/cofh/api/energy/IEnergyProvider.java b/src/api/java/cofh/api/energy/IEnergyProvider.java deleted file mode 100644 index 22e73d9..0000000 --- a/src/api/java/cofh/api/energy/IEnergyProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package cofh.api.energy; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Implement this interface on Tile Entities which should provide energy, generally storing it in one or more internal - * {@link IEnergyStorage} objects. - *

    - * A reference implementation is provided {@link TileEnergyHandler}. - * - * @author King Lemming - * - */ -public interface IEnergyProvider extends IEnergyConnection { - - /** - * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. - * - * @param from - * Orientation the energy is extracted from. - * @param maxExtract - * Maximum amount of energy to extract. - * @param simulate - * If TRUE, the extraction will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) extracted. - */ - int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); - - /** - * Returns the amount of energy currently stored. - */ - int getEnergyStored(ForgeDirection from); - - /** - * Returns the maximum amount of energy that can be stored. - */ - int getMaxEnergyStored(ForgeDirection from); - -} diff --git a/src/api/java/cofh/api/energy/IEnergyReceiver.java b/src/api/java/cofh/api/energy/IEnergyReceiver.java deleted file mode 100644 index c3901e6..0000000 --- a/src/api/java/cofh/api/energy/IEnergyReceiver.java +++ /dev/null @@ -1,39 +0,0 @@ -package cofh.api.energy; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Implement this interface on Tile Entities which should receive energy, generally storing it in one or more internal - * {@link IEnergyStorage} objects. - *

    - * A reference implementation is provided {@link TileEnergyHandler}. - * - * @author King Lemming - * - */ -public interface IEnergyReceiver extends IEnergyConnection { - - /** - * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. - * - * @param from - * Orientation the energy is received from. - * @param maxReceive - * Maximum amount of energy to receive. - * @param simulate - * If TRUE, the charge will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) received. - */ - int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); - - /** - * Returns the amount of energy currently stored. - */ - int getEnergyStored(ForgeDirection from); - - /** - * Returns the maximum amount of energy that can be stored. - */ - int getMaxEnergyStored(ForgeDirection from); - -} diff --git a/src/api/java/cofh/api/energy/IEnergyStorage.java b/src/api/java/cofh/api/energy/IEnergyStorage.java deleted file mode 100644 index 94529e5..0000000 --- a/src/api/java/cofh/api/energy/IEnergyStorage.java +++ /dev/null @@ -1,46 +0,0 @@ -package cofh.api.energy; - -/** - * An energy storage is the unit of interaction with Energy inventories.
    - * This is not to be implemented on TileEntities. This is for internal use only. - *

    - * A reference implementation can be found at {@link EnergyStorage}. - * - * @author King Lemming - * - */ -public interface IEnergyStorage { - - /** - * Adds energy to the storage. Returns quantity of energy that was accepted. - * - * @param maxReceive - * Maximum amount of energy to be inserted. - * @param simulate - * If TRUE, the insertion will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) accepted by the storage. - */ - int receiveEnergy(int maxReceive, boolean simulate); - - /** - * Removes energy from the storage. Returns quantity of energy that was removed. - * - * @param maxExtract - * Maximum amount of energy to be extracted. - * @param simulate - * If TRUE, the extraction will only be simulated. - * @return Amount of energy that was (or would have been, if simulated) extracted from the storage. - */ - int extractEnergy(int maxExtract, boolean simulate); - - /** - * Returns the amount of energy currently stored. - */ - int getEnergyStored(); - - /** - * Returns the maximum amount of energy that can be stored. - */ - int getMaxEnergyStored(); - -} diff --git a/src/api/java/cofh/api/energy/ItemEnergyContainer.java b/src/api/java/cofh/api/energy/ItemEnergyContainer.java deleted file mode 100644 index 3a95748..0000000 --- a/src/api/java/cofh/api/energy/ItemEnergyContainer.java +++ /dev/null @@ -1,110 +0,0 @@ -package cofh.api.energy; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -/** - * Reference implementation of {@link IEnergyContainerItem}. Use/extend this or implement your own. - * - * @author King Lemming - * - */ -public class ItemEnergyContainer extends Item implements IEnergyContainerItem { - - protected int capacity; - protected int maxReceive; - protected int maxExtract; - - public ItemEnergyContainer() { - - } - - public ItemEnergyContainer(int capacity) { - - this(capacity, capacity, capacity); - } - - public ItemEnergyContainer(int capacity, int maxTransfer) { - - this(capacity, maxTransfer, maxTransfer); - } - - public ItemEnergyContainer(int capacity, int maxReceive, int maxExtract) { - - this.capacity = capacity; - this.maxReceive = maxReceive; - this.maxExtract = maxExtract; - } - - public ItemEnergyContainer setCapacity(int capacity) { - - this.capacity = capacity; - return this; - } - - public void setMaxTransfer(int maxTransfer) { - - setMaxReceive(maxTransfer); - setMaxExtract(maxTransfer); - } - - public void setMaxReceive(int maxReceive) { - - this.maxReceive = maxReceive; - } - - public void setMaxExtract(int maxExtract) { - - this.maxExtract = maxExtract; - } - - /* IEnergyContainerItem */ - @Override - public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) { - - if (container.stackTagCompound == null) { - container.stackTagCompound = new NBTTagCompound(); - } - int energy = container.stackTagCompound.getInteger("Energy"); - int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive)); - - if (!simulate) { - energy += energyReceived; - container.stackTagCompound.setInteger("Energy", energy); - } - return energyReceived; - } - - @Override - public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) { - - if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Energy")) { - return 0; - } - int energy = container.stackTagCompound.getInteger("Energy"); - int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); - - if (!simulate) { - energy -= energyExtracted; - container.stackTagCompound.setInteger("Energy", energy); - } - return energyExtracted; - } - - @Override - public int getEnergyStored(ItemStack container) { - - if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Energy")) { - return 0; - } - return container.stackTagCompound.getInteger("Energy"); - } - - @Override - public int getMaxEnergyStored(ItemStack container) { - - return capacity; - } - -} diff --git a/src/api/java/cofh/api/energy/TileEnergyHandler.java b/src/api/java/cofh/api/energy/TileEnergyHandler.java deleted file mode 100644 index e37fe7f..0000000 --- a/src/api/java/cofh/api/energy/TileEnergyHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -package cofh.api.energy; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Reference implementation of {@link IEnergyHandler}. Use/extend this or implement your own. - * - * @author King Lemming - * - */ -public class TileEnergyHandler extends TileEntity implements IEnergyHandler { - - protected EnergyStorage storage = new EnergyStorage(32000); - - @Override - public void readFromNBT(NBTTagCompound nbt) { - - super.readFromNBT(nbt); - storage.readFromNBT(nbt); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - - super.writeToNBT(nbt); - storage.writeToNBT(nbt); - } - - /* IEnergyConnection */ - @Override - public boolean canConnectEnergy(ForgeDirection from) { - - return true; - } - - /* IEnergyReceiver */ - @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { - - return storage.receiveEnergy(maxReceive, simulate); - } - - /* IEnergyProvider */ - @Override - public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { - - return storage.extractEnergy(maxExtract, simulate); - } - - /* IEnergyReceiver and IEnergyProvider */ - @Override - public int getEnergyStored(ForgeDirection from) { - - return storage.getEnergyStored(); - } - - @Override - public int getMaxEnergyStored(ForgeDirection from) { - - return storage.getMaxEnergyStored(); - } - -} diff --git a/src/api/java/cofh/api/energy/package-info.java b/src/api/java/cofh/api/energy/package-info.java deleted file mode 100644 index 921f109..0000000 --- a/src/api/java/cofh/api/energy/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * (C) 2014 Team CoFH / CoFH / Cult of the Full Hub - * http://www.teamcofh.com - */ -@API(apiVersion = CoFHAPIProps.VERSION, owner = "CoFHAPI", provides = "CoFHAPI|energy") -package cofh.api.energy; - -import cofh.api.CoFHAPIProps; -import cpw.mods.fml.common.API; diff --git a/src/api/java/cofh/api/package-info.java b/src/api/java/cofh/api/package-info.java deleted file mode 100644 index 22f29a0..0000000 --- a/src/api/java/cofh/api/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * (C) 2014 Team CoFH / CoFH / Cult of the Full Hub - * http://www.teamcofh.com - */ -@API(apiVersion = CoFHAPIProps.VERSION, owner = "CoFHLib", provides = "CoFHAPI") -package cofh.api; - -import cpw.mods.fml.common.API; diff --git a/src/api/java/cofh/core/item/IEqualityOverrideItem.java b/src/api/java/cofh/core/item/IEqualityOverrideItem.java deleted file mode 100644 index 5144cb0..0000000 --- a/src/api/java/cofh/core/item/IEqualityOverrideItem.java +++ /dev/null @@ -1,9 +0,0 @@ -package cofh.core.item; - -import net.minecraft.item.ItemStack; - -public interface IEqualityOverrideItem { - - public boolean isLastHeldItemEqual(ItemStack current, ItemStack previous); - -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/BiomeGenUndergroundBase.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/BiomeGenUndergroundBase.java deleted file mode 100644 index 71a311c..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/BiomeGenUndergroundBase.java +++ /dev/null @@ -1,47 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public class BiomeGenUndergroundBase { - - public String biomeName = ""; - public final int biomeID; - public boolean hasStrata = false; - public StrataLayer[] strata; - public final PerlinNoiseGenerator strataNoise; - public final UBStoneCodes fillerBlockCodes; - - public BiomeGenUndergroundBase(int ID, NamedBlock filler, int metadataValue, BiomeGenUndergroundBase[] biomeList) { - this.biomeID = ID; - this.fillerBlockCodes = new UBStoneCodes(filler, metadataValue); - this.strataNoise = new PerlinNoiseGenerator(1L); - biomeList[ID] = this; - } - - public BiomeGenUndergroundBase(int ID, NamedBlock filler, int metadataValue, BiomeGenUndergroundBase[] biomeList, - StrataLayer[] strataLayers) { - this.biomeID = ID; - this.fillerBlockCodes = new UBStoneCodes(filler, metadataValue); - this.strataNoise = new PerlinNoiseGenerator(1L); - biomeList[ID] = this; - AddStrataLayers(strataLayers); - } - - public BiomeGenUndergroundBase AddStrataLayers(StrataLayer[] strata) { - this.hasStrata = true; - this.strata = strata; - return this; - } - - public UBStoneCodes getStrataBlockAtLayer(int y) { - for (int i = 0; i < this.strata.length; i++) { - if (this.strata[i].valueIsInLayer(y) == true) { - return this.strata[i].codes; - } - } - return this.fillerBlockCodes; - } - - public BiomeGenUndergroundBase setName(String name) { - this.biomeName = name; - return this; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/BlockCodes.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/BlockCodes.java deleted file mode 100644 index a580d36..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/BlockCodes.java +++ /dev/null @@ -1,48 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.block.Block; - -import Zeno410Utils.BlockState; - -public class BlockCodes extends BlockState { - - public final NamedBlock name; - public final BlockCodes onDrop; - private final int metadataHashcode; - - public BlockCodes(Block block, int metadata) { - super(block, metadata); - this.name = null; - this.onDrop = this; - this.metadataHashcode = new Integer(metadata).hashCode(); - } - - public BlockCodes(NamedBlock namer, int metadata) { - super(namer.block(), metadata); - this.name = namer; - if (this.block == null) { - throw new RuntimeException("couldn't find block for " + namer.internal()); - } - this.onDrop = this; - this.metadataHashcode = new Integer(metadata).hashCode(); - } - - public BlockCodes(NamedBlock namer, int metadata, BlockCodes onDrop) { - super(namer.block(), metadata); - this.name = namer; - this.onDrop = onDrop; - this.metadataHashcode = new Integer(metadata).hashCode(); - } - - public int hashcode() { - return this.block.hashCode() + this.metadataHashcode; - } - - public boolean equals(Object compared) { - if ((compared instanceof BlockCodes)) { - BlockCodes comparedCodes = (BlockCodes) compared; - if ((this.block == comparedCodes.block) && (this.metadata == comparedCodes.metadata)) return true; - } - return false; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedBlock.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedBlock.java deleted file mode 100644 index 26d75d8..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedBlock.java +++ /dev/null @@ -1,67 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; - -import cpw.mods.fml.common.registry.GameRegistry; - -public class NamedBlock extends Names { - - protected int id; - public Block block; - public static final String modid = "undergroundBiomes"; - - public NamedBlock(String internalName) { - super(internalName); - } - - public void gameRegister(Block _block, Class itemClass) { - this.block = _block; - GameRegistry.registerBlock(this.block, itemClass, internal()); - } - - public void register(int _id, Block _block) { - if (this.block != null) { - throw duplicateRegistry(); - } - - reRegister(_id, _block); - } - - public void reRegister(int _id, Block _block) { - this.id = _id; - this.block = _block; - this.block.setBlockName(external()); - Block current = Block.getBlockById(_id); - if (current != this.block) { - if (current != null) { - throw new RuntimeException(internal() + " has been replaced by " + current.toString()); - } - Block.blockRegistry.addObject(this.id, internal(), _block); - } - } - - public Block block() { - return this.block; - } - - public boolean matches(Item compared) { - if ((compared instanceof ItemBlock)) { - return ((ItemBlock) compared).field_150939_a.equals(this.block); - } - return false; - } - - public boolean matches(Block compared) { - return compared.equals(block()); - } - - public int ID() { - return Block.getIdFromBlock(block()); - } - - public Item matchingItem(Block block) { - return Item.getItemById(Block.getIdFromBlock(block)); - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedItem.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedItem.java deleted file mode 100644 index f7aa3c0..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedItem.java +++ /dev/null @@ -1,62 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import java.util.Iterator; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.Item; -import net.minecraft.util.IIcon; - -public class NamedItem extends Names { - - protected int id; - protected Item item; - - public NamedItem(String internalName) { - super(internalName); - } - - public NamedItem(NamedBlock block) { - this(block.internal()); - } - - public void register(int _id, Item _item) { - reRegister(_id, _item); - } - - public void reRegister(int _id, Item _item) { - this.id = _id; - this.item = _item; - Item current = Item.getItemById(_id); - if (current != _item) Item.itemRegistry.addObject(_id, internal(), _item); - } - - public Item cachedItem() { - if (this.item == null) { - this.item = ((Item) Item.itemRegistry.getObject(external())); - if (this.item == null) throw new RuntimeException(internal() + " has no item"); - } - return this.item; - } - - public Item registeredItem() { - Item result = (Item) Item.itemRegistry.getObject(internal()); - if (result == null) { - result = (Item) Item.itemRegistry.getObject(external()); - if (result == null) { - Object key; - for (Iterator i$ = Item.itemRegistry.getKeys() - .iterator(); i$.hasNext(); key = i$.next()); - throw new RuntimeException(); - } - } - return result; - } - - public IIcon registerIcons(IIconRegister iconRegister) { - return iconRegister.registerIcon(external()); - } - - public boolean matches(Item matched) { - return this.item.equals(matched); - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedSlabPair.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedSlabPair.java deleted file mode 100644 index 21a579d..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedSlabPair.java +++ /dev/null @@ -1,34 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import java.util.logging.Logger; - -import net.minecraft.block.Block; - -import Zeno410Utils.Zeno410Logger; - -public class NamedSlabPair { - - public static final Logger logger = new Zeno410Logger("NamedSlabPair").logger(); - public final NamedBlock half; - public final NamedBlock full; - - public NamedSlabPair(NamedBlock material) { - this.half = new NamedSlab(material.internal() + "HalfSlab"); - this.full = new NamedSlab(material.internal() + "FullSlab"); - } - - public static class NamedSlab extends NamedBlock { - - public NamedSlab(String name) { - super(name); - } - - public Block block() { - Block result = Block.getBlockFromName(internal()); - if (result == null) { - result = Block.getBlockFromName(external()); - } - return result; - } - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedVanillaBlock.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedVanillaBlock.java deleted file mode 100644 index f8eb970..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/NamedVanillaBlock.java +++ /dev/null @@ -1,48 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; - -public class NamedVanillaBlock extends NamedBlock { - - public static final NamedBlock cobblestone = new NamedVanillaBlock(Blocks.cobblestone); - public static final NamedBlock cobblestone_wall = new NamedVanillaBlock(Blocks.cobblestone_wall); - public static final NamedBlock dispenser = new NamedVanillaBlock(Blocks.dispenser); - public static final NamedBlock furnace = new NamedVanillaBlock(Blocks.furnace); - - public static final NamedBlock lever = new NamedVanillaBlock(Blocks.lever); - public static final NamedBlock piston = new NamedVanillaBlock(Blocks.piston); - public static final NamedBlock planks = new NamedVanillaBlock(Blocks.planks); - public static final NamedBlock stone_pressure_plate = new NamedVanillaBlock(Blocks.stone_pressure_plate); - - public static final NamedBlock sand = new NamedVanillaBlock(Blocks.sand); - public static final NamedBlock sandstone = new NamedVanillaBlock(Blocks.sandstone); - public static final NamedBlock smoothSandstone = new NamedVanillaBlock(Blocks.sandstone); - public static final NamedBlock stairsCobblestone = new NamedVanillaBlock(Blocks.stone_stairs); - public static final NamedBlock stairsStoneBrick = new NamedVanillaBlock(Blocks.stone_brick_stairs); - public static final NamedBlock stone = new NamedVanillaBlock(Blocks.stone); - public static final NamedBlock stoneBrick = new NamedVanillaBlock(Blocks.stonebrick); - public static final NamedBlock stoneButton = new NamedVanillaBlock(Blocks.stone_button); - public static final NamedBlock stoneSingleSlab = new NamedVanillaBlock(Blocks.stone_slab); - public static final NamedBlock torchRedstoneActive = new NamedVanillaBlock(Blocks.redstone_torch); - - public NamedVanillaBlock(String name) { - super(name); - this.id = UBIDs.blockID(name); - this.block = UBIDs.blockNamed(name); - } - - public NamedVanillaBlock(Block _block) { - super(_block.getUnlocalizedName()); - this.id = Block.getIdFromBlock(_block); - this.block = _block; - } - - public Block block() { - if (this.block == null) { - this.block = UBIDs.blockNamed(internal()); - } - - return this.block; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/Names.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/Names.java deleted file mode 100644 index e948968..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/Names.java +++ /dev/null @@ -1,30 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public class Names { - - private final String internal; - - public Names(String internalName) { - this.internal = internalName; - } - - public final String internal() { - return this.internal; - } - - public final String external() { - return UBIDs.publicName(this.internal); - } - - public final String iconName() { - return UBIDs.iconName(this.internal); - } - - public final RuntimeException duplicateRegistry() { - return new RuntimeException("duplication registry for Block " + external()); - } - - public String toString() { - return external(); - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/NoiseGenerator.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/NoiseGenerator.java deleted file mode 100644 index e559feb..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/NoiseGenerator.java +++ /dev/null @@ -1,79 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract class NoiseGenerator { - - protected final int[] perm = new int[512]; - protected double offsetX; - protected double offsetY; - protected double offsetZ; - - public static int floor(double x) { - return x >= 0.0D ? (int) x : (int) x - 1; - } - - protected static double fade(double x) { - return x * x * x * (x * (x * 6.0D - 15.0D) + 10.0D); - } - - protected static double lerp(double x, double y, double z) { - return y + x * (z - y); - } - - protected static double grad(int hash, double x, double y, double z) { - hash &= 15; - double u = hash < 8 ? x : y; - double v = (hash == 12) || (hash == 14) ? x : hash < 4 ? y : z; - return ((hash & 0x1) == 0 ? u : -u) + ((hash & 0x2) == 0 ? v : -v); - } - - public double noise(double x) { - return noise(x, 0.0D, 0.0D); - } - - public double noise(double x, double y) { - return noise(x, y, 0.0D); - } - - public abstract double noise(double paramDouble1, double paramDouble2, double paramDouble3); - - public double noise(double x, int octaves, double frequency, double amplitude) { - return noise(x, 0.0D, 0.0D, octaves, frequency, amplitude); - } - - public double noise(double x, int octaves, double frequency, double amplitude, boolean normalized) { - return noise(x, 0.0D, 0.0D, octaves, frequency, amplitude, normalized); - } - - public double noise(double x, double y, int octaves, double frequency, double amplitude) { - return noise(x, y, 0.0D, octaves, frequency, amplitude); - } - - public double noise(double x, double y, int octaves, double frequency, double amplitude, boolean normalized) { - return noise(x, y, 0.0D, octaves, frequency, amplitude, normalized); - } - - public double noise(double x, double y, double z, int octaves, double frequency, double amplitude) { - return noise(x, y, z, octaves, frequency, amplitude, false); - } - - public double noise(double x, double y, double z, int octaves, double frequency, double amplitude, - boolean normalized) { - double result = 0.0D; - double amp = 1.0D; - double freq = 1.0D; - double max = 0.0D; - - for (int i = 0; i < octaves; i++) { - result += noise(x * freq, y * freq, z * freq) * amp; - max += amp; - freq *= frequency; - amp *= amplitude; - } - - if (normalized) { - result /= max; - } - - return result; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/PerlinNoiseGenerator.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/PerlinNoiseGenerator.java deleted file mode 100644 index 8692abf..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/PerlinNoiseGenerator.java +++ /dev/null @@ -1,121 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import java.util.Random; - -public class PerlinNoiseGenerator extends NoiseGenerator { - - protected static final int[][] grad3 = { { 1, 1, 0 }, { -1, 1, 0 }, { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, - { -1, 0, 1 }, { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, { 0, 1, -1 }, { 0, -1, -1 } }; - - private static final PerlinNoiseGenerator instance = new PerlinNoiseGenerator(); - - protected PerlinNoiseGenerator() { - int[] p = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, - 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, - 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, - 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, - 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, - 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, - 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, - 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, - 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, - 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, - 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; - - for (int i = 0; i < 512; i++) this.perm[i] = p[(i & 0xFF)]; - } - - public PerlinNoiseGenerator(long seed) { - this(new Random(seed)); - } - - public PerlinNoiseGenerator(Random rand) { - this.offsetX = (rand.nextDouble() * 256.0D); - this.offsetY = (rand.nextDouble() * 256.0D); - this.offsetZ = (rand.nextDouble() * 256.0D); - - for (int i = 0; i < 256; i++) { - this.perm[i] = rand.nextInt(256); - } - - for (int i = 0; i < 256; i++) { - int pos = rand.nextInt(256 - i) + i; - int old = this.perm[i]; - - this.perm[i] = this.perm[pos]; - this.perm[pos] = old; - this.perm[(i + 256)] = this.perm[i]; - } - } - - public static double getNoise(double x) { - return instance.noise(x); - } - - public static double getNoise(double x, double y) { - return instance.noise(x, y); - } - - public static double getNoise(double x, double y, double z) { - return instance.noise(x, y, z); - } - - public static PerlinNoiseGenerator getInstance() { - return instance; - } - - public double noise(double x, double y, double z) { - x += this.offsetX; - y += this.offsetY; - z += this.offsetZ; - - int floorX = floor(x); - int floorY = floor(y); - int floorZ = floor(z); - - int X = floorX & 0xFF; - int Y = floorY & 0xFF; - int Z = floorZ & 0xFF; - - x -= floorX; - y -= floorY; - z -= floorZ; - - double fX = fade(x); - double fY = fade(y); - double fZ = fade(z); - - int A = this.perm[X] + Y; - int AA = this.perm[A] + Z; - int AB = this.perm[(A + 1)] + Z; - int B = this.perm[(X + 1)] + Y; - int BA = this.perm[B] + Z; - int BB = this.perm[(B + 1)] + Z; - - return lerp( - fZ, - lerp( - fY, - lerp(fX, grad(this.perm[AA], x, y, z), grad(this.perm[BA], x - 1.0D, y, z)), - lerp(fX, grad(this.perm[AB], x, y - 1.0D, z), grad(this.perm[BB], x - 1.0D, y - 1.0D, z))), - lerp( - fY, - lerp(fX, grad(this.perm[(AA + 1)], x, y, z - 1.0D), grad(this.perm[(BA + 1)], x - 1.0D, y, z - 1.0D)), - lerp( - fX, - grad(this.perm[(AB + 1)], x, y - 1.0D, z - 1.0D), - grad(this.perm[(BB + 1)], x - 1.0D, y - 1.0D, z - 1.0D)))); - } - - public static double getNoise(double x, int octaves, double frequency, double amplitude) { - return instance.noise(x, octaves, frequency, amplitude); - } - - public static double getNoise(double x, double y, int octaves, double frequency, double amplitude) { - return instance.noise(x, y, octaves, frequency, amplitude); - } - - public static double getNoise(double x, double y, double z, int octaves, double frequency, double amplitude) { - return instance.noise(x, y, z, octaves, frequency, amplitude); - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/StrataLayer.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/StrataLayer.java deleted file mode 100644 index 51990c0..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/StrataLayer.java +++ /dev/null @@ -1,25 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public class StrataLayer { - - public final NamedBlock layerBlock; - public final int layerMetadataID; - public final int layerMin; - public final int layerMax; - public final UBStoneCodes codes; - - public StrataLayer(NamedBlock layerBlock, int layerMetadataID, int layerMin, int layerMax) { - this.layerBlock = layerBlock; - this.layerMetadataID = layerMetadataID; - this.layerMin = layerMin; - this.layerMax = layerMax; - this.codes = new UBStoneCodes(layerBlock, layerMetadataID); - } - - public boolean valueIsInLayer(int y) { - if ((y >= this.layerMin) && (y <= this.layerMax)) { - return true; - } - return false; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBAPIHook.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBAPIHook.java deleted file mode 100644 index e8af93b..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBAPIHook.java +++ /dev/null @@ -1,9 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public class UBAPIHook { - - public static final UBAPIHook ubAPIHook = new UBAPIHook(); - public UBDimensionalStrataColumnProvider dimensionalStrataColumnProvider; - public UBOreTexturizer ubOreTexturizer; - public UBSetProviderRegistry ubSetProviderRegistry; -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBDimensionalStrataColumnProvider.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBDimensionalStrataColumnProvider.java deleted file mode 100644 index cc1594e..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBDimensionalStrataColumnProvider.java +++ /dev/null @@ -1,6 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract interface UBDimensionalStrataColumnProvider { - - public abstract UBStrataColumnProvider ubStrataColumnProvider(int paramInt); -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBIDs.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBIDs.java deleted file mode 100644 index 273b2f0..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBIDs.java +++ /dev/null @@ -1,99 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; - -public class UBIDs { - - public static final int version = 3; - public static final NamedBlock igneousStoneName = new NamedBlock("igneousStone"); - public static final NamedBlock igneousCobblestoneName = new NamedBlock("igneousCobblestone"); - public static final NamedBlock igneousStoneBrickName = new NamedBlock("igneousStoneBrick"); - public static final NamedBlock metamorphicStoneName = new NamedBlock("metamorphicStone"); - public static final NamedBlock metamorphicCobblestoneName = new NamedBlock("metamorphicCobblestone"); - public static final NamedBlock metamorphicStoneBrickName = new NamedBlock("metamorphicStoneBrick"); - public static final NamedBlock sedimentaryStoneName = new NamedBlock("sedimentaryStone"); - - public static final NamedItem ligniteCoalName = new NamedItem("ligniteCoal"); - public static final NamedItem fossilPieceName = new NamedItem("fossilPiece"); - - public static final NamedSlabPair igneousBrickSlabName = new NamedSlabPair(igneousStoneBrickName); - public static final NamedSlabPair metamorphicBrickSlabName = new NamedSlabPair(metamorphicStoneBrickName); - public static final NamedSlabPair igneousStoneSlabName = new NamedSlabPair(igneousStoneName); - public static final NamedSlabPair metamorphicStoneSlabName = new NamedSlabPair(metamorphicStoneName); - public static final NamedSlabPair igneousCobblestoneSlabName = new NamedSlabPair(igneousCobblestoneName); - public static final NamedSlabPair metamorphicCobblestoneSlabName = new NamedSlabPair(metamorphicCobblestoneName); - public static final NamedSlabPair sedimentaryStoneSlabName = new NamedSlabPair(sedimentaryStoneName); - - public static final NamedBlock UBButtonName = new NamedBlock("button"); - public static final NamedBlock UBStairsName = new NamedBlock("stairs"); - public static final NamedBlock UBWallsName = new NamedBlock("wall"); - public static final NamedItem UBButtonItemName = new NamedItem(UBButtonName); - public static final NamedItem UBStairsItemName = new NamedItem(UBStairsName); - public static final NamedItem UBWallsItemName = new NamedItem(UBWallsName); - public static final NamedBlock IconTrap = new NamedBlock("iconTrap"); - - public static final String ubPrefix() { - return "UndergroundBiomes:"; - } - - public static final String ubIconPrefix() { - return "undergroundbiomes:"; - } - - public static String publicName(String inModName) { - if (inModName.contains(ubPrefix())) return inModName; - return ubPrefix() + inModName; - } - - public static String iconName(String inModName) { - if (inModName.contains(ubIconPrefix())) return inModName; - return ubIconPrefix() + inModName; - } - - public static Item itemNamed(String name) { - return (Item) Item.itemRegistry.getObject(name); - } - - public static Block blockNamed(String name) { - return Block.getBlockFromName(name); - } - - public static int itemID(String name) { - return Item.getIdFromItem(itemNamed(name)); - } - - public static int blockID(String name) { - return Block.getIdFromBlock(Block.getBlockFromName(name)); - } - - public static NamedBlock slabVersionID(NamedBlock ubStone) { - if (ubStone == igneousStoneName) return igneousStoneSlabName.half; - if (ubStone == igneousCobblestoneName) return igneousCobblestoneSlabName.half; - if (ubStone == igneousStoneBrickName) return igneousBrickSlabName.half; - if (ubStone == metamorphicStoneName) return metamorphicStoneSlabName.half; - if (ubStone == metamorphicCobblestoneName) return metamorphicCobblestoneSlabName.half; - if (ubStone == metamorphicStoneBrickName) return metamorphicBrickSlabName.half; - if (ubStone == sedimentaryStoneName) return sedimentaryStoneSlabName.half; - if (ubStone == NamedVanillaBlock.sandstone) return NamedVanillaBlock.stoneSingleSlab; - if (ubStone == NamedVanillaBlock.stone) return NamedVanillaBlock.stoneSingleSlab; - if (ubStone == NamedVanillaBlock.cobblestone) return NamedVanillaBlock.stoneSingleSlab; - if (ubStone == NamedVanillaBlock.sand) return NamedVanillaBlock.stoneSingleSlab; - throw new RuntimeException("" + ubStone + " is not not usable as an Underground Biomes stone code"); - } - - public static NamedBlock brickVersionID(NamedBlock ubStone) { - if (ubStone == igneousStoneName) return igneousStoneBrickName; - if (ubStone == igneousCobblestoneName) return igneousStoneBrickName; - if (ubStone == igneousStoneBrickName) return igneousStoneBrickName; - if (ubStone == metamorphicStoneName) return metamorphicStoneBrickName; - if (ubStone == metamorphicCobblestoneName) return metamorphicStoneBrickName; - if (ubStone == metamorphicStoneBrickName) return metamorphicStoneBrickName; - if (ubStone == sedimentaryStoneName) return sedimentaryStoneName; - if (ubStone == NamedVanillaBlock.sandstone) return NamedVanillaBlock.smoothSandstone; - if (ubStone == NamedVanillaBlock.stone) return NamedVanillaBlock.stoneBrick; - if (ubStone == NamedVanillaBlock.cobblestone) return NamedVanillaBlock.stoneBrick; - if (ubStone == NamedVanillaBlock.sand) return NamedVanillaBlock.sandstone; - throw new RuntimeException("" + ubStone + " is not usable as an Underground Biomes stone code"); - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBOreTexturizer.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBOreTexturizer.java deleted file mode 100644 index c39b65d..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBOreTexturizer.java +++ /dev/null @@ -1,70 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.block.Block; -import net.minecraft.world.World; - -import cpw.mods.fml.common.event.FMLPreInitializationEvent; - -public abstract interface UBOreTexturizer { - - public static final String amber_overlay = "undergroundbiomes:amber_overlay"; - public static final String cinnabar_overlay = "undergroundbiomes:cinnabar_overlay"; - public static final String coal_overlay = "undergroundbiomes:coal_overlay"; - public static final String copper_overlay = "undergroundbiomes:copper_overlay"; - public static final String diamond_overlay = "undergroundbiomes:diamond_overlay"; - public static final String emerald_overlay = "undergroundbiomes:emerald_overlay"; - public static final String gold_overlay = "undergroundbiomes:gold_overlay"; - public static final String iron_overlay = "undergroundbiomes:iron_overlay"; - public static final String lapis_overlay = "undergroundbiomes:lapis_overlay"; - public static final String lead_overlay = "undergroundbiomes:lead_overlay"; - public static final String olivine_peridot_overlay = "undergroundbiomes:olivine-peridot_overlay"; - public static final String redstone_overlay = "undergroundbiomes:redstone_overlay"; - public static final String ruby_overlay = "undergroundbiomes:ruby_overlay"; - public static final String sapphire_overlay = "undergroundbiomes:sapphire_overlay"; - public static final String tin_overlay = "undergroundbiomes:tin_overlay"; - public static final String uranium_overlay = "undergroundbiomes:uranium_overlay"; - - public abstract void setupUBOre(Block paramBlock, String paramString, - FMLPreInitializationEvent paramFMLPreInitializationEvent); - - @Deprecated - public abstract void setupUBOre(Block paramBlock, int paramInt, String paramString, - FMLPreInitializationEvent paramFMLPreInitializationEvent); - - public abstract void setupUBOre(Block paramBlock, int paramInt, String paramString1, String paramString2, - FMLPreInitializationEvent paramFMLPreInitializationEvent); - - public abstract void requestUBOreSetup(Block paramBlock, String paramString) - throws UBOreTexturizer.BlocksAreAlreadySet; - - @Deprecated - public abstract void requestUBOreSetup(Block paramBlock, int paramInt, String paramString) - throws UBOreTexturizer.BlocksAreAlreadySet; - - public abstract void requestUBOreSetup(Block paramBlock, int paramInt, String paramString1, String paramString2) - throws UBOreTexturizer.BlocksAreAlreadySet; - - public abstract void redoOres(int paramInt1, int paramInt2, World paramWorld); - - public static class BlocksAreAlreadySet extends RuntimeException { - - public final Block oreBlock; - public final String overlayName; - - public BlocksAreAlreadySet(Block oreBlock, String overlayName) { - this.oreBlock = oreBlock; - this.overlayName = overlayName; - } - - public String toString() { - String blockDescription = "undefined block"; - String overlayDescription = "undefined overlay"; - if (this.oreBlock != null) blockDescription = this.oreBlock.getUnlocalizedName(); - if (this.overlayName != null) overlayDescription = this.overlayName; - return "Attempt to create Underground Biomes ore for " + blockDescription - + " with " - + overlayDescription - + " after blocks have already been defined"; - } - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBSetProviderRegistry.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBSetProviderRegistry.java deleted file mode 100644 index 96cd88a..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBSetProviderRegistry.java +++ /dev/null @@ -1,6 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract interface UBSetProviderRegistry { - - public abstract void register(UndergroundBiomeSetProvider paramUndergroundBiomeSetProvider); -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStoneCodes.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStoneCodes.java deleted file mode 100644 index 1a8e68a..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStoneCodes.java +++ /dev/null @@ -1,92 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public class UBStoneCodes extends BlockCodes { - - public UBStoneCodes(NamedBlock name, int _metadata) { - super(name, _metadata, cobbleVersion(name, _metadata)); - } - - public final UBStoneCodes slabVersionEquivalent() { - return new UBStoneCodes(UBIDs.slabVersionID(this.name), this.metadata); - } - - public final UBStoneCodes brickVersionEquivalent() { - return new UBStoneCodes(UBIDs.brickVersionID(this.name), this.metadata); - } - - public static BlockCodes cobbleVersion(NamedBlock name, int metadata) { - if (name == UBIDs.igneousStoneName) { - return new BlockCodes(UBIDs.igneousCobblestoneName, metadata); - } - if (name == UBIDs.metamorphicStoneName) { - return new BlockCodes(UBIDs.metamorphicCobblestoneName, metadata); - } - if (name == UBIDs.sedimentaryStoneName) { - return new BlockCodes(UBIDs.sedimentaryStoneName, metadata); - } - - if ((name == NamedVanillaBlock.stone) && (metadata == 0)) { - return new BlockCodes(NamedVanillaBlock.cobblestone, metadata); - } - - if ((name == NamedVanillaBlock.sandstone) && (metadata == 0)) { - return new BlockCodes(NamedVanillaBlock.sandstone, metadata); - } - - if ((name == NamedVanillaBlock.sand) && (metadata == 0)) { - return new BlockCodes(NamedVanillaBlock.sandstone, metadata); - } - - if (name == UBIDs.igneousCobblestoneName) { - return new BlockCodes(UBIDs.igneousCobblestoneName, metadata); - } - if (name == UBIDs.metamorphicCobblestoneName) { - return new BlockCodes(UBIDs.metamorphicCobblestoneName, metadata); - } - - if (name == UBIDs.igneousStoneBrickName) { - return new BlockCodes(UBIDs.igneousStoneBrickName, metadata); - } - if (name == UBIDs.metamorphicStoneBrickName) { - return new BlockCodes(UBIDs.metamorphicStoneBrickName, metadata); - } - - if (name == UBIDs.igneousStoneSlabName.half) { - return new BlockCodes(UBIDs.igneousCobblestoneSlabName.half, metadata); - } - if (name == UBIDs.metamorphicStoneSlabName.half) { - return new BlockCodes(UBIDs.metamorphicCobblestoneSlabName.half, metadata); - } - if (name == UBIDs.sedimentaryStoneSlabName.half) { - return new BlockCodes(UBIDs.sedimentaryStoneSlabName.half, metadata); - } - - if (name == UBIDs.igneousCobblestoneSlabName.half) { - return new BlockCodes(UBIDs.igneousCobblestoneSlabName.half, metadata); - } - if (name == UBIDs.metamorphicCobblestoneSlabName.half) { - return new BlockCodes(UBIDs.metamorphicCobblestoneSlabName.half, metadata); - } - - if (name == UBIDs.igneousBrickSlabName.half) { - return new BlockCodes(UBIDs.igneousBrickSlabName.half, metadata); - } - if (name == UBIDs.metamorphicBrickSlabName.half) { - return new BlockCodes(UBIDs.metamorphicBrickSlabName.half, metadata); - } - - if (name == NamedVanillaBlock.stoneBrick) { - return new BlockCodes(NamedVanillaBlock.stoneBrick, metadata); - } - - if (name == NamedVanillaBlock.stoneSingleSlab) { - return new BlockCodes(NamedVanillaBlock.stoneSingleSlab, metadata); - } - - return new BlockCodes(NamedVanillaBlock.cobblestone, metadata); - } - - public final BlockCodes cobblestoneEquivalent() { - return this.onDrop; - } -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumn.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumn.java deleted file mode 100644 index fa4706a..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumn.java +++ /dev/null @@ -1,12 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract interface UBStrataColumn { - - public abstract BlockCodes stone(int paramInt); - - public abstract BlockCodes cobblestone(int paramInt); - - public abstract BlockCodes stone(); - - public abstract BlockCodes cobblestone(); -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumnProvider.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumnProvider.java deleted file mode 100644 index c816437..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UBStrataColumnProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -import net.minecraft.world.chunk.IChunkProvider; - -public abstract interface UBStrataColumnProvider { - - public abstract UBStrataColumn strataColumn(int paramInt1, int paramInt2); - - public abstract IChunkProvider UBChunkProvider(IChunkProvider paramIChunkProvider); - - public abstract boolean inChunkGenerationAllowed(); -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSet.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSet.java deleted file mode 100644 index bc4aaea..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSet.java +++ /dev/null @@ -1,13 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract class UndergroundBiomeSet { - - public final StrataLayer[][] strataLayers; - public final BiomeGenUndergroundBase[] biomeList = new BiomeGenUndergroundBase[256]; - - public UndergroundBiomeSet(StrataLayer[][] strataLayers) { - this.strataLayers = strataLayers; - } - - public abstract BiomeGenUndergroundBase[] allowedBiomes(); -} diff --git a/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSetProvider.java b/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSetProvider.java deleted file mode 100644 index 1bef0dc..0000000 --- a/src/api/java/exterminatorJeff/undergroundBiomes/api/UndergroundBiomeSetProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package exterminatorJeff.undergroundBiomes.api; - -public abstract interface UndergroundBiomeSetProvider { - - public abstract UndergroundBiomeSet modifiedBiomeSet(int paramInt, long paramLong, - UndergroundBiomeSet paramUndergroundBiomeSet); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaBlock.java b/src/api/java/mcp/mobius/waila/api/IWailaBlock.java deleted file mode 100644 index 4bbc04e..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaBlock.java +++ /dev/null @@ -1,44 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.List; - -import net.minecraft.item.ItemStack; - -@Deprecated -public interface IWailaBlock { - - /* - * Use this method to return an item stack in case the default lookup system fails. - * Return null if you want to use the default lookup system. - * You get the world, the player and the location of the block. With that, it is easy to gather information & tile - * entities - */ - ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); - - /* - * Waila HUD is divided into 3 zones. The head corresponds to the item name, - * body to where you mostly want to put informations, and I reserve the tail for modname display - */ - - /* - * Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. - * You get in input world, player and the block location. You also get the itemstack as returned by the default - * lookup system or getWailaStack(). - * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the - * configuration. Refer the ConfigHandler class for more info. - * currenttip represents the current list of text lines in the tooltip zone. - * For example, getWailaHead() will have the current item name as currenttip. - * You can modify the tips, add more, remove some, etc. - * When you are done, just returns the currenttip and it will display in Waila. - * Always return the currenttip is you don't want to modify the current zone. - */ - - List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); - - List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); - - List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java b/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java deleted file mode 100644 index ee16f59..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java +++ /dev/null @@ -1,9 +0,0 @@ -package mcp.mobius.waila.api; - -import net.minecraft.item.ItemStack; - -public interface IWailaBlockDecorator { - - void decorateBlock(ItemStack itemStack, IWailaDataAccessor accessor, IWailaConfigHandler config); - -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java b/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java deleted file mode 100644 index aee09e2..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.HashMap; -import java.util.Set; - -public interface IWailaConfigHandler { - - /* Returns a set of all the currently loaded modules in the config handler */ - public Set getModuleNames(); - - /* Returns all the currently available options for a given module */ - public HashMap getConfigKeys(String modName); - - /* - * Add a new option to a given module - * modName is the name of the module to add the option to (ie : Buildcraft, IndustrialCraft2, etc) - * key is the config key (ie : bc.tankcontent, ic2.inputvalue) - * name is the human readable name of the option (ie : "Tank content", "Max EU Input") - */ - // public void addConfig(String modName, String key, String name); - - /* Returns the current value of an option (true/false) with a default value defvalue if not set */ - public boolean getConfig(String key, boolean defvalue); - - /* Returns the current value of an option (true/false) with a default value true if not set */ - public boolean getConfig(String key); - - // public void setConfig(String key, boolean value); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java deleted file mode 100644 index 53fb1f5..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java +++ /dev/null @@ -1,46 +0,0 @@ -package mcp.mobius.waila.api; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -/* - * The Accessor is used to get some basic data out of the game without having to request - * direct access to the game engine. - * It will also return things that are unmodified by the overriding systems (like getWailaStack). - */ - -public interface IWailaDataAccessor { - - World getWorld(); - - EntityPlayer getPlayer(); - - Block getBlock(); - - int getBlockID(); - - int getMetadata(); - - TileEntity getTileEntity(); - - MovingObjectPosition getPosition(); - - Vec3 getRenderingPosition(); - - NBTTagCompound getNBTData(); - - int getNBTInteger(NBTTagCompound tag, String keyname); - - double getPartialFrame(); - - ForgeDirection getSide(); - - ItemStack getStack(); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java deleted file mode 100644 index f3cb3c5..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.List; - -import net.minecraft.item.ItemStack; - -public interface IWailaDataProvider { - - /* - * Use this method to return an item stack in case the default lookup system fails. - * Return null if you want to use the default lookup system. - * You get the world, the player and the location of the block. With that, it is easy to gather information & tile - * entities - */ - ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); - - /* - * Waila HUD is divided into 3 zones. The head corresponds to the item name, - * body to where you mostly want to put informations, and I reserve the tail for modname display - */ - - /* - * Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. - * You get in input world, player and the block location. You also get the itemstack as returned by the default - * lookup system or getWailaStack(). - * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the - * configuration. Refer the ConfigHandler class for more info. - * currenttip represents the current list of text lines in the tooltip zone. - * For example, getWailaHead() will have the current item name as currenttip. - * You can modify the tips, add more, remove some, etc. - * When you are done, just returns the currenttip and it will display in Waila. - * Always return the currenttip is you don't want to modify the current zone. - */ - - List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); - - List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); - - List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, - IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java deleted file mode 100644 index bee89bb..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java +++ /dev/null @@ -1,33 +0,0 @@ -package mcp.mobius.waila.api; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -/* - * The Accessor is used to get some basic data out of the game without having to request - * direct access to the game engine. - * It will also return things that are unmodified by the overriding systems (like getWailaStack). - */ - -public interface IWailaEntityAccessor { - - World getWorld(); - - EntityPlayer getPlayer(); - - Entity getEntity(); - - MovingObjectPosition getPosition(); - - Vec3 getRenderingPosition(); - - NBTTagCompound getNBTData(); - - int getNBTInteger(NBTTagCompound tag, String keyname); - - double getPartialFrame(); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java deleted file mode 100644 index 44867b6..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.List; - -import net.minecraft.entity.Entity; - -public interface IWailaEntityProvider { - - /* A way to get an override on the entity returned by the raytracing */ - Entity getWailaOverride(IWailaEntityAccessor accessor, IWailaConfigHandler config); - - /* The classical HEAD/BODY/TAIL text getters */ - List getWailaHead(Entity entity, List currenttip, IWailaEntityAccessor accessor, - IWailaConfigHandler config); - - List getWailaBody(Entity entity, List currenttip, IWailaEntityAccessor accessor, - IWailaConfigHandler config); - - List getWailaTail(Entity entity, List currenttip, IWailaEntityAccessor accessor, - IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java deleted file mode 100644 index c127da6..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java +++ /dev/null @@ -1,37 +0,0 @@ -package mcp.mobius.waila.api; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -/* - * The Accessor is used to get some basic data out of the game without having to request - * direct access to the game engine. - * It will also return things that are unmodified by the overriding systems (like getWailaStack). - */ - -public interface IWailaFMPAccessor { - - World getWorld(); - - EntityPlayer getPlayer(); - - TileEntity getTileEntity(); - - MovingObjectPosition getPosition(); - - NBTTagCompound getNBTData(); - - NBTTagCompound getFullNBTData(); - - int getNBTInteger(NBTTagCompound tag, String keyname); - - double getPartialFrame(); - - Vec3 getRenderingPosition(); - - String getID(); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java deleted file mode 100644 index fe089e5..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java +++ /dev/null @@ -1,8 +0,0 @@ -package mcp.mobius.waila.api; - -import net.minecraft.item.ItemStack; - -public interface IWailaFMPDecorator { - - void decorateBlock(ItemStack itemStack, IWailaFMPAccessor accessor, IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java deleted file mode 100644 index 94b0f27..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.List; - -import net.minecraft.item.ItemStack; - -public interface IWailaFMPProvider { - - /* The classical HEAD/BODY/TAIL text getters */ - List getWailaHead(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, - IWailaConfigHandler config); - - List getWailaBody(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, - IWailaConfigHandler config); - - List getWailaTail(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, - IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java b/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java deleted file mode 100644 index 5824746..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java +++ /dev/null @@ -1,58 +0,0 @@ -package mcp.mobius.waila.api; - -public interface IWailaRegistrar { - - /* Add a config option in the section modname with displayed text configtext and access key keyname */ - public void addConfig(String modname, String keyname, String configtext); - - public void addConfigRemote(String modname, String keyname, String configtext); - - public void addConfig(String modname, String keyname); - - public void addConfigRemote(String modname, String keyname); - - /* Register a stack overrider for the given blockID */ - public void registerStackProvider(IWailaDataProvider dataProvider, Class block); - - /* Same thing, but works on a class hierarchy instead */ - public void registerHeadProvider(IWailaDataProvider dataProvider, Class block); - - public void registerBodyProvider(IWailaDataProvider dataProvider, Class block); - - public void registerTailProvider(IWailaDataProvider dataProvider, Class block); - - /* Entity text registration methods */ - public void registerHeadProvider(IWailaEntityProvider dataProvider, Class entity); - - public void registerBodyProvider(IWailaEntityProvider dataProvider, Class entity); - - public void registerTailProvider(IWailaEntityProvider dataProvider, Class entity); - - public void registerOverrideEntityProvider(IWailaEntityProvider dataProvider, Class entity); - - /* FMP Providers */ - public void registerHeadProvider(IWailaFMPProvider dataProvider, String name); - - public void registerBodyProvider(IWailaFMPProvider dataProvider, String name); - - public void registerTailProvider(IWailaFMPProvider dataProvider, String name); - - /* The block decorators */ - public void registerDecorator(IWailaBlockDecorator decorator, Class block); - - public void registerDecorator(IWailaFMPDecorator decorator, String name); - - /* - * Selective NBT key syncing. Will register a key to sync over the network for the given class (block, te or ent). - * Accept * as a ending wildcard - * registerNBTKey("bob.*", MyBlock.class) - * registerNBTKey("data.life", MyEntity.class) - * registerNBTKey("*", MyTileEntity.class) will reproduce the full tag syncing from 1.4.5 - */ - public void registerSyncedNBTKey(String key, Class target); - - /* UNUSED FOR NOW (Will be used for the ingame wiki */ - public void registerDocTextFile(String filename); - - public void registerShortDataProvider(IWailaSummaryProvider dataProvider, Class item); -} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java deleted file mode 100644 index 7fcaba3..0000000 --- a/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package mcp.mobius.waila.api; - -import java.util.LinkedHashMap; - -import net.minecraft.item.ItemStack; - -public interface IWailaSummaryProvider { - /* This interface is used to control the display data in the description screen */ - - /* BASIC TOOLS & ITEMS DATA */ - // EnumToolMaterial getMaterial(ItemStack stack); - // String getMaterialName(ItemStack stack); - // String getEffectiveBlock(ItemStack stack); - // int getHarvestLevel(ItemStack stack); - // float getEfficiencyOnProperMaterial(ItemStack stack); - // int getEnchantability(ItemStack stack); - // int getDamageVsEntity(ItemStack stack); - // int getDurability(ItemStack stack); - - LinkedHashMap getSummary(ItemStack stack, LinkedHashMap currentSummary, - IWailaConfigHandler config); -} diff --git a/src/api/java/mcp/mobius/waila/api/SpecialChars.java b/src/api/java/mcp/mobius/waila/api/SpecialChars.java deleted file mode 100644 index 4c7b0a1..0000000 --- a/src/api/java/mcp/mobius/waila/api/SpecialChars.java +++ /dev/null @@ -1,40 +0,0 @@ -package mcp.mobius.waila.api; - -public class SpecialChars { - - public static String MCStyle = "\u00A7"; - - public static String BLACK = MCStyle + "0"; - public static String DBLUE = MCStyle + "1"; - public static String DGREEN = MCStyle + "2"; - public static String DAQUA = MCStyle + "3"; - public static String DRED = MCStyle + "4"; - public static String DPURPLE = MCStyle + "5"; - public static String GOLD = MCStyle + "6"; - public static String GRAY = MCStyle + "7"; - public static String DGRAY = MCStyle + "8"; - public static String BLUE = MCStyle + "9"; - public static String GREEN = MCStyle + "a"; - public static String AQUA = MCStyle + "b"; - public static String RED = MCStyle + "c"; - public static String LPURPLE = MCStyle + "d"; - public static String YELLOW = MCStyle + "e"; - public static String WHITE = MCStyle + "f"; - - public static String OBF = MCStyle + "k"; - public static String BOLD = MCStyle + "l"; - public static String STRIKE = MCStyle + "m"; - public static String UNDER = MCStyle + "n"; - public static String ITALIC = MCStyle + "o"; - public static String RESET = MCStyle + "r"; - - public static String WailaStyle = "\u00A4"; - public static String WailaIcon = "\u00A5"; - public static String TAB = WailaStyle + WailaStyle + "a"; - public static String ALIGNRIGHT = WailaStyle + WailaStyle + "b"; - public static String ALIGNCENTER = WailaStyle + WailaStyle + "c"; - public static String HEART = WailaStyle + WailaIcon + "a"; - public static String HHEART = WailaStyle + WailaIcon + "b"; - public static String EHEART = WailaStyle + WailaIcon + "c"; - -} diff --git a/src/api/java/mcp/mobius/waila/api/package-info.java b/src/api/java/mcp/mobius/waila/api/package-info.java deleted file mode 100644 index 340c070..0000000 --- a/src/api/java/mcp/mobius/waila/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@API(apiVersion = "1.0", owner = "Waila", provides = "WailaAPI") -package mcp.mobius.waila.api; - -import cpw.mods.fml.common.API; diff --git a/src/api/java/morph/api/Ability.java b/src/api/java/morph/api/Ability.java deleted file mode 100644 index 4c0e6f8..0000000 --- a/src/api/java/morph/api/Ability.java +++ /dev/null @@ -1,229 +0,0 @@ -package morph.api; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * - * Abstract ability class. - * Think of it like the Entity class, extend it to make your own types. - * Some abilities may seem more like traits, but let's just call it an ability for simplicity's sake. - * Please take note that entities inherit their superclass' abilities. - * - * @author iChun - * - */ -public abstract class Ability { - - /** - * Ability parent field. Will be null for instances used in registration. Ability is then cloned and parent assigned - * later on. - */ - private EntityLivingBase parent; - - /** - * Flag for Ability activity. If true, tick/postRender/kill will notbe called. - */ - public boolean inactive; - - /** - * Basic constructor (but you didn't really need me to tell you that ;D ) - */ - public Ability() { - parent = null; - } - - /** - * Function for mod mob support, with args. - */ - public Ability parse(String[] args) { - return this; - } - - /** - * Since parent is private it needs a setter. - * - * @param newParent - */ - public void setParent(EntityLivingBase ent) { - parent = ent; - } - - /** - * Get's the parent entity for this ability - * - * @return Entity the ability takes effect on - */ - public EntityLivingBase getParent() { - return parent; - } - - /** - * Each ability has to return a String type. - * This is used for comparison, saving, as well as construction/loading of Ability. - * Think of it like the way Minecraft registers entities. - * - * @return Ability type - */ - public abstract String getType(); - - /** - * Ticks every world tick, basically an ability onUpdate, similar to Entity's onUpdate. - * Will only tick if getParent() is not null. - * Please remember that getParent is not necessarily a player. - */ - public abstract void tick(); - - /** - * Called when the ability is finally removed when the parent demorphs or morphs into a state that does not have - * this ability type. - * This will NOT be called if the parent morphs into another morph that has this type of ability. - */ - public abstract void kill(); - - /** - * Creates a copy of this ability for use with parents. - * As previously stated before the ability instance used during registration is a base so it needs to be cloned for - * use with parents. - */ - public abstract Ability clone(); - - /** - * Return true for this if you need an inactive copy of this morph in-between morph states (abilities of the next - * morph are only swapped over when morph is complete) - * Currently used for AbilitySwim to adjust the fog render. - * - * @return requiresInactiveClone - */ - public boolean requiresInactiveClone() { - return false; - } - - /** - * Saving of ability to NBTTagCompound. - * Mainly used for synching Abilities between the client-server for mod mobs which do not use the API to add - * abilities. - * The ability type (getType()) is appended to nbt before function is called. - * Not actually used. - * - * @param NBTTagCompound saveData - */ - public abstract void save(NBTTagCompound tag); - - /** - * Loading of ability from NBTTagCompound. - * Mainly used to load custom fields from NBT. - * Not actually used. - * - * @param NBTTagCompound saveData - */ - public abstract void load(NBTTagCompound tag); - - /** - * Rendering to be done post-render. - * EG: Used by AbilitySwim to render air bubbles whilst on land. - */ - @SideOnly(Side.CLIENT) - public abstract void postRender(); - - /** - * Icon location for ability. Can be null. - * Mod's default icons are 32x32. Can be any resolution though. - * - * @return resourcelocation for icon - */ - @SideOnly(Side.CLIENT) - public abstract ResourceLocation getIcon(); - - @SideOnly(Side.CLIENT) - public boolean entityHasAbility(EntityLivingBase living) { - return true; - } - - /** - * Registers the ability so the mod can look up the class when attempting to load Ability save data. - * Call this no later than PostInit. - * - * @param ability type - * @param AbilityClass - */ - public static void registerAbility(String name, Class clz) { - try { - Class.forName("morph.common.ability.AbilityHandler") - .getDeclaredMethod("registerAbility", String.class, Class.class) - .invoke(null, name, clz); - } catch (Exception e) {} - } - - /** - * Maps abilities to an Entity. - * Adds on to the previous ability list, so this allows you to add abilities to Entity classes which already have - * abilities mapped. - * However, only one ability of the same type is allowed for each entity. This method will overwrite abilities of - * the same type that were already mapped. - * This will also register new abilities which were not registered before (just in case). - * Call this no later than PostInit. - * - * @param entClass - * @param abilities - */ - public static void mapAbilities(Class entClass, Ability... abilities) { - try { - Class.forName("morph.common.ability.AbilityHandler") - .getDeclaredMethod("mapAbilities", Class.class, Ability[].class) - .invoke(null, entClass, abilities); - } catch (Exception e) {} - } - - /** - * Superman's kryptonite. - * - * @param Entity class to remove ability from - * @param Ability type - */ - public static void removeAbility(Class entClass, String type) { - try { - Class.forName("morph.common.ability.AbilityHandler") - .getDeclaredMethod("removeAbility", Class.class, String.class) - .invoke(null, entClass, type); - } catch (Exception e) {} - } - - /** - * Checks to see if the entity class has a mapped ability type. - * - * @param entClass - * @param Ability type - * @return Entity class has ability type - */ - public static boolean hasAbility(Class entClass, String type) { - try { - return (Boolean) Class.forName("morph.common.ability.AbilityHandler") - .getDeclaredMethod("hasAbility", Class.class, String.class) - .invoke(null, entClass, type); - } catch (Exception e) { - return false; - } - } - - /** - * Creates an ability by type. - * Check out AbilityHandler to see each Ability type and the parse function in their respective classes for the - * arguments. - * - * @return - */ - public static Ability createNewAbilityByType(String type, String[] arguments) { - try { - return (Ability) Class.forName("morph.common.ability.AbilityHandler") - .getDeclaredMethod("createNewAbilityByType", String.class, String[].class) - .invoke(null, type, arguments); - } catch (Exception e) { - return null; - } - } -} diff --git a/src/api/java/morph/api/Api.java b/src/api/java/morph/api/Api.java deleted file mode 100644 index 83d874b..0000000 --- a/src/api/java/morph/api/Api.java +++ /dev/null @@ -1,188 +0,0 @@ -package morph.api; - -import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.ResourceLocation; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public final class Api { - - /** - * Returns if a player is has a morph. If morph progress < 1.0F, player is mid-morphing. - * Players demorphing are considered as a player with a morph until the demorph is complete. - * - * @param Player Username - * @param Clientside (false for Serverside) - */ - public static boolean hasMorph(String playerName, boolean isClient) { - try { - return (Boolean) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("hasMorph", String.class, boolean.class) - .invoke(null, playerName, isClient); - } catch (Exception e) { - return false; - } - } - - /** - * Returns morph progression of a player. Time per morph is 80 ticks. - * If player does not have a morph, 1.0F will be returned. - * - * @param Player Username - * @param Clientside (false for Serverside) - */ - public static float morphProgress(String playerName, boolean isClient) { - try { - return (Float) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("morphProgress", String.class, boolean.class) - .invoke(null, playerName, isClient); - } catch (Exception e) { - return 1.0F; - } - } - - /** - * Returns previous entity instance used to render the morph. - * If player does not have a previous morph state, null will be returned. - * - * @param Player Username - * @param Clientside (false for Serverside) - */ - public static EntityLivingBase getPrevMorphEntity(String playerName, boolean isClient) { - try { - return (EntityLivingBase) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("getPrevMorphEntity", String.class, boolean.class) - .invoke(null, playerName, isClient); - } catch (Exception e) { - return null; - } - } - - /** - * Returns entity instance used to render the morph. - * If player does not have a morph, null will be returned. - * - * @param Player Username - * @param Clientside (false for Serverside) - */ - public static EntityLivingBase getMorphEntity(String playerName, boolean isClient) { - try { - return (EntityLivingBase) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("getMorphEntity", String.class, boolean.class) - .invoke(null, playerName, isClient); - } catch (Exception e) { - return null; - } - } - - /** - * Blacklists an entity from being morphed into. - * Previously saved morphs of the classtype will not be removed. - * - * @param Class (extends EntityLivingBase) - */ - public static void blacklistEntity(Class clz) { - try { - Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("blacklistEntity", Class.class) - .invoke(null, clz); - } catch (Exception e) {} - } - - /** - * Forces a player to morph into an EntityLivingBase, also adds said entity to the morph list. - * Called Serverside only. - * - * @param player - * @param living - * @return morphSuccessful - */ - public static boolean forceMorph(EntityPlayerMP player, EntityLivingBase living) { - try { - return (Boolean) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("forceMorph", EntityPlayerMP.class, EntityLivingBase.class) - .invoke(null, player, living); - } catch (Exception e) { - return false; - } - } - - /** - * Forces a player to demorph. - * Called Serverside only. - * - * @param player - */ - public static void forceDemorph(EntityPlayerMP player) { - try { - Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("forceDemorph", EntityPlayerMP.class) - .invoke(null, player); - } catch (Exception e) {} - } - - /** - * Checks if the entity passed on is a Morph. - * If it is, the player name will be passed, else null. - * - * @param EntityLivingBase instance - * @param Clientside (false for Serverside) - */ - public static String isEntityAMorph(EntityLivingBase living, boolean isClient) { - try { - return (String) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("isEntityAMorph", EntityLivingBase.class, boolean.class) - .invoke(null, living, isClient); - } catch (Exception e) { - return null; - } - } - - /** - * Allows the rendering of the next player rendered. - * Prevents Morph from cancelling the player render event to render the morphed entity. - */ - public static void allowNextPlayerRender() { - try { - Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("allowNextPlayerRender") - .invoke(null); - } catch (Exception e) {} - } - - /** - * Returns the black grainy morph skin that overlays the player when the player is morphing - * - * @return Morph Skin Resource Location - */ - @SideOnly(Side.CLIENT) - public static ResourceLocation getMorphSkinTexture() { - try { - return (ResourceLocation) Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("getMorphSkinTexture") - .invoke(null); - } catch (Exception e) { - return AbstractClientPlayer.locationStevePng; - } - } - - /** - * Assign a specific arm to a model for rendering in First Person. - * - * @param model Model which arm you are registering for - * @param arm The arm in a ModelRenderer form. - */ - @SideOnly(Side.CLIENT) - public static void registerArmForModel(ModelBase model, ModelRenderer arm) { - try { - Class.forName("morph.common.core.ApiHandler") - .getDeclaredMethod("registerArmForModel", ModelBase.class, ModelRenderer.class) - .invoke(null, model, arm); - } catch (Exception e) {} - } -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java b/src/api/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java deleted file mode 100644 index 42e23a6..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java +++ /dev/null @@ -1,113 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; - -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; - -/** - * @author PowerCrystals - * - * Class used to register plants and other farming-related things with MFR. Will do nothing if MFR does not - * exist. - * - */ -public class FactoryRegistry { - - /* - * This may be called at any time during pre-init, init or post-init, assuming all blocks and items - * that are being accessed from the registry have been appropriately registered. - * Possible messages: - * // Registration: - * addLaserPreferredOre | NBTTag with an ItemStack saved on it, with the color on the "value" attribute, - * | A ValuedItem with item and value set. - * registerAutoSpawnerBlacklist | The String identifier of an entity, - * | A subclass of EntityLivingBase. - * registerFertilizable | An instance of IFactoryFertilizable. - * registerFertilizer | An instance of IFactoryFertilizer. - * registerFruitLog | The String identifier of a block. - * registerGrindable | An instance of IFactoryGrindable. - * registerGrinderBlacklist | A subclass of EntityLivingBase. - * registerHarvestable | An instance of IFactoryHarvestable. - * registerLaserOre | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, - * | A ValuedItem with item and value set. - * registerLiquidDrinkHandler | A ValuedItem with key and object set; ILiquidDrinkHandler expected. - * registerMobEggHandler | An instance of IMobEggHandler. - * registerPickableFruit | An instance of IFactoryFruit. - * registerPlantable | An instance of IFactoryPlantable. - * registerRanchable | An instance of IFactoryRanchable. - * registerRedNetLogicCircuit | An instance of IRedNetLogicCircuit. - * registerRubberTreeBiome | The biomeName field of a biome to white list for rubber trees to spawn in. - * registerSafariNetBlacklist | A subclass of EntityLivingBase. - * registerSafariNetHandler | An instance of ISafariNetHandler. - * registerSludgeDrop | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, - * | A ValuedItem with item and value set. - * registerSpawnHandler | An instance of IMobSpawnHandler. - * registerVillagerTradeMob | An instance of IRandomMobProvider. - * // Simple implementations: - * { Harvestables - * registerHarvestable_Standard | The String identifier of a block. - * registerHarvestable_Log | The String identifier of a block. - * registerHarvestable_Leaves | The String identifier of a block. - * registerHarvestable_Vine | The String identifier of a block. - * registerHarvestable_Shrub | The String identifier of a block. - * registerHarvestable_Mushroom | The String identifier of a block. - * registerHarvestable_Crop | An ItemStack of a block, with a damage value indicating the meta value to harvest at. - * | A ValuedItem with value and object set; Block expected. - * registerHarvestable_Gourd | An NBTTag with the stem and fruit attributes, both String identifiers of blocks. - * } - * { Plantables - * registerPlantable_Standard | An NBTTag with the seed (Item, String identifier), and - * crop (Block, String identifier) attributes set, optionally - * also having the meta (Integer, placed metadata value) attribute set. - * No special checks for location, just sustainability. - * registerPlantable_Crop | An NBTTag with the seed (Item, String identifier), and - * crop (Block, String identifier) attributes set, optionally - * also having the meta (Integer, placed metadata value) attribute set. - * Will automatically hoe dirt and grass into farmland when planting. - * registerPlantable_Sapling | An NBTTag with the sapling (Block, String identifier), and optionally - * the seed (Item, String identifier) attributes set. - * } - * { Fertilizer - * registerFertilizer | An NBTTag with the fert (Item, String identifier), meta (Integer), and - * type (Integer, index into FertilizerType.values()) attributes set. - * } - * { Fertilizables - * registerFertilizable_Grass | The String identifier of a block. Will bonemeal the block and expect - * tall grass be planted above and around it, must be IGrowable. Works with - * the GrowPlant and Grass type fertilizers, not recommended for crop plants. - * registerFertilizable_Gourd | The String identifier of a block. Must be IGrowable, and expects identical - * behavior to vanilla stems. Works with the GrowPlant fertilizers. - * registerFertilizable_Crop | An NBTTag with the plant (Block, String identifier, IGrowable), and - * meta (Integer, max growth phase) attributes set, optionally also having - * the type (Integer, index into FertilizerType) attribute set. - * registerFertilizable_Cocoa | An NBTTag with the plant (Block, String identifier), and optionally also - * the type (Integer, index into FertilizerType) attributes set. - * Expects metadata of the block to exactly match cocoa pods. - * registerFertilizable_Standard | An NBTTag with the plant (Block, String identifier, IGrowable), and - * optionally also the type (Integer, index into FertilizerType) attributes set. - * Expects the block to change when successfully grown (e.g., saplings). - * } - */ - public static void sendMessage(String message, Object value) { - if (!Loader.isModLoaded("MineFactoryReloaded") || Loader.instance() - .activeModContainer() == null) return; - try { - Method m = FMLInterModComms.class - .getDeclaredMethod("enqueueMessage", Object.class, String.class, IMCMessage.class); - m.setAccessible(true); - Constructor c = IMCMessage.class.getDeclaredConstructor(String.class, Object.class); - c.setAccessible(true); - m.invoke( - null, - Loader.instance() - .activeModContainer(), - "MineFactoryReloaded", - c.newInstance(message, value)); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/HarvestType.java b/src/api/java/powercrystals/minefactoryreloaded/api/HarvestType.java deleted file mode 100644 index ccd5daa..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/HarvestType.java +++ /dev/null @@ -1,43 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -/** - * @author PowerCrystals - * - * Determines what algorithm the Harvester uses when it encounters this IFactoryHarvestable in the world. - */ -public enum HarvestType { - /** - * Just break the single block - no special action needed. e.g. Carrots, flowers, wheat. - */ - Normal, - /** - * Search for harvestable blocks adjacent to this block but leave this block. e.g. Pumpkin, melon - */ - Gourd, - /** - * Search for identical blocks above. - */ - Column, - /** - * Search for identical blocks above but leave the bottom one for the future. e.g. Cactus, sugarcane. - */ - LeaveBottom, - /** - * This block is the base of a tree and the harvester should enter tree-cutting mode. - */ - Tree, - /** - * This block is the base of the tree and the harvester should enter tree-cutting mode. - * The tree is searched for in the negative y axis instead. - */ - TreeFlipped, - /** - * This block is part of a tree as above. - */ - TreeLeaf, - /** - * This block is part of a tree as above, but fruits are cut before logs. e.g. cocoa - * The tree is not searched for. - */ - TreeFruit -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java b/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java deleted file mode 100644 index 6736a29..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java +++ /dev/null @@ -1,36 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.world.World; - -/** - * @author PowerCrystals - * - * Defines a grindable entity for the Grinder. - */ -public interface IFactoryGrindable { - - /** - * @return The class that this grindable instance is handling. This must be a subtype of EntityLivingBase or the - * entity will never - * be noticed by the Grinder. - */ - public Class getGrindableEntity(); - - /** - * @param world The world this entity is in. - * @param entity The entity instance being ground. - * @param random A Random instance. - * @return The drops generated when this entity is killed. - */ - public List grind(World world, EntityLivingBase entity, Random random); - - /** - * @param entity The entity instance being ground. - * @return Whether this entity has been fully processed or not. - */ - public boolean processEntity(EntityLivingBase entity); -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java b/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java deleted file mode 100644 index 1f39fee..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java +++ /dev/null @@ -1,76 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import java.util.List; -import java.util.Map; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -/** - * @author PowerCrystals - * - * Defines a harvestable block for the Harvester. - */ -public interface IFactoryHarvestable { - - /** - * @return The block this harvestable instance is managing. - */ - public Block getPlant(); - - /** - * @return The type of harvest the Harvester should perform on this block. - */ - public HarvestType getHarvestType(); - - /** - * @return Whether or not the Harvester should break the block when harvesting. If false, no changes will be - * performed by the Harvester itself. - */ - public boolean breakBlock(); - - /** - * @param world The world this block is in. - * @param harvesterSettings The harvester's current settings. Do not modify these. - * @param x The X coordinate of the block being harvested. - * @param y The Y coordinate of the block being harvested. - * @param z The Z coordinate of the block being harvested. - * @return True if this block can be harvested. - */ - public boolean canBeHarvested(World world, Map harvesterSettings, int x, int y, int z); - - /** - * @param world The world this block is in. - * @param rand A Random instance to use when generating drops. - * @param harvesterSettings The harvester's current settings. Do not modify these. - * @param x The X coordinate of the block being harvested. - * @param y The Y coordinate of the block being harvested. - * @param z The Z coordinate of the block being harvested. - * @return The drops generated by breaking this block. For a default implementation, calling Block.getBlockDropped() - * is usually sufficient. - */ - public List getDrops(World world, Random rand, Map harvesterSettings, int x, int y, - int z); - - /** - * Called before the block is going to be harvested. Usually empty. - * - * @param world The world this block is in. - * @param x The X coordinate of the block being harvested. - * @param y The Y coordinate of the block being harvested. - * @param z The Z coordinate of the block being harvested. - */ - public void preHarvest(World world, int x, int y, int z); - - /** - * Called after the block is going to be harvested. Used to re-till soil, for example. - * - * @param world The world this block is in. - * @param x The X coordinate of the block being harvested. - * @param y The Y coordinate of the block being harvested. - * @param z The Z coordinate of the block being harvested. - */ - public void postHarvest(World world, int x, int y, int z); -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java b/src/api/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java deleted file mode 100644 index 63c838a..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; - -public interface ILiquidDrinkHandler { - - public void onDrink(EntityLivingBase player); -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/MobDrop.java b/src/api/java/powercrystals/minefactoryreloaded/api/MobDrop.java deleted file mode 100644 index c2d0a96..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/MobDrop.java +++ /dev/null @@ -1,19 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.WeightedRandom; - -public class MobDrop extends WeightedRandom.Item { - - private ItemStack _stack; - - public MobDrop(int weight, ItemStack stack) { - super(weight); - _stack = stack; - } - - public ItemStack getStack() { - if (_stack == null) return null; - return _stack.copy(); - } -} diff --git a/src/api/java/powercrystals/minefactoryreloaded/api/ValuedItem.java b/src/api/java/powercrystals/minefactoryreloaded/api/ValuedItem.java deleted file mode 100644 index 7efc7dd..0000000 --- a/src/api/java/powercrystals/minefactoryreloaded/api/ValuedItem.java +++ /dev/null @@ -1,65 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.ItemStack; - -public class ValuedItem { - - public final int value; - public final ItemStack item; - public final String key; - public final Object object; - - public ValuedItem(int v, ItemStack i) { - value = v; - item = i; - key = null; - object = null; - } - - public ValuedItem(String v, Object i) { - value = -1; - item = null; - key = v; - object = i; - } - - /** - * Presently unused but included so that if they do get used in the future, - * people including this in their jar and loading before MFR don't destroy everyone - */ - - public ValuedItem(int v, Object i) { - value = v; - item = null; - key = null; - object = i; - } - - public ValuedItem(String v, ItemStack i) { - value = -1; - item = i; - key = v; - object = null; - } - - public ValuedItem(int v, String k, ItemStack i) { - value = v; - item = i; - key = k; - object = null; - } - - public ValuedItem(int v, String k, Object i) { - value = v; - item = null; - key = k; - object = i; - } - - public ValuedItem(int v, String k, ItemStack i, Object o) { - value = v; - item = i; - key = k; - object = o; - } -} diff --git a/src/api/resources/CoFH_at.cfg b/src/api/resources/CoFH_at.cfg deleted file mode 100644 index df9e3e9..0000000 --- a/src/api/resources/CoFH_at.cfg +++ /dev/null @@ -1,77 +0,0 @@ -# NetherOres -public net.minecraft.entity.monster.EntityPigZombie func_70835_c(Lnet/minecraft/entity/Entity;)V # becomeAngryAt -public net.minecraft.entity.monster.EntitySilverfish field_70843_d # allySummonCooldown -public-f net.minecraft.init.Blocks field_150449_bY # oreNetherQuartz - -# MineFactory Reloaded -protected net.minecraft.util.WeightedRandomFishable * # need it all -public net.minecraft.entity.EntityList field_75624_e # classToIDMapping -public net.minecraft.entity.EntityList field_75622_f # stringToIDMapping -public net.minecraft.entity.monster.EntitySlime func_70799_a(I)V # setSlimeSize -public net.minecraft.entity.monster.EntityZombie func_82228_a(I)V # startConversion -public net.minecraft.entity.EntityLivingBase field_70718_bc # recentlyHit -public-f net.minecraft.init.Blocks field_150432_aD # ice -public-f net.minecraft.init.Blocks field_150410_aZ # glass_pane -public-f net.minecraft.init.Items field_151117_aB # milkBucket -protected net.minecraft.block.Block field_149770_b # unlocalizedName -public net.minecraft.server.management.PlayerManager func_72690_a(IIZ)Lnet/minecraft/server/management/PlayerManager$PlayerInstance; # getOrCreateChunkWatcher -public net.minecraft.server.management.PlayerManager$PlayerInstance -public net.minecraft.server.management.PlayerManager$PlayerInstance field_73263_b # playersWatchingChunk -public net.minecraft.entity.EntityLiving field_70728_aV # experienceValue -public net.minecraft.entity.EntityLiving field_82174_bp # equipmentDropChances - -# ThermalDynamics -public net.minecraft.client.renderer.Tessellator field_147569_p # rawBufferIndex -public net.minecraft.client.renderer.Tessellator field_78408_v # xOffset -public net.minecraft.client.renderer.Tessellator field_78407_w # yOffset -public net.minecraft.client.renderer.Tessellator field_78417_x # zOffset -public net.minecraft.client.renderer.Tessellator field_78406_i # rawBuffer -public net.minecraft.client.renderer.Tessellator field_78405_h # vertexCount - -# Thermal Expansion -public net.minecraft.entity.Entity field_83001_bt # invulnerable -public net.minecraft.entity.Entity field_70178_ae # isImmuneToFire -public net.minecraft.entity.player.EntityPlayer field_71074_e # itemInUse -public net.minecraft.server.management.ItemInWorldManager field_73094_o #durabilityRemainingOnBlock - -# PC Core -public net.minecraft.client.gui.GuiScreen field_146289_q # fontRenderer -public net.minecraft.client.gui.inventory.GuiContainer field_147003_i # guiLeft -public net.minecraft.client.gui.inventory.GuiContainer field_147009_r # guiTop -public net.minecraft.world.WorldServer field_73068_P # allPlayersSleeping - -# CoFH Core -protected net.minecraft.inventory.Container * # senseless to have private stuff here -protected net.minecraft.client.gui.inventory.GuiContainer * # senseless to have private stuff here -protected net.minecraft.client.gui.FontRenderer func_111272_d()V # all of it -protected net.minecraft.client.gui.FontRenderer func_98306_d()V # all of it -protected net.minecraft.client.gui.FontRenderer func_78278_a(ICZ)F # all of it -protected net.minecraft.client.gui.FontRenderer func_111271_a(I)Lnet/minecraft/util/ResourceLocation; # all of it -protected net.minecraft.client.gui.FontRenderer func_78257_a(I)V # all of it -protected net.minecraft.client.gui.FontRenderer func_78277_a(CZ)F # all of it -protected net.minecraft.client.gui.FontRenderer func_147647_b(Ljava/lang/String;)Ljava/lang/String; # all of it -protected net.minecraft.client.gui.FontRenderer func_78265_b()V # all of it -protected net.minecraft.client.gui.FontRenderer func_78255_a(Ljava/lang/String;Z)V # all of it -protected net.minecraft.client.gui.FontRenderer func_78274_b(Ljava/lang/String;IIIIZ)I # all of it -protected net.minecraft.client.gui.FontRenderer func_78258_a(Ljava/lang/String;IIIZ)I # all of it -protected net.minecraft.client.gui.FontRenderer func_78273_d(Ljava/lang/String;)Ljava/lang/String; # all of it -protected net.minecraft.client.gui.FontRenderer func_78268_b(Ljava/lang/String;IIIZ)V # all of it -protected net.minecraft.client.gui.FontRenderer func_78280_d(Ljava/lang/String;I)Ljava/lang/String; # all of it -protected net.minecraft.client.gui.FontRenderer func_78272_b(C)Z # all of it -protected net.minecraft.client.gui.FontRenderer func_78270_c(C)Z # all of it -protected net.minecraft.client.gui.FontRenderer func_78282_e(Ljava/lang/String;)Ljava/lang/String; # all of it -protected net.minecraft.client.gui.FontRenderer *()V # all of it -protected net.minecraft.client.gui.FontRenderer * # all of it -public net.minecraft.entity.projectile.EntityFishHook * # (nearly) literally everything is private - -protected net.minecraft.entity.player.EntityPlayer field_71072_f # itemInUseCount -public net.minecraft.item.ItemPickaxe field_150915_c # blocksEffectiveAgainst -public net.minecraft.item.ItemSpade field_150916_c # blocksEffectiveAgainst -public net.minecraft.item.ItemAxe field_150917_c # blocksEffectiveAgainst -public net.minecraft.util.RegistrySimple field_82596_a # registryObjects -public-f net.minecraft.util.RegistryNamespaced field_148759_a # underlyingIntegerMap -public net.minecraft.world.World field_72998_d # collidingBoundingBoxes - -# WorldProxy -public-f net.minecraft.world.World *()V # Doesn't matter what it is, we need it public -public-f net.minecraft.world.WorldServer *()V # Doesn't matter what it is, we need it public diff --git a/src/api/resources/MFR_at.cfg b/src/api/resources/MFR_at.cfg deleted file mode 100644 index cf0649a..0000000 --- a/src/api/resources/MFR_at.cfg +++ /dev/null @@ -1,3 +0,0 @@ -protected net.minecraft.client.gui.FontRenderer *()V # all of it -protected net.minecraft.client.gui.FontRenderer * # all of it - diff --git a/src/api/resources/TConstruct_at.cfg b/src/api/resources/TConstruct_at.cfg deleted file mode 100644 index e00d0b1..0000000 --- a/src/api/resources/TConstruct_at.cfg +++ /dev/null @@ -1,43 +0,0 @@ -# Tinkers Construct -- Access Transformer -# Required for any build system. -# Last update: Minecraft 1.7.2 - 2014 Feb 02 by Progwml6 -# EntityArrow - Grabbed 'em all, since so much is accessed -public net.minecraft.entity.projectile.EntityArrow field_145789_f -public net.minecraft.entity.projectile.EntityArrow field_145790_g -public net.minecraft.entity.projectile.EntityArrow field_145791_d -public net.minecraft.entity.projectile.EntityArrow field_145792_e -public net.minecraft.entity.projectile.EntityArrow field_70254_i -public net.minecraft.entity.projectile.EntityArrow field_70252_j -public net.minecraft.entity.projectile.EntityArrow field_70253_h -public net.minecraft.entity.projectile.EntityArrow field_70257_an -public net.minecraft.entity.projectile.EntityArrow field_70255_ao -public net.minecraft.entity.projectile.EntityArrow field_70256_ap -public net.minecraft.entity.projectile.EntityArrow *() #we need waaaaaaay to much in here to bother going through it -# RenderGlobal -public net.minecraft.client.renderer.RenderGlobal field_147592_B -# Blocks -public-f net.minecraft.block.Block field_149764_J -public net.minecraft.block.BlockLeavesBase field_150121_P -public net.minecraft.block.BlockRailBase$Rail func_150650_a()I -# GuiContainer -public net.minecraft.client.gui.inventory.GuiContainer field_146999_f -public net.minecraft.client.gui.inventory.GuiContainer field_147009_r -public net.minecraft.client.gui.inventory.GuiContainer field_147003_i -public net.minecraft.client.gui.inventory.GuiContainer func_146977_a(Lnet/minecraft/inventory/Slot;)V #renderSlot -public net.minecraft.client.gui.inventory.GuiContainer func_146981_a(Lnet/minecraft/inventory/Slot;II)Z #isMouseOverSlot -# GuiScreen -public net.minecraft.client.gui.GuiScreen field_146292_n #buttonList -# ThreadDownloadImageData -public net.minecraft.client.renderer.ThreadDownloadImageData field_110559_g #field_110559_g -public net.minecraft.client.renderer.ThreadDownloadImageData field_110560_d #field_110560_d -public net.minecraft.world.gen.structure.StructureVillagePieces$Village #cant make village houses w/o this -public net.minecraft.client.renderer.Tessellator field_78415_z -public net.minecraft.client.renderer.entity.RenderPlayer field_77109_a #modelBipedMain -# PlayerControllerMP and ItemInWorldManager for blockbreaking -public net.minecraft.client.multiplayer.PlayerControllerMP func_85182_a(III)Z #sameToolAndBlock -public net.minecraft.server.management.ItemInWorldManager field_73086_f -public net.minecraft.server.management.ItemInWorldManager field_73087_g -public net.minecraft.server.management.ItemInWorldManager field_73099_h -# EntitySlime -public net.minecraft.entity.monster.EntitySlime func_70799_a(I)V #setSlimeSize -# needs to have a space at the end of every line or SS will derp diff --git a/src/api/resources/ThaumicTinkerer_at.cfg b/src/api/resources/ThaumicTinkerer_at.cfg deleted file mode 100644 index 32157c8..0000000 --- a/src/api/resources/ThaumicTinkerer_at.cfg +++ /dev/null @@ -1,36 +0,0 @@ -#Potion Effect duration -public net.minecraft.potion.PotionEffect field_76460_b - -#Entity Creeper timeSinceIgnited -public net.minecraft.entity.monster.EntityCreeper field_70833_d - -#EntityAIAvoidEntity -public net.minecraft.entity.ai.EntityAIAvoidEntity field_75381_h #targetEntityClass - -#EntityAINearestAttackableTarge -public-f net.minecraft.entity.ai.EntityAINearestAttackableTarget field_75307_b #targetClass - -# Potion -public net.minecraft.potion.Potion func_76398_f #isBadEffect - -# Player -public net.minecraft.entity.player.EntityPlayer field_71074_e #itemInUse -public net.minecraft.entity.player.EntityPlayer field_71072_f #itemInUseCount - -#Blocks -public-f net.minecraft.init.Blocks field_150357_h #bedrock - -#EntitySlime -public net.minecraft.entity.monster.EntitySlime func_70799_a #setSlimeSize - -#NetHandlerPlayServer -public net.minecraft.network.NetHandlerPlayServer field_147365_f #floatingTickCount - -#Block -public net.minecraft.block.Block field_149782_v #blockHardness - -#EntitySlime -public net.minecraft.entity.monster.EntitySlime func_70799_a(I)V #setSlimeSize - -#Block -public net.minecraft.block.Block field_149770_b #unlocalizedName \ No newline at end of file