From 22aefff48d5839e7de10fd0f8e8ca377236f36d1 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Tue, 6 May 2025 23:18:28 +0200 Subject: [PATCH 001/323] get to work on the mob spawners bugboy --- .../java/com/hbm/main/StructureManager.java | 2 +- .../com/hbm/world/gen/NTMWorldGenerator.java | 16 ++++++++++------ .../assets/hbm/structures/radio_house.nbt | Bin 0 -> 17417 bytes 3 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/radio_house.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..601b3c44f 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -53,7 +53,6 @@ public class StructureManager { - public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); @@ -61,6 +60,7 @@ public class StructureManager { public static final NBTStructure beached_patrol = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/beached_patrol.nbt")); public static final NBTStructure lighthouse = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/lighthouse.nbt")); public static final NBTStructure dish = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/dish.nbt")); + public static final NBTStructure radio_house = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/radio_house.nbt")); public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index bb1c7b3d3..aefeedf4e 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -39,6 +39,7 @@ public class NTMWorldGenerator implements IWorldGenerator { final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + final List flatbiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.plains, BiomeGenBase.icePlains, BiomeGenBase.desert }); /// SPIRE /// NBTStructure.registerStructure(0, new SpawnCondition() {{ @@ -102,18 +103,21 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 8; }}); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change - NBTStructure.registerStructure(0, new SpawnCondition() {{ - canSpawn = biome -> biome == BiomeGenBase.plains; + canSpawn = flatbiomes::contains; structure = new JigsawPiece("dish", StructureManager.dish, -10); minHeight = 53; maxHeight = 65; - spawnWeight = 1; + spawnWeight = 4; }}); - NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = flatbiomes::contains; + structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); + spawnWeight = 40; + }}); + + NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); diff --git a/src/main/resources/assets/hbm/structures/radio_house.nbt b/src/main/resources/assets/hbm/structures/radio_house.nbt new file mode 100644 index 0000000000000000000000000000000000000000..394ac3b228623e6b38ff8ddc6674efa8440fb2cb GIT binary patch literal 17417 zcmaL82_RJa`#*lW-SX)+rJ68NRMsMzWZ$Z>MAq9P*=j0lxMN8O-MV)eGnP^@7%mDW z+(LF*W(LI|B4coCWGoq3C;RU?)LlN`&;Nh#^qlv3pZ8gu_wu}+*Yi43^=_%&6izziX-PaBt=E?U7U5GP?3n~@E)HNm(&pjIo1Dk1P^=Mx^+Q{Z~ShQWxin zA8-tG+f^D35_n6>$My6(wd{1~qwkirol{=Z{~%)Yq(uLNReoB}9ZdJr&Tvj` zLD4!I9?2%={ouDDF?&nx{D}{VX=WG3PGqnqYNmcDY}tSDnRRG?xGj1Vr=~=jy=@q3 zmXUYYaKo{Th1-U-V>uI%>0vfo>~6;~BGZ*lZ5auYz1d;5yWozYlOn0|)E2u(GDDTO zawg0&Sc)X=4nvw}220I`mz3jY(N-omYh-c32EC9WH~x@R>9M;YsczV}&hz54wjWyi zPYN~Mq0c>%ODz7OF!ikZmIjyWoo4&JoDzf@)UKq##q)oy47PJv7v#8Y|LqRApY0K+ zOm2E*zRY;}t-4{ey4(cDow$yH(ER5?d2-`tEG7%y#&rx`bDuaP0VjCWc~0sNuX9;F zR4G0#PU|@Jp-`dVt>My{V|~SU>pb`Msp0bv&DpIFipGcwcfh3uok#b#)wCm}^s%4! z-Rub7T`*ucgH#>}X z7eteI1<_DNS}eXf;4DF^RNoThWv(0U1%J(m>-i5eo~kz){q&BoWRj9P+U}CvlXvD9 z9#iY^%hl(*T{1>5$<4A(cFR2#z--^rOc zmC@+DL5+h!I(y&qNAii$KNM2WKHbvr_6NVl{S!6r z=(yZy(qt^#*tBTomfM7^&C6SE=VfhNeY5d7#6Ba2^@e(KRJ!;r9TA+GOyFK3+ry$Q z$i;1YE=kE_H#w;;Lyqld(RUIZ^w!Wx?WXN=(I`;7K$cz<Y#Z3@v zdjYG37Sj_k9>p(8SW|W!E8>Cab{|cwr$yOW?7uArHMed3v!#j9!2iTc^@36tC3MAc z?7?uOKyAF+BGl5G=SASU=`)Jutu`Cnm#eIov_~yFvVBL}O{uS*_f)mMxP61xtM{eA z^;MDYADW%i{x4a+{#V8WYv!z$#@_gU{BuGla9XTHswno(TtviNYik;(a_0SXqo8N* zPg-D!!NS|Fny~PIhp%aeTZ@H!%HQd+%lyXM`L1Mc{M*3?Rb8!x@*#8NkEb$veZn96 zjZRN5zJFhTLqlJST@eyU*eX~zSlXrTANs7wYhZ9y>(lg}(^8@Q=v9Sx&$gp$xw?^< zp@^2p(>?ODtvzKX;j<0b;LrD5=duG{hns&AKBwD9ZU{|tQ7ITW7{U{w^+%@98fI&0 zr(Q-4Ihq(}cX}GMxWjuKsuUU8?pTxfRK-B&tebvhj~~7H>ZU3lyq=xGO`CDU)B!yc zRHIN!$n^N`0*!)m+4TiBj8ZKpb9>$ZiC(HrCa5`3Srs)su8!B$<(S1-EXyd0K!snv zdG;cCXnR#pBw^tQWmpWaK)$8ff2%G-hLyYg^VBMkNo*)P&X>J8H$TLozoP3~qTag7 z+DMHPkio{KTZh&a?-K-B>c+e^w9iA<9I)TU*^?Y7X6SV+k28O-F}9U?vaQ2#6hZkA z#cvfpW&Nhsevyv1NP+8c4MrYsEmF^}OqJTtKZ75f!8x@=N4ZbTzPgrPSyxQ@+jRc= z^l-jK!^t|DLzl1Qe}WjHSMVvGXk5_Ee;TesGUgQ-F^c6+d#)VKw?H*I_pxDk8GS2i zChR8mtN4216;#;S3d9)d^t*ipgirqvD`>?RLH&*cPrDe*JKt75w*rl6vOw7Zk`}IvXpf6j< z#x;BU#rIpudK?WqiFzA1{}A(V*GSD)T!5UFB9RTnN5akzSh6;}TRDEFZGXrN9p5sw zXW2)c+A?Kl+U7cVaSQ70&$2D2Y_|l+$tw|uDl1)J#v38NXUG8^kpEAYF9U3FG zx5Z|huq>%4!lE^-JfWkJFhB%RgdP{IX;|OW{;FB7{@W1XN?onRDMCk_s?6&JQRy?} zs|A>(nvBsh-lLq%8_^+}j7KlaOoVjs9M$h#h|mQ?IxPh;|FW-WP+bz? zK?aQpzLep6KX z3I>V3V>q{mq@A#An+m+|ZNb^yHWZb;X=Hlgu=-D^i-)spz=+zQ-cnKNn1@ytZP{`| z$I)KJavrDAYL7_M-}*l!A1Ncgr^xdJr2=P9DclY--br#l%Qup67e^_K#HW0Og<)!H z6;~+&6Ife-DJkFT2g|0#`N}6ET>b}99QBs_)@8$OxPy6h+dLEV>R=MnEuU_kQR!MS=9#b%^=MjU*-$E0 zTbd^`G=#vEtVN6vMK$epnIgey%=Bi}M27rcW!^KxH0wwY6P-QT8aR*!4g(K1Uz^u%fBK8Ex3%u0r`J$E+!y26%_L&0MB7_5?2Y$9tHL zKzeh~>Ei%pk14lWdE+*>1tDx+)o8m9Mx{AF0bA_D#~Q=XPbw6WN#`12~thr$F>L z>izSegxu&_hV?SUY)SQ8K^Cy$t2_UVEJV7`rX(;*v(w0ga3iGaHp83lUd65a6~mLI zYpU#GmL0~jjztojj!?RO*_jn^<9I~6ylzywd8Wjt9ajD~#*$7^{4DSa$9->nHLU|{ zP0W)Ar2;WfwYN>H{Q2kx3=bZ}sqf#WWy3Tk_(diriCeb;=~vG0P|T2^q=FM56s@-b z3r%9=gKL~>c8OjZhTLSfFf?x}FuepKII(!x zX=ccf46*)L(_7XJ-0O}UcmL!&+$S4)*YKW^sbH}%E*Y3jlHxMGura0PWAHVVO z(Y3_a07m_?cU(uN{%2D9Y}|V^ckQ2VBMRD>ulnR+-~iGzxHxWm8=te{2hN$c#a*5z zrEABpLHxvV1>%r-mNhsJr9XW|l5);jwEgjQ{)@L8Zt%S8Jt!2f)oDpZ(7d8jXh-+GeWDGTI;Z^^~yBMqcah!i9f}#eCV1HGQ^+c zc=Ajw8SL!?S_W9wE_jZcteeBe<$Tj|4)v3ar)M?;?I za&SBd?`E8teKab4+rHV#%{W!@naYb@rjzS^1Mn%iXs!b-ahkJK^fIMpLenjF&^*LJ zyFf2&Y9t|;&3&1yVbHxeFj5mH=ok(E+>_l^GoKvWR8$+?;9j1AP&N3h6iTTQ=GbF+*E6VXOJZHxuK1b!&I2sp< z-CN^?9A_?c+fpiYPEZOx@$6Z8)fYSmeGU+UTQ0h{UWqv(jK=Yd0{1kbsJhsLC2{p= zoZqp7L1Pl0^wQ8ie2!jg&vWXoczGtZGAJxb&cHj8P^-ku>v17YPmt2N=^>$v(#J+9 zn%Kx=`(##EwcDTc=CW2NJ#2m>8HUSdSWHf0Poy0Py0M%16&@(fnOsj7Uk+h++%?ou zA}N_=2;Vhyx-dt#rqwTxoe?xHAgc-iAw?=bmt8h1no0VG4$yXOhN3G#0VyUIEC;S` z8=NKfv#cTsVMizvXnacAChq*NFn$K!KnTMKh{y2c>6!++m^16JUQR9kQSO2@)%s^s z)i<6Wlsm#V5Z`}WC&&={w_zP4rE}_~qrhyAN>{4;pC(^#-o(z(1k+&%LCS6u1q3$! z`p+U;Dfs*e|6i-HDcjRAy#FvXO%$^91RC1rP_~zD)r9H}2VABK*El%+CVr7_9TKx~q!wmC5p`FD9BhJ=Qsipd0eM~^6S%RM1V#hh z=f}ZN(UC+n_khUPA5#JAohQ%Cn`+OVP|mlN@+IIMdN;#lc9w_9TXzEQ%SUxa>DHosAO43KzAJbkvm65ay&9?z4$FBk$z+#J-TcjHptV z5)4l1leZ%XqC^{|CuEJ9QW=lK=Y+SEBuAz%8cF{2SH(yLo}>4JDlY#gRHH>7hJgUx zP;OmAv%Vgd-*t*!REw@T=jP%joQm;?=o4mG>&S#FWO+r5jqXv!_4r8IX4MyLW0Z#N zWzs4zfqXotj7$i%rVQV}J4mH$W51SXhWbPRkOMDyp!O3pI(o2DVmlz_?mddkZc`;W zzXpDCtcGOuPa(=AzcgpZa50=$wT#EaAe0i#fW#&Orq zXk%}$LCi9nWY>U-e!s#Z;G78FTX6qm6#(P`dMK^Z1Aw=9=^4z;VZiqyk%at14Z$A@ zQxqZW`vt@Mk**2!M;Q$skt~6b1B9x|0ctRWWH1<0ZiqlsM@B+B#2AT*b?Ct5K9nDV zo^<34Tv=}Q4^uGkA-HzCqk|7;rnovSQdliUiigiH4{b=%afGuC+{quCAd`GDiPp($-Av8(D#qf;m_@P3k+8>tt%nx zPJC~#Go|N=9wS`$Y|8graoIp;#SNMU-jNLl`x7pl`Nt~`+eDdxK;M@p&1~F*=cMdrHm(6gc`pD+Blp+5e)<_( z6ivr#W-D$a;;CO0!S7@LOWRjfGOU06*jA=(*)qUBO{%;pN7n3<$HC#Z6+pD;?ucy@ zG98YpZ==q-BV6Ox)q8^-{r*GDtN%kh8J)4EwEl|c>`R8}e;eK#U2{Z+=?DQJ+mzC3 ziBGw_gurB7#dZvKQwq(RA-2 zasMs`68G;x;{KyZ+>e8@PSvd}X7(m_?l@sE7N z-|SeJl;aY3hptVysdSZ;Wg8E6SKuz<5U#72UOM7q50N&&Z)U%(Mmvdco(AtuhV5b6 zRtEI$RV1V~Ejl?agD^0MzyZfsY{KzQqP-r;u}^=CyB^7TXsWjLdS>is2M5}+(G#J2 z70bz2^i-I6dGylaJFrH5Iqik@_L4;^ih`>2&T`mh6nlFT!BcU$+Obu+KuSKmYA0V^kK`WqO zl>curI-~H2Kh;K*t|#)$vaMLw24%-1 znyFvzY=$`JgJfaPoMB0;j-;;+U?QL2o{qg;)jIvrb}ee^V;*U4yqz8zlkfnep$|OSR_>6hYTspgGqzRiHyHj=%fXYn9Nc)$o_@h& zpk2pS{<0xnVLe-3n)u}RE(HcSza&61gSn`D{j2u@=m2BCUlU)LfXoa zp1Zoa+jjB{K4oqTcRm&)UYjvDOvi87;hdHiuQz zSnb3+08cW*|z`0NTYSVn+d~O zHbEy|Tu%SWA&P2_ZT7^eLV+C;cDqUC0iW8E`X~z{K2q-y^>@)J^h*;2;VchU;5o~< z1WZB##ukV57ExEd0LuY3{_$3>WX3W}>d%Lo(rIaCu@v@%D{v+X>z57tusj67Kzh8* z{s#vJz0NA|egw#_SZ2s!OMo)z>6tBdanW0WgqPR@Cjde6HV&AIhvzJc-X^)_{+*Wr zI{xpq(!%BNNYGRJ1aTMf{rp|V_>}0akV7gJdPa6v4L$cv(|$Lza|_lhi!ddV)p#)f z3;mL8Pi^N>EI;_tjDK{!vjGBiqURac2$zph3hklu-K4o5w%{ziE;u|OK~l$dS0MXv z$<;TeyWvpC@*@V_gy#%0lIVP`$gT?nzN4f4H`~VG67|kf4^eLAeT>;%$t5{vXaEr- zxC2;?yPr{7@MtTp@Z99xstfh@QR$s=&?;#|X33`=eo!ZF>;u;de!ZE?PZs5-ipjWa zU>i@~m3EPSuDM=@xh?hM#9cYbv5b;W7dKaZ94O3Twb;kR)aoUeq8x1ueYCV)1eH2i zf7wk{7l9Zn*^duT=qju z$3{l!Wd&w24tS0OX?O>ntz33G)D~D}yNvG1QKed8z0Eg4w4!$x7GM8@e2lAPzQNV| zPs`^=e?WR3@Dt?i{vGb@Cf_lnxf^6-9wO%-l#AOTg0n+RKvqbEYnB}Q>eueC$stv` z5ScScbwzRq@<`^MyIYasETm|h&}B{S-X4hwLgroS9|FjUx6X2kb1;F8%d5Gjy&|(y z2J6)oX$;X{zZf?)K#AEM2ptxkocPp>9uS4$ZNJ-u+E^Bw_2#ilxCso) zjzmy4LVc8^eIBUHm+Pr5EBIJgh2vM1o!xg+XM`kzD z$Cfe85@}-os=9sTbWR5@3)snuG+Wd~vqd{pV|QN~dL}Sbu)KtOOVz7%kPIOclGbGk>Ucf##`3_d*ow56v3y#L9 zi<|YPAyYaK^t~!h(jJwkSbv_J9v~ZZ30ss;k*p}Gj+E5V?>+SOfR=3VC#S5w9Ny@w z#PAfqP24B&OWZcj1P@cUjtsDs^7;t!v*#M<(F9e?*|8H+<5h?!4q=q4t3b%qa~ky) z{4^{9sm?Tr^hSch0uT>gBy(UN$^2M`^KC;&r`VeI72m2ObDm&cU7s%mv%UBqX6Q!W zV}^B>+D&(h$>&LRRdT)sB#!59!T&4<`nKWO9PUPQtl~PRUaNV-#~--UOOXVY8N`hE zl)^3C%Q;b<=KH-(9w({`gx6B+GxyajjX3bLb@snLv2mJDlRT>RZl?RjQn^#sog0jL zR*~)kl1iJf3L`B2Ba`+>=M-N`l5gd?l1b~53ibC3cvvzm92l;uH`keWqojW%#ekz1 z{P}QKtvs2rIH=s@n(UbB{E1UhRTX~a%J`p-Rx#839>?truVL+hr@Ne__P1@yJSc@l zY%JLdwx&tspvqlN{;wbP_S3Ap=o9kHZqWIi8K03Inqw#0~nGmZif*Ujm(8s5E zqj7`r+G5lgv%KUh9?6P|N^C(yu?UhLNeu_&tXNg1NDPKLG=*1z*`Ea0q!9rsv_ z=8HmlmPb&Imz$qnLJkZ8o9dro&JEumX{#_u~tvxm`1X-1myK zx$zn_syGcOx`|wgS_sIO*?B}QfFO{|r?&*%oJYbaFm`e8zM7z$P+Bp|>EMorW{eY> z+HNTI=>KcP!Q;F8#m3+$6A(f~0SK`n6FPGLDk^$lEkBV6u!$|mDQ1`bMcf56iRpyM zhY0xk4qV;VM}+A>ez*R+iV{qvU)Pzi{bxDBpO|f}zl3Ia?Q5Bev@_kW_FQvLj(BE$ zrv|p|46Ca|pF2;+cKOh-ogDX5AvMe?H%f7PiCIn3WH)!9j~z9*84%+ z4t3vZ+TxoLR^7x^7wS%gt2pJ#!Bz7&)K!zxJy$>R!4I&neM-iZtMB}~`UYIVc#&!+ zTxK;EYtY&$6|PKM;x-M1>+$EuTo+cjyqU(>-i4`7=Wy?og(==NUhwmbQ0n@H5tCZZ z)96?s%G}G}F}xUh5w&Oge%4eYs!Sg{so%n#VkvsB{e&f`p5;8+N1WX=a|qjJRWB4p z(AYwPS=v@pH$`$Ep6`C9t4doeosA^$l$p^6cn%f_A44ck;5nKq2qy7v*ox4&?T4Gp zvo}Vu$lh#GAonyblOdUlD&9~&V-Lv~hct}G`M%lIpf6@4f5<#h0Qzk=85AP(L;2{h zLj+U=knx2jQ=T}xF-RAp`+plTWOqd-0E&%=%YKQP{y6`CE=qdAm8Hh$)_%#3GRRI~ zu>AEu(TmDzJ@;Yx<+c=6RXm67@NHwC4CvJlLJei6<3tl`n-+GBzM^>9W?WgT*ftVj z?mgX_f1!_FDzS;NTv#>^tL0XjSZabN(z|{FH5JHSCr|XvHi`Qe@smj&ejDeIf=TKH z9tZ|({vlN3C=gZ6^OnL2B3wzyoy_jjd$Jmuo8*^`?vAc-5O(Re?@@&5$u^+0YEZcU?y#YNP_)D(UBwPto{Mz}~C(8KS^6byfRa zWXKhDZCt`XYyN_Zu|egj)M2C2$KAj{QZ|k@>#<4PN}Q=Q65( zYJHLdS$!So^5Q#~lBdwGI;v>B3mn^JESeupB8-?oY(8U-RX&dOZbWi0EF|#03hTly zs6FB8dk3NAi)J<>(joOz-+&0uHgJb5h(M6&aoF7J&US#Hs#?Z?aKmybQAi zkY#;(*wPA#DRaEyfO_+~k&=oDjMh_a8DvZ)U|!K+ciEH>MQ~;Dt!PlE{G*mPnM!*% z2qB7|cGbWKdfN}U2_1yStAUnK94SB}p$?3KK^O%~uQ#G;P6ah4&K=2qnPjrSB?>Yg zDxay;fe*$FT))G-{O;14(X&2+fzM=Gukxv^;HA&xpupb2CiV$|rKnKt>!tHy9dl$M zpPy%ICiTnm=<=(XR7b3L0;l1U+}_O_dL!LqXCPT4C_bc$Zgfz2@75ojm)wwoIU^fK zMdLF6L)F3_jB2)JN2c5SD!E31XuO$iq(BUop_cI^r==krN%#$+YMVD6#^!rPf=y9sQ8hH_JeXgI9gESZtdL zr0)=UP|o}LAtpH4)MGIB-I|K#tN=o}SfZlWUFe5J-~vM7u2fbm(XD$Qtf<2VbP)V; zL0k1;%-gt-dBwY!SN{iy)NhR<^dD;AHgyfEvbIM;nbNgJj!9jOMfTuontnUK?ZGko z8`ga21%_OtAj6Lrfc#qdZ(3*Rc-HZ4UT; zWH(awH-WS=_mWEn;Zx(DBAhivH3or7xZ3T}+{mE$#DMJamAoG*e;&`9T>J6(OzCvb z;-hT_TDsdR&xKs?mD+FlAd2w4tBae&?-==Yj7vvKlhYqF><`gPO}^LFpe00CHSO+H zAc~61NHCheJMzQ^wPB}?y77VvaqXsC(RjD?!(XeWwJ#Z~zmZ0zrCEkM@bL~=cn2B- z(d`6?a)HJ1Utf&rP(czcftMi5()`pAdqV0~4*r0e|N0(Y_VJrX)$Zky@tk+N0rzfG zgiyX^FW}G;yus4vJ1g`4udu{^AL*$X{x~coq2VNqc3|+Y>F~;B3>elD(ldMHj=O4T zkkS{O{>tDM@m7M7U9AcndMQlz+b|-|Aou`T5UecvEMw)ja{F#zAl;ftf;y+LiQ(H{j@uTDR9*F?)PJAb2UEnRr24=cthWZ6JWtLg?AJ(K1*tOThk zgM(avlesE7#49cBO4EHz`R~8aE$WvQNVHG}QLVE$&vw0L{DP#(?HzO3~h7tWs6>J#sNHFpEE6b31GmS zV|8qI!7?g90KdH~ML0w7a6Bs>086wC4j}`zP1tr>}CP8AW;HO+u6k zi{s{9d$|uSDIqeIm~6$lm`Tto8 zziRV9|ACj@lK-=!JYL!cjJ!CbwD=*$Lr(@$*@9-Th%)s$!A^vsJS$Tew4Ui?M(K*ZEen&3~SmdoHvUO*MsHE!hz<^R} z&U=@f_f0DEQ$GinJY|ofFb~!Bt{$eSj^K0Hlf`DLXp4~f!h4v9mk*9e6J35dFalZa zovq5mQ^gn9jAqKAEJt%4>B&PUnmLT_M&8IDT7JnO@taVh4bT?3R>Wv~y zlwxdwKlY|=^BqSZQ9YTk&za&m0|TmPHDJ%Ul*&YN8Z9E|oc2`LiI)S@Ae`b+sl~ia>r#NGyx|cT=af-b?|%IC`K8u#cIF z`KKz#K3MkHBdGLS(XsHRKomerkPm`ipjg(LDZ6~V5c-J$9k^mo1aoGfDr73XsuiYn zi@U%BL%R$VS*v8IXf(COJr?*ye|DAltyWQ-8pRSGMhCGc>J*cPTINbk(n;=~m?ak( zfR7ANh?48>b9hp5|Kp%?n66}{d(a8q?n2z#bmyibP81*eQQAMD`qiU$VG<4 z1#FGBtE^nSSg|Vz=|HCm@A=725Y{c5A@jMaWfcfT zr8nE-jDq38TZ{T=Sq+RT7)qC{3RCYW4v4T&p8~!3Q4wzYMpYbgfCq95Khf6yFt2CU z{Gukim6N6f10hR{YY^zM1W{!_dfk}Tf|mkR60tuJcqF$l`Ci3;7lY%7aMJ-a9pq~V zS*KpG8f#3g{nF7 zNQF*Xuj6g^k9`6G&zVw^JJ{IuVd?cM93ys1sYasVI*y{g=~?WFtGAxva|p)IyF62D zK2Hzfgcp#!)N@5hfAosT6W4kL4@6+Zi%dU9r61P$v8Oc8mV&Otr~D}b{JlCFweQuy zSR+8O;H!m+wLW{-X}q^|)p(zuQn5}jTD=s$WW|%?ayVi%WMOdZ6v|s3?;c0wDA>~4qZ^97?IP@$INAL zH_0#qa9BR13M(K_m`{T&jC(jhB?et{bnNY5oBZ*)T~^A(@eE!D=p|l8rK^hyECoH; zNH&x0L7n&CNkmFkrbP&6@>NFP!gOmYL_+2gB;#JQkI4MNmjyGeNH_?*98t{%BBfsx~2ex114CO zUKD|4NAZgV>251^7Yvq_%5=_Pr#POIDh1v}%k`@X@n>Z!!FzqmY-sL)OgyJv3+U6q z_l@|JA2)#m@)PBz0EbAE?D_jL?y-+CNfk)LvSc{;uVSVjKf0<#OTaevXGz1F#VXTq zF&5Uvrx>F_g&1Rtgs*R}0dbpS9Ktj5@OL?C1Xv-?1=6q-d`{Xem#w&k+Xpi-L)rJX zF{};l%S%Fr?&{rE&>`#pg!PZMNFul#RgEH8J>JAk^^t}=1>a5t*E4$N%cJn_bNOlK zm1hkjXS!22j!xU|=r{h5lREQL>`>=t?=dYA)d`2Qixy|A)gclN+sB;p#O6E0JG2tz z_MgJ$8-UyCZ-|Q(;WBq)y_L2U{>Zb;KM8O)=mge#p9(Wt)j9cHCUmuN@AnEswiU-m z7oyB&zrFMeLtKa24$wQmw=_slG;?Rx9YH&85z9Rf7Ie+3Gp7O8j6cS^ng1U80>bIZ zPya#q5XdO63F@Xk_)FQ&o^NQ@bVgHIkj?zo>;C{b@f{*u-B=7Sh_2Zr&CDxY-ULZv zS)(LEDy%l}s(aDg`BY3v4A9Hv$R2cK2Le%@@X+aSLlCkwMM6)5T0YE*G7*ALX-Y$y zDg=Hr98rV;L7r{Jgzibh@C4v3aaIR*0G$Yv(-$QdK7*viGVC-E zFu}X?6Q9=9y8Z{){($k9s<^Pzln_ynb_6&lK};ixM}8|YjVG0w4(*T+4m>9i9|3ME z20M$z=IfC`M`!>#!sYCWevvSQDPo`x_2>7kbq)sp$~7#23!-!Y2`l1rsx!@R6GC=~ z-x7d?Ob)a;L*`A{BDhfMJjgFzBdVFKuLklg|469-DhRaLP5fW1It@^}vRh}7R6xp&#Hk;^E+6cWVV22Z`DgrH5N?N4|8J9d9)vbJK(WBt1lD1SeFzJs zR{(kyOQ3@gvz(L-^o8j%;SK=_sDD;Wcx=pLpqVfTFo3224E|LtU5JA2htpswaQX!k zc&s#0o&06tBK{PbQW1KZGI0sd_FM9f*k!wi87fc1XiJXAsp3j_WRSFhDC&Gx)gw@v zUxZApE#${G0AJ+B*=f5c%PV&*naF4^Jq%hTfLVJP&E?k|?qgmpROYr#Xejp@uysyz zs{P%|#~G}i`ktx^;WYY~dErOja9+>Ijj9mxbDa{`u^X$nDBkPV!C21#Jm=F+=6z}A zNheBfC8lI|^0p_x1J&fNfpFL(8C$u*zhF9EfY;7k6D{5My7j@jd*W|4nqs{Tw{VSR zu-;<#F@ho|L|<{edj9hrP!f7Q`j%RQBQ9lV_u>#9z zes^TK_{~gx!-2nIY6(=v zZYC9t^6)`esr;?S;vE;65^W;q-pKn^|TMnk%_QA**rW&MKUr#t3sO zx4O)V(iNb>?0iAh@-ch4`a6|0z3)EH&Io-MHs8Bw%Ug9#L%%F&;^jzePZ)1OSU)Uq zF1{puYOtUw_4_Mc)6x|tI)Row?1f8&tB*~-8+z8o#7M1DAg*2eCLho7+Jsk#%kk+Q z-fz>p==-cRFAF*^^TUV*UgA9`Wc5p9O~Gc|4eJw?Ra{b3Nr#sDORPY<(`C2HPYhMu z!_%k@Dfgln&Cg69o`z45a(-bHt?r41u=vWoD~x9RZ(9LMk)LKp5n`=2aW9N?WVcF{ z>=fm)iI{{6j6f4ItS`25MIYcf89%!m9f%@$Il=PohqJChzSza`A9UA)+^Z z1eHczXF#18{|G$74@hzr*|eQHhI}>Ygd{+U-rjP{mA&b1dI8e$5Kze8T(b^jO8uq- z$TxCu1vQy;MdIw5`ZHLn_HhuH!WT=8D_<;GOv2Z4|0@*>E4@uSbJ!JY`8kr{Jfe^# zhmpTR*Gz{mSoHF@F*Kh`GrfM<%KagBxf=G?Nn*X%_jP1X94SfAf!iYq5m(ZnwowJ)W37@U(1@)^(e!u7UM>RYgtm zewDV3J+PNa{Rum1=dW6Y36?5f=Y*Ovd-5AT$JW^X3vYGS$eI?>sC1`8cdbxU-#@vk zio0t?QN7ZOWU}^}BIG2J9JPofsHJQ>0GXA<`brWZvmB%GkW5fKfTj8ccF8bGPrlK} zI__zxM(NKJ*cDlTkRsw!3Z?`PeQ{4^X_>x;47yH=bN6Xj(RFLIRd*6s@~ID0;M#jAUX%R`Q5MIzrr_2@bPQm?_tXy!Ok)+ z*=7-gg5di-X(uX~prJ(~2%CvwG~D03fzvHrS!oi1|0PkXSfjUVs>SC9k- zh&aKQcaYq>j5!4PEH8-`5X=s{f?yINOU6{c86v+Vhg{TNAPlQuy>+)1UIg`;hIa!h zNFBapm0{*3(@Q~ZE%?}kKfwFgZdhRcsg}N+1;;rZgI>K%BO$q{x8SY|5rKpnbZNkK zNYqc{f}U3a7^d8nloT*bO?}mf6l&Sj(h-%w0a*h%;;b0xn{V$K`5BEvNXM@W_g_VA z)i$gD&Wndmt0#!d&1yr&$h<2;`IbaMx&))Ll{;TvNd z4nFScmmIA`7k*!h4($d_s$gLF179Ed9TCbxW6-N3n@sWYiU}m1ug(v2YU!BLSDYWcZ&PBVK-A0O#))G3zLWR~-K=A=roiuK^IPiK*nR{$CaR^=ITo8Rz zfNpKi*5G-Y>k51SI!o_<2;T)%APe^SPZ!OE?`_4Mf8mnhb;%p=Kfjlw7oqz^nK&+R8<*}{Rs zqa%|0EJeFYVx}*L7lu~W_<3gZF7i8l(iY!zhJ2D7`LyUl2$_4H&fl>^xQF+)P!RNf z-e$YhcFEMM#G09g%!uDccI@cssxFTIQd)r8C=os;@pJW;wJNbafByOT%NN0yVP~m@ z*}Tk`y-NJ|qXu(1X95L*F|j41qa1EwPw=F@@SE*_8Z5q%F!KAORz5-?nr}M&L{HyN zX}TmfFp$sD;_%#(3g_|9(@vU7NoVeUw$#%7?#z}|)7mEnzH}P~8#Q&LnMAd0wTO(BeE_ zZxlXekxKnEDlmR%qW7scwEE>9$4@t$LtgYQwIsAzN$#kfGPzSzQ{y+P5#Bt1#TD{* zjF#zz_qRU}t;xEn5mNa4{ri^bd4mb1z=cl<{aj8@nZcLnG{?U4VQt%*6Kedg@K`;3 zw?j*Vzl9AK%jdp~pQaf6i3@4np4Qu>JZbL}7R2oRH*U zCJ8IdTrMqWLb#&uOMQI*I5WQbd9oPI!fCW<#y+A%^58E`qA#g`$~*t$>*JIorn|R2 zbA53LD-Al@P&2Z zHDbzXQ^{7_-y~acbS3j1#9a0s-J$bhd z;`@C$B?G#SbyAX?rFof_y0nmaf#t@)nA)1@R{8axvuV5DkKM;TJrrxsqAfHDynT8X zuL>^A@majUvO&jBna(xMZj&DJEg#+deKpIA!X_21ekM)jG+XsYNvXvw(7J?))%TRv izm9AYJx Date: Fri, 9 May 2025 19:38:11 +0200 Subject: [PATCH 002/323] whos getting the best head: A. Alvin B. Theodore C. Simon (Secret option) Me --- .../java/com/hbm/config/StructureConfig.java | 12 ++-- .../java/com/hbm/itempool/ItemPoolsPile.java | 44 +++++++++++--- .../java/com/hbm/main/StructureManager.java | 11 ++++ src/main/java/com/hbm/util/LootGenerator.java | 17 +++++- .../com/hbm/world/gen/NTMWorldGenerator.java | 59 +++++++++++++++++-- 5 files changed, 124 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java index 2f6bb9bf9..5ce4c6d51 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -10,8 +10,8 @@ public class StructureConfig { public static int enableStructures = 2; - public static int structureMinChunks = 8; - public static int structureMaxChunks = 24; + public static int structureMinChunks = 4; + public static int structureMaxChunks = 12; public static double lootAmountFactor = 1D; @@ -25,15 +25,15 @@ public class StructureConfig { enableStructures = CommonConfig.parseStructureFlag(unparsedStructureFlag); - structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8); - structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24); + structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 4); + structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 16); lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); debugStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.04_debugStructures", "If enabled, special structure blocks like jigsaw blocks will not be transformed after generating", false); - structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); - structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); + structureMinChunks = CommonConfig.setDef(structureMinChunks, 4); + structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 12); if(structureMinChunks > structureMaxChunks) { MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); diff --git a/src/main/java/com/hbm/itempool/ItemPoolsPile.java b/src/main/java/com/hbm/itempool/ItemPoolsPile.java index ad2a7f3ae..0a4378211 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsPile.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsPile.java @@ -21,9 +21,10 @@ public class ItemPoolsPile { public static final String POOL_PILE_MAKESHIFT_PLATES = "POOL_PILE_MAKESHIFT_PLATES"; public static final String POOL_PILE_MAKESHIFT_WIRE = "POOL_PILE_MAKESHIFT_WIRE"; public static final String POOL_PILE_NUKE_STORAGE = "POOL_PILE_NUKE_STORAGE"; - + public static final String POOL_PILE_OF_GARBAGE = "POOL_PILE_OF_GARBAGE"; + public static void init() { - + //items found in glyphid hives new ItemPool(POOL_PILE_HIVE) {{ this.pool = new WeightedRandomChestContent[] { @@ -56,7 +57,7 @@ public class ItemPoolsPile { weighted(Items.experience_bottle, 0, 1, 3, 5), }; }}; - + //items found in glyphid bone piles new ItemPool(POOL_PILE_BONES) {{ this.pool = new WeightedRandomChestContent[] { @@ -65,7 +66,7 @@ public class ItemPoolsPile { weighted(ModItems.biomass, 0, 1, 1, 2) }; }}; - + //bottlecap stashess new ItemPool(POOL_PILE_CAPS) {{ this.pool = new WeightedRandomChestContent[] { @@ -74,7 +75,7 @@ public class ItemPoolsPile { weighted(ModItems.cap_sparkle, 0, 4, 4, 1), }; }}; - + //medicine stashes new ItemPool(POOL_PILE_MED_SYRINGE) {{ this.pool = new WeightedRandomChestContent[] { @@ -91,13 +92,13 @@ public class ItemPoolsPile { weighted(ModItems.siox, 0, 1, 1, 5), }; }}; - + //makeshift gun new ItemPool(POOL_PILE_MAKESHIFT_GUN) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.gun_maresleg, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WRENCH) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wrench, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_PLATES) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.plate_steel, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WIRE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wire_fine, Mats.MAT_ALUMINIUM.id, 1, 1, 10) }; }}; - + new ItemPool(POOL_PILE_NUKE_STORAGE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ammo_standard, EnumAmmo.NUKE_STANDARD.ordinal(), 1, 1, 50), @@ -106,5 +107,34 @@ public class ItemPoolsPile { }; }}; + + new ItemPool(POOL_PILE_OF_GARBAGE) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.pipe, 2600, 0, 2, 20), + weighted(ModItems.scrap, 0, 1, 5, 20), + weighted(ModItems.wire_fine, 8200, 1, 2, 20), + weighted(ModItems.dust, 0, 1, 3, 40), + weighted(ModItems.dust_tiny, 0, 1, 7, 40), + weighted(ModItems.powder_cement, 0, 1, 6, 40), + weighted(ModItems.nugget_lead, 0, 0, 3, 20), + weighted(ModItems.wire_fine, 0, 0, 3, 20), + weighted(ModItems.powder_ash, 0, 0, 1, 15), + weighted(ModItems.plate_lead, 0, 0, 1, 15), + weighted(Items.string, 0, 0, 1, 15), + weighted(ModItems.bolt, 8200, 0, 2, 15), + weighted(ModItems.pin, 0, 0, 2, 15), + weighted(ModItems.cap_nuka, 0, 0, 8, 15), + weighted(ModItems.plate_iron, 0, 0, 2, 15), + weighted(ModItems.fallout, 0, 0, 2, 15), + weighted(ModItems.coil_tungsten, 0, 0, 2, 15), + weighted(ModItems.can_empty, 0, 0, 1, 15), + weighted(ModItems.ingot_asbestos, 0, 0, 1, 15), + weighted(ModItems.syringe_metal_empty, 0, 0, 1, 15), + weighted(ModItems.syringe_empty, 0, 0, 1, 15), + weighted(ModItems.pipe_lead, 0, 0, 1, 5), + weighted(ModItems.motor, 0, 0, 1, 5), + weighted(ModItems.canned_conserve, 2, 0, 1, 5), + }; + }}; } } diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..c9f840b76 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -62,6 +62,17 @@ public class StructureManager { public static final NBTStructure lighthouse = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/lighthouse.nbt")); public static final NBTStructure dish = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/dish.nbt")); + public static final NBTStructure ntmruinsA = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsA.nbt")); + public static final NBTStructure ntmruinsB = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsB.nbt")); + public static final NBTStructure ntmruinsC = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsC.nbt")); + public static final NBTStructure ntmruinsD = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsD.nbt")); + public static final NBTStructure ntmruinsE = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsE.nbt")); + public static final NBTStructure ntmruinsF = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsF.nbt")); + public static final NBTStructure ntmruinsG = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsG.nbt")); + public static final NBTStructure ntmruinsH = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsH.nbt")); + public static final NBTStructure ntmruinsI = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsI.nbt")); + public static final NBTStructure ntmruinsJ = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsJ.nbt")); + public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index b14306b9e..586ff6295 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -28,6 +28,7 @@ public class LootGenerator { public static final String LOOT_BONES = "LOOT_BONES"; public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; + public static final String LOOT_SHIT = "LOOT_SHIT"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -40,6 +41,7 @@ public class LootGenerator { case LOOT_BONES: lootBones(world, x, y, z); case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); + case LOOT_SHIT: lootShit(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -55,6 +57,7 @@ public class LootGenerator { LOOT_BONES, LOOT_GLYPHID_HIVE, LOOT_METEOR, + LOOT_SHIT, }; } @@ -211,4 +214,16 @@ public class LootGenerator { } } -} \ No newline at end of file + public static void lootShit(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 3; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_OF_GARBAGE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } +} diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index bb1c7b3d3..cbbf13197 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -46,7 +46,7 @@ public class NTMWorldGenerator implements IWorldGenerator { structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = 2; }}); - + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); @@ -102,8 +102,7 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 8; }}); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change - + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> biome == BiomeGenBase.plains; structure = new JigsawPiece("dish", StructureManager.dish, -10); @@ -112,8 +111,58 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); - NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); - NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; + spawnWeight = 20; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; + spawnWeight = 35; + }}); + + NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); From 37546b252dafe5608e37472a336b30f43bec0d52 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Tue, 10 Jun 2025 20:35:59 +0300 Subject: [PATCH 003/323] =?UTF-8?q?=F0=9F=85=B0=EF=B8=8Fss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/uk_UA.lang | 62 ++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 28776824b..9891b1542 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -566,6 +566,21 @@ cannery.schottky.7=If any virtual particles encounter any malformed segments, al cannery.schottky.8=Note that virtual particles will never use the same Diode exit twice. Infinite loops will fail, but re-entering a Diode is otherwise fine cannery.schottky.9=Your Schottky Particle Diode should be properly enclosed, with free paths for each intersection exit +chem.hydrogen=Водень +chem.hydrogencoke=Hydrogen from CokeAdd commentMore actions +chem.oxygen=Кисень +chem.xenon=Ксеноновий газ +chem.xenonoxy=Ксеноновий газ (Охолоджений) +chem.helium3=Гелій-3 +chem.ethanol=Етанол +chem.biogas=Біогаз +chem.biofuel=Трансестерифікація біопалива +chem.reoil=Очищення оливи +chem.gasoline=Газолін +chem.tarsand=Бітум з бітумінозного піску +chem.meatprocessing=Обробка м'яса гліфідів +chem.birkeland=Азотна кислота з повітря + chem.ARSENIC=Екстракція миш'яку chem.ASPHALT=Виробництво асфальту chem.BAKELITE=Виробництво карболіту @@ -759,6 +774,7 @@ container.machineAmmoPress=Прес для боєприпасів container.machineArcWelder=Дуговий зварювальник container.machineArcFurnaceLarge=Дугова піч container.machineBoiler=Нагрівач нафти +container.machineChemicalPlant=Хімічний завод container.machineCMB=CMB Steel Furnace container.machineCoal=Твердопаливний генератор container.machineCoker=Коксова установка @@ -1398,22 +1414,25 @@ hazard.particleFine=Твердих часток hazard.sand=Подразників очей hbm.key=NTM Hotkeys -hbm.key.calculator=Calculator -hbm.key.copyToolAlt=Copy Tool: Switch Paste -hbm.key.copyToolCtrl=Copy Tool: Paste to Pipes -hbm.key.craneLoad=Load/Unload Crane -hbm.key.craneMoveDown=Move Crane Backward -hbm.key.craneMoveLeft=Move Crane Left -hbm.key.craneMoveRight=Move Crane Right -hbm.key.craneMoveUp=Move Crane Forward -hbm.key.dash=Dash -hbm.key.gunPrimary=Primary Fire -hbm.key.gunSecondary=Secondary Fire -hbm.key.gunTertitary=Gun Sights -hbm.key.toggleBack=Toggle Jetpack -hbm.key.toggleHUD=Toggle HUD -hbm.key.trainInv=Train Inventory -hbm.key.reload=Reload +hbm.key.ability=Перемикання здібностей інструмента +hbm.key.abilityAlt=Конфігурація здібностей інструмента +hbm.key.calculator=Калькулятор +hbm.key.copyToolAlt=Інструмент копіювання: Перемикнути вставку +hbm.key.copyToolCtrl=Інструмент копіювання: Застосувати до труб +hbm.key.craneLoad=Завантажити/Розвантажити кран +hbm.key.craneMoveDown=Рухати кран назад +hbm.key.craneMoveLeft=Рухати кран вліво +hbm.key.craneMoveRight=Рухати кран вправо +hbm.key.craneMoveUp=Рухати кран вперед +hbm.key.dash=Ривок +hbm.key.gunPrimary=Основний вогонь +hbm.key.gunSecondary=Альтернативний вогонь +hbm.key.gunTertitary=Приціл +hbm.key.toggleBack=Перемикання реактивного ранця +hbm.key.toggleHUD=Перемикання HUD +hbm.key.toggleMagnet=Перемикання магніта +hbm.key.trainInv=Інвентар поїзда +hbm.key.reload=Перезарядити hbmfluid.air=Стиснене повітря hbmfluid.alumina=Оксид алюмінію @@ -1449,8 +1468,8 @@ hbmfluid.death=Розчин осмистого іридію hbmfluid.deuterium=Дейтерій hbmfluid.diesel=Дизель hbmfluid.diesel_crack=Крекінговий дизель -hbmfluid.diesel_crack_reform=Високооктановий крекінговий дизель -hbmfluid.diesel_reform=Високооктановий дизель +hbmfluid.diesel_crack_reform=Високоцетановий крекінговий дизель +hbmfluid.diesel_reform=Високоцетановий дизель hbmfluid.egg=Розчинене яйце hbmfluid.estradiol=Розчин естрадіолу hbmfluid.ethanol=Етанол @@ -3620,6 +3639,7 @@ item.part_barrel_light.name=Легкий ствол %s item.part_beryllium.name=Коробка з берилієвим пилом item.part_carbon.name=Коробка з вугільним пилом item.part_copper.name=Коробка з мідним пилом +item.part_generic.glass_polarized.name=Поляризована лінза item.part_generic.hde.name=Елемент для важких умов експлуатації item.part_generic.lde.name=Елемент низької щільності item.part_generic.piston_electric.name=Електричний поршень @@ -5346,6 +5366,7 @@ tile.geiger.name=Лічильник Гейгера tile.glass_ash.name=Попелясте скло tile.glass_boron.name=Борне скло tile.glass_lead.name=Свинцеве скло +tile.glass_polarized.name=Поляризоване скло tile.glass_polonium.name=Полонієве скло tile.glass_quartz.name=Кварцове скло tile.glass_trinitite.name=Тринітитове скло @@ -5369,10 +5390,6 @@ tile.hadron_coil_neodymium.name=Щільна неодимова котушка tile.hadron_coil_schrabidate.name=Щільна шрабідатова котушка tile.hadron_coil_schrabidium.name=Щільна шрабідієва котушка tile.hadron_coil_starmetal.name=Щільна котушка з зіркового металу -tile.hadron_cooler.name=Блок охолодження прискорювача частинок -tile.hadron_cooler.desc=Cooling power: 10$Overcooling threshold: 10$Cooling bonus: +10%%$Overcooling penalty: -25%% -tile.hadron_cooler_mk2.name=Particle Accelerator Cooling Unit - The Palindrome Special -tile.hadron_cooler_mk2.desc=Cooling power: 5$Efficiency function: 2-(cooling-15)²/225$Maximum penalty: -90%% tile.hadron_core.name=Particle Accelerator Core Component tile.hadron_diode.name=Schottky Particle Diode tile.hadron_plating.name=Particle Accelerator Plating @@ -5473,6 +5490,7 @@ tile.machine_catalytic_cracker.name=Вежа каталітичного крек tile.machine_catalytic_reformer.name=Каталітичний риформер tile.machine_centrifuge.name=Центрифуга tile.machine_chemfac.name=Хімічна фабрика +tile.machine_chemical_plant.name=Хімічний завод 2: Electric Boogaloo tile.machine_chemplant.name=Хімічний завод tile.machine_chungus.name=Парова турбіна "Левіафан" tile.machine_chungus.desc=Ефективність: 85%% From ae593a8188e918cf00618a9eb9bbf154d9624cfd Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 12 Jun 2025 22:06:04 +0300 Subject: [PATCH 004/323] Add metal trapdoors By analogy with metal ladders. Felt weird to cap one off with a wooden hatch. Also, the mod's trapdoors are climbable if placed above a ladder. --- src/main/java/com/hbm/blocks/ModBlocks.java | 32 ++++++++++++ .../hbm/blocks/generic/BlockNTMTrapdoor.java | 46 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 11 +++++ src/main/resources/assets/hbm/lang/de_DE.lang | 10 ++++ src/main/resources/assets/hbm/lang/en_US.lang | 10 ++++ src/main/resources/assets/hbm/lang/it_IT.lang | 10 ++++ src/main/resources/assets/hbm/lang/pl_PL.lang | 10 ++++ src/main/resources/assets/hbm/lang/ru_RU.lang | 10 ++++ src/main/resources/assets/hbm/lang/uk_UA.lang | 10 ++++ src/main/resources/assets/hbm/lang/zh_CN.lang | 10 ++++ .../textures/blocks/trapdoor_aluminium.png | Bin 0 -> 833 bytes .../hbm/textures/blocks/trapdoor_cobalt.png | Bin 0 -> 862 bytes .../hbm/textures/blocks/trapdoor_copper.png | Bin 0 -> 871 bytes .../hbm/textures/blocks/trapdoor_gold.png | Bin 0 -> 838 bytes .../hbm/textures/blocks/trapdoor_iron.png | Bin 0 -> 798 bytes .../hbm/textures/blocks/trapdoor_lead.png | Bin 0 -> 846 bytes .../hbm/textures/blocks/trapdoor_steel.png | Bin 0 -> 790 bytes .../hbm/textures/blocks/trapdoor_sturdy.png | Bin 0 -> 883 bytes .../hbm/textures/blocks/trapdoor_titanium.png | Bin 0 -> 842 bytes .../hbm/textures/blocks/trapdoor_tungsten.png | Bin 0 -> 751 bytes 20 files changed, 159 insertions(+) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_cobalt.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_iron.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_lead.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 143c33fa0..ccf1f73aa 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -845,6 +845,17 @@ public class ModBlocks { public static Block ladder_steel; public static Block ladder_tungsten; + public static Block trapdoor_sturdy; + public static Block trapdoor_iron; + public static Block trapdoor_gold; + public static Block trapdoor_aluminium; + public static Block trapdoor_copper; + public static Block trapdoor_titanium; + public static Block trapdoor_lead; + public static Block trapdoor_cobalt; + public static Block trapdoor_steel; + public static Block trapdoor_tungsten; + public static Block barrel_plastic; public static Block barrel_corroded; public static Block barrel_iron; @@ -1972,6 +1983,17 @@ public class ModBlocks { ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); + trapdoor_sturdy = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_sturdy").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_sturdy"); + trapdoor_iron = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_iron").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_iron"); + trapdoor_gold = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_gold").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_gold"); + trapdoor_aluminium = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_aluminium").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_aluminium"); + trapdoor_copper = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_copper").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_copper"); + trapdoor_titanium = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_titanium").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_titanium"); + trapdoor_lead = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_lead").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_lead"); + trapdoor_cobalt = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_cobalt").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_cobalt"); + trapdoor_steel = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_steel").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_steel"); + trapdoor_tungsten = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_tungsten").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_tungsten"); + barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); barrel_corroded = new BlockFluidBarrel(Material.iron, 6000).setBlockName("barrel_corroded").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_corroded"); barrel_iron = new BlockFluidBarrel(Material.iron, 8000).setBlockName("barrel_iron").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_iron"); @@ -3234,6 +3256,16 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_steel, ladder_steel.getUnlocalizedName()); GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_sturdy, trapdoor_sturdy.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_iron, trapdoor_iron.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_gold, trapdoor_gold.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_titanium, trapdoor_titanium.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_copper, trapdoor_copper.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_tungsten, trapdoor_tungsten.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_aluminium, trapdoor_aluminium.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_steel, trapdoor_steel.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_lead, trapdoor_lead.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_cobalt, trapdoor_cobalt.getUnlocalizedName()); register(barrel_plastic); register(barrel_corroded); diff --git a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java new file mode 100644 index 000000000..2915bb0df --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java @@ -0,0 +1,46 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockTrapDoor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.IBlockAccess; + +public class BlockNTMTrapdoor extends BlockTrapDoor { + public BlockNTMTrapdoor(Material material) { + super(material); + } + + @Override + public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { + int meta = world.getBlockMetadata(x, y, z); + + // isOpen + if (!func_150118_d(meta)) + return false; + + Block blockBelow = world.getBlock(x, y - 1, z); + return blockBelow != null && blockBelow.isLadder(world, x, y - 1, z, entity); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + super.setBlockBoundsBasedOnState(world, x, y, z); + + // Make the hitbox in-line with ladders + if (isLadder(world, x, y, z, null)) { + int meta = world.getBlockMetadata(x, y, z); + float thickness = 0.125F; + + if ((meta & 3) == 0) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - thickness, 1.0F, 1.0F, 1.0F); + } else if ((meta & 3) == 1) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, thickness); + } else if ((meta & 3) == 2) { + this.setBlockBounds(1.0F - thickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else if ((meta & 3) == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, thickness, 1.0F, 1.0F); + } + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 76646f307..1c2a3e66c 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -882,6 +882,17 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.ladder_steel, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.ladder_tungsten, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', W.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_sturdy, 1), new Object[] { Blocks.trapdoor, KEY_PLANKS }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_iron, 1), new Object[] { Blocks.trapdoor, IRON.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_gold, 1), new Object[] { Blocks.trapdoor, GOLD.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_aluminium, 1), new Object[] { Blocks.trapdoor, AL.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_copper, 1), new Object[] { Blocks.trapdoor, CU.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_titanium, 1), new Object[] { Blocks.trapdoor, TI.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_lead, 1), new Object[] { Blocks.trapdoor, PB.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_cobalt, 1), new Object[] { Blocks.trapdoor, CO.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_steel, 1), new Object[] { Blocks.trapdoor, STEEL.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_tungsten, 1), new Object[] { Blocks.trapdoor, W.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.machine_storage_drum), new Object[] { "LLL", "L#L", "LLL", 'L', PB.plate(), '#', ModItems.tank_steel }); addRecipeAuto(new ItemStack(ModBlocks.deco_pipe, 6), new Object[] { "PP", 'P', STEEL.pipe() }); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 819c38039..52da5cf02 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4318,6 +4318,16 @@ tile.ladder_steel.name=Stahlleiter tile.ladder_sturdy.name=Feste Holzleiter tile.ladder_titanium.name=Titanleiter tile.ladder_tungsten.name=Wolframleiter +tile.trapdoor_aluminium.name=Aluminium-Falltür +tile.trapdoor_cobalt.name=Kobalt-Falltür +tile.trapdoor_copper.name=Kupfer-Falltür +tile.trapdoor_gold.name=Goldene -Falltür +tile.trapdoor_iron.name=Eisen-Falltür +tile.trapdoor_lead.name=Bleilieter +tile.trapdoor_steel.name=Stahl-Falltür +tile.trapdoor_sturdy.name=Feste Holz-Falltür +tile.trapdoor_titanium.name=Titan-Falltür +tile.trapdoor_tungsten.name=Wolfram-Falltür tile.lamp_demon.name=Dämonenkernlampe tile.lamp_tritium_blue_off.name=Blaue Tritiumlampe tile.lamp_tritium_blue_on.name=Blaue Tritiumlampe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d690efe90..41e5b5e8f 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5443,6 +5443,16 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_aluminium.name=Aluminium Trapdoor +tile.trapdoor_cobalt.name=Cobalt Trapdoor +tile.trapdoor_copper.name=Copper Trapdoor +tile.trapdoor_gold.name=Golden Trapdoor +tile.trapdoor_iron.name=Iron Trapdoor +tile.trapdoor_lead.name=Lead Trapdoor +tile.trapdoor_steel.name=Steel Trapdoor +tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor +tile.trapdoor_titanium.name=Titanium Trapdoor +tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/it_IT.lang b/src/main/resources/assets/hbm/lang/it_IT.lang index 691badc0e..a9fd2e1ff 100644 --- a/src/main/resources/assets/hbm/lang/it_IT.lang +++ b/src/main/resources/assets/hbm/lang/it_IT.lang @@ -5513,6 +5513,16 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_aluminium.name=Aluminium Trapdoor +tile.trapdoor_cobalt.name=Cobalt Trapdoor +tile.trapdoor_copper.name=Copper Trapdoor +tile.trapdoor_gold.name=Golden Trapdoor +tile.trapdoor_iron.name=Iron Trapdoor +tile.trapdoor_lead.name=Lead Trapdoor +tile.trapdoor_steel.name=Steel Trapdoor +tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor +tile.trapdoor_titanium.name=Titanium Trapdoor +tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/pl_PL.lang b/src/main/resources/assets/hbm/lang/pl_PL.lang index f33a8a715..221ac256c 100644 --- a/src/main/resources/assets/hbm/lang/pl_PL.lang +++ b/src/main/resources/assets/hbm/lang/pl_PL.lang @@ -4859,6 +4859,16 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_aluminium.name=Aluminium Trapdoor +tile.trapdoor_cobalt.name=Cobalt Trapdoor +tile.trapdoor_copper.name=Copper Trapdoor +tile.trapdoor_gold.name=Golden Trapdoor +tile.trapdoor_iron.name=Iron Trapdoor +tile.trapdoor_lead.name=Lead Trapdoor +tile.trapdoor_steel.name=Steel Trapdoor +tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor +tile.trapdoor_titanium.name=Titanium Trapdoor +tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 5c3efa442..9df3de831 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5688,6 +5688,16 @@ tile.ladder_steel.name=Стальная лестница tile.ladder_sturdy.name=Прочная деревянная лестница tile.ladder_titanium.name=Титановая лестница tile.ladder_tungsten.name=Вольфрамовая лестница +tile.trapdoor_aluminium.name=Алюминиевый люк +tile.trapdoor_cobalt.name=Кобальтовый люк +tile.trapdoor_copper.name=Медный люк +tile.trapdoor_gold.name=Золотый люк +tile.trapdoor_iron.name=Железный люк +tile.trapdoor_lead.name=Свинцовый люк +tile.trapdoor_steel.name=Стальный люк +tile.trapdoor_sturdy.name=Прочный деревянный люк +tile.trapdoor_titanium.name=Титановый люк +tile.trapdoor_tungsten.name=Вольфрамовый люк tile.lamp_demon.name=Лампа из заряда-демона tile.lamp_tritium_blue_off.name=Синяя тритиевая лампа tile.lamp_tritium_blue_on.name=Синяя тритиевая лампа diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 28776824b..0026e0a6f 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -5426,6 +5426,16 @@ tile.ladder_steel.name=Сталева драбина tile.ladder_sturdy.name=Міцна дерев'яна драбина tile.ladder_titanium.name=Титанова драбина tile.ladder_tungsten.name=Вольфрамова драбина +tile.trapdoor_aluminium.name=Алюмінієвий люк +tile.trapdoor_cobalt.name=Кобальтовий люк +tile.trapdoor_copper.name=Мідний люк +tile.trapdoor_gold.name=Золотий люк +tile.trapdoor_iron.name=Залізний люк +tile.trapdoor_lead.name=Свинцевий люк +tile.trapdoor_steel.name=Сталевий люк +tile.trapdoor_sturdy.name=Міцний дерев'яний люк +tile.trapdoor_titanium.name=Титановий люк +tile.trapdoor_tungsten.name=Вольфрамовий люк tile.lamp_demon.name=Ядро-демон лампа tile.lamp_tritium_blue_off.name=Синя тритієва лампа tile.lamp_tritium_blue_on.name=Синя тритієва лампа diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 41847c119..689ed7dcb 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5158,6 +5158,16 @@ tile.ladder_steel.name=钢制梯子 tile.ladder_sturdy.name=坚固木头制梯子 tile.ladder_titanium.name=钛制梯子 tile.ladder_tungsten.name=钨制梯子 +tile.trapdoor_aluminium.name=铝制活板门 +tile.trapdoor_cobalt.name=钴制活板门 +tile.trapdoor_copper.name=铜制活板门 +tile.trapdoor_gold.name=金制活板门 +tile.trapdoor_iron.name=铁制活板门 +tile.trapdoor_lead.name=铅制活板门 +tile.trapdoor_steel.name=钢制活板门 +tile.trapdoor_sturdy.name=硬木活板门 +tile.trapdoor_titanium.name=钛制活板门 +tile.trapdoor_tungsten.name=钨制活板门 tile.lamp_demon.name=恶魔核心灯 tile.lamp_tritium_blue_off.name=蓝色氚灯 tile.lamp_tritium_blue_on.name=蓝色氚灯 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1391059f1e5d4251b43ad692c065d332b8b6fc GIT binary patch literal 833 zcmV-H1HSx;P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1woxRza#d~~u9*D#9i2B}ONkQP-weR~RVT`el?8#e& z3q=oi_YCM=@)YQy@)*M~P^D|ilGJ{`zOPBOr;ZNgk!r0u`5Txfu}fTUHe&(f*x(Xi zRUAc>#t9j&e!E<{0txTGeSA|Q`&zXsERZxW6spu_C%L~!e{~1r-63Q zn)IZ6KVZ=Ud&^}YNw*F4#?1DWQWgWO(oN$8EV9fcbzNtZ&;s6|EqOS@8d&QB5+E4* z5{lR>>&gi!XW|OZf%WN^fChhsk{geFn?%4C;bv$6-_0l@goajVYgPcB0(4UpGaJjQ zwk%M5YO&a8u^5J9Rq`M;SMGj0&VbQP%Pnw!KiO!l z;yGC6#mq)w0j$DrD1L9YJ7H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wM(HI$Z?3b=1^S7`l6oC~`<@6FD>H)vPaw*?_Ijq)rNOWiQV zTGtySBhR;#y{BX_v&4MnnAvowe|E!@8wIWsHCiK4ZlExpQ1If_*rZvh3Fk7yXmVki;+EY2D2ZnrnAXlMt06exvSjsI3Ro26 zc|8S6lC1#Y3HYLI+$?k8fGb=80D=X9F91m5ERMo2#Y4a53i9CU^h-d4zk>C|h($07*qoM6N<$f=`8z4gdfE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..e91bd7744a1a2b55c1e735484e0c0d6a82c0496d GIT binary patch literal 871 zcmV-t1DO1YP)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wx`lgeB#L z!Rwr%lSB~3$5g_L8Ow?L_^oqI*NDX%r|t>DDnP&Fd?z<0vftY zdR=%VjPK-5wWtyw#x8%uXs4z@6L3YVVp6A8q%f&|)vc=n{bohQ zYV965wnffjLt>lU3z&Ob$^wOP1&p3X6!<&^xFVm3Qpg$HB?}}ubDzaaLzpGzfGgak z&jRj}CiTv#N(%ioC*cbCVr+DlF>t_T7mxtKCiaLE5X71NzE(ow&S_T=2Un**(D~t7 zSqRzjCFv%C$I`2pSOaUeVTYv9(CVmU?iYZkAe|pq_iUWGZ#)Hxr!AH?0y-XpHCxeS z=^cz`e@&IO7-E8>9#X$mVN0@*0@e!ogBUo|b>c!C)2}w-e7f@KqFvpyQR)V+&~;LN xkB0+gk<>;`VU0(;PumDCKcu@SoBsPte*j`9-!_btKe_+_002ovPDHLkV1f*Cor3@X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..64fa024451faf37ab239872513f7e5a0ad98f3a4 GIT binary patch literal 838 zcmV-M1G)T(P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wUaw&BvgimBq6Z3 z-g@sR`i1_kFDU3Gh=PK$mw`|i6{kWHsZp~!%iZzJr3H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wm+n6_wy+59kwn zSp*S86j=mn<~Oj1aX9B(oCSl9d#(L%R8`d=BcdphzVCUJBuVUh9LJ*gd_K~3ofu>6 zU2SGQpUZByleTRg83&5c$>Z^m)oNw$`~67e7Xj%*K0@O8zf5LN!pq%HV#@l1tn0IFTUUJu90ffMq@`C%OCiutPn;c z63u-amu0zJ+LUj%n;RdE#wle@9N1=zqV0A&86!>+@bpLQmmA}iC@fM4%_T-(^Z9J={ut5PMXKvs c{`*UR0p%Lqwo-hyVgLXD07*qoM6N<$fH_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1w?dXJWq}I^f6r z?KnkcPSapIMc``R3m9D1)hFXySHSlJn$BLy^L)+^qp{0{;gD9VPfF`)q$vx&-0ybO zj-V!L)u~6X8u!q`)Kh?~mDCJEmv#V@=P}tPHafb)9Oh&^q#AWhfo zkQEwQ!I?$@EDlJc;Z4KFINmS;#V;+kHu6Sd8Mg77vMjk8&ra307-E9s7AYExd9&JK z1?={ES2=Ln+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..23ed483c9f7729883c786aa7848c48f285ba3537 GIT binary patch literal 790 zcmV+x1L^#UP)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1w?HbK9AF#~{!1Nq#Vnqg}%=w0l-R_Ika<7~^t)iK0l3 z$D<6x;F5h}5Cm>NO_Mwx583T@_WN`?iRt@Z>bkZ8pO_?xODxNBR-sl0*KD_2o6KRB zW$uDFj^%tli^dO!gNyC=d%0e(_EDpycU>n-K%@mq_kk8X2-mDuE8$1-5+t>4JJScO z*K1Lp@e}+qpUd6axCUF)@2aYth^mcNak*UVw{IhRJ4i)Q$bbLRZ*67V U$)9i*!~g&Q07*qoM6N<$f=!5Wf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png new file mode 100644 index 0000000000000000000000000000000000000000..bac7d08ef2ff52dc33dba64a535eef5d484159e7 GIT binary patch literal 883 zcmV-(1C0EMP)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wXMTizYuC#t6;1KFP0&? z=T1&W#T#M8`ZKNf@Oh#oQrxIlyuM83eOE@p%0(L9jqu-J`V&45;1xOjS*!p6002ov JPDHLkV1o9kncV;Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png new file mode 100644 index 0000000000000000000000000000000000000000..e40244736453570d9c6d15737cf320741b277cea GIT binary patch literal 842 zcmV-Q1GW5#P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1w{~gs|+)naeqYF&w_61T%<|IN_ruEIwP7Maq&Sp*W67 z2$9DWKGA44=y@=pD2jA&8EBfOKHqLPIvn=od0qZ~8;?m`FIU=Z-ZRH%C0I&V2TrF` zoj`SiBEX7v+acGL?CkfSbb?ODrO9MWj?*UTNecWx`?_79R;wlL_XjfLB%k|yzEIte z*tTs-i^|Ht1#^-;LS(HV2vzEaAj}Lv*=+lPF~ExB@styorsVsf4vL~L4#Eg{qivN4 zK45@l6%YWz*6U>v5b@n^x79>q=CUgA18dSR1`hr*p(>)9zRZ?IN{>0%Za=hqAR1gb zEvK3QngSGty^4%TiZ1XjORQw%k+2M?f<>yE>Z&d=$OJ|&QV@jM{)@W=iojN@dFKO$ zRY)`Wev%RQr_+&oy~m1-iZ@_|VHjHP`Fy4&QrxI67K=H5mt_Q&7ilzlrT_lY-zo^< UrrZGeCIA2c07*qoM6N<$f{rSUMgRZ+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png new file mode 100644 index 0000000000000000000000000000000000000000..c85bdc129ee3e3935df71692c271c7ca9ee8a9f1 GIT binary patch literal 751 zcmVH_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wmqD_;N)e!=m?d7gccir@j_G!aH4j%(c-Ko*LMqPU%oVie%tj+kTA!_XB3 z81e)>_%vcF_74f}^Nm~3K$!IeYPM|?#|QCgjEIATtJyKy$K-f_7}NK?H<8{@#V`!I hw`0^jKj(ix=@*{l)mY)q1o!{|002ovPDHLkV1kbCU!DK} literal 0 HcmV?d00001 From 11fc05869010420bb7008d182c08351b3a162a4a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 12 Jun 2025 22:17:35 +0300 Subject: [PATCH 005/323] Fix trapdoor operation --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../java/com/hbm/blocks/generic/BlockNTMTrapdoor.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index ccf1f73aa..b4fab697e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1983,7 +1983,7 @@ public class ModBlocks { ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); - trapdoor_sturdy = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_sturdy").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_sturdy"); + trapdoor_sturdy = new BlockNTMTrapdoor(Material.wood).setBlockName("trapdoor_sturdy").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_sturdy"); trapdoor_iron = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_iron").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_iron"); trapdoor_gold = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_gold").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_gold"); trapdoor_aluminium = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_aluminium").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_aluminium"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java index 2915bb0df..a0179a87b 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java @@ -4,7 +4,9 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockTrapDoor; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; public class BlockNTMTrapdoor extends BlockTrapDoor { public BlockNTMTrapdoor(Material material) { @@ -43,4 +45,13 @@ public class BlockNTMTrapdoor extends BlockTrapDoor { } } } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + // The original code prevented manual operation of Material.iron trapdoors. This bypasses that behavior + int meta = world.getBlockMetadata(x, y, z); + world.setBlockMetadataWithNotify(x, y, z, meta ^ 4, 2); + world.playAuxSFXAtEntity(player, 1003, x, y, z, 0); + return true; + } } From d4d552b9dd5200081fba827eb44205a9745b08b2 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 12 Jun 2025 22:43:25 +0300 Subject: [PATCH 006/323] Fix bounding box --- .../hbm/blocks/generic/BlockNTMTrapdoor.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java index a0179a87b..48afba69d 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java @@ -5,6 +5,7 @@ import net.minecraft.block.BlockTrapDoor; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -26,24 +27,26 @@ public class BlockNTMTrapdoor extends BlockTrapDoor { } @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - super.setBlockBoundsBasedOnState(world, x, y, z); - - // Make the hitbox in-line with ladders + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + // Make the hitbox in-line with ladders, if relevant if (isLadder(world, x, y, z, null)) { int meta = world.getBlockMetadata(x, y, z); float thickness = 0.125F; - if ((meta & 3) == 0) { - this.setBlockBounds(0.0F, 0.0F, 1.0F - thickness, 1.0F, 1.0F, 1.0F); - } else if ((meta & 3) == 1) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, thickness); - } else if ((meta & 3) == 2) { - this.setBlockBounds(1.0F - thickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } else if ((meta & 3) == 3) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, thickness, 1.0F, 1.0F); - } + if ((meta & 3) == 0) + return AxisAlignedBB.getBoundingBox(x, y, z + 1F - thickness, x + 1F, y + 1F, z + 1F); + + if ((meta & 3) == 1) + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1F, y + 1F, z + thickness); + + if ((meta & 3) == 2) + return AxisAlignedBB.getBoundingBox(x + 1F - thickness, y, z, x + 1F, y + 1F, z + 1F); + + if ((meta & 3) == 3) + return AxisAlignedBB.getBoundingBox(x, y, z, x + thickness, y + 1F, z + 1F); } + + return super.getCollisionBoundingBoxFromPool(world, x, y, z); } @Override From 8ad065b891174224d02cf3740e3730d28dea47ee Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 13 Jun 2025 21:17:08 +0300 Subject: [PATCH 007/323] Make bunker use a sturdy trapdoor --- src/main/java/com/hbm/world/gen/component/BunkerComponents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java index 356164a26..033a165f9 100644 --- a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java +++ b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java @@ -127,7 +127,7 @@ public class BunkerComponents { fillWithMetadataBlocks(world, box, 1, hpos, 4, 1, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(0)); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 3, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(2), 2, hpos, 4, box); - placeBlockAtCurrentPosition(world, Blocks.trapdoor, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); + placeBlockAtCurrentPosition(world, ModBlocks.trapdoor_sturdy, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(3), 2, hpos, 6, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 7, box); fillWithMetadataBlocks(world, box, 3, hpos, 4, 3, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(1)); From b328130edb90a1eaeee041c1f00ff8af197faf9e Mon Sep 17 00:00:00 2001 From: DangerousMilk Date: Sun, 15 Jun 2025 19:55:37 +0200 Subject: [PATCH 008/323] Added paintable coated variant of the exhaust pipe. --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../FluidDuctPaintableBlockExhaust.java | 202 ++++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + src/main/resources/assets/hbm/lang/uk_UA.lang | 1 + src/main/resources/assets/hbm/lang/zh_CN.lang | 1 + .../fluid_duct_paintable_block_exhaust.png | Bin 0 -> 649 bytes 8 files changed, 210 insertions(+) create mode 100644 src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 143c33fa0..45966e0a0 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -791,6 +791,7 @@ public class ModBlocks { public static Block fluid_duct_paintable; public static Block fluid_duct_gauge; public static Block fluid_duct_exhaust; + public static Block fluid_duct_paintable_block_exhaust; public static Block fluid_valve; public static Block fluid_switch; public static Block fluid_pump; @@ -1919,6 +1920,7 @@ public class ModBlocks { fluid_duct_neo = new FluidDuctStandard(Material.iron).setBlockName("fluid_duct_neo").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pipe_neo"); fluid_duct_box = new FluidDuctBox(Material.iron).setBlockName("fluid_duct_box").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); fluid_duct_exhaust = new FluidDuctBoxExhaust(Material.iron).setBlockName("fluid_duct_exhaust").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); + fluid_duct_paintable_block_exhaust = new FluidDuctPaintableBlockExhaust().setBlockName("fluid_duct_paintable_block_exhaust").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_duct_paintable = new FluidDuctPaintable().setBlockName("fluid_duct_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_duct_gauge = new FluidDuctGauge().setBlockName("fluid_duct_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_valve = new FluidValve(Material.iron).setBlockName("fluid_valve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3185,6 +3187,7 @@ public class ModBlocks { register(fluid_duct_neo); register(fluid_duct_box); register(fluid_duct_exhaust); + register(fluid_duct_paintable_block_exhaust); register(fluid_duct_paintable); register(fluid_duct_gauge); register(fluid_valve); diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java new file mode 100644 index 000000000..3be2934af --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -0,0 +1,202 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ILookOverlay; +import com.hbm.interfaces.ICopiable; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.lib.Library; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityPipeExhaust; +import com.hbm.util.i18n.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.List; + +public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements IToolable, IBlockMultiPass, ILookOverlay { + + @SideOnly(Side.CLIENT) protected IIcon overlay; + + public FluidDuctPaintableBlockExhaust() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityPipeExhaustPaintable(); + } + + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, TileEntity tile) { + return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE) || + Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_LEADED) || + Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_POISON); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + List text = new ArrayList(); + text.add(Fluids.SMOKE.getLocalizedName()); + text.add(Fluids.SMOKE_LEADED.getLocalizedName()); + text.add(Fluids.SMOKE_POISON.getLocalizedName()); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":fluid_duct_paintable_block_exhaust"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":fluid_duct_paintable_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block != null) { + if(RenderBlockMultipass.currentPass == 1) { + return this.overlay; + } else { + return pipe.block.getIcon(side, pipe.meta); + } + } + } + + return this.blockIcon; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if(stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if(block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block == null) { + pipe.block = block; + pipe.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + } + } + + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) return false; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + + @Override + public int getPasses() { + return 2; + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + public static class TileEntityPipeExhaustPaintable extends TileEntityPipeExhaust implements ICopiable { + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 819c38039..3f04f0e38 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4183,6 +4183,7 @@ tile.floodlight.name=Elektrischer Scheinwerfer tile.fluid_duct.name=Universelles Flüssigkeitsrohr (Veraltet) tile.fluid_duct_box.name=Universelles Flüssigkeitsrohr (Boxrohr) tile.fluid_duct_exhaust.name=Abgasrohr +tile.fluid_duct_paintable_block_exhaust.name=Geschirmtes Abgasrohr (Färbbar) tile.fluid_duct_gauge.name=Flussmessrohr tile.fluid_duct_gauge.desc=Rohr welches anzeight, wie viel Flüssigkeit$sich pro Tick im Netzwerk bewegt.$Geteilte Netzwerke die über Fässer oder Tanks$verbunden sind, werden als ein einzelnes gezählt. tile.fluid_duct_neo.name=Universelles Flüssigkeitsrohr diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index a3a94ae52..1051a0b4c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5308,6 +5308,7 @@ tile.floodlight.name=Powered Floodlight tile.fluid_duct.name=Universal Fluid Duct (Deprecated) tile.fluid_duct_box.name=Universal Fluid Duct (Boxduct) tile.fluid_duct_exhaust.name=Exhaust Pipe +tile.fluid_duct_paintable_block_exhaust.name=Paintable Coated Exhaust Pipe tile.fluid_duct_gauge.name=Flow Gauge Pipe tile.fluid_duct_gauge.desc=Pipe that displays how much fluid$moves within the network per tick.$Split networks connected by barrels$or tanks are considered as one shared network. tile.fluid_duct_neo.name=Universal Fluid Duct diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 5c3efa442..105832e03 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5551,6 +5551,7 @@ tile.floodlight.name=Электрический прожектор tile.fluid_duct.name=Универсальная жидкостная труба (Устаревшее) tile.fluid_duct_box.name=Универсальная жидкостная труба (Boxduct) tile.fluid_duct_exhaust.name=Выхлопная труба +tile.fluid_duct_paintable_block_exhaust.name=Окрашиваемая покрытая выхлопная труба tile.fluid_duct_gauge.name=Труба с измерителем потока tile.fluid_duct_gauge.desc=Труба которая показывает сколько жидкости$перемещается внутри сети за тик.$Разделенные сети, соединенные бочками$или резервуары рассматриваются как одна общая сеть. tile.fluid_duct_neo.name=Универсальная жидкостная труба diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 28776824b..9addd7c46 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -5288,6 +5288,7 @@ tile.floodlight.name=Потужний прожектор tile.fluid_duct.name=Універсальний рідинний трубопровід (Застаріло) tile.fluid_duct_box.name=Універсальний рідинний трубопровід (Boxduct) tile.fluid_duct_exhaust.name=Вихлопна труба +tile.fluid_duct_paintable_block_exhaust.name=Вихлопна труба з покриттям tile.fluid_duct_gauge.name=Вимірювальна труба tile.fluid_duct_gauge.desc=Труба, що показує, скільки рідини$переміщується в мережі за один тік.$Розділені мережі, з'єднані бочками$або цистернами, вважаються однією спільною мережею. tile.fluid_duct_neo.name=Універсальний рідинний трубопровід diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 41847c119..5cf34ef87 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5021,6 +5021,7 @@ tile.floodlight.name=电力泛光灯 tile.fluid_duct.name=通用流体管道 tile.fluid_duct_box.name=通用流体管道(方形) tile.fluid_duct_exhaust.name=排气管 +tile.fluid_duct_paintable_block_exhaust.name=具有涂装性的排气管 tile.fluid_duct_gauge.name=流量计管 tile.fluid_duct_gauge.desc=显示每个游戏刻在管网有多少流体移动的管道$由桶或罐连接的分离网络被视为一个共享网络。 tile.fluid_duct_neo.name=通用流体管道 diff --git a/src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png b/src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png new file mode 100644 index 0000000000000000000000000000000000000000..85d4c5e3a7c7d8a0c76c61591d3edcd9c44bcd08 GIT binary patch literal 649 zcmV;40(Sk0P)0IY*?uP00GTOL_t(I%bkU57890Vt)2q6p_4^ZA@KO#uc|o2H?1Bj9weU^1B?r9^8@|K}%% z!x8i573JO|%d){h=N!&j{OJv#EK59ZOt$(;+c>PX)J;$48thnNtvxq8$B%8xr-vIr zUDtg3@|j7bv9_b@d&;Wja5&QK4{+%DRk;CjwL%=nc%DbmL$R}epFBn?#{Xx^hvfb; jepOWzML|&%FZ$9?b=TKg9l|GB00000NkvXXu0mjf1IG*o literal 0 HcmV?d00001 From 155595772c780f15dda30d13ee88836230a67211 Mon Sep 17 00:00:00 2001 From: DangerousMilk Date: Mon, 16 Jun 2025 17:48:05 +0200 Subject: [PATCH 009/323] Added recipe and changed function order to make more sense. --- .../FluidDuctPaintableBlockExhaust.java | 69 ++++++++++--------- .../java/com/hbm/main/CraftingManager.java | 1 + 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java index 3be2934af..24f792bc4 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -3,6 +3,7 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; import com.hbm.interfaces.ICopiable; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; @@ -33,13 +34,13 @@ import java.util.ArrayList; import java.util.List; public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements IToolable, IBlockMultiPass, ILookOverlay { - + @SideOnly(Side.CLIENT) protected IIcon overlay; - + public FluidDuctPaintableBlockExhaust() { - super(Material.iron); + super(Material.iron); } - + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPipeExhaustPaintable(); @@ -51,15 +52,6 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_POISON); } - @Override - public void printHook(Pre event, World world, int x, int y, int z) { - List text = new ArrayList(); - text.add(Fluids.SMOKE.getLocalizedName()); - text.add(Fluids.SMOKE_LEADED.getLocalizedName()); - text.add(Fluids.SMOKE_POISON.getLocalizedName()); - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); - } - @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { @@ -87,6 +79,27 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo return this.blockIcon; } + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) return false; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { @@ -117,27 +130,6 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); } - @Override - public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - - if(tool != ToolType.SCREWDRIVER) return false; - - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityPipeExhaustPaintable) { - TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; - - if(pipe.block != null) { - pipe.block = null; - world.markBlockForUpdate(x, y, z); - pipe.markDirty(); - return true; - } - } - - return false; - } - @Override public int getPasses() { return 2; @@ -148,6 +140,15 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo return IBlockMultiPass.getRenderType(); } + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + List text = new ArrayList(); + text.add(Fluids.SMOKE.getLocalizedName()); + text.add(Fluids.SMOKE_LEADED.getLocalizedName()); + text.add(Fluids.SMOKE_POISON.getLocalizedName()); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + public static class TileEntityPipeExhaustPaintable extends TileEntityPipeExhaust implements ICopiable { private Block block; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 76646f307..86a280f16 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -604,6 +604,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 1), new Object[] { "IAI", " ", "IAI", 'I', IRON.plate(), 'A', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 2), new Object[] { "ASA", " ", "ASA", 'S', STEEL.plate(), 'A', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_paintable, 8), new Object[] { "SAS", "A A", "SAS", 'S', STEEL.ingot(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_paintable_block_exhaust, 8), new Object[] { "SAS", "A A", "SAS", 'S', IRON.ingot(), 'A', ModItems.plate_polymer}); addShapelessAuto(new ItemStack(ModBlocks.fluid_duct_gauge), new Object[] { ModBlocks.fluid_duct_paintable, STEEL.ingot(), DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); addRecipeAuto(new ItemStack(ModBlocks.fluid_valve, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.fluid_duct_paintable }); addRecipeAuto(new ItemStack(ModBlocks.fluid_switch, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.fluid_duct_paintable }); From 474148110dde8cad8489c816b887bb70db5076a4 Mon Sep 17 00:00:00 2001 From: DangerousMilk Date: Tue, 17 Jun 2025 14:23:45 +0200 Subject: [PATCH 010/323] Added the TileEntity to the TileMappings. Removed unnecessary canConnectTo function and TileEntityPipePaintable import --- .../network/FluidDuctPaintableBlockExhaust.java | 12 +++--------- src/main/java/com/hbm/tileentity/TileMappings.java | 2 ++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java index 24f792bc4..1510ec422 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -1,9 +1,9 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; + import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; -import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; import com.hbm.interfaces.ICopiable; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; @@ -45,12 +45,6 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityPipeExhaustPaintable(); } - - public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, TileEntity tile) { - return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE) || - Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_LEADED) || - Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.SMOKE_POISON); - } @Override @SideOnly(Side.CLIENT) @@ -155,11 +149,11 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo private int meta; private Block lastBlock; private int lastMeta; - + @Override public void updateEntity() { super.updateEntity(); - + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); lastBlock = block; diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f8252b5af..0b41812fe 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -35,6 +35,7 @@ import com.hbm.blocks.network.CableDiode.TileEntityDiode; import com.hbm.blocks.network.CranePartitioner.TileEntityCranePartitioner; import com.hbm.blocks.network.FluidDuctGauge.TileEntityPipeGauge; import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; +import com.hbm.blocks.network.FluidDuctPaintableBlockExhaust.TileEntityPipeExhaustPaintable; import com.hbm.blocks.network.FluidPump.TileEntityFluidPump; import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; import com.hbm.tileentity.bomb.*; @@ -410,6 +411,7 @@ public class TileMappings { put(TileEntityPipePaintable.class, "tileentity_pipe_paintable"); put(TileEntityPipeGauge.class, "tileentity_pipe_gauge"); put(TileEntityPipeExhaust.class, "tileentity_pipe_exhaust"); + put(TileEntityPipeExhaustPaintable.class, "tileentity_pipe_exhaust_paintable"); put(TileEntityFluidValve.class, "tileentity_pipe_valve"); put(TileEntityFluidPump.class, "tileentity_pipe_pump"); From ad4b1733d5bb4dec82df1792dc951409141cd437 Mon Sep 17 00:00:00 2001 From: DangerousMilk Date: Tue, 17 Jun 2025 20:30:54 +0200 Subject: [PATCH 011/323] Fixed NBT data not saving. --- .../network/FluidDuctPaintableBlockExhaust.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java index 1510ec422..f57b6f9b1 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -23,6 +23,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; @@ -96,7 +99,7 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - + ItemStack stack = player.getHeldItem(); if(stack != null && stack.getItem() instanceof ItemBlock) { @@ -160,6 +163,18 @@ public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements ITo lastMeta = meta; } } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } @Override public void readFromNBT(NBTTagCompound nbt) { From 06a1b9163d806729e2edbbaca570f628bc7d0f48 Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Wed, 18 Jun 2025 16:57:55 +0800 Subject: [PATCH 012/323] M78 --- src/main/resources/assets/hbm/lang/zh_CN.lang | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 41847c119..33c484487 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -1340,8 +1340,8 @@ hbmfluid.death=锇酸溶液 hbmfluid.deuterium=氘 hbmfluid.diesel=柴油 hbmfluid.diesel_crack=裂化柴油 -hbmfluid.diesel_crack_reform=高辛烷值裂化柴油 -hbmfluid.diesel_reform=高辛烷值柴油 +hbmfluid.diesel_crack_reform=高十六烷值裂化柴油 +hbmfluid.diesel_reform=高十六烷值柴油 hbmfluid.egg=蛋溶解液 hbmfluid.estradiol=雌二醇溶液 hbmfluid.ethanol=乙醇 @@ -5101,10 +5101,6 @@ tile.hadron_coil_neodymium.name=致密钕线圈 tile.hadron_coil_schrabidate.name=致密Sa酸铁线圈 tile.hadron_coil_schrabidium.name=致密Sa326线圈 tile.hadron_coil_starmetal.name=致密星辉线圈 -tile.hadron_cooler.name=粒子加速器冷却装置 -tile.hadron_cooler.desc=冷却功率:10$过冷阈值:10$冷却加成:+10%%$过冷惩罚:-25%% -tile.hadron_cooler_mk2.name=粒子加速器冷却装置-回文特制 -tile.hadron_cooler_mk2.desc=冷却功率:5$效率功能:2-(冷却-15)²/225$最高惩罚:-90%% tile.hadron_core.name=粒子加速器核心组件 tile.hadron_diode.name=肖基特二极管 tile.hadron_plating.name=粒子加速器镀层 @@ -6091,3 +6087,7 @@ tile.fan.falloffOff=稳定的风扇功率 tile.glass_polarized.name=偏光玻璃 tile.machine_autosaw.suspended=暂停 tile.machine_chemical_plant.name=化工厂二代 : 电子布加洛 +hbm.key.ability=循环工具能力 +hbm.key.abilityAlt=配置工具能力 +hbm.key.toggleMagnet=开关磁铁 +upgrade.speed=工作速度 %s From 9b08adc3144ff11e64c7544ca83590c2d7bda8ac Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 20 Jun 2025 01:26:23 +0300 Subject: [PATCH 013/323] Mass Storage AE2 compat --- build.gradle | 15 +++ .../com/hbm/handler/ae2/AE2CompatHandler.java | 12 ++ .../ae2/MSUExternalStorageHandler.java | 44 ++++++++ .../handler/ae2/MassStorageMEInventory.java | 84 ++++++++++++++ src/main/java/com/hbm/main/MainRegistry.java | 4 + .../storage/TileEntityMassStorage.java | 105 ++++++++++++++++++ 6 files changed, 264 insertions(+) create mode 100644 src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java create mode 100644 src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java create mode 100644 src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java diff --git a/build.gradle b/build.gradle index 07cca4635..7becffe8b 100644 --- a/build.gradle +++ b/build.gradle @@ -79,6 +79,18 @@ repositories { // name = "CurseForge" // url = "https://minecraft.curseforge.com/api/maven/" //} + maven { + name = "Jitpack" + url = "https://jitpack.io" + } + maven { + name = "CurseMaven" + url = "https://cursemaven.com" + } + maven { + name = "OpenComputers" + url = "https://maven.cil.li/" + } } dependencies { @@ -94,6 +106,9 @@ dependencies { compileOnly "inventorytweaks:InventoryTweaks:1.59-dev:deobf" implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api" + + implementation "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev" + compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:sources" } processResources { diff --git a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java new file mode 100644 index 000000000..8efaa3e84 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java @@ -0,0 +1,12 @@ +package com.hbm.handler.ae2; + +import appeng.api.AEApi; +import cpw.mods.fml.common.Loader; + +public class AE2CompatHandler { + public static void init() { + if (Loader.isModLoaded("appliedenergistics2")) { + AEApi.instance().registries().externalStorage().addExternalStorageInterface(new MSUExternalStorageHandler()); + } + } +} diff --git a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java new file mode 100644 index 000000000..ca83534b9 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java @@ -0,0 +1,44 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.storage.TileEntityMassStorage; +import com.hbm.util.ItemStackUtil; + +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.me.storage.MEMonitorIInventory; +import appeng.util.inv.IMEAdaptor; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class MSUExternalStorageHandler implements IExternalStorageHandler { + + public MSUExternalStorageHandler() {} + + @Override + public boolean canHandle(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource mySrc) { + return channel == StorageChannel.ITEMS && te instanceof TileEntityMassStorage; + } + + @Override + public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src) { + if (!canHandle(te, d, channel, src)) + return null; + + // Note: apparently I need this, though I'm not sure why. Storage drawers does it. + // Here's a relevant discussion, if anyone wants to dive into that rabbit hole: + // https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/418 + return new MEMonitorIInventory(new IMEAdaptor(new MassStorageMEInventory((TileEntityMassStorage)te), src)) { + @Override + public boolean isPrioritized(IAEItemStack stack) { + ItemStack type = ((TileEntityMassStorage)te).getType(); + + return type != null && ItemStackUtil.areStacksCompatible(stack.getItemStack(), type); + } + }; + } + +} diff --git a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java new file mode 100644 index 000000000..a2fe88c77 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java @@ -0,0 +1,84 @@ +package com.hbm.handler.ae2; + +import static com.hbm.inventory.OreDictManager.I; + +import com.hbm.tileentity.machine.storage.TileEntityMassStorage; +import com.hbm.util.ItemStackUtil; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import net.minecraft.item.ItemStack; + +public class MassStorageMEInventory implements IMEInventory { + + private TileEntityMassStorage tile; + + public MassStorageMEInventory(TileEntityMassStorage tile) { + this.tile = tile; + } + + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack typeStack = tile.getType(); + + if (typeStack == null || !ItemStackUtil.areStacksCompatible(input.getItemStack(), typeStack)) + return input; + + // If you're working with amounts greater than MAX_INT, you shouldn't use MSUs in the first place + int remaining = tile.increaseTotalStockpile((int)input.getStackSize(), type == Actionable.MODULATE); + + if (remaining == 0) { + return null; + } + + return AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(remaining); + } + + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + ItemStack typeStack = tile.getType(); + + if (typeStack == null || !ItemStackUtil.areStacksCompatible(request.getItemStack(), typeStack)) + return null; + + // If you're working with amounts greater than MAX_INT, you shouldn't use MSUs in the first place + int missing = tile.decreaseTotalStockpile((int)request.getStackSize(), mode == Actionable.MODULATE); + long fulfilled = request.getStackSize() - missing; + + if (fulfilled == 0) { + return null; + } + + return AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(fulfilled); + } + + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack typeStack = tile.getType(); + + if (typeStack != null) { + out.add( + AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(tile.getTotalStockpile()) + ); + } + + return out; + } + + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } + +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index ab9f2f995..51c71e0ec 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -13,6 +13,7 @@ import com.hbm.entity.grenade.*; import com.hbm.entity.logic.IChunkLoader; import com.hbm.entity.mob.siege.SiegeTier; import com.hbm.handler.*; +import com.hbm.handler.ae2.AE2CompatHandler; import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.handler.imc.IMCCrystallizer; @@ -881,6 +882,9 @@ public class MainRegistry { // Load compatibility for OC. CompatHandler.init(); + // Load compatibility for AE2. + AE2CompatHandler.init(); + //expand for the largest entity we have (currently Quackos who is 17.5m in diameter, that's one fat duck) World.MAX_ENTITY_RADIUS = Math.max(World.MAX_ENTITY_RADIUS, 8.75); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 8d939f523..6290254ff 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -7,6 +7,7 @@ import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.util.BufferUtil; +import com.hbm.util.ItemStackUtil; import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORValueProvider; @@ -15,6 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; @@ -133,6 +135,109 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa return result; } + // Note: the following three methods are used for AE2 integration, and aren't meant to be called in any other context by default + + public int getTotalStockpile() { + ItemStack type = getType(); + if (type == null) + return 0; + + int result = getStockpile(); + + ItemStack inStack = slots[0]; + if (inStack != null && ItemStackUtil.areStacksCompatible(type, inStack)) { + result += inStack.stackSize; + } + + ItemStack outStack = slots[2]; + if (outStack != null && ItemStackUtil.areStacksCompatible(type, outStack)) { + result += outStack.stackSize; + } + + return result; + } + + // Returns the remainder that didn't fit. + // If `actually` is false, only predicts the outcome, but doesn't change the state + public int increaseTotalStockpile(int amount, boolean actually) { + return changeTotalStockpile(amount, actually, +1); + } + + // Returns the remainder that couldn't be extracted. + // If `actually` is false, only predicts the outcome, but doesn't change the state + public int decreaseTotalStockpile(int amount, boolean actually) { + return changeTotalStockpile(amount, actually, -1); + } + + private int changeTotalStockpile(int amount, boolean actually, int sign) { + ItemStack type = getType(); + + if (type == null) + return amount; + + int stockpileAvail = sign > 0 ? getCapacity() - getStockpile() : getStockpile(); + + if (amount > 0 && stockpileAvail > 0) { + int depositStockpile = Math.min(amount, stockpileAvail); + if (actually) { + this.stack += sign * depositStockpile; + } + amount -= depositStockpile; + } + + int inputAvail = 0; + ItemStack inStack = slots[0]; + if (inStack != null && ItemStackUtil.areStacksCompatible(type, inStack)) { + inputAvail = sign > 0 ? inStack.getMaxStackSize() - inStack.stackSize : inStack.stackSize; + } else if (inStack == null) { + inputAvail = sign > 0 ? type.getMaxStackSize() : 0; + } + + if (amount > 0 && inputAvail > 0) { + int depositInput = Math.min(amount, inputAvail); + if (actually) { + if (slots[0] == null) { // Only possible with sign == +1 + slots[0] = slots[1].copy(); + slots[0].stackSize = 0; + } + slots[0].stackSize += sign * depositInput; + if (slots[0].stackSize == 0) { + slots[0] = null; + } + } + amount -= depositInput; + } + + int outputAvail = 0; + ItemStack outStack = slots[2]; + if (outStack != null && ItemStackUtil.areStacksCompatible(type, outStack)) { + outputAvail = sign > 0 ? outStack.getMaxStackSize() - outStack.stackSize : outStack.stackSize; + } else if (outStack == null) { + outputAvail = sign > 0 ? type.getMaxStackSize() : 0; + } + + if (amount > 0 && outputAvail > 0) { + int depositOutput = Math.min(amount, outputAvail); + if (actually) { + if (slots[2] == null) { // Only possible with sign == +1 + slots[2] = slots[1].copy(); + slots[2].stackSize = 0; + } + slots[2].stackSize += sign * depositOutput; + if (slots[2].stackSize == 0) { + slots[2] = null; + } + } + amount -= depositOutput; + } + + if (actually) { + this.markDirty(); + } + + return amount; + } + @Override public void serialize(ByteBuf buf) { buf.writeInt(this.stack); From eaa2dfa23d69678c0f50a64a27431fc75201bfb5 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 20 Jun 2025 01:41:47 +0300 Subject: [PATCH 014/323] Add optional interface annotations --- .../java/com/hbm/handler/ae2/MSUExternalStorageHandler.java | 2 ++ .../java/com/hbm/handler/ae2/MassStorageMEInventory.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java index ca83534b9..be5dadbfa 100644 --- a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java +++ b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java @@ -2,6 +2,7 @@ package com.hbm.handler.ae2; import com.hbm.tileentity.machine.storage.TileEntityMassStorage; import com.hbm.util.ItemStackUtil; +import cpw.mods.fml.common.Optional; import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IExternalStorageHandler; @@ -14,6 +15,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; +@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2") public class MSUExternalStorageHandler implements IExternalStorageHandler { public MSUExternalStorageHandler() {} diff --git a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java index a2fe88c77..4728043ff 100644 --- a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java +++ b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java @@ -1,10 +1,10 @@ package com.hbm.handler.ae2; -import static com.hbm.inventory.OreDictManager.I; - import com.hbm.tileentity.machine.storage.TileEntityMassStorage; import com.hbm.util.ItemStackUtil; +import cpw.mods.fml.common.Optional; + import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.security.BaseActionSource; @@ -14,6 +14,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import net.minecraft.item.ItemStack; +@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2") public class MassStorageMEInventory implements IMEInventory { private TileEntityMassStorage tile; From 2744ab322c9c1068b7d785f25bd9956de28fbda2 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 20 Jun 2025 01:53:05 +0300 Subject: [PATCH 015/323] Fix annotations Turns out the InterfaceList is obligatory, even if there's only one interface --- .../java/com/hbm/handler/ae2/MSUExternalStorageHandler.java | 2 +- src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java index be5dadbfa..fe82feb00 100644 --- a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java +++ b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java @@ -15,7 +15,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2") +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2")}) public class MSUExternalStorageHandler implements IExternalStorageHandler { public MSUExternalStorageHandler() {} diff --git a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java index 4728043ff..848e2c053 100644 --- a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java +++ b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java @@ -14,7 +14,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import net.minecraft.item.ItemStack; -@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2") +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2")}) public class MassStorageMEInventory implements IMEInventory { private TileEntityMassStorage tile; From d15ab7079ae087fd7e48c1e443bbb9678f31fa76 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 20 Jun 2025 02:00:14 +0300 Subject: [PATCH 016/323] Reduce dependencies If I understand it correctly, the implementation rule is there to include anything we use in the mod that is not part of the API? If so, I don't use anything like that. Anyway, it compiles, and it runs, so I'm happy with it. Revert this if issues arise, I guess --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 7becffe8b..4e7e8f7f4 100644 --- a/build.gradle +++ b/build.gradle @@ -107,8 +107,7 @@ dependencies { implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api" - implementation "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev" - compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:sources" + compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev" } processResources { From 149e79f5501471ca8866039091b4732af2026203 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 20 Jun 2025 02:25:57 +0300 Subject: [PATCH 017/323] Fix crash without AE2 --- src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java index 8efaa3e84..b40571179 100644 --- a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java +++ b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java @@ -2,11 +2,17 @@ package com.hbm.handler.ae2; import appeng.api.AEApi; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Optional; public class AE2CompatHandler { public static void init() { if (Loader.isModLoaded("appliedenergistics2")) { - AEApi.instance().registries().externalStorage().addExternalStorageInterface(new MSUExternalStorageHandler()); + registerHandler(); } } + + @Optional.Method(modid = "appliedenergistics2") + private static void registerHandler() { + AEApi.instance().registries().externalStorage().addExternalStorageInterface(new MSUExternalStorageHandler()); + } } From 014a253e4300c96a56ea981140a40540ce26b9f3 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Fri, 20 Jun 2025 12:09:26 +0300 Subject: [PATCH 018/323] =?UTF-8?q?=D1=85=D1=96=D0=BC=D1=96=D1=87=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B7=D0=B0=D0=B2=D0=BE=D0=B4=20uk=5FUA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/uk_UA.lang | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 9891b1542..991f16dee 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -774,6 +774,7 @@ container.machineAmmoPress=Прес для боєприпасів container.machineArcWelder=Дуговий зварювальник container.machineArcFurnaceLarge=Дугова піч container.machineBoiler=Нагрівач нафти +container.machineChemicalFactory=Хімічна фабрика container.machineChemicalPlant=Хімічний завод container.machineCMB=CMB Steel Furnace container.machineCoal=Твердопаливний генератор @@ -5489,9 +5490,11 @@ tile.machine_boiler_off.name=Старий бойлер tile.machine_catalytic_cracker.name=Вежа каталітичного крекінгу tile.machine_catalytic_reformer.name=Каталітичний риформер tile.machine_centrifuge.name=Центрифуга -tile.machine_chemfac.name=Хімічна фабрика -tile.machine_chemical_plant.name=Хімічний завод 2: Electric Boogaloo -tile.machine_chemplant.name=Хімічний завод +tile.machine_chemfac.name=Хімічна фабрика (Застаріла) +tile.machine_chemical_factory.name=Хімічна фабрика +tile.machine_chemical_factory.desc=Четверний хімічний завод.$Рецепти обробляються вдвічі швидше,$але потребують вдвічі більше енергії.$Потрібно охолоджуватися водою,$виробляє пару низького тиску. +tile.machine_chemical_plant.name=Хімічний завод +tile.machine_chemplant.name=Хімічний завод (Застарілий) tile.machine_chungus.name=Парова турбіна "Левіафан" tile.machine_chungus.desc=Ефективність: 85%% tile.machine_coal_off.name=Combustion Generator @@ -6166,12 +6169,13 @@ upgrade.acid=Необхідна кислота %s upgrade.burn=Burn %smb/t for %sHE upgrade.consumption=Споживання %s upgrade.coolantConsumption=Витрата охолоджувальної рідини %s -upgrade.delay=Швидкість роботи %s +upgrade.delay=Час роботи %s upgrade.efficiency=Ефективність %s upgrade.fortune=Вдача %s upgrade.overheatChance=Ймовірність перегріву %s upgrade.productivity=Продуктивність %s upgrade.range=Радіус %s +upgrade.speed=Швидкість роботи %s upgrade.gui.title=§lДопустимі покращення:§r upgrade.gui.afterburner= * §dФорсаж§r: Складається до %s рівнів From 5a12d14948894b6eb4470ceb6743daf3788608aa Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Fri, 20 Jun 2025 12:47:17 +0300 Subject: [PATCH 019/323] fuck --- src/main/resources/assets/hbm/lang/uk_UA.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 991f16dee..998614bf9 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -5492,7 +5492,7 @@ tile.machine_catalytic_reformer.name=Каталітичний риформер tile.machine_centrifuge.name=Центрифуга tile.machine_chemfac.name=Хімічна фабрика (Застаріла) tile.machine_chemical_factory.name=Хімічна фабрика -tile.machine_chemical_factory.desc=Четверний хімічний завод.$Рецепти обробляються вдвічі швидше,$але потребують вдвічі більше енергії.$Потрібно охолоджуватися водою,$виробляє пару низького тиску. +tile.machine_chemical_factory.desc=Четверний хімічний завод.$Рецепти обробляються вдвічі швидше,$але потребують вдвічі більше енергії.$Потрібно охолодження водою,$виробляє пару низького тиску. tile.machine_chemical_plant.name=Хімічний завод tile.machine_chemplant.name=Хімічний завод (Застарілий) tile.machine_chungus.name=Парова турбіна "Левіафан" From 1615096a8439b49beb0c7257ca5a5bcea4700bb4 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Tue, 24 Jun 2025 09:23:32 +0300 Subject: [PATCH 020/323] i just don't know --- src/main/resources/assets/hbm/lang/uk_UA.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 998614bf9..e3a137691 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -3706,7 +3706,7 @@ item.pellet_rtg_cobalt.name=РІТЕГ гранула кобальту-60 item.pellet_rtg_cobalt.desc=Не найкращий як РІТЕГ, але чудовий для гамма-випромінювання! item.pellet_rtg_depleted.bismuth.name=Розкладена вісмутова РІТЕГ гранула item.pellet_rtg_depleted.lead.name=Розкладена свинцева РІТЕГ гранула -item.pellet_rtg_depleted.neptunium.name=Розкладена немтунієва РІТЕГ гранула +item.pellet_rtg_depleted.neptunium.name=Розкладена нептунієва РІТЕГ гранула item.pellet_rtg_depleted.mercury.name=Розкладена ртутна РІТЕГ гранула item.pellet_rtg_depleted.nickel.name=Розкладена нікелева РІТЕГ гранула item.pellet_rtg_depleted.zirconium.name=Розкладена цирконієва РІТЕГ гранула @@ -5809,7 +5809,7 @@ tile.pump_electric.desc=Використовує електроенергію д tile.pump_steam.name=Паровий насос ґрунтових вод tile.pump_steam.desc=Використовує пару для відкачування ґрунтових вод$Генерує до 1,000mB/t$Повинен бути розміщений нижче Y:70 tile.pwr_block.name=ВВЕР -tile.pwr_casing.name=Корпус рекатора ВВЕР +tile.pwr_casing.name=Корпус реактора ВВЕР tile.pwr_casing.desc=Потрібно покрити всі внутрішні частини реактора для формування$Розміщення: Корпус tile.pwr_channel.name=Канал теплоносія ВВЕР tile.pwr_channel.desc=Використовує тепло корпусу для нагрівання охолоджувальної рідини$Розміщення: Будь-яке From 18d8fe292ce4d34aded5c036d0c4874e78ae316d Mon Sep 17 00:00:00 2001 From: MerrittK <65367913+MerrittK@users.noreply.github.com> Date: Tue, 24 Jun 2025 10:40:21 -0400 Subject: [PATCH 021/323] Fixed Advanced rocketry moon turf compat --- src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index efd778696..6b02b0610 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -360,9 +360,9 @@ public class ShredderRecipes extends SerializableRecipe { /* AR COMPAT */ Block arMoonTurf = Compat.tryLoadBlock(Compat.MOD_AR, "turf"); - if(arMoonTurf != null && gcMoonBlock != Blocks.air) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf + if(arMoonTurf != null && arMoonTurf != Blocks.air) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf Block arMoonTurfDark = Compat.tryLoadBlock(Compat.MOD_AR, "turfDark"); - if(arMoonTurfDark != null && gcMoonBlock != Blocks.air) ShredderRecipes.setRecipe(arMoonTurfDark, new ItemStack(ModBlocks.moon_turf)); //probably moon dirt? would have helped if i had ever played AR for more than 5 seconds + if(arMoonTurfDark != null && arMoonTurfDark != Blocks.air) ShredderRecipes.setRecipe(arMoonTurfDark, new ItemStack(ModBlocks.moon_turf)); //probably moon dirt? would have helped if i had ever played AR for more than 5 seconds } /** From 7737ac7989881a68aa88df285ebca17b33360247 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:46:18 -0400 Subject: [PATCH 022/323] Rotary Furnace Port Tooltip Says what it does on the tin, hovering over the rotary furnace steam, fluid, and fuel ports, tells you what each one is for Also gets rid of a vanilla obfuscation ID variable on a NTM class for strange reasons --- .../blocks/machine/MachineRotaryFurnace.java | 60 ++++++++++++++++++- .../com/hbm/entity/particle/EntityModFX.java | 5 +- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java index 1f5e3d119..e252c8445 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java @@ -1,15 +1,23 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; +import com.hbm.util.fauxpointtwelve.DirPos; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.util.ForgeDirection; -public class MachineRotaryFurnace extends BlockDummyable { +import java.util.ArrayList; +import java.util.List; + +public class MachineRotaryFurnace extends BlockDummyable implements ILookOverlay { public MachineRotaryFurnace(Material mat) { super(mat); @@ -56,4 +64,54 @@ public class MachineRotaryFurnace extends BlockDummyable { //solid fuel this.makeExtra(world, x + dir.offsetX + rot.offsetX, y, z + dir.offsetZ + rot.offsetZ); } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityMachineRotaryFurnace)) return; + + TileEntityMachineRotaryFurnace furnace = (TileEntityMachineRotaryFurnace) te; + + ForgeDirection dir = ForgeDirection.getOrientation(furnace.getBlockMetadata() - offset); + + List text = new ArrayList<>(); + + //steam + if(hitCheck(dir, pos[0], pos[1], pos[2], -1, -1, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, -2, 0, x, y, z)) { + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[1].getTankType().getLocalizedName()); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + furnace.tanks[2].getTankType().getLocalizedName()); + } + + //fluids + if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 2, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, 2, 0, x, y, z)) { + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[0].getTankType().getLocalizedName()); + } + + if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 1, 0, x, y, z)) { + text.add(EnumChatFormatting.YELLOW + "-> " + EnumChatFormatting.RESET + "Fuel"); + } + + + if(!text.isEmpty()) { + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + } + + protected boolean hitCheck(ForgeDirection dir, int coreX, int coreY, int coreZ, int exDir, int exRot, int exY, int hitX, int hitY, int hitZ) { + + ForgeDirection turn = dir.getRotation(ForgeDirection.DOWN); + + int iX = coreX + dir.offsetX * exDir + turn.offsetX * exRot; + int iY = coreY + exY; + int iZ = coreZ + dir.offsetZ * exDir + turn.offsetZ * exRot; + + return iX == hitX && iZ == hitZ && iY == hitY; + } + } diff --git a/src/main/java/com/hbm/entity/particle/EntityModFX.java b/src/main/java/com/hbm/entity/particle/EntityModFX.java index e416965d4..16efa997f 100644 --- a/src/main/java/com/hbm/entity/particle/EntityModFX.java +++ b/src/main/java/com/hbm/entity/particle/EntityModFX.java @@ -31,7 +31,6 @@ public class EntityModFX extends Entity public static double interpPosX; public static double interpPosY; public static double interpPosZ; - public static final String __OBFID = "CL_00000914"; float smokeParticleScale; public int particleAge; public int maxAge; @@ -39,7 +38,7 @@ public class EntityModFX extends Entity public EntityModFX(World world) { super(world); } - + protected EntityModFX(World p_i1218_1_, double p_i1218_2_, double p_i1218_4_, double p_i1218_6_) { super(p_i1218_1_); @@ -257,7 +256,7 @@ public class EntityModFX extends Entity { return this.getClass().getSimpleName() + ", Pos (" + this.posX + "," + this.posY + "," + this.posZ + "), RGBA (" + this.particleRed + "," + this.particleGreen + "," + this.particleBlue + "," + this.particleAlpha + "), Age " + this.particleAge; } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) From a982616f89aa0ace4571012507a9426dcd2ddfd9 Mon Sep 17 00:00:00 2001 From: MerrittK <65367913+MerrittK@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:12:00 -0400 Subject: [PATCH 023/323] I had to reinvent the wheel because of a different config implementation. --- .../java/com/hbm/config/CommonConfig.java | 4 ++-- .../java/com/hbm/config/GeneralConfig.java | 6 +++-- .../inventory/recipes/ShredderRecipes.java | 5 ++-- src/main/java/com/hbm/util/Compat.java | 24 ++++++++++++++++++- src/main/java/com/hbm/util/ItemStackUtil.java | 16 +++++++++++++ 5 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/config/CommonConfig.java b/src/main/java/com/hbm/config/CommonConfig.java index 7fce253e8..d6ead8f95 100644 --- a/src/main/java/com/hbm/config/CommonConfig.java +++ b/src/main/java/com/hbm/config/CommonConfig.java @@ -81,8 +81,8 @@ public class CommonConfig { prop.comment = comment; return prop.getIntList(); } - public static String[] createConfigStringList(Configuration config, String category, String name, String comment) { - Property prop = config.get(category, name, new String[] { "PLACEHOLDER" }); + public static String[] createConfigStringList(Configuration config, String category, String name, String comment, String[] def) { + Property prop = config.get(category, name, def); prop.comment = comment; return prop.getStringList(); } diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 09900f007..c843cde57 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -1,7 +1,7 @@ package com.hbm.config; import net.minecraftforge.common.config.Configuration; - +import com.hbm.lib.RefStrings; public class GeneralConfig { public static boolean enableThermosPreventer = true; @@ -70,6 +70,7 @@ public class GeneralConfig { public static boolean enableLBSMSafeMEDrives = true; public static boolean enableLBSMIGen = true; public static int schrabRate = 20; + public static String[] preferredOutputMod = new String[] {RefStrings.MODID}; public static void loadFromConfig(Configuration config) { @@ -117,7 +118,8 @@ public class GeneralConfig { normalSoundChannels = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.41_normalSoundChannels", "The amount of channels to create while 1.39_enableSoundExtension is enabled.\n" + "Note that a value below 28 or above 200 can cause buggy sounds and issues with other mods running out of sound memory.", 100); - + preferredOutputMod = CommonConfig.createConfigStringList(config,CATEGORY_GENERAL,"1.42_preferredOutputMod", + "The mod which is preferred as output when certain machines autogenerate recipes. Currently used for the shredder", new String[] {RefStrings.MODID}); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); final String CATEGORY_528 = CommonConfig.CATEGORY_528; diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index 6b02b0610..908804a5e 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -374,8 +374,9 @@ public class ShredderRecipes extends SerializableRecipe { List matches = OreDictionary.getOres("dust" + name); - if(matches != null && !matches.isEmpty()) - return matches.get(0).copy(); + if(matches != null && !matches.isEmpty()) { + return Compat.getPreferredOreOutput(matches); + } return new ItemStack(ModItems.scrap); } diff --git a/src/main/java/com/hbm/util/Compat.java b/src/main/java/com/hbm/util/Compat.java index cac127f1a..db59a6026 100644 --- a/src/main/java/com/hbm/util/Compat.java +++ b/src/main/java/com/hbm/util/Compat.java @@ -49,7 +49,29 @@ public class Compat { private static String getReg(String domain, String name) { return domain + ":" + name; } - + + public static ItemStack getPreferredOreOutput(List oreList) { + int lowestPref = -1; + ItemStack preferredStack = null; + + for(ItemStack item : oreList) { + String modid = ItemStackUtil.getModIdFromItemStack(item); + for(int i = 0; i < GeneralConfig.preferredOutputMod.length; i++) { + if (modid.equals(GeneralConfig.preferredOutputMod[i])){ + if (lowestPref<0 || i Date: Fri, 27 Jun 2025 21:23:53 +0200 Subject: [PATCH 024/323] sludge --- src/main/java/com/hbm/util/LootGenerator.java | 24 +++++++++++++++++- .../assets/hbm/structures/lighthouse.nbt | Bin 157058 -> 0 bytes 2 files changed, 23 insertions(+), 1 deletion(-) delete mode 100644 src/main/resources/assets/hbm/structures/lighthouse.nbt diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index b14306b9e..cee32e713 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -28,6 +28,7 @@ public class LootGenerator { public static final String LOOT_BONES = "LOOT_BONES"; public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; + public static final String LOOT_FLAREGUN = "LOOT_FLAREGUN"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -40,6 +41,7 @@ public class LootGenerator { case LOOT_BONES: lootBones(world, x, y, z); case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); + case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -55,6 +57,7 @@ public class LootGenerator { LOOT_BONES, LOOT_GLYPHID_HIVE, LOOT_METEOR, + LOOT_FLAREGUN, }; } @@ -211,4 +214,23 @@ public class LootGenerator { } } -} \ No newline at end of file + public static void lootFlareGun(World world, int x, int y, int z) { + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + if (loot != null && loot.items.isEmpty()) { + addItemWithDeviation(loot, world.rand, new ItemStack(ModItems.gun_flaregun), 0, 0, -0.25); + + int count = world.rand.nextInt(3) + 2; + for (int k = 0; k < count; k++) + addItemWithDeviation(loot, world.rand, + new ItemStack(ModItems.ammo_standard, 1, EnumAmmo.G26_FLARE.ordinal()), + -0.25, k * 0.03125, 0.25); + + count = world.rand.nextInt(1) + 1; + for (int k = 0; k < count; k++) + addItemWithDeviation(loot, world.rand, + new ItemStack(ModItems.ammo_standard, 1, + world.rand.nextBoolean() ? EnumAmmo.G26_FLARE_SUPPLY.ordinal() : EnumAmmo.G26_FLARE_WEAPON.ordinal()), + 0.25, k * 0.03125, 0.125); + } + } +} diff --git a/src/main/resources/assets/hbm/structures/lighthouse.nbt b/src/main/resources/assets/hbm/structures/lighthouse.nbt deleted file mode 100644 index 84670465e03326e247369c5577582321eeae53a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157058 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 YlFuazSEXk*S!{o@HH6-%T= Date: Sun, 22 Jun 2025 01:37:13 +0300 Subject: [PATCH 025/323] Fix pathfinding on spotlights --- src/main/java/com/hbm/blocks/machine/Spotlight.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index 8c1c57663..07a9bc9c3 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -44,7 +44,7 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { this.type = type; this.isOn = isOn; - this.setHardness(1F); + this.setHardness(0.5F); if(isOn) setLightLevel(1.0F); } @@ -81,6 +81,11 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { return false; } + @Override + public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { + return false; + } + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) { return null; From dec8c9c43ab32b856cc6f0b99856a28025118337 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 27 Jun 2025 18:07:58 +0300 Subject: [PATCH 026/323] Wow mojang is stupid Or at least the mapping author is. How could I not get that `getBlocksMovement` should return if the block DOESN'T block movement, that's so obvious, why would I ever think otherwise --- src/main/java/com/hbm/blocks/machine/Spotlight.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index 07a9bc9c3..3df9a0c52 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -82,8 +82,9 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { } @Override + // Ah yes, I love methods named the literal opposite of what they do public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { - return false; + return true; } @Override From 0b5731266e908f2ad2483622a42f3f040c9c73b6 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 22 Jun 2025 19:53:21 +0300 Subject: [PATCH 027/323] Hide spotlights on maps --- src/main/java/com/hbm/blocks/machine/Spotlight.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index 3df9a0c52..4868d3dd0 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -14,6 +14,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; +import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -87,6 +88,11 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { return true; } + @Override + public MapColor getMapColor(int meta) { + return MapColor.airColor; + } + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) { return null; From a40d0b35136c5b01e96577db70f5dfdf18390ddf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 04:01:00 +0300 Subject: [PATCH 028/323] Make doors click-through when open Currently clicking on anything beyond an open door just makes it close, despite there being no indications for that and the colliders clearly already not being there. --- .../hbm/blocks/generic/BlockDoorGeneric.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 0e496af45..365187ff4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -17,6 +17,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -116,6 +118,22 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { return aabb; } + // Enables clicking through the open door + @Override + public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) { + AxisAlignedBB box = getBoundingBox(world, x, y ,z); + box = AxisAlignedBB.getBoundingBox( + Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), + Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ) + ); + + MovingObjectPosition intercept = box.calculateIntercept(startVec, endVec); + if(intercept != null) { + return new MovingObjectPosition(x, y, z, intercept.sideHit, intercept.hitVec); + } + return null; + } + @Override //should fix AI pathfinding public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { //btw the method name is the exact opposite of that it's doing, check net.minecraft.pathfinding.PathNavigate#512 return hasExtra(world.getBlockMetadata(x, y, z)); //if it's open From f820ae32e247ceb4e835b0e171cafe820c1aeacb Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 26 Jun 2025 19:23:38 +0300 Subject: [PATCH 029/323] Fix crate locked slot --- .../com/hbm/inventory/container/ContainerCrateBase.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index 05b818a10..aaf4ca8a3 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -25,8 +25,10 @@ public class ContainerCrateBase extends ContainerBase { for(int i = 0; i < 9; i++) { this.addSlotToContainer( - invPlayer.currentItem == i ? new SlotPlayerCrateLocked(invPlayer, i, playerInvX + i * 18, playerHotbarY) : - new SlotNonRetarded(invPlayer, i, playerInvX + i * 18, playerHotbarY)); + (invPlayer.currentItem == i && this.tile instanceof ItemBlockStorageCrate.InventoryCrate) ? + new SlotPlayerCrateLocked(invPlayer, i, playerInvX + i * 18, playerHotbarY) : + new SlotNonRetarded(invPlayer, i, playerInvX + i * 18, playerHotbarY) + ); } } From b400b887014e3def548dc83076cd7b45a5b69e59 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 26 Jun 2025 21:09:34 +0300 Subject: [PATCH 030/323] Add flat AoE ability --- .../hbm/handler/ability/IToolAreaAbility.java | 105 +++++++++++++++++- .../inventory/gui/GUIScreenToolAbility.java | 3 +- src/main/java/com/hbm/items/ModItems.java | 29 ++++- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + src/main/resources/assets/hbm/lang/it_IT.lang | 1 + src/main/resources/assets/hbm/lang/pl_PL.lang | 1 + src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + src/main/resources/assets/hbm/lang/uk_UA.lang | 1 + src/main/resources/assets/hbm/lang/zh_CN.lang | 1 + .../textures/gui/tool/gui_tool_ability.png | Bin 4455 -> 4552 bytes 11 files changed, 140 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java index 1d0bcf02b..ca28bca9c 100644 --- a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java @@ -14,7 +14,10 @@ import com.hbm.items.tool.ItemToolAbility; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -219,6 +222,104 @@ public interface IToolAreaAbility extends IBaseAbility { } }; + public static final IToolAreaAbility HAMMER_FLAT = new IToolAreaAbility() { + @Override + public String getName() { + return "tool.ability.hammer_flat"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityHammer; + } + + public final int[] rangeAtLevel = { 1, 2, 3, 4 }; + + @Override + public int levels() { + return rangeAtLevel.length; + } + + @Override + public String getExtension(int level) { + return " (" + rangeAtLevel[level] + ")"; + } + + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 3; + } + + @Override + public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) { + int range = rangeAtLevel[level]; + + MovingObjectPosition hit = raytraceFromEntity(world, player, false, 4.5d); + if(hit == null) return true; + int sideHit = hit.sideHit; + + // we successfully destroyed a block. time to do AOE! + int xRange = range; + int yRange = range; + int zRange = 0; + switch (sideHit) { + case 0: + case 1: + yRange = 0; + zRange = range; + break; + case 2: + case 3: + xRange = range; + zRange = 0; + break; + case 4: + case 5: + xRange = 0; + zRange = range; + break; + } + + for(int a = x - xRange; a <= x + xRange; a++) { + for(int b = y - yRange; b <= y + yRange; b++) { + for(int c = z - zRange; c <= z + zRange; c++) { + if(a == x && b == y && c == z) + continue; + + tool.breakExtraBlock(world, a, b, c, player, x, y, z); + } + } + } + + return false; + } + + // Taken from TConstruct, licensed under CC0 (public domain) + // https://github.com/SlimeKnights/TinkersConstruct/blob/9ea7a0e60fe180aff591701b12c89da21da99289/src/main/java/tconstruct/library/tools/AbilityHelper.java#L707-L731 + private MovingObjectPosition raytraceFromEntity(World world, EntityPlayer player, boolean par3, double range) { + float f = 1.0F; + float f1 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * f; + float f2 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * f; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double) f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double) f + 1.62D; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double) f; + Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); + float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); + float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = range; + if (player instanceof EntityPlayerMP) + { + d3 = ((EntityPlayerMP) player).theItemInWorldManager.getBlockReachDistance(); + } + Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + return world.func_147447_a(vec3, vec31, par3, !par3, par3); + } + }; + public static final IToolAreaAbility EXPLOSION = new IToolAreaAbility() { @Override public String getName() { @@ -249,7 +350,7 @@ public interface IToolAreaAbility extends IBaseAbility { @Override public int sortOrder() { - return SORT_ORDER_BASE + 3; + return SORT_ORDER_BASE + 4; } @Override @@ -270,7 +371,7 @@ public interface IToolAreaAbility extends IBaseAbility { }; // endregion handlers - static final IToolAreaAbility[] abilities = { NONE, RECURSION, HAMMER, EXPLOSION }; + static final IToolAreaAbility[] abilities = { NONE, RECURSION, HAMMER, HAMMER_FLAT, EXPLOSION }; static IToolAreaAbility getByName(String name) { for(IToolAreaAbility ability : abilities) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java b/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java index 18db58099..9b31e5675 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java @@ -52,7 +52,8 @@ public class GUIScreenToolAbility extends GuiScreen { abilitiesArea.add(new AbilityInfo(IToolAreaAbility.NONE, 0, 91)); abilitiesArea.add(new AbilityInfo(IToolAreaAbility.RECURSION, 32, 91)); abilitiesArea.add(new AbilityInfo(IToolAreaAbility.HAMMER, 64, 91)); - abilitiesArea.add(new AbilityInfo(IToolAreaAbility.EXPLOSION, 96, 91)); + abilitiesArea.add(new AbilityInfo(IToolAreaAbility.HAMMER_FLAT, 96, 91)); + abilitiesArea.add(new AbilityInfo(IToolAreaAbility.EXPLOSION, 128, 91)); abilitiesHarvest.add(new AbilityInfo(IToolHarvestAbility.NONE, 0, 107)); abilitiesHarvest.add(new AbilityInfo(IToolHarvestAbility.SILK, 32, 107)); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b27e20e3e..d7b7fb410 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4466,6 +4466,7 @@ public class ModItems { schrabidium_pickaxe = new ItemToolAbility(20, 0, MainRegistry.tMatSchrab, EnumToolType.PICKAXE) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4476,6 +4477,7 @@ public class ModItems { schrabidium_axe = new ItemToolAbility(25, 0, MainRegistry.tMatSchrab, EnumToolType.AXE) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4487,6 +4489,7 @@ public class ModItems { schrabidium_shovel = new ItemToolAbility(15, 0, MainRegistry.tMatSchrab, EnumToolType.SHOVEL) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4554,12 +4557,14 @@ public class ModItems { elec_pickaxe = new ItemToolAbilityPower(6F, 0, MainRegistry.tMatElec, EnumToolType.PICKAXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim"); elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4568,6 +4573,7 @@ public class ModItems { elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim"); @@ -4577,12 +4583,14 @@ public class ModItems { desh_pickaxe = new ItemToolAbility(5F, -0.05, MainRegistry.tMatDesh, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe"); desh_axe = new ItemToolAbility(7.5F, -0.05, MainRegistry.tMatDesh, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4590,6 +4598,7 @@ public class ModItems { desh_shovel = new ItemToolAbility(4F, -0.05, MainRegistry.tMatDesh, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_shovel").setTextureName(RefStrings.MODID + ":desh_shovel"); @@ -4618,17 +4627,20 @@ public class ModItems { cobalt_decorated_pickaxe = new ItemToolAbility(6F, 0, matDecCobalt, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_decorated_pickaxe"); cobalt_decorated_axe = new ItemToolAbility(8F, 0, matDecCobalt, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2) .addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("cobalt_decorated_axe").setTextureName(RefStrings.MODID + ":cobalt_decorated_axe"); cobalt_decorated_shovel = new ItemToolAbility(5F, 0, matDecCobalt, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_shovel").setTextureName(RefStrings.MODID + ":cobalt_decorated_shovel"); cobalt_decorated_hoe = new ModHoe(matDecCobalt).setUnlocalizedName("cobalt_decorated_hoe").setTextureName(RefStrings.MODID + ":cobalt_decorated_hoe"); @@ -4641,12 +4653,14 @@ public class ModItems { starmetal_pickaxe = new ItemToolAbility(8F, 0, matStarmetal, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_pickaxe").setTextureName(RefStrings.MODID + ":starmetal_pickaxe"); starmetal_axe = new ItemToolAbility(12F, 0, matStarmetal, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.BEHEADER, 0) @@ -4654,6 +4668,7 @@ public class ModItems { starmetal_shovel = new ItemToolAbility(7F, 0, matStarmetal, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_shovel").setTextureName(RefStrings.MODID + ":starmetal_shovel"); @@ -4668,6 +4683,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setTextureName(RefStrings.MODID + ":drax"); drax_mk2 = new ItemToolAbilityPower(15F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 1000000000, 250000, 7500) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4675,6 +4691,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) .addAbility(IToolHarvestAbility.LUCK, 2) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setTextureName(RefStrings.MODID + ":drax_mk2"); drax_mk3 = new ItemToolAbilityPower(20F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 2500000000L, 500000, 10000) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4684,11 +4701,13 @@ public class ModItems { .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IToolAreaAbility.HAMMER, 3) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 3) .addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setTextureName(RefStrings.MODID + ":drax_mk3"); ToolMaterial matBismuth = EnumHelper.addToolMaterial("HBM_BISMUTH", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); bismuth_pickaxe = new ItemToolAbility(15F, 0, matBismuth, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4699,6 +4718,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("bismuth_pickaxe").setTextureName(RefStrings.MODID + ":bismuth_pickaxe"); bismuth_axe = new ItemToolAbility(25F, 0, matBismuth, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4711,6 +4731,7 @@ public class ModItems { ToolMaterial matVolcano = EnumHelper.addToolMaterial("HBM_VOLCANIC", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); volcanic_pickaxe = new ItemToolAbility(15F, 0, matVolcano, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.LUCK, 2) @@ -4721,6 +4742,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("volcanic_pickaxe").setTextureName(RefStrings.MODID + ":volcanic_pickaxe"); volcanic_axe = new ItemToolAbility(25F, 0, matVolcano, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.LUCK, 2) @@ -4732,6 +4754,7 @@ public class ModItems { ToolMaterial matChlorophyte = EnumHelper.addToolMaterial("HBM_CHLOROPHYTE", 4, 0, 75F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.powder_chlorophyte)); chlorophyte_pickaxe = new ItemToolAbility(20F, 0, matChlorophyte, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) @@ -4742,6 +4765,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("chlorophyte_pickaxe").setTextureName(RefStrings.MODID + ":chlorophyte_pickaxe"); chlorophyte_axe = new ItemToolAbility(50F, 0, matChlorophyte, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IWeaponAbility.STUN, 4) @@ -4751,6 +4775,7 @@ public class ModItems { ToolMaterial matMese = EnumHelper.addToolMaterial("HBM_MESE", 4, 0, 100F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa)); mese_pickaxe = new ItemToolAbility(35F, 0, matMese, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.CRYSTALLIZER, 0) .addAbility(IToolHarvestAbility.SILK, 0) @@ -4762,6 +4787,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("mese_pickaxe").setTextureName(RefStrings.MODID + ":mese_pickaxe"); mese_axe = new ItemToolAbility(75F, 0, matMese, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 5) @@ -4774,7 +4800,8 @@ public class ModItems { ToolMaterial matDwarf = EnumHelper.addToolMaterial("HBM_DWARVEN", 2, 0, 4F, 0.0F, 10).setRepairItem(new ItemStack(ModItems.ingot_copper)); dwarven_pickaxe = new ItemToolAbility(5F, -0.1, matDwarf, EnumToolType.MINER) - .addAbility(IToolAreaAbility.HAMMER, 0).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe"); + .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe"); ToolMaterial matMeteorite = EnumHelper.addToolMaterial("HBM_METEORITE", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa)); meteorite_sword = new ItemSwordMeteorite(9F, 0, matMeteorite).setUnlocalizedName("meteorite_sword").setTextureName(RefStrings.MODID + ":meteorite_sword"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7b00fdbe6..22073b8b1 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4980,6 +4980,7 @@ tool.ability.cnetrifuge=Auto-Zentrifuge tool.ability.crystallizer=Auto-Kristallisierer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flacher AoE tool.ability.luck=Glück tool.ability.mercury=Quecksilber-Berührung tool.ability.midas=Midas' Hand diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8e915f009..efcf68904 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6146,6 +6146,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flat AoE tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch diff --git a/src/main/resources/assets/hbm/lang/it_IT.lang b/src/main/resources/assets/hbm/lang/it_IT.lang index 691badc0e..d5fc68517 100644 --- a/src/main/resources/assets/hbm/lang/it_IT.lang +++ b/src/main/resources/assets/hbm/lang/it_IT.lang @@ -6164,6 +6164,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=AoE piatta tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch diff --git a/src/main/resources/assets/hbm/lang/pl_PL.lang b/src/main/resources/assets/hbm/lang/pl_PL.lang index f33a8a715..fcf4a3402 100644 --- a/src/main/resources/assets/hbm/lang/pl_PL.lang +++ b/src/main/resources/assets/hbm/lang/pl_PL.lang @@ -5399,6 +5399,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flat AoE tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 5c3efa442..20955e04f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6377,6 +6377,7 @@ tool.ability.centrifuge=Авто-центрифуга tool.ability.crystallizer=Авто-кристаллизатор tool.ability.explosion=Взрыв tool.ability.hammer=Зона действия +tool.ability.hammer_flat=Плоская зона действия tool.ability.luck=Удача tool.ability.mercury=Ртутное касание tool.ability.midas=Прикосновение Мидаса diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 28776824b..c539f5aa6 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -6125,6 +6125,7 @@ tool.ability.centrifuge=Автоцентрифуга tool.ability.crystallizer=Автокристалізатор tool.ability.explosion=Вибух tool.ability.hammer=Зона дії +tool.ability.hammer_flat=Плоска зона дії tool.ability.luck=Вдача tool.ability.mercury=Ртутний дотик tool.ability.midas=Дотик Мідаса diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 41847c119..0e56b0ba9 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5814,6 +5814,7 @@ tool.ability.centrifuge=自动离心 tool.ability.crystallizer=自动结晶 tool.ability.explosion=爆破 tool.ability.hammer=范围挖掘 +tool.ability.flat_hammer=平坦區域採礦 tool.ability.luck=时运 tool.ability.mercury=水银提取 tool.ability.midas=点石成金 diff --git a/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png b/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png index 6b1a5c68b8894c7926c73afd222f60f424a217b9..077dbd45c5bdb46596646da1524faf7724b0a57c 100644 GIT binary patch literal 4552 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 From 71c1eaf430cbfcd02423b865460df0db38201915 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 26 Jun 2025 22:39:10 +0300 Subject: [PATCH 031/323] Change flat AoE icon --- .../textures/gui/tool/gui_tool_ability.png | Bin 4552 -> 4552 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png b/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png index 077dbd45c5bdb46596646da1524faf7724b0a57c..fc0a54e7f336512f8e6457d430a75e33e67d89a4 100644 GIT binary patch delta 3708 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 IbC2kM0gloH;s5{u From 5a0dabc5a95017c5d55a6bb40271d327e2e74fa9 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 26 Jun 2025 22:28:03 +0300 Subject: [PATCH 032/323] Bunch all mined blocks in one spot Solves the problem of veinmined stuff being stuck in enclosed pockets, even with a magnet active --- .../handler/ability/IToolHarvestAbility.java | 10 +++--- .../com/hbm/items/tool/ItemToolAbility.java | 32 +++++++++++++++++-- src/main/resources/META-INF/HBM_at.cfg | 6 +++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java index 9f002bfbd..ee3027340 100644 --- a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -175,7 +175,7 @@ public interface IToolHarvestAbility extends IBaseAbility { if(doesSmelt) { for(ItemStack stack : drops) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, stack.copy())); } } } @@ -211,7 +211,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesShred, world, x, y, z, player); if(doesShred) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, result.copy())); } } }; @@ -248,7 +248,7 @@ public interface IToolHarvestAbility extends IBaseAbility { if(doesCentrifuge) { for(ItemStack st : result) { if(st != null) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, st.copy())); } } } @@ -285,7 +285,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesCrystallize, world, x, y, z, player); if(doesCrystallize) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.output.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, result.output.copy())); } } }; @@ -324,7 +324,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesConvert, world, x, y, z, player); if(doesConvert) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); } } }; diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index e91283917..022c9274c 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -1,5 +1,7 @@ package com.hbm.items.tool; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -27,6 +29,8 @@ import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.tileentity.IGUIProvider; import api.hbm.item.IDepthRockTool; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -151,6 +155,10 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro return true; } + // Should be safe, considering the AoE ability does a similar trick already. + // If not, wrap this in a ThreadLocal or something... + public static int dropX, dropY, dropZ; + @Override public boolean onBlockStartBreak(ItemStack stack, int x, int y, int z, EntityPlayer player) { @@ -173,6 +181,10 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro Configuration config = getConfiguration(stack); ToolPreset preset = config.getActivePreset(); + dropX = x; + dropY = y; + dropZ = z; + preset.harvestAbility.preHarvestAll(preset.harvestAbilityLevel, world, player); boolean skipRef = preset.areaAbility.onDig(preset.areaAbilityLevel, world, x, y, z, player, this); @@ -316,7 +328,7 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro double d = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; double d1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; double d2 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(player.worldObj, (double) x + d, (double) y + d1, (double) z + d2, stack); + EntityItem entityitem = new EntityItem(player.worldObj, (double) dropX + d, (double) dropY + d1, (double) dropZ + d2, stack); entityitem.delayBeforeCanPickup = 10; player.worldObj.spawnEntityInWorld(entityitem); } @@ -326,6 +338,9 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } } + // Since it's added by forge, access transformers don't affect it (even wildcards), so we do it the old-fashioned way + private static Method blockCaptureDrops = ReflectionHelper.findMethod(Block.class, null, new String[] { "captureDrops" }, new Class[] { boolean.class }); + public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) { Block block = world.getBlock(x, y, z); @@ -351,7 +366,20 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } if(removedByPlayer && canHarvest) { - block.harvestBlock(world, player, x, y, z, l); + try { + blockCaptureDrops.invoke(block, true); + block.harvestBlock(world, player, x, y, z, l); + List drops = (List)blockCaptureDrops.invoke(block, false); + for (ItemStack stack : drops) { + block.dropBlockAsItem(world, dropX, dropY, dropZ, stack); + } + } catch (IllegalAccessException e) { + // Shouldn't be possible with ReflectionHelper + MainRegistry.logger.error("Failed to capture drops for block " + block, e); + } catch (InvocationTargetException e) { + // Might be possible? Not in practice, though + MainRegistry.logger.error("Failed to capture drops for block " + block, e); + } } } diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 28454115f..81514dff3 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -50,4 +50,8 @@ public net.minecraft.client.resources.AbstractResourcePack field_110597_b # re public net.minecraft.inventory.Container * # fucking everything i hate this class # GuiIngame -public net.minecraft.client.gui.GuiIngame field_92016_l # highlightingItemStack \ No newline at end of file +public net.minecraft.client.gui.GuiIngame field_92016_l # highlightingItemStack + +# Block +public net.minecraft.block.Block func_149642_a(Lnet/minecraft/world/World;IIILnet/minecraft/item/ItemStack;)V # dropBlockAsItem + From 6946a70f18feb98b8297b3a68cd0c031c5dac284 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 26 Jun 2025 23:11:24 +0300 Subject: [PATCH 033/323] Make exhaustion only apply once --- src/main/java/com/hbm/items/tool/ItemToolAbility.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index 022c9274c..b8b25b14b 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -195,6 +195,8 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro preset.harvestAbility.postHarvestAll(preset.harvestAbilityLevel, world, player); + player.addExhaustion(0.025F); + return true; } @@ -379,7 +381,9 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } catch (InvocationTargetException e) { // Might be possible? Not in practice, though MainRegistry.logger.error("Failed to capture drops for block " + block, e); - } + } + + player.addExhaustion(-0.025F); } } From 14377708bebbd27ecb8bbf75f32fabf0c157778b Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sat, 28 Jun 2025 21:00:53 +0200 Subject: [PATCH 034/323] fuck you github --- .../assets/hbm/structures/lighthouse.nbt | Bin 0 -> 157017 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/lighthouse.nbt diff --git a/src/main/resources/assets/hbm/structures/lighthouse.nbt b/src/main/resources/assets/hbm/structures/lighthouse.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ff421635304c4389af2b1d442a576f61b69a61fd GIT binary patch literal 157017 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 Date: Sat, 28 Jun 2025 22:41:11 +0300 Subject: [PATCH 035/323] Revert "Make exhaustion only apply once" This reverts commit 6946a70f18feb98b8297b3a68cd0c031c5dac284. --- src/main/java/com/hbm/items/tool/ItemToolAbility.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index b8b25b14b..022c9274c 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -195,8 +195,6 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro preset.harvestAbility.postHarvestAll(preset.harvestAbilityLevel, world, player); - player.addExhaustion(0.025F); - return true; } @@ -381,9 +379,7 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } catch (InvocationTargetException e) { // Might be possible? Not in practice, though MainRegistry.logger.error("Failed to capture drops for block " + block, e); - } - - player.addExhaustion(-0.025F); + } } } From 9a7124c8ff778b5f618659ee087f31911c4a5985 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 22:42:40 +0300 Subject: [PATCH 036/323] Allow stopping conveyor inserters with redstone A stopped inserted will still take items to its own inventory, but won't insert them into the inventory it is facing. Useful for taking out stuff from overflowing outputs, if you want to maintain a particular slot distribution. --- .../com/hbm/blocks/network/CraneInserter.java | 18 +++-- .../network/TileEntityCraneInserter.java | 79 ++++++++++--------- 2 files changed, 50 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index b83da5278..e4cb74967 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -68,17 +68,19 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { ItemStack toAdd = entity.getItemStack().copy(); - int[] access = null; + if (!world.isBlockIndirectlyGettingPowered(x, y, z)) { + int[] access = null; - if(te instanceof ISidedInventory) { - ISidedInventory sided = (ISidedInventory) te; - access = InventoryUtil.masquerade(sided, outputDirection.getOpposite().ordinal()); - } + if(te instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) te; + access = InventoryUtil.masquerade(sided, outputDirection.getOpposite().ordinal()); + } - if(te instanceof IInventory) { - IInventory inv = (IInventory) te; + if(te instanceof IInventory) { + IInventory inv = (IInventory) te; - addToInventory(inv, access, toAdd, outputDirection.getOpposite().ordinal()); + addToInventory(inv, access, toAdd, outputDirection.getOpposite().ordinal()); + } } TileEntityCraneInserter inserter = null; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java index afd6012ed..3d55bf30f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java @@ -40,48 +40,49 @@ public class TileEntityCraneInserter extends TileEntityCraneBase implements IGUI super.updateEntity(); if(!worldObj.isRemote) { - ForgeDirection outputSide = getOutputSide(); - TileEntity te = worldObj.getTileEntity(xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ); - - int[] access = null; - - if(te instanceof ISidedInventory) { - ISidedInventory sided = (ISidedInventory) te; - //access = sided.getAccessibleSlotsFromSide(dir.ordinal()); - access = InventoryUtil.masquerade(sided, outputSide.getOpposite().ordinal()); - } - - if(te instanceof IInventory) { - for(int i = 0; i < slots.length; i++) { - - ItemStack stack = slots[i]; - - if(stack != null) { - ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); - - if(ret == null || ret.stackSize != stack.stackSize) { - slots[i] = ret; - this.markDirty(); - return; - } - } + if (!this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) {ForgeDirection outputSide = getOutputSide(); + TileEntity te = worldObj.getTileEntity(xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ); + + int[] access = null; + + if(te instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) te; + //access = sided.getAccessibleSlotsFromSide(dir.ordinal()); + access = InventoryUtil.masquerade(sided, outputSide.getOpposite().ordinal()); } - //if the previous operation fails, repeat but use single items instead of the whole stack instead - //this should fix cases where the inserter can't insert into something that has a stack size limitation - for(int i = 0; i < slots.length; i++) { - - ItemStack stack = slots[i]; - - if(stack != null) { - stack = stack.copy(); - stack.stackSize = 1; - ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + if(te instanceof IInventory) { + for(int i = 0; i < slots.length; i++) { - if(ret == null || ret.stackSize != stack.stackSize) { - this.decrStackSize(i, 1); - this.markDirty(); - return; + ItemStack stack = slots[i]; + + if(stack != null) { + ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + + if(ret == null || ret.stackSize != stack.stackSize) { + slots[i] = ret; + this.markDirty(); + return; + } + } + } + + //if the previous operation fails, repeat but use single items instead of the whole stack instead + //this should fix cases where the inserter can't insert into something that has a stack size limitation + for(int i = 0; i < slots.length; i++) { + + ItemStack stack = slots[i]; + + if(stack != null) { + stack = stack.copy(); + stack.stackSize = 1; + ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + + if(ret == null || ret.stackSize != stack.stackSize) { + this.decrStackSize(i, 1); + this.markDirty(); + return; + } } } } From db109d8bcf990ac44bc96c3c1fe52faaae2f0004 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:14:45 +0300 Subject: [PATCH 037/323] Crane extractors take items to inventory when not facing a conveyor Allows using them as an ad-hoc hopper with a small buffer. Previously their buffer was effectively rudimentary -- it was used for output, but nothing ever inputted into it. --- .../network/TileEntityCraneExtractor.java | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index 105ceb3fd..e284f0734 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -10,6 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.InventoryUtil; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -94,54 +96,62 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU } boolean hasSent = false; + + IConveyorBelt belt = null; if(b instanceof IConveyorBelt) { + belt = (IConveyorBelt) b; + } - IConveyorBelt belt = (IConveyorBelt) b; + /* try to send items from a connected inv, if present */ + if(te instanceof IInventory) { - /* try to send items from a connected inv, if present */ - if(te instanceof IInventory) { + IInventory inv = (IInventory) te; + int size = access == null ? inv.getSizeInventory() : access.length; + + for(int i = 0; i < size; i++) { + int index = access == null ? i : access[i]; + ItemStack stack = inv.getStackInSlot(index); - IInventory inv = (IInventory) te; - int size = access == null ? inv.getSizeInventory() : access.length; - - for(int i = 0; i < size; i++) { - int index = access == null ? i : access[i]; - ItemStack stack = inv.getStackInSlot(index); + if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ - if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ + boolean match = this.matchesFilter(stack); + + if((isWhitelist && match) || (!isWhitelist && !match)) { + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); - boolean match = this.matchesFilter(stack); - - if((isWhitelist && match) || (!isWhitelist && !match)) { - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); + if (belt != null) { inv.decrStackSize(index, toSend); stack.stackSize = toSend; - sendItem(stack, belt, outputSide); - hasSent = true; - break; + } else { + stack.stackSize = toSend; + ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, stack); + inv.decrStackSize(index, toSend - (remaining == null ? 0 : remaining.stackSize)); } + hasSent = true; + break; } } } + } + + /* if no item has been sent, send buffered items while ignoring the filter */ + if(!hasSent && belt != null) { - /* if no item has been sent, send buffered items while ignoring the filter */ - if(!hasSent) { + for(int i = 9; i < 18; i++) { + ItemStack stack = slots[i]; - for(int i = 9; i < 18; i++) { - ItemStack stack = slots[i]; - - if(stack != null){ - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); - decrStackSize(i, toSend); - stack.stackSize = toSend; - - sendItem(stack, belt, outputSide); - break; - } + if(stack != null){ + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); + + decrStackSize(i, toSend); + stack.stackSize = toSend; + sendItem(stack, belt, outputSide); + + break; } } } From 997e96f7579b714bf8a2b1d724d96c80797b1706 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:23:16 +0300 Subject: [PATCH 038/323] Exclude special slots --- .../com/hbm/tileentity/network/TileEntityCraneExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index e284f0734..804c42321 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -127,7 +127,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU sendItem(stack, belt, outputSide); } else { stack.stackSize = toSend; - ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, stack); + ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, 9, 17, stack); inv.decrStackSize(index, toSend - (remaining == null ? 0 : remaining.stackSize)); } hasSent = true; From f6f1c1c380e35c6acefeaf52677631210fb5ae59 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:50:45 +0300 Subject: [PATCH 039/323] Turn presses into pseudomultiblocks Affects burner and electrical press. They seem to have been implemented largely based on copy-pasted furnace code, and seemingly predate BlockDummyable. That meant the top two blocks of a press were intangible. Now they're in line with the rest of the machines, including the conveyor press. --- .../com/hbm/blocks/machine/MachineEPress.java | 91 +++++-------------- .../com/hbm/blocks/machine/MachinePress.java | 81 +++-------------- 2 files changed, 38 insertions(+), 134 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 465ea6c69..42cb7713f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import java.util.Random; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; @@ -20,10 +21,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineEPress extends BlockContainer implements INBTTransformable { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; +public class MachineEPress extends BlockDummyable implements INBTTransformable { public MachineEPress(Material p_i45386_1_) { super(p_i45386_1_); @@ -35,75 +33,27 @@ public class MachineEPress extends BlockContainer implements INBTTransformable { } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { - if(!keepInventory) { - ISidedInventory tileentityfurnace = (ISidedInventory) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if(tileentityfurnace != null) { - for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if(itemstack != null) { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while(itemstack.stackSize > 0) { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if(j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if(itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); + public int getOffset() { + return 0; } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); - if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); - if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); - if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + super.onBlockPlacedBy(world, x, y, z, player, itemStack); if(itemStack.hasDisplayName()) { - ((TileEntityMachineEPress) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + int[] pos = this.findCore(world, x, y, z); + if(pos != null) { + TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity != null) { + entity.setCustomName(itemStack.getDisplayName()); + } + } } } @@ -112,10 +62,15 @@ public class MachineEPress extends BlockContainer implements INBTTransformable { if(world.isRemote) { return true; } else if(!player.isSneaking()) { - TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } + int[] pos = this.findCore(world, x, y, z); + if(pos == null) + return false; + + TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity == null) + return false; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } else { return false; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index a28d22172..ddf7782b7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -2,23 +2,16 @@ package com.hbm.blocks.machine; import java.util.Random; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachinePress; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachinePress extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; +public class MachinePress extends BlockDummyable { public MachinePress(Material p_i45386_1_) { super(p_i45386_1_); @@ -30,62 +23,13 @@ public class MachinePress extends BlockContainer { } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { - if(!keepInventory) { - TileEntityMachinePress tileentityfurnace = (TileEntityMachinePress) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if(tileentityfurnace != null) { - for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if(itemstack != null) { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while(itemstack.stackSize > 0) { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if(j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if(itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); + public int getOffset() { + return 0; } @Override @@ -93,10 +37,15 @@ public class MachinePress extends BlockContainer { if(world.isRemote) { return true; } else if(!player.isSneaking()) { - TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } + int[] pos = this.findCore(world, x, y, z); + if(pos == null) + return false; + + TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity == null) + return false; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } else { return false; From 1f073d570cece2b650a6fb43676a3d2db805b597 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:52:39 +0300 Subject: [PATCH 040/323] Fix createNewTileEntity and clean up a bit --- .../com/hbm/blocks/machine/MachineEPress.java | 15 +++++---------- .../java/com/hbm/blocks/machine/MachinePress.java | 9 +++++---- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 42cb7713f..3f33886f3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -8,28 +8,23 @@ import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class MachineEPress extends BlockDummyable implements INBTTransformable { - public MachineEPress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachineEPress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineEPress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineEPress(); + return null; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index ddf7782b7..6633c9e76 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -13,13 +13,14 @@ import net.minecraft.world.World; public class MachinePress extends BlockDummyable { - public MachinePress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachinePress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachinePress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachinePress(); + return null; } @Override From 1bb88b176a7231932f2b2875e4a9ddf2f6f70de4 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 00:10:25 +0300 Subject: [PATCH 041/323] More fixes Turns out, pseudomultiblocks are pretty complicated --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 4 +++- src/main/java/com/hbm/blocks/machine/MachinePress.java | 4 +++- src/main/java/com/hbm/render/tileentity/RenderEPress.java | 7 ++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 3f33886f3..d52898b60 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; @@ -24,6 +25,7 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachineEPress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); return null; } @@ -65,7 +67,7 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { if(entity == null) return false; - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return false; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 6633c9e76..22ecffa26 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePress; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; @@ -20,6 +21,7 @@ public class MachinePress extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachinePress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); return null; } @@ -46,7 +48,7 @@ public class MachinePress extends BlockDummyable { if(entity == null) return false; - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return false; diff --git a/src/main/java/com/hbm/render/tileentity/RenderEPress.java b/src/main/java/com/hbm/render/tileentity/RenderEPress.java index 987ab9a0a..cf8915ef8 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderEPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderEPress.java @@ -2,6 +2,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; import com.hbm.tileentity.machine.TileEntityMachineEPress; @@ -28,7 +29,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; @@ -50,7 +51,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; @@ -78,7 +79,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: From 41d62c49db9e1fa3704c0c10eb59123ef7f2281f Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 00:24:32 +0300 Subject: [PATCH 042/323] Remove broken & redundant transformMeta --- .../java/com/hbm/blocks/machine/MachineEPress.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index d52898b60..12a7f91ff 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; @@ -16,7 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachineEPress extends BlockDummyable implements INBTTransformable { +public class MachineEPress extends BlockDummyable { public MachineEPress(Material mat) { super(mat); @@ -73,9 +70,4 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { return false; } } - - @Override - public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); - } } \ No newline at end of file From 4a869ae2ea3a5926508b5f8936aa93e9cff2479d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:02:43 +0300 Subject: [PATCH 043/323] Add automatic migration API to BlockDummyable --- .../java/com/hbm/blocks/BlockDummyable.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 9508350b5..0d7fa08b4 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -77,27 +77,20 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl super.onNeighborBlockChange(world, x, y, z, block); - if(world.isRemote || safeRem) + if(safeRem) return; - int metadata = world.getBlockMetadata(x, y, z); - - // if it's an extra, remove the extra-ness - if(metadata >= extra) - metadata -= extra; - - ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); - Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - - if(b != this) { - world.setBlockToAir(x, y, z); - } + destroyIfOrphan(world, x, y, z); } public void updateTick(World world, int x, int y, int z, Random rand) { super.updateTick(world, x, y, z, rand); + destroyIfOrphan(world, x, y, z); + } + + private void destroyIfOrphan(World world, int x, int y, int z) { if(world.isRemote) return; @@ -111,9 +104,26 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(b != this) { - world.setBlockToAir(x, y, z); + if (isLegacyMonoblock(world, x, y, z)) { + fixLegacyMonoblock(world, x, y, z); + } else { + world.setBlockToAir(x, y, z); + } } + } + // Override this when turning a single block into a pseudo-multiblock. + // If this returns true, instead of being deleted as an orphan, the block + // will be promoted to a core of a dummyable, however without any dummies. + // This is only called if the block is presumed an orphan, so you don't + // need to check that here. + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + return false; + } + + protected void fixLegacyMonoblock(World world, int x, int y, int z) { + // Promote to a lone core block with the same effective rotation as before the change + world.setBlockMetadataWithNotify(x, y, z, offset + world.getBlockMetadata(x, y, z), 3); } public int[] findCore(World world, int x, int y, int z) { From 0eb87524ab832567d48a3a48b901f6df1305d0d0 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:03:16 +0300 Subject: [PATCH 044/323] Make new press implementation savegame-compatible --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 6 ++++++ src/main/java/com/hbm/blocks/machine/MachinePress.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 12a7f91ff..add331ba3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -36,6 +36,12 @@ public class MachineEPress extends BlockDummyable { return 0; } + @Override + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachineEPress; + } + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { super.onBlockPlacedBy(world, x, y, z, player, itemStack); diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 22ecffa26..6f4cf5808 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -34,6 +34,12 @@ public class MachinePress extends BlockDummyable { public int getOffset() { return 0; } + + @Override + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachinePress; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { From b89bec56c867879651e48baa72c057e48b7ea053 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 29 Jun 2025 00:06:44 +0200 Subject: [PATCH 045/323] gun --- .../weapon/sedna/factory/Orchestras.java | 18 +++++ .../item/weapon/sedna/ItemRenderSexy.java | 7 ++ .../weapon/sedna/ItemRenderWeaponBase.java | 2 + .../assets/hbm/models/weapons/sexy.obj | 72 +++++++++--------- .../models/weapons/sexy_real_no_fake.png | Bin 4284 -> 5698 bytes 5 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index dddfbeda4..2d987404c 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -950,8 +950,26 @@ public class Orchestras { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); } if(type == AnimType.RELOAD) { + if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); + if(timer == 4) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.75F); + if(timer == 16) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); + if(timer == 55) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.impact", 0.5F, 1F); + if(timer == 65) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); + if(timer == 74) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 1F); + if(timer == 88) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.75F); + if(timer == 100) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); + if(timer == 55) ctx.config.getReceivers(stack)[0].getMagazine(stack).reloadAction(stack, ctx.inventory); } + + if(type == AnimType.INSPECT) { + if(timer == 20) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 25) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 35) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 50) entity.worldObj.playSoundAtEntity(entity, "hbm:player.groan", 1F, 1F); + } }; public static BiConsumer ORCHESTRA_QUADRO = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java index acd889ab4..35e772158 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java @@ -172,6 +172,13 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, 8); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + this.renderMuzzleFlash(gun.lastShot[0], 150, 7.5); + GL11.glPopMatrix(); } @Override diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index cc7ba4b30..3abb3a71c 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -344,6 +344,7 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { if(System.currentTimeMillis() - lastShot < flash) { GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDepthMask(false); GL11.glPushMatrix(); double fire = (System.currentTimeMillis() - lastShot) / (double) flash; @@ -379,6 +380,7 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { tess.draw(); GL11.glPopMatrix(); + GL11.glDepthMask(true); GL11.glDisable(GL11.GL_BLEND); } } diff --git a/src/main/resources/assets/hbm/models/weapons/sexy.obj b/src/main/resources/assets/hbm/models/weapons/sexy.obj index 114be9b3d..53da0cde9 100644 --- a/src/main/resources/assets/hbm/models/weapons/sexy.obj +++ b/src/main/resources/assets/hbm/models/weapons/sexy.obj @@ -139,8 +139,8 @@ vt 0.933357 0.212107 vt 0.966667 0.000061 vt 0.995513 0.020249 vt 0.937820 0.020249 -vt 0.999976 0.040436 -vt 0.983321 0.071080 +vt 0.933357 0.040436 +vt 0.950012 0.071080 vt 0.966667 0.065671 vt 0.075000 0.136364 vt 0.066667 0.121212 @@ -206,17 +206,17 @@ vt 0.999976 0.131281 vt 0.995513 0.151468 vt 0.983321 0.005470 vt 0.950012 0.005470 -vt 0.937820 0.085859 -vt 0.933357 0.106046 -vt 0.933357 0.040436 -vt 0.937820 0.020249 -vt 0.950012 0.005470 -vt 0.966667 0.000061 -vt 0.983321 0.005470 -vt 0.995513 0.020249 -vt 0.999976 0.106046 vt 0.995513 0.085859 -vt 0.950012 0.071080 +vt 0.999976 0.106046 +vt 0.999976 0.040436 +vt 0.995513 0.020249 +vt 0.983321 0.005470 +vt 0.966667 0.000061 +vt 0.950012 0.005470 +vt 0.937820 0.020249 +vt 0.933357 0.106046 +vt 0.937820 0.085859 +vt 0.983321 0.071080 vt 0.066667 0.181818 vt 0.039454 0.130050 vt 0.044792 0.123580 @@ -2777,9 +2777,9 @@ vt 0.612500 0.313131 vt 0.983257 0.793649 vt 0.999848 0.828481 vt 0.933485 0.828481 -vt 0.933485 0.828481 -vt 0.950076 0.793649 -vt 0.999848 0.828481 +vt 0.933485 0.702218 +vt 0.950076 0.667387 +vt 0.999848 0.702218 vt 0.933384 0.595929 vt 0.950025 0.560991 vt 0.999949 0.595929 @@ -2787,8 +2787,8 @@ vt 0.999949 0.424312 vt 0.983308 0.454931 vt 0.966667 0.449526 vt 0.966667 0.383970 -vt 0.995490 0.404141 vt 0.937843 0.404141 +vt 0.995490 0.404141 vt 0.658333 0.181938 vt 0.666568 0.191919 vt 0.658333 0.201900 @@ -3055,17 +3055,17 @@ vt 0.950076 0.793649 vt 0.966667 0.788261 vt 0.995403 0.808371 vt 0.983257 0.908559 -vt 0.995403 0.893838 -vt 0.983257 0.908559 -vt 0.937931 0.893838 -vt 0.966667 0.913948 -vt 0.950076 0.908559 -vt 0.933485 0.873728 -vt 0.999848 0.873728 -vt 0.937931 0.808371 -vt 0.966667 0.788261 -vt 0.983257 0.793649 -vt 0.995403 0.808371 +vt 0.995403 0.767575 +vt 0.983257 0.782297 +vt 0.937931 0.767575 +vt 0.966667 0.787685 +vt 0.950076 0.782297 +vt 0.933485 0.747465 +vt 0.999848 0.747465 +vt 0.937931 0.682108 +vt 0.966667 0.661998 +vt 0.983257 0.667387 +vt 0.995403 0.682108 vt 0.995490 0.641313 vt 0.983308 0.656080 vt 0.937843 0.641313 @@ -3088,19 +3088,19 @@ vt 0.933384 0.489868 vt 0.933384 0.424312 vt 0.937843 0.469697 vt 0.950025 0.454931 -vt 0.983308 0.550019 -vt 0.966667 0.555424 vt 0.950025 0.550019 -vt 0.937843 0.535253 -vt 0.933384 0.515082 -vt 0.933384 0.489868 -vt 0.933384 0.424312 +vt 0.966667 0.555424 +vt 0.983308 0.550019 +vt 0.995490 0.535253 +vt 0.999949 0.515082 vt 0.999949 0.489868 vt 0.999949 0.424312 -vt 0.999949 0.515082 -vt 0.995490 0.535253 -vt 0.983308 0.389375 +vt 0.933384 0.489868 +vt 0.933384 0.424312 +vt 0.933384 0.515082 +vt 0.937843 0.535253 vt 0.950025 0.389375 +vt 0.983308 0.389375 vt 0.652511 0.198977 vt 0.650099 0.191919 vt 0.652511 0.184862 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png b/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png index fa565a3a07c3d352e8e82b210c80dbf856376647..5855c616b09a0f70d5fd80020dd32525d2ae90e1 100644 GIT binary patch literal 5698 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 Tl@M#C00000NkvXXu0mjf^2_x9 From 3b36807242fa24ef3b9673a9b9e3ff86d92f114f Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:44:31 +0300 Subject: [PATCH 046/323] Trigger the press fix automatically --- .../tileentity/machine/TileEntityMachineEPress.java | 12 ++++++++++++ .../tileentity/machine/TileEntityMachinePress.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index b2afe4309..90896b626 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineEPress; @@ -64,6 +65,17 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { + // Does nothing + // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + + BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); + if (block != null) { + block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); + } + } + this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index c927edc0a..0684ef87e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerMachinePress; import com.hbm.inventory.gui.GUIMachinePress; @@ -53,6 +54,17 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { + // Does nothing + // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + + BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); + if (block != null) { + block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); + } + } + boolean preheated = false; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { From d1f50a8eb4419057c17dbc9faabdf87b225be10a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 15:45:30 +0300 Subject: [PATCH 047/323] Fix press auto-migration --- .../tileentity/machine/TileEntityMachineEPress.java | 11 ++--------- .../tileentity/machine/TileEntityMachinePress.java | 11 ++--------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 90896b626..4dc4df595 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -3,7 +3,6 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; -import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineEPress; @@ -66,14 +65,8 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(!worldObj.isRemote) { // Triggers the legacy monoblock fix - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { - // Does nothing - // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - - BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); - if (block != null) { - block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); - } + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); } this.updateConnections(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 0684ef87e..a0d1e5b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -1,6 +1,5 @@ package com.hbm.tileentity.machine; -import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerMachinePress; import com.hbm.inventory.gui.GUIMachinePress; @@ -55,14 +54,8 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { // Triggers the legacy monoblock fix - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { - // Does nothing - // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - - BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); - if (block != null) { - block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); - } + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); } boolean preheated = false; From 3583ad66cd54b02e203630f285838f483c84ea1f Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 29 Jun 2025 22:30:04 +0200 Subject: [PATCH 048/323] ough --- changelog | 18 +++++++++++++++++- .../blocks/machine/MachineRotaryFurnace.java | 1 - .../FluidDuctPaintableBlockExhaust.java | 4 ---- .../com/hbm/items/tool/ItemToolAbility.java | 1 - .../items/weapon/sedna/factory/Orchestras.java | 2 +- .../weapon/sedna/factory/XFactory12ga.java | 2 +- .../weapon/sedna/mods/WeaponModManager.java | 2 +- .../item/weapon/sedna/ItemRenderSexy.java | 7 ++----- .../machine/storage/TileEntityMassStorage.java | 1 - 9 files changed, 22 insertions(+), 16 deletions(-) diff --git a/changelog b/changelog index 6f3ede9f5..1e3e818a7 100644 --- a/changelog +++ b/changelog @@ -12,8 +12,11 @@ * Also has sound, unlike the old chemical factory * Output fluids are now automatically sent to input tanks, at a rate of up to 50mB/t for somewhat fair fluid sharing * This means that a chemical factory can make hydrogen peroxide, sulfuric acid and nitric acid, and the only fluid input needed is water +* Paintable exhaust pipe + * Full block exhaust pipe that behaves like paintable cables and ducts ## Changed +* Updated chinese and ukrainian localizations * The DNT suit now has a damage threshold of 1,000 * Compressed biomass now has a nice cube shape * The new chemical plant's indicator lights are now functional @@ -31,6 +34,16 @@ * The memespoon is now safe(tm) * Instead of using a bugged instakill implementation, a fall distance of >2 now deals 50 extra melee damage * Instead of blowing up like a nuke with a fall distance of >20, it now explodes similarly to a non-HE artillery grenade. This deals 150 damage in an AoE, has armor piercing properties and is, like the original functionality, still lethal to the user +* The fuel port on the rotary furnace now has a tooltip showing that it can be used for automation +* Shredders will now prioritize NTM items when automatically generating recipes + * The priority for what mods' items should be chosen can be configured +* Mass storage units' stockpiles can now be directly accessed by ME systems +* Inserters can now be suspended by applying a redstone signal +* The legendary variant of the auto shotgun is no longer a simple reskin, it now has a completely unique model and animations + * Added alcoholism +* Open doors can now be interacted through +* Area abilities on tools now drop all mined blocks in the center +* Tools with AoE now come with the new "flat AoE" ability, which is the same but the area is only 1 block tall ## Fixed * Chemical plant ports. For real this time. @@ -45,4 +58,7 @@ * Fixed issue where mining strange stone with silk touch ability would cause a desync. It also now drops cobblestone, as if silk touch wasn't active at all * Fixed issue where applying a filter to a mask that doesn't support certain protection types would permanently remove those types from the filter until the game is restarted * Fixed InventoryBogoSorter being able to move held crates -* Fixed tier 2 pickaxes mining depth rock causing a desync with the depth rock not actually being broken \ No newline at end of file +* Fixed tier 2 pickaxes mining depth rock causing a desync with the depth rock not actually being broken +* Replaced paintabble cables in the lighthouse with regular ones, fixing an issue where the paint would ID shift +* Fixed light blocks being considered solid for NPC pathfinding +* Fixed issue regarding locked slots when using crates diff --git a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java index e252c8445..8dabf9e77 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java @@ -4,7 +4,6 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; -import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.i18n.I18nUtil; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java index f57b6f9b1..382c79c8b 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -6,7 +6,6 @@ import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; import com.hbm.interfaces.ICopiable; import com.hbm.inventory.fluid.Fluids; -import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityPipeExhaust; @@ -17,9 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -31,7 +28,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index 022c9274c..c731da461 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -29,7 +29,6 @@ import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.tileentity.IGUIProvider; import api.hbm.item.IDepthRockTool; -import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index 2d987404c..c13f16a26 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -942,7 +942,7 @@ public class Orchestras { if(timer == 2) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); - if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, -0.125, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? -0.0625 : -0.125, aiming ? 0 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 777c2d4c4..490bd64b7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -375,7 +375,7 @@ public class XFactory12ga { ).setUnlocalizedName("gun_autoshotgun_shredder"); ModItems.gun_autoshotgun_sexy = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() - .dura(5_000).draw(20).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .dura(5_000).draw(20).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(64F).delay(4).auto(true).dryfireAfterAuto(true).reload(110).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 100).addConfigs(g12_equestrian_bj, g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index d6958bc94..128341947 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -138,7 +138,7 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.SPEEDUP) .addMod(new Item[] {ModItems.gun_minigun, ModItems.gun_minigun_dual}, new WeaponModMinigunSpeedup(ID_MINIGUN_SPEED)) .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); - new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12}, new WeaponModChoke(210)); + new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12, ModItems.gun_autoshotgun_sexy}, new WeaponModChoke(210)); new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); new WeaponModDefinition(EnumModSpecial.BAYONET) diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java index 35e772158..895c2357e 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java @@ -21,7 +21,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { @Override public float getViewFOV(ItemStack stack, float fov) { float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; - return fov * (1 - aimingProgress * 0.66F); + return fov * (1 - aimingProgress * 0.33F); } @Override @@ -29,10 +29,6 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glTranslated(0, 0, 0.875); float offset = 0.8F; - - /*standardAimingTransform(stack, - -1.25F * offset, -0.75F * offset, 3.25F * offset, - 0, -5.25 / 8D, 1);*/ standardAimingTransform(stack, -1F * offset, -0.75F * offset, 3F * offset, @@ -45,6 +41,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { double scale = 0.375D; GL11.glScaled(scale, scale, scale); + // i'm not going overboard with the animation boolean doesCycle = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("CYCLE") != null; boolean reloading = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("BELT") != null; boolean useShellCount = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("SHELLS") != null; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 6290254ff..3d3213d2c 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -16,7 +16,6 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; From d1497abd1e16ada4812c6c077db2aa6f9973cbcf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 23:40:51 +0300 Subject: [PATCH 049/323] Simplify press click handling Turns out there is already a function for doing just that --- .../com/hbm/blocks/machine/MachineEPress.java | 17 +---------------- .../com/hbm/blocks/machine/MachinePress.java | 17 +---------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index add331ba3..c44a8e575 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -59,21 +59,6 @@ public class MachineEPress extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) { - return true; - } else if(!player.isSneaking()) { - int[] pos = this.findCore(world, x, y, z); - if(pos == null) - return false; - - TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); - if(entity == null) - return false; - - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 6f4cf5808..1e6c51ca3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -43,21 +43,6 @@ public class MachinePress extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) { - return true; - } else if(!player.isSneaking()) { - int[] pos = this.findCore(world, x, y, z); - if(pos == null) - return false; - - TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(pos[0], pos[1], pos[2]); - if(entity == null) - return false; - - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } } From 18a310ba3a0e210d38125ac52a7a74926ef1527b Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 00:24:55 +0300 Subject: [PATCH 050/323] Prevent pseudomultiblocks disappearing on chunk boundaries If this was indeed a problem, it must've been one before my PR... I suspect maybe some of my intermediate implementations allowed this to have an effect. Regardless, this is definitely a useful fix --- src/main/java/com/hbm/blocks/BlockDummyable.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 0d7fa08b4..19c33db65 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -103,7 +103,12 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - if(b != this) { + // An extra precaution against multiblocks on chunk borders being erroneously deleted. + // Technically, this might be used to persist ghost dummy blocks by manipulating + // loaded chunks and block destruction, but this gives no benefit to the player, + // cannot be done accidentally, and is definitely preferable to multiblocks + // just vanishing when their chunks are unloaded in an unlucky way. + if(b != this && world.checkChunksExist(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1)) { if (isLegacyMonoblock(world, x, y, z)) { fixLegacyMonoblock(world, x, y, z); } else { From 3db1dbd277f28c7d2629e35ce9e7739d1cab0d62 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 051/323] the gob block --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 + .../hbm/blocks/generic/BlockWandSpawner.java | 249 ++++++++++++++++++ .../hbm/blocks/generic/DungeonSpawner.java | 106 ++------ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ModEventHandler.java | 140 ++-------- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ++++++++++++++ .../world/gen/util/DungeonSpawnerActions.java | 165 ++++++++++++ .../gen/util/DungeonSpawnerConditions.java | 91 +++++++ src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/blocks/wand_spawner.png | Bin 0 -> 730 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 0 -> 740 bytes 12 files changed, 760 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java create mode 100644 src/main/java/com/hbm/util/MobUtil.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 7ecdc698a..e60125d93 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1240,6 +1240,7 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; + public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2390,6 +2391,8 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); + wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + } private static void registerBlock() { @@ -3534,6 +3537,7 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); + register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java new file mode 100644 index 000000000..fdfca7689 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -0,0 +1,249 @@ +package com.hbm.blocks.generic; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +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.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandSpawner() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if (i == 0) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityWandSpawner) + ((TileEntityWandSpawner)te).placedRotation = i; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return false; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + switch(tool) { + case SCREWDRIVER: + List actionNames = DungeonSpawnerActions.getActionNames(); + int indexA = actionNames.indexOf(spawner.actionID); + + indexA += player.isSneaking() ? -1 : 1; + indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); + + spawner.actionID = actionNames.get(indexA); + return true; + case DEFUSER: + List conditionNames = DungeonSpawnerConditions.getConditionNames(); + int indexC = conditionNames.indexOf(spawner.conditionID); + + indexC += player.isSneaking() ? -1 : 1; + indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); + + spawner.conditionID = conditionNames.get(indexC); + + return true; + + default: return false; + } + } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + List text = new ArrayList(); + text.add("Action: " + spawner.actionID); + text.add("Condition: " + spawner.conditionID); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); + list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityWandSpawner(); + } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return null; + + ((TileEntityWandSpawner) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + + public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + private boolean triggerReplace; + + public int placedRotation; + + public String actionID = "PHASE_ABERRATOR"; + public String conditionID = "ABERRATOR"; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + return; + } + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { + MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + worldObj.setTileEntity(xCoord, yCoord, zCoord, te); + } + + if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ + DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; + spawner.actionID = actionID; + spawner.conditionID = conditionID; + } + + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + nbt.setInteger("rotation", placedRotation); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + placedRotation = nbt.getInteger("rotation"); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(placedRotation); + BufferUtil.writeString(buf, actionID); + BufferUtil.writeString(buf, conditionID); + } + + @Override + public void deserialize(ByteBuf buf) { + placedRotation = buf.readInt(); + actionID = BufferUtil.readString(buf); + conditionID = BufferUtil.readString(buf); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 4a6fc10d8..ffbb14239 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,7 +7,8 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.EnumUtil; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; import net.minecraft.block.BlockContainer; @@ -30,19 +31,35 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - + public static class TileEntityDungeonSpawner extends TileEntity { - + public int phase = 0; public int timer = 0; - public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; - + + public String conditionID = "ABERRATOR"; + //actions always get called before conditions, use the phase timer in order to control behavior via condition + public String actionID = "ABERRATOR"; + + public Function condition; + public Consumer action; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - type.phase.accept(this); - if(type.phaseCondition.apply(this)) { + if(action == null){ + action = DungeonSpawnerActions.actions.get(actionID); + } + if(condition == null){ + condition = DungeonSpawnerConditions.conditions.get(conditionID); + } + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { phase++; timer = 0; } else { @@ -55,83 +72,16 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setByte("type", (byte) type.ordinal()); + nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); + this.conditionID = nbt.getString("conditionID"); } } - - public static enum EnumSpawnerType { - - ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); - public Function phaseCondition; - public Consumer phase; - - private EnumSpawnerType(Function con, Consumer ph) { - this.phaseCondition = con; - this.phase = ph; - } - } - - public static Function CON_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 1 || tile.phase == 2) { - if(tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for(int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for(int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if(mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if(tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if(te instanceof TileEntitySkeletonHolder) { - TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; - if(world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index c4a5a3d4a..9a4cc6040 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,6 +877,8 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); + MobUtil.intializeMobPools(); + proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index cd368b165..655656174 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,74 +387,18 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - - if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine - equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); - return; - } - - slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPools.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPools.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPools.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, - {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} - })); + slotPools = MobUtil.slotPoolCommon; } else if(entity instanceof EntitySkeleton) { - - slotPools.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPools.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPools.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - + slotPools = MobUtil.slotPoolRanged; ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - assignItemsToEntity(entity, slotPools); - } - - private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + MobUtil.assignItemsToEntity(entity, slotPools, rand); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -473,74 +417,30 @@ public class ModEventHandler { return pool; } - - public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - private static ItemStack getSkelegun(float soot, Random rand) { - if(!MobConfig.enableMobWeapons) return null; - if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + if (!MobConfig.enableMobWeapons) return null; + if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList(); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + ArrayList pool = new ArrayList<>(); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); - - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); - - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); - - if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); + if(soot < 0.3){ + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); + pool.add(new WeightedRandomObject(null, 20)); + } else if(soot > 0.3 && soot < 1) { + pool.addAll(MobUtil.slotPoolGuns.get(0.3)); + } else if (soot < 3) { + pool.addAll(MobUtil.slotPoolGuns.get(1D)); + } else if (soot < 5) { + pool.addAll(MobUtil.slotPoolGuns.get(3D)); + } else { + pool.addAll(MobUtil.slotPoolGuns.get(5D)); + } WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } - // these fucking tasks keep stacking on top of themselves - private static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } - @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -549,7 +449,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - addFireTask(living); + MobUtil.addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 20e51d5fc..608ea892e 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,6 +19,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -236,6 +237,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -427,7 +429,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java new file mode 100644 index 000000000..8779c1ed2 --- /dev/null +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -0,0 +1,197 @@ +package com.hbm.util; + +import com.hbm.entity.mob.ai.EntityAIFireGun; +import com.hbm.items.ModItems; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.*; + +public class MobUtil { + + + public static Map> slotPoolCommon = new HashMap<>(); + public static Map> slotPoolRanged = new HashMap<>(); + + public static Map> slotPoolAdv = new HashMap<>(); + public static Map> slotPoolAdvRanged; + /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ + public static HashMap> slotPoolGuns = new HashMap<>(); + + + public static void intializeMobPools(){ + slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, + {ModItems.wrench, 20} + })); + + slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + + slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + })); + slotPoolGuns.put(1D, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} + })); + slotPoolGuns.put(3D, createSlotPool(new Object[][]{ + {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} + })); + slotPoolGuns.put(5D, createSlotPool(new Object[][]{ + {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} + })); + + slotPoolAdv.put(4, createSlotPool(new Object[][]{ + {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, + {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, + {ModItems.hazmat_helmet, 6} + })); + slotPoolAdv.put(3, createSlotPool(new Object[][]{ + {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, + {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, + {ModItems.steel_plate, 8} + })); + slotPoolAdv.put(2, createSlotPool(new Object[][]{ + {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, + {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, + {ModItems.steel_legs, 8} + })); + slotPoolAdv.put(1, createSlotPool(new Object[][]{ + {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, + {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, + {ModItems.robes_boots, 8} + })); + slotPoolAdv.put(0, createSlotPool(new Object[][]{ + {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, + {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, + {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, + {ModItems.wrench, 20} + })); + + slotPoolAdvRanged = new HashMap<>(slotPoolAdv); + slotPoolAdvRanged.remove(0); + + } + + public static List createSlotPool(int nullWeight, Object[][] items) { + List pool = new ArrayList<>(); + pool.add(new WeightedRandomObject(null, nullWeight)); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + public static List createSlotPool(Object[][] items) { + List pool = new ArrayList<>(); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + + public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + } + + public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); + + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } + } + } + + // these fucking tasks keep stacking on top of themselves + public static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java new file mode 100644 index 000000000..120ea00e8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -0,0 +1,165 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.BlockSkeletonHolder; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ItemEnums; +import com.hbm.items.ModItems; +import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.MobUtil; +import com.hbm.util.Vec3NT; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.function.Consumer; + +public class DungeonSpawnerActions { + + public static HashMap> actions = new HashMap<>(); + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1 || tile.phase == 2) { + if (tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for (int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if (mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if (tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; + + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) return; + + //from explosionChaos because i cannot be assed + int r = 4; + int r2 = r * r; + int r22 = r2 / 2; + + for (int xx = -r; xx < r; xx++) { + int X = xx + x; + int XX = xx * xx; + for (int yy = -r; yy < r; yy++) { + int Y = yy + y; + int YY = XX + yy * yy; + for (int zz = -r; zz < r; zz++) { + int Z = zz + z; + int ZZ = YY + zz * zz; + if (ZZ < r22) { + + if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { + EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); + world.spawnEntityInWorld(entityfallingblock); + } + } + } + } + } + world.setBlock(x, y, z, ModBlocks.block_steel); + + }; + + public static Consumer FODDER_WAVE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1) { + Vec3NT vec = new Vec3NT(5, 0, 0); + for (int i = 0; i < 10; i++) { + EntityZombie mob = new EntityZombie(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + if (mob.getCanSpawnHere()) { + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); + } + world.setBlock(x, y, z, ModBlocks.block_steel); + } + }; + + public static Consumer PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 2){ + world.setBlock(x,y,z, ModBlocks.crate_steel); + + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + world.spawnEntityInWorld(blitz); + + TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); + ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); + } + }; + + public static List getActionNames(){ + return new ArrayList<>(actions.keySet()); + } + + //register new actions here + static{ + actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("PUZZLE_TEST", PUZZLE_TEST); + } + + + +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java new file mode 100644 index 000000000..0a634c271 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -0,0 +1,91 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; + +public class DungeonSpawnerConditions { + + public static HashMap> conditions = new HashMap<>(); + + public static Function ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Function PLAYER_CUBE_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); + }; + + public static Function REDSTONE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + return world.isBlockIndirectlyGettingPowered(x,y,z); + }; + + public static Function PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); + world.setBlock(x,y + 1,z, ModBlocks.pedestal); + return true; + } + + TileEntity pedestal = world.getTileEntity(x,y + 1,z); + + return tile.phase == 1 + && pedestal instanceof BlockPedestal.TileEntityPedestal + && ((BlockPedestal.TileEntityPedestal) pedestal).item != null + && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; + }; + + public static List getConditionNames(){ + return new ArrayList<>(conditions.keySet()); + } + + //register new conditions here + static { + conditions.put("ABERRATOR", ABERRATOR); + conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); + conditions.put("REDSTONE", REDSTONE); + conditions.put("PUZZLE_TEST", PUZZLE_TEST); + } + +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 72c0ee93b..924ab3652 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6057,6 +6057,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4788b84883581058c6fdf5525b3239d0e888f352 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flPBx7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`Va7jCRdIWMFVqh|G_VDx+T*Ri*utcI?R3P2J0O%k? Wj>Vsvd|H4;FnGH9xvX Date: Mon, 30 Jun 2025 09:11:51 +0300 Subject: [PATCH 052/323] Make presses un-multiblockable with a hand drill As per @MellowArpeggiation 's request. Meant for schenanigans with visually squishing things --- .../com/hbm/blocks/machine/MachineEPress.java | 20 +++++++++++++--- .../com/hbm/blocks/machine/MachinePress.java | 24 +++++++++++++++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index c44a8e575..d269c253c 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -1,11 +1,10 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; -import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import api.hbm.block.IToolable; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -13,7 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachineEPress extends BlockDummyable { +public class MachineEPress extends BlockDummyable implements IToolable { public MachineEPress(Material mat) { super(mat); @@ -61,4 +60,19 @@ public class MachineEPress extends BlockDummyable { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); } + + // Un-multiblickable with a hand drill for schenanigans + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if (tool != ToolType.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + world.setBlockToAir(x, y, z); + return true; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 1e6c51ca3..44415589f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -1,18 +1,16 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; -import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePress; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; + +import api.hbm.block.IToolable; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachinePress extends BlockDummyable { +public class MachinePress extends BlockDummyable implements IToolable { public MachinePress(Material mat) { super(mat); @@ -45,4 +43,20 @@ public class MachinePress extends BlockDummyable { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); } + + // Un-multiblickable with a hand drill for schenanigans + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if (tool != ToolType.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + world.setBlockToAir(x, y, z); + return true; + } + } From 2e5882df606b88eea588fd7719132b0dd2051216 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 09:14:49 +0300 Subject: [PATCH 053/323] Don't break the whole thing --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 2 ++ src/main/java/com/hbm/blocks/machine/MachinePress.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index d269c253c..82eb6d89f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -72,7 +72,9 @@ public class MachineEPress extends BlockDummyable implements IToolable { if (meta >= 12) return false; + safeRem = true; world.setBlockToAir(x, y, z); + safeRem = false; return true; } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 44415589f..b02f3dab8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -55,7 +55,9 @@ public class MachinePress extends BlockDummyable implements IToolable { if (meta >= 12) return false; + safeRem = true; world.setBlockToAir(x, y, z); + safeRem = false; return true; } From 17b0dde444aa0b6ba9604a3d9f48c2f2abd80e3a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 16:02:38 +0300 Subject: [PATCH 054/323] Remove all but the steel trapdoor --- src/main/java/com/hbm/blocks/ModBlocks.java | 29 +----------------- .../java/com/hbm/main/CraftingManager.java | 9 ------ .../world/gen/component/BunkerComponents.java | 1 - src/main/resources/assets/hbm/lang/de_DE.lang | 9 ------ src/main/resources/assets/hbm/lang/en_US.lang | 9 ------ src/main/resources/assets/hbm/lang/it_IT.lang | 9 ------ src/main/resources/assets/hbm/lang/pl_PL.lang | 9 ------ src/main/resources/assets/hbm/lang/ru_RU.lang | 9 ------ src/main/resources/assets/hbm/lang/uk_UA.lang | 9 ------ src/main/resources/assets/hbm/lang/zh_CN.lang | 9 ------ .../textures/blocks/trapdoor_aluminium.png | Bin 833 -> 0 bytes .../hbm/textures/blocks/trapdoor_cobalt.png | Bin 862 -> 0 bytes .../hbm/textures/blocks/trapdoor_copper.png | Bin 871 -> 0 bytes .../hbm/textures/blocks/trapdoor_gold.png | Bin 838 -> 0 bytes .../hbm/textures/blocks/trapdoor_iron.png | Bin 798 -> 0 bytes .../hbm/textures/blocks/trapdoor_lead.png | Bin 846 -> 0 bytes .../hbm/textures/blocks/trapdoor_sturdy.png | Bin 883 -> 0 bytes .../hbm/textures/blocks/trapdoor_titanium.png | Bin 842 -> 0 bytes .../hbm/textures/blocks/trapdoor_tungsten.png | Bin 751 -> 0 bytes 19 files changed, 1 insertion(+), 101 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_cobalt.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_iron.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_lead.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5e0b6d7fb..8b04b34a4 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -846,16 +846,7 @@ public class ModBlocks { public static Block ladder_steel; public static Block ladder_tungsten; - public static Block trapdoor_sturdy; - public static Block trapdoor_iron; - public static Block trapdoor_gold; - public static Block trapdoor_aluminium; - public static Block trapdoor_copper; - public static Block trapdoor_titanium; - public static Block trapdoor_lead; - public static Block trapdoor_cobalt; public static Block trapdoor_steel; - public static Block trapdoor_tungsten; public static Block barrel_plastic; public static Block barrel_corroded; @@ -1985,17 +1976,8 @@ public class ModBlocks { ladder_cobalt = new BlockNTMLadder().setBlockName("ladder_cobalt").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_cobalt"); ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); - - trapdoor_sturdy = new BlockNTMTrapdoor(Material.wood).setBlockName("trapdoor_sturdy").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeWood).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_sturdy"); - trapdoor_iron = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_iron").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_iron"); - trapdoor_gold = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_gold").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_gold"); - trapdoor_aluminium = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_aluminium").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_aluminium"); - trapdoor_copper = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_copper").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_copper"); - trapdoor_titanium = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_titanium").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_titanium"); - trapdoor_lead = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_lead").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_lead"); - trapdoor_cobalt = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_cobalt").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_cobalt"); + trapdoor_steel = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_steel").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_steel"); - trapdoor_tungsten = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_tungsten").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_tungsten"); barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); barrel_corroded = new BlockFluidBarrel(Material.iron, 6000).setBlockName("barrel_corroded").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_corroded"); @@ -3261,16 +3243,7 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_steel, ladder_steel.getUnlocalizedName()); GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_sturdy, trapdoor_sturdy.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_iron, trapdoor_iron.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_gold, trapdoor_gold.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_titanium, trapdoor_titanium.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_copper, trapdoor_copper.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_tungsten, trapdoor_tungsten.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_aluminium, trapdoor_aluminium.getUnlocalizedName()); GameRegistry.registerBlock(trapdoor_steel, trapdoor_steel.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_lead, trapdoor_lead.getUnlocalizedName()); - GameRegistry.registerBlock(trapdoor_cobalt, trapdoor_cobalt.getUnlocalizedName()); register(barrel_plastic); register(barrel_corroded); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 679f8ca96..a64ed3b12 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -883,16 +883,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.ladder_steel, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.ladder_tungsten, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', W.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_sturdy, 1), new Object[] { Blocks.trapdoor, KEY_PLANKS }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_iron, 1), new Object[] { Blocks.trapdoor, IRON.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_gold, 1), new Object[] { Blocks.trapdoor, GOLD.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_aluminium, 1), new Object[] { Blocks.trapdoor, AL.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_copper, 1), new Object[] { Blocks.trapdoor, CU.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_titanium, 1), new Object[] { Blocks.trapdoor, TI.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_lead, 1), new Object[] { Blocks.trapdoor, PB.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_cobalt, 1), new Object[] { Blocks.trapdoor, CO.ingot() }); addShapelessAuto(new ItemStack(ModBlocks.trapdoor_steel, 1), new Object[] { Blocks.trapdoor, STEEL.ingot() }); - addShapelessAuto(new ItemStack(ModBlocks.trapdoor_tungsten, 1), new Object[] { Blocks.trapdoor, W.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_storage_drum), new Object[] { "LLL", "L#L", "LLL", 'L', PB.plate(), '#', ModItems.tank_steel }); diff --git a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java index 033a165f9..d909fc431 100644 --- a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java +++ b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java @@ -127,7 +127,6 @@ public class BunkerComponents { fillWithMetadataBlocks(world, box, 1, hpos, 4, 1, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(0)); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 3, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(2), 2, hpos, 4, box); - placeBlockAtCurrentPosition(world, ModBlocks.trapdoor_sturdy, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(3), 2, hpos, 6, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 7, box); fillWithMetadataBlocks(world, box, 3, hpos, 4, 3, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(1)); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 61488367a..37cac623a 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4320,16 +4320,7 @@ tile.ladder_steel.name=Stahlleiter tile.ladder_sturdy.name=Feste Holzleiter tile.ladder_titanium.name=Titanleiter tile.ladder_tungsten.name=Wolframleiter -tile.trapdoor_aluminium.name=Aluminium-Falltür -tile.trapdoor_cobalt.name=Kobalt-Falltür -tile.trapdoor_copper.name=Kupfer-Falltür -tile.trapdoor_gold.name=Goldene -Falltür -tile.trapdoor_iron.name=Eisen-Falltür -tile.trapdoor_lead.name=Bleilieter tile.trapdoor_steel.name=Stahl-Falltür -tile.trapdoor_sturdy.name=Feste Holz-Falltür -tile.trapdoor_titanium.name=Titan-Falltür -tile.trapdoor_tungsten.name=Wolfram-Falltür tile.lamp_demon.name=Dämonenkernlampe tile.lamp_tritium_blue_off.name=Blaue Tritiumlampe tile.lamp_tritium_blue_on.name=Blaue Tritiumlampe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8d324c9f1..6ab027529 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5445,16 +5445,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder -tile.trapdoor_aluminium.name=Aluminium Trapdoor -tile.trapdoor_cobalt.name=Cobalt Trapdoor -tile.trapdoor_copper.name=Copper Trapdoor -tile.trapdoor_gold.name=Golden Trapdoor -tile.trapdoor_iron.name=Iron Trapdoor -tile.trapdoor_lead.name=Lead Trapdoor tile.trapdoor_steel.name=Steel Trapdoor -tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor -tile.trapdoor_titanium.name=Titanium Trapdoor -tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/it_IT.lang b/src/main/resources/assets/hbm/lang/it_IT.lang index 1e84bfbdb..b426cae6d 100644 --- a/src/main/resources/assets/hbm/lang/it_IT.lang +++ b/src/main/resources/assets/hbm/lang/it_IT.lang @@ -5513,16 +5513,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder -tile.trapdoor_aluminium.name=Aluminium Trapdoor -tile.trapdoor_cobalt.name=Cobalt Trapdoor -tile.trapdoor_copper.name=Copper Trapdoor -tile.trapdoor_gold.name=Golden Trapdoor -tile.trapdoor_iron.name=Iron Trapdoor -tile.trapdoor_lead.name=Lead Trapdoor tile.trapdoor_steel.name=Steel Trapdoor -tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor -tile.trapdoor_titanium.name=Titanium Trapdoor -tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/pl_PL.lang b/src/main/resources/assets/hbm/lang/pl_PL.lang index 2509f8ecc..9ff1a89d8 100644 --- a/src/main/resources/assets/hbm/lang/pl_PL.lang +++ b/src/main/resources/assets/hbm/lang/pl_PL.lang @@ -4859,16 +4859,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder -tile.trapdoor_aluminium.name=Aluminium Trapdoor -tile.trapdoor_cobalt.name=Cobalt Trapdoor -tile.trapdoor_copper.name=Copper Trapdoor -tile.trapdoor_gold.name=Golden Trapdoor -tile.trapdoor_iron.name=Iron Trapdoor -tile.trapdoor_lead.name=Lead Trapdoor tile.trapdoor_steel.name=Steel Trapdoor -tile.trapdoor_sturdy.name=Sturdy Wooden Trapdoor -tile.trapdoor_titanium.name=Titanium Trapdoor -tile.trapdoor_tungsten.name=Tungsten Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 7ac18c33a..43df8e497 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5689,16 +5689,7 @@ tile.ladder_steel.name=Стальная лестница tile.ladder_sturdy.name=Прочная деревянная лестница tile.ladder_titanium.name=Титановая лестница tile.ladder_tungsten.name=Вольфрамовая лестница -tile.trapdoor_aluminium.name=Алюминиевый люк -tile.trapdoor_cobalt.name=Кобальтовый люк -tile.trapdoor_copper.name=Медный люк -tile.trapdoor_gold.name=Золотый люк -tile.trapdoor_iron.name=Железный люк -tile.trapdoor_lead.name=Свинцовый люк tile.trapdoor_steel.name=Стальный люк -tile.trapdoor_sturdy.name=Прочный деревянный люк -tile.trapdoor_titanium.name=Титановый люк -tile.trapdoor_tungsten.name=Вольфрамовый люк tile.lamp_demon.name=Лампа из заряда-демона tile.lamp_tritium_blue_off.name=Синяя тритиевая лампа tile.lamp_tritium_blue_on.name=Синяя тритиевая лампа diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 1e304f224..8d019103e 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -5445,16 +5445,7 @@ tile.ladder_steel.name=Сталева драбина tile.ladder_sturdy.name=Міцна дерев'яна драбина tile.ladder_titanium.name=Титанова драбина tile.ladder_tungsten.name=Вольфрамова драбина -tile.trapdoor_aluminium.name=Алюмінієвий люк -tile.trapdoor_cobalt.name=Кобальтовий люк -tile.trapdoor_copper.name=Мідний люк -tile.trapdoor_gold.name=Золотий люк -tile.trapdoor_iron.name=Залізний люк -tile.trapdoor_lead.name=Свинцевий люк tile.trapdoor_steel.name=Сталевий люк -tile.trapdoor_sturdy.name=Міцний дерев'яний люк -tile.trapdoor_titanium.name=Титановий люк -tile.trapdoor_tungsten.name=Вольфрамовий люк tile.lamp_demon.name=Ядро-демон лампа tile.lamp_tritium_blue_off.name=Синя тритієва лампа tile.lamp_tritium_blue_on.name=Синя тритієва лампа diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index a355a4bdb..9f5d39f26 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5155,16 +5155,7 @@ tile.ladder_steel.name=钢制梯子 tile.ladder_sturdy.name=坚固木头制梯子 tile.ladder_titanium.name=钛制梯子 tile.ladder_tungsten.name=钨制梯子 -tile.trapdoor_aluminium.name=铝制活板门 -tile.trapdoor_cobalt.name=钴制活板门 -tile.trapdoor_copper.name=铜制活板门 -tile.trapdoor_gold.name=金制活板门 -tile.trapdoor_iron.name=铁制活板门 -tile.trapdoor_lead.name=铅制活板门 tile.trapdoor_steel.name=钢制活板门 -tile.trapdoor_sturdy.name=硬木活板门 -tile.trapdoor_titanium.name=钛制活板门 -tile.trapdoor_tungsten.name=钨制活板门 tile.lamp_demon.name=恶魔核心灯 tile.lamp_tritium_blue_off.name=蓝色氚灯 tile.lamp_tritium_blue_on.name=蓝色氚灯 diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_aluminium.png deleted file mode 100644 index 8b1391059f1e5d4251b43ad692c065d332b8b6fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmV-H1HSx;P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1woxRza#d~~u9*D#9i2B}ONkQP-weR~RVT`el?8#e& z3q=oi_YCM=@)YQy@)*M~P^D|ilGJ{`zOPBOr;ZNgk!r0u`5Txfu}fTUHe&(f*x(Xi zRUAc>#t9j&e!E<{0txTGeSA|Q`&zXsERZxW6spu_C%L~!e{~1r-63Q zn)IZ6KVZ=Ud&^}YNw*F4#?1DWQWgWO(oN$8EV9fcbzNtZ&;s6|EqOS@8d&QB5+E4* z5{lR>>&gi!XW|OZf%WN^fChhsk{geFn?%4C;bv$6-_0l@goajVYgPcB0(4UpGaJjQ zwk%M5YO&a8u^5J9Rq`M;SMGj0&VbQP%Pnw!KiO!l z;yGC6#mq)w0j$DrD1L9YJ7H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wM(HI$Z?3b=1^S7`l6oC~`<@6FD>H)vPaw*?_Ijq)rNOWiQV zTGtySBhR;#y{BX_v&4MnnAvowe|E!@8wIWsHCiK4ZlExpQ1If_*rZvh3Fk7yXmVki;+EY2D2ZnrnAXlMt06exvSjsI3Ro26 zc|8S6lC1#Y3HYLI+$?k8fGb=80D=X9F91m5ERMo2#Y4a53i9CU^h-d4zk>C|h($07*qoM6N<$f=`8z4gdfE diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_copper.png deleted file mode 100644 index e91bd7744a1a2b55c1e735484e0c0d6a82c0496d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmV-t1DO1YP)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wx`lgeB#L z!Rwr%lSB~3$5g_L8Ow?L_^oqI*NDX%r|t>DDnP&Fd?z<0vftY zdR=%VjPK-5wWtyw#x8%uXs4z@6L3YVVp6A8q%f&|)vc=n{bohQ zYV965wnffjLt>lU3z&Ob$^wOP1&p3X6!<&^xFVm3Qpg$HB?}}ubDzaaLzpGzfGgak z&jRj}CiTv#N(%ioC*cbCVr+DlF>t_T7mxtKCiaLE5X71NzE(ow&S_T=2Un**(D~t7 zSqRzjCFv%C$I`2pSOaUeVTYv9(CVmU?iYZkAe|pq_iUWGZ#)Hxr!AH?0y-XpHCxeS z=^cz`e@&IO7-E8>9#X$mVN0@*0@e!ogBUo|b>c!C)2}w-e7f@KqFvpyQR)V+&~;LN xkB0+gk<>;`VU0(;PumDCKcu@SoBsPte*j`9-!_btKe_+_002ovPDHLkV1f*Cor3@X diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_gold.png deleted file mode 100644 index 64fa024451faf37ab239872513f7e5a0ad98f3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 zcmV-M1G)T(P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wUaw&BvgimBq6Z3 z-g@sR`i1_kFDU3Gh=PK$mw`|i6{kWHsZp~!%iZzJr3H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wm+n6_wy+59kwn zSp*S86j=mn<~Oj1aX9B(oCSl9d#(L%R8`d=BcdphzVCUJBuVUh9LJ*gd_K~3ofu>6 zU2SGQpUZByleTRg83&5c$>Z^m)oNw$`~67e7Xj%*K0@O8zf5LN!pq%HV#@l1tn0IFTUUJu90ffMq@`C%OCiutPn;c z63u-amu0zJ+LUj%n;RdE#wle@9N1=zqV0A&86!>+@bpLQmmA}iC@fM4%_T-(^Z9J={ut5PMXKvs c{`*UR0p%Lqwo-hyVgLXD07*qoM6N<$fH_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1w?dXJWq}I^f6r z?KnkcPSapIMc``R3m9D1)hFXySHSlJn$BLy^L)+^qp{0{;gD9VPfF`)q$vx&-0ybO zj-V!L)u~6X8u!q`)Kh?~mDCJEmv#V@=P}tPHafb)9Oh&^q#AWhfo zkQEwQ!I?$@EDlJc;Z4KFINmS;#V;+kHu6Sd8Mg77vMjk8&ra307-E9s7AYExd9&JK z1?={ES2=Ln+a diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_sturdy.png deleted file mode 100644 index bac7d08ef2ff52dc33dba64a535eef5d484159e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmV-(1C0EMP)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wXMTizYuC#t6;1KFP0&? z=T1&W#T#M8`ZKNf@Oh#oQrxIlyuM83eOE@p%0(L9jqu-J`V&45;1xOjS*!p6002ov JPDHLkV1o9kncV;Y diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_titanium.png deleted file mode 100644 index e40244736453570d9c6d15737cf320741b277cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmV-Q1GW5#P)H_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1w{~gs|+)naeqYF&w_61T%<|IN_ruEIwP7Maq&Sp*W67 z2$9DWKGA44=y@=pD2jA&8EBfOKHqLPIvn=od0qZ~8;?m`FIU=Z-ZRH%C0I&V2TrF` zoj`SiBEX7v+acGL?CkfSbb?ODrO9MWj?*UTNecWx`?_79R;wlL_XjfLB%k|yzEIte z*tTs-i^|Ht1#^-;LS(HV2vzEaAj}Lv*=+lPF~ExB@styorsVsf4vL~L4#Eg{qivN4 zK45@l6%YWz*6U>v5b@n^x79>q=CUgA18dSR1`hr*p(>)9zRZ?IN{>0%Za=hqAR1gb zEvK3QngSGty^4%TiZ1XjORQw%k+2M?f<>yE>Z&d=$OJ|&QV@jM{)@W=iojN@dFKO$ zRY)`Wev%RQr_+&oy~m1-iZ@_|VHjHP`Fy4&QrxI67K=H5mt_Q&7ilzlrT_lY-zo^< UrrZGeCIA2c07*qoM6N<$f{rSUMgRZ+ diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_tungsten.png deleted file mode 100644 index c85bdc129ee3e3935df71692c271c7ca9ee8a9f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 751 zcmVH_m#Kqge zf526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn&37O?kvB}Yas*7vbK>JMZDw{(t9hcD z2#qw;rW>w3nHWp*?|Q!>r0R8_>h=GkS|MpE$5RV~mn-v^!WXXv)Dr!->rln>?Ps@{MMdkiG zPd76-5Oj~kpz6W*U%H`Y3qCh}|Kq^-KM$ee9?qIR&ek3MTdI&9&Sc>E7#e1wmqD_;N)e!=m?d7gccir@j_G!aH4j%(c-Ko*LMqPU%oVie%tj+kTA!_XB3 z81e)>_%vcF_74f}^Nm~3K$!IeYPM|?#|QCgjEIATtJyKy$K-f_7}NK?H<8{@#V`!I hw`0^jKj(ix=@*{l)mY)q1o!{|002ovPDHLkV1kbCU!DK} From ac7f1865289078e0ba7a534d48d9cba2da0d6b2d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 16:04:01 +0300 Subject: [PATCH 055/323] Oops --- src/main/java/com/hbm/world/gen/component/BunkerComponents.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java index d909fc431..3ae448a03 100644 --- a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java +++ b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java @@ -127,6 +127,7 @@ public class BunkerComponents { fillWithMetadataBlocks(world, box, 1, hpos, 4, 1, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(0)); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 3, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(2), 2, hpos, 4, box); + placeBlockAtCurrentPosition(world, ModBlocks.trapdoor_steel, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(3), 2, hpos, 6, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 7, box); fillWithMetadataBlocks(world, box, 3, hpos, 4, 3, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(1)); From 533dfd6dedfe52059384f48c951c404c94e356c6 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 16:08:38 +0300 Subject: [PATCH 056/323] Fix localization --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 43df8e497..8e468434f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -5689,7 +5689,7 @@ tile.ladder_steel.name=Стальная лестница tile.ladder_sturdy.name=Прочная деревянная лестница tile.ladder_titanium.name=Титановая лестница tile.ladder_tungsten.name=Вольфрамовая лестница -tile.trapdoor_steel.name=Стальный люк +tile.trapdoor_steel.name=Стальной люк tile.lamp_demon.name=Лампа из заряда-демона tile.lamp_tritium_blue_off.name=Синяя тритиевая лампа tile.lamp_tritium_blue_on.name=Синяя тритиевая лампа From c08a90553a8ce91ff6ba0534057ce949d84a67e9 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 30 Jun 2025 16:30:59 +0200 Subject: [PATCH 057/323] FLESH --- changelog | 6 + gradle.properties | 2 +- .../com/hbm/crafting/ConsumableRecipes.java | 10 +- .../java/com/hbm/crafting/ToolRecipes.java | 5 +- .../entity/logic/EntityNukeExplosionMK5.java | 13 +- .../com/hbm/explosion/ExplosionFleija.java | 37 ++-- .../java/com/hbm/handler/HTTPHandler.java | 17 +- .../gui/LoadingScreenRendererNT.java | 189 ++++++++++++++++++ .../inventory/recipes/PedestalRecipes.java | 4 +- src/main/java/com/hbm/items/ItemEnums.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/tool/ItemRangefinder.java | 47 +++++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 3 +- .../com/hbm/main/ModEventHandlerClient.java | 10 +- src/main/java/com/hbm/main/ServerProxy.java | 3 +- src/main/java/com/hbm/util/Vec3NT.java | 14 ++ src/main/resources/META-INF/HBM_at.cfg | 2 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/items/ingot_metal.scrap.png | Bin 0 -> 627 bytes .../hbm/textures/items/ingot_metal_sheet.png | Bin 6720 -> 7567 bytes .../assets/hbm/textures/items/rangefinder.png | Bin 0 -> 280 bytes 23 files changed, 320 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java create mode 100644 src/main/java/com/hbm/items/tool/ItemRangefinder.java create mode 100644 src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png create mode 100644 src/main/resources/assets/hbm/textures/items/rangefinder.png diff --git a/changelog b/changelog index 1e3e818a7..bb000ef7e 100644 --- a/changelog +++ b/changelog @@ -14,6 +14,9 @@ * This means that a chemical factory can make hydrogen peroxide, sulfuric acid and nitric acid, and the only fluid input needed is water * Paintable exhaust pipe * Full block exhaust pipe that behaves like paintable cables and ducts +* Rangefinder + * A simple tool for checking the distance to a block + * Is now used as the base ingredient for long range target designatory, artillery remotes and airstrike designators ## Changed * Updated chinese and ukrainian localizations @@ -44,6 +47,8 @@ * Open doors can now be interacted through * Area abilities on tools now drop all mined blocks in the center * Tools with AoE now come with the new "flat AoE" ability, which is the same but the area is only 1 block tall +* Atomic airstrike now requires a control unit +* Parallelized explosions have been temporarily disabled, regardless of config option, explosions will use the previous system ## Fixed * Chemical plant ports. For real this time. @@ -62,3 +67,4 @@ * Replaced paintabble cables in the lighthouse with regular ones, fixing an issue where the paint would ID shift * Fixed light blocks being considered solid for NPC pathfinding * Fixed issue regarding locked slots when using crates +* Fixed MK3 explosions crashing when spawned with invalid size or when not being deserialized correctly diff --git a/gradle.properties b/gradle.properties index 17c61bd4b..da72d22ff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5357 +mod_build_number=5377 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index a64f9759c..8d867f56e 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -27,11 +27,11 @@ public class ConsumableRecipes { public static void register() { //Airstikes - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TR", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.detonator_laser }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TRC", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.rangefinder, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CONTROLLER) }); //Food CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_waffle, 1), new Object[] { "WEW", "MPM", "WEW", 'W', Items.wheat, 'E', Items.egg, 'M', Items.milk_bucket, 'P', ModItems.man_core }); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 26a04b5fe..39c00cde5 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -112,10 +112,11 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ullapool_caber, 1), new Object[] { "ITI", " S ", " S ", 'I', IRON.plate(), 'T', Blocks.tnt, 'S', KEY_STICK }); //Utility + CraftingManager.addRecipeAuto(new ItemStack(ModItems.rangefinder, 1), new Object[] { "GRC", " S", 'G', KEY_ANYPANE, 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'S' ,STEEL.plate() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', IRON.plate(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', Items.redstone, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', ModItems.designator, 'I', STEEL.ingot() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { ModItems.rangefinder, ModItems.designator, ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_manual, 1), new Object[] { " A", "#C#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', PB.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'C', ModItems.designator }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { "M", "C", "P", 'M', ModItems.magnetron, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'P', ANY_PLASTIC.ingot() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.linker, 1), new Object[] { "I I", "ICI", "GGG", 'I', IRON.plate(), 'G', GOLD.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.oil_detector, 1), new Object[] { "W I", "WCI", "PPP", 'W', GOLD.wireFine(), 'I', CU.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', STEEL.plate528() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.turret_chip, 1), new Object[] { "WWW", "CPC", "WWW", 'W', GOLD.wireFine(), 'P', ANY_PLASTIC.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), }); diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index dac30b1db..06480aa21 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -10,7 +10,6 @@ import com.hbm.config.GeneralConfig; import com.hbm.entity.effect.EntityFalloutRain; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeRayBatched; -import com.hbm.explosion.ExplosionNukeRayParallelized; import com.hbm.main.MainRegistry; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -70,13 +69,11 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { if(explosion == null) { explosionStart = System.currentTimeMillis(); - if (BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { - explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, - strength, speed, length); - } else { - explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, - strength, speed, length); - } + //if(BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { + // explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, strength, speed, length); + //} else { + explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, strength, speed, length); + //} } if(!explosion.isComplete()) { diff --git a/src/main/java/com/hbm/explosion/ExplosionFleija.java b/src/main/java/com/hbm/explosion/ExplosionFleija.java index 5a478fe14..8c06d708a 100644 --- a/src/main/java/com/hbm/explosion/ExplosionFleija.java +++ b/src/main/java/com/hbm/explosion/ExplosionFleija.java @@ -6,8 +6,8 @@ import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ExplosionFleija -{ +public class ExplosionFleija { + public int posX; public int posY; public int posZ; @@ -23,7 +23,7 @@ public class ExplosionFleija private int element; public float explosionCoefficient = 1.0F; public float explosionCoefficient2 = 1.0F; - + public void saveToNbt(NBTTagCompound nbt, String name) { nbt.setInteger(name + "posX", posX); nbt.setInteger(name + "posY", posY); @@ -40,7 +40,7 @@ public class ExplosionFleija nbt.setFloat(name + "explosionCoefficient", explosionCoefficient); nbt.setFloat(name + "explosionCoefficient2", explosionCoefficient2); } - + public void readFromNbt(NBTTagCompound nbt, String name) { posX = nbt.getInteger(name + "posX"); posY = nbt.getInteger(name + "posY"); @@ -57,29 +57,28 @@ public class ExplosionFleija explosionCoefficient = nbt.getFloat(name + "explosionCoefficient"); explosionCoefficient2 = nbt.getFloat(name + "explosionCoefficient2"); } - - public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) - { + + public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) { this.posX = x; this.posY = y; this.posZ = z; - + this.worldObj = world; - + this.radius = rad; this.radius2 = this.radius * this.radius; this.explosionCoefficient = coefficient; this.explosionCoefficient2 = coefficient2; - + this.nlimit = this.radius2 * 4; } - - public boolean update() - { + + public boolean update() { breakColumn(this.lastposX, this.lastposZ); this.shell = (int) Math.floor((Math.sqrt(n) + 1) / 2); int shell2 = this.shell * 2; + if(shell2 == 0) return true; // end explosion if the shell size is 0 to prevent division by zero crash this.leg = (int) Math.floor((this.n - (shell2 - 1) * (shell2 - 1)) / shell2); this.element = (this.n - (shell2 - 1) * (shell2 - 1)) - shell2 * this.leg - this.shell + 1; this.lastposX = this.leg == 0 ? this.shell : this.leg == 1 ? -this.element : this.leg == 2 ? -this.shell : this.element; @@ -88,15 +87,13 @@ public class ExplosionFleija return this.n > this.nlimit; } - private void breakColumn(int x, int z) - { + private void breakColumn(int x, int z) { int dist = this.radius2 - (x * x + z * z); - if (dist > 0) - { + if(dist > 0) { dist = (int) Math.sqrt(dist); - for (int y = (int)(dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) - { - if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX+x, this.posY+y, this.posZ+z) instanceof DecoBlockAlt))this.worldObj.setBlock(this.posX+x, this.posY+y, this.posZ+z, Blocks.air); + for(int y = (int) (dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) { + if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX + x, this.posY + y, this.posZ + z) instanceof DecoBlockAlt)) + this.worldObj.setBlock(this.posX + x, this.posY + y, this.posZ + z, Blocks.air); } } } diff --git a/src/main/java/com/hbm/handler/HTTPHandler.java b/src/main/java/com/hbm/handler/HTTPHandler.java index 4efc054f4..3af10a74b 100644 --- a/src/main/java/com/hbm/handler/HTTPHandler.java +++ b/src/main/java/com/hbm/handler/HTTPHandler.java @@ -13,6 +13,7 @@ import com.hbm.main.MainRegistry; public class HTTPHandler { public static List capsule = new ArrayList(); + public static List tipOfTheDay = new ArrayList(); public static boolean newVersion = false; public static String versionNumber = ""; @@ -25,6 +26,7 @@ public class HTTPHandler { try { loadVersion(); loadSoyuz(); + loadTips(); } catch(IOException e) { MainRegistry.logger.warn("Version checker failed!"); } @@ -69,12 +71,17 @@ public class HTTPHandler { BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); String line; - - while((line = in.readLine()) != null) { - capsule.add(line); - } - + while((line = in.readLine()) != null) capsule.add(line); in.close(); } + private static void loadTips() throws IOException { + + URL github = new URL("https://gist.githubusercontent.com/HbmMods/a03c66ba160184e12f43de826b30c096/raw/tip_of_the_day"); + BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); + + String line; + while((line = in.readLine()) != null) tipOfTheDay.add(line); + in.close(); + } } diff --git a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java new file mode 100644 index 000000000..d9dc5e676 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java @@ -0,0 +1,189 @@ +package com.hbm.inventory.gui; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.hbm.handler.HTTPHandler; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.LoadingScreenRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MinecraftError; + +public class LoadingScreenRendererNT extends LoadingScreenRenderer { + + private String message = ""; + private Minecraft mc; + private String currentlyDisplayedText = ""; + private long time = Minecraft.getSystemTime(); + private boolean doesProgress; + private ScaledResolution resolution; + private Framebuffer frameBuffer; + public String tipOfTheDay = "Tip of the day: " + chooseTip(); + + public LoadingScreenRendererNT(Minecraft mc) { + super(mc); + this.mc = mc; + this.resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + this.frameBuffer = new Framebuffer(mc.displayWidth, mc.displayHeight, false); + this.frameBuffer.setFramebufferFilter(9728); + } + + private String chooseTip() { + if(HTTPHandler.tipOfTheDay.isEmpty()) return "null"; + return HTTPHandler.tipOfTheDay.get(new Random().nextInt(HTTPHandler.tipOfTheDay.size())); + } + + @Override + public void resetProgressAndMessage(String message) { + this.doesProgress = false; + this.func_73722_d(message); + } + + @Override + public void displayProgressMessage(String message) { + this.doesProgress = true; + this.func_73722_d(message); + } + + @Override + public void func_73722_d(String message) { + this.currentlyDisplayedText = message; + + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + + if(OpenGlHelper.isFramebufferEnabled()) { + int scale = this.resolution.getScaleFactor(); + GL11.glOrtho(0.0D, (this.resolution.getScaledWidth() * scale), (this.resolution.getScaledHeight() * scale), 0.0D, 100.0D, 300.0D); + } else { + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + } + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + } + } + + @Override + public void resetProgresAndWorkingMessage(String message) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + this.time = 0L; + this.message = message; + this.setLoadingProgress(-1); + this.time = 0L; + } + } + + @Override + public void setLoadingProgress(int p_73718_1_) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + long time = Minecraft.getSystemTime(); + + if(time - this.time >= 100L) { + this.time = time; + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + int scaleFactor = scaledresolution.getScaleFactor(); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferClear(); + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + } + + this.frameBuffer.bindFramebuffer(false); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + + if(!OpenGlHelper.isFramebufferEnabled()) { + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + } + + if(!FMLClientHandler.instance().handleLoadingScreen(scaledresolution)) { + Tessellator tessellator = Tessellator.instance; + this.mc.getTextureManager().bindTexture(Gui.optionsBackground); + float f = 32.0F; + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(4210752); + tessellator.addVertexWithUV(0.0D, height, 0.0D, 0.0D, height / f); + tessellator.addVertexWithUV(width, height, 0.0D, width / f, height / f); + tessellator.addVertexWithUV(width, 0.0D, 0.0D, width / f, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + tessellator.draw(); + + if(p_73718_1_ >= 0) { + byte b0 = 100; + byte b1 = 2; + int j1 = width / 2 - b0 / 2; + int k1 = height / 2 + 16; + GL11.glDisable(GL11.GL_TEXTURE_2D); + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(8421504); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1, 0.0D); + tessellator.setColorOpaque_I(8454016); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, (k1 + b1), 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1 + b1, 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1, 0.0D); + tessellator.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (width - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, height / 2 - 4 - 16, 16777215); + this.mc.fontRenderer.drawStringWithShadow(this.message, (width - this.mc.fontRenderer.getStringWidth(this.message)) / 2, height / 2 - 4 + 8, 16777215); + + String[] frags = this.tipOfTheDay.split("$"); + for(int i = 0; i < frags.length; i++) { + String frag = frags[i]; + this.mc.fontRenderer.drawStringWithShadow(EnumChatFormatting.YELLOW + frag, (width - this.mc.fontRenderer.getStringWidth(frag)) / 2, height / 2 - 4 - 60 + i * 10, 16777215); + } + } + this.frameBuffer.unbindFramebuffer(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferRender(width * scaleFactor, height * scaleFactor); + } + + this.mc.func_147120_f(); + + try { Thread.yield(); } catch(Exception exception) { } + } + } + } + + @Override public void func_146586_a() { } +} diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index 8554afafc..76d22d7c8 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -62,9 +62,9 @@ public class PedestalRecipes extends SerializableRecipe { .extra(PedestalExtraCondition.SUN)); register(new PedestalRecipe(new ItemStack(ModItems.gun_autoshotgun_sexy), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16), + new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.wild_p), new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.card_qos), new ComparableStack(ModItems.gun_autoshotgun), new ComparableStack(ModItems.card_aos), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16))); + new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 16), new ComparableStack(ModItems.bolt_spike, 16))); register(new PedestalRecipe(new ItemStack(ModItems.gun_minigun_lacunae), null, new ComparableStack(ModItems.powder_magic, 4), null, diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 18878469c..d92c7840b 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -87,6 +87,6 @@ public class ItemEnums { } public static enum EnumIngotMetal { - INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR + SCRAP, INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d7b7fb410..7387de265 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1169,6 +1169,7 @@ public class ModItems { public static Item pellet_buckshot; public static Item pellet_charged; + public static Item rangefinder; public static Item designator; public static Item designator_range; public static Item designator_manual; @@ -3553,6 +3554,7 @@ public class ModItems { pellet_buckshot = new Item().setUnlocalizedName("pellet_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_lead"); pellet_charged = new Item().setUnlocalizedName("pellet_charged").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_charged"); + rangefinder = new ItemRangefinder().setUnlocalizedName("rangefinder").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":rangefinder"); designator = new ItemDesingator().setUnlocalizedName("designator").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator"); designator_range = new ItemDesingatorRange().setUnlocalizedName("designator_range").setFull3D().setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_range_alt"); designator_manual = new ItemDesingatorManual().setUnlocalizedName("designator_manual").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_manual"); @@ -6136,6 +6138,7 @@ public class ModItems { GameRegistry.registerItem(spawn_duck, spawn_duck.getUnlocalizedName()); //Computer Tools + GameRegistry.registerItem(rangefinder, rangefinder.getUnlocalizedName()); GameRegistry.registerItem(designator, designator.getUnlocalizedName()); GameRegistry.registerItem(designator_range, designator_range.getUnlocalizedName()); GameRegistry.registerItem(designator_manual, designator_manual.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/tool/ItemRangefinder.java b/src/main/java/com/hbm/items/tool/ItemRangefinder.java new file mode 100644 index 000000000..9c1d5179f --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemRangefinder.java @@ -0,0 +1,47 @@ +package com.hbm.items.tool; + +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.PlayerInformPacket; +import com.hbm.util.ChatBuilder; +import com.hbm.util.Vec3NT; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ItemRangefinder extends Item { + + public static final int META_POLARIZED = 1; + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + + Vec3NT start = new Vec3NT(player.posX, player.posY + player.eyeHeight, player.posZ); + Vec3NT startOriginal = new Vec3NT(start); // why the fuck + Vec3NT end = new Vec3NT(start).add(new Vec3NT(player.getLookVec()).multiply(300)); + + MovingObjectPosition mop = world.func_147447_a(start, end, false, true, false); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + double dist = startOriginal.distanceTo(mop.hitVec); + String msg = ((int)(dist * 10D)) / 10D + "m"; + if(stack.getItemDamage() == META_POLARIZED) msg = EnumChatFormatting.LIGHT_PURPLE + msg + EnumChatFormatting.RESET; + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(msg).flush(), MainRegistry.proxy.ID_DETONATOR, 5000), (EntityPlayerMP) player); + } + + return stack; + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + String name = super.getItemStackDisplayName(stack); + if(stack.getItemDamage() == META_POLARIZED) name = EnumChatFormatting.LIGHT_PURPLE + name + EnumChatFormatting.RESET; + return name; + } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 27fe4f45d..f56883283 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5357)"; + public static final String VERSION = "1.0.27 BETA (5377)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 86a280f16..846699693 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -313,8 +313,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.detonator, 1), new Object[] { "C", "S", 'S', STEEL.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), }); addShapelessAuto(new ItemStack(ModItems.detonator_multi, 1), new Object[] { ModItems.detonator, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', DIAMOND.gem(), 'I', STEEL.ingot() }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', EMERALD.gem(), 'I', STEEL.ingot() }); + addShapelessAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), RUBBER.ingot(), GOLD.wireDense() }); addShapelessAuto(new ItemStack(ModItems.detonator_deadman, 1), new Object[] { ModItems.detonator, ModItems.defuser, ModItems.ducttape }); addRecipeAuto(new ItemStack(ModItems.detonator_de, 1), new Object[] { "T", "D", "T", 'T', Blocks.tnt, 'D', ModItems.detonator_deadman }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index e9e40dfe0..aea94c19b 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -22,6 +22,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; +import com.hbm.inventory.gui.LoadingScreenRendererNT; import com.hbm.items.ItemCustomLore; import com.hbm.items.ModItems; import com.hbm.items.armor.*; @@ -1032,10 +1033,15 @@ public class ModEventHandlerClient { @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTickLast(ClientTickEvent event) { + + Minecraft mc = Minecraft.getMinecraft(); + if(!(mc.loadingScreen instanceof LoadingScreenRendererNT)) { + mc.loadingScreen = new LoadingScreenRendererNT(mc); + } if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { - World world = Minecraft.getMinecraft().theWorld; + World world = mc.theWorld; if(world == null) return; IRenderHandler sky = world.provider.getSkyRenderer(); @@ -1059,7 +1065,7 @@ public class ModEventHandlerClient { } } - EntityPlayer player = Minecraft.getMinecraft().thePlayer; + EntityPlayer player = mc.thePlayer; long millis = Clock.get_ms(); if(lastStarCheck + 200 < millis) { diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 7ec6eaa23..271a21759 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -32,8 +32,7 @@ public class ServerProxy { public static final int ID_FLUID_ID = 9; public static final int ID_FAN_MODE = 10; public static final int ID_TOOLABILITY = 11; - public static final int ID_GUN_MODE = 12; - public static final int ID_GAS_HAZARD = 13; + public static final int ID_GAS_HAZARD = 12; public ITranslate getI18n() { return I18N; } diff --git a/src/main/java/com/hbm/util/Vec3NT.java b/src/main/java/com/hbm/util/Vec3NT.java index 0cb8121a7..1e6cb1294 100644 --- a/src/main/java/com/hbm/util/Vec3NT.java +++ b/src/main/java/com/hbm/util/Vec3NT.java @@ -29,6 +29,13 @@ public class Vec3NT extends Vec3 { return this; } + public Vec3NT add(Vec3 vec) { + this.xCoord += vec.xCoord; + this.yCoord += vec.yCoord; + this.zCoord += vec.zCoord; + return this; + } + public Vec3NT multiply(double m) { this.xCoord *= m; this.yCoord *= m; @@ -43,6 +50,13 @@ public class Vec3NT extends Vec3 { return this; } + public double distanceTo(double x, double y, double z) { + double dX = x - this.xCoord; + double dY = y - this.yCoord; + double dZ = z - this.zCoord; + return Math.sqrt(dX * dX + dY * dY + dZ * dZ); + } + @Override public Vec3NT setComponents(double x, double y, double z) { this.xCoord = x; diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 81514dff3..859de4618 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -55,3 +55,5 @@ public net.minecraft.client.gui.GuiIngame field_92016_l # hi # Block public net.minecraft.block.Block func_149642_a(Lnet/minecraft/world/World;IIILnet/minecraft/item/ItemStack;)V # dropBlockAsItem +# Minecraft +public net.minecraft.client.Minecraft field_71425_J # running diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 33050befc..c76f24002 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3039,6 +3039,7 @@ item.radx.name=Rad-X item.rag.name=Stoff item.rag_damp.name=Nasser Stoff item.rag_piss.name=Pisslappen +item.rangefinder.name=Entfernungsmessgerät item.rbmk_fuel_balefire.name=Balefire-RBMK-Kernbrennstoff item.rbmk_fuel_balefire_gold.name=Flammgold-RBMK-Kernbrennstoff item.rbmk_fuel_drx.name=§cDigamma-RBMK-Kernbrennstoff diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 72c0ee93b..d432682b1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3992,6 +3992,7 @@ item.radx.desc=Increases radiation resistance by 0.2 (37%%) for 3 minutes item.rag.name=Cloth item.rag_damp.name=Damp Cloth item.rag_piss.name=Piss-Soaked Rag +item.rangefinder.name=Rangefinder item.rbmk_fuel_balefire.name=Balefire RBMK Fuel Rod item.rbmk_fuel_balefire_gold.name=Flashgold RBMK Fuel Rod item.rbmk_fuel_drx.name=§cDigamma RBMK Fuel Rod§r diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png b/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png new file mode 100644 index 0000000000000000000000000000000000000000..a0074ffc817769a67e18fe737956febd3af9d3f9 GIT binary patch literal 627 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 literal 6720 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 UQxkN@{1O7FC}}>gQM3sA5Bd7_$p8QV diff --git a/src/main/resources/assets/hbm/textures/items/rangefinder.png b/src/main/resources/assets/hbm/textures/items/rangefinder.png new file mode 100644 index 0000000000000000000000000000000000000000..d7539ee67523e75a20db5bffafd9f8fb9002f548 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf=Y>Cgq|0r<(8=*Zh8+IasxnH Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 058/323] copy tool support and working directional offsets --- .../hbm/blocks/generic/BlockWandSpawner.java | 11 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 4 +++ .../world/gen/util/DungeonSpawnerActions.java | 33 +++++++++++++++++- .../hbm/textures/blocks/wand_spawner_top.png | Bin 740 -> 743 bytes 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index fdfca7689..0508002d7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -33,6 +33,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; @@ -78,9 +79,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + ForgeDirection dir = ForgeDirection.UNKNOWN; + switch(i){ + case 0: dir = ForgeDirection.SOUTH;break; + case 1: dir = ForgeDirection.WEST; break; + case 2: dir = ForgeDirection.NORTH;break; + case 3: dir = ForgeDirection.EAST; break; + } TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = i; + ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } @Override @@ -193,6 +201,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.direction = ForgeDirection.getOrientation(placedRotation); } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index ffbb14239..41fa907b5 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -20,6 +20,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,6 +45,7 @@ public class DungeonSpawner extends BlockContainer { public Function condition; public Consumer action; + public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override public void updateEntity() { @@ -74,6 +76,7 @@ public class DungeonSpawner extends BlockContainer { nbt.setInteger("phase", phase); nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); + nbt.setInteger("direction", direction.ordinal()); } @Override @@ -81,6 +84,7 @@ public class DungeonSpawner extends BlockContainer { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 120ea00e8..1e32d9dc7 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -5,6 +5,7 @@ import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; @@ -12,6 +13,7 @@ import com.hbm.main.ModEventHandler; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -21,7 +23,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.HashMap; @@ -140,7 +145,7 @@ public class DungeonSpawnerActions { if(tile.phase == 2){ world.setBlock(x,y,z, ModBlocks.crate_steel); - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); world.spawnEntityInWorld(blitz); TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); @@ -148,6 +153,31 @@ public class DungeonSpawnerActions { } }; + public static Consumer MISSILE_STRIKE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase != 1) return; + + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); + + ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); + + EntityMissileTier2.EntityMissileStrong missile = + new EntityMissileTier2.EntityMissileStrong( + world, + x + tile.direction.offsetX * 300, + 200, + z + tile.direction.offsetZ * 300, + x + parallel.offsetX * 30 + tile.direction.offsetX * 30, + z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); + WorldUtil.loadAndSpawnEntityInWorld(missile); + + world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -158,6 +188,7 @@ public class DungeonSpawnerActions { actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); + actions.put("MISSILE_STRIKE", MISSILE_STRIKE); } diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png index 4788b84883581058c6fdf5525b3239d0e888f352..65e3106a96f970891be895a960ccfb53a60b3915 100644 GIT binary patch delta 87 zcmaFD`kZyc3?_doPZ!4!iOb0e2?8uk3P&|K*q9Fw delta 84 zcmaFP`h<1E3??6QPZ!4!iOb0e2?8uk3P&|K*q9bP0l+XkK_SqL` From 25a2172c6b76cec5b9a178d86bc2450f722548dc Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 1 Jul 2025 17:44:52 +1000 Subject: [PATCH 059/323] switch to LinkedHashMap for 23x performance improvement! --- .../java/com/hbm/uninos/UniNodespace.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hbm/uninos/UniNodespace.java b/src/main/java/com/hbm/uninos/UniNodespace.java index dec2b96dc..e9aaebb71 100644 --- a/src/main/java/com/hbm/uninos/UniNodespace.java +++ b/src/main/java/com/hbm/uninos/UniNodespace.java @@ -2,6 +2,7 @@ package com.hbm.uninos; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Set; import java.util.Map.Entry; @@ -21,16 +22,16 @@ import net.minecraft.world.World; * @author hbm */ public class UniNodespace { - + public static HashMap worlds = new HashMap(); public static Set activeNodeNets = new HashSet(); - + public static GenNode getNode(World world, int x, int y, int z, INetworkProvider type) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld != null) return nodeWorld.nodes.get(new Pair(new BlockPos(x, y, z), type)); return null; } - + public static void createNode(World world, GenNode node) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld == null) { @@ -39,21 +40,21 @@ public class UniNodespace { } nodeWorld.pushNode(node); } - + public static void destroyNode(World world, int x, int y, int z, INetworkProvider type) { GenNode node = getNode(world, x, y, z, type); if(node != null) { worlds.get(world).popNode(node); } } - + public static void updateNodespace() { - + for(World world : MinecraftServer.getServer().worldServers) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld == null) continue; - + for(Entry, GenNode> entry : nodeWorld.nodes.entrySet()) { GenNode node = entry.getValue(); INetworkProvider provider = entry.getKey().getValue(); @@ -63,19 +64,19 @@ public class UniNodespace { } } } - + updateNetworks(); } - + private static void updateNetworks() { for(NodeNet net : activeNodeNets) net.resetTrackers(); //reset has to be done before everything else for(NodeNet net : activeNodeNets) net.update(); } - + /** Goes over each connection point of the given node, tries to find neighbor nodes and to join networks with them */ private static void checkNodeConnection(World world, GenNode node, INetworkProvider provider) { - + for(DirPos con : node.connections) { GenNode conNode = getNode(world, con.getX(), con.getY(), con.getZ(), provider); // get whatever neighbor node intersects with that connection if(conNode != null) { // if there is a node at that place @@ -85,10 +86,10 @@ public class UniNodespace { } } } - + if(node.net == null || !node.net.isValid()) provider.provideNetwork().joinLink(node); } - + /** Checks if the node can be connected to given the DirPos, skipSideCheck will ignore the DirPos' direction value */ public static boolean checkConnection(GenNode connectsTo, DirPos connectFrom, boolean skipSideCheck) { for(DirPos revCon : connectsTo.connections) { @@ -98,10 +99,10 @@ public class UniNodespace { } return false; } - + /** Links two nodes with different or potentially no networks */ private static void connectToNode(GenNode origin, GenNode connection) { - + if(origin.hasValidNet() && connection.hasValidNet()) { // both nodes have nets, but the nets are different (previous assumption), join networks if(origin.net.links.size() > connection.net.links.size()) { origin.net.joinNetworks(connection.net); @@ -114,18 +115,18 @@ public class UniNodespace { origin.net.joinLink(connection); } } - + public static class UniNodeWorld { - - public HashMap, GenNode> nodes = new HashMap(); - + + public HashMap, GenNode> nodes = new LinkedHashMap<>(); + /** Adds a node at all its positions to the nodespace */ public void pushNode(GenNode node) { for(BlockPos pos : node.positions) { nodes.put(new Pair(pos, node.networkProvider), node); } } - + /** Removes the specified node from all positions from nodespace */ public void popNode(GenNode node) { if(node.net != null) node.net.destroy(); From 58da6f154e8e3c358156fa61f4cd6d2f29cde539 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 1 Jul 2025 17:46:33 +1000 Subject: [PATCH 060/323] move door to faster network serialization, remove now unused door sync packet --- .../com/hbm/interfaces/IAnimatedDoor.java | 6 - src/main/java/com/hbm/interfaces/IDoor.java | 24 --- .../java/com/hbm/packet/PacketDispatcher.java | 2 - .../toclient/TEDoorAnimationPacket.java | 77 ------- .../hbm/tileentity/TileEntityDoorGeneric.java | 197 ++++++++---------- 5 files changed, 87 insertions(+), 219 deletions(-) delete mode 100644 src/main/java/com/hbm/interfaces/IAnimatedDoor.java delete mode 100644 src/main/java/com/hbm/interfaces/IDoor.java delete mode 100644 src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java diff --git a/src/main/java/com/hbm/interfaces/IAnimatedDoor.java b/src/main/java/com/hbm/interfaces/IAnimatedDoor.java deleted file mode 100644 index d097f6fe2..000000000 --- a/src/main/java/com/hbm/interfaces/IAnimatedDoor.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.hbm.interfaces; - -public interface IAnimatedDoor extends IDoor { - - public void handleNewState(byte state); -} diff --git a/src/main/java/com/hbm/interfaces/IDoor.java b/src/main/java/com/hbm/interfaces/IDoor.java deleted file mode 100644 index a0c539a28..000000000 --- a/src/main/java/com/hbm/interfaces/IDoor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.hbm.interfaces; - -public interface IDoor { - - void open(); - void close(); - DoorState getState(); - void toggle(); - default boolean setTexture(String tex) { - return false; - } - default void setTextureState(byte tex) { } - - default boolean setSkinIndex(byte skinIndex) { - return false; - } - - enum DoorState { - CLOSED, - OPEN, - CLOSING, - OPENING - } -} diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 21dd1fd2b..165664236 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -53,8 +53,6 @@ public class PacketDispatcher { wrapper.registerMessage(NBTControlPacket.Handler.class, NBTControlPacket.class, i++, Side.SERVER); //Packet to send for anvil recipes to be crafted wrapper.registerMessage(AnvilCraftPacket.Handler.class, AnvilCraftPacket.class, i++, Side.SERVER); - //Sends a funi text to display like a music disc announcement - wrapper.registerMessage(TEDoorAnimationPacket.Handler.class, TEDoorAnimationPacket.class, i++, Side.CLIENT); //Does ExVNT standard player knockback wrapper.registerMessage(ExplosionKnockbackPacket.Handler.class, ExplosionKnockbackPacket.class, i++, Side.CLIENT); //just go fuck yourself already diff --git a/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java deleted file mode 100644 index 3511f0d07..000000000 --- a/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.hbm.packet.toclient; - -import com.hbm.interfaces.IAnimatedDoor; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; - -public class TEDoorAnimationPacket implements IMessage { - - public int x, y, z; - public byte state; - public byte skinIndex; - public byte texture; - - public TEDoorAnimationPacket() { - } - - public TEDoorAnimationPacket(int x, int y, int z, byte state) { - this(x, y, z, state, (byte) 0, (byte) -1); - } - - public TEDoorAnimationPacket(int x, int y, int z, byte state, byte skinIndex, byte tex) { - this.x = x; - this.y = y; - this.z = z; - this.state = state; - this.skinIndex = skinIndex; - this.texture = tex; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - state = buf.readByte(); - skinIndex = buf.readByte(); - if(buf.readableBytes() == 1){ - texture = buf.readByte(); - } - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeByte(state); - buf.writeByte(skinIndex); - if(texture != -1){ - buf.writeByte(texture); - } - } - - public static class Handler implements IMessageHandler { - - @Override - @SideOnly(Side.CLIENT) - public IMessage onMessage(TEDoorAnimationPacket m, MessageContext ctx) { - - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - if(te instanceof IAnimatedDoor){ - ((IAnimatedDoor) te).handleNewState(m.state); - ((IAnimatedDoor) te).setSkinIndex(m.skinIndex); - ((IAnimatedDoor) te).setTextureState(m.texture); - } - - return null; - } - } -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index d05ac0843..9b8751d05 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -6,25 +6,22 @@ import java.util.Set; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.generic.BlockDoorGeneric; -import com.hbm.interfaces.IAnimatedDoor; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.TEDoorAnimationPacket; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.Rotation; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAnimatedDoor { +public class TileEntityDoorGeneric extends TileEntityLockableBase { //0: closed, 1: open, 2: closing, 3: opening public byte state = 0; @@ -39,9 +36,9 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn private AudioWrapper audio; private AudioWrapper audio2; - + @Override - public void updateEntity(){ + public void updateEntity() { if(state == 3) { openTicks++; if(openTicks >= getDoorType().timeToOpen()) { @@ -55,39 +52,39 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } if(!worldObj.isRemote) { - + BlockPos pos = new BlockPos(this); - + int[][] ranges = getDoorType().getDoorOpenRanges(); ForgeDirection dir = ForgeDirection.getOrientation(getBlockMetadata() - BlockDummyable.offset); - + if(state == 3) { - + for(int i = 0; i < ranges.length; i++) { - + int[] range = ranges[i]; BlockPos startPos = new BlockPos(range[0], range[1], range[2]); float time = getDoorType().getDoorRangeOpenTime(openTicks, i); - + for(int j = 0; j < Math.abs(range[3]); j++) { - + if((float)j / (Math.abs(range[3] - 1)) > time) break; - + for(int k = 0; k < range[4]; k++) { BlockPos add = new BlockPos(0, 0, 0); - switch(range[5]){ + switch(range[5]) { case 0: add = new BlockPos(0, k, (int)Math.signum(range[3]) * j); break; case 1: add = new BlockPos(k, (int)Math.signum(range[3]) * j, 0); break; case 2: add = new BlockPos((int)Math.signum(range[3]) * j, k, 0); break; } - + Rotation r = Rotation.getBlockRotation(dir); if(dir == Library.POS_X || dir == Library.NEG_X) r = r.add(Rotation.CLOCKWISE_180); - + BlockPos finalPos = startPos.add(add).rotate(r).add(pos); - + if(finalPos.equals(pos)) { this.shouldUseBB = false; } else { @@ -96,24 +93,24 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } } - - } else if(state == 2){ - + + } else if(state == 2) { + for(int i = 0; i < ranges.length; i++) { - + int[] range = ranges[i]; BlockPos startPos = new BlockPos(range[0], range[1], range[2]); float time = getDoorType().getDoorRangeOpenTime(openTicks, i); - + for(int j = Math.abs(range[3])-1; j >= 0; j--) { - + if((float)j / (Math.abs(range[3] - 1)) < time) break; - + for(int k = 0; k < range[4]; k++) { BlockPos add = new BlockPos(0, 0, 0); - switch(range[5]){ + switch(range[5]) { case 0: add = new BlockPos(0, k, (int)Math.signum(range[3]) * j); break; case 1: add = new BlockPos(k, (int)Math.signum(range[3]) * j, 0); break; case 2: add = new BlockPos((int)Math.signum(range[3]) * j, k, 0); break; @@ -122,9 +119,9 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn Rotation r = Rotation.getBlockRotation(dir); if(dir == Library.POS_X || dir == Library.NEG_X) r = r.add(Rotation.CLOCKWISE_180); - + BlockPos finalPos = startPos.add(add).rotate(r).add(pos); - + if(finalPos.equals(pos)) { this.shouldUseBB = false; } else { @@ -140,19 +137,34 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn if(state == 2 && openTicks == 0) { state = 0; } - PacketDispatcher.wrapper.sendToAllAround(new TEDoorAnimationPacket(xCoord, yCoord, zCoord, state, skinIndex, (byte)(shouldUseBB ? 1 : 0)), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 100)); - - if(redstonePower == -1 && state == 1){ + + this.networkPackNT(100); + + if(redstonePower == -1 && state == 1) { tryToggle(-1); - } else if(redstonePower > 0 && state == 0){ + } else if(redstonePower > 0 && state == 0) { tryToggle(-1); } - if(redstonePower == -1){ + if(redstonePower == -1) { redstonePower = 0; } } } + @Override + public void serialize(ByteBuf buf) { + buf.writeByte(state); + buf.writeByte(skinIndex); + buf.writeBoolean(shouldUseBB); + } + + @Override + public void deserialize(ByteBuf buf) { + handleNewState(buf.readByte()); + setSkinIndex(buf.readByte()); + shouldUseBB = buf.readBoolean(); + } + @Override public void onChunkUnload() { if(audio != null) { @@ -164,20 +176,20 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn audio2 = null; } } - - public DoorDecl getDoorType(){ - + + public DoorDecl getDoorType() { + if(this.doorType == null && this.getBlockType() instanceof BlockDoorGeneric) this.doorType = ((BlockDoorGeneric)this.getBlockType()).type; - + return this.doorType; } - public boolean tryToggle(EntityPlayer player){ - + public boolean tryToggle(EntityPlayer player) { + if(this.isLocked() && player == null) return false; - - if(state == 0 && redstonePower > 0){ + + if(state == 0 && redstonePower > 0) { //Redstone "power locks" doors, just like minecraft iron doors return false; } @@ -194,8 +206,8 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } return false; } - - public boolean tryToggle(int passcode){ + + public boolean tryToggle(int passcode) { if(this.isLocked() && passcode != this.lock) return false; if(this.state == 0) { @@ -212,55 +224,28 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn return false; } - @Override - public void open(){ - if(state == 0) - toggle(); - } - - @Override - public void close(){ - if(state == 1) - toggle(); - } - - @Override - public DoorState getState(){ - return DoorState.values()[state]; - } - - @Override - public void toggle(){ - if(state == 0) { - state = 3; - } else if(state == 1) { - state = 2; - } - } - - @Override @SideOnly(Side.CLIENT) - public void handleNewState(byte state){ - + public void handleNewState(byte state) { + if(this.state != state) { DoorDecl doorType = getDoorType(); - if(this.state == 0 && state == 3){ // Door transitioning to open + if(this.state == 0 && state == 3) { // Door transitioning to open if(audio != null) { audio.stopSound(); audio.setKeepAlive(0); } - if(doorType.getOpenSoundLoop() != null){ + if(doorType.getOpenSoundLoop() != null) { audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(doorType.getOpenSoundStart() != null){ + if(doorType.getOpenSoundStart() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundStart(), doorType.getSoundVolume(), 1F, false); } - if(doorType.getSoundLoop2() != null){ + if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); @@ -268,21 +253,21 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } - if(this.state == 1 && state == 2){ // Door transitioning to closed + if(this.state == 1 && state == 2) { // Door transitioning to closed if(audio != null) { audio.stopSound(); } - if(doorType.getCloseSoundLoop() != null){ + if(doorType.getCloseSoundLoop() != null) { audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(doorType.getCloseSoundStart() != null){ + if(doorType.getCloseSoundStart() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundStart(), doorType.getSoundVolume(), 1F, false); } - if(doorType.getSoundLoop2() != null){ + if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); @@ -290,47 +275,39 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } - if(state == 1 || state == 0){ // Door finished any transition - if(audio != null){ + if(state == 1 || state == 0) { // Door finished any transition + if(audio != null) { audio.stopSound(); audio = null; } - if(audio2 != null){ + if(audio2 != null) { audio2.stopSound(); audio2 = null; } } - if(this.state == 3 && state == 1){ // Door finished transitioning to open - if(doorType.getOpenSoundEnd() != null){ + if(this.state == 3 && state == 1) { // Door finished transitioning to open + if(doorType.getOpenSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), doorType.getSoundVolume(), 1F, false); } } - if(this.state == 2 && state == 0){ // Door finished transitioning to closed - if(doorType.getCloseSoundEnd() != null){ + if(this.state == 2 && state == 0) { // Door finished transitioning to closed + if(doorType.getCloseSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), doorType.getSoundVolume(), 1F, false); } } - - - this.state = state; - if(state > 1) - animStartTime = System.currentTimeMillis(); - } - } - //Ah yes piggy backing on this packet - @Override - public void setTextureState(byte tex){ - shouldUseBB = tex > 0; + + this.state = state; + if(state > 1) animStartTime = System.currentTimeMillis(); + } } public int getSkinIndex() { return skinIndex; } - @Override public boolean setSkinIndex(byte skinIndex) { if(!getDoorType().hasSkins()) return false; @@ -342,12 +319,12 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } @Override - public AxisAlignedBB getRenderBoundingBox(){ + public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; } @Override - public double getMaxRenderDistanceSquared(){ + public double getMaxRenderDistanceSquared() { return 65536D; } @@ -388,14 +365,14 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } tag.setTag("activatedBlocks", activatedBlocks); } - + @Override - public void validate(){ + public void validate() { super.validate(); } - + @Override - public void invalidate(){ + public void invalidate() { super.invalidate(); if(audio != null) { audio.stopSound(); @@ -412,16 +389,16 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn BlockPos pos = new BlockPos(x, y, z); boolean powered = worldObj.isBlockIndirectlyGettingPowered(x, y, z); boolean contained = activatedBlocks.contains(pos); - if(!contained && powered){ + if(!contained && powered) { activatedBlocks.add(pos); - if(redstonePower == -1){ + if(redstonePower == -1) { redstonePower = 0; } redstonePower++; - } else if(contained && !powered){ + } else if(contained && !powered) { activatedBlocks.remove(pos); redstonePower--; - if(redstonePower == 0){ + if(redstonePower == 0) { redstonePower = -1; } } From 90ab38dc441a1deaece1a6ce8e2f3b10e45e9844 Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Tue, 1 Jul 2025 16:58:23 +0800 Subject: [PATCH 061/323] =?UTF-8?q?=E2=99=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/zh_CN.lang | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 9f5d39f26..2fa299904 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5021,7 +5021,6 @@ tile.floodlight.name=电力泛光灯 tile.fluid_duct.name=通用流体管道 tile.fluid_duct_box.name=通用流体管道(方形) tile.fluid_duct_exhaust.name=排气管 -tile.fluid_duct_paintable_block_exhaust.name=具有涂装性的排气管 tile.fluid_duct_gauge.name=流量计管 tile.fluid_duct_gauge.desc=显示每个游戏刻在管网有多少流体移动的管道$由桶或罐连接的分离网络被视为一个共享网络。 tile.fluid_duct_neo.name=通用流体管道 @@ -5155,7 +5154,6 @@ tile.ladder_steel.name=钢制梯子 tile.ladder_sturdy.name=坚固木头制梯子 tile.ladder_titanium.name=钛制梯子 tile.ladder_tungsten.name=钨制梯子 -tile.trapdoor_steel.name=钢制活板门 tile.lamp_demon.name=恶魔核心灯 tile.lamp_tritium_blue_off.name=蓝色氚灯 tile.lamp_tritium_blue_on.name=蓝色氚灯 @@ -5194,8 +5192,8 @@ tile.machine_boiler_off.name=锅炉 tile.machine_catalytic_cracker.name=催化裂化塔 tile.machine_catalytic_reformer.name=催化重整器 tile.machine_centrifuge.name=离心机 -tile.machine_chemfac.name=大型化工厂 -tile.machine_chemplant.name=化工厂 +tile.machine_chemfac.name=大型化工厂(遗留) +tile.machine_chemplant.name=化工厂(遗留) tile.machine_chungus.name=“利维坦”巨型汽轮机 tile.machine_chungus.desc=效率: 85%% tile.machine_coal_off.name=火力发电机 @@ -5812,7 +5810,6 @@ tool.ability.centrifuge=自动离心 tool.ability.crystallizer=自动结晶 tool.ability.explosion=爆破 tool.ability.hammer=范围挖掘 -tool.ability.flat_hammer=平坦區域採礦 tool.ability.luck=时运 tool.ability.mercury=水银提取 tool.ability.midas=点石成金 @@ -6089,8 +6086,14 @@ tile.fan.falloffOn=风扇功率随距离增加而减小 tile.fan.falloffOff=稳定的风扇功率 tile.glass_polarized.name=偏光玻璃 tile.machine_autosaw.suspended=暂停 -tile.machine_chemical_plant.name=化工厂二代 : 电子布加洛 +tile.machine_chemical_plant.name=化工厂 hbm.key.ability=循环工具能力 hbm.key.abilityAlt=配置工具能力 hbm.key.toggleMagnet=开关磁铁 upgrade.speed=工作速度 %s +container.machineChemicalFactory=大型化工厂 +item.rangefinder.name=测距仪 +tile.fluid_duct_paintable_block_exhaust.name=可涂漆排气管 +tile.machine_chemical_factory.name=大型化工厂 +tile.machine_chemical_factory.desc=可处理四个配方的化工厂。$配方处理速度更快。$但也需要消耗更多电量。$需要水来运行。$会产生低压蒸汽。 +tool.ability.hammer_flat=平整表面 From c55c8c5da1539bd9fd868815aa474febdb666479 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 1 Jul 2025 15:57:56 +0200 Subject: [PATCH 062/323] the moon is cheese that makes you trip balls --- changelog | 74 +++--------------- gradle.properties | 2 +- .../entity/effect/EntityFireLingering.java | 4 + .../logic/EntityExplosionChunkloading.java | 2 +- .../entity/logic/EntityNukeExplosionMK3.java | 4 + .../entity/logic/EntityNukeExplosionMK5.java | 1 + .../entity/missile/EntityMissileBaseNT.java | 4 +- .../entity/missile/EntityMissileCustom.java | 3 +- .../entity/missile/EntityMissileShuttle.java | 3 +- .../entity/missile/EntityMissileStealth.java | 3 +- .../entity/missile/EntityMissileTier0.java | 26 +++--- .../entity/missile/EntityMissileTier1.java | 13 +-- .../entity/missile/EntityMissileTier2.java | 13 +-- .../entity/missile/EntityMissileTier3.java | 11 +-- .../entity/missile/EntityMissileTier4.java | 20 ++--- .../com/hbm/explosion/ExplosionNukeSmall.java | 3 +- .../java/com/hbm/extprop/HbmLivingProps.java | 3 + .../com/hbm/handler/EntityEffectHandler.java | 8 ++ .../inventory/recipes/AmmoPressRecipes.java | 4 + .../recipes/CrystallizerRecipes.java | 3 + .../inventory/recipes/PedestalRecipes.java | 11 ++- .../recipes/loader/GenericRecipes.java | 2 +- src/main/java/com/hbm/items/ItemEnums.java | 3 +- .../weapon/sedna/factory/GunFactory.java | 2 +- .../sedna/factory/GunFactoryClient.java | 1 + .../weapon/sedna/factory/LegoClient.java | 20 +++++ .../weapon/sedna/factory/XFactory35800.java | 33 +++++++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 7 +- .../hbm/particle/ParticleFlamethrower.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../items/ammo_secret.folly_sm_alt.png | Bin 0 -> 296 bytes .../textures/items/chunk_ore.moonstone.png | Bin 0 -> 313 bytes 34 files changed, 165 insertions(+), 126 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png create mode 100644 src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png diff --git a/changelog b/changelog index bb000ef7e..609ce9fcc 100644 --- a/changelog +++ b/changelog @@ -1,70 +1,14 @@ ## Added -* New chemical factory - * New form factor, uses a smaller 5x5 footprint - * Only does four recipes instead of eight - * Double base speed, but also double power draw - * Three upgrade slots, upgrades follow the same rules as on the new chemplant - * Upgrades stack with the double base speed - * Stackable! - * Water consumption rate is fixed at 100mB/t for each active recipe - * Has a dedicated coolant line, so that the coolant water doesn't get used up by recipes - * Coolant line has a tooltip which should make it clear that the machine uses water and produces LPS - * Also has sound, unlike the old chemical factory - * Output fluids are now automatically sent to input tanks, at a rate of up to 50mB/t for somewhat fair fluid sharing - * This means that a chemical factory can make hydrogen peroxide, sulfuric acid and nitric acid, and the only fluid input needed is water -* Paintable exhaust pipe - * Full block exhaust pipe that behaves like paintable cables and ducts -* Rangefinder - * A simple tool for checking the distance to a block - * Is now used as the base ingredient for long range target designatory, artillery remotes and airstrike designators +* Steel trapdoor + * When open with a ladder below it, it too will act like a ladder ## Changed -* Updated chinese and ukrainian localizations -* The DNT suit now has a damage threshold of 1,000 -* Compressed biomass now has a nice cube shape -* The new chemical plant's indicator lights are now functional -* The new chemical plant can now use upgrades -* Reeds now drop sticks when broken -* Switching the recipe in the new chemplant now annihilates residual fluid that is not overwritten by the new recipe - * I don't know why people wanted this, but here you go -* The alternate recipe for oxyhydrogen now uses compressed air instead of nothing -* Improved threaded Mk5, should be a smidge faster now -* Spires no longer progress phases on peaceful difficulty -* Spires now have a 20% chance of coming with instructions -* New chemical plant now has sound -* Old chemical plant and factory have been renamed and their recipes removed -* The new recipe selector no longer changes recipe instantly on click, rather as soon as the selector GUI is closed. This should prevent issues when misclicking, which would destroy buffered fluids -* The memespoon is now safe(tm) - * Instead of using a bugged instakill implementation, a fall distance of >2 now deals 50 extra melee damage - * Instead of blowing up like a nuke with a fall distance of >20, it now explodes similarly to a non-HE artillery grenade. This deals 150 damage in an AoE, has armor piercing properties and is, like the original functionality, still lethal to the user -* The fuel port on the rotary furnace now has a tooltip showing that it can be used for automation -* Shredders will now prioritize NTM items when automatically generating recipes - * The priority for what mods' items should be chosen can be configured -* Mass storage units' stockpiles can now be directly accessed by ME systems -* Inserters can now be suspended by applying a redstone signal -* The legendary variant of the auto shotgun is no longer a simple reskin, it now has a completely unique model and animations - * Added alcoholism -* Open doors can now be interacted through -* Area abilities on tools now drop all mined blocks in the center -* Tools with AoE now come with the new "flat AoE" ability, which is the same but the area is only 1 block tall -* Atomic airstrike now requires a control unit -* Parallelized explosions have been temporarily disabled, regardless of config option, explosions will use the previous system +* Updated chinese localization +* Improved performance for many nodespace operations +* .35 can now use a new ammo type +* Balefire mini nukes are now craftable ## Fixed -* Chemical plant ports. For real this time. -* Fixed cable and pipe gauges returning the incomplete delta second value for OC and ROR readers -* Fixed new chemical plant not saving power values to disk -* Fixed laser rifle scope texture being missing -* Potentially fixed shift clicking issue with the new chemical plant -* Fixed blowtorch having a minimum gas requirement of 1,000mB despite only using 250mB -* The gas turbine now uses audio with a 20 tick timeout, fixing a rare issue where the loop gets stuck and never ends -* Potentially fixed a dupe caused by using InventoryBogoSorter in combination with crates -* Rapidly spinning dyx should no longer have a state leak that would rotate lighting of unrelated TESRs with it -* Fixed issue where mining strange stone with silk touch ability would cause a desync. It also now drops cobblestone, as if silk touch wasn't active at all -* Fixed issue where applying a filter to a mask that doesn't support certain protection types would permanently remove those types from the filter until the game is restarted -* Fixed InventoryBogoSorter being able to move held crates -* Fixed tier 2 pickaxes mining depth rock causing a desync with the depth rock not actually being broken -* Replaced paintabble cables in the lighthouse with regular ones, fixing an issue where the paint would ID shift -* Fixed light blocks being considered solid for NPC pathfinding -* Fixed issue regarding locked slots when using crates -* Fixed MK3 explosions crashing when spawned with invalid size or when not being deserialized correctly +* Fixed chemical plant recipe config defaulting to an output chance of 0% +* Potentially fixed an issue where chunks aren't properly force loaded when a nuclear explosion spawns, causing missiles to not work most of the time +* Fixed taint-tipped missile not correctly spawning taint most of the time \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index da72d22ff..ba4279e7d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5377 +mod_build_number=5378 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/entity/effect/EntityFireLingering.java b/src/main/java/com/hbm/entity/effect/EntityFireLingering.java index 1aef970e4..4eb1eac76 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFireLingering.java +++ b/src/main/java/com/hbm/entity/effect/EntityFireLingering.java @@ -20,6 +20,8 @@ public class EntityFireLingering extends Entity { public static int TYPE_DIESEL = 0; public static int TYPE_BALEFIRE = 1; public static int TYPE_PHOSPHORUS = 2; + public static int TYPE_OXY = 3; + public static int TYPE_BLACK = 4; public int maxAge = 150; public EntityFireLingering(World world) { @@ -75,6 +77,7 @@ public class EntityFireLingering extends Entity { if(this.getType() == this.TYPE_DIESEL) if(props.fire < 60) props.fire = 60; if(this.getType() == this.TYPE_PHOSPHORUS) if(props.fire < 300) props.fire = 300; if(this.getType() == this.TYPE_BALEFIRE) if(props.balefire < 100) props.balefire = 100; + if(this.getType() == this.TYPE_BLACK) if(props.blackFire < 200) props.blackFire = 200; else props.blackFire += 5; } else { e.setFire(4); } @@ -92,6 +95,7 @@ public class EntityFireLingering extends Entity { if(this.getType() == this.TYPE_DIESEL) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_FIRE); if(this.getType() == this.TYPE_PHOSPHORUS) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_FIRE); if(this.getType() == this.TYPE_BALEFIRE) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_BALEFIRE); + if(this.getType() == this.TYPE_BLACK) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_BLACK); } } } diff --git a/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java b/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java index 91b4e4eb9..eae135e54 100644 --- a/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java +++ b/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java @@ -44,7 +44,7 @@ public abstract class EntityExplosionChunkloading extends Entity implements IChu } public void clearChunkLoader() { - if(!worldObj.isRemote && loaderTicket != null && loadedChunk != null) { + if(!worldObj.isRemote && loaderTicket != null) { ForgeChunkManager.releaseTicket(loaderTicket); this.loaderTicket = null; } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java index df4eae71d..1f2e64316 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java @@ -259,6 +259,10 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { break; } } + + if(!entity.isDead) { + entity.loadChunk((int) Math.floor(x / 16D), (int) Math.floor(z / 16D)); + } return entity; } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index 06480aa21..cabe50118 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -159,6 +159,7 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { mk5.speed = (int)Math.ceil(100000 / mk5.strength); mk5.setPosition(x, y, z); mk5.length = mk5.strength / 2; + mk5.loadChunk((int) Math.floor(x / 16D), (int) Math.floor(z / 16D)); return mk5; } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java index c35497bce..6da5ec5a8 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java @@ -281,12 +281,12 @@ public abstract class EntityMissileBaseNT extends EntityThrowableInterp implemen @Override protected void onImpact(MovingObjectPosition mop) { if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { - this.onImpact(); + this.onMissileImpact(mop); this.setDead(); } } - public abstract void onImpact(); + public abstract void onMissileImpact(MovingObjectPosition mop); public abstract List getDebris(); public abstract ItemStack getDebrisRareDrop(); public void cluster() { } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java index 0bfe4efb6..70546d978 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java @@ -25,6 +25,7 @@ import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -161,7 +162,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo } @Override - public void onImpact() { //TODO: demolish this steaming pile of shit + public void onMissileImpact(MovingObjectPosition mop) { //TODO: demolish this steaming pile of shit ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(9)); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index 0205a13f2..5cfea36a6 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -15,6 +15,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityMissileShuttle extends EntityMissileBaseNT { @@ -28,7 +29,7 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { } @Override - public void onImpact() { + public void onMissileImpact(MovingObjectPosition mop) { ExplosionNT explosion = new ExplosionNT(worldObj, null, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 20.0F).overrideResolution(64); explosion.atttributes.add(ExAttrib.NOSOUND); explosion.atttributes.add(ExAttrib.NOPARTICLE); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java b/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java index 0dc2528aa..7827c3ad9 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java @@ -10,6 +10,7 @@ import com.hbm.particle.helper.ExplosionCreator; import com.hbm.items.ModItems; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityMissileStealth extends EntityMissileBaseNT { @@ -27,7 +28,7 @@ public class EntityMissileStealth extends EntityMissileBaseNT { @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_stealth); } @Override public boolean canBeSeenBy(Object radar) { return false; } - @Override public void onImpact() { this.explodeStandard(20F, 24, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(20F, 24, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return DictFrame.fromOne(ModItems.powder_ash, EnumAshType.MISC); } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java index 315f7c30b..f1ce3a4bb 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java @@ -16,11 +16,13 @@ import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.world.WorldUtil; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier0 extends EntityMissileBaseNT { @@ -49,7 +51,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { @Override public ItemStack getDebrisRareDrop() { return null; } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_test); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { int x = (int) Math.floor(posX); int y = (int) Math.floor(posY); int z = (int) Math.floor(posZ); @@ -80,7 +82,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileMicro extends EntityMissileTier0 { public EntityMissileMicro(World world) { super(world); } public EntityMissileMicro(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); } + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); } @Override public ItemStack getDebrisRareDrop() { return DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_micro); } } @@ -88,10 +90,10 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileSchrabidium extends EntityMissileTier0 { public EntityMissileSchrabidium(World world) { super(world); } public EntityMissileSchrabidium(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, BombConfig.aSchrabRadius); if(!ex.isDead) { - worldObj.spawnEntityInWorld(ex); + WorldUtil.loadAndSpawnEntityInWorld(ex); EntityCloudFleija cloud = new EntityCloudFleija(this.worldObj, BombConfig.aSchrabRadius); cloud.posX = this.posX; cloud.posY = this.posY; @@ -106,7 +108,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileBHole extends EntityMissileTier0 { public EntityMissileBHole(World world) { super(world); } public EntityMissileBHole(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 1.5F, true); EntityBlackHole bl = new EntityBlackHole(this.worldObj, 1.5F); bl.posX = this.posX; @@ -121,15 +123,15 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileTaint extends EntityMissileTier0 { public EntityMissileTaint(World world) { super(world); } public EntityMissileTaint(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); + @Override public void onMissileImpact(MovingObjectPosition mop) { + this.worldObj.createExplosion(this, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 5.0F, true); for(int i = 0; i < 100; i++) { - int a = rand.nextInt(11) + (int) this.posX - 5; - int b = rand.nextInt(11) + (int) this.posY - 5; - int c = rand.nextInt(11) + (int) this.posZ - 5; + int a = rand.nextInt(11) + (int) mop.blockX - 5; + int b = rand.nextInt(11) + (int) mop.blockY - 5; + int c = rand.nextInt(11) + (int) mop.blockZ - 5; Block block = worldObj.getBlock(a, b, c); if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); + worldObj.setBlock(a, b, c, ModBlocks.taint, 0, 2); } } } @@ -140,7 +142,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileEMP extends EntityMissileTier0 { public EntityMissileEMP(World world) { super(world); } public EntityMissileEMP(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionNukeGeneric.empBlast(worldObj, (int)posX, (int)posY, (int)posZ, 50); EntityEMPBlast wave = new EntityEMPBlast(worldObj, 50); wave.posX = posX; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java index 538eb439e..f140d1f26 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java @@ -10,6 +10,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier1 extends EntityMissileBaseNT { @@ -33,7 +34,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileGeneric extends EntityMissileTier1 { public EntityMissileGeneric(World world) { super(world); } public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(15F, 24, false); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(15F, 24, false); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_generic); } } @@ -41,7 +42,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileDecoy extends EntityMissileTier1 { public EntityMissileDecoy(World world) { super(world); } public EntityMissileDecoy(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { worldObj.newExplosion(this, posX, posY, posZ, 4F, false, false); } + @Override public void onMissileImpact(MovingObjectPosition mop) { worldObj.newExplosion(this, posX, posY, posZ, 4F, false, false); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.ingot_steel); } @Override public String getUnlocalizedName() { return "radar.target.tier4"; } @Override public int getBlipLevel() { return IRadarDetectableNT.TIER4; } @@ -51,7 +52,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileIncendiary extends EntityMissileTier1 { public EntityMissileIncendiary(World world) { super(world); } public EntityMissileIncendiary(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(15F, 24, true); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(15F, 24, true); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_incendiary_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_incendiary); } } @@ -59,11 +60,11 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileCluster extends EntityMissileTier1 { public EntityMissileCluster(World world) { super(world); } public EntityMissileCluster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 5F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_cluster); } } @@ -71,7 +72,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileBunkerBuster extends EntityMissileTier1 { public EntityMissileBunkerBuster(World world) { super(world); } public EntityMissileBunkerBuster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 15; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 5F, true); ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 5); ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 5); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java index c2b752e5d..25b1d2fda 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java @@ -11,6 +11,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier2 extends EntityMissileBaseNT { @@ -42,7 +43,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileStrong extends EntityMissileTier2 { public EntityMissileStrong(World world) { super(world); } public EntityMissileStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(30F, 32, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(30F, 32, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_medium); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_strong); } } @@ -50,7 +51,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileIncendiaryStrong extends EntityMissileTier2 { public EntityMissileIncendiaryStrong(World world) { super(world); } public EntityMissileIncendiaryStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(30F, 32, true); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); ExplosionChaos.flameDeath(this.worldObj, (int)((float)this.posX + 0.5F), (int)((float)this.posY + 0.5F), (int)((float)this.posZ + 0.5F), 25); @@ -62,11 +63,11 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileClusterStrong extends EntityMissileTier2 { public EntityMissileClusterStrong(World world) { super(world); } public EntityMissileClusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 15F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 50, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_medium); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_cluster_strong); } } @@ -74,7 +75,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileBusterStrong extends EntityMissileTier2 { public EntityMissileBusterStrong(World world) { super(world); } public EntityMissileBusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 20; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 7.5F, true); ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 8); ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 8); @@ -87,7 +88,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileEMPStrong extends EntityMissileTier2 { public EntityMissileEMPStrong(World world) { super(world); } public EntityMissileEMPStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { EntityEMP emp = new EntityEMP(worldObj); emp.posX = posX; emp.posY = posY; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java index de02e1aa2..fcff48108 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java @@ -12,6 +12,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -58,7 +59,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileBurst extends EntityMissileTier3 { public EntityMissileBurst(World world) { super(world); } public EntityMissileBurst(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(50F, 48, false); ExplosionCreator.composeEffectLarge(worldObj, posX, posY, posZ); } @@ -69,7 +70,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileInferno extends EntityMissileTier3 { public EntityMissileInferno(World world) { super(world); } public EntityMissileInferno(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(50F, 48, true); ExplosionCreator.composeEffectLarge(worldObj, posX, posY, posZ); ExplosionChaos.burn(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 10); @@ -82,11 +83,11 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileRain extends EntityMissileTier3 { public EntityMissileRain(World world) { super(world); } public EntityMissileRain(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 25F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 100, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_large); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_rain); } } @@ -94,7 +95,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileDrill extends EntityMissileTier3 { public EntityMissileDrill(World world) { super(world); } public EntityMissileDrill(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 30; i++) { ExplosionNT explosion = new ExplosionNT(worldObj, this, this.posX, this.posY - i, this.posZ, 10F); explosion.addAllAttrib(ExAttrib.ERRODE); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java index dfdfe9b8e..7d8b1c91b 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -9,9 +9,11 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionLarge; import com.hbm.items.ModItems; +import com.hbm.world.WorldUtil; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -63,8 +65,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileNuclear extends EntityMissileTier4 { public EntityMissileNuclear(World world) { super(world); } public EntityMissileNuclear(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_nuclear); } @@ -74,8 +76,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileMirv extends EntityMissileTier4 { public EntityMissileMirv(World world) { super(world); } public EntityMissileMirv(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); } @Override public List getDebris() { @@ -93,7 +95,7 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileVolcano extends EntityMissileTier4 { public EntityMissileVolcano(World world) { super(world); } public EntityMissileVolcano(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); for(int x = -1; x <= 1; x++) for(int y = -1; y <= 1; y++) for(int z = -1; z <= 1; z++) worldObj.setBlock((int)Math.floor(posX + x), (int)Math.floor(posY + y), (int)Math.floor(posZ + z), ModBlocks.volcanic_lava_block); worldObj.setBlock((int)Math.floor(posX), (int)Math.floor(posY), (int)Math.floor(posZ), ModBlocks.volcano_core); @@ -105,8 +107,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileDoomsday extends EntityMissileTier4 { public EntityMissileDoomsday(World world) { super(world); } public EntityMissileDoomsday(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); } @Override public List getDebris() { return null; } @@ -118,8 +120,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileDoomsdayRusted extends EntityMissileDoomsday { public EntityMissileDoomsdayRusted(World world) { super(world); } public EntityMissileDoomsdayRusted(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ).moreFallout(100)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ).moreFallout(100)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_doomsday_rusted); } diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index 0d405dba7..c1c35ceac 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -7,6 +7,7 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.world.WorldUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; @@ -33,7 +34,7 @@ import net.minecraft.world.World; if(params.shrapnelCount > 0) ExplosionLarge.spawnShrapnels(world, posX, posY, posZ, params.shrapnelCount); if(params.miniNuke && !params.safe) new ExplosionNT(world, null, posX, posY, posZ, params.blastRadius).addAllAttrib(params.explosionAttribs).overrideResolution(params.resolution).explode(); if(params.killRadius > 0) ExplosionNukeGeneric.dealDamage(world, posX, posY, posZ, params.killRadius); - if(!params.miniNuke) world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); + if(!params.miniNuke) WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); if(params.miniNuke) { float radMod = params.radiationLevel / 3F; diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 9201c7181..aa6356078 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -51,6 +51,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { public int fire; public int phosphorus; public int balefire; + public int blackFire; private List contamination = new ArrayList(); public HbmLivingProps(EntityLivingBase entity) { @@ -320,6 +321,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { props.setInteger("hfr_fire", fire); props.setInteger("hfr_phosphorus", phosphorus); props.setInteger("hfr_balefire", balefire); + props.setInteger("hfr_blackfire", blackFire); props.setInteger("hfr_cont_count", this.contamination.size()); @@ -347,6 +349,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { fire = props.getInteger("hfr_fire"); phosphorus = props.getInteger("hfr_phosphorus"); balefire = props.getInteger("hfr_balefire"); + blackFire = props.getInteger("hfr_blackfire"); int cont = props.getInteger("hfr_cont_count"); diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 7ae2acaab..dcbfcb5b6 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -668,6 +668,14 @@ public class EntityEffectHandler { FlameCreator.composeEffect(entity.worldObj, x - living.width / 2 + living.width * rand.nextDouble(), y + rand.nextDouble() * living.height, z - living.width / 2 + living.width * rand.nextDouble(), FlameCreator.META_BALEFIRE); } + if(props.blackFire > 0) { + props.blackFire--; + if((living.ticksExisted + living.getEntityId()) % 10 == 0) living.worldObj.playSoundEffect(living.posX, living.posY + living.height / 2, living.posZ, "random.fizz", 1F, 1.5F + rand.nextFloat() * 0.5F); + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, 5F); + if((living.ticksExisted + living.getEntityId()) % 10 == 0) living.attackEntityFrom(DamageSource.onFire, 10F); + FlameCreator.composeEffect(entity.worldObj, x - living.width / 2 + living.width * rand.nextDouble(), y + rand.nextDouble() * living.height, z - living.width / 2 + living.width * rand.nextDouble(), FlameCreator.META_BLACK); + } + if(props.fire > 0 || props.phosphorus > 0 || props.balefire > 0) if(!entity.isEntityAlive()) ConfettiUtil.decideConfetti(living, DamageSource.onFire); } diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index c5a96c458..1327ae459 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -431,6 +431,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, he.copy(8), null, null, sBig.copy(2), null, null, sPlate.copy(4), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_BALEFIRE, 1), + null, new ComparableStack(ModItems.egg_balefire_shard), null, + null, shell, null, + null, null , null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.CT_HOOK, 16), null, steel, null, diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index e4b8907ba..4902d2f06 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -24,6 +24,7 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumAshType; +import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ItemEnums.EnumPlantType; import com.hbm.items.ItemEnums.EnumTarType; import com.hbm.items.ModItems; @@ -240,6 +241,8 @@ public class CrystallizerRecipes extends SerializableRecipe { if(dustCinnabar != null && !dustCinnabar.isEmpty()) { registerRecipe(CINNABAR.dust(), new CrystallizerRecipe(new ItemStack(ModItems.cinnebar), utilityTime), new FluidStack(Fluids.PEROXIDE, 50)); } + + registerRecipe(new ComparableStack(ModBlocks.moon_turf, 16), new CrystallizerRecipe(new ItemStack(ModItems.chunk_ore, 1, EnumChunkType.MOONSTONE.ordinal()), 1200)); if(!IMCCrystallizer.buffer.isEmpty()) { recipes.putAll(IMCCrystallizer.buffer); diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index 76d22d7c8..b643ac3b7 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -15,6 +15,7 @@ import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.food.ItemConserve.EnumFoodType; import com.hbm.items.ModItems; @@ -94,9 +95,9 @@ public class PedestalRecipes extends SerializableRecipe { .extra(PedestalExtraCondition.GOOD_KARMA).set(1)); register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_SM.ordinal()), - new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), - new ComparableStack(ModItems.powder_magic), new ComparableStack(ModBlocks.moon_turf), new ComparableStack(ModItems.powder_magic), - new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) + new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), + new ComparableStack(ModItems.powder_magic), new ComparableStack(ModItems.chunk_ore, 1, EnumChunkType.MOONSTONE), new ComparableStack(ModItems.powder_magic), + new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) .extra(PedestalExtraCondition.FULL_MOON).set(1)); register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_NUKE.ordinal()), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), @@ -107,6 +108,10 @@ public class PedestalRecipes extends SerializableRecipe { null, null, null, null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, null, null, null).set(1)); + register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 10, EnumAmmoSecret.P35_800_BL.ordinal()), + null, null, null, + null, new ComparableStack(ModItems.item_secret, 3, EnumSecretType.ABERRATOR), null, + null, null, null).set(1)); } public static void register(PedestalRecipe recipe) { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 027bb8bb3..6cb020bd6 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -175,7 +175,7 @@ public abstract class GenericRecipes extends Serializab // a weight of 0 means this output is not part of a weighted output public ItemStack stack; - public float chance; + public float chance = 1F; public ChanceOutput() { super(0); } // for deserialization public ChanceOutput(ItemStack stack) { this(stack, 1F, 0); } diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index d92c7840b..6ca3c76af 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -53,7 +53,8 @@ public class ItemEnums { public static enum EnumChunkType { RARE, MALACHITE, - CRYOLITE + CRYOLITE, + MOONSTONE } public static enum EnumAchievementType { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index f389b40a1..bbf976df7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -139,7 +139,7 @@ public class GunFactory { public static enum EnumAmmoSecret { FOLLY_SM, FOLLY_NUKE, M44_EQUESTRIAN, G12_EQUESTRIAN, BMG50_EQUESTRIAN, - P35_800, BMG50_BLACK + P35_800, BMG50_BLACK, P35_800_BL } public static enum EnumModTest { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index 8e9d40aa5..753de9167 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -224,6 +224,7 @@ public class GunFactoryClient { folly_nuke.setRenderer(LegoClient.RENDER_BIG_NUKE); p35800.setRendererBeam(LegoClient.RENDER_CRACKLE); + p35800_bl.setRendererBeam(LegoClient.RENDER_BLACK_LIGHTNING); ct_hook.setRenderer(LegoClient.RENDER_CT_HOOK); ct_mortar.setRenderer(LegoClient.RENDER_CT_MORTAR); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 11d4b4012..b49292c78 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -378,6 +378,26 @@ public class LegoClient { GL11.glPopMatrix(); RenderArcFurnace.fullbright(false); }; + + public static BiConsumer RENDER_BLACK_LIGHTNING = (bullet, interp) -> { + + RenderArcFurnace.fullbright(true); + double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + double col = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + + GL11.glPushMatrix(); + GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); + GL11.glRotatef(-bullet.rotationPitch - 90, 1F, 0, 0); + + double scale = 5D; + GL11.glScaled(age * scale, 1, age * scale); + GL11.glTranslated(0, bullet.beamLength, 0); + GL11.glRotatef(-90, 0, 0, 1); + renderBulletStandard(Tessellator.instance, 0x4C3093, 0x000000, bullet.beamLength, true); + + GL11.glPopMatrix(); + RenderArcFurnace.fullbright(false); + }; public static BiConsumer RENDER_LASER_RED = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x80, 0x15, 0x15); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java index 588f54b0d..ddd435107 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java @@ -3,6 +3,9 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.entity.effect.EntityFireLingering; +import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -20,22 +23,44 @@ import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; public class XFactory35800 { public static BulletConfig p35800; + public static BulletConfig p35800_bl; + + public static BiConsumer LAMBDA_BLACK_IMPACT = (bullet, mop) -> { + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + Entity hit = mop.entityHit; + if(hit instanceof EntityLivingBase) { + HbmLivingProps.getData((EntityLivingBase) hit).blackFire += 200; + } + } + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + EntityFireLingering fire = new EntityFireLingering(bullet.worldObj).setArea(7.5F, 2F).setDuration(200).setType(EntityFireLingering.TYPE_BLACK); + fire.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + bullet.worldObj.spawnEntityInWorld(fire); + } + + BulletConfig.LAMBDA_STANDARD_BEAM_HIT.accept(bullet, mop); + }; public static void init() { - + p35800 = new BulletConfig().setItem(EnumAmmoSecret.P35_800).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false) .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT); + p35800_bl = new BulletConfig().setItem(EnumAmmoSecret.P35_800_BL).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false) + .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(LAMBDA_BLACK_IMPACT); ModItems.gun_aberrator = new ItemGunBaseNT(WeaponQuality.SECRET, new GunConfig() .dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, -0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .setupStandardConfiguration() @@ -46,7 +71,7 @@ public class XFactory35800 { new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, 0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .pp(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) @@ -55,7 +80,7 @@ public class XFactory35800 { new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(1, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(1, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, -0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .ps(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index f56883283..65c4c2319 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5377)"; + public static final String VERSION = "1.0.27 BETA (5378)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index aea94c19b..88a7441c7 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -923,9 +923,10 @@ public class ModEventHandlerClient { ItemFluidDuct.class ); - String prefix = "Slot "; - //int gunScale = 8; - int slotScale = 1; + String prefix = "Gun "; + int gunScale = 16; + int defaultScale = 1; + int slotScale = gunScale; boolean ignoreNonNTM = true; boolean onlyGuns = true; diff --git a/src/main/java/com/hbm/particle/ParticleFlamethrower.java b/src/main/java/com/hbm/particle/ParticleFlamethrower.java index 5477c95b7..2b665ef28 100644 --- a/src/main/java/com/hbm/particle/ParticleFlamethrower.java +++ b/src/main/java/com/hbm/particle/ParticleFlamethrower.java @@ -73,7 +73,7 @@ public class ParticleFlamethrower extends EntityFXRotating { tess.setColorRGBA_F(this.particleRed - add, this.particleGreen - add * 0.75F, this.particleBlue, this.particleAlpha); } else if(type == FlameCreator.META_BLACK) { this.particleAlpha = (float) (1 - ageScaled); - float add = (float) ageScaled * 4F - 1F; + float add = (float) ageScaled * 2F - 0.25F; tess.setColorRGBA_F(this.particleRed - add * 0.75F, this.particleGreen - add, this.particleBlue - add * 0.5F, this.particleAlpha); } else { this.particleAlpha = (float) Math.pow(1 - Math.min(ageScaled, 1), 0.5); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c8e7ea0f8..a031be603 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1080,6 +1080,7 @@ item.ammo_secret.folly_sm.name=Silberne Kugel item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel item.ammo_secret.m44_equestrian.name=.44 Magnum Schädelsprenger item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Schwarzer Blitz) item.ammo_standard.b75.name=.75 Bolzen item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv) item.ammo_standard.b75_inc.name=.75 Bolzen (Brand) @@ -1614,6 +1615,7 @@ item.chopper_torso.name=Jagdschrauber Rumpf item.chopper_wing.name=Jagdschrauber Seitentragfläche item.chunk_ore.cryolite.name=Kryolithbrocken item.chunk_ore.malachite.name=Malachitbrocken +item.chunk_ore.moonstone.name=Mondstein item.chunk_ore.rare.name=Seltenerdenerz-Brocken item.cigarette.name=FFI-Markenzigarette item.cinnebar.name=Zinnober diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 448d48a01..74c5a343b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1805,6 +1805,7 @@ item.ammo_secret.folly_sm.name=Silver Bullet item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot item.ammo_secret.m44_equestrian.name=.44 Magnum Head-Exploder item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Black Lightning) item.ammo_standard.b75.name=.75 Bolt item.ammo_standard.b75_exp.name=.75 Bolt (Explosive) item.ammo_standard.b75_inc.name=.75 Bolt (Incendiary) @@ -2389,6 +2390,7 @@ item.chopper_torso.name=Hunter Chopper Body item.chopper_wing.name=Hunter Chopper Wing item.chunk_ore.malachite.name=Malachite Chunk item.chunk_ore.rare.name=Rare Earth Ore Chunk +item.chunk_ore.moonstone.name=Moonstone item.chunk_ore.cryolite.name=Cryolite Chunk item.cigarette.name=FFI-Brand Cigarette item.cinnebar.name=Cinnabar diff --git a/src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png b/src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..0c15f038aab7932c4ae53fb59612d37555a197b9 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfx1-}LWT@Rralgd{D(x|X)Y{weXKYkqM>bCo9=`JM*RmO69a#A7Muuu zp8j(6J;9|@jwYVkq;mYtZI;)&nu__3-4N4Sx<+4!fgzcva^8Epnu!by(^4Co8FFUu z3+*_nm{%ic6z~%3X^bE}LA45?;U0I%QruhvJ1& s*)7-Zv2Rz*y&a|b^kr4OQ{PSQ4I=Y-&+JM*1@tO|r>mdKI;Vst0LqJS_5c6? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png b/src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png new file mode 100644 index 0000000000000000000000000000000000000000..8f84820c9e7c86f6e8498c3b758722a07bb4ba02 GIT binary patch literal 313 zcmV-90mlA`P)3k1-v(t?*YKuB2NV=r49E&h}+)VLn);#%MzS(0Km3wSeE56Br$8Pt&`T;YOU=w zP4-Ha5X|#z8Dl7l0_(a)jm8)NfKn_SR z5}EX_~)(;Vb$8zwV1VFYF8A00000 LNkvXXu0mjf{ Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 063/323] disguises for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 65 ++++++++++++++++++- .../hbm/blocks/generic/DungeonSpawner.java | 51 +++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 0508002d7..6d4a6f8a3 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,14 +16,18 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -91,6 +95,30 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityWandSpawner){ + TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; + spawner.disguise = block; + spawner.disguiseMeta = stack.getItemDamage() & 15; + return true; + } + } + } + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); @@ -132,10 +160,17 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - List text = new ArrayList(); + List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + String block; + if(spawner.disguise != null && spawner.disguise != Blocks.air) + block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + else + block = "None"; + + text.add("Disguise Block: " + block); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -167,9 +202,14 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public int placedRotation; + Block disguise; + int disguiseMeta = -1; + public String actionID = "PHASE_ABERRATOR"; public String conditionID = "ABERRATOR"; + public boolean noDisguise; + @Override public void updateEntity() { if(!worldObj.isRemote) { @@ -202,6 +242,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.actionID = actionID; spawner.conditionID = conditionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); + spawner.disguise = disguise; + spawner.disguiseMeta = disguiseMeta; } } @@ -217,6 +259,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); nbt.setInteger("rotation", placedRotation); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } } @Override @@ -225,6 +271,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); placedRotation = nbt.getInteger("rotation"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } @Override @@ -232,6 +282,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + buf.writeInt(Block.getIdFromBlock(disguise)); + buf.writeInt(disguiseMeta); } @Override @@ -239,6 +291,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + disguise = Block.getBlockById(buf.readInt()); + disguiseMeta = buf.readInt(); } @Override @@ -246,6 +300,11 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(disguise != null){ + nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + return nbt; } @@ -253,6 +312,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 41fa907b5..bba6ebfe7 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,18 +7,29 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; +import com.hbm.util.BufferUtil; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,11 +44,31 @@ public class DungeonSpawner extends BlockContainer { return new TileEntityDungeonSpawner(); } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityDungeonSpawner){ + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; + if(spawner.disguise != null){ + return spawner.disguise.getIcon(side, spawner.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + + public static class TileEntityDungeonSpawner extends TileEntity { public int phase = 0; public int timer = 0; + public Block disguise; + public int disguiseMeta; + public String conditionID = "ABERRATOR"; //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; @@ -77,6 +108,10 @@ public class DungeonSpawner extends BlockContainer { nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } } @Override @@ -85,6 +120,22 @@ public class DungeonSpawner extends BlockContainer { this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); } } From 3da96091da34b5087eb964d3957ee8c135119656 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 2 Jul 2025 16:50:20 +0200 Subject: [PATCH 064/323] flixes --- changelog | 15 ++----- .../java/com/hbm/entity/EntityMappings.java | 2 + .../handler/ability/IToolHarvestAbility.java | 4 +- .../com/hbm/handler/ability/ToolPreset.java | 44 +++++++++---------- src/main/java/com/hbm/main/MainRegistry.java | 2 +- .../TileEntityMachineChemicalPlant.java | 6 +++ .../java/com/hbm/util/AchievementHandler.java | 2 +- 7 files changed, 38 insertions(+), 37 deletions(-) diff --git a/changelog b/changelog index 609ce9fcc..dc8b91d49 100644 --- a/changelog +++ b/changelog @@ -1,14 +1,7 @@ -## Added -* Steel trapdoor - * When open with a ladder below it, it too will act like a ladder - ## Changed -* Updated chinese localization -* Improved performance for many nodespace operations -* .35 can now use a new ammo type -* Balefire mini nukes are now craftable +* The chemistry achievement now requires the new chemical plant +* The new chemical plant can now be used to upgrade the meteorite sword ## Fixed -* Fixed chemical plant recipe config defaulting to an output chance of 0% -* Potentially fixed an issue where chunks aren't properly force loaded when a nuclear explosion spawns, causing missiles to not work most of the time -* Fixed taint-tipped missile not correctly spawning taint most of the time \ No newline at end of file +* Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled +* Fixed NTM adding mob spawns to the mushroom island \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 18ca656e5..324c67a97 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -31,6 +31,7 @@ import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; +import net.minecraft.world.biome.BiomeGenMushroomIsland; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.common.BiomeDictionary.Type; @@ -279,6 +280,7 @@ public class EntityMappings { for(BiomeGenBase biome : biomes) { if(biome == null) continue; + if(biome instanceof BiomeGenMushroomIsland) continue; List spawns = biome.getSpawnableList(typeOfCreature); diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java index ee3027340..d76c30e33 100644 --- a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -88,7 +88,7 @@ public interface IToolHarvestAbility extends IBaseAbility { // Even if can be forced somehow, the player doesn't gain any // benefit from it. ItemStack stack = player.getHeldItem(); - EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); + if(stack != null) EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); } }; @@ -133,7 +133,7 @@ public interface IToolHarvestAbility extends IBaseAbility { // Even if can be forced somehow, the player doesn't gain any // benefit from it. ItemStack stack = player.getHeldItem(); - EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); + if(stack != null) EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); } }; diff --git a/src/main/java/com/hbm/handler/ability/ToolPreset.java b/src/main/java/com/hbm/handler/ability/ToolPreset.java index 7cc065478..1875f456c 100644 --- a/src/main/java/com/hbm/handler/ability/ToolPreset.java +++ b/src/main/java/com/hbm/handler/ability/ToolPreset.java @@ -27,32 +27,32 @@ public class ToolPreset { this.harvestAbilityLevel = harvestAbilityLevel; } - public ChatComponentText getMessage() { - if (isNone()) { - return ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush(); - } + public ChatComponentText getMessage() { + if(isNone()) { + return ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush(); + } - boolean hasArea = areaAbility != IToolAreaAbility.NONE; - boolean hasHarvest = harvestAbility != IToolHarvestAbility.NONE; - - ChatBuilder builder = ChatBuilder.start("[Enabled "); + boolean hasArea = areaAbility != IToolAreaAbility.NONE; + boolean hasHarvest = harvestAbility != IToolHarvestAbility.NONE; - if (hasArea) { - builder.nextTranslation(areaAbility.getName()); - builder.next(areaAbility.getExtension(areaAbilityLevel)); - } + ChatBuilder builder = ChatBuilder.start("[Enabled "); - if (hasArea && hasHarvest) { - builder.next(" + "); - } + if(hasArea) { + builder.nextTranslation(areaAbility.getName()); + builder.next(areaAbility.getExtension(areaAbilityLevel)); + } - if (hasHarvest) { - builder.nextTranslation(harvestAbility.getName()); - builder.next(harvestAbility.getExtension(harvestAbilityLevel)); - } - - return builder.colorAll(EnumChatFormatting.YELLOW).flush(); - } + if(hasArea && hasHarvest) { + builder.next(" + "); + } + + if(hasHarvest) { + builder.nextTranslation(harvestAbility.getName()); + builder.next(harvestAbility.getExtension(harvestAbilityLevel)); + } + + return builder.colorAll(EnumChatFormatting.YELLOW).flush(); + } public boolean isNone() { return areaAbility == IToolAreaAbility.NONE && harvestAbility == IToolHarvestAbility.NONE; diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index c4a5a3d4a..0d64ee670 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -717,7 +717,7 @@ public class MainRegistry { achBlastFurnace = new Achievement("achievement.blastFurnace", "blastFurnace", 1, 3, new ItemStack(ModBlocks.machine_difurnace_off), achBurnerPress).initIndependentStat().registerStat(); achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembler), achBurnerPress).initIndependentStat().registerStat(); achSelenium = new Achievement("achievement.selenium", "selenium", 3, 2, ModItems.ingot_starmetal, achBurnerPress).initIndependentStat().setSpecial().registerStat(); - achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemplant), achAssembly).initIndependentStat().registerStat(); + achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemical_plant), achAssembly).initIndependentStat().registerStat(); achConcrete = new Achievement("achievement.concrete", "concrete", 6, -4, new ItemStack(ModBlocks.concrete), achChemplant).initIndependentStat().registerStat(); achPolymer = new Achievement("achievement.polymer", "polymer", 9, -1, ModItems.ingot_polymer, achChemplant).initIndependentStat().registerStat(); achDesh = new Achievement("achievement.desh", "desh", 9, 2, ModItems.ingot_desh, achChemplant).initIndependentStat().registerStat(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 838958668..2bb6584f8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -10,6 +10,7 @@ import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalPlant; +import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -113,6 +114,11 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem this.didProcess = this.chemplantModule.didProcess; if(this.chemplantModule.markDirty) this.markDirty(); + if(didProcess) { + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_machined) + slots[0] = new ItemStack(ModItems.meteorite_sword_treated); + } + this.networkPackNT(100); } else { diff --git a/src/main/java/com/hbm/util/AchievementHandler.java b/src/main/java/com/hbm/util/AchievementHandler.java index 900509bfe..4ad24e8f4 100644 --- a/src/main/java/com/hbm/util/AchievementHandler.java +++ b/src/main/java/com/hbm/util/AchievementHandler.java @@ -20,7 +20,7 @@ public class AchievementHandler { craftingAchievements.put(new ComparableStack(ModItems.battery_potatos), MainRegistry.achPotato); craftingAchievements.put(new ComparableStack(ModBlocks.machine_press), MainRegistry.achBurnerPress); craftingAchievements.put(new ComparableStack(ModItems.rbmk_fuel_empty), MainRegistry.achRBMK); - craftingAchievements.put(new ComparableStack(ModBlocks.machine_chemplant), MainRegistry.achChemplant); + craftingAchievements.put(new ComparableStack(ModBlocks.machine_chemical_plant), MainRegistry.achChemplant); craftingAchievements.put(new ComparableStack(ModBlocks.concrete_smooth), MainRegistry.achConcrete); craftingAchievements.put(new ComparableStack(ModBlocks.concrete_asbestos), MainRegistry.achConcrete); craftingAchievements.put(new ComparableStack(ModItems.ingot_polymer), MainRegistry.achPolymer); From 49830020138562e63be71f52439d3236366addf7 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 3 Jul 2025 12:21:04 +0300 Subject: [PATCH 065/323] Fix ItemToolAbility bedrock breaking --- .../java/com/hbm/items/tool/ItemToolAbility.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index c731da461..e055c2b6b 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -292,14 +292,23 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); - if(!(canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) || block == Blocks.bedrock || block == ModBlocks.stone_keyhole) + if(!( + canHarvestBlock(block, stack) || + canShearBlock(block, stack, world, x, y, z)) || + block.getPlayerRelativeBlockHardness(player, world, x, y, z) < 0 || + block == ModBlocks.stone_keyhole + ) return; Block refBlock = world.getBlock(refX, refY, refZ); float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ); float strength = ForgeHooks.blockStrength(block, player, world, x, y, z); - if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getPlayerRelativeBlockHardness(player, world, refX, refY, refZ) < 0) + if( + !ForgeHooks.canHarvestBlock(block, player, meta) || + refStrength / strength > 10f || + refBlock.getPlayerRelativeBlockHardness(player, world, refX, refY, refZ) < 0 + ) return; BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z); From ac45637bf6f12ca99b143cbdddeb67af67089200 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 3 Jul 2025 12:26:46 +0300 Subject: [PATCH 066/323] Just a bit more null checks --- .../java/com/hbm/handler/ability/IToolHarvestAbility.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java index d76c30e33..7fe16423e 100644 --- a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -37,7 +37,8 @@ public interface IToolHarvestAbility extends IBaseAbility { if(skipDefaultDrops) { // Emulate the block breaking without drops world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + ItemStack stack = player.getHeldItem(); + if(stack != null) stack.damageItem(1, player); } else if(player instanceof EntityPlayerMP) { // Break the block conventionally ItemToolAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); @@ -78,7 +79,7 @@ public interface IToolHarvestAbility extends IBaseAbility { @Override public void preHarvestAll(int level, World world, EntityPlayer player) { ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); + if(stack != null) EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); } @Override @@ -123,7 +124,7 @@ public interface IToolHarvestAbility extends IBaseAbility { @Override public void preHarvestAll(int level, World world, EntityPlayer player) { ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, powerAtLevel[level]); + if(stack != null) EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, powerAtLevel[level]); } @Override From 6282bd028d477608775302b45228634a71cfab60 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 3 Jul 2025 15:01:24 +0200 Subject: [PATCH 067/323] ough --- changelog | 5 +- .../hbm/commands/CommandReloadRecipes.java | 3 + .../hbm/inventory/FluidContainerRegistry.java | 89 +++++++++---------- .../gui/LoadingScreenRendererNT.java | 2 +- .../recipes/loader/SerializableRecipe.java | 2 +- 5 files changed, 53 insertions(+), 48 deletions(-) diff --git a/changelog b/changelog index dc8b91d49..0b4c4ebc0 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,10 @@ ## Changed * The chemistry achievement now requires the new chemical plant * The new chemical plant can now be used to upgrade the meteorite sword +* Fluid containers are now re-registered when using `/ntmreload` which should correctly generate fluid container items for freshly added custom fluids +* Recipe configs will no longer try to parse null value recipes, meaing that trailing commas in a recipe config will no longer create an error ## Fixed * Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled -* Fixed NTM adding mob spawns to the mushroom island \ No newline at end of file +* Fixed NTM adding mob spawns to the mushroom island +# Fixed line break not working on the tip of the day \ No newline at end of file diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java index 7b1942c2c..a07b43848 100644 --- a/src/main/java/com/hbm/commands/CommandReloadRecipes.java +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -1,6 +1,7 @@ package com.hbm.commands; import com.hbm.config.ItemPoolConfigJSON; +import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.particle.helper.SkeletonCreator; @@ -27,7 +28,9 @@ public class CommandReloadRecipes extends CommandBase { @Override public void processCommand(ICommandSender sender, String[] args) { try { + FluidContainerRegistry.clearRegistry(); // we do this first so IFluidRegisterListener can go wild with the registry Fluids.reloadFluids(); + FluidContainerRegistry.register(); SerializableRecipe.initialize(); ItemPoolConfigJSON.initialize(); DamageResistanceHandler.init(); diff --git a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java index c3f0e4afc..4bc72d64a 100644 --- a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java +++ b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java @@ -18,12 +18,18 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; public class FluidContainerRegistry { - - //TODO: continue incorporating hashmaps into this + + // TODO: continue incorporating hashmaps into this public static List allContainers = new ArrayList(); private static HashMap> containerMap = new HashMap>(); + public static void clearRegistry() { + allContainers.clear(); + containerMap.clear(); + } + public static void register() { + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.water_bucket), new ItemStack(Items.bucket), Fluids.WATER, 1000)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.potionitem), new ItemStack(Items.glass_bottle), Fluids.WATER, 250)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.lava_bucket), new ItemStack(Items.bucket), Fluids.LAVA, 1000)); @@ -59,34 +65,34 @@ public class FluidContainerRegistry { FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.experience_bottle), new ItemStack(Items.glass_bottle), Fluids.XPJUICE, 100)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.can_mug), new ItemStack(ModItems.can_empty), Fluids.MUG, 100)); - + FluidType[] fluids = Fluids.getAll(); for(int i = 1; i < fluids.length; i++) { - + FluidType type = fluids[i]; int id = type.getID(); - + if(type.getContainer(CD_Canister.class) != null) FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.canister_full, 1, id), new ItemStack(ModItems.canister_empty), type, 1000)); if(type.getContainer(CD_Gastank.class) != null) FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.gas_full, 1, id), new ItemStack(ModItems.gas_empty), type, 1000)); - + if(type.hasNoContainer()) continue; - - if(type.isDispersable()){ - FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.disperser_canister, 1 , i), new ItemStack(ModItems.disperser_canister_empty), Fluids.fromID(i), 2000)); - FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.glyphid_gland, 1 , i), new ItemStack(ModItems.glyphid_gland_empty), Fluids.fromID(i), 4000)); + + if(type.isDispersable()) { + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.disperser_canister, 1, i), new ItemStack(ModItems.disperser_canister_empty), Fluids.fromID(i), 2000)); + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.glyphid_gland, 1, i), new ItemStack(ModItems.glyphid_gland_empty), Fluids.fromID(i), 4000)); } FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_tank_lead_full, 1, id), new ItemStack(ModItems.fluid_tank_lead_empty), type, 1000)); if(type.needsLeadContainer()) continue; - + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_tank_full, 1, id), new ItemStack(ModItems.fluid_tank_empty), type, 1000)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_barrel_full, 1, id), new ItemStack(ModItems.fluid_barrel_empty), type, 16000)); } - + Compat.registerCompatFluidContainers(); } - + public static void registerContainer(FluidContainer con) { allContainers.add(con); OreDictionary.registerOre(con.type.getDict(con.content), con.fullContainer); @@ -103,51 +109,48 @@ public class FluidContainerRegistry { } public static FluidContainer getContainer(FluidType type, ItemStack stack) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) + if(!containerMap.containsKey(type)) return null; - for (FluidContainer container : getContainers(type)) { - if (ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) { + for(FluidContainer container : getContainers(type)) { + if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) { return container; } } return null; } - + public static int getFluidContent(ItemStack stack, FluidType type) { - + if(stack == null) return 0; - + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) + if(!containerMap.containsKey(type)) return 0; - + for(FluidContainer container : containerMap.get(type)) { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.content; } - + return 0; } - + public static FluidType getFluidType(ItemStack stack) { - - if(stack == null) - return Fluids.NONE; - + if(stack == null) return Fluids.NONE; + ItemStack sta = stack.copy(); sta.stackSize = 1; - + for(FluidContainer container : allContainers) { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.type; @@ -155,29 +158,26 @@ public class FluidContainerRegistry { return Fluids.NONE; } - + public static ItemStack getFullContainer(ItemStack stack, FluidType type) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) - return null; + if(!containerMap.containsKey(type)) return null; for(FluidContainer container : containerMap.get(type)) { - if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) + if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) return container.fullContainer.copy(); } - + return null; } - + public static ItemStack getEmptyContainer(ItemStack stack) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; @@ -185,8 +185,7 @@ public class FluidContainerRegistry { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.emptyContainer == null ? null : container.emptyContainer.copy(); } - + return null; } - } diff --git a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java index d9dc5e676..8dd24c319 100644 --- a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java +++ b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java @@ -166,7 +166,7 @@ public class LoadingScreenRendererNT extends LoadingScreenRenderer { this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (width - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, height / 2 - 4 - 16, 16777215); this.mc.fontRenderer.drawStringWithShadow(this.message, (width - this.mc.fontRenderer.getStringWidth(this.message)) / 2, height / 2 - 4 + 8, 16777215); - String[] frags = this.tipOfTheDay.split("$"); + String[] frags = this.tipOfTheDay.split("\\$"); for(int i = 0; i < frags.length; i++) { String frag = frags[i]; this.mc.fontRenderer.drawStringWithShadow(EnumChatFormatting.YELLOW + frag, (width - this.mc.fontRenderer.getStringWidth(frag)) / 2, height / 2 - 4 - 60 + i * 10, 16777215); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index a89e19b26..ec30b16b3 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -237,7 +237,7 @@ public abstract class SerializableRecipe { JsonObject json = gson.fromJson(reader, JsonObject.class); JsonArray recipes = json.get("recipes").getAsJsonArray(); for(JsonElement recipe : recipes) { - this.readRecipe(recipe); + if(recipe != null) this.readRecipe(recipe); } } From edd952ec6afd60052410b3d791ee1548c90961d9 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 068/323] Interactions for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 32 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 34 +++++- .../world/gen/util/DungeonSpawnerActions.java | 105 ++++++++++++++---- .../gen/util/DungeonSpawnerConditions.java | 7 +- .../gen/util/DungeonSpawnerInteractions.java | 80 +++++++++++++ 5 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 6d4a6f8a3..b6c042838 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,6 +16,7 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -146,6 +147,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.conditionID = conditionNames.get(indexC); + return true; + case HAND_DRILL: + List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(spawner.interactionID); + + indexI += player.isSneaking() ? -1 : 1; + indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); + + spawner.interactionID = interactionNames.get(indexI); + return true; default: return false; @@ -163,6 +174,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + String block; if(spawner.disguise != null && spawner.disguise != Blocks.air) @@ -171,6 +184,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT block = "None"; text.add("Disguise Block: " + block); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -178,7 +192,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); + list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); } @Override @@ -206,9 +221,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT int disguiseMeta = -1; public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "ABERRATOR"; - - public boolean noDisguise; + public String conditionID = "EMPTY"; + public String interactionID; @Override public void updateEntity() { @@ -241,6 +255,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.interactionID = interactionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); spawner.disguise = disguise; spawner.disguiseMeta = disguiseMeta; @@ -258,6 +273,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.writeToNBT(nbt); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + nbt.setString("interactionID", interactionID); nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); @@ -270,6 +286,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.readFromNBT(nbt); actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); placedRotation = nbt.getInteger("rotation"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); @@ -282,6 +299,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + BufferUtil.writeString(buf, interactionID); buf.writeInt(Block.getIdFromBlock(disguise)); buf.writeInt(disguiseMeta); } @@ -291,6 +309,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + interactionID = BufferUtil.readString(buf); disguise = Block.getBlockById(buf.readInt()); disguiseMeta = buf.readInt(); } @@ -300,8 +319,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); if(disguise != null){ - nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); nbt.setInteger("disguiseMeta", disguiseMeta); } @@ -312,6 +333,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); disguiseMeta = nbt.getInteger("disguiseMeta"); diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index bba6ebfe7..52dbb6099 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -12,6 +12,7 @@ import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -59,22 +60,38 @@ public class DungeonSpawner extends BlockContainer { return super.getIcon(world, x, y, z, side); } + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { + ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } public static class TileEntityDungeonSpawner extends TileEntity { + //phase is incremented per condition check, timer counts since last condition check by default public int phase = 0; public int timer = 0; public Block disguise; public int disguiseMeta; + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ public String conditionID = "ABERRATOR"; - //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; public Function condition; public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override @@ -87,6 +104,10 @@ public class DungeonSpawner extends BlockContainer { if(condition == null){ condition = DungeonSpawnerConditions.conditions.get(conditionID); } + if(interaction == null && interactionID != null){ + interaction = DungeonSpawnerInteractions.interactions.get(interactionID); + } + if(action == null || condition == null){ worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); return; @@ -105,8 +126,12 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + nbt.setInteger("direction", direction.ordinal()); if(disguise != null){ nbt.setInteger("disguiseMeta", disguiseMeta); @@ -118,8 +143,13 @@ public class DungeonSpawner extends BlockContainer { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ disguiseMeta = nbt.getInteger("disguiseMeta"); disguise = Block.getBlockFromName(nbt.getString("disguise")); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 1e32d9dc7..fee835c2e 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -1,7 +1,7 @@ package com.hbm.world.gen.util; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; @@ -9,34 +9,30 @@ import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; -import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.ContaminationUtil; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.function.Consumer; public class DungeonSpawnerActions { - public static HashMap> actions = new HashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -122,14 +118,10 @@ public class DungeonSpawnerActions { Vec3NT vec = new Vec3NT(5, 0, 0); for (int i = 0; i < 10; i++) { EntityZombie mob = new EntityZombie(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - if (mob.getCanSpawnHere()) { - world.spawnEntityInWorld(mob); - break; - } - } + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + world.spawnEntityInWorld(mob); + vec.rotateAroundYDeg(36D); } world.setBlock(x, y, z, ModBlocks.block_steel); @@ -178,6 +170,78 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + ForgeDirection direction = tile.direction.getOpposite(); + ForgeDirection rot = direction.getRotation(ForgeDirection.UP); + + AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); + + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); + + for(EntityLivingBase e : entities) { + + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); + double len = vec.lengthVector(); + vec = vec.normalize(); + + len = Math.max(len,1D); + + float res = 0; + + for(int i = 1; i < len; i++) { + + int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); + int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); + int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); + + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); + } + + if(res < 1) + res = 1; + + float eRads = 100F; + eRads /= (float)res; + eRads /= (float)(len * len); + + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); + } + + if (tile.phase == 2 && tile.timer > 40){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); + + for(int i = 1; i < 20; i++) { + int checkX, checkY, checkZ; + checkX = x + direction.offsetX * i; + checkY = y + 1; + checkZ = z + direction.offsetZ * i; + Block block = world.getBlock(checkX, checkY,checkZ); + TileEntity te = null; + if(block instanceof BlockDummyable){ + int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); + te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); + } + + if (te instanceof TileEntityDoorGeneric) { + TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; + door.setPins(456); + door.close(); + door.lock(); + break; + } + } + + tile.phase = 3; + } + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -189,6 +253,7 @@ public class DungeonSpawnerActions { actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); + actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 0a634c271..83dd773e8 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -15,12 +15,16 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; public class DungeonSpawnerConditions { - public static HashMap> conditions = new HashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); + + /**For use with interactions, for having them handle all conditional tasks*/ + public static Function EMPTY = (tile) -> false; public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -82,6 +86,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); conditions.put("REDSTONE", REDSTONE); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java new file mode 100644 index 000000000..32c19b81d --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java @@ -0,0 +1,80 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.items.ModItems; +import com.hbm.potion.HbmPotion; +import com.hbm.tileentity.TileEntityDoorGeneric; +import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/**Interactions are called when the player right-clicks the block**/ +public class DungeonSpawnerInteractions { + + /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, + * in that order **/ + public static LinkedHashMap> interactions = new LinkedHashMap<>(); + + public static Consumer TEST = (array) -> { + World world = (World) array[0]; + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + int x = (int) array[2]; + int y = (int) array[3]; + int z = (int) array[4]; + EntityPlayer player = (EntityPlayer) array[5]; + int side = (int) array[6]; + + if(spawner.phase > 1) return; + + if(player.getHeldItem() != null) + player.getHeldItem().stackSize--; + + spawner.phase++; + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ + player.getHeldItem().stackSize--; + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Radiation treatment administered")); + player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); + player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); + spawner.phase = 2; + spawner.timer = 0; + } + }; + + + + public static List getInteractionNames(){ + return new ArrayList<>(interactions.keySet()); + } + + //register new interactions here + static{ + interactions.put("TEST", TEST); + interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); + } + + + +} From 360b0acabe66139772dc80678986d0858127bba0 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 069/323] Interactions for the logic block --- src/main/resources/assets/hbm/lang/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d60a76787..1676a79b5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5277,6 +5277,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain +tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port From 0880287660caf2e2ed4283077c33cdaa2d4e79af Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 4 Jul 2025 15:24:28 +0200 Subject: [PATCH 070/323] assembler module --- .../machine/ModuleMachineAssembler.java | 28 ++++++++++++++ .../ModuleMachineBase.java} | 36 +++++++----------- .../machine/ModuleMachineChemplant.java | 35 +++++++++++++++++ .../TileEntityMachineChemicalFactory.java | 2 +- .../TileEntityMachineChemicalPlant.java | 2 +- .../assets/hbm/textures/gui/gui_slab.png | Bin 0 -> 4295 bytes .../assets/hbm/textures/items/tent_tablet.png | Bin 0 -> 231 bytes 7 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java rename src/main/java/com/hbm/module/{ModuleMachineChemplant.java => machine/ModuleMachineBase.java} (75%) create mode 100644 src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java create mode 100644 src/main/resources/assets/hbm/textures/gui/gui_slab.png create mode 100644 src/main/resources/assets/hbm/textures/items/tent_tablet.png diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java new file mode 100644 index 000000000..e132a5031 --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -0,0 +1,28 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.loader.GenericRecipe; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +public class ModuleMachineAssembler extends ModuleMachineBase { + + public ModuleMachineAssembler(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[12]; + this.outputSlots = new int[1]; + this.inputTanks = new FluidTank[1]; + this.outputTanks = new FluidTank[1]; + } + + @Override + public GenericRecipe getRecipe() { + return null; + } + + public ModuleMachineAssembler itemInput(int... a) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = a[i]; return this; } + public ModuleMachineAssembler itemOutput(int a) { outputSlots[0] = a; return this; } + public ModuleMachineAssembler fluidInput(FluidTank a) { inputTanks[0] = a; return this; } + public ModuleMachineAssembler fluidOutput(FluidTank a) { outputTanks[0] = a; return this; } +} diff --git a/src/main/java/com/hbm/module/ModuleMachineChemplant.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java similarity index 75% rename from src/main/java/com/hbm/module/ModuleMachineChemplant.java rename to src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 4c6cbdbcd..7787b4fbd 100644 --- a/src/main/java/com/hbm/module/ModuleMachineChemplant.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -1,7 +1,6 @@ -package com.hbm.module; +package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; @@ -11,22 +10,16 @@ import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -/** - * Option 1: Make a base class with weird arbitrary overrides to define shit like slots for multi machines like the chemfac - * Option 2: Make an easy to define module which can be used by whatever needs it, hypothetically allowing a mixed recipe machine. - * In the hudson bay, you know how we do it. - * @author hbm - */ -public class ModuleMachineChemplant { +public abstract class ModuleMachineBase { // setup public int index; public IEnergyHandlerMK2 battery; public ItemStack[] slots; - public int[] inputSlots = new int[3]; - public int[] outputSlots = new int[3]; - public FluidTank[] inputTanks = new FluidTank[3]; - public FluidTank[] outputTanks = new FluidTank[3]; + public int[] inputSlots; + public int[] outputSlots; + public FluidTank[] inputTanks; + public FluidTank[] outputTanks; // running vars public String recipe = "null"; public double progress; @@ -34,7 +27,7 @@ public class ModuleMachineChemplant { public boolean didProcess = false; public boolean markDirty = false; - public ModuleMachineChemplant(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + public ModuleMachineBase(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { this.index = index; this.battery = battery; this.slots = slots; @@ -43,8 +36,8 @@ public class ModuleMachineChemplant { /** Chances tank type and pressure based on recipe */ public void setupTanks(GenericRecipe recipe) { if(recipe == null) return; - for(int i = 0; i < 3; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].conform(recipe.inputFluid[i]); else inputTanks[i].resetTank(); - for(int i = 0; i < 3; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].conform(recipe.outputFluid[i]); else outputTanks[i].resetTank(); + for(int i = 0; i < inputTanks.length; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].conform(recipe.inputFluid[i]); else inputTanks[i].resetTank(); + for(int i = 0; i < outputTanks.length; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].conform(recipe.outputFluid[i]); else outputTanks[i].resetTank(); } /** Expects the tanks to be set up correctly beforehand */ @@ -135,8 +128,10 @@ public class ModuleMachineChemplant { } } + public abstract GenericRecipe getRecipe(); + public void update(double speed, double power, boolean extraCondition) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + GenericRecipe recipe = getRecipe(); this.setupTanks(recipe); this.didProcess = false; @@ -152,7 +147,7 @@ public class ModuleMachineChemplant { /** For item IO, instead of the TE doing all the work it only has to handle non-recipe stuff, the module does the rest */ public boolean isItemValid(int slot, ItemStack stack) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + GenericRecipe recipe = getRecipe(); if(recipe == null) return false; if(recipe.inputItem == null) return false; @@ -162,11 +157,6 @@ public class ModuleMachineChemplant { return false; } - - public ModuleMachineChemplant itemInput(int a, int b, int c) { inputSlots[0] = a; inputSlots[1] = b; inputSlots[2] = c; return this; } - public ModuleMachineChemplant itemOutput(int a, int b, int c) { outputSlots[0] = a; outputSlots[1] = b; outputSlots[2] = c; return this; } - public ModuleMachineChemplant fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } - public ModuleMachineChemplant fluidOutput(FluidTank a, FluidTank b, FluidTank c) { outputTanks[0] = a; outputTanks[1] = b; outputTanks[2] = c; return this; } public void serialize(ByteBuf buf) { buf.writeDouble(progress); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java new file mode 100644 index 000000000..c6268e2cd --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java @@ -0,0 +1,35 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +/** + * Option 1: Make a base class with weird arbitrary overrides to define shit like slots for multi machines like the chemfac + * Option 2: Make an easy to define module which can be used by whatever needs it, hypothetically allowing a mixed recipe machine. + * In the hudson bay, you know how we do it. + * @author hbm + */ +public class ModuleMachineChemplant extends ModuleMachineBase { + + public ModuleMachineChemplant(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[3]; + this.outputSlots = new int[3]; + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[3]; + } + + @Override + public GenericRecipe getRecipe() { + return ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + } + + public ModuleMachineChemplant itemInput(int a, int b, int c) { inputSlots[0] = a; inputSlots[1] = b; inputSlots[2] = c; return this; } + public ModuleMachineChemplant itemOutput(int a, int b, int c) { outputSlots[0] = a; outputSlots[1] = b; outputSlots[2] = c; return this; } + public ModuleMachineChemplant fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } + public ModuleMachineChemplant fluidOutput(FluidTank a, FluidTank b, FluidTank c) { outputTanks[0] = a; outputTanks[1] = b; outputTanks[2] = c; return this; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 8b31f6f11..e7695b078 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -14,7 +14,7 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.module.ModuleMachineChemplant; +import com.hbm.module.machine.ModuleMachineChemplant; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 2bb6584f8..47e0a7d62 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -15,7 +15,7 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.module.ModuleMachineChemplant; +import com.hbm.module.machine.ModuleMachineChemplant; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; diff --git a/src/main/resources/assets/hbm/textures/gui/gui_slab.png b/src/main/resources/assets/hbm/textures/gui/gui_slab.png new file mode 100644 index 0000000000000000000000000000000000000000..02dab2c1cdcfeb790cd31c765e653aea3ef13243 GIT binary patch literal 4295 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/tent_tablet.png b/src/main/resources/assets/hbm/textures/items/tent_tablet.png new file mode 100644 index 0000000000000000000000000000000000000000..8769aeeec7ee11e53c91380f5451510e101ac20a GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#zY&+tf+irRRcP%u#**S#nniU&hBA`2*<&aW< Date: Sat, 5 Jul 2025 23:43:55 +0200 Subject: [PATCH 071/323] scatman's world --- changelog | 6 +- .../com/hbm/blocks/bomb/BlockVolcano.java | 2 +- .../java/com/hbm/config/GeneralConfig.java | 2 + .../hbm/items/machine/ItemFluidSiphon.java | 113 +++++++++--------- .../com/hbm/items/tool/ItemToolAbility.java | 13 +- .../weapon/sedna/factory/LegoClient.java | 1 - .../com/hbm/main/ModEventHandlerClient.java | 8 +- .../oil/TileEntityMachineRefinery.java | 2 +- .../models/machines/assembly_machine.png | Bin 0 -> 3249 bytes 9 files changed, 78 insertions(+), 69 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png diff --git a/changelog b/changelog index 0b4c4ebc0..8226bc9a5 100644 --- a/changelog +++ b/changelog @@ -3,8 +3,12 @@ * The new chemical plant can now be used to upgrade the meteorite sword * Fluid containers are now re-registered when using `/ntmreload` which should correctly generate fluid container items for freshly added custom fluids * Recipe configs will no longer try to parse null value recipes, meaing that trailing commas in a recipe config will no longer create an error +* Refinery solid byproducts now build up substantially faster + * This means fracking solution from standard oil is now a lot more viable + * This also makes the volume of oil spent consistent with the NEI handler ## Fixed * Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled * Fixed NTM adding mob spawns to the mushroom island -# Fixed line break not working on the tip of the day \ No newline at end of file +* Fixed line break not working on the tip of the day +* Fixed an issue where AoE abilities can break bedrock \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java index 6eefdf20e..16110461e 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java @@ -151,7 +151,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("tier", this.volcanoTimer); + nbt.setInteger("timer", this.volcanoTimer); } private boolean shouldGrow() { diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index c843cde57..b52f58073 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -39,6 +39,7 @@ public class GeneralConfig { public static boolean enableSoundExtension = true; public static boolean enableMekanismChanges = true; public static boolean enableServerRecipeSync = false; + public static boolean enableLoadScreenReplacement = true; public static int normalSoundChannels = 200; public static boolean enableExpensiveMode = false; @@ -120,6 +121,7 @@ public class GeneralConfig { "Note that a value below 28 or above 200 can cause buggy sounds and issues with other mods running out of sound memory.", 100); preferredOutputMod = CommonConfig.createConfigStringList(config,CATEGORY_GENERAL,"1.42_preferredOutputMod", "The mod which is preferred as output when certain machines autogenerate recipes. Currently used for the shredder", new String[] {RefStrings.MODID}); + enableLoadScreenReplacement = config.get(CATEGORY_GENERAL, "1.43_enableLoadScreenReplacement", true, "Tries to replace the vanilla load screen with the 'tip of the day' one, may clash with other mods trying to do the same.").getBoolean(true); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); final String CATEGORY_528 = CommonConfig.CATEGORY_528; diff --git a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java index 2a7fc95ce..ecf9797e6 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java @@ -10,8 +10,7 @@ import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Unsiphonable; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemPipette; -import api.hbm.fluid.IFluidStandardReceiver; -import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -19,78 +18,82 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class ItemFluidSiphon extends Item { - + @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { TileEntity te = CompatExternal.getCoreFromPos(world, x, y, z); - if(te != null && (te instanceof IFluidStandardReceiver || te instanceof IFluidStandardTransceiver)) { - FluidTank[] tanks; - if (te instanceof IFluidStandardReceiver) { - tanks = ((IFluidStandardReceiver) te).getReceivingTanks(); - } else { - tanks = ((IFluidStandardTransceiver) te).getReceivingTanks(); - } + if(te != null && te instanceof IFluidStandardReceiverMK2) { + FluidTank[] tanks = ((IFluidStandardReceiverMK2) te).getReceivingTanks(); - boolean hasDrainedTank = false; - - // We need to iterate through the inventory for _each_ siphonable tank, so we can handle fluids that can only go into certain containers - // After we successfully siphon any fluid from a tank, we stop further processing, multiple fluid types require multiple clicks - for (FluidTank tank : tanks) { - if (tank.getFill() <= 0) continue; + boolean hasDrainedTank = false; - ItemStack availablePipette = null; - FluidType tankType = tank.getTankType(); + // We need to iterate through the inventory for _each_ siphonable + // tank, so we can handle fluids that can only go into certain containers + // After we successfully siphon any fluid from a tank, we stop + // further processing, multiple fluid types require multiple clicks + for(FluidTank tank : tanks) { + if(tank.getFill() <= 0) + continue; - if (tankType.hasTrait(FT_Unsiphonable.class)) continue; + ItemStack availablePipette = null; + FluidType tankType = tank.getTankType(); - for (int j = 0; j < player.inventory.mainInventory.length; j++) { - ItemStack inventoryStack = player.inventory.mainInventory[j]; - if (inventoryStack == null) continue; + if(tankType.hasTrait(FT_Unsiphonable.class)) + continue; - FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack); + for(int j = 0; j < player.inventory.mainInventory.length; j++) { + ItemStack inventoryStack = player.inventory.mainInventory[j]; + if(inventoryStack == null) + continue; - if (availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) { - ItemPipette pipette = (ItemPipette) inventoryStack.getItem(); - if (!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now - availablePipette = inventoryStack; - } - } + FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack); - if (container == null) continue; + if(availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) { + ItemPipette pipette = (ItemPipette) inventoryStack.getItem(); + if(!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now + availablePipette = inventoryStack; + } + } - ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType); + if(container == null) + continue; - while (tank.getFill() >= container.content && inventoryStack.stackSize > 0) { - hasDrainedTank = true; + ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType); - inventoryStack.stackSize--; - if (inventoryStack.stackSize <= 0) { - player.inventory.mainInventory[j] = null; - } + while(tank.getFill() >= container.content && inventoryStack.stackSize > 0) { + hasDrainedTank = true; - ItemStack filledContainer = full.copy(); - tank.setFill(tank.getFill() - container.content); - player.inventory.addItemStackToInventory(filledContainer); - } - } + inventoryStack.stackSize--; + if(inventoryStack.stackSize <= 0) { + player.inventory.mainInventory[j] = null; + } - // If the remainder of the tank can only fit into a pipette, fill a pipette with the remainder - // Will not auto-fill fizzlable pipettes, there is no feedback for the fizzle in this case, and that's a touch too unfair - if (availablePipette != null && tank.getFill() < 1000) { - ItemPipette pipette = (ItemPipette) availablePipette.getItem(); - - if (pipette.acceptsFluid(tankType, availablePipette)) { - hasDrainedTank = true; - tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette)); - } - } + ItemStack filledContainer = full.copy(); + tank.setFill(tank.getFill() - container.content); + player.inventory.addItemStackToInventory(filledContainer); + } + } - if (hasDrainedTank) return true; - } + // If the remainder of the tank can only fit into a pipette, + // fill a pipette with the remainder + // Will not auto-fill fizzlable pipettes, there is no feedback + // for the fizzle in this case, and that's a touch too unfair + if(availablePipette != null && tank.getFill() < 1000) { + ItemPipette pipette = (ItemPipette) availablePipette.getItem(); + + if(pipette.acceptsFluid(tankType, availablePipette)) { + hasDrainedTank = true; + tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette)); + } + } + + if(hasDrainedTank) + return true; + } } return false; } - + } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index e055c2b6b..589938c88 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -291,14 +291,11 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); - - if(!( - canHarvestBlock(block, stack) || - canShearBlock(block, stack, world, x, y, z)) || - block.getPlayerRelativeBlockHardness(player, world, x, y, z) < 0 || - block == ModBlocks.stone_keyhole - ) - return; + + if(!(canHarvestBlock(block, stack) || + canShearBlock(block, stack, world, x, y, z)) || + (block.getBlockHardness(world, x, y, z) == -1.0F && block.getPlayerRelativeBlockHardness(player, world, x, y, z) == 0.0F) || + block == ModBlocks.stone_keyhole) return; Block refBlock = world.getBlock(refX, refY, refZ); float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index b49292c78..0b835d173 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -383,7 +383,6 @@ public class LegoClient { RenderArcFurnace.fullbright(true); double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); - double col = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted + interp) / (double) bullet.getBulletConfig().expires, 0, 1); GL11.glPushMatrix(); GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 88a7441c7..b07736bff 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1030,14 +1030,19 @@ public class ModEventHandlerClient { public static boolean renderLodeStar = false; public static long lastStarCheck = 0L; + public static long lastLoadScreenReplacement = 0L; @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTickLast(ClientTickEvent event) { Minecraft mc = Minecraft.getMinecraft(); - if(!(mc.loadingScreen instanceof LoadingScreenRendererNT)) { + long millis = Clock.get_ms(); + if(millis == 0) millis = System.currentTimeMillis(); + + if(GeneralConfig.enableLoadScreenReplacement && !(mc.loadingScreen instanceof LoadingScreenRendererNT) && millis > lastLoadScreenReplacement + 10_000) { mc.loadingScreen = new LoadingScreenRendererNT(mc); + lastLoadScreenReplacement = millis; } if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { @@ -1067,7 +1072,6 @@ public class ModEventHandlerClient { } EntityPlayer player = mc.thePlayer; - long millis = Clock.get_ms(); if(lastStarCheck + 200 < millis) { renderLodeStar = false; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index b474ce248..e7ce296c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -49,7 +49,7 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements public long power = 0; public int sulfur = 0; - public static final int maxSulfur = 100; + public static final int maxSulfur = 10; public static final long maxPower = 1000; public FluidTank[] tanks; diff --git a/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png b/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc1a618fbdeb03988bab626b0a89b3c3d323850 GIT binary patch literal 3249 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 XwiWEu161H21mtw$^zo<1&L{sHLB7>N literal 0 HcmV?d00001 From ba220420fed5c441385ec7cc609f9bffe1fb5a61 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 6 Jul 2025 22:35:26 +0200 Subject: [PATCH 072/323] the sludge --- changelog | 7 +- gradle.properties | 2 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 4 +- .../TileEntityMachineChemicalFactory.java | 6 + .../hbm/models/machines/assembly_machine.obj | 4650 +++++++++++++++++ .../models/machines/assembly_machine.png | Bin 3249 -> 2748 bytes 7 files changed, 4667 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/machines/assembly_machine.obj diff --git a/changelog b/changelog index 8226bc9a5..666ddeaaa 100644 --- a/changelog +++ b/changelog @@ -11,4 +11,9 @@ * Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled * Fixed NTM adding mob spawns to the mushroom island * Fixed line break not working on the tip of the day -* Fixed an issue where AoE abilities can break bedrock \ No newline at end of file +* Fixed an issue where AoE abilities can break bedrock +* Fixed chemical factory not saving its water and steam tanks +* Fixed siphon not working with some newer machines due to using legacy API +* Potentially fixed an incompatibility with Aether due to the loading screen replacement + * The loading screen replacement will only run up to 25 times per session, with a fixed delay of 5 seconds minimum + * The loading screen replacement can be disabled completely in the config \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ba4279e7d..681ea595b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5378 +mod_build_number=5383 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 65c4c2319..f3db74449 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5378)"; + public static final String VERSION = "1.0.27 BETA (5383)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index b07736bff..ea71876e6 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1031,6 +1031,7 @@ public class ModEventHandlerClient { public static boolean renderLodeStar = false; public static long lastStarCheck = 0L; public static long lastLoadScreenReplacement = 0L; + public static int loadingScreenReplacementRetry = 0; @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) @@ -1040,9 +1041,10 @@ public class ModEventHandlerClient { long millis = Clock.get_ms(); if(millis == 0) millis = System.currentTimeMillis(); - if(GeneralConfig.enableLoadScreenReplacement && !(mc.loadingScreen instanceof LoadingScreenRendererNT) && millis > lastLoadScreenReplacement + 10_000) { + if(GeneralConfig.enableLoadScreenReplacement && loadingScreenReplacementRetry < 25 && !(mc.loadingScreen instanceof LoadingScreenRendererNT) && millis > lastLoadScreenReplacement + 5_000) { mc.loadingScreen = new LoadingScreenRendererNT(mc); lastLoadScreenReplacement = millis; + loadingScreenReplacementRetry++; // this might not do anything, but at least it should prevent a metric fuckton of framebuffers from being created } if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index e7695b078..655947212 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -314,6 +314,9 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].readFromNBT(nbt, "i" + i); for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].readFromNBT(nbt, "i" + i); + this.water.readFromNBT(nbt, "w"); + this.lps.readFromNBT(nbt, "s"); + this.power = nbt.getLong("power"); this.maxPower = nbt.getLong("maxPower"); for(int i = 0; i < 4; i++) this.chemplantModule[i].readFromNBT(nbt); @@ -326,6 +329,9 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].writeToNBT(nbt, "i" + i); for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].writeToNBT(nbt, "i" + i); + this.water.writeToNBT(nbt, "w"); + this.lps.writeToNBT(nbt, "s"); + nbt.setLong("power", power); nbt.setLong("maxPower", maxPower); for(int i = 0; i < 4; i++) this.chemplantModule[i].writeToNBT(nbt); diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj new file mode 100644 index 000000000..52d865f16 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -0,0 +1,4650 @@ +# Blender v2.79 (sub 0) OBJ File: 'assembler.blend' +# www.blender.org +o Ring +v -0.000000 1.250000 -1.375000 +v -0.526190 1.250000 -1.270334 +v -0.972272 1.250000 -0.972272 +v -1.270334 1.250000 -0.526190 +v -1.375000 1.250000 0.000000 +v -1.270334 1.250000 0.526190 +v -0.972272 1.250000 0.972272 +v -0.526190 1.250000 1.270334 +v -0.000000 1.250000 1.375000 +v 0.526189 1.250000 1.270334 +v 0.972271 1.250000 0.972272 +v 1.270334 1.250000 0.526190 +v 1.375000 1.250000 0.000000 +v 1.270334 1.250000 -0.526190 +v 0.972271 1.250000 -0.972272 +v 0.526189 1.250000 -1.270335 +v -0.000000 1.500000 -1.375000 +v -0.526190 1.500000 -1.270334 +v -0.972272 1.500000 -0.972272 +v -1.270334 1.500000 -0.526190 +v -1.375000 1.500000 0.000000 +v -1.270334 1.500000 0.526190 +v -0.972272 1.500000 0.972272 +v -0.526190 1.500000 1.270334 +v -0.000000 1.500000 1.375000 +v 0.526189 1.500000 1.270334 +v 0.972271 1.500000 0.972272 +v 1.270334 1.500000 0.526190 +v 1.375000 1.500000 0.000000 +v 1.270334 1.500000 -0.526190 +v 0.972271 1.500000 -0.972272 +v 0.526189 1.500000 -1.270335 +v -0.000000 1.500000 -1.250000 +v -0.478355 1.500000 -1.154850 +v -0.883884 1.500000 -0.883883 +v -1.154850 1.500000 -0.478354 +v -1.250000 1.500000 0.000000 +v -1.154850 1.500000 0.478354 +v -0.883884 1.500000 0.883883 +v -0.478355 1.500000 1.154850 +v -0.000000 1.500000 1.250000 +v 0.478354 1.500000 1.154850 +v 0.883883 1.500000 0.883884 +v 1.154849 1.500000 0.478354 +v 1.250000 1.500000 0.000000 +v 1.154849 1.500000 -0.478354 +v 0.883883 1.500000 -0.883884 +v 0.478354 1.500000 -1.154850 +v -0.000000 1.375000 -1.250000 +v -0.478355 1.375000 -1.154850 +v -0.883884 1.375000 -0.883883 +v -1.154850 1.375000 -0.478354 +v -1.250000 1.375000 0.000000 +v -1.154850 1.375000 0.478354 +v -0.883884 1.375000 0.883883 +v -0.478355 1.375000 1.154850 +v -0.000000 1.375000 1.250000 +v 0.478354 1.375000 1.154850 +v 0.883883 1.375000 0.883884 +v 1.154849 1.375000 0.478354 +v 1.250000 1.375000 0.000000 +v 1.154849 1.375000 -0.478354 +v 0.883883 1.375000 -0.883884 +v 0.478354 1.375000 -1.154850 +v -0.000000 1.375000 -1.125000 +v -0.430519 1.375000 -1.039364 +v -0.795495 1.375000 -0.795495 +v -1.039365 1.375000 -0.430519 +v -1.125000 1.375000 0.000000 +v -1.039365 1.375000 0.430519 +v -0.795495 1.375000 0.795495 +v -0.430519 1.375000 1.039364 +v -0.000000 1.375000 1.125000 +v 0.430518 1.375000 1.039365 +v 0.795495 1.375000 0.795496 +v 1.039364 1.375000 0.430519 +v 1.125000 1.375000 0.000000 +v 1.039364 1.375000 -0.430519 +v 0.795495 1.375000 -0.795496 +v 0.430518 1.375000 -1.039365 +v -0.000000 1.250000 -1.125000 +v -0.430519 1.250000 -1.039364 +v -0.795495 1.250000 -0.795495 +v -1.039365 1.250000 -0.430519 +v -1.125000 1.250000 0.000000 +v -1.039365 1.250000 0.430519 +v -0.795495 1.250000 0.795495 +v -0.430519 1.250000 1.039364 +v -0.000000 1.250000 1.125000 +v 0.430518 1.250000 1.039365 +v 0.795495 1.250000 0.795496 +v 1.039364 1.250000 0.430519 +v 1.125000 1.250000 0.000000 +v 1.039364 1.250000 -0.430519 +v 0.795495 1.250000 -0.795496 +v 0.430518 1.250000 -1.039365 +v -0.093750 1.250000 -0.812500 +v 0.093750 1.250000 -0.812500 +v -0.093750 1.250000 -1.437500 +v 0.093750 1.250000 -1.437500 +v -0.093750 1.625000 -1.437500 +v -0.093750 1.625000 -0.812500 +v 0.093750 1.625000 -0.812500 +v 0.093750 1.625000 -1.437500 +v -0.000000 1.625000 -1.062500 +v 0.125000 1.625000 -1.062500 +v -0.000000 1.536612 -1.025888 +v 0.125000 1.536612 -1.025888 +v -0.000000 1.500000 -0.937500 +v 0.125000 1.500000 -0.937500 +v -0.000000 1.536612 -0.849112 +v 0.125000 1.536612 -0.849112 +v -0.000000 1.625000 -0.812500 +v 0.125000 1.625000 -0.812500 +v -0.000000 1.713388 -0.849112 +v 0.125000 1.713388 -0.849112 +v -0.000000 1.750000 -0.937500 +v 0.125000 1.750000 -0.937500 +v -0.000000 1.713388 -1.025888 +v 0.125000 1.713388 -1.025888 +v 0.062499 1.625000 -1.375000 +v -0.062501 1.625000 -1.375000 +v 0.062499 1.625000 -1.250000 +v -0.062501 1.625000 -1.250000 +v 0.062499 1.750000 -1.250000 +v 0.062499 1.750000 -1.375000 +v -0.062501 1.750000 -1.375000 +v -0.062501 1.750000 -1.250000 +v 0.093750 1.250000 0.812500 +v -0.093750 1.250000 0.812500 +v 0.093750 1.250000 1.437500 +v -0.093750 1.250000 1.437500 +v 0.093750 1.625000 1.437500 +v 0.093750 1.625000 0.812500 +v -0.093750 1.625000 0.812500 +v -0.093750 1.625000 1.437500 +v 0.000000 1.625000 1.062500 +v -0.125000 1.625000 1.062500 +v 0.000000 1.536612 1.025888 +v -0.125000 1.536612 1.025888 +v 0.000000 1.500000 0.937500 +v -0.125000 1.500000 0.937500 +v 0.000000 1.536612 0.849112 +v -0.125000 1.536612 0.849112 +v 0.000000 1.625000 0.812500 +v -0.125000 1.625000 0.812500 +v 0.000000 1.713388 0.849112 +v -0.125000 1.713388 0.849112 +v 0.000000 1.750000 0.937500 +v -0.125000 1.750000 0.937500 +v 0.000000 1.713388 1.025888 +v -0.125000 1.713388 1.025888 +v -0.062499 1.625000 1.375000 +v 0.062501 1.625000 1.375000 +v -0.062499 1.625000 1.250000 +v 0.062501 1.625000 1.250000 +v -0.062499 1.750000 1.250000 +v -0.062499 1.750000 1.375000 +v 0.062501 1.750000 1.375000 +v 0.062501 1.750000 1.250000 +vt 0.315789 0.222222 +vt 0.368421 0.240741 +vt 0.315789 0.240741 +vt 0.368421 0.222222 +vt 0.421053 0.240741 +vt 0.473684 0.222222 +vt 0.421053 0.222222 +vt 0.526316 0.222222 +vt 0.473684 0.240741 +vt 0.578947 0.222222 +vt 0.526316 0.240741 +vt 0.631579 0.222222 +vt 0.578947 0.240741 +vt 0.684211 0.222222 +vt 0.631579 0.240741 +vt 0.736842 0.222222 +vt 0.684211 0.240741 +vt 0.789474 0.222222 +vt 0.736842 0.240741 +vt 0.842105 0.222222 +vt 0.789474 0.240741 +vt 0.052632 0.222222 +vt 0.000000 0.240741 +vt -0.000000 0.222222 +vt 0.105263 0.240741 +vt 0.052632 0.240741 +vt 0.105263 0.222222 +vt 0.157895 0.240741 +vt 0.157895 0.222222 +vt 0.210526 0.240741 +vt 0.210526 0.222222 +vt 0.263158 0.240741 +vt 0.263158 0.222222 +vt 0.210526 0.259259 +vt 0.263158 0.277778 +vt 0.217105 0.277778 +vt 0.157895 0.259259 +vt 0.210526 0.277778 +vt 0.164474 0.277778 +vt 0.105263 0.259259 +vt 0.157895 0.277778 +vt 0.111842 0.277778 +vt 0.052632 0.259259 +vt 0.105263 0.277778 +vt 0.059211 0.277778 +vt -0.000000 0.259259 +vt 0.052632 0.277778 +vt 0.006579 0.277778 +vt 0.842105 0.259259 +vt 0.796053 0.277778 +vt 0.789474 0.259259 +vt 0.736842 0.259259 +vt 0.789474 0.277778 +vt 0.743421 0.277778 +vt 0.690789 0.277778 +vt 0.684211 0.259259 +vt 0.638158 0.277778 +vt 0.631579 0.259259 +vt 0.585526 0.277778 +vt 0.578947 0.259259 +vt 0.532895 0.277778 +vt 0.526316 0.259259 +vt 0.480263 0.277778 +vt 0.473684 0.259259 +vt 0.427632 0.277778 +vt 0.421053 0.259259 +vt 0.375000 0.277778 +vt 0.368421 0.259259 +vt 0.315789 0.259259 +vt 0.368421 0.277778 +vt 0.322368 0.277778 +vt 0.263158 0.259259 +vt 0.315789 0.277778 +vt 0.269737 0.277778 +vt 0.263158 0.185185 +vt 0.315789 0.148148 +vt 0.315789 0.185185 +vt 0.210526 0.185185 +vt 0.263158 0.148148 +vt 0.157895 0.185185 +vt 0.210526 0.148148 +vt 0.105263 0.185185 +vt 0.157895 0.148148 +vt 0.052632 0.185185 +vt 0.105263 0.148148 +vt 0.000000 0.185185 +vt 0.052632 0.148148 +vt 0.796053 0.148148 +vt 0.842105 0.185185 +vt 0.789474 0.185185 +vt 0.743421 0.148148 +vt 0.736842 0.185185 +vt 0.690789 0.148148 +vt 0.684211 0.185185 +vt 0.638158 0.148148 +vt 0.631579 0.185185 +vt 0.585526 0.148148 +vt 0.578947 0.185185 +vt 0.532895 0.148148 +vt 0.526316 0.185185 +vt 0.480263 0.148148 +vt 0.473684 0.185185 +vt 0.427632 0.148148 +vt 0.421053 0.185185 +vt 0.375000 0.148148 +vt 0.368421 0.185185 +vt 0.368421 0.148148 +vt 0.861842 0.490741 +vt 0.796053 0.518519 +vt 0.796053 0.490741 +vt 0.796053 0.574074 +vt 0.861842 0.601852 +vt 0.796053 0.601852 +vt 0.776316 0.574074 +vt 0.776316 0.518519 +vt 0.861842 0.518519 +vt 0.947368 0.518519 +vt 0.881579 0.574074 +vt 0.881579 0.518519 +vt 0.861842 0.574074 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.907895 0.481481 +vt 0.894737 0.462963 +vt 0.907895 0.462963 +vt 0.921053 0.444444 +vt 0.907895 0.444444 +vt 0.934211 0.444444 +vt 0.921053 0.462963 +vt 0.894737 0.444444 +vt 0.947368 0.444444 +vt 0.934211 0.462963 +vt 0.861842 0.490741 +vt 0.796053 0.518519 +vt 0.796053 0.490741 +vt 0.796053 0.574074 +vt 0.861842 0.601852 +vt 0.796053 0.601852 +vt 0.776316 0.574074 +vt 0.776316 0.518519 +vt 0.861842 0.518519 +vt 0.947368 0.518519 +vt 0.881579 0.574074 +vt 0.881579 0.518519 +vt 0.861842 0.574074 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.907895 0.481481 +vt 0.894737 0.462963 +vt 0.907895 0.462963 +vt 0.921053 0.444444 +vt 0.907895 0.444444 +vt 0.934211 0.444444 +vt 0.921053 0.462963 +vt 0.894737 0.444444 +vt 0.947368 0.444444 +vt 0.934211 0.462963 +vt 0.842105 0.240741 +vt 0.842105 0.277778 +vt 0.736842 0.277778 +vt 0.684211 0.277778 +vt 0.631579 0.277778 +vt 0.578947 0.277778 +vt 0.526316 0.277778 +vt 0.473684 0.277778 +vt 0.421053 0.277778 +vt 0.269737 0.148148 +vt 0.217105 0.148148 +vt 0.164474 0.148148 +vt 0.111842 0.148148 +vt 0.059211 0.148148 +vt 0.006579 0.148148 +vt 0.842105 0.148148 +vt 0.789474 0.148148 +vt 0.736842 0.148148 +vt 0.684211 0.148148 +vt 0.631579 0.148148 +vt 0.578947 0.148148 +vt 0.526316 0.148148 +vt 0.473684 0.148148 +vt 0.421053 0.148148 +vt 0.322368 0.148148 +vt 0.947368 0.574074 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.894737 0.481481 +vt 0.947368 0.462963 +vt 0.947368 0.574074 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.894737 0.481481 +vt 0.947368 0.462963 +vt 0.322368 0.296296 +vt 0.796053 0.296296 +vt 0.375000 0.296296 +vt 0.006579 0.296296 +vt 0.427632 0.296296 +vt 0.059211 0.296296 +vt 0.480263 0.296296 +vt 0.111842 0.296296 +vt 0.532895 0.296296 +vt 0.164474 0.296296 +vt 0.638158 0.296296 +vt 0.585526 0.296296 +vt 0.217105 0.296296 +vt 0.690789 0.296296 +vt 0.269737 0.296296 +vt 0.743421 0.296296 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.789474 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.368421 0.296296 +vt 0.842105 0.296296 +vt 0.421053 0.296296 +vt 0.052632 0.296296 +vt 0.473684 0.296296 +vt 0.105263 0.296296 +vt 0.526316 0.296296 +vt 0.157895 0.296296 +vt 0.578947 0.296296 +vt 0.210526 0.296296 +vt 0.684211 0.296296 +vt 0.631579 0.296296 +vt 0.263158 0.296296 +vt 0.736842 0.296296 +vt 0.315789 0.296296 +vt 0.789474 0.296296 +vt 0.789474 0.574074 +vt 0.776316 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn -0.3827 0.0000 -0.9239 +vn 0.3827 0.0000 0.9239 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.9239 0.0000 -0.3827 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 27/1/1 44/2/1 43/3/1 +f 28/4/1 45/5/1 44/2/1 +f 30/6/1 45/5/1 29/7/1 +f 31/8/1 46/9/1 30/6/1 +f 32/10/1 47/11/1 31/8/1 +f 17/12/1 48/13/1 32/10/1 +f 18/14/1 33/15/1 17/12/1 +f 19/16/1 34/17/1 18/14/1 +f 20/18/1 35/19/1 19/16/1 +f 21/20/1 36/21/1 20/18/1 +f 22/22/1 37/23/1 21/24/1 +f 22/22/1 39/25/1 38/26/1 +f 23/27/1 40/28/1 39/25/1 +f 24/29/1 41/30/1 40/28/1 +f 25/31/1 42/32/1 41/30/1 +f 26/33/1 43/3/1 42/32/1 +f 57/34/1 74/35/1 73/36/1 +f 56/37/1 73/38/1 72/39/1 +f 55/40/1 72/41/1 71/42/1 +f 54/43/1 71/44/1 70/45/1 +f 53/46/1 70/47/1 69/48/1 +f 53/49/1 68/50/1 52/51/1 +f 51/52/1 68/53/1 67/54/1 +f 51/52/1 66/55/1 50/56/1 +f 50/56/1 65/57/1 49/58/1 +f 49/58/1 80/59/1 64/60/1 +f 64/60/1 79/61/1 63/62/1 +f 63/62/1 78/63/1 62/64/1 +f 62/64/1 77/65/1 61/66/1 +f 61/66/1 76/67/1 60/68/1 +f 59/69/1 76/70/1 75/71/1 +f 58/72/1 75/73/1 74/74/1 +f 10/75/2 91/76/2 11/77/2 +f 9/78/2 90/79/2 10/75/2 +f 8/80/2 89/81/2 9/78/2 +f 7/82/2 88/83/2 8/80/2 +f 6/84/2 87/85/2 7/82/2 +f 5/86/2 86/87/2 6/84/2 +f 84/88/2 5/89/2 4/90/2 +f 83/91/2 4/90/2 3/92/2 +f 82/93/2 3/92/2 2/94/2 +f 81/95/2 2/94/2 1/96/2 +f 96/97/2 1/96/2 16/98/2 +f 95/99/2 16/98/2 15/100/2 +f 94/101/2 15/100/2 14/102/2 +f 93/103/2 14/102/2 13/104/2 +f 92/105/2 13/104/2 12/106/2 +f 11/77/2 92/107/2 12/106/2 +f 99/108/2 98/109/2 97/110/2 +f 103/111/1 101/112/1 102/113/1 +f 98/109/3 102/114/3 97/115/3 +f 100/116/4 103/111/4 98/109/4 +f 97/117/5 101/118/5 99/119/5 +f 99/119/6 104/120/6 100/116/6 +f 118/121/4 114/122/4 110/123/4 +f 119/124/5 107/125/5 111/126/5 +f 127/127/1 125/128/1 126/129/1 +f 122/130/6 126/129/6 121/131/6 +f 124/132/5 127/133/5 122/130/5 +f 121/131/4 125/128/4 123/134/4 +f 123/135/3 128/136/3 124/132/3 +f 131/137/2 130/138/2 129/139/2 +f 135/140/1 133/141/1 134/142/1 +f 130/138/6 134/143/6 129/144/6 +f 132/145/5 135/140/5 130/138/5 +f 129/146/4 133/147/4 131/148/4 +f 131/148/3 136/149/3 132/145/3 +f 150/150/5 146/151/5 142/152/5 +f 151/153/4 139/154/4 143/155/4 +f 159/156/1 157/157/1 158/158/1 +f 154/159/3 158/158/3 153/160/3 +f 156/161/4 159/162/4 154/159/4 +f 153/160/5 157/157/5 155/163/5 +f 155/164/6 160/165/6 156/161/6 +f 27/1/1 28/4/1 44/2/1 +f 28/4/1 29/7/1 45/5/1 +f 30/6/1 46/9/1 45/5/1 +f 31/8/1 47/11/1 46/9/1 +f 32/10/1 48/13/1 47/11/1 +f 17/12/1 33/15/1 48/13/1 +f 18/14/1 34/17/1 33/15/1 +f 19/16/1 35/19/1 34/17/1 +f 20/18/1 36/21/1 35/19/1 +f 21/20/1 37/166/1 36/21/1 +f 22/22/1 38/26/1 37/23/1 +f 22/22/1 23/27/1 39/25/1 +f 23/27/1 24/29/1 40/28/1 +f 24/29/1 25/31/1 41/30/1 +f 25/31/1 26/33/1 42/32/1 +f 26/33/1 27/1/1 43/3/1 +f 57/34/1 58/72/1 74/35/1 +f 56/37/1 57/34/1 73/38/1 +f 55/40/1 56/37/1 72/41/1 +f 54/43/1 55/40/1 71/44/1 +f 53/46/1 54/43/1 70/47/1 +f 53/49/1 69/167/1 68/50/1 +f 51/52/1 52/51/1 68/53/1 +f 51/52/1 67/168/1 66/55/1 +f 50/56/1 66/169/1 65/57/1 +f 49/58/1 65/170/1 80/59/1 +f 64/60/1 80/171/1 79/61/1 +f 63/62/1 79/172/1 78/63/1 +f 62/64/1 78/173/1 77/65/1 +f 61/66/1 77/174/1 76/67/1 +f 59/69/1 60/68/1 76/70/1 +f 58/72/1 59/69/1 75/73/1 +f 10/75/2 90/175/2 91/76/2 +f 9/78/2 89/176/2 90/79/2 +f 8/80/2 88/177/2 89/81/2 +f 7/82/2 87/178/2 88/83/2 +f 6/84/2 86/179/2 87/85/2 +f 5/86/2 85/180/2 86/87/2 +f 84/88/2 85/181/2 5/89/2 +f 83/91/2 84/182/2 4/90/2 +f 82/93/2 83/183/2 3/92/2 +f 81/95/2 82/184/2 2/94/2 +f 96/97/2 81/185/2 1/96/2 +f 95/99/2 96/186/2 16/98/2 +f 94/101/2 95/187/2 15/100/2 +f 93/103/2 94/188/2 14/102/2 +f 92/105/2 93/189/2 13/104/2 +f 11/77/2 91/190/2 92/107/2 +f 99/108/2 100/116/2 98/109/2 +f 103/111/1 104/120/1 101/112/1 +f 98/109/3 103/111/3 102/114/3 +f 100/116/4 104/120/4 103/111/4 +f 97/117/5 102/191/5 101/118/5 +f 99/119/6 101/118/6 104/120/6 +f 110/123/4 108/192/4 106/193/4 +f 106/193/4 120/194/4 110/123/4 +f 120/194/4 118/121/4 110/123/4 +f 118/121/4 116/195/4 114/122/4 +f 114/122/4 112/196/4 110/123/4 +f 119/124/5 105/197/5 107/125/5 +f 107/125/5 109/198/5 111/126/5 +f 111/126/5 113/199/5 119/124/5 +f 113/199/5 115/200/5 119/124/5 +f 115/200/5 117/201/5 119/124/5 +f 127/127/1 128/202/1 125/128/1 +f 122/130/6 127/133/6 126/129/6 +f 124/132/5 128/136/5 127/133/5 +f 121/131/4 126/129/4 125/128/4 +f 123/135/3 125/203/3 128/136/3 +f 131/137/2 132/145/2 130/138/2 +f 135/140/1 136/149/1 133/141/1 +f 130/138/6 135/140/6 134/143/6 +f 132/145/5 136/149/5 135/140/5 +f 129/146/4 134/204/4 133/147/4 +f 131/148/3 133/147/3 136/149/3 +f 142/152/5 140/205/5 138/206/5 +f 138/206/5 152/207/5 142/152/5 +f 152/207/5 150/150/5 142/152/5 +f 150/150/5 148/208/5 146/151/5 +f 146/151/5 144/209/5 142/152/5 +f 151/153/4 137/210/4 139/154/4 +f 139/154/4 141/211/4 143/155/4 +f 143/155/4 145/212/4 151/153/4 +f 145/212/4 147/213/4 151/153/4 +f 147/213/4 149/214/4 151/153/4 +f 159/156/1 160/215/1 157/157/1 +f 154/159/3 159/162/3 158/158/3 +f 156/161/4 160/165/4 159/162/4 +f 153/160/5 158/158/5 157/157/5 +f 155/164/6 157/216/6 160/165/6 +s 1 +f 13/104/4 28/4/7 12/106/7 +f 6/84/8 21/24/5 5/86/5 +f 14/102/9 29/7/4 13/104/4 +f 7/82/10 22/22/8 6/84/8 +f 15/100/11 30/6/9 14/102/9 +f 8/80/12 23/27/10 7/82/10 +f 16/98/13 31/8/11 15/100/11 +f 9/78/3 24/29/12 8/80/12 +f 2/94/14 17/12/6 1/96/6 +f 1/96/6 32/10/13 16/98/13 +f 10/75/15 25/31/3 9/78/3 +f 3/92/16 18/14/14 2/94/14 +f 11/77/17 26/33/15 10/75/15 +f 4/90/18 19/16/16 3/92/16 +f 12/106/7 27/1/17 11/77/17 +f 5/89/5 20/18/18 4/90/18 +f 34/17/15 49/58/3 33/15/3 +f 33/15/3 64/60/12 48/13/12 +f 42/32/14 57/34/6 41/30/6 +f 35/19/17 50/56/15 34/17/15 +f 43/3/16 58/72/14 42/32/14 +f 36/21/7 51/52/17 35/19/17 +f 44/2/18 59/69/16 43/3/16 +f 37/166/4 52/51/7 36/21/7 +f 45/5/5 60/68/18 44/2/18 +f 38/26/9 53/46/4 37/23/4 +f 46/9/8 61/66/5 45/5/5 +f 39/25/11 54/43/9 38/26/9 +f 47/11/10 62/64/8 46/9/8 +f 40/28/13 55/40/11 39/25/11 +f 48/13/12 63/62/10 47/11/10 +f 41/30/6 56/37/13 40/28/13 +f 76/70/18 91/217/16 75/71/16 +f 69/167/4 84/218/7 68/50/7 +f 77/174/5 92/219/18 76/67/18 +f 70/47/9 85/220/4 69/48/4 +f 78/173/8 93/221/5 77/65/5 +f 71/44/11 86/222/9 70/45/9 +f 79/172/10 94/223/8 78/63/8 +f 72/41/13 87/224/11 71/42/11 +f 80/171/12 95/225/10 79/61/10 +f 73/38/6 88/226/13 72/39/13 +f 66/169/15 81/227/3 65/57/3 +f 65/170/3 96/228/12 80/59/12 +f 74/35/14 89/229/6 73/36/6 +f 67/168/17 82/230/15 66/55/15 +f 75/73/16 90/231/14 74/74/14 +f 68/53/7 83/232/17 67/54/17 +f 106/233/6 107/234/19 105/235/6 +f 108/236/19 109/237/2 107/234/19 +f 110/238/2 111/239/20 109/240/2 +f 112/241/20 113/242/3 111/239/20 +f 114/243/3 115/244/21 113/242/3 +f 116/245/21 117/246/1 115/244/21 +f 118/247/1 119/248/22 117/246/1 +f 120/249/22 105/235/6 119/248/22 +f 138/250/3 139/251/20 137/252/3 +f 139/251/20 142/253/2 141/254/2 +f 142/255/2 143/256/19 141/257/2 +f 144/258/19 145/259/6 143/256/19 +f 146/260/6 147/261/22 145/259/6 +f 148/262/22 149/263/1 147/261/22 +f 150/264/1 151/265/21 149/263/1 +f 152/266/21 137/252/3 151/265/21 +f 13/104/4 29/7/4 28/4/7 +f 6/84/8 22/22/8 21/24/5 +f 14/102/9 30/6/9 29/7/4 +f 7/82/10 23/27/10 22/22/8 +f 15/100/11 31/8/11 30/6/9 +f 8/80/12 24/29/12 23/27/10 +f 16/98/13 32/10/13 31/8/11 +f 9/78/3 25/31/3 24/29/12 +f 2/94/14 18/14/14 17/12/6 +f 1/96/6 17/12/6 32/10/13 +f 10/75/15 26/33/15 25/31/3 +f 3/92/16 19/16/16 18/14/14 +f 11/77/17 27/1/17 26/33/15 +f 4/90/18 20/18/18 19/16/16 +f 12/106/7 28/4/7 27/1/17 +f 5/89/5 21/20/5 20/18/18 +f 34/17/15 50/56/15 49/58/3 +f 33/15/3 49/58/3 64/60/12 +f 42/32/14 58/72/14 57/34/6 +f 35/19/17 51/52/17 50/56/15 +f 43/3/16 59/69/16 58/72/14 +f 36/21/7 52/51/7 51/52/17 +f 44/2/18 60/68/18 59/69/16 +f 37/166/4 53/49/4 52/51/7 +f 45/5/5 61/66/5 60/68/18 +f 38/26/9 54/43/9 53/46/4 +f 46/9/8 62/64/8 61/66/5 +f 39/25/11 55/40/11 54/43/9 +f 47/11/10 63/62/10 62/64/8 +f 40/28/13 56/37/13 55/40/11 +f 48/13/12 64/60/12 63/62/10 +f 41/30/6 57/34/6 56/37/13 +f 76/70/18 92/267/18 91/217/16 +f 69/167/4 85/268/4 84/218/7 +f 77/174/5 93/269/5 92/219/18 +f 70/47/9 86/270/9 85/220/4 +f 78/173/8 94/271/8 93/221/5 +f 71/44/11 87/272/11 86/222/9 +f 79/172/10 95/273/10 94/223/8 +f 72/41/13 88/274/13 87/224/11 +f 80/171/12 96/275/12 95/225/10 +f 73/38/6 89/276/6 88/226/13 +f 66/169/15 82/277/15 81/227/3 +f 65/170/3 81/278/3 96/228/12 +f 74/35/14 90/279/14 89/229/6 +f 67/168/17 83/280/17 82/230/15 +f 75/73/16 91/281/16 90/231/14 +f 68/53/7 84/282/7 83/232/17 +f 106/233/6 108/236/19 107/234/19 +f 108/236/19 110/283/2 109/237/2 +f 110/238/2 112/241/20 111/239/20 +f 112/241/20 114/243/3 113/242/3 +f 114/243/3 116/245/21 115/244/21 +f 116/245/21 118/247/1 117/246/1 +f 118/247/1 120/249/22 119/248/22 +f 120/249/22 106/233/6 105/235/6 +f 138/250/3 140/284/20 139/251/20 +f 139/251/20 140/284/20 142/253/2 +f 142/255/2 144/258/19 143/256/19 +f 144/258/19 146/260/6 145/259/6 +f 146/260/6 148/262/22 147/261/22 +f 148/262/22 150/264/1 149/263/1 +f 150/264/1 152/266/21 151/265/21 +f 152/266/21 138/250/3 137/252/3 +o ArmLower1 +v 0.031250 1.625000 0.875000 +v 0.093750 1.625000 0.875000 +v 0.093750 1.625000 1.000000 +v 0.031250 1.625000 1.000000 +v 0.031250 2.375000 1.000000 +v 0.093750 2.375000 1.000000 +v 0.031250 2.375000 0.875000 +v 0.093750 2.375000 0.875000 +v 0.125000 1.625000 1.062500 +v 0.000000 1.625000 1.062500 +v 0.125000 1.536612 1.025888 +v 0.000000 1.536612 1.025888 +v 0.125000 1.500000 0.937500 +v 0.000000 1.500000 0.937500 +v 0.125000 1.536612 0.849112 +v 0.000000 1.536612 0.849112 +v 0.125000 1.625000 0.812500 +v 0.000000 1.625000 0.812500 +v 0.125000 1.713388 0.849112 +v 0.000000 1.713388 0.849112 +v 0.125000 1.750000 0.937500 +v 0.000000 1.750000 0.937500 +v 0.125000 1.713388 1.025888 +v 0.000000 1.713388 1.025888 +v 0.125000 2.375000 1.062500 +v 0.000000 2.375000 1.062500 +v 0.125000 2.286612 1.025888 +v 0.000000 2.286612 1.025888 +v 0.125000 2.250000 0.937500 +v 0.000000 2.250000 0.937500 +v 0.125000 2.286612 0.849112 +v 0.000000 2.286612 0.849112 +v 0.125000 2.375000 0.812500 +v 0.000000 2.375000 0.812500 +v 0.125000 2.463388 0.849112 +v 0.000000 2.463388 0.849112 +v 0.125000 2.500000 0.937500 +v 0.000000 2.500000 0.937500 +v 0.125000 2.463388 1.025888 +v 0.000000 2.463388 1.025888 +vt 0.763158 0.666667 +vt 0.684211 0.657407 +vt 0.763158 0.657407 +vt 0.763158 0.685185 +vt 0.684211 0.666667 +vt 0.763158 0.638889 +vt 0.684211 0.629630 +vt 0.763158 0.629630 +vt 0.684211 0.638889 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.684211 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.736842 0.574074 +vt 0.736842 0.592593 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +vt 0.723684 0.574074 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.7071 0.7071 +s off +f 163/285/23 165/286/23 164/287/23 +f 162/288/24 166/289/24 163/285/24 +f 161/290/25 168/291/25 162/292/25 +f 164/287/26 167/293/26 161/290/26 +f 182/294/26 178/295/26 174/296/26 +f 183/297/24 171/298/24 175/299/24 +f 198/300/26 194/301/26 190/302/26 +f 195/303/24 197/304/24 199/305/24 +f 163/285/23 166/289/23 165/286/23 +f 162/288/24 168/306/24 166/289/24 +f 161/290/25 167/293/25 168/291/25 +f 164/287/26 165/286/26 167/293/26 +f 174/296/26 172/307/26 170/308/26 +f 170/308/26 184/309/26 174/296/26 +f 184/309/26 182/294/26 174/296/26 +f 182/294/26 180/310/26 178/295/26 +f 178/295/26 176/311/26 174/296/26 +f 183/297/24 169/312/24 171/298/24 +f 171/298/24 173/313/24 175/299/24 +f 175/299/24 177/314/24 183/297/24 +f 177/314/24 179/315/24 183/297/24 +f 179/315/24 181/316/24 183/297/24 +f 190/302/26 188/317/26 186/318/26 +f 186/318/26 200/319/26 198/300/26 +f 198/300/26 196/320/26 194/301/26 +f 194/301/26 192/321/26 190/302/26 +f 190/302/26 186/318/26 198/300/26 +f 199/305/24 185/322/24 187/323/24 +f 187/323/24 189/324/24 199/305/24 +f 189/324/24 191/325/24 199/305/24 +f 191/325/24 193/326/24 199/305/24 +f 193/326/24 195/303/24 199/305/24 +s 1 +f 170/327/23 171/328/27 169/329/23 +f 172/330/27 173/331/28 171/328/27 +f 174/332/28 175/333/29 173/334/28 +f 176/335/29 177/336/25 175/333/29 +f 178/337/25 179/338/30 177/336/25 +f 180/339/30 181/340/31 179/338/30 +f 182/341/31 183/342/32 181/340/31 +f 184/343/32 169/329/23 183/342/32 +f 186/344/23 187/345/27 185/346/23 +f 188/347/27 189/348/28 187/345/27 +f 190/349/28 191/350/29 189/351/28 +f 192/352/29 193/353/25 191/350/29 +f 194/354/25 195/355/30 193/353/25 +f 195/355/30 198/356/31 197/357/31 +f 198/356/31 199/358/32 197/357/31 +f 200/359/32 185/346/23 199/358/32 +f 170/327/23 172/330/27 171/328/27 +f 172/330/27 174/360/28 173/331/28 +f 174/332/28 176/335/29 175/333/29 +f 176/335/29 178/337/25 177/336/25 +f 178/337/25 180/339/30 179/338/30 +f 180/339/30 182/341/31 181/340/31 +f 182/341/31 184/343/32 183/342/32 +f 184/343/32 170/327/23 169/329/23 +f 186/344/23 188/347/27 187/345/27 +f 188/347/27 190/361/28 189/348/28 +f 190/349/28 192/352/29 191/350/29 +f 192/352/29 194/354/25 193/353/25 +f 194/354/25 196/362/30 195/355/30 +f 195/355/30 196/362/30 198/356/31 +f 198/356/31 200/359/32 199/358/32 +f 200/359/32 186/344/23 185/346/23 +o ArmLower2 +v -0.031250 1.625000 -0.875000 +v -0.093750 1.625000 -0.875000 +v -0.093750 1.625000 -1.000000 +v -0.031250 1.625000 -1.000000 +v -0.031250 2.375000 -1.000000 +v -0.093750 2.375000 -1.000000 +v -0.031250 2.375000 -0.875000 +v -0.093750 2.375000 -0.875000 +v -0.125000 1.625000 -1.062500 +v -0.000000 1.625000 -1.062500 +v -0.125000 1.536612 -1.025888 +v -0.000000 1.536612 -1.025888 +v -0.125000 1.500000 -0.937500 +v -0.000000 1.500000 -0.937500 +v -0.125000 1.536612 -0.849112 +v -0.000000 1.536612 -0.849112 +v -0.125000 1.625000 -0.812500 +v -0.000000 1.625000 -0.812500 +v -0.125000 1.713388 -0.849112 +v -0.000000 1.713388 -0.849112 +v -0.125000 1.750000 -0.937500 +v -0.000000 1.750000 -0.937500 +v -0.125000 1.713388 -1.025888 +v -0.000000 1.713388 -1.025888 +v -0.125000 2.375000 -1.062500 +v -0.000000 2.375000 -1.062500 +v -0.125000 2.286612 -1.025888 +v -0.000000 2.286612 -1.025888 +v -0.125000 2.250000 -0.937500 +v -0.000000 2.250000 -0.937500 +v -0.125000 2.286612 -0.849112 +v -0.000000 2.286612 -0.849112 +v -0.125000 2.375000 -0.812500 +v -0.000000 2.375000 -0.812500 +v -0.125000 2.463388 -0.849112 +v -0.000000 2.463388 -0.849112 +v -0.125000 2.500000 -0.937500 +v -0.000000 2.500000 -0.937500 +v -0.125000 2.463388 -1.025888 +v -0.000000 2.463388 -1.025888 +vt 0.763158 0.666667 +vt 0.684211 0.657407 +vt 0.763158 0.657407 +vt 0.763158 0.685185 +vt 0.684211 0.666667 +vt 0.763158 0.638889 +vt 0.684211 0.629630 +vt 0.763158 0.629630 +vt 0.684211 0.638889 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.684211 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +s off +f 203/363/33 205/364/33 204/365/33 +f 202/366/34 206/367/34 203/363/34 +f 201/368/35 208/369/35 202/370/35 +f 204/365/36 207/371/36 201/368/36 +f 222/372/36 218/373/36 214/374/36 +f 223/375/34 211/376/34 215/377/34 +f 238/378/36 234/379/36 230/380/36 +f 235/381/34 237/382/34 239/383/34 +f 203/363/33 206/367/33 205/364/33 +f 202/366/34 208/384/34 206/367/34 +f 201/368/35 207/371/35 208/369/35 +f 204/365/36 205/364/36 207/371/36 +f 214/374/36 212/385/36 210/386/36 +f 210/386/36 224/387/36 214/374/36 +f 224/387/36 222/372/36 214/374/36 +f 222/372/36 220/388/36 218/373/36 +f 218/373/36 216/389/36 214/374/36 +f 223/375/34 209/390/34 211/376/34 +f 211/376/34 213/391/34 215/377/34 +f 215/377/34 217/392/34 223/375/34 +f 217/392/34 219/393/34 223/375/34 +f 219/393/34 221/394/34 223/375/34 +f 230/380/36 228/395/36 226/396/36 +f 226/396/36 240/397/36 238/378/36 +f 238/378/36 236/398/36 234/379/36 +f 234/379/36 232/399/36 230/380/36 +f 230/380/36 226/396/36 238/378/36 +f 239/383/34 225/400/34 227/401/34 +f 227/401/34 229/402/34 239/383/34 +f 229/402/34 231/403/34 239/383/34 +f 231/403/34 233/404/34 239/383/34 +f 233/404/34 235/381/34 239/383/34 +s 1 +f 210/405/33 211/406/37 209/407/33 +f 212/408/37 213/409/38 211/406/37 +f 214/410/38 215/411/39 213/412/38 +f 216/413/39 217/414/35 215/411/39 +f 218/415/35 219/416/40 217/414/35 +f 220/417/40 221/418/41 219/416/40 +f 222/419/41 223/420/42 221/418/41 +f 224/421/42 209/407/33 223/420/42 +f 226/422/33 227/423/37 225/424/33 +f 228/425/37 229/426/38 227/423/37 +f 230/427/38 231/428/39 229/429/38 +f 232/430/39 233/431/35 231/428/39 +f 234/432/35 235/433/40 233/431/35 +f 236/434/40 237/435/41 235/433/40 +f 238/436/41 239/437/42 237/435/41 +f 240/438/42 225/424/33 239/437/42 +f 210/405/33 212/408/37 211/406/37 +f 212/408/37 214/439/38 213/409/38 +f 214/410/38 216/413/39 215/411/39 +f 216/413/39 218/415/35 217/414/35 +f 218/415/35 220/417/40 219/416/40 +f 220/417/40 222/419/41 221/418/41 +f 222/419/41 224/421/42 223/420/42 +f 224/421/42 210/405/33 209/407/33 +f 226/422/33 228/425/37 227/423/37 +f 228/425/37 230/440/38 229/426/38 +f 230/427/38 232/430/39 231/428/39 +f 232/430/39 234/432/35 233/431/35 +f 234/432/35 236/434/40 235/433/40 +f 236/434/40 238/436/41 237/435/41 +f 238/436/41 240/438/42 239/437/42 +f 240/438/42 226/422/33 225/424/33 +o ArmUpper2 +v 0.031250 2.312500 -0.937500 +v 0.093750 2.312500 -0.937500 +v 0.031250 2.437500 -0.937500 +v 0.093750 2.437500 -0.937500 +v 0.031250 2.437500 -0.437500 +v 0.031250 2.312500 -0.437500 +v 0.093750 2.312500 -0.437500 +v 0.093750 2.437500 -0.437500 +v -0.000000 2.375000 -1.062500 +v 0.125000 2.375000 -1.062500 +v -0.000000 2.286612 -1.025888 +v 0.125000 2.286612 -1.025888 +v -0.000000 2.250000 -0.937500 +v 0.125000 2.250000 -0.937500 +v -0.000000 2.286612 -0.849112 +v 0.125000 2.286612 -0.849112 +v -0.000000 2.375000 -0.812500 +v 0.125000 2.375000 -0.812500 +v -0.000000 2.463388 -0.849112 +v 0.125000 2.463388 -0.849112 +v -0.000000 2.500000 -0.937500 +v 0.125000 2.500000 -0.937500 +v -0.000000 2.463388 -1.025888 +v 0.125000 2.463388 -1.025888 +v -0.000000 2.375000 -0.562500 +v 0.125000 2.375000 -0.562500 +v -0.000000 2.286612 -0.525888 +v 0.125000 2.286612 -0.525888 +v -0.000000 2.250000 -0.437500 +v 0.125000 2.250000 -0.437500 +v -0.000000 2.286612 -0.349112 +v 0.125000 2.286612 -0.349112 +v -0.000000 2.375000 -0.312500 +v 0.125000 2.375000 -0.312500 +v -0.000000 2.463388 -0.349112 +v 0.125000 2.463388 -0.349112 +v -0.000000 2.500000 -0.437500 +v 0.125000 2.500000 -0.437500 +v -0.000000 2.463388 -0.525888 +v 0.125000 2.463388 -0.525888 +vt 0.815789 0.666667 +vt 0.763158 0.657407 +vt 0.815789 0.657407 +vt 0.815789 0.638889 +vt 0.763158 0.629630 +vt 0.815789 0.629630 +vt 0.763158 0.638889 +vt 0.815789 0.685185 +vt 0.763158 0.666667 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.763158 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 243/441/43 248/442/43 244/443/43 +f 242/444/44 246/445/44 241/446/44 +f 244/443/45 247/447/45 242/444/45 +f 241/448/46 245/449/46 243/441/46 +f 262/450/45 258/451/45 254/452/45 +f 259/453/46 261/454/46 263/455/46 +f 278/456/45 274/457/45 270/458/45 +f 275/459/46 277/460/46 279/461/46 +f 243/441/43 245/449/43 248/442/43 +f 242/444/44 247/447/44 246/445/44 +f 244/443/45 248/442/45 247/447/45 +f 241/448/46 246/462/46 245/449/46 +f 254/452/45 252/463/45 250/464/45 +f 250/464/45 264/465/45 262/450/45 +f 262/450/45 260/466/45 258/451/45 +f 258/451/45 256/467/45 254/452/45 +f 254/452/45 250/464/45 262/450/45 +f 263/455/46 249/468/46 251/469/46 +f 251/469/46 253/470/46 263/455/46 +f 253/470/46 255/471/46 263/455/46 +f 255/471/46 257/472/46 263/455/46 +f 257/472/46 259/453/46 263/455/46 +f 270/458/45 268/473/45 266/474/45 +f 266/474/45 280/475/45 278/456/45 +f 278/456/45 276/476/45 274/457/45 +f 274/457/45 272/477/45 270/458/45 +f 270/458/45 266/474/45 278/456/45 +f 279/461/46 265/478/46 267/479/46 +f 267/479/46 269/480/46 279/461/46 +f 269/480/46 271/481/46 279/461/46 +f 271/481/46 273/482/46 279/461/46 +f 273/482/46 275/459/46 279/461/46 +s 1 +f 250/483/47 251/484/48 249/485/47 +f 252/486/48 253/487/44 251/484/48 +f 254/488/44 255/489/49 253/490/44 +f 256/491/49 257/492/50 255/489/49 +f 258/493/50 259/494/51 257/492/50 +f 260/495/51 261/496/43 259/494/51 +f 262/497/43 263/498/52 261/496/43 +f 264/499/52 249/485/47 263/498/52 +f 266/500/47 267/501/48 265/502/47 +f 268/503/48 269/504/44 267/501/48 +f 270/505/44 271/506/49 269/507/44 +f 272/508/49 273/509/50 271/506/49 +f 274/510/50 275/511/51 273/509/50 +f 276/512/51 277/513/43 275/511/51 +f 278/514/43 279/515/52 277/513/43 +f 280/516/52 265/502/47 279/515/52 +f 250/483/47 252/486/48 251/484/48 +f 252/486/48 254/517/44 253/487/44 +f 254/488/44 256/491/49 255/489/49 +f 256/491/49 258/493/50 257/492/50 +f 258/493/50 260/495/51 259/494/51 +f 260/495/51 262/497/43 261/496/43 +f 262/497/43 264/499/52 263/498/52 +f 264/499/52 250/483/47 249/485/47 +f 266/500/47 268/503/48 267/501/48 +f 268/503/48 270/518/44 269/504/44 +f 270/505/44 272/508/49 271/506/49 +f 272/508/49 274/510/50 273/509/50 +f 274/510/50 276/512/51 275/511/51 +f 276/512/51 278/514/43 277/513/43 +f 278/514/43 280/516/52 279/515/52 +f 280/516/52 266/500/47 265/502/47 +o ArmUpper1 +v -0.031250 2.312500 0.937500 +v -0.093750 2.312500 0.937500 +v -0.031250 2.437500 0.937500 +v -0.093750 2.437500 0.937500 +v -0.031250 2.437500 0.437500 +v -0.031250 2.312500 0.437500 +v -0.093750 2.312500 0.437500 +v -0.093750 2.437500 0.437500 +v 0.000000 2.375000 1.062500 +v -0.125000 2.375000 1.062500 +v 0.000000 2.286612 1.025888 +v -0.125000 2.286612 1.025888 +v 0.000000 2.250000 0.937500 +v -0.125000 2.250000 0.937500 +v 0.000000 2.286612 0.849112 +v -0.125000 2.286612 0.849112 +v 0.000000 2.375000 0.812500 +v -0.125000 2.375000 0.812500 +v 0.000000 2.463388 0.849112 +v -0.125000 2.463388 0.849112 +v 0.000000 2.500000 0.937500 +v -0.125000 2.500000 0.937500 +v 0.000000 2.463388 1.025888 +v -0.125000 2.463388 1.025888 +v 0.000000 2.375000 0.562500 +v -0.125000 2.375000 0.562500 +v 0.000000 2.286612 0.525888 +v -0.125000 2.286612 0.525888 +v 0.000000 2.250000 0.437500 +v -0.125000 2.250000 0.437500 +v 0.000000 2.286612 0.349112 +v -0.125000 2.286612 0.349112 +v 0.000000 2.375000 0.312500 +v -0.125000 2.375000 0.312500 +v 0.000000 2.463388 0.349112 +v -0.125000 2.463388 0.349112 +v 0.000000 2.500000 0.437500 +v -0.125000 2.500000 0.437500 +v 0.000000 2.463388 0.525888 +v -0.125000 2.463388 0.525888 +vt 0.815789 0.666667 +vt 0.763158 0.657407 +vt 0.815789 0.657407 +vt 0.815789 0.638889 +vt 0.763158 0.629630 +vt 0.815789 0.629630 +vt 0.763158 0.638889 +vt 0.815789 0.685185 +vt 0.763158 0.666667 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.763158 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.789474 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.710526 0.574074 +vt 0.710526 0.592593 +vt 0.723684 0.592593 +vt 0.736842 0.574074 +vt 0.736842 0.592593 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.776316 0.574074 +vt 0.789474 0.574074 +vt 0.697368 0.574074 +vt 0.723684 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +s off +f 283/519/53 288/520/53 284/521/53 +f 282/522/54 286/523/54 281/524/54 +f 284/521/55 287/525/55 282/522/55 +f 281/526/56 285/527/56 283/519/56 +f 302/528/55 298/529/55 294/530/55 +f 299/531/56 301/532/56 303/533/56 +f 318/534/55 314/535/55 310/536/55 +f 315/537/56 317/538/56 319/539/56 +f 283/519/53 285/527/53 288/520/53 +f 282/522/54 287/525/54 286/523/54 +f 284/521/55 288/520/55 287/525/55 +f 281/526/56 286/540/56 285/527/56 +f 294/530/55 292/541/55 290/542/55 +f 290/542/55 304/543/55 302/528/55 +f 302/528/55 300/544/55 298/529/55 +f 298/529/55 296/545/55 294/530/55 +f 294/530/55 290/542/55 302/528/55 +f 303/533/56 289/546/56 291/547/56 +f 291/547/56 293/548/56 303/533/56 +f 293/548/56 295/549/56 303/533/56 +f 295/549/56 297/550/56 303/533/56 +f 297/550/56 299/531/56 303/533/56 +f 310/536/55 308/551/55 306/552/55 +f 306/552/55 320/553/55 318/534/55 +f 318/534/55 316/554/55 314/535/55 +f 314/535/55 312/555/55 310/536/55 +f 310/536/55 306/552/55 318/534/55 +f 319/539/56 305/556/56 307/557/56 +f 307/557/56 309/558/56 319/539/56 +f 309/558/56 311/559/56 319/539/56 +f 311/559/56 313/560/56 319/539/56 +f 313/560/56 315/537/56 319/539/56 +s 1 +f 290/561/57 291/562/58 289/563/57 +f 291/562/58 294/564/54 293/565/54 +f 294/566/54 295/567/59 293/568/54 +f 296/569/59 297/570/60 295/567/59 +f 298/571/60 299/572/61 297/570/60 +f 300/573/61 301/574/53 299/572/61 +f 302/575/53 303/576/62 301/574/53 +f 304/577/62 289/563/57 303/576/62 +f 306/578/57 307/579/58 305/580/57 +f 308/581/58 309/582/54 307/579/58 +f 310/583/54 311/584/59 309/585/54 +f 311/584/59 314/586/60 313/587/60 +f 314/586/60 315/588/61 313/587/60 +f 315/588/61 318/589/53 317/590/53 +f 318/589/53 319/591/62 317/590/53 +f 320/592/62 305/580/57 319/591/62 +f 290/561/57 292/593/58 291/562/58 +f 291/562/58 292/593/58 294/564/54 +f 294/566/54 296/569/59 295/567/59 +f 296/569/59 298/571/60 297/570/60 +f 298/571/60 300/573/61 299/572/61 +f 300/573/61 302/575/53 301/574/53 +f 302/575/53 304/577/62 303/576/62 +f 304/577/62 290/561/57 289/563/57 +f 306/578/57 308/581/58 307/579/58 +f 308/581/58 310/594/54 309/582/54 +f 310/583/54 312/595/59 311/584/59 +f 311/584/59 312/595/59 314/586/60 +f 314/586/60 316/596/61 315/588/61 +f 315/588/61 316/596/61 318/589/53 +f 318/589/53 320/592/62 319/591/62 +f 320/592/62 306/578/57 305/580/57 +o Head2 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 0.000000 +v -0.125000 2.750000 -0.250000 +v 0.125000 2.750000 -0.250000 +v -0.125000 1.750000 -0.250000 +v -0.125000 1.750000 0.000000 +v 0.125000 1.750000 0.000000 +v 0.125000 1.750000 -0.250000 +v -0.062500 2.500000 -0.250000 +v 0.062500 2.500000 -0.250000 +v -0.062500 2.500000 -0.437500 +v 0.062500 2.500000 -0.437500 +v -0.062500 2.250000 -0.437500 +v 0.062500 2.250000 -0.437500 +v -0.062500 2.250000 -0.250000 +v 0.062500 2.250000 -0.250000 +v 0.250000 2.625000 -0.093750 +v 0.250000 1.875000 -0.093750 +v 0.250000 2.625000 -0.156250 +v 0.250000 1.875000 -0.156250 +v 0.125000 2.625000 -0.093750 +v 0.125000 1.875000 -0.093750 +v 0.125000 2.625000 -0.156250 +v 0.125000 1.875000 -0.156250 +v 0.187500 2.562500 -0.093750 +v 0.187500 1.937500 -0.093750 +v 0.187500 2.562500 -0.156250 +v 0.187500 1.937500 -0.156250 +v 0.125000 2.562500 -0.093750 +v 0.125000 1.937500 -0.093750 +v 0.125000 2.562500 -0.156250 +v 0.125000 1.937500 -0.156250 +v -0.250001 2.625000 -0.156250 +v -0.250001 1.875000 -0.156250 +v -0.250001 2.625000 -0.093750 +v -0.250001 1.875000 -0.093750 +v -0.125001 2.625000 -0.156250 +v -0.125001 1.875000 -0.156250 +v -0.125001 2.625000 -0.093750 +v -0.125001 1.875000 -0.093750 +v -0.187501 2.562500 -0.156250 +v -0.187501 1.937500 -0.156250 +v -0.187501 2.562500 -0.093750 +v -0.187501 1.937500 -0.093750 +v -0.125001 2.562500 -0.156250 +v -0.125001 1.937500 -0.156250 +v -0.125001 2.562500 -0.093750 +v -0.125001 1.937500 -0.093750 +v -0.125000 2.375000 -0.562500 +v -0.000000 2.375000 -0.562500 +v -0.125000 2.286612 -0.525888 +v -0.000000 2.286612 -0.525888 +v -0.125000 2.250000 -0.437500 +v -0.000000 2.250000 -0.437500 +v -0.125000 2.286612 -0.349112 +v -0.000000 2.286612 -0.349112 +v -0.125000 2.375000 -0.312500 +v -0.000000 2.375000 -0.312500 +v -0.125000 2.463388 -0.349112 +v -0.000000 2.463388 -0.349112 +v -0.125000 2.500000 -0.437500 +v -0.000000 2.500000 -0.437500 +v -0.125000 2.463388 -0.525888 +v -0.000000 2.463388 -0.525888 +vt 0.723684 0.907407 +vt 0.750000 0.870370 +vt 0.750000 0.907407 +vt 0.750000 0.722222 +vt 0.723684 0.685185 +vt 0.750000 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.723684 0.870370 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 322/597/63 323/598/63 321/599/63 +f 325/600/64 327/601/64 326/602/64 +f 322/603/65 328/604/65 324/605/65 +f 323/598/66 326/606/66 321/607/66 +f 324/608/67 325/600/67 323/598/67 +f 321/607/68 327/609/68 322/603/68 +f 330/610/63 331/611/63 329/612/63 +f 332/613/67 333/614/67 331/615/67 +f 334/616/64 335/617/64 333/618/64 +f 336/619/65 332/613/65 330/610/65 +f 333/618/66 329/620/66 331/621/66 +f 338/622/65 339/623/65 337/624/65 +f 338/622/64 344/625/64 340/626/64 +f 339/623/63 341/627/63 337/624/63 +f 345/628/66 348/629/66 346/630/66 +f 352/631/63 346/632/63 348/633/63 +f 349/634/64 347/635/64 345/636/64 +f 341/627/68 345/637/68 337/624/68 +f 343/638/67 347/635/67 351/639/67 +f 340/626/67 347/640/67 339/623/67 +f 344/625/67 348/633/67 340/626/67 +f 337/624/68 346/641/68 338/622/68 +f 342/642/68 346/643/68 350/644/68 +f 354/645/66 355/646/66 353/647/66 +f 354/645/64 360/648/64 356/649/64 +f 355/646/63 357/650/63 353/647/63 +f 361/651/65 364/652/65 362/653/65 +f 368/654/63 362/655/63 364/656/63 +f 365/657/64 363/658/64 361/659/64 +f 357/650/67 361/660/67 353/647/67 +f 359/661/68 363/658/68 367/662/68 +f 356/649/68 363/663/68 355/646/68 +f 360/648/68 364/656/68 356/649/68 +f 353/647/67 362/664/67 354/645/67 +f 358/665/67 362/666/67 366/667/67 +f 382/668/65 378/669/65 374/670/65 +f 379/671/66 381/672/66 383/673/66 +f 322/597/63 324/608/63 323/598/63 +f 325/600/64 328/674/64 327/601/64 +f 322/603/65 327/609/65 328/604/65 +f 323/598/66 325/600/66 326/606/66 +f 324/608/67 328/674/67 325/600/67 +f 321/607/68 326/606/68 327/609/68 +f 330/610/63 332/613/63 331/611/63 +f 332/613/67 334/616/67 333/614/67 +f 334/616/64 336/619/64 335/617/64 +f 336/619/65 334/616/65 332/613/65 +f 333/618/66 335/617/66 329/620/66 +f 338/622/65 340/626/65 339/623/65 +f 338/622/64 342/642/64 344/625/64 +f 339/623/63 343/638/63 341/627/63 +f 345/628/66 347/640/66 348/629/66 +f 352/631/63 350/675/63 346/632/63 +f 349/634/64 351/639/64 347/635/64 +f 341/627/68 349/676/68 345/637/68 +f 343/638/67 339/623/67 347/635/67 +f 340/626/67 348/629/67 347/640/67 +f 344/625/67 352/631/67 348/633/67 +f 337/624/68 345/677/68 346/641/68 +f 342/642/68 338/622/68 346/643/68 +f 354/645/66 356/649/66 355/646/66 +f 354/645/64 358/665/64 360/648/64 +f 355/646/63 359/661/63 357/650/63 +f 361/651/65 363/663/65 364/652/65 +f 368/654/63 366/678/63 362/655/63 +f 365/657/64 367/662/64 363/658/64 +f 357/650/67 365/679/67 361/660/67 +f 359/661/68 355/646/68 363/658/68 +f 356/649/68 364/652/68 363/663/68 +f 360/648/68 368/654/68 364/656/68 +f 353/647/67 361/680/67 362/664/67 +f 358/665/67 354/645/67 362/666/67 +f 374/670/65 372/681/65 370/682/65 +f 370/682/65 384/683/65 382/668/65 +f 382/668/65 380/684/65 378/669/65 +f 378/669/65 376/685/65 374/670/65 +f 374/670/65 370/682/65 382/668/65 +f 383/673/66 369/686/66 371/687/66 +f 371/687/66 373/688/66 383/673/66 +f 373/688/66 375/689/66 383/673/66 +f 375/689/66 377/690/66 383/673/66 +f 377/690/66 379/671/66 383/673/66 +s 1 +f 370/691/67 371/692/69 369/693/67 +f 372/694/69 373/695/64 371/692/69 +f 374/696/64 375/697/70 373/698/64 +f 376/699/70 377/700/68 375/697/70 +f 378/701/68 379/702/71 377/700/68 +f 380/703/71 381/704/63 379/702/71 +f 382/705/63 383/706/72 381/704/63 +f 384/707/72 369/693/67 383/706/72 +f 370/691/67 372/694/69 371/692/69 +f 372/694/69 374/708/64 373/695/64 +f 374/696/64 376/699/70 375/697/70 +f 376/699/70 378/701/68 377/700/68 +f 378/701/68 380/703/71 379/702/71 +f 380/703/71 382/705/63 381/704/63 +f 382/705/63 384/707/72 383/706/72 +f 384/707/72 370/691/67 369/693/67 +o Head1 +v 0.125000 2.750000 -0.000000 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 0.250000 +v -0.125000 2.750000 0.250000 +v 0.125000 1.750000 0.250000 +v 0.125000 1.750000 -0.000000 +v -0.125000 1.750000 0.000000 +v -0.125000 1.750000 0.250000 +v 0.062500 2.500000 0.250000 +v -0.062500 2.500000 0.250000 +v 0.062500 2.500000 0.437500 +v -0.062500 2.500000 0.437500 +v 0.062500 2.250000 0.437500 +v -0.062500 2.250000 0.437500 +v 0.062500 2.250000 0.250000 +v -0.062500 2.250000 0.250000 +v -0.250000 2.625000 0.093750 +v -0.250000 1.875000 0.093750 +v -0.250000 2.625000 0.156250 +v -0.250000 1.875000 0.156250 +v -0.125000 2.625000 0.093750 +v -0.125000 1.875000 0.093750 +v -0.125000 2.625000 0.156250 +v -0.125000 1.875000 0.156250 +v -0.187500 2.562500 0.093750 +v -0.187500 1.937500 0.093750 +v -0.187500 2.562500 0.156250 +v -0.187500 1.937500 0.156250 +v -0.125000 2.562500 0.093750 +v -0.125000 1.937500 0.093750 +v -0.125000 2.562500 0.156250 +v -0.125000 1.937500 0.156250 +v 0.250001 2.625000 0.156250 +v 0.250001 1.875000 0.156250 +v 0.250001 2.625000 0.093750 +v 0.250001 1.875000 0.093750 +v 0.125001 2.625000 0.156250 +v 0.125001 1.875000 0.156250 +v 0.125001 2.625000 0.093750 +v 0.125001 1.875000 0.093750 +v 0.187501 2.562500 0.156250 +v 0.187501 1.937500 0.156250 +v 0.187501 2.562500 0.093750 +v 0.187501 1.937500 0.093750 +v 0.125001 2.562500 0.156250 +v 0.125001 1.937500 0.156250 +v 0.125001 2.562500 0.093750 +v 0.125001 1.937500 0.093750 +v 0.125000 2.375000 0.562500 +v 0.000000 2.375000 0.562500 +v 0.125000 2.286612 0.525888 +v 0.000000 2.286612 0.525888 +v 0.125000 2.250000 0.437500 +v 0.000000 2.250000 0.437500 +v 0.125000 2.286612 0.349112 +v 0.000000 2.286612 0.349112 +v 0.125000 2.375000 0.312500 +v 0.000000 2.375000 0.312500 +v 0.125000 2.463388 0.349112 +v 0.000000 2.463388 0.349112 +v 0.125000 2.500000 0.437500 +v 0.000000 2.500000 0.437500 +v 0.125000 2.463388 0.525888 +v 0.000000 2.463388 0.525888 +vt 0.750000 0.907407 +vt 0.723684 0.870370 +vt 0.750000 0.870370 +vt 0.750000 0.685185 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.750000 0.722222 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.694444 +vt 0.723684 0.685185 +vt 0.723684 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.710526 0.833333 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.907407 +vt 0.717105 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +s off +f 385/709/73 388/710/73 387/711/73 +f 390/712/74 392/713/74 391/714/74 +f 386/715/75 392/716/75 388/717/75 +f 387/711/76 390/718/76 385/719/76 +f 388/710/77 389/720/77 387/711/77 +f 385/719/78 391/721/78 386/715/78 +f 394/722/73 395/723/73 393/724/73 +f 396/725/77 397/726/77 395/727/77 +f 398/728/74 399/729/74 397/730/74 +f 400/731/75 396/725/75 394/722/75 +f 397/730/76 393/732/76 395/733/76 +f 402/734/75 403/735/75 401/736/75 +f 402/734/74 408/737/74 404/738/74 +f 403/735/73 405/739/73 401/736/73 +f 409/740/76 412/741/76 410/742/76 +f 412/743/73 414/744/73 410/745/73 +f 413/746/74 411/747/74 409/748/74 +f 405/739/78 409/749/78 401/736/78 +f 407/750/77 411/747/77 415/751/77 +f 404/738/77 411/752/77 403/735/77 +f 408/737/77 412/743/77 404/738/77 +f 401/736/78 410/753/78 402/734/78 +f 406/754/78 410/755/78 414/756/78 +f 418/757/76 419/758/76 417/759/76 +f 418/757/74 424/760/74 420/761/74 +f 417/759/73 423/762/73 421/763/73 +f 425/764/75 428/765/75 426/766/75 +f 432/767/73 426/768/73 428/769/73 +f 429/770/74 427/771/74 425/772/74 +f 421/763/77 425/773/77 417/759/77 +f 423/762/78 427/771/78 431/774/78 +f 420/761/78 427/775/78 419/758/78 +f 424/760/78 428/769/78 420/761/78 +f 417/759/77 426/776/77 418/757/77 +f 422/777/77 426/778/77 430/779/77 +f 446/780/75 442/781/75 438/782/75 +f 443/783/76 445/784/76 447/785/76 +f 385/709/73 386/786/73 388/710/73 +f 390/712/74 389/720/74 392/713/74 +f 386/715/75 391/721/75 392/716/75 +f 387/711/76 389/720/76 390/718/76 +f 388/710/77 392/713/77 389/720/77 +f 385/719/78 390/718/78 391/721/78 +f 394/722/73 396/725/73 395/723/73 +f 396/725/77 398/728/77 397/726/77 +f 398/728/74 400/731/74 399/729/74 +f 400/731/75 398/728/75 396/725/75 +f 397/730/76 399/729/76 393/732/76 +f 402/734/75 404/738/75 403/735/75 +f 402/734/74 406/754/74 408/737/74 +f 403/735/73 407/750/73 405/739/73 +f 409/740/76 411/752/76 412/741/76 +f 412/743/73 416/787/73 414/744/73 +f 413/746/74 415/751/74 411/747/74 +f 405/739/78 413/788/78 409/749/78 +f 407/750/77 403/735/77 411/747/77 +f 404/738/77 412/741/77 411/752/77 +f 408/737/77 416/787/77 412/743/77 +f 401/736/78 409/789/78 410/753/78 +f 406/754/78 402/734/78 410/755/78 +f 418/757/76 420/761/76 419/758/76 +f 418/757/74 422/777/74 424/760/74 +f 417/759/73 419/758/73 423/762/73 +f 425/764/75 427/775/75 428/765/75 +f 432/767/73 430/790/73 426/768/73 +f 429/770/74 431/774/74 427/771/74 +f 421/763/77 429/791/77 425/773/77 +f 423/762/78 419/758/78 427/771/78 +f 420/761/78 428/765/78 427/775/78 +f 424/760/78 432/767/78 428/769/78 +f 417/759/77 425/792/77 426/776/77 +f 422/777/77 418/757/77 426/778/77 +f 438/782/75 436/793/75 434/794/75 +f 434/794/75 448/795/75 446/780/75 +f 446/780/75 444/796/75 442/781/75 +f 442/781/75 440/797/75 438/782/75 +f 438/782/75 434/794/75 446/780/75 +f 447/785/76 433/798/76 435/799/76 +f 435/799/76 437/800/76 447/785/76 +f 437/800/76 439/801/76 447/785/76 +f 439/801/76 441/802/76 447/785/76 +f 441/802/76 443/783/76 447/785/76 +s 1 +f 434/803/77 435/804/79 433/805/77 +f 436/806/79 437/807/74 435/804/79 +f 438/808/74 439/809/80 437/810/74 +f 440/811/80 441/812/78 439/809/80 +f 442/813/78 443/814/81 441/812/78 +f 444/815/81 445/816/73 443/814/81 +f 446/817/73 447/818/82 445/816/73 +f 448/819/82 433/805/77 447/818/82 +f 434/803/77 436/806/79 435/804/79 +f 436/806/79 438/820/74 437/807/74 +f 438/808/74 440/811/80 439/809/80 +f 440/811/80 442/813/78 441/812/78 +f 442/813/78 444/815/81 443/814/81 +f 444/815/81 446/817/73 445/816/73 +f 446/817/73 448/819/82 447/818/82 +f 448/819/82 434/803/77 433/805/77 +o Spike2 +v -0.062500 2.875000 -0.062500 +v 0.062500 2.875000 -0.062500 +v -0.062500 2.875000 -0.187500 +v 0.062500 2.875000 -0.187500 +v -0.062500 1.625000 -0.187500 +v -0.062500 1.625000 -0.062500 +v 0.062500 1.625000 -0.062500 +v 0.062500 1.625000 -0.187500 +v 0.000000 1.375000 -0.125000 +vt 0.828947 0.888889 +vt 0.842105 0.870370 +vt 0.842105 0.888889 +vt 0.868421 0.870370 +vt 0.881579 0.685185 +vt 0.881579 0.870370 +vt 0.855263 0.685185 +vt 0.855263 0.870370 +vt 0.828947 0.870370 +vt 0.842105 0.685185 +vt 0.868421 0.685185 +vt 0.848684 0.648148 +vt 0.828947 0.685185 +vt 0.835526 0.648148 +vt 0.875000 0.648148 +vt 0.861842 0.648148 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 -0.9701 +vn 0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 0.9701 +s off +f 450/821/83 451/822/83 449/823/83 +f 450/824/84 456/825/84 452/826/84 +f 451/822/85 454/827/85 449/828/85 +f 452/829/86 453/830/86 451/822/86 +f 449/828/87 455/831/87 450/824/87 +f 454/827/88 453/830/88 457/832/88 +f 453/830/89 456/833/89 457/834/89 +f 456/825/90 455/831/90 457/835/90 +f 455/831/91 454/827/91 457/836/91 +f 450/821/83 452/829/83 451/822/83 +f 450/824/84 455/831/84 456/825/84 +f 451/822/85 453/830/85 454/827/85 +f 452/829/86 456/833/86 453/830/86 +f 449/828/87 454/827/87 455/831/87 +o Spike1 +v 0.062500 2.875000 0.062500 +v -0.062500 2.875000 0.062500 +v 0.062500 2.875000 0.187500 +v -0.062500 2.875000 0.187500 +v 0.062500 1.625000 0.187500 +v 0.062500 1.625000 0.062500 +v -0.062500 1.625000 0.062500 +v -0.062500 1.625000 0.187500 +v 0.000000 1.375000 0.125000 +vt 0.842105 0.888889 +vt 0.828947 0.870370 +vt 0.842105 0.870370 +vt 0.868421 0.870370 +vt 0.881579 0.685185 +vt 0.881579 0.870370 +vt 0.855263 0.685185 +vt 0.855263 0.870370 +vt 0.842105 0.685185 +vt 0.868421 0.685185 +vt 0.848684 0.648148 +vt 0.828947 0.685185 +vt 0.835526 0.648148 +vt 0.875000 0.648148 +vt 0.861842 0.648148 +vt 0.828947 0.888889 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 0.9701 +vn -0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 -0.9701 +s off +f 458/837/92 461/838/92 460/839/92 +f 459/840/93 465/841/93 461/842/93 +f 460/839/94 463/843/94 458/844/94 +f 461/838/95 462/845/95 460/839/95 +f 458/844/96 464/846/96 459/840/96 +f 463/843/97 462/845/97 466/847/97 +f 462/845/98 465/848/98 466/849/98 +f 465/841/99 464/846/99 466/850/99 +f 464/846/100 463/843/100 466/851/100 +f 458/837/92 459/852/92 461/838/92 +f 459/840/93 464/846/93 465/841/93 +f 460/839/94 462/845/94 463/843/94 +f 461/838/95 465/848/95 462/845/95 +f 458/844/96 463/843/96 464/846/96 +o Frame +v 1.250000 2.750000 -1.250000 +v 1.250000 3.000000 -1.250000 +v 1.250000 2.750000 -1.500000 +v 1.250000 3.000000 -1.500000 +v 1.500000 2.750000 -1.250000 +v 1.500000 3.000000 -1.250000 +v 1.500000 2.750000 -1.500000 +v 1.500000 3.000000 -1.500000 +v -1.500000 2.750000 -1.250000 +v -1.500000 3.000000 -1.250000 +v -1.500000 2.750000 -1.500000 +v -1.500000 3.000000 -1.500000 +v -1.250000 2.750000 -1.250000 +v -1.250000 3.000000 -1.250000 +v -1.250000 2.750000 -1.500000 +v -1.250000 3.000000 -1.500000 +v 1.250000 2.750000 1.500000 +v 1.250000 3.000000 1.500000 +v 1.250000 2.750000 1.250000 +v 1.250000 3.000000 1.250000 +v 1.500000 2.750000 1.500000 +v 1.500000 3.000000 1.500000 +v 1.500000 2.750000 1.250000 +v 1.500000 3.000000 1.250000 +v -1.500000 2.750000 1.500000 +v -1.500000 3.000000 1.500000 +v -1.500000 2.750000 1.250000 +v -1.500000 3.000000 1.250000 +v -1.250000 2.750000 1.500000 +v -1.250000 3.000000 1.500000 +v -1.250000 2.750000 1.250000 +v -1.250000 3.000000 1.250000 +v 1.500000 3.000000 -1.250000 +v 1.500000 3.000000 1.250000 +v 1.500000 2.875000 1.250000 +v 1.500000 2.875000 -1.250000 +v 1.375000 3.000000 -1.250000 +v 1.375000 3.000000 1.250000 +v 1.375000 2.875000 1.250000 +v 1.375000 2.875000 -1.250000 +v -1.375000 3.000000 -1.250000 +v -1.375000 3.000000 1.250000 +v -1.375000 2.875000 1.250000 +v -1.375000 2.875000 -1.250000 +v -1.500000 3.000000 -1.250000 +v -1.500000 3.000000 1.250000 +v -1.500000 2.875000 1.250000 +v -1.500000 2.875000 -1.250000 +v -1.250000 3.000000 -1.500000 +v 1.250000 3.000000 -1.500000 +v 1.250000 2.875000 -1.500000 +v -1.250000 2.875000 -1.500000 +v -1.250000 3.000000 -1.375000 +v 1.250000 3.000000 -1.375000 +v 1.250000 2.875000 -1.375000 +v -1.250000 2.875000 -1.375000 +v -1.250000 3.000000 1.375000 +v 1.250000 3.000000 1.375000 +v 1.250000 2.875000 1.375000 +v -1.250000 2.875000 1.375000 +v -1.250000 3.000000 1.500000 +v 1.250000 3.000000 1.500000 +v 1.250000 2.875000 1.500000 +v -1.250000 2.875000 1.500000 +v -1.375000 2.750000 -1.500000 +v -1.375000 0.250000 -1.500000 +v -1.500000 0.250000 -1.500000 +v -1.500000 2.750000 -1.500000 +v -1.375000 2.750000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.500000 0.250000 -1.375000 +v -1.500000 2.750000 -1.375000 +v -1.375000 2.750000 1.375000 +v -1.375000 0.250000 1.375000 +v -1.500000 0.250000 1.375000 +v -1.500000 2.750000 1.375000 +v -1.375000 2.750000 1.500000 +v -1.375000 0.250000 1.500000 +v -1.500000 0.250000 1.500000 +v -1.500000 2.750000 1.500000 +v 1.500000 2.750000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 1.375000 0.250000 -1.500000 +v 1.375000 2.750000 -1.500000 +v 1.500000 2.750000 -1.375000 +v 1.500000 0.250000 -1.375000 +v 1.375000 0.250000 -1.375000 +v 1.375000 2.750000 -1.375000 +v 1.500000 2.750000 1.375000 +v 1.500000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v 1.375000 2.750000 1.375000 +v 1.500000 2.750000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.375000 0.250000 1.500000 +v 1.375000 2.750000 1.500000 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.888889 +vt 0.210526 0.888889 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.210526 0.814815 +vt 0.210526 0.888889 +vt 0.473684 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.888889 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.814815 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 468/853/101 469/854/101 467/855/101 +f 470/856/102 473/857/102 469/854/102 +f 474/858/103 471/859/103 473/857/103 +f 472/860/104 467/855/104 471/861/104 +f 473/857/105 467/862/105 469/863/105 +f 470/864/106 472/865/106 474/858/106 +f 476/866/101 477/867/101 475/868/101 +f 478/869/102 481/870/102 477/867/102 +f 482/871/103 479/872/103 481/870/103 +f 480/873/104 475/868/104 479/874/104 +f 481/870/105 475/875/105 477/876/105 +f 478/877/106 480/878/106 482/871/106 +f 484/879/101 485/880/101 483/881/101 +f 486/882/102 489/883/102 485/880/102 +f 490/884/103 487/885/103 489/883/103 +f 488/886/104 483/881/104 487/887/104 +f 489/883/105 483/888/105 485/889/105 +f 486/890/106 488/891/106 490/884/106 +f 492/892/101 493/893/101 491/894/101 +f 494/895/102 497/896/102 493/893/102 +f 498/897/103 495/898/103 497/896/103 +f 496/899/104 491/894/104 495/900/104 +f 497/896/105 491/901/105 493/902/105 +f 494/903/106 496/904/106 498/897/106 +f 502/905/103 500/906/103 501/907/103 +f 501/907/105 506/908/105 502/905/105 +f 499/909/106 504/910/106 500/906/106 +f 506/911/101 504/910/101 503/912/101 +f 510/913/103 508/914/103 509/915/103 +f 509/916/105 514/917/105 510/918/105 +f 507/919/106 512/920/106 508/914/106 +f 514/917/101 512/920/101 511/921/101 +f 518/922/102 516/923/102 517/924/102 +f 517/924/105 522/925/105 518/922/105 +f 515/926/106 520/927/106 516/923/106 +f 522/928/104 520/927/104 519/929/104 +f 526/930/102 524/931/102 525/932/102 +f 525/933/105 530/934/105 526/935/105 +f 523/936/106 528/937/106 524/931/106 +f 530/934/104 528/937/104 527/938/104 +f 534/939/102 532/940/102 533/941/102 +f 533/941/101 538/942/101 534/939/101 +f 531/943/103 536/944/103 532/940/103 +f 538/942/104 536/945/104 535/946/104 +f 542/947/102 540/948/102 541/949/102 +f 541/949/101 546/950/101 542/947/101 +f 539/951/103 544/952/103 540/953/103 +f 546/950/104 544/952/104 543/954/104 +f 550/955/102 548/956/102 549/957/102 +f 549/957/101 554/958/101 550/955/101 +f 547/959/103 552/960/103 548/956/103 +f 554/961/104 552/960/104 551/962/104 +f 558/963/102 556/964/102 557/965/102 +f 557/966/101 562/967/101 558/968/101 +f 555/969/103 560/970/103 556/964/103 +f 562/967/104 560/970/104 559/971/104 +f 468/853/101 470/856/101 469/854/101 +f 470/856/102 474/858/102 473/857/102 +f 474/858/103 472/865/103 471/859/103 +f 472/860/104 468/853/104 467/855/104 +f 473/857/105 471/859/105 467/862/105 +f 470/864/106 468/972/106 472/865/106 +f 476/866/101 478/869/101 477/867/101 +f 478/869/102 482/871/102 481/870/102 +f 482/871/103 480/878/103 479/872/103 +f 480/873/104 476/866/104 475/868/104 +f 481/870/105 479/872/105 475/875/105 +f 478/877/106 476/973/106 480/878/106 +f 484/879/101 486/882/101 485/880/101 +f 486/882/102 490/884/102 489/883/102 +f 490/884/103 488/891/103 487/885/103 +f 488/886/104 484/879/104 483/881/104 +f 489/883/105 487/885/105 483/888/105 +f 486/890/106 484/974/106 488/891/106 +f 492/892/101 494/895/101 493/893/101 +f 494/895/102 498/897/102 497/896/102 +f 498/897/103 496/904/103 495/898/103 +f 496/899/104 492/892/104 491/894/104 +f 497/896/105 495/898/105 491/901/105 +f 494/903/106 492/975/106 496/904/106 +f 502/905/103 499/909/103 500/906/103 +f 501/907/105 505/976/105 506/908/105 +f 499/909/106 503/912/106 504/910/106 +f 506/911/101 505/977/101 504/910/101 +f 510/913/103 507/919/103 508/914/103 +f 509/916/105 513/978/105 514/917/105 +f 507/919/106 511/921/106 512/920/106 +f 514/917/101 513/978/101 512/920/101 +f 518/922/102 515/926/102 516/923/102 +f 517/924/105 521/979/105 522/925/105 +f 515/926/106 519/929/106 520/927/106 +f 522/928/104 521/980/104 520/927/104 +f 526/930/102 523/936/102 524/931/102 +f 525/933/105 529/981/105 530/934/105 +f 523/936/106 527/938/106 528/937/106 +f 530/934/104 529/981/104 528/937/104 +f 534/939/102 531/943/102 532/940/102 +f 533/941/101 537/982/101 538/942/101 +f 531/943/103 535/983/103 536/944/103 +f 538/942/104 537/982/104 536/945/104 +f 542/947/102 539/984/102 540/948/102 +f 541/949/101 545/985/101 546/950/101 +f 539/951/103 543/954/103 544/952/103 +f 546/950/104 545/985/104 544/952/104 +f 550/955/102 547/959/102 548/956/102 +f 549/957/101 553/986/101 554/958/101 +f 547/959/103 551/962/103 552/960/103 +f 554/961/104 553/987/104 552/960/104 +f 558/963/102 555/969/102 556/964/102 +f 557/966/101 561/988/101 562/967/101 +f 555/969/103 559/971/103 560/970/103 +f 562/967/104 561/988/104 560/970/104 +o Base +v 1.500000 0.125000 -1.250000 +v 1.500000 0.125000 1.250000 +v 1.500000 0.000000 1.250000 +v 1.500000 0.000000 -1.250000 +v 1.250000 0.000000 -1.250000 +v 1.250000 0.250000 -1.250000 +v 1.250000 0.000000 -1.500000 +v 1.250000 0.250000 -1.500000 +v 1.500000 0.000000 -1.250000 +v 1.500000 0.250000 -1.250000 +v 1.500000 0.000000 -1.500000 +v 1.500000 0.250000 -1.500000 +v -1.500000 0.000000 -1.250000 +v -1.500000 0.250000 -1.250000 +v -1.500000 0.000000 -1.500000 +v -1.500000 0.250000 -1.500000 +v -1.250000 0.000000 -1.250000 +v -1.250000 0.250000 -1.250000 +v -1.250000 0.000000 -1.500000 +v -1.250000 0.250000 -1.500000 +v 1.250000 0.000000 1.500000 +v 1.250000 0.250000 1.500000 +v 1.250000 0.000000 1.250000 +v 1.250000 0.250000 1.250000 +v 1.500000 0.000000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.500000 0.000000 1.250000 +v 1.500000 0.250000 1.250000 +v -1.500000 0.000000 1.500000 +v -1.500000 0.250000 1.500000 +v -1.500000 0.000000 1.250000 +v -1.500000 0.250000 1.250000 +v -1.250000 0.000000 1.500000 +v -1.250000 0.250000 1.500000 +v -1.250000 0.000000 1.250000 +v -1.250000 0.250000 1.250000 +v 1.375000 0.125000 -1.250000 +v 1.375000 0.125000 1.250000 +v 1.375000 0.000000 1.250000 +v 1.375000 0.000000 -1.250000 +v -1.375000 0.125000 -1.250000 +v -1.375000 0.125000 1.250000 +v -1.375000 0.000000 1.250000 +v -1.375000 0.000000 -1.250000 +v -1.500000 0.125000 -1.250000 +v -1.500000 0.125000 1.250000 +v -1.500000 0.000000 1.250000 +v -1.500000 0.000000 -1.250000 +v -1.250000 0.125000 -1.500000 +v 1.250000 0.125000 -1.500000 +v 1.250000 0.000000 -1.500000 +v -1.250000 0.000000 -1.500000 +v -1.250000 0.125000 -1.375000 +v 1.250000 0.125000 -1.375000 +v 1.250000 0.000000 -1.375000 +v -1.250000 0.000000 -1.375000 +v -1.250000 0.125000 1.375000 +v 1.250000 0.125000 1.375000 +v 1.250000 0.000000 1.375000 +v -1.250000 0.000000 1.375000 +v -1.250000 0.125000 1.500000 +v 1.250000 0.125000 1.500000 +v 1.250000 0.000000 1.500000 +v -1.250000 0.000000 1.500000 +v 1.500000 0.687500 0.187500 +v 1.500000 0.312500 0.187500 +v 1.500000 0.687500 -0.187500 +v 1.500000 0.312500 -0.187500 +v 1.375000 0.625000 -0.125000 +v 1.375000 0.625000 0.125000 +v 1.375000 0.375000 0.125000 +v 1.375000 0.375000 -0.125000 +v 1.375000 0.687500 -0.187500 +v 1.375000 0.687500 0.187500 +v 1.375000 0.312500 0.187500 +v 1.375000 0.312500 -0.187500 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.375000 0.125000 +v 1.250000 0.375000 -0.125000 +v 0.125000 0.125000 1.500000 +v 0.125000 0.125000 -1.500000 +v -0.125000 0.125000 1.500000 +v -0.125000 0.125000 -1.500000 +v -0.125000 0.250000 1.500000 +v 0.125000 0.250000 1.500000 +v 0.125000 0.250000 -1.500000 +v -0.125000 0.250000 -1.500000 +v -0.875000 0.125000 1.500000 +v -0.875000 0.125000 -1.500000 +v -1.125000 0.125000 1.500000 +v -1.125000 0.125000 -1.500000 +v -1.125000 0.250000 1.500000 +v -0.875000 0.250000 1.500000 +v -0.875000 0.250000 -1.500000 +v -1.125000 0.250000 -1.500000 +v 1.125000 0.125000 1.500000 +v 1.125000 0.125000 -1.500000 +v 0.875000 0.125000 1.500000 +v 0.875000 0.125000 -1.500000 +v 0.875000 0.250000 1.500000 +v 1.125000 0.250000 1.500000 +v 1.125000 0.250000 -1.500000 +v 0.875000 0.250000 -1.500000 +v -1.250000 0.250000 1.250000 +v 1.250000 0.250000 1.250000 +v -0.250000 0.250000 -1.250000 +v 1.250000 0.250000 -1.250000 +v -0.250000 0.750000 -1.250000 +v -1.250000 0.750000 1.250000 +v 1.250000 0.750000 1.250000 +v 1.250000 0.750000 -1.250000 +v -1.250000 0.250000 0.750000 +v 1.250000 0.250000 0.750000 +v -1.250000 0.750000 0.750000 +v 1.250000 0.750000 0.750000 +v -1.250000 0.250000 -1.250000 +v -1.250000 0.750000 -1.250000 +v -0.750000 0.250000 -1.250000 +v -0.750000 0.750000 -1.250000 +v -1.250000 0.750000 0.250000 +v -1.250000 0.250000 0.250000 +v -0.750000 0.750000 0.250000 +v -0.750000 0.250000 0.250000 +v 1.250000 0.250000 0.250000 +v -0.250000 0.250000 0.250000 +v 1.250000 0.750000 0.250000 +v -0.250000 0.750000 0.250000 +v -0.000000 1.250000 -1.375000 +v -0.526190 1.250000 -1.270334 +v -0.972272 1.250000 -0.972272 +v -1.270334 1.250000 -0.526190 +v -1.375000 1.250000 0.000000 +v -1.270334 1.250000 0.526190 +v -0.972272 1.250000 0.972272 +v -0.526190 1.250000 1.270334 +v -0.000000 1.250000 1.375000 +v 0.526189 1.250000 1.270334 +v 0.972271 1.250000 0.972272 +v 1.270334 1.250000 0.526190 +v 1.375000 1.250000 0.000000 +v 1.270334 1.250000 -0.526190 +v 0.972271 1.250000 -0.972272 +v 0.526189 1.250000 -1.270335 +v -0.000000 1.250000 -1.125000 +v -0.430519 1.250000 -1.039364 +v -0.795495 1.250000 -0.795495 +v -1.039365 1.250000 -0.430519 +v -1.125000 1.250000 0.000000 +v -1.039365 1.250000 0.430519 +v -0.795495 1.250000 0.795495 +v -0.430519 1.250000 1.039364 +v -0.000000 1.250000 1.125000 +v 0.430518 1.250000 1.039365 +v 0.795495 1.250000 0.795496 +v 1.039364 1.250000 0.430519 +v 1.125000 1.250000 0.000000 +v 1.039364 1.250000 -0.430519 +v 0.795495 1.250000 -0.795496 +v 0.430518 1.250000 -1.039365 +v -0.526190 1.000000 -1.270334 +v -0.000000 1.000000 -1.375000 +v -0.972272 1.000000 -0.972272 +v -1.270334 1.000000 -0.526190 +v -1.375000 1.000000 0.000000 +v -1.270334 1.000000 0.526190 +v -0.972272 1.000000 0.972272 +v -0.526190 1.000000 1.270334 +v -0.000000 1.000000 1.375000 +v 0.526189 1.000000 1.270334 +v 0.972271 1.000000 0.972272 +v 1.270334 1.000000 0.526190 +v 1.375000 1.000000 0.000000 +v 1.270334 1.000000 -0.526190 +v 0.972271 1.000000 -0.972272 +v 0.526189 1.000000 -1.270335 +v -0.430519 1.000000 -1.039364 +v -0.000000 1.000000 -1.125000 +v -0.795495 1.000000 -0.795495 +v -1.039365 1.000000 -0.430519 +v -1.125000 1.000000 0.000000 +v -1.039365 1.000000 0.430519 +v -0.795495 1.000000 0.795495 +v -0.430519 1.000000 1.039364 +v -0.000000 1.000000 1.125000 +v 0.430518 1.000000 1.039365 +v 0.795495 1.000000 0.795496 +v 1.039364 1.000000 0.430519 +v 1.125000 1.000000 0.000000 +v 1.039364 1.000000 -0.430519 +v 0.795495 1.000000 -0.795496 +v 0.430518 1.000000 -1.039365 +v -0.375000 1.000000 0.375000 +v 0.375000 1.000000 0.375000 +v -0.375000 1.000000 -0.375000 +v 0.375000 1.000000 -0.375000 +v -0.250000 0.875000 -0.250000 +v -0.250000 0.875000 0.250000 +v 0.250000 0.875000 0.250000 +v 0.250000 0.875000 -0.250000 +v 0.812500 0.750000 -0.812500 +v 1.187500 0.750000 -0.812500 +v 0.812500 0.750000 -1.187500 +v 1.187500 0.750000 -1.187500 +v 1.125000 1.062500 -1.125000 +v 0.875000 1.062500 -1.125000 +v 1.125000 1.062500 -0.875000 +v 0.875000 1.062500 -0.875000 +v 0.875000 1.062500 1.125000 +v 1.125000 1.062500 1.125000 +v 0.875000 1.062500 0.875000 +v 1.125000 1.062500 0.875000 +v 1.187500 0.750000 0.812500 +v 0.812500 0.750000 0.812500 +v 1.187500 0.750000 1.187500 +v 0.812500 0.750000 1.187500 +v -1.187500 0.750000 -0.812500 +v -0.812500 0.750000 -0.812500 +v -1.187500 0.750000 -1.187500 +v -0.812500 0.750000 -1.187500 +v -0.875000 1.062500 -1.125000 +v -1.125000 1.062500 -1.125000 +v -0.875000 1.062500 -0.875000 +v -1.125000 1.062500 -0.875000 +v -1.125000 1.062500 1.125000 +v -0.875000 1.062500 1.125000 +v -1.125000 1.062500 0.875000 +v -0.875000 1.062500 0.875000 +v -0.812500 0.750000 0.812500 +v -1.187500 0.750000 0.812500 +v -0.812500 0.750000 1.187500 +v -1.187500 0.750000 1.187500 +v -0.375000 0.875000 -0.375000 +v -0.375000 0.875000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.375000 0.875000 -0.375000 +v -0.250000 0.750000 -0.250000 +v -0.250000 0.750000 0.250000 +v 0.250000 0.750000 0.250000 +v 0.250000 0.750000 -0.250000 +v -0.839690 0.812500 0.928078 +v 0.928077 0.812500 -0.839689 +v -0.928078 0.812500 0.839689 +v 0.839689 0.812500 -0.928078 +v -0.928078 0.937500 0.839689 +v -0.839690 0.937500 0.928078 +v 0.928077 0.937500 -0.839689 +v 0.839689 0.937500 -0.928078 +v 0.928077 0.812500 0.839689 +v -0.839690 0.812500 -0.928078 +v 0.839689 0.812500 0.928078 +v -0.928078 0.812500 -0.839689 +v 0.839689 0.937500 0.928078 +v 0.928077 0.937500 0.839689 +v -0.839690 0.937500 -0.928078 +v -0.928078 0.937500 -0.839689 +v 1.250000 0.437500 0.875000 +v 1.250000 0.562500 0.875000 +v -1.250000 0.500000 0.250000 +v 1.250000 0.500000 0.250000 +v -1.250000 0.323223 0.323223 +v 1.250000 0.323223 0.323223 +v -1.250000 0.250000 0.500000 +v 1.250000 0.250000 0.500000 +v -1.250000 0.323223 0.676777 +v 1.250000 0.323223 0.676777 +v -1.250000 0.500000 0.750000 +v 1.250000 0.500000 0.750000 +v -1.250000 0.676777 0.676777 +v 1.250000 0.676777 0.676777 +v -1.250000 0.750000 0.500000 +v 1.250000 0.750000 0.500000 +v -1.250000 0.676777 0.323223 +v 1.250000 0.676777 0.323223 +v 1.250000 0.562500 0.125000 +v 1.250000 0.437500 0.125000 +v 1.375000 0.437500 0.125000 +v 1.375000 0.562500 0.125000 +v 1.375000 0.437500 0.875000 +v 1.375000 0.562500 0.875000 +v -1.250001 0.437500 0.125000 +v -1.250001 0.562500 0.125000 +v -1.250001 0.562500 0.875000 +v -1.250001 0.437500 0.875000 +v -1.375001 0.437500 0.875000 +v -1.375001 0.562500 0.875000 +v -1.375001 0.437500 0.125000 +v -1.375001 0.562500 0.125000 +v -1.187500 1.000000 -1.187500 +v -1.187500 1.000000 -0.812500 +v -0.812500 1.000000 -0.812500 +v -0.812500 1.000000 -1.187500 +v 1.187500 1.000000 -1.187500 +v 0.812500 1.000000 -1.187500 +v 1.187500 1.000000 -0.812500 +v 0.812500 1.000000 -0.812500 +v 0.812500 1.000000 0.812500 +v 0.812500 1.000000 1.187500 +v 1.187500 1.000000 1.187500 +v 1.187500 1.000000 0.812500 +v -1.187500 1.000000 0.812500 +v -1.187500 1.000000 1.187500 +v -0.812500 1.000000 1.187500 +v -0.812500 1.000000 0.812500 +v 1.500000 0.687500 -0.812500 +v 1.500000 0.312500 -0.812500 +v 1.500000 0.687500 -1.187500 +v 1.500000 0.312500 -1.187500 +v 1.375000 0.625000 -1.125000 +v 1.375000 0.625000 -0.875000 +v 1.375000 0.375000 -0.875000 +v 1.375000 0.375000 -1.125000 +v 1.375000 0.687500 -1.187500 +v 1.375000 0.687500 -0.812500 +v 1.375000 0.312500 -0.812500 +v 1.375000 0.312500 -1.187500 +v 1.250000 0.625000 -1.125000 +v 1.250000 0.625000 -0.875000 +v 1.250000 0.375000 -0.875000 +v 1.250000 0.375000 -1.125000 +v 1.500000 0.687500 1.187500 +v 1.500000 0.312500 1.187500 +v 1.500000 0.687500 0.812500 +v 1.500000 0.312500 0.812500 +v 1.375000 0.625000 0.875000 +v 1.375000 0.625000 1.125000 +v 1.375000 0.375000 1.125000 +v 1.375000 0.375000 0.875000 +v 1.375000 0.687500 0.812500 +v 1.375000 0.687500 1.187500 +v 1.375000 0.312500 1.187500 +v 1.375000 0.312500 0.812500 +v 1.250000 0.625000 0.875000 +v 1.250000 0.625000 1.125000 +v 1.250000 0.375000 1.125000 +v 1.250000 0.375000 0.875000 +v -1.500000 0.687500 -0.187500 +v -1.500000 0.312500 -0.187500 +v -1.500000 0.687500 0.187500 +v -1.500000 0.312500 0.187500 +v -1.375000 0.625000 0.125000 +v -1.375000 0.625000 -0.125000 +v -1.375000 0.375000 -0.125000 +v -1.375000 0.375000 0.125000 +v -1.375000 0.687500 0.187500 +v -1.375000 0.687500 -0.187500 +v -1.375000 0.312500 -0.187500 +v -1.375000 0.312500 0.187500 +v -1.250000 0.625000 0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.375000 -0.125000 +v -1.250000 0.375000 0.125000 +v -1.500000 0.687500 0.812500 +v -1.500000 0.312500 0.812500 +v -1.500000 0.687500 1.187500 +v -1.500000 0.312500 1.187500 +v -1.375000 0.625000 1.125000 +v -1.375000 0.625000 0.875000 +v -1.375000 0.375000 0.875000 +v -1.375000 0.375000 1.125000 +v -1.375000 0.687500 1.187500 +v -1.375000 0.687500 0.812500 +v -1.375000 0.312500 0.812500 +v -1.375000 0.312500 1.187500 +v -1.250000 0.625000 1.125000 +v -1.250000 0.625000 0.875000 +v -1.250000 0.375000 0.875000 +v -1.250000 0.375000 1.125000 +v -1.500000 0.687500 -1.187500 +v -1.500000 0.312500 -1.187500 +v -1.500000 0.687500 -0.812500 +v -1.500000 0.312500 -0.812500 +v -1.375000 0.625000 -0.875000 +v -1.375000 0.625000 -1.125000 +v -1.375000 0.375000 -1.125000 +v -1.375000 0.375000 -0.875000 +v -1.375000 0.687500 -0.812500 +v -1.375000 0.687500 -1.187500 +v -1.375000 0.312500 -1.187500 +v -1.375000 0.312500 -0.812500 +v -1.250000 0.625000 -0.875000 +v -1.250000 0.625000 -1.125000 +v -1.250000 0.375000 -1.125000 +v -1.250000 0.375000 -0.875000 +v 0.187500 0.687500 -1.500000 +v 0.187500 0.312500 -1.500000 +v -0.187500 0.687500 -1.500000 +v -0.187500 0.312500 -1.500000 +v -0.125000 0.625000 -1.375000 +v 0.125000 0.625000 -1.375000 +v 0.125000 0.375000 -1.375000 +v -0.125000 0.375000 -1.375000 +v -0.187500 0.687500 -1.375000 +v 0.187500 0.687500 -1.375000 +v 0.187500 0.312500 -1.375000 +v -0.187500 0.312500 -1.375000 +v -0.125000 0.625000 -1.250000 +v 0.125000 0.625000 -1.250000 +v 0.125000 0.375000 -1.250000 +v -0.125000 0.375000 -1.250000 +v -0.812500 0.687500 -1.500000 +v -0.812500 0.312500 -1.500000 +v -1.187500 0.687500 -1.500000 +v -1.187500 0.312500 -1.500000 +v -1.125000 0.625000 -1.375000 +v -0.875000 0.625000 -1.375000 +v -0.875000 0.375000 -1.375000 +v -1.125000 0.375000 -1.375000 +v -1.187500 0.687500 -1.375000 +v -0.812500 0.687500 -1.375000 +v -0.812500 0.312500 -1.375000 +v -1.187500 0.312500 -1.375000 +v -1.125000 0.625000 -1.250000 +v -0.875000 0.625000 -1.250000 +v -0.875000 0.375000 -1.250000 +v -1.125000 0.375000 -1.250000 +v 1.187500 0.687500 -1.500000 +v 1.187500 0.312500 -1.500000 +v 0.812500 0.687500 -1.500000 +v 0.812500 0.312500 -1.500000 +v 0.875000 0.625000 -1.375000 +v 1.125000 0.625000 -1.375000 +v 1.125000 0.375000 -1.375000 +v 0.875000 0.375000 -1.375000 +v 0.812500 0.687500 -1.375000 +v 1.187500 0.687500 -1.375000 +v 1.187500 0.312500 -1.375000 +v 0.812500 0.312500 -1.375000 +v 0.875000 0.625000 -1.250000 +v 1.125000 0.625000 -1.250000 +v 1.125000 0.375000 -1.250000 +v 0.875000 0.375000 -1.250000 +v -0.187500 0.687500 1.500000 +v -0.187500 0.312500 1.500000 +v 0.187500 0.687500 1.500000 +v 0.187500 0.312500 1.500000 +v 0.125000 0.625000 1.375000 +v -0.125000 0.625000 1.375000 +v -0.125000 0.375000 1.375000 +v 0.125000 0.375000 1.375000 +v 0.187500 0.687500 1.375000 +v -0.187500 0.687500 1.375000 +v -0.187500 0.312500 1.375000 +v 0.187500 0.312500 1.375000 +v 0.125000 0.625000 1.250000 +v -0.125000 0.625000 1.250000 +v -0.125000 0.375000 1.250000 +v 0.125000 0.375000 1.250000 +v 0.812500 0.687500 1.500000 +v 0.812500 0.312500 1.500000 +v 1.187500 0.687500 1.500000 +v 1.187500 0.312500 1.500000 +v 1.125000 0.625000 1.375000 +v 0.875000 0.625000 1.375000 +v 0.875000 0.375000 1.375000 +v 1.125000 0.375000 1.375000 +v 1.187500 0.687500 1.375000 +v 0.812500 0.687500 1.375000 +v 0.812500 0.312500 1.375000 +v 1.187500 0.312500 1.375000 +v 1.125000 0.625000 1.250000 +v 0.875000 0.625000 1.250000 +v 0.875000 0.375000 1.250000 +v 1.125000 0.375000 1.250000 +v -1.187500 0.687500 1.500000 +v -1.187500 0.312500 1.500000 +v -0.812500 0.687500 1.500000 +v -0.812500 0.312500 1.500000 +v -0.875000 0.625000 1.375000 +v -1.125000 0.625000 1.375000 +v -1.125000 0.375000 1.375000 +v -0.875000 0.375000 1.375000 +v -0.812500 0.687500 1.375000 +v -1.187500 0.687500 1.375000 +v -1.187500 0.312500 1.375000 +v -0.812500 0.312500 1.375000 +v -0.875000 0.625000 1.250000 +v -1.125000 0.625000 1.250000 +v -1.125000 0.375000 1.250000 +v -0.875000 0.375000 1.250000 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.851852 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.315789 0.370370 +vt 0.368421 0.740741 +vt 0.315789 0.740741 +vt 0.473684 0.740741 +vt 0.421053 0.370370 +vt 0.473684 0.370370 +vt 0.368421 0.814815 +vt 0.315789 0.814815 +vt 0.263158 0.814815 +vt 0.210526 0.592593 +vt 0.263158 0.592593 +vt 0.263158 0.370370 +vt 0.368421 0.370370 +vt 0.315789 0.296296 +vt 0.684211 0.518519 +vt 0.736842 0.444444 +vt 0.736842 0.518519 +vt 0.473684 0.444444 +vt 0.526316 0.518519 +vt 0.473684 0.518519 +vt 0.684211 0.370370 +vt 0.526316 0.296296 +vt 0.684211 0.296296 +vt 0.684211 0.592593 +vt 0.526316 0.444444 +vt 0.684211 0.444444 +vt 0.526316 0.370370 +vt 0.052632 0.592593 +vt -0.000000 0.814815 +vt -0.000000 0.592593 +vt 0.210526 0.888889 +vt 0.052632 0.814815 +vt 0.210526 0.814815 +vt 0.210526 0.518519 +vt 0.052632 0.296296 +vt 0.210526 0.296296 +vt 0.052632 0.518519 +vt 0.263158 0.074074 +vt 0.315789 0.111111 +vt 0.269737 0.111111 +vt 0.210526 0.074074 +vt 0.263158 0.111111 +vt 0.217105 0.111111 +vt 0.157895 0.074074 +vt 0.210526 0.111111 +vt 0.164474 0.111111 +vt 0.105263 0.074074 +vt 0.157895 0.111111 +vt 0.111842 0.111111 +vt 0.052632 0.074074 +vt 0.105263 0.111111 +vt 0.059211 0.111111 +vt -0.000000 0.074074 +vt 0.052632 0.111111 +vt 0.006579 0.111111 +vt 0.842105 0.074074 +vt 0.796053 0.111111 +vt 0.789474 0.074074 +vt 0.743421 0.111111 +vt 0.736842 0.074074 +vt 0.690789 0.111111 +vt 0.684211 0.074074 +vt 0.638158 0.111111 +vt 0.631579 0.074074 +vt 0.585526 0.111111 +vt 0.578947 0.074074 +vt 0.532895 0.111111 +vt 0.526316 0.074074 +vt 0.480263 0.111111 +vt 0.473684 0.074074 +vt 0.427632 0.111111 +vt 0.421053 0.074074 +vt 0.375000 0.111111 +vt 0.368421 0.074074 +vt 0.315789 0.074074 +vt 0.368421 0.111111 +vt 0.322368 0.111111 +vt 0.263158 0.037037 +vt 0.315789 0.000000 +vt 0.315789 0.037037 +vt 0.210526 0.037037 +vt 0.263158 0.000000 +vt 0.157895 0.037037 +vt 0.210526 0.000000 +vt 0.105263 0.037037 +vt 0.157895 0.000000 +vt 0.052632 0.037037 +vt 0.105263 0.000000 +vt -0.000000 0.037037 +vt 0.052632 0.000000 +vt 0.802632 0.000000 +vt 0.842105 0.037037 +vt 0.789474 0.037037 +vt 0.750000 0.000000 +vt 0.736842 0.037037 +vt 0.697368 0.000000 +vt 0.684211 0.037037 +vt 0.644737 0.000000 +vt 0.631579 0.037037 +vt 0.592105 0.000000 +vt 0.578947 0.037037 +vt 0.539474 0.000000 +vt 0.526316 0.037037 +vt 0.480263 0.000000 +vt 0.473684 0.037037 +vt 0.427632 0.000000 +vt 0.421053 0.037037 +vt 0.375000 0.000000 +vt 0.368421 0.037037 +vt 0.368421 0.000000 +vt 0.578947 0.722222 +vt 0.657895 0.833333 +vt 0.578947 0.833333 +vt 0.592105 0.685185 +vt 0.644737 0.666667 +vt 0.644737 0.685185 +vt 0.578947 0.851852 +vt 0.657895 0.722222 +vt 0.671053 0.833333 +vt 0.565789 0.722222 +vt 0.657895 0.703704 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.444444 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.776316 0.444444 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.855263 0.444444 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.776316 0.444444 +vt 0.815789 0.481481 +vt 0.776316 0.444444 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.776316 0.481481 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.592105 0.870370 +vt 0.657895 0.851852 +vt 0.644737 0.870370 +vt 0.552632 0.740741 +vt 0.565789 0.833333 +vt 0.552632 0.814815 +vt 0.578947 0.703704 +vt 0.684211 0.814815 +vt 0.671053 0.722222 +vt 0.684211 0.740741 +vt 0.644737 0.592593 +vt 0.592105 0.666667 +vt 0.592105 0.592593 +vt 0.592105 0.888889 +vt 0.697368 0.814815 +vt 0.539474 0.740741 +vt 0.736842 0.370370 +vt 1.000000 0.388889 +vt 0.736842 0.388889 +vt 0.736842 0.407407 +vt 1.000000 0.425926 +vt 0.736842 0.425926 +vt 0.736842 0.444444 +vt 1.000000 0.444444 +vt 0.736842 0.370370 +vt 1.000000 0.388889 +vt 0.736842 0.388889 +vt 0.736842 0.407407 +vt 1.000000 0.425926 +vt 0.736842 0.425926 +vt 0.736842 0.444444 +vt 1.000000 0.444444 +vt 0.447368 0.351852 +vt 0.526316 0.333333 +vt 0.526316 0.351852 +vt 0.447368 0.314815 +vt 0.526316 0.333333 +vt 0.447368 0.333333 +vt 0.526316 0.296296 +vt 0.447368 0.314815 +vt 0.447368 0.296296 +vt 0.526316 0.296296 +vt 0.447368 0.296296 +vt 0.447368 0.333333 +vt 0.737094 0.333333 +vt 0.744728 0.307394 +vt 0.763158 0.296650 +vt 0.447368 0.351852 +vt 0.526316 0.351852 +vt 0.834220 0.307394 +vt 0.834220 0.359272 +vt 0.797359 0.359272 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.769737 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.546053 0.712963 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.210526 0.833333 +vt 0.473684 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.328947 0.888889 +vt 0.328947 0.888889 +vt 0.328947 0.888889 +vt 0.421053 0.740741 +vt 0.263158 0.740741 +vt 0.368421 0.296296 +vt 0.526316 0.592593 +vt 0.052632 0.888889 +vt 0.842105 0.111111 +vt 0.789474 0.111111 +vt 0.736842 0.111111 +vt 0.684211 0.111111 +vt 0.631579 0.111111 +vt 0.578947 0.111111 +vt 0.526316 0.111111 +vt 0.473684 0.111111 +vt 0.421053 0.111111 +vt 0.269737 0.000000 +vt 0.217105 0.000000 +vt 0.164474 0.000000 +vt 0.111842 0.000000 +vt 0.059211 0.000000 +vt 0.006579 0.000000 +vt 0.842105 0.000000 +vt 0.789474 0.000000 +vt 0.736842 0.000000 +vt 0.684211 0.000000 +vt 0.631579 0.000000 +vt 0.578947 0.000000 +vt 0.526316 0.000000 +vt 0.473684 0.000000 +vt 0.421053 0.000000 +vt 0.322368 0.000000 +vt 0.644737 0.888889 +vt 0.697368 0.740741 +vt 0.539474 0.814815 +vt 1.000000 0.370370 +vt 1.000000 0.407407 +vt 1.000000 0.370370 +vt 1.000000 0.407407 +vt 0.526316 0.314815 +vt 0.526316 0.314815 +vt 0.781588 0.307394 +vt 0.789223 0.333333 +vt 0.781588 0.359272 +vt 0.763158 0.370016 +vt 0.744728 0.359272 +vt 0.789725 0.333333 +vt 0.797359 0.307394 +vt 0.815790 0.296650 +vt 0.841854 0.333333 +vt 0.815790 0.370017 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.059211 0.148148 +vt 0.111842 0.148148 +vt 0.164474 0.148148 +vt 0.217105 0.148148 +vt 0.269737 0.148148 +vt 0.322368 0.148148 +vt 0.375000 0.148148 +vt 0.427632 0.148148 +vt 0.480263 0.148148 +vt 0.638158 0.148148 +vt 0.532895 0.148148 +vt 0.690789 0.148148 +vt 0.585526 0.148148 +vt 0.743421 0.148148 +vt 0.796053 0.148148 +vt 0.006579 0.148148 +vt 0.960526 0.000000 +vt 0.980263 0.370370 +vt 0.960526 0.370370 +vt 0.980263 0.000000 +vt 1.000000 0.370370 +vt 0.842105 0.000000 +vt 0.861842 0.370370 +vt 0.842105 0.370370 +vt 0.861842 0.000000 +vt 0.881579 0.370370 +vt 0.881579 0.000000 +vt 0.901316 0.370370 +vt 0.901316 0.000000 +vt 0.921053 0.370370 +vt 0.921053 0.000000 +vt 0.940789 0.370370 +vt 0.940789 0.000000 +vt 0.105263 0.148148 +vt 0.157895 0.148148 +vt 0.210526 0.148148 +vt 0.263158 0.148148 +vt 0.315789 0.148148 +vt 0.368421 0.148148 +vt 0.421053 0.148148 +vt 0.473684 0.148148 +vt 0.526316 0.148148 +vt 0.684211 0.148148 +vt 0.578947 0.148148 +vt 0.736842 0.148148 +vt 0.631579 0.148148 +vt 0.789474 0.148148 +vt 0.842105 0.148148 +vt 0.052632 0.148148 +vt 1.000000 0.000000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.9239 0.0000 -0.3827 +vn 0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.9239 0.0000 0.3827 +vn -0.3827 0.0000 -0.9239 +vn -0.9239 0.0000 -0.3827 +vn -0.9239 0.0000 0.3827 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 -0.7071 0.7071 +s off +f 566/989/107 564/990/107 565/991/107 +f 568/992/108 569/993/108 567/994/108 +f 570/995/109 573/996/109 569/993/109 +f 574/997/107 571/998/107 573/996/107 +f 572/999/110 567/994/110 571/1000/110 +f 573/996/111 567/1001/111 569/1002/111 +f 570/1003/112 572/1004/112 574/997/112 +f 576/1005/108 577/1006/108 575/1007/108 +f 578/1008/109 581/1009/109 577/1006/109 +f 582/1010/107 579/1011/107 581/1009/107 +f 580/1012/110 575/1007/110 579/1013/110 +f 581/1009/111 575/1014/111 577/1015/111 +f 578/1016/112 580/1017/112 582/1010/112 +f 584/1018/108 585/1019/108 583/1020/108 +f 586/1021/109 589/1022/109 585/1019/109 +f 590/1023/107 587/1024/107 589/1022/107 +f 588/1025/110 583/1020/110 587/1026/110 +f 589/1022/111 583/1027/111 585/1028/111 +f 586/1029/112 588/1030/112 590/1023/112 +f 592/1031/108 593/1032/108 591/1033/108 +f 594/1034/109 597/1035/109 593/1032/109 +f 598/1036/107 595/1037/107 597/1035/107 +f 596/1038/110 591/1033/110 595/1039/110 +f 597/1035/111 591/1040/111 593/1041/111 +f 594/1042/112 596/1043/112 598/1036/112 +f 565/991/111 602/1044/111 566/989/111 +f 563/1045/112 600/1046/112 564/990/112 +f 602/1044/108 600/1047/108 599/1048/108 +f 606/1049/107 604/1050/107 605/1051/107 +f 605/1051/111 610/1052/111 606/1049/111 +f 603/1053/112 608/1054/112 604/1055/112 +f 610/1052/108 608/1054/108 607/1056/108 +f 614/1057/109 612/1058/109 613/1059/109 +f 613/1059/111 618/1060/111 614/1057/111 +f 611/1061/112 616/1062/112 612/1058/112 +f 618/1060/110 616/1063/110 615/1064/110 +f 622/1065/109 620/1066/109 621/1067/109 +f 621/1067/111 626/1068/111 622/1065/111 +f 619/1069/112 624/1070/112 620/1071/112 +f 626/1068/110 624/1070/110 623/1072/110 +f 628/1073/107 629/1074/107 627/1075/107 +f 633/1076/111 642/1077/111 634/1078/111 +f 630/1079/109 635/1080/109 629/1074/109 +f 627/1075/110 637/1081/110 628/1073/110 +f 628/1073/111 638/1082/111 630/1079/111 +f 629/1074/112 636/1083/112 627/1075/112 +f 632/1084/108 635/1085/108 631/1086/108 +f 633/1087/108 636/1088/108 632/1089/108 +f 634/1078/108 637/1090/108 633/1076/108 +f 631/1091/108 638/1092/108 634/1093/108 +f 631/1086/112 640/1094/112 632/1084/112 +f 634/1093/109 639/1095/109 631/1091/109 +f 632/1089/110 641/1096/110 633/1087/110 +f 645/1097/111 644/1098/111 643/1099/111 +f 649/1100/112 647/1101/112 648/1102/112 +f 645/1103/108 650/1104/108 646/1105/108 +f 644/1098/107 648/1102/107 643/1099/107 +f 646/1106/109 649/1100/109 644/1107/109 +f 643/1108/110 647/1101/110 645/1109/110 +f 653/1110/111 652/1111/111 651/1112/111 +f 657/1113/112 655/1114/112 656/1115/112 +f 653/1116/108 658/1117/108 654/1118/108 +f 652/1111/107 656/1115/107 651/1112/107 +f 654/1119/109 657/1113/109 652/1120/109 +f 651/1121/110 655/1114/110 653/1122/110 +f 661/1123/111 660/1124/111 659/1125/111 +f 665/1126/112 663/1127/112 664/1128/112 +f 661/1129/108 666/1130/108 662/1131/108 +f 660/1124/107 664/1128/107 659/1125/107 +f 662/1132/109 665/1126/109 660/1133/109 +f 659/1134/110 663/1127/110 661/1135/110 +f 667/1136/111 676/1137/111 668/1138/111 +f 673/1139/112 677/1140/112 672/1141/112 +f 668/1138/107 678/1142/107 673/1143/107 +f 669/1144/109 674/1145/109 670/1146/109 +f 668/1138/110 672/1147/110 667/1136/110 +f 677/1140/109 676/1137/109 675/1148/109 +f 672/1149/108 675/1148/108 667/1136/108 +f 680/1150/109 681/1151/109 679/1152/109 +f 686/1153/110 683/1154/110 684/1155/110 +f 681/1156/111 684/1157/111 679/1158/111 +f 679/1159/108 683/1154/108 680/1150/108 +f 680/1150/112 685/1160/112 682/1161/112 +f 682/1161/107 686/1162/107 681/1156/107 +f 689/1163/110 688/1164/110 687/1165/110 +f 669/1166/108 690/1167/108 671/1168/108 +f 671/1168/112 689/1163/112 674/1145/112 +f 670/1169/111 688/1170/111 669/1171/111 +f 674/1145/107 687/1172/107 670/1169/107 +f 700/1173/112 717/1174/112 716/1175/112 +f 699/1176/112 716/1177/112 715/1178/112 +f 698/1179/112 715/1180/112 714/1181/112 +f 697/1182/112 714/1183/112 713/1184/112 +f 696/1185/112 713/1186/112 712/1187/112 +f 695/1188/112 712/1189/112 711/1190/112 +f 695/1191/112 710/1192/112 694/1193/112 +f 694/1193/112 709/1194/112 693/1195/112 +f 693/1195/112 708/1196/112 692/1197/112 +f 692/1197/112 707/1198/112 691/1199/112 +f 691/1199/112 722/1200/112 706/1201/112 +f 706/1201/112 721/1202/112 705/1203/112 +f 705/1203/112 720/1204/112 704/1205/112 +f 704/1205/112 719/1206/112 703/1207/112 +f 703/1207/112 718/1208/112 702/1209/112 +f 701/1210/112 718/1211/112 717/1212/112 +f 732/1213/111 749/1214/111 733/1215/111 +f 731/1216/111 748/1217/111 732/1213/111 +f 730/1218/111 747/1219/111 731/1216/111 +f 729/1220/111 746/1221/111 730/1218/111 +f 728/1222/111 745/1223/111 729/1220/111 +f 727/1224/111 744/1225/111 728/1222/111 +f 742/1226/111 727/1227/111 726/1228/111 +f 741/1229/111 726/1228/111 725/1230/111 +f 739/1231/111 725/1230/111 723/1232/111 +f 740/1233/111 723/1232/111 724/1234/111 +f 754/1235/111 724/1234/111 738/1236/111 +f 753/1237/111 738/1236/111 737/1238/111 +f 752/1239/111 737/1238/111 736/1240/111 +f 751/1241/111 736/1240/111 735/1242/111 +f 750/1243/111 735/1242/111 734/1244/111 +f 733/1215/111 750/1245/111 734/1244/111 +f 756/1246/112 757/1247/112 755/1248/112 +f 761/1249/107 802/1250/107 762/1251/107 +f 757/1247/108 796/1252/108 755/1248/108 +f 758/1253/109 795/1254/109 757/1247/109 +f 755/1248/110 797/1255/110 756/1246/110 +f 756/1246/107 798/1256/107 758/1253/107 +f 794/1257/108 863/1258/108 792/1259/108 +f 791/1260/107 865/1261/107 793/1262/107 +f 779/1263/108 851/1264/108 781/1265/108 +f 781/1265/109 854/1266/109 782/1267/109 +f 780/1268/110 852/1269/110 779/1263/110 +f 785/1270/112 784/1271/112 786/1272/112 +f 769/1273/112 768/1274/112 770/1275/112 +f 764/1276/110 858/1277/110 763/1278/110 +f 765/1279/109 855/1280/109 766/1281/109 +f 763/1278/108 856/1282/108 765/1279/108 +f 775/1283/107 861/1284/107 777/1285/107 +f 778/1286/108 859/1287/108 776/1288/108 +f 776/1288/109 862/1289/109 775/1283/109 +f 777/1290/110 860/1291/110 778/1286/110 +f 772/1292/112 773/1293/112 771/1294/112 +f 766/1281/107 857/1295/107 764/1296/107 +f 792/1259/109 866/1297/109 791/1260/109 +f 793/1298/110 864/1299/110 794/1257/110 +f 788/1300/112 789/1301/112 787/1302/112 +f 782/1267/107 853/1303/107 780/1304/107 +f 760/1305/111 795/1306/111 759/1307/111 +f 761/1308/111 796/1309/111 760/1310/111 +f 762/1251/111 797/1311/111 761/1249/111 +f 759/1312/111 798/1313/111 762/1314/111 +f 799/1315/111 801/1316/111 800/1317/111 +f 759/1307/108 800/1318/108 760/1305/108 +f 762/1314/109 799/1319/109 759/1312/109 +f 760/1310/110 801/1320/110 761/1308/110 +f 805/1321/111 804/1322/111 803/1323/111 +f 808/1324/112 810/1325/112 807/1326/112 +f 804/1322/113 808/1324/113 803/1323/113 +f 805/1327/114 810/1325/114 806/1328/114 +f 813/1329/111 812/1330/111 811/1331/111 +f 816/1332/112 818/1333/112 815/1334/112 +f 812/1330/115 816/1332/115 811/1331/115 +f 813/1335/116 818/1333/116 814/1336/116 +f 820/1337/112 840/1338/112 837/1339/112 +f 849/1340/108 848/1341/108 850/1342/108 +f 838/1343/111 841/1344/111 819/1345/111 +f 846/1346/111 849/1340/111 843/1347/111 +f 841/1344/107 840/1338/107 842/1348/107 +f 830/1349/107 828/1350/107 826/1351/107 +f 844/1352/112 848/1341/112 845/1353/112 +f 827/1354/108 831/1355/108 835/1356/108 +f 784/1357/117 852/1269/117 786/1358/117 +f 786/1359/118 853/1360/118 785/1361/118 +f 785/1270/119 854/1266/119 783/1362/119 +f 783/1363/120 851/1264/120 784/1364/120 +f 767/1365/120 856/1282/120 768/1366/120 +f 769/1273/119 855/1280/119 767/1367/119 +f 770/1368/118 857/1369/118 769/1370/118 +f 768/1371/117 858/1277/117 770/1372/117 +f 773/1373/117 860/1291/117 771/1374/117 +f 771/1375/118 861/1376/118 772/1377/118 +f 772/1292/119 862/1289/119 774/1378/119 +f 774/1379/120 859/1287/120 773/1380/120 +f 789/1381/117 864/1299/117 787/1382/117 +f 787/1383/118 865/1384/118 788/1385/118 +f 788/1300/119 866/1297/119 790/1386/119 +f 790/1387/120 863/1258/120 789/1388/120 +f 868/1389/107 869/1390/107 867/1391/107 +f 873/1392/111 882/1393/111 874/1394/111 +f 870/1395/109 875/1396/109 869/1390/109 +f 867/1391/110 877/1397/110 868/1389/110 +f 868/1389/111 878/1398/111 870/1395/111 +f 869/1390/112 876/1399/112 867/1391/112 +f 872/1400/108 875/1401/108 871/1402/108 +f 873/1403/108 876/1404/108 872/1405/108 +f 874/1394/108 877/1406/108 873/1392/108 +f 871/1407/108 878/1408/108 874/1409/108 +f 871/1402/112 880/1410/112 872/1400/112 +f 874/1409/109 879/1411/109 871/1407/109 +f 872/1405/110 881/1412/110 873/1403/110 +f 884/1413/107 885/1414/107 883/1415/107 +f 889/1416/111 898/1417/111 890/1418/111 +f 886/1419/109 891/1420/109 885/1414/109 +f 883/1415/110 893/1421/110 884/1413/110 +f 884/1413/111 894/1422/111 886/1419/111 +f 885/1414/112 892/1423/112 883/1415/112 +f 888/1424/108 891/1425/108 887/1426/108 +f 889/1427/108 892/1428/108 888/1429/108 +f 890/1418/108 893/1430/108 889/1416/108 +f 887/1431/108 894/1432/108 890/1433/108 +f 887/1426/112 896/1434/112 888/1424/112 +f 890/1433/109 895/1435/109 887/1431/109 +f 888/1429/110 897/1436/110 889/1427/110 +f 900/1437/108 901/1438/108 899/1439/108 +f 905/1440/111 914/1441/111 906/1442/111 +f 902/1443/110 907/1444/110 901/1438/110 +f 899/1439/109 909/1445/109 900/1437/109 +f 900/1437/111 910/1446/111 902/1443/111 +f 901/1438/112 908/1447/112 899/1439/112 +f 904/1448/107 907/1449/107 903/1450/107 +f 905/1451/107 908/1452/107 904/1453/107 +f 906/1442/107 909/1454/107 905/1440/107 +f 903/1455/107 910/1456/107 906/1457/107 +f 903/1450/112 912/1458/112 904/1448/112 +f 906/1457/110 911/1459/110 903/1455/110 +f 904/1453/109 913/1460/109 905/1451/109 +f 916/1461/108 917/1462/108 915/1463/108 +f 921/1464/111 930/1465/111 922/1466/111 +f 918/1467/110 923/1468/110 917/1462/110 +f 915/1463/109 925/1469/109 916/1461/109 +f 916/1461/111 926/1470/111 918/1467/111 +f 917/1462/112 924/1471/112 915/1463/112 +f 920/1472/107 923/1473/107 919/1474/107 +f 921/1475/107 924/1476/107 920/1477/107 +f 922/1466/107 925/1478/107 921/1464/107 +f 919/1479/107 926/1480/107 922/1481/107 +f 919/1474/112 928/1482/112 920/1472/112 +f 922/1481/110 927/1483/110 919/1479/110 +f 920/1477/109 929/1484/109 921/1475/109 +f 932/1485/108 933/1486/108 931/1487/108 +f 937/1488/111 946/1489/111 938/1490/111 +f 934/1491/110 939/1492/110 933/1486/110 +f 931/1487/109 941/1493/109 932/1485/109 +f 932/1485/111 942/1494/111 934/1491/111 +f 933/1486/112 940/1495/112 931/1487/112 +f 936/1496/107 939/1497/107 935/1498/107 +f 937/1499/107 940/1500/107 936/1501/107 +f 938/1490/107 941/1502/107 937/1488/107 +f 935/1503/107 942/1504/107 938/1505/107 +f 935/1498/112 944/1506/112 936/1496/112 +f 938/1505/110 943/1507/110 935/1503/110 +f 936/1501/109 945/1508/109 937/1499/109 +f 948/1509/109 949/1510/109 947/1511/109 +f 953/1512/111 962/1513/111 954/1514/111 +f 950/1515/108 955/1516/108 949/1510/108 +f 947/1511/107 957/1517/107 948/1509/107 +f 948/1509/111 958/1518/111 950/1515/111 +f 949/1510/112 956/1519/112 947/1511/112 +f 952/1520/110 955/1521/110 951/1522/110 +f 953/1523/110 956/1524/110 952/1525/110 +f 954/1514/110 957/1526/110 953/1512/110 +f 951/1527/110 958/1528/110 954/1529/110 +f 951/1522/112 960/1530/112 952/1520/112 +f 954/1529/108 959/1531/108 951/1527/108 +f 952/1525/107 961/1532/107 953/1523/107 +f 964/1533/109 965/1534/109 963/1535/109 +f 969/1536/111 978/1537/111 970/1538/111 +f 966/1539/108 971/1540/108 965/1534/108 +f 963/1535/107 973/1541/107 964/1533/107 +f 964/1533/111 974/1542/111 966/1539/111 +f 965/1534/112 972/1543/112 963/1535/112 +f 968/1544/110 971/1545/110 967/1546/110 +f 969/1547/110 972/1548/110 968/1549/110 +f 970/1538/110 973/1550/110 969/1536/110 +f 967/1551/110 974/1552/110 970/1553/110 +f 967/1546/112 976/1554/112 968/1544/112 +f 970/1553/108 975/1555/108 967/1551/108 +f 968/1549/107 977/1556/107 969/1547/107 +f 980/1557/109 981/1558/109 979/1559/109 +f 985/1560/111 994/1561/111 986/1562/111 +f 982/1563/108 987/1564/108 981/1558/108 +f 979/1559/107 989/1565/107 980/1557/107 +f 980/1557/111 990/1566/111 982/1563/111 +f 981/1558/112 988/1567/112 979/1559/112 +f 984/1568/110 987/1569/110 983/1570/110 +f 985/1571/110 988/1572/110 984/1573/110 +f 986/1562/110 989/1574/110 985/1560/110 +f 983/1575/110 990/1576/110 986/1577/110 +f 984/1568/112 991/1578/112 992/1579/112 +f 986/1577/108 991/1580/108 983/1575/108 +f 984/1573/107 993/1581/107 985/1571/107 +f 996/1582/110 997/1583/110 995/1584/110 +f 1001/1585/111 1010/1586/111 1002/1587/111 +f 998/1588/107 1003/1589/107 997/1583/107 +f 995/1584/108 1005/1590/108 996/1582/108 +f 996/1582/111 1006/1591/111 998/1588/111 +f 997/1583/112 1004/1592/112 995/1584/112 +f 1000/1593/109 1003/1594/109 999/1595/109 +f 1001/1596/109 1004/1597/109 1000/1598/109 +f 1002/1587/109 1005/1599/109 1001/1585/109 +f 999/1600/109 1006/1601/109 1002/1602/109 +f 1000/1593/112 1007/1603/112 1008/1604/112 +f 1002/1602/107 1007/1605/107 999/1600/107 +f 1000/1598/108 1009/1606/108 1001/1596/108 +f 1012/1607/110 1013/1608/110 1011/1609/110 +f 1017/1610/111 1026/1611/111 1018/1612/111 +f 1014/1613/107 1019/1614/107 1013/1608/107 +f 1011/1609/108 1021/1615/108 1012/1607/108 +f 1012/1607/111 1022/1616/111 1014/1613/111 +f 1013/1608/112 1020/1617/112 1011/1609/112 +f 1016/1618/109 1019/1619/109 1015/1620/109 +f 1017/1621/109 1020/1622/109 1016/1623/109 +f 1018/1612/109 1021/1624/109 1017/1610/109 +f 1015/1625/109 1022/1626/109 1018/1627/109 +f 1015/1620/112 1024/1628/112 1016/1618/112 +f 1018/1627/107 1023/1629/107 1015/1625/107 +f 1016/1623/108 1025/1630/108 1017/1621/108 +f 1028/1631/110 1029/1632/110 1027/1633/110 +f 1033/1634/111 1042/1635/111 1034/1636/111 +f 1030/1637/107 1035/1638/107 1029/1632/107 +f 1027/1633/108 1037/1639/108 1028/1631/108 +f 1028/1631/111 1038/1640/111 1030/1637/111 +f 1027/1633/112 1035/1641/112 1036/1642/112 +f 1032/1643/109 1035/1641/109 1031/1644/109 +f 1033/1645/109 1036/1646/109 1032/1647/109 +f 1034/1636/109 1037/1648/109 1033/1634/109 +f 1031/1649/109 1038/1650/109 1034/1651/109 +f 1032/1643/112 1039/1652/112 1040/1653/112 +f 1034/1651/107 1039/1654/107 1031/1649/107 +f 1032/1647/108 1041/1655/108 1033/1645/108 +f 566/989/107 563/1045/107 564/990/107 +f 568/992/108 570/995/108 569/993/108 +f 570/995/109 574/997/109 573/996/109 +f 574/997/107 572/1004/107 571/998/107 +f 572/999/110 568/992/110 567/994/110 +f 573/996/111 571/998/111 567/1001/111 +f 570/1003/112 568/1656/112 572/1004/112 +f 576/1005/108 578/1008/108 577/1006/108 +f 578/1008/109 582/1010/109 581/1009/109 +f 582/1010/107 580/1017/107 579/1011/107 +f 580/1012/110 576/1005/110 575/1007/110 +f 581/1009/111 579/1011/111 575/1014/111 +f 578/1016/112 576/1657/112 580/1017/112 +f 584/1018/108 586/1021/108 585/1019/108 +f 586/1021/109 590/1023/109 589/1022/109 +f 590/1023/107 588/1030/107 587/1024/107 +f 588/1025/110 584/1018/110 583/1020/110 +f 589/1022/111 587/1024/111 583/1027/111 +f 586/1029/112 584/1658/112 588/1030/112 +f 592/1031/108 594/1034/108 593/1032/108 +f 594/1034/109 598/1036/109 597/1035/109 +f 598/1036/107 596/1043/107 595/1037/107 +f 596/1038/110 592/1031/110 591/1033/110 +f 597/1035/111 595/1037/111 591/1040/111 +f 594/1042/112 592/1659/112 596/1043/112 +f 565/991/111 601/1660/111 602/1044/111 +f 563/1045/112 599/1661/112 600/1046/112 +f 602/1044/108 601/1660/108 600/1047/108 +f 606/1049/107 603/1662/107 604/1050/107 +f 605/1051/111 609/1663/111 610/1052/111 +f 603/1053/112 607/1056/112 608/1054/112 +f 610/1052/108 609/1663/108 608/1054/108 +f 614/1057/109 611/1061/109 612/1058/109 +f 613/1059/111 617/1664/111 618/1060/111 +f 611/1061/112 615/1665/112 616/1062/112 +f 618/1060/110 617/1664/110 616/1063/110 +f 622/1065/109 619/1666/109 620/1066/109 +f 621/1067/111 625/1667/111 626/1068/111 +f 619/1069/112 623/1072/112 624/1070/112 +f 626/1068/110 625/1667/110 624/1070/110 +f 628/1073/107 630/1079/107 629/1074/107 +f 633/1076/111 641/1668/111 642/1077/111 +f 630/1079/109 638/1092/109 635/1080/109 +f 627/1075/110 636/1088/110 637/1081/110 +f 628/1073/111 637/1090/111 638/1082/111 +f 629/1074/112 635/1085/112 636/1083/112 +f 632/1084/108 636/1083/108 635/1085/108 +f 633/1087/108 637/1081/108 636/1088/108 +f 634/1078/108 638/1082/108 637/1090/108 +f 631/1091/108 635/1080/108 638/1092/108 +f 631/1086/112 639/1669/112 640/1094/112 +f 634/1093/109 642/1670/109 639/1095/109 +f 632/1089/110 640/1671/110 641/1096/110 +f 645/1097/111 646/1672/111 644/1098/111 +f 649/1100/112 650/1104/112 647/1101/112 +f 645/1103/108 647/1101/108 650/1104/108 +f 644/1098/107 649/1100/107 648/1102/107 +f 646/1106/109 650/1104/109 649/1100/109 +f 643/1108/110 648/1102/110 647/1101/110 +f 653/1110/111 654/1673/111 652/1111/111 +f 657/1113/112 658/1117/112 655/1114/112 +f 653/1116/108 655/1114/108 658/1117/108 +f 652/1111/107 657/1113/107 656/1115/107 +f 654/1119/109 658/1117/109 657/1113/109 +f 651/1121/110 656/1115/110 655/1114/110 +f 661/1123/111 662/1674/111 660/1124/111 +f 665/1126/112 666/1130/112 663/1127/112 +f 661/1129/108 663/1127/108 666/1130/108 +f 660/1124/107 665/1126/107 664/1128/107 +f 662/1132/109 666/1130/109 665/1126/109 +f 659/1134/110 664/1128/110 663/1127/110 +f 667/1136/111 675/1148/111 676/1137/111 +f 673/1139/112 678/1675/112 677/1140/112 +f 668/1138/107 676/1137/107 678/1142/107 +f 669/1144/109 671/1168/109 674/1145/109 +f 668/1138/110 673/1676/110 672/1147/110 +f 677/1140/109 678/1675/109 676/1137/109 +f 672/1149/108 677/1677/108 675/1148/108 +f 680/1150/109 682/1161/109 681/1151/109 +f 686/1153/110 685/1160/110 683/1154/110 +f 681/1156/111 686/1162/111 684/1157/111 +f 679/1159/108 684/1678/108 683/1154/108 +f 680/1150/112 683/1154/112 685/1160/112 +f 682/1161/107 685/1160/107 686/1162/107 +f 689/1163/110 690/1167/110 688/1164/110 +f 669/1166/108 688/1679/108 690/1167/108 +f 671/1168/112 690/1167/112 689/1163/112 +f 670/1169/111 687/1172/111 688/1170/111 +f 674/1145/107 689/1163/107 687/1172/107 +f 700/1173/112 701/1210/112 717/1174/112 +f 699/1176/112 700/1173/112 716/1177/112 +f 698/1179/112 699/1176/112 715/1180/112 +f 697/1182/112 698/1179/112 714/1183/112 +f 696/1185/112 697/1182/112 713/1186/112 +f 695/1188/112 696/1185/112 712/1189/112 +f 695/1191/112 711/1680/112 710/1192/112 +f 694/1193/112 710/1681/112 709/1194/112 +f 693/1195/112 709/1682/112 708/1196/112 +f 692/1197/112 708/1683/112 707/1198/112 +f 691/1199/112 707/1684/112 722/1200/112 +f 706/1201/112 722/1685/112 721/1202/112 +f 705/1203/112 721/1686/112 720/1204/112 +f 704/1205/112 720/1687/112 719/1206/112 +f 703/1207/112 719/1688/112 718/1208/112 +f 701/1210/112 702/1209/112 718/1211/112 +f 732/1213/111 748/1689/111 749/1214/111 +f 731/1216/111 747/1690/111 748/1217/111 +f 730/1218/111 746/1691/111 747/1219/111 +f 729/1220/111 745/1692/111 746/1221/111 +f 728/1222/111 744/1693/111 745/1223/111 +f 727/1224/111 743/1694/111 744/1225/111 +f 742/1226/111 743/1695/111 727/1227/111 +f 741/1229/111 742/1696/111 726/1228/111 +f 739/1231/111 741/1697/111 725/1230/111 +f 740/1233/111 739/1698/111 723/1232/111 +f 754/1235/111 740/1699/111 724/1234/111 +f 753/1237/111 754/1700/111 738/1236/111 +f 752/1239/111 753/1701/111 737/1238/111 +f 751/1241/111 752/1702/111 736/1240/111 +f 750/1243/111 751/1703/111 735/1242/111 +f 733/1215/111 749/1704/111 750/1245/111 +f 756/1246/112 758/1253/112 757/1247/112 +f 761/1249/107 801/1316/107 802/1250/107 +f 757/1247/108 795/1306/108 796/1252/108 +f 758/1253/109 798/1313/109 795/1254/109 +f 755/1248/110 796/1309/110 797/1255/110 +f 756/1246/107 797/1311/107 798/1256/107 +f 794/1257/108 864/1299/108 863/1258/108 +f 791/1260/107 866/1297/107 865/1261/107 +f 779/1263/108 852/1269/108 851/1264/108 +f 781/1265/109 851/1264/109 854/1266/109 +f 780/1268/110 853/1360/110 852/1269/110 +f 785/1270/112 783/1362/112 784/1271/112 +f 769/1273/112 767/1367/112 768/1274/112 +f 764/1276/110 857/1369/110 858/1277/110 +f 765/1279/109 856/1282/109 855/1280/109 +f 763/1278/108 858/1277/108 856/1282/108 +f 775/1283/107 862/1289/107 861/1284/107 +f 778/1286/108 860/1291/108 859/1287/108 +f 776/1288/109 859/1287/109 862/1289/109 +f 777/1290/110 861/1376/110 860/1291/110 +f 772/1292/112 774/1378/112 773/1293/112 +f 766/1281/107 855/1280/107 857/1295/107 +f 792/1259/109 863/1258/109 866/1297/109 +f 793/1298/110 865/1384/110 864/1299/110 +f 788/1300/112 790/1386/112 789/1301/112 +f 782/1267/107 854/1266/107 853/1303/107 +f 760/1305/111 796/1252/111 795/1306/111 +f 761/1308/111 797/1255/111 796/1309/111 +f 762/1251/111 798/1256/111 797/1311/111 +f 759/1312/111 795/1254/111 798/1313/111 +f 799/1315/111 802/1250/111 801/1316/111 +f 759/1307/108 799/1705/108 800/1318/108 +f 762/1314/109 802/1706/109 799/1319/109 +f 760/1310/110 800/1707/110 801/1320/110 +f 805/1321/111 806/1708/111 804/1322/111 +f 808/1324/112 809/1709/112 810/1325/112 +f 804/1322/113 809/1709/113 808/1324/113 +f 805/1327/114 807/1326/114 810/1325/114 +f 813/1329/111 814/1710/111 812/1330/111 +f 816/1332/112 817/1711/112 818/1333/112 +f 812/1330/115 817/1711/115 816/1332/115 +f 813/1335/116 815/1334/116 818/1333/116 +f 820/1337/112 842/1348/112 840/1338/112 +f 849/1340/108 847/1712/108 848/1341/108 +f 838/1343/111 839/1713/111 841/1344/111 +f 846/1346/111 847/1712/111 849/1340/111 +f 841/1344/107 839/1713/107 840/1338/107 +f 826/1351/107 824/1714/107 822/1715/107 +f 822/1715/107 836/1716/107 826/1351/107 +f 836/1716/107 834/1717/107 826/1351/107 +f 834/1717/107 832/1718/107 826/1351/107 +f 832/1718/107 830/1349/107 826/1351/107 +f 844/1352/112 850/1342/112 848/1341/112 +f 835/1356/108 821/1719/108 823/1720/108 +f 823/1720/108 825/1721/108 827/1354/108 +f 827/1354/108 829/1722/108 831/1355/108 +f 831/1355/108 833/1723/108 835/1356/108 +f 835/1356/108 823/1720/108 827/1354/108 +f 784/1357/117 851/1264/117 852/1269/117 +f 786/1359/118 852/1269/118 853/1360/118 +f 785/1270/119 853/1303/119 854/1266/119 +f 783/1363/120 854/1266/120 851/1264/120 +f 767/1365/120 855/1280/120 856/1282/120 +f 769/1273/119 857/1295/119 855/1280/119 +f 770/1368/118 858/1277/118 857/1369/118 +f 768/1371/117 856/1282/117 858/1277/117 +f 773/1373/117 859/1287/117 860/1291/117 +f 771/1375/118 860/1291/118 861/1376/118 +f 772/1292/119 861/1284/119 862/1289/119 +f 774/1379/120 862/1289/120 859/1287/120 +f 789/1381/117 863/1258/117 864/1299/117 +f 787/1383/118 864/1299/118 865/1384/118 +f 788/1300/119 865/1261/119 866/1297/119 +f 790/1387/120 866/1297/120 863/1258/120 +f 868/1389/107 870/1395/107 869/1390/107 +f 873/1392/111 881/1724/111 882/1393/111 +f 870/1395/109 878/1408/109 875/1396/109 +f 867/1391/110 876/1404/110 877/1397/110 +f 868/1389/111 877/1406/111 878/1398/111 +f 869/1390/112 875/1401/112 876/1399/112 +f 872/1400/108 876/1399/108 875/1401/108 +f 873/1403/108 877/1397/108 876/1404/108 +f 874/1394/108 878/1398/108 877/1406/108 +f 871/1407/108 875/1396/108 878/1408/108 +f 871/1402/112 879/1725/112 880/1410/112 +f 874/1409/109 882/1726/109 879/1411/109 +f 872/1405/110 880/1727/110 881/1412/110 +f 884/1413/107 886/1419/107 885/1414/107 +f 889/1416/111 897/1728/111 898/1417/111 +f 886/1419/109 894/1432/109 891/1420/109 +f 883/1415/110 892/1428/110 893/1421/110 +f 884/1413/111 893/1430/111 894/1422/111 +f 885/1414/112 891/1425/112 892/1423/112 +f 888/1424/108 892/1423/108 891/1425/108 +f 889/1427/108 893/1421/108 892/1428/108 +f 890/1418/108 894/1422/108 893/1430/108 +f 887/1431/108 891/1420/108 894/1432/108 +f 887/1426/112 895/1729/112 896/1434/112 +f 890/1433/109 898/1730/109 895/1435/109 +f 888/1429/110 896/1731/110 897/1436/110 +f 900/1437/108 902/1443/108 901/1438/108 +f 905/1440/111 913/1732/111 914/1441/111 +f 902/1443/110 910/1456/110 907/1444/110 +f 899/1439/109 908/1452/109 909/1445/109 +f 900/1437/111 909/1454/111 910/1446/111 +f 901/1438/112 907/1449/112 908/1447/112 +f 904/1448/107 908/1447/107 907/1449/107 +f 905/1451/107 909/1445/107 908/1452/107 +f 906/1442/107 910/1446/107 909/1454/107 +f 903/1455/107 907/1444/107 910/1456/107 +f 903/1450/112 911/1733/112 912/1458/112 +f 906/1457/110 914/1734/110 911/1459/110 +f 904/1453/109 912/1735/109 913/1460/109 +f 916/1461/108 918/1467/108 917/1462/108 +f 921/1464/111 929/1736/111 930/1465/111 +f 918/1467/110 926/1480/110 923/1468/110 +f 915/1463/109 924/1476/109 925/1469/109 +f 916/1461/111 925/1478/111 926/1470/111 +f 917/1462/112 923/1473/112 924/1471/112 +f 920/1472/107 924/1471/107 923/1473/107 +f 921/1475/107 925/1469/107 924/1476/107 +f 922/1466/107 926/1470/107 925/1478/107 +f 919/1479/107 923/1468/107 926/1480/107 +f 919/1474/112 927/1737/112 928/1482/112 +f 922/1481/110 930/1738/110 927/1483/110 +f 920/1477/109 928/1739/109 929/1484/109 +f 932/1485/108 934/1491/108 933/1486/108 +f 937/1488/111 945/1740/111 946/1489/111 +f 934/1491/110 942/1504/110 939/1492/110 +f 931/1487/109 940/1500/109 941/1493/109 +f 932/1485/111 941/1502/111 942/1494/111 +f 933/1486/112 939/1497/112 940/1495/112 +f 936/1496/107 940/1495/107 939/1497/107 +f 937/1499/107 941/1493/107 940/1500/107 +f 938/1490/107 942/1494/107 941/1502/107 +f 935/1503/107 939/1492/107 942/1504/107 +f 935/1498/112 943/1741/112 944/1506/112 +f 938/1505/110 946/1742/110 943/1507/110 +f 936/1501/109 944/1743/109 945/1508/109 +f 948/1509/109 950/1515/109 949/1510/109 +f 953/1512/111 961/1744/111 962/1513/111 +f 950/1515/108 958/1528/108 955/1516/108 +f 947/1511/107 956/1524/107 957/1517/107 +f 948/1509/111 957/1526/111 958/1518/111 +f 949/1510/112 955/1521/112 956/1519/112 +f 952/1520/110 956/1519/110 955/1521/110 +f 953/1523/110 957/1517/110 956/1524/110 +f 954/1514/110 958/1518/110 957/1526/110 +f 951/1527/110 955/1516/110 958/1528/110 +f 951/1522/112 959/1745/112 960/1530/112 +f 954/1529/108 962/1746/108 959/1531/108 +f 952/1525/107 960/1747/107 961/1532/107 +f 964/1533/109 966/1539/109 965/1534/109 +f 969/1536/111 977/1748/111 978/1537/111 +f 966/1539/108 974/1552/108 971/1540/108 +f 963/1535/107 972/1548/107 973/1541/107 +f 964/1533/111 973/1550/111 974/1542/111 +f 965/1534/112 971/1545/112 972/1543/112 +f 968/1544/110 972/1543/110 971/1545/110 +f 969/1547/110 973/1541/110 972/1548/110 +f 970/1538/110 974/1542/110 973/1550/110 +f 967/1551/110 971/1540/110 974/1552/110 +f 967/1546/112 975/1749/112 976/1554/112 +f 970/1553/108 978/1750/108 975/1555/108 +f 968/1549/107 976/1751/107 977/1556/107 +f 980/1557/109 982/1563/109 981/1558/109 +f 985/1560/111 993/1752/111 994/1561/111 +f 982/1563/108 990/1576/108 987/1564/108 +f 979/1559/107 988/1572/107 989/1565/107 +f 980/1557/111 989/1574/111 990/1566/111 +f 981/1558/112 987/1569/112 988/1567/112 +f 984/1568/110 988/1567/110 987/1569/110 +f 985/1571/110 989/1565/110 988/1572/110 +f 986/1562/110 990/1566/110 989/1574/110 +f 983/1575/110 987/1564/110 990/1576/110 +f 984/1568/112 983/1570/112 991/1578/112 +f 986/1577/108 994/1753/108 991/1580/108 +f 984/1573/107 992/1754/107 993/1581/107 +f 996/1582/110 998/1588/110 997/1583/110 +f 1001/1585/111 1009/1755/111 1010/1586/111 +f 998/1588/107 1006/1601/107 1003/1589/107 +f 995/1584/108 1004/1597/108 1005/1590/108 +f 996/1582/111 1005/1599/111 1006/1591/111 +f 997/1583/112 1003/1594/112 1004/1592/112 +f 1000/1593/109 1004/1592/109 1003/1594/109 +f 1001/1596/109 1005/1590/109 1004/1597/109 +f 1002/1587/109 1006/1591/109 1005/1599/109 +f 999/1600/109 1003/1589/109 1006/1601/109 +f 1000/1593/112 999/1595/112 1007/1603/112 +f 1002/1602/107 1010/1756/107 1007/1605/107 +f 1000/1598/108 1008/1757/108 1009/1606/108 +f 1012/1607/110 1014/1613/110 1013/1608/110 +f 1017/1610/111 1025/1758/111 1026/1611/111 +f 1014/1613/107 1022/1626/107 1019/1614/107 +f 1011/1609/108 1020/1622/108 1021/1615/108 +f 1012/1607/111 1021/1624/111 1022/1616/111 +f 1013/1608/112 1019/1619/112 1020/1617/112 +f 1016/1618/109 1020/1617/109 1019/1619/109 +f 1017/1621/109 1021/1615/109 1020/1622/109 +f 1018/1612/109 1022/1616/109 1021/1624/109 +f 1015/1625/109 1019/1614/109 1022/1626/109 +f 1015/1620/112 1023/1759/112 1024/1628/112 +f 1018/1627/107 1026/1760/107 1023/1629/107 +f 1016/1623/108 1024/1761/108 1025/1630/108 +f 1028/1631/110 1030/1637/110 1029/1632/110 +f 1033/1634/111 1041/1762/111 1042/1635/111 +f 1030/1637/107 1038/1650/107 1035/1638/107 +f 1027/1633/108 1036/1646/108 1037/1639/108 +f 1028/1631/111 1037/1648/111 1038/1640/111 +f 1027/1633/112 1029/1632/112 1035/1641/112 +f 1032/1643/109 1036/1642/109 1035/1641/109 +f 1033/1645/109 1037/1639/109 1036/1646/109 +f 1034/1636/109 1038/1640/109 1037/1648/109 +f 1031/1649/109 1035/1638/109 1038/1650/109 +f 1032/1643/112 1031/1644/112 1039/1652/112 +f 1034/1651/107 1042/1763/107 1039/1654/107 +f 1032/1647/108 1040/1764/108 1041/1655/108 +s 1 +f 698/1179/121 731/1216/110 699/1176/110 +f 713/1186/115 744/1765/122 712/1187/122 +f 699/1176/110 732/1213/123 700/1173/123 +f 714/1183/124 745/1766/115 713/1184/115 +f 700/1173/123 733/1215/113 701/1210/113 +f 715/1180/109 746/1767/124 714/1181/124 +f 701/1210/113 734/1244/125 702/1209/125 +f 716/1177/126 747/1768/109 715/1178/109 +f 702/1209/125 735/1242/107 703/1207/107 +f 717/1174/114 748/1769/126 716/1175/126 +f 703/1207/107 736/1240/122 704/1205/122 +f 718/1211/127 749/1770/114 717/1212/114 +f 704/1205/122 737/1238/115 705/1203/115 +f 691/1199/109 723/1232/126 692/1197/126 +f 719/1688/108 750/1771/127 718/1208/127 +f 705/1203/115 738/1236/124 706/1201/124 +f 692/1197/126 725/1230/114 693/1195/114 +f 720/1687/128 751/1772/108 719/1206/108 +f 706/1201/124 724/1234/109 691/1199/109 +f 693/1195/114 726/1228/127 694/1193/127 +f 721/1686/116 752/1773/128 720/1204/128 +f 708/1683/123 740/1774/110 707/1198/110 +f 694/1193/127 727/1227/108 695/1191/108 +f 722/1685/121 753/1775/116 721/1202/116 +f 709/1682/113 739/1776/123 708/1196/123 +f 695/1188/108 728/1222/128 696/1185/128 +f 707/1684/110 754/1777/121 722/1200/121 +f 710/1681/125 741/1778/113 709/1194/113 +f 696/1185/128 729/1220/116 697/1182/116 +f 711/1680/107 742/1779/125 710/1192/125 +f 697/1182/116 730/1218/121 698/1179/121 +f 712/1189/122 743/1780/107 711/1190/107 +f 822/1781/109 823/1782/129 821/1783/109 +f 824/1784/129 825/1785/111 823/1782/129 +f 826/1786/111 827/1787/130 825/1788/111 +f 828/1789/130 829/1790/110 827/1787/130 +f 830/1791/110 831/1792/118 829/1790/110 +f 832/1793/118 833/1794/112 831/1792/118 +f 834/1795/112 835/1796/120 833/1794/112 +f 836/1797/120 821/1783/109 835/1796/120 +f 698/1179/121 730/1218/121 731/1216/110 +f 713/1186/115 745/1798/115 744/1765/122 +f 699/1176/110 731/1216/110 732/1213/123 +f 714/1183/124 746/1799/124 745/1766/115 +f 700/1173/123 732/1213/123 733/1215/113 +f 715/1180/109 747/1800/109 746/1767/124 +f 701/1210/113 733/1215/113 734/1244/125 +f 716/1177/126 748/1801/126 747/1768/109 +f 702/1209/125 734/1244/125 735/1242/107 +f 717/1174/114 749/1802/114 748/1769/126 +f 703/1207/107 735/1242/107 736/1240/122 +f 718/1211/127 750/1803/127 749/1770/114 +f 704/1205/122 736/1240/122 737/1238/115 +f 691/1199/109 724/1234/109 723/1232/126 +f 719/1688/108 751/1804/108 750/1771/127 +f 705/1203/115 737/1238/115 738/1236/124 +f 692/1197/126 723/1232/126 725/1230/114 +f 720/1687/128 752/1805/128 751/1772/108 +f 706/1201/124 738/1236/124 724/1234/109 +f 693/1195/114 725/1230/114 726/1228/127 +f 721/1686/116 753/1806/116 752/1773/128 +f 708/1683/123 739/1807/123 740/1774/110 +f 694/1193/127 726/1228/127 727/1227/108 +f 722/1685/121 754/1808/121 753/1775/116 +f 709/1682/113 741/1809/113 739/1776/123 +f 695/1188/108 727/1224/108 728/1222/128 +f 707/1684/110 740/1810/110 754/1777/121 +f 710/1681/125 742/1811/125 741/1778/113 +f 696/1185/128 728/1222/128 729/1220/116 +f 711/1680/107 743/1812/107 742/1779/125 +f 697/1182/116 729/1220/116 730/1218/121 +f 712/1189/122 744/1813/122 743/1780/107 +f 822/1781/109 824/1784/129 823/1782/129 +f 824/1784/129 826/1814/111 825/1785/111 +f 826/1786/111 828/1789/130 827/1787/130 +f 828/1789/130 830/1791/110 829/1790/110 +f 830/1791/110 832/1793/118 831/1792/118 +f 832/1793/118 834/1795/112 833/1794/112 +f 834/1795/112 836/1797/120 835/1796/120 +f 836/1797/120 822/1781/109 821/1783/109 diff --git a/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png b/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png index 6fc1a618fbdeb03988bab626b0a89b3c3d323850..df04f0555d19305b40131283786f51b2c5f83333 100644 GIT binary patch literal 2748 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 XwiWEu161H21mtw$^zo<1&L{sHLB7>N From 6b1d61166fff6be28e9451161c48aabcdebc603a Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 7 Jul 2025 16:56:23 +0200 Subject: [PATCH 073/323] rotten grussy --- src/main/java/com/hbm/blocks/ModBlocks.java | 5 +- .../machine/MachineAssemblyMachine.java | 45 + .../machine/ModuleMachineAssembler.java | 2 +- .../TileEntityMachineAssemblyMachine.java | 286 +++++ .../TileEntityMachineChemicalFactory.java | 2 +- .../assets/hbm/models/assembler_main.obj | 1142 ----------------- .../assets/hbm/models/assembler_wheel.obj | 645 ---------- .../textures/gui/processing/gui_assembler.png | Bin 0 -> 3517 bytes 8 files changed, 337 insertions(+), 1790 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java delete mode 100644 src/main/resources/assets/hbm/models/assembler_main.obj delete mode 100644 src/main/resources/assets/hbm/models/assembler_wheel.obj create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8b04b34a4..f6dcd2065 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1002,7 +1002,8 @@ public class ModBlocks { public static Block machine_mining_laser; public static Block barricade; // a sand bag that drops nothing, for automated walling purposes - public static Block machine_assembler; + @Deprecated public static Block machine_assembler; + public static Block machine_assembly_machine; public static Block machine_assemfac; public static Block machine_arc_welder; public static Block machine_soldering_station; @@ -2228,6 +2229,7 @@ public class ModBlocks { machine_mining_laser = new MachineMiningLaser(Material.iron).setBlockName("machine_mining_laser").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_mining_laser"); barricade = new BlockNoDrop(Material.sand).setBlockName("barricade").setHardness(1.0F).setResistance(2.5F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":barricade"); machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); + machine_assembly_machine = new MachineAssemblyMachine(Material.iron).setBlockName("machine_assembly_machine").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_arc_welder = new MachineArcWelder(Material.iron).setBlockName("machine_arc_welder").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_soldering_station = new MachineSolderingStation(Material.iron).setBlockName("machine_soldering_station").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3273,6 +3275,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_arc_furnace_on, machine_arc_furnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_microwave, machine_microwave.getUnlocalizedName()); GameRegistry.registerBlock(machine_assembler, machine_assembler.getUnlocalizedName()); + register(machine_assembly_machine); GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName()); register(machine_chemical_plant); diff --git a/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java b/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java new file mode 100644 index 000000000..b7cbceafe --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java @@ -0,0 +1,45 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineAssemblyMachine extends BlockDummyable { + + public MachineAssemblyMachine(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineAssemblyMachine(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } + + @Override public int[] getDimensions() { return new int[] {2, 0, 1, 1, 1, 1}; } + @Override public int getOffset() { return 1; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x -= dir.offsetX; + z -= dir.offsetZ; + + for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) { + if(i != 0 || j != 0) this.makeExtra(world, x + i, y, z + j); + } + } +} diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java index e132a5031..2188b306a 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -21,7 +21,7 @@ public class ModuleMachineAssembler extends ModuleMachineBase { return null; } - public ModuleMachineAssembler itemInput(int... a) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = a[i]; return this; } + public ModuleMachineAssembler itemInput(int from) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = from + i; return this; } public ModuleMachineAssembler itemOutput(int a) { outputSlots[0] = a; return this; } public ModuleMachineAssembler fluidInput(FluidTank a) { inputTanks[0] = a; return this; } public ModuleMachineAssembler fluidOutput(FluidTank a) { outputTanks[0] = a; return this; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java new file mode 100644 index 000000000..3a057c184 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -0,0 +1,286 @@ +package com.hbm.tileentity.machine; + +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManagerNT; +import com.hbm.inventory.container.ContainerMachineChemicalPlant; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachineChemicalPlant; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.module.machine.ModuleMachineAssembler; +import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; +import com.hbm.util.i18n.I18nUtil; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { + + public FluidTank inputTank; + public FluidTank outputTank; + + public long power; + public long maxPower = 1_000_000; + public boolean didProcess = false; + + public boolean frame = false; + private AudioWrapper audio; + + public ModuleMachineAssembler assemblerModule; + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); + + public TileEntityMachineAssemblyMachine() { + super(17); + this.inputTank = new FluidTank(Fluids.NONE, 32_000); + this.outputTank = new FluidTank(Fluids.NONE, 32_000); + + this.assemblerModule = new ModuleMachineAssembler(0, this, slots) + .itemInput(4).itemOutput(16) + .fluidInput(inputTank).fluidOutput(outputTank); + } + + @Override + public String getName() { + return "container.machineAssemblyMachine"; + } + + @Override + public void updateEntity() { + + if(maxPower <= 0) this.maxPower = 1_000_000; + + if(!worldObj.isRemote) { + + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + upgradeManager.checkSlots(slots, 2, 3); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos); + if(inputTank.getTankType() != Fluids.NONE) this.trySubscribe(inputTank.getTankType(), worldObj, pos); + if(outputTank.getFill() > 0) this.tryProvide(outputTank, worldObj, pos); + } + + double speed = 1D; + double pow = 1D; + + speed += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) / 3D; + speed += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); + + pow -= Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3) * 0.25D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; + + this.assemblerModule.update(speed, pow, true); + this.didProcess = this.assemblerModule.didProcess; + if(this.assemblerModule.markDirty) this.markDirty(); + + if(didProcess) { + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_alloyed) + slots[0] = new ItemStack(ModItems.meteorite_sword_machined); + } + + this.networkPackNT(100); + + } else { + + if(worldObj.getTotalWorldTime() % 20 == 0) { + frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord); + } + + if(this.didProcess && MainRegistry.proxy.me().getDistance(xCoord , yCoord, zCoord) < 50) { + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + audio.keepAlive(); + audio.updateVolume(this.getVolume(1F)); + + } else { + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + } + } + + @Override public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.assembler", xCoord, yCoord, zCoord, 1F, 15F, 1.0F, 20); + } + + @Override public void onChunkUnload() { + if(audio != null) { audio.stopSound(); audio = null; } + } + + @Override public void invalidate() { + super.invalidate(); + if(audio != null) { audio.stopSound(); audio = null; } + } + + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 0, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 0, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 0, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 0, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z), + }; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.inputTank.serialize(buf); + this.outputTank.serialize(buf); + buf.writeLong(power); + buf.writeLong(maxPower); + buf.writeBoolean(didProcess); + this.assemblerModule.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.inputTank.deserialize(buf); + this.outputTank.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.didProcess = buf.readBoolean(); + this.assemblerModule.deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.inputTank.readFromNBT(nbt, "i"); + this.outputTank.readFromNBT(nbt, "o"); + this.power = nbt.getLong("power"); + this.maxPower = nbt.getLong("maxPower"); + this.assemblerModule.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.inputTank.writeToNBT(nbt, "i"); + this.outputTank.writeToNBT(nbt, "o"); + nbt.setLong("power", power); + nbt.setLong("maxPower", maxPower); + this.assemblerModule.writeToNBT(nbt); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(slot == 0) return true; // battery + if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades + if(this.assemblerModule.isItemValid(slot, stack)) return true; // recipe input crap + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i == 16; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {inputTank}; } + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {outputTank}; } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {inputTank, outputTank}; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAssemblyMachine(player.inventory, this); } + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAssemblyMachine(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("index") && data.hasKey("selection")) { + int index = data.getInteger("index"); + String selection = data.getString("selection"); + if(index == 0) { + this.assemblerModule.recipe = selection; + this.markChanged(); + } + } + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord, zCoord - 1, xCoord + 2, yCoord + 3, zCoord + 2); + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_assembly_machine)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_CONSUMPTION, "-" + (level * 25) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 655947212..62b9f0a68 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -383,7 +383,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { - info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_chemical_plant)); + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_chemical_factory)); if(type == UpgradeType.SPEED) { info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); diff --git a/src/main/resources/assets/hbm/models/assembler_main.obj b/src/main/resources/assets/hbm/models/assembler_main.obj deleted file mode 100644 index 0f371b213..000000000 --- a/src/main/resources/assets/hbm/models/assembler_main.obj +++ /dev/null @@ -1,1142 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'assembler_main.blend' -# www.blender.org -o Cube_Cube.001 -v -1.500000 0.000000 1.500000 -v -1.500000 0.250000 1.500000 -v -1.500000 0.000000 -1.500000 -v -1.500000 0.250000 -1.500000 -v 1.500000 0.000000 1.500000 -v 1.500000 0.250000 1.500000 -v 1.500000 0.000000 -1.500000 -v 1.500000 0.250000 -1.500000 -v -1.250000 0.500000 1.250000 -v -1.250000 0.500000 -1.250000 -v 1.250000 0.500000 -1.250000 -v 1.250000 0.500000 1.250000 -v 1.250000 1.000000 -1.250000 -v -1.250000 1.000000 -1.250000 -v -1.250000 1.000000 1.250000 -v 1.250000 1.000000 1.250000 -v 1.062500 1.500000 -1.062500 -v 1.062500 1.500000 1.062500 -v 1.000000 0.250000 -0.250000 -v 1.000000 0.750000 -0.250000 -v 1.000000 0.250000 -0.750000 -v 1.000000 0.750000 -0.750000 -v 2.000000 0.000000 0.000000 -v 2.000000 1.000000 0.000000 -v 2.000000 0.000000 -1.000000 -v 2.000000 1.000000 -1.000000 -v 1.500000 1.000000 -1.000000 -v 1.500000 0.000000 -1.000000 -v 1.500000 1.000000 0.000000 -v 1.500000 0.000000 0.000000 -v 2.000000 0.875000 -0.875000 -v 2.000000 0.125000 -0.875000 -v 2.000000 0.875000 -0.125000 -v 2.000000 0.125000 -0.125000 -v 1.500000 0.687500 -0.687500 -v 1.500000 0.312500 -0.687500 -v 1.500000 0.687500 -0.312500 -v 1.500000 0.312500 -0.312500 -v -1.000000 0.250000 0.750000 -v -1.000000 0.750000 0.750000 -v -1.000000 0.250000 0.250000 -v -1.000000 0.750000 0.250000 -v -2.000000 0.000000 1.000000 -v -2.000000 1.000000 1.000000 -v -2.000000 0.000000 0.000000 -v -2.000000 1.000000 0.000000 -v -1.500000 1.000000 0.000000 -v -1.500000 0.000000 0.000000 -v -1.500000 1.000000 1.000000 -v -1.500000 0.000000 1.000000 -v -2.000000 0.875000 0.125000 -v -2.000000 0.125000 0.125000 -v -2.000000 0.875000 0.875000 -v -2.000000 0.125000 0.875000 -v -1.500000 0.687500 0.312500 -v -1.500000 0.312500 0.312500 -v -1.500000 0.687500 0.687500 -v -1.500000 0.312500 0.687500 -v 0.656250 0.343750 -2.000000 -v 0.656250 0.656250 -2.000000 -v 0.343750 0.343750 -1.150000 -v 0.343750 0.656250 -1.150000 -v 0.343750 0.343750 -2.000000 -v 0.343750 0.656250 -2.000000 -v 0.656250 0.343750 -1.150000 -v 0.656250 0.656250 -1.150000 -v 0.328125 0.671875 -1.150000 -v 0.328125 0.328125 -1.150000 -v 0.671875 0.671875 -1.150000 -v 0.671875 0.328125 -1.150000 -v 0.328125 0.671875 -1.000000 -v 0.328125 0.328125 -1.000000 -v 0.671875 0.671875 -1.000000 -v 0.671875 0.328125 -1.000000 -v -0.343750 0.343750 -2.000000 -v -0.343750 0.656250 -2.000000 -v -0.656250 0.343750 -1.150000 -v -0.656250 0.656250 -1.150000 -v -0.656250 0.343750 -2.000000 -v -0.656250 0.656250 -2.000000 -v -0.343750 0.343750 -1.150000 -v -0.343750 0.656250 -1.150000 -v -0.671875 0.671875 -1.150000 -v -0.671875 0.328125 -1.150000 -v -0.328125 0.671875 -1.150000 -v -0.328125 0.328125 -1.150000 -v -0.671875 0.671875 -1.000000 -v -0.671875 0.328125 -1.000000 -v -0.328125 0.671875 -1.000000 -v -0.328125 0.328125 -1.000000 -v -0.343750 0.343750 2.000000 -v -0.343750 0.656250 2.000000 -v -0.656250 0.343750 1.150000 -v -0.656250 0.656250 1.150000 -v -0.656250 0.343750 2.000000 -v -0.656250 0.656250 2.000000 -v -0.343750 0.343750 1.150000 -v -0.343750 0.656250 1.150000 -v -0.671875 0.671875 1.150000 -v -0.671875 0.328125 1.150000 -v -0.328125 0.671875 1.150000 -v -0.328125 0.328125 1.150000 -v -0.671875 0.671875 1.000000 -v -0.671875 0.328125 1.000000 -v -0.328125 0.671875 1.000000 -v -0.328125 0.328125 1.000000 -v 0.656250 0.343750 2.000000 -v 0.656250 0.656250 2.000000 -v 0.343750 0.343750 1.150000 -v 0.343750 0.656250 1.150000 -v 0.343750 0.343750 2.000000 -v 0.343750 0.656250 2.000000 -v 0.656250 0.343750 1.150000 -v 0.656250 0.656250 1.150000 -v 0.328125 0.671875 1.150000 -v 0.328125 0.328125 1.150000 -v 0.671875 0.671875 1.150000 -v 0.671875 0.328125 1.150000 -v 0.328125 0.671875 1.000000 -v 0.328125 0.328125 1.000000 -v 0.671875 0.671875 1.000000 -v 0.671875 0.328125 1.000000 -v -1.062500 1.500000 -1.062500 -v -1.062500 1.500000 1.062500 -v 0.903125 1.500000 0.903125 -v 0.903125 1.500000 -0.903125 -v -0.903125 1.500000 -0.903125 -v -0.903125 1.500000 0.903125 -v 0.903125 1.350000 0.903125 -v 0.903125 1.350000 -0.903125 -v -0.903125 1.350000 -0.903125 -v -0.903125 1.350000 0.903125 -v 0.817113 1.500000 0.903125 -v 0.731101 1.500000 0.903125 -v 0.645089 1.500000 0.903125 -v 0.559078 1.500000 0.903125 -v 0.473066 1.500000 0.903125 -v 0.387054 1.500000 0.903125 -v 0.301042 1.500000 0.903125 -v 0.215030 1.500000 0.903125 -v 0.129018 1.500000 0.903125 -v 0.043006 1.500000 0.903125 -v -0.043006 1.500000 0.903125 -v -0.129018 1.500000 0.903125 -v -0.215030 1.500000 0.903125 -v -0.301042 1.500000 0.903125 -v -0.387054 1.500000 0.903125 -v -0.473065 1.500000 0.903125 -v -0.559077 1.500000 0.903125 -v -0.645089 1.500000 0.903125 -v -0.731101 1.500000 0.903125 -v -0.817113 1.500000 0.903125 -v 0.817113 1.750000 0.903125 -v 0.731101 1.750000 0.903125 -v 0.645089 1.750000 0.903125 -v 0.559078 1.750000 0.903125 -v 0.473066 1.750000 0.903125 -v 0.387054 1.750000 0.903125 -v 0.301042 1.750000 0.903125 -v 0.215030 1.750000 0.903125 -v 0.129018 1.750000 0.903125 -v 0.043006 1.750000 0.903125 -v -0.043006 1.750000 0.903125 -v -0.129018 1.750000 0.903125 -v -0.215030 1.750000 0.903125 -v -0.301042 1.750000 0.903125 -v -0.387054 1.750000 0.903125 -v -0.473065 1.750000 0.903125 -v -0.559077 1.750000 0.903125 -v -0.645089 1.750000 0.903125 -v -0.731101 1.750000 0.903125 -v -0.817113 1.750000 0.903125 -v 0.817113 2.000000 0.653125 -v 0.731101 2.000000 0.653125 -v 0.645089 2.000000 0.653125 -v 0.559078 2.000000 0.653125 -v 0.473066 2.000000 0.653125 -v 0.387054 2.000000 0.653125 -v 0.301042 2.000000 0.653125 -v 0.215030 2.000000 0.653125 -v 0.129018 2.000000 0.653125 -v 0.043006 2.000000 0.653125 -v -0.043006 2.000000 0.653125 -v -0.129018 2.000000 0.653125 -v -0.215030 2.000000 0.653125 -v -0.301042 2.000000 0.653125 -v -0.387054 2.000000 0.653125 -v -0.473065 2.000000 0.653125 -v -0.559077 2.000000 0.653125 -v -0.645089 2.000000 0.653125 -v -0.731101 2.000000 0.653125 -v -0.817113 2.000000 0.653125 -v -0.817113 1.500000 -0.903125 -v -0.731101 1.500000 -0.903125 -v -0.645089 1.500000 -0.903125 -v -0.559078 1.500000 -0.903125 -v -0.473066 1.500000 -0.903125 -v -0.387054 1.500000 -0.903125 -v -0.301042 1.500000 -0.903125 -v -0.215030 1.500000 -0.903125 -v -0.129018 1.500000 -0.903125 -v -0.043006 1.500000 -0.903125 -v 0.043006 1.500000 -0.903125 -v 0.129018 1.500000 -0.903125 -v 0.215030 1.500000 -0.903125 -v 0.301042 1.500000 -0.903125 -v 0.387054 1.500000 -0.903125 -v 0.473065 1.500000 -0.903125 -v 0.559077 1.500000 -0.903125 -v 0.645089 1.500000 -0.903125 -v 0.731101 1.500000 -0.903125 -v 0.817113 1.500000 -0.903125 -v -0.817113 1.750000 -0.903125 -v -0.731101 1.750000 -0.903125 -v -0.645089 1.750000 -0.903125 -v -0.559078 1.750000 -0.903125 -v -0.473066 1.750000 -0.903125 -v -0.387054 1.750000 -0.903125 -v -0.301042 1.750000 -0.903125 -v -0.215030 1.750000 -0.903125 -v -0.129018 1.750000 -0.903125 -v -0.043006 1.750000 -0.903125 -v 0.043006 1.750000 -0.903125 -v 0.129018 1.750000 -0.903125 -v 0.215030 1.750000 -0.903125 -v 0.301042 1.750000 -0.903125 -v 0.387054 1.750000 -0.903125 -v 0.473065 1.750000 -0.903125 -v 0.559077 1.750000 -0.903125 -v 0.645089 1.750000 -0.903125 -v 0.731101 1.750000 -0.903125 -v 0.817113 1.750000 -0.903125 -v -0.817113 2.000000 -0.653125 -v -0.731101 2.000000 -0.653125 -v -0.645089 2.000000 -0.653125 -v -0.559078 2.000000 -0.653125 -v -0.473066 2.000000 -0.653125 -v -0.387054 2.000000 -0.653125 -v -0.301042 2.000000 -0.653125 -v -0.215030 2.000000 -0.653125 -v -0.129018 2.000000 -0.653125 -v -0.043006 2.000000 -0.653125 -v 0.043006 2.000000 -0.653125 -v 0.129018 2.000000 -0.653125 -v 0.215030 2.000000 -0.653125 -v 0.301042 2.000000 -0.653125 -v 0.387054 2.000000 -0.653125 -v 0.473065 2.000000 -0.653125 -v 0.559077 2.000000 -0.653125 -v 0.645089 2.000000 -0.653125 -v 0.731101 2.000000 -0.653125 -v 0.817113 2.000000 -0.653125 -v 1.916667 0.250000 -1.100000 -v 1.916667 0.750000 -1.100000 -v 1.666667 0.500000 -1.100000 -v 1.916667 0.250000 0.100000 -v 1.916667 0.750000 0.100000 -v 1.666667 0.500000 0.100000 -v -1.583333 0.250000 -0.100000 -v -1.583333 0.750000 -0.100000 -v -1.833333 0.500000 -0.100000 -v -1.583333 0.250000 1.100000 -v -1.583333 0.750000 1.100000 -v -1.833333 0.500000 1.100000 -vt 0.576309 0.460125 -vt 0.576309 0.482085 -vt 0.312788 0.482085 -vt 0.281091 0.465560 -vt 0.281091 0.487663 -vt 0.015849 0.487663 -vt 0.312788 0.535743 -vt 0.312788 0.513782 -vt 0.576309 0.513783 -vt 0.311067 0.037952 -vt 0.311067 0.015849 -vt 0.576309 0.015849 -vt 0.015849 0.015849 -vt 0.279369 0.015849 -vt 0.279369 0.279369 -vt 0.334748 0.566799 -vt 0.576309 0.535743 -vt 0.312788 0.460125 -vt 0.334748 0.429069 -vt 0.015849 0.465560 -vt 0.037952 0.434301 -vt 0.576309 0.037952 -vt 0.554205 0.069211 -vt 0.333170 0.069211 -vt 0.037952 0.390094 -vt 0.258987 0.390094 -vt 0.806630 0.015849 -vt 0.894470 0.015849 -vt 0.894470 0.059769 -vt 0.134126 0.756933 -vt 0.123146 0.767913 -vt 0.057265 0.767913 -vt 0.806630 0.445525 -vt 0.806630 0.401605 -vt 0.855734 0.379645 -vt 0.847469 0.740928 -vt 0.891389 0.740929 -vt 0.891389 0.828769 -vt 0.855734 0.228410 -vt 0.806630 0.206450 -vt 0.806630 0.162530 -vt 0.899654 0.228410 -vt 0.855734 0.140570 -vt 0.798365 0.762888 -vt 0.847469 0.828769 -vt 0.855734 0.467485 -vt 0.899654 0.379645 -vt 0.806630 0.059769 -vt 0.872510 0.108873 -vt 0.026829 0.798350 -vt 0.073735 0.814820 -vt 0.073735 0.847760 -vt 0.046285 0.905647 -vt 0.057265 0.894667 -vt 0.123145 0.894667 -vt 0.164562 0.875210 -vt 0.153582 0.864230 -vt 0.153582 0.798350 -vt 0.015849 0.787370 -vt 0.026829 0.864230 -vt 0.106675 0.814820 -vt 0.106675 0.847760 -vt 0.850550 0.587022 -vt 0.806630 0.587022 -vt 0.806630 0.499182 -vt 0.354205 0.854232 -vt 0.420085 0.854232 -vt 0.431065 0.865212 -vt 0.850550 0.260107 -vt 0.899654 0.282067 -vt 0.899654 0.325988 -vt 0.608006 0.899590 -vt 0.608006 0.811750 -vt 0.651926 0.811750 -vt 0.891389 0.643351 -vt 0.891389 0.687271 -vt 0.842285 0.709231 -vt 0.842285 0.621391 -vt 0.798365 0.709231 -vt 0.651926 0.899590 -vt 0.701030 0.833710 -vt 0.806630 0.260107 -vt 0.850550 0.347948 -vt 0.899654 0.565062 -vt 0.850550 0.499182 -vt 0.370675 0.774385 -vt 0.370675 0.807325 -vt 0.323768 0.823795 -vt 0.420085 0.727478 -vt 0.354205 0.727478 -vt 0.343225 0.716498 -vt 0.450521 0.823795 -vt 0.450521 0.757915 -vt 0.461501 0.746935 -vt 0.323768 0.757915 -vt 0.312788 0.834775 -vt 0.403615 0.807325 -vt 0.403615 0.774385 -vt 0.619264 0.360402 -vt 0.672059 0.307606 -vt 0.691469 0.327016 -vt 0.619264 0.254810 -vt 0.617323 0.254810 -vt 0.638674 0.233459 -vt 0.763675 0.254810 -vt 0.710880 0.307606 -vt 0.691469 0.288196 -vt 0.744265 0.379812 -vt 0.638674 0.235400 -vt 0.608006 0.245494 -vt 0.629357 0.224142 -vt 0.763675 0.360402 -vt 0.765616 0.360402 -vt 0.744265 0.381753 -vt 0.744265 0.235400 -vt 0.744265 0.233459 -vt 0.765616 0.254810 -vt 0.638674 0.379812 -vt 0.638674 0.381753 -vt 0.617323 0.360402 -vt 0.774933 0.369719 -vt 0.753582 0.391070 -vt 0.629357 0.391070 -vt 0.608006 0.369718 -vt 0.753582 0.224142 -vt 0.774933 0.245494 -vt 0.763675 0.046517 -vt 0.710880 0.099312 -vt 0.691469 0.079902 -vt 0.763675 0.152108 -vt 0.765616 0.152108 -vt 0.744265 0.173459 -vt 0.619264 0.152108 -vt 0.672059 0.099312 -vt 0.691469 0.118722 -vt 0.638674 0.027106 -vt 0.744265 0.171518 -vt 0.774933 0.161425 -vt 0.753582 0.182776 -vt 0.619264 0.046517 -vt 0.617323 0.046517 -vt 0.638674 0.025165 -vt 0.638674 0.171518 -vt 0.638674 0.173459 -vt 0.617323 0.152108 -vt 0.744265 0.027106 -vt 0.744265 0.025165 -vt 0.765616 0.046517 -vt 0.608006 0.037200 -vt 0.629357 0.015849 -vt 0.753582 0.015849 -vt 0.774933 0.037200 -vt 0.629357 0.182776 -vt 0.608006 0.161425 -vt 0.691469 0.525640 -vt 0.710880 0.506230 -vt 0.763675 0.559026 -vt 0.744265 0.432084 -vt 0.765616 0.453435 -vt 0.763675 0.453435 -vt 0.691469 0.486820 -vt 0.672059 0.506230 -vt 0.619264 0.453435 -vt 0.638674 0.578436 -vt 0.744265 0.434025 -vt 0.753582 0.422767 -vt 0.774933 0.444118 -vt 0.638674 0.580377 -vt 0.617323 0.559026 -vt 0.619264 0.559026 -vt 0.617323 0.453435 -vt 0.638674 0.432084 -vt 0.638674 0.434025 -vt 0.765616 0.559026 -vt 0.744265 0.580377 -vt 0.744265 0.578436 -vt 0.629357 0.589694 -vt 0.608006 0.568343 -vt 0.774933 0.568343 -vt 0.753582 0.589694 -vt 0.608006 0.444118 -vt 0.629357 0.422767 -vt 0.105061 0.608573 -vt 0.105061 0.636023 -vt 0.030397 0.636023 -vt 0.133884 0.712060 -vt 0.103689 0.712060 -vt 0.105061 0.710688 -vt 0.132511 0.636023 -vt 0.132511 0.608573 -vt 0.207176 0.608573 -vt 0.105061 0.533909 -vt 0.132511 0.710688 -vt 0.133884 0.725236 -vt 0.103689 0.725236 -vt 0.103689 0.532536 -vt 0.133884 0.532536 -vt 0.132511 0.533909 -vt 0.208548 0.607201 -vt 0.208548 0.637396 -vt 0.207176 0.636023 -vt 0.029025 0.637396 -vt 0.029025 0.607201 -vt 0.030397 0.608573 -vt 0.103689 0.519360 -vt 0.133884 0.519360 -vt 0.015849 0.637396 -vt 0.015849 0.607201 -vt 0.221724 0.607201 -vt 0.221724 0.637396 -vt 0.554205 0.113418 -vt 0.537628 0.160631 -vt 0.349748 0.160631 -vt 0.333170 0.113418 -vt 0.554349 0.566799 -vt 0.554349 0.610719 -vt 0.334748 0.610719 -vt 0.334748 0.385149 -vt 0.554349 0.385149 -vt 0.493263 0.170323 -vt 0.054530 0.342881 -vt 0.242409 0.342880 -vt 0.351218 0.338242 -vt 0.537879 0.338242 -vt 0.537879 0.657626 -vt 0.351218 0.657626 -vt 0.365217 0.324243 -vt 0.365217 0.311067 -vt 0.523879 0.311066 -vt 0.098895 0.333189 -vt 0.523879 0.324243 -vt 0.523879 0.671625 -vt 0.365217 0.671625 -vt 0.766667 0.780053 -vt 0.608006 0.780053 -vt 0.608006 0.621391 -vt 0.523879 0.684801 -vt 0.365217 0.684801 -vt 0.496673 0.170201 -vt 0.531971 0.176003 -vt 0.364530 0.192445 -vt 0.095484 0.333311 -vt 0.060187 0.327509 -vt 0.227627 0.311066 -vt 0.236623 0.984151 -vt 0.214662 0.984151 -vt 0.214662 0.976596 -vt 0.531841 0.231698 -vt 0.509881 0.231698 -vt 0.509881 0.224142 -vt 0.533562 0.943717 -vt 0.511602 0.943717 -vt 0.511602 0.936161 -vt 0.828780 0.938842 -vt 0.806820 0.938842 -vt 0.806820 0.931287 -vt 0.236623 0.944899 -vt 0.214662 0.944899 -vt 0.214662 0.937344 -vt 0.953501 0.899590 -vt 0.931541 0.899590 -vt 0.931541 0.892035 -vt 0.828780 0.978095 -vt 0.806820 0.978095 -vt 0.806820 0.970539 -vt 0.533562 0.982969 -vt 0.511602 0.982969 -vt 0.511602 0.975414 -vt 0.531841 0.270950 -vt 0.509881 0.270950 -vt 0.509881 0.263395 -vt 0.533562 0.904464 -vt 0.511602 0.904464 -vt 0.511602 0.896909 -vt 0.480545 0.904464 -vt 0.480545 0.896909 -vt 0.478824 0.270950 -vt 0.478824 0.263395 -vt 0.480546 0.982969 -vt 0.480546 0.975414 -vt 0.775764 0.978095 -vt 0.775764 0.970539 -vt 0.900485 0.899590 -vt 0.900485 0.892035 -vt 0.183606 0.944899 -vt 0.183606 0.937344 -vt 0.775764 0.938842 -vt 0.775764 0.931287 -vt 0.480546 0.943717 -vt 0.480546 0.936161 -vt 0.478824 0.231698 -vt 0.478824 0.224142 -vt 0.183606 0.984151 -vt 0.183606 0.976596 -vt 0.037809 0.976596 -vt 0.068865 0.976596 -vt 0.068865 0.984151 -vt 0.333027 0.224143 -vt 0.364083 0.224142 -vt 0.364083 0.231698 -vt 0.312788 0.936161 -vt 0.334748 0.936161 -vt 0.334748 0.943717 -vt 0.311067 0.224143 -vt 0.333027 0.231698 -vt 0.015849 0.976596 -vt 0.037809 0.984151 -vt 0.608006 0.931287 -vt 0.629966 0.931287 -vt 0.629966 0.938842 -vt 0.015849 0.937344 -vt 0.037809 0.937344 -vt 0.037809 0.944899 -vt 0.732727 0.892035 -vt 0.754687 0.892035 -vt 0.754687 0.899590 -vt 0.608006 0.970539 -vt 0.629966 0.970539 -vt 0.629966 0.978095 -vt 0.312788 0.975414 -vt 0.334748 0.975414 -vt 0.334748 0.982969 -vt 0.311067 0.263395 -vt 0.333027 0.263395 -vt 0.333027 0.270950 -vt 0.312788 0.896909 -vt 0.334748 0.896909 -vt 0.334748 0.904464 -vt 0.365804 0.896909 -vt 0.365804 0.904464 -vt 0.364083 0.263395 -vt 0.364083 0.270950 -vt 0.365804 0.975414 -vt 0.365804 0.982969 -vt 0.661022 0.970539 -vt 0.661022 0.978095 -vt 0.785744 0.892035 -vt 0.785744 0.899590 -vt 0.068865 0.937344 -vt 0.068865 0.944899 -vt 0.661022 0.931287 -vt 0.661022 0.938842 -vt 0.365804 0.936161 -vt 0.365804 0.943717 -vt 0.253421 0.638898 -vt 0.253421 0.594978 -vt 0.275381 0.616938 -vt 0.515159 0.760418 -vt 0.493199 0.738458 -vt 0.515159 0.716498 -vt 0.253421 0.714515 -vt 0.253421 0.670595 -vt 0.275381 0.692555 -vt 0.275381 0.563281 -vt 0.253421 0.541320 -vt 0.275381 0.519360 -vt 0.015849 0.279369 -vt 0.554349 0.429069 -vt 0.258987 0.434301 -vt 0.046285 0.756933 -vt 0.899654 0.140570 -vt 0.798364 0.806809 -vt 0.899654 0.467485 -vt 0.828590 0.108873 -vt 0.134125 0.905647 -vt 0.164562 0.787370 -vt 0.015849 0.875210 -vt 0.343224 0.865212 -vt 0.798364 0.621391 -vt 0.701030 0.877630 -vt 0.806630 0.347948 -vt 0.899654 0.521142 -vt 0.431065 0.716498 -vt 0.461502 0.834775 -vt 0.312788 0.746935 -vt 0.363839 0.174722 -vt 0.375834 0.174919 -vt 0.531331 0.168272 -vt 0.527282 0.168652 -vt 0.523273 0.168887 -vt 0.519466 0.169118 -vt 0.515811 0.169319 -vt 0.512310 0.169498 -vt 0.508962 0.169663 -vt 0.505764 0.169815 -vt 0.502713 0.169957 -vt 0.499748 0.170088 -vt 0.489313 0.170468 -vt 0.484693 0.170641 -vt 0.479208 0.170849 -vt 0.472561 0.171104 -vt 0.464263 0.171426 -vt 0.453455 0.171849 -vt 0.438489 0.172437 -vt 0.415776 0.173333 -vt 0.228319 0.328790 -vt 0.216323 0.328593 -vt 0.060826 0.335240 -vt 0.064875 0.334860 -vt 0.068884 0.334625 -vt 0.072692 0.334394 -vt 0.076346 0.334193 -vt 0.079847 0.334014 -vt 0.083195 0.333849 -vt 0.086393 0.333697 -vt 0.089444 0.333555 -vt 0.092409 0.333424 -vt 0.102844 0.333044 -vt 0.107464 0.332871 -vt 0.112949 0.332663 -vt 0.119596 0.332407 -vt 0.127894 0.332085 -vt 0.138702 0.331663 -vt 0.153668 0.331075 -vt 0.176381 0.330179 -vt 0.766667 0.621391 -vt 0.236623 0.976596 -vt 0.531841 0.224142 -vt 0.533562 0.936161 -vt 0.828780 0.931287 -vt 0.236623 0.937344 -vt 0.953501 0.892035 -vt 0.828780 0.970539 -vt 0.533562 0.975414 -vt 0.531841 0.263395 -vt 0.533562 0.896909 -vt 0.312788 0.943717 -vt 0.311067 0.231698 -vt 0.015849 0.984151 -vt 0.608006 0.938842 -vt 0.015849 0.944899 -vt 0.732727 0.899590 -vt 0.608006 0.978095 -vt 0.312788 0.982969 -vt 0.311067 0.270950 -vt 0.312788 0.904464 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.707100 0.707100 0.000000 -vn -0.707100 0.707100 0.000000 -vn 0.000000 0.707100 -0.707100 -vn 0.000000 0.707100 0.707100 -vn -0.447200 0.000000 0.894400 -vn -0.447200 0.894400 0.000000 -vn 0.000000 1.000000 0.000000 -vn -0.447200 -0.894400 0.000000 -vn -0.447200 0.000000 -0.894400 -vn 0.351100 0.000000 -0.936300 -vn 0.351100 0.000000 0.936300 -vn 0.351100 0.936300 0.000000 -vn 0.351100 -0.936300 0.000000 -vn 0.447200 0.000000 0.894400 -vn 0.447200 0.894400 0.000000 -vn 0.447200 -0.894400 0.000000 -vn 0.447200 0.000000 -0.894400 -vn -0.351100 0.000000 -0.936300 -vn -0.351100 0.000000 0.936300 -vn -0.351100 0.936300 0.000000 -vn -0.351100 -0.936300 0.000000 -vn 0.000000 0.351100 0.936300 -vn 0.000000 0.351100 -0.936300 -vn -0.936300 0.351100 0.000000 -vn 0.936300 0.351100 0.000000 -s off -f 4/1/1 3/2/1 1/3/1 -f 8/4/2 7/5/2 3/6/2 -f 6/7/3 5/8/3 7/9/3 -f 2/10/4 1/11/4 5/12/4 -f 3/13/5 7/14/5 5/15/5 -f 12/16/6 6/7/6 8/17/6 -f 4/1/7 2/18/7 9/19/7 -f 8/4/8 4/20/8 10/21/8 -f 6/22/9 12/23/9 9/24/9 -f 10/21/2 14/25/2 13/26/2 -f 26/27/2 25/28/2 28/29/2 -f 25/30/3 32/31/3 34/32/3 -f 20/33/10 19/34/10 30/35/10 -f 28/36/5 25/37/5 23/38/5 -f 27/39/11 22/40/11 20/41/11 -f 26/42/12 27/39/12 29/43/12 -f 21/44/13 28/36/13 30/45/13 -f 29/46/4 30/35/4 23/47/4 -f 27/48/14 28/29/14 21/49/14 -f 34/50/15 38/51/15 37/52/15 -f 24/53/3 33/54/3 31/55/3 -f 26/56/3 31/57/3 32/58/3 -f 23/59/3 34/50/3 33/60/3 -f 37/52/3 38/51/3 36/61/3 -f 31/57/16 35/62/16 36/61/16 -f 32/31/17 36/61/17 38/51/17 -f 33/54/18 37/52/18 35/62/18 -f 48/63/2 45/64/2 46/65/2 -f 54/66/1 52/67/1 45/68/1 -f 50/69/19 39/70/19 40/71/19 -f 43/72/5 45/73/5 48/74/5 -f 40/75/20 42/76/20 47/77/20 -f 49/78/12 47/77/12 46/79/12 -f 50/80/21 48/74/21 41/81/21 -f 43/82/4 50/69/4 49/83/4 -f 41/84/22 48/63/22 47/85/22 -f 57/86/23 58/87/23 54/88/23 -f 51/89/1 53/90/1 44/91/1 -f 52/92/1 51/93/1 46/94/1 -f 53/95/1 54/88/1 43/96/1 -f 56/97/1 58/87/1 57/86/1 -f 56/97/24 55/98/24 51/93/24 -f 58/87/25 56/97/25 52/67/25 -f 55/98/26 57/86/26 53/90/26 -f 65/99/3 59/100/3 60/101/3 -f 65/102/2 70/103/2 68/104/2 -f 62/105/1 64/106/1 63/107/1 -f 66/108/12 60/101/12 64/106/12 -f 61/109/5 63/107/5 59/100/5 -f 60/101/2 59/100/2 63/107/2 -f 70/103/5 74/110/5 72/111/5 -f 62/112/2 67/113/2 69/114/2 -f 61/115/2 68/116/2 67/117/2 -f 66/118/2 69/119/2 70/120/2 -f 67/113/12 71/121/12 73/122/12 -f 69/119/3 73/123/3 74/124/3 -f 68/116/1 72/125/1 71/126/1 -f 81/127/3 75/128/3 76/129/3 -f 81/130/2 86/131/2 84/132/2 -f 78/133/1 80/134/1 79/135/1 -f 82/136/12 76/129/12 80/134/12 -f 77/137/5 79/135/5 75/128/5 -f 76/129/2 75/128/2 79/135/2 -f 86/131/5 90/138/5 88/139/5 -f 78/140/2 83/141/2 85/142/2 -f 77/143/2 84/144/2 83/145/2 -f 82/146/2 85/147/2 86/148/2 -f 83/141/12 87/149/12 89/150/12 -f 85/147/3 89/151/3 90/152/3 -f 84/144/1 88/153/1 87/154/1 -f 92/155/3 91/156/3 97/157/3 -f 100/158/4 102/159/4 97/160/4 -f 95/161/1 96/162/1 94/163/1 -f 96/162/12 92/155/12 98/164/12 -f 91/156/5 95/161/5 93/165/5 -f 95/161/4 91/156/4 92/155/4 -f 104/166/5 106/167/5 102/159/5 -f 101/168/4 99/169/4 94/170/4 -f 99/171/4 100/172/4 93/173/4 -f 102/174/4 101/175/4 98/176/4 -f 105/177/12 103/178/12 99/169/12 -f 106/179/3 105/180/3 101/175/3 -f 103/181/1 104/182/1 100/172/1 -f 108/183/3 107/184/3 113/185/3 -f 116/186/4 118/187/4 113/188/4 -f 111/189/1 112/190/1 110/191/1 -f 112/190/12 108/183/12 114/192/12 -f 107/184/5 111/189/5 109/193/5 -f 111/189/4 107/184/4 108/183/4 -f 120/194/5 122/195/5 118/187/5 -f 117/196/4 115/197/4 110/198/4 -f 115/199/4 116/200/4 109/201/4 -f 118/202/4 117/203/4 114/204/4 -f 121/205/12 119/206/12 115/197/12 -f 122/207/3 121/208/3 117/203/3 -f 119/209/1 120/210/1 116/200/1 -f 16/211/27 18/212/27 124/213/27 -f 12/23/4 16/211/4 15/214/4 -f 11/215/3 13/216/3 16/217/3 -f 9/19/1 15/218/1 14/219/1 -f 18/212/12 143/220/12 124/213/12 -f 14/25/28 123/221/28 17/222/28 -f 15/218/29 124/223/29 123/224/29 -f 13/216/30 17/225/30 18/226/30 -f 128/227/3 132/228/3 131/229/3 -f 123/221/12 203/230/12 17/222/12 -f 124/223/12 128/227/12 127/231/12 -f 17/225/12 126/232/12 125/233/12 -f 130/234/12 131/235/12 132/236/12 -f 126/232/1 130/237/1 129/238/1 -f 142/239/2 129/240/2 132/241/2 -f 202/242/4 131/243/4 130/244/4 -f 193/245/2 213/246/2 214/247/2 -f 195/248/2 215/249/2 216/250/2 -f 197/251/2 217/252/2 218/253/2 -f 199/254/2 219/255/2 220/256/2 -f 201/257/2 221/258/2 222/259/2 -f 203/260/2 223/261/2 224/262/2 -f 205/263/2 225/264/2 226/265/2 -f 207/266/2 227/267/2 228/268/2 -f 209/269/2 229/270/2 230/271/2 -f 211/272/2 231/273/2 232/274/2 -f 231/273/8 251/275/8 252/276/8 -f 229/270/8 249/277/8 250/278/8 -f 227/267/8 247/279/8 248/280/8 -f 225/264/8 245/281/8 246/282/8 -f 223/261/8 243/283/8 244/284/8 -f 221/258/8 241/285/8 242/286/8 -f 219/255/8 239/287/8 240/288/8 -f 217/252/8 237/289/8 238/290/8 -f 215/249/8 235/291/8 236/292/8 -f 213/246/8 233/293/8 234/294/8 -f 171/295/9 191/296/9 192/297/9 -f 169/298/9 189/299/9 190/300/9 -f 147/301/4 167/302/4 168/303/4 -f 149/304/4 169/298/4 170/305/4 -f 151/306/4 171/295/4 172/307/4 -f 145/308/4 165/309/4 166/310/4 -f 143/311/4 163/312/4 164/313/4 -f 141/314/4 161/315/4 162/316/4 -f 139/317/4 159/318/4 160/319/4 -f 137/320/4 157/321/4 158/322/4 -f 135/323/4 155/324/4 156/325/4 -f 133/326/4 153/327/4 154/328/4 -f 153/327/9 173/329/9 174/330/9 -f 155/324/9 175/331/9 176/332/9 -f 157/321/9 177/333/9 178/334/9 -f 159/318/9 179/335/9 180/336/9 -f 161/315/9 181/337/9 182/338/9 -f 163/312/9 183/339/9 184/340/9 -f 165/309/9 185/341/9 186/342/9 -f 167/302/9 187/343/9 188/344/9 -f 252/276/12 251/275/12 174/330/12 -f 250/278/12 249/277/12 176/332/12 -f 248/280/12 247/279/12 178/334/12 -f 246/282/12 245/281/12 180/336/12 -f 244/284/12 243/283/12 182/338/12 -f 242/286/12 241/285/12 184/340/12 -f 234/294/12 233/293/12 192/297/12 -f 236/292/12 235/291/12 190/300/12 -f 238/290/12 237/289/12 188/344/12 -f 240/288/12 239/287/12 186/342/12 -f 254/345/2 253/346/2 255/347/2 -f 257/348/4 258/349/4 256/350/4 -f 260/351/2 259/352/2 261/353/2 -f 263/354/4 264/355/4 262/356/4 -f 2/18/1 4/1/1 1/3/1 -f 4/20/2 8/4/2 3/6/2 -f 8/17/3 6/7/3 7/9/3 -f 6/22/4 2/10/4 5/12/4 -f 1/357/5 3/13/5 5/15/5 -f 11/215/6 12/16/6 8/17/6 -f 10/358/7 4/1/7 9/19/7 -f 11/359/8 8/4/8 10/21/8 -f 2/10/9 6/22/9 9/24/9 -f 11/359/2 10/21/2 13/26/2 -f 27/48/2 26/27/2 28/29/2 -f 23/360/3 25/30/3 34/32/3 -f 29/46/10 20/33/10 30/35/10 -f 30/45/5 28/36/5 23/38/5 -f 29/43/11 27/39/11 20/41/11 -f 24/361/12 26/42/12 29/43/12 -f 19/362/13 21/44/13 30/45/13 -f 24/363/4 29/46/4 23/47/4 -f 22/364/14 27/48/14 21/49/14 -f 33/60/15 34/50/15 37/52/15 -f 26/365/3 24/53/3 31/55/3 -f 25/366/3 26/56/3 32/58/3 -f 24/367/3 23/59/3 33/60/3 -f 35/62/3 37/52/3 36/61/3 -f 32/58/16 31/57/16 36/61/16 -f 34/32/17 32/31/17 38/51/17 -f 31/55/18 33/54/18 35/62/18 -f 47/85/2 48/63/2 46/65/2 -f 43/368/1 54/66/1 45/68/1 -f 49/83/19 50/69/19 40/71/19 -f 50/80/5 43/72/5 48/74/5 -f 49/78/20 40/75/20 47/77/20 -f 44/369/12 49/78/12 46/79/12 -f 39/370/21 50/80/21 41/81/21 -f 44/371/4 43/82/4 49/83/4 -f 42/372/22 41/84/22 47/85/22 -f 53/95/23 57/86/23 54/88/23 -f 46/373/1 51/89/1 44/91/1 -f 45/374/1 52/92/1 46/94/1 -f 44/375/1 53/95/1 43/96/1 -f 55/98/1 56/97/1 57/86/1 -f 52/92/24 56/97/24 51/93/24 -f 54/66/25 58/87/25 52/67/25 -f 51/89/26 55/98/26 53/90/26 -f 66/118/3 65/99/3 60/101/3 -f 61/109/2 65/102/2 68/104/2 -f 61/115/1 62/105/1 63/107/1 -f 62/112/12 66/108/12 64/106/12 -f 65/102/5 61/109/5 59/100/5 -f 64/106/2 60/101/2 63/107/2 -f 68/104/5 70/103/5 72/111/5 -f 66/108/2 62/112/2 69/114/2 -f 62/105/2 61/115/2 67/117/2 -f 65/99/2 66/118/2 70/120/2 -f 69/114/12 67/113/12 73/122/12 -f 70/120/3 69/119/3 74/124/3 -f 67/117/1 68/116/1 71/126/1 -f 82/146/3 81/127/3 76/129/3 -f 77/137/2 81/130/2 84/132/2 -f 77/143/1 78/133/1 79/135/1 -f 78/140/12 82/136/12 80/134/12 -f 81/130/5 77/137/5 75/128/5 -f 80/134/2 76/129/2 79/135/2 -f 84/132/5 86/131/5 88/139/5 -f 82/136/2 78/140/2 85/142/2 -f 78/133/2 77/143/2 83/145/2 -f 81/127/2 82/146/2 86/148/2 -f 85/142/12 83/141/12 89/150/12 -f 86/148/3 85/147/3 90/152/3 -f 83/145/1 84/144/1 87/154/1 -f 98/176/3 92/155/3 97/157/3 -f 93/165/4 100/158/4 97/160/4 -f 93/173/1 95/161/1 94/163/1 -f 94/170/12 96/162/12 98/164/12 -f 97/160/5 91/156/5 93/165/5 -f 96/162/4 95/161/4 92/155/4 -f 100/158/5 104/166/5 102/159/5 -f 98/164/4 101/168/4 94/170/4 -f 94/163/4 99/171/4 93/173/4 -f 97/157/4 102/174/4 98/176/4 -f 101/168/12 105/177/12 99/169/12 -f 102/174/3 106/179/3 101/175/3 -f 99/171/1 103/181/1 100/172/1 -f 114/204/3 108/183/3 113/185/3 -f 109/193/4 116/186/4 113/188/4 -f 109/201/1 111/189/1 110/191/1 -f 110/198/12 112/190/12 114/192/12 -f 113/188/5 107/184/5 109/193/5 -f 112/190/4 111/189/4 108/183/4 -f 116/186/5 120/194/5 118/187/5 -f 114/192/4 117/196/4 110/198/4 -f 110/191/4 115/199/4 109/201/4 -f 113/185/4 118/202/4 114/204/4 -f 117/196/12 121/205/12 115/197/12 -f 118/202/3 122/207/3 117/203/3 -f 115/199/1 119/209/1 116/200/1 -f 15/214/27 16/211/27 124/213/27 -f 9/24/4 12/23/4 15/214/4 -f 12/16/3 11/215/3 16/217/3 -f 10/358/1 9/19/1 14/219/1 -f 128/376/12 124/213/12 152/377/12 -f 18/212/12 125/378/12 133/379/12 -f 133/379/12 134/380/12 18/212/12 -f 135/381/12 136/382/12 18/212/12 -f 137/383/12 138/384/12 18/212/12 -f 139/385/12 140/386/12 18/212/12 -f 141/387/12 142/239/12 18/212/12 -f 143/220/12 144/388/12 124/213/12 -f 145/389/12 146/390/12 124/213/12 -f 147/391/12 148/392/12 124/213/12 -f 149/393/12 150/394/12 124/213/12 -f 151/395/12 152/377/12 124/213/12 -f 18/212/12 134/380/12 135/381/12 -f 151/395/12 124/213/12 150/394/12 -f 148/392/12 149/393/12 124/213/12 -f 144/388/12 145/389/12 124/213/12 -f 140/386/12 141/387/12 18/212/12 -f 136/382/12 137/383/12 18/212/12 -f 147/391/12 124/213/12 146/390/12 -f 18/212/12 138/384/12 139/385/12 -f 142/239/12 143/220/12 18/212/12 -f 13/26/28 14/25/28 17/222/28 -f 14/219/29 15/218/29 123/224/29 -f 16/217/30 13/216/30 18/226/30 -f 127/231/3 128/227/3 131/229/3 -f 126/396/12 17/222/12 212/397/12 -f 123/221/12 127/398/12 193/399/12 -f 193/399/12 194/400/12 123/221/12 -f 195/401/12 196/402/12 123/221/12 -f 197/403/12 198/404/12 123/221/12 -f 199/405/12 200/406/12 123/221/12 -f 201/407/12 202/242/12 123/221/12 -f 203/230/12 204/408/12 17/222/12 -f 205/409/12 206/410/12 17/222/12 -f 207/411/12 208/412/12 17/222/12 -f 209/413/12 210/414/12 17/222/12 -f 211/415/12 212/397/12 17/222/12 -f 123/221/12 194/400/12 195/401/12 -f 211/415/12 17/222/12 210/414/12 -f 208/412/12 209/413/12 17/222/12 -f 204/408/12 205/409/12 17/222/12 -f 200/406/12 201/407/12 123/221/12 -f 196/402/12 197/403/12 123/221/12 -f 207/411/12 17/222/12 206/410/12 -f 123/221/12 198/404/12 199/405/12 -f 202/242/12 203/230/12 123/221/12 -f 123/224/12 124/223/12 127/231/12 -f 18/226/12 17/225/12 125/233/12 -f 129/416/12 130/234/12 132/236/12 -f 125/233/1 126/232/1 129/238/1 -f 132/241/2 128/376/2 152/377/2 -f 152/377/2 151/395/2 132/241/2 -f 150/394/2 149/393/2 132/241/2 -f 148/392/2 147/391/2 132/241/2 -f 146/390/2 145/389/2 132/241/2 -f 144/388/2 143/220/2 132/241/2 -f 142/239/2 141/387/2 129/240/2 -f 140/386/2 139/385/2 129/240/2 -f 138/384/2 137/383/2 129/240/2 -f 136/382/2 135/381/2 129/240/2 -f 134/380/2 133/379/2 129/240/2 -f 125/378/2 129/240/2 133/379/2 -f 132/241/2 151/395/2 150/394/2 -f 149/393/2 148/392/2 132/241/2 -f 145/389/2 144/388/2 132/241/2 -f 141/387/2 140/386/2 129/240/2 -f 137/383/2 136/382/2 129/240/2 -f 134/380/2 129/240/2 135/381/2 -f 132/241/2 147/391/2 146/390/2 -f 143/220/2 142/239/2 132/241/2 -f 138/384/2 129/240/2 139/385/2 -f 130/244/4 126/396/4 212/397/4 -f 212/397/4 211/415/4 130/244/4 -f 210/414/4 209/413/4 130/244/4 -f 208/412/4 207/411/4 130/244/4 -f 206/410/4 205/409/4 130/244/4 -f 204/408/4 203/230/4 130/244/4 -f 202/242/4 201/407/4 131/243/4 -f 200/406/4 199/405/4 131/243/4 -f 198/404/4 197/403/4 131/243/4 -f 196/402/4 195/401/4 131/243/4 -f 194/400/4 193/399/4 131/243/4 -f 127/398/4 131/243/4 193/399/4 -f 130/244/4 211/415/4 210/414/4 -f 209/413/4 208/412/4 130/244/4 -f 205/409/4 204/408/4 130/244/4 -f 201/407/4 200/406/4 131/243/4 -f 197/403/4 196/402/4 131/243/4 -f 194/400/4 131/243/4 195/401/4 -f 130/244/4 207/411/4 206/410/4 -f 203/230/4 202/242/4 130/244/4 -f 198/404/4 131/243/4 199/405/4 -f 194/417/2 193/245/2 214/247/2 -f 196/418/2 195/248/2 216/250/2 -f 198/419/2 197/251/2 218/253/2 -f 200/420/2 199/254/2 220/256/2 -f 202/421/2 201/257/2 222/259/2 -f 204/422/2 203/260/2 224/262/2 -f 206/423/2 205/263/2 226/265/2 -f 208/424/2 207/266/2 228/268/2 -f 210/425/2 209/269/2 230/271/2 -f 212/426/2 211/272/2 232/274/2 -f 232/274/8 231/273/8 252/276/8 -f 230/271/8 229/270/8 250/278/8 -f 228/268/8 227/267/8 248/280/8 -f 226/265/8 225/264/8 246/282/8 -f 224/262/8 223/261/8 244/284/8 -f 222/259/8 221/258/8 242/286/8 -f 220/256/8 219/255/8 240/288/8 -f 218/253/8 217/252/8 238/290/8 -f 216/250/8 215/249/8 236/292/8 -f 214/247/8 213/246/8 234/294/8 -f 172/307/9 171/295/9 192/297/9 -f 170/305/9 169/298/9 190/300/9 -f 148/427/4 147/301/4 168/303/4 -f 150/428/4 149/304/4 170/305/4 -f 152/429/4 151/306/4 172/307/4 -f 146/430/4 145/308/4 166/310/4 -f 144/431/4 143/311/4 164/313/4 -f 142/432/4 141/314/4 162/316/4 -f 140/433/4 139/317/4 160/319/4 -f 138/434/4 137/320/4 158/322/4 -f 136/435/4 135/323/4 156/325/4 -f 134/436/4 133/326/4 154/328/4 -f 154/328/9 153/327/9 174/330/9 -f 156/325/9 155/324/9 176/332/9 -f 158/322/9 157/321/9 178/334/9 -f 160/319/9 159/318/9 180/336/9 -f 162/316/9 161/315/9 182/338/9 -f 164/313/9 163/312/9 184/340/9 -f 166/310/9 165/309/9 186/342/9 -f 168/303/9 167/302/9 188/344/9 -f 173/329/12 252/276/12 174/330/12 -f 175/331/12 250/278/12 176/332/12 -f 177/333/12 248/280/12 178/334/12 -f 179/335/12 246/282/12 180/336/12 -f 181/337/12 244/284/12 182/338/12 -f 183/339/12 242/286/12 184/340/12 -f 191/296/12 234/294/12 192/297/12 -f 189/299/12 236/292/12 190/300/12 -f 187/343/12 238/290/12 188/344/12 -f 185/341/12 240/288/12 186/342/12 diff --git a/src/main/resources/assets/hbm/models/assembler_wheel.obj b/src/main/resources/assets/hbm/models/assembler_wheel.obj deleted file mode 100644 index 526a71b3c..000000000 --- a/src/main/resources/assets/hbm/models/assembler_wheel.obj +++ /dev/null @@ -1,645 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'assembler_wheel.blend' -# www.blender.org -o Cylinder -v 0.000000 1.162500 -0.750000 -v 0.000000 1.537500 -0.750000 -v 0.194114 1.162500 -0.724444 -v 0.194114 1.537500 -0.724444 -v 0.375000 1.162500 -0.649519 -v 0.375000 1.537500 -0.649519 -v 0.530330 1.162500 -0.530330 -v 0.530330 1.537500 -0.530330 -v 0.649519 1.162500 -0.375000 -v 0.649519 1.537500 -0.375000 -v 0.724444 1.162500 -0.194114 -v 0.724444 1.537500 -0.194114 -v 0.750000 1.162500 -0.000000 -v 0.750000 1.537500 -0.000000 -v 0.724444 1.162500 0.194114 -v 0.724444 1.537500 0.194114 -v 0.649519 1.162500 0.375000 -v 0.649519 1.537500 0.375000 -v 0.530330 1.162500 0.530330 -v 0.530330 1.537500 0.530330 -v 0.375000 1.162500 0.649519 -v 0.375000 1.537500 0.649519 -v 0.194115 1.162500 0.724444 -v 0.194115 1.537500 0.724444 -v 0.000000 1.162500 0.750000 -v 0.000000 1.537500 0.750000 -v -0.194114 1.162500 0.724444 -v -0.194114 1.537500 0.724444 -v -0.375000 1.162500 0.649519 -v -0.375000 1.537500 0.649519 -v -0.530330 1.162500 0.530330 -v -0.530330 1.537500 0.530330 -v -0.649519 1.162500 0.375000 -v -0.649519 1.537500 0.375000 -v -0.724444 1.162500 0.194115 -v -0.724444 1.537500 0.194115 -v -0.750000 1.162500 0.000000 -v -0.750000 1.537500 0.000000 -v -0.724444 1.162500 -0.194114 -v -0.724444 1.537500 -0.194114 -v -0.649519 1.162500 -0.375000 -v -0.649519 1.537500 -0.375000 -v -0.530330 1.162500 -0.530330 -v -0.530330 1.537500 -0.530330 -v -0.375000 1.162500 -0.649519 -v -0.375000 1.537500 -0.649519 -v -0.194115 1.162500 -0.724444 -v -0.194115 1.537500 -0.724444 -v 0.000000 1.162500 -0.562500 -v 0.000000 1.537500 -0.562500 -v 0.145586 1.162500 -0.543333 -v 0.145586 1.537500 -0.543333 -v 0.281250 1.162500 -0.487139 -v 0.281250 1.537500 -0.487139 -v 0.397748 1.162500 -0.397748 -v 0.397748 1.537500 -0.397748 -v 0.487139 1.162500 -0.281250 -v 0.487139 1.537500 -0.281250 -v 0.543333 1.162500 -0.145586 -v 0.543333 1.537500 -0.145586 -v 0.562500 1.162500 -0.000000 -v 0.562500 1.537500 -0.000000 -v 0.543333 1.162500 0.145586 -v 0.543333 1.537500 0.145586 -v 0.487139 1.162500 0.281250 -v 0.487139 1.537500 0.281250 -v 0.397748 1.162500 0.397747 -v 0.397748 1.537500 0.397747 -v 0.281250 1.162500 0.487139 -v 0.281250 1.537500 0.487139 -v 0.145586 1.162500 0.543333 -v 0.145586 1.537500 0.543333 -v 0.000000 1.162500 0.562500 -v 0.000000 1.537500 0.562500 -v -0.145585 1.162500 0.543333 -v -0.145585 1.537500 0.543333 -v -0.281250 1.162500 0.487139 -v -0.281250 1.537500 0.487139 -v -0.397747 1.162500 0.397748 -v -0.397747 1.537500 0.397748 -v -0.487139 1.162500 0.281250 -v -0.487139 1.537500 0.281250 -v -0.543333 1.162500 0.145586 -v -0.543333 1.537500 0.145586 -v -0.562500 1.162500 0.000000 -v -0.562500 1.537500 0.000000 -v -0.543333 1.162500 -0.145585 -v -0.543333 1.537500 -0.145585 -v -0.487139 1.162500 -0.281250 -v -0.487139 1.537500 -0.281250 -v -0.397748 1.162500 -0.397747 -v -0.397748 1.537500 -0.397747 -v -0.281250 1.162500 -0.487139 -v -0.281250 1.537500 -0.487139 -v -0.145586 1.162500 -0.543333 -v -0.145586 1.537500 -0.543333 -v 0.000000 1.537500 -0.281250 -v 0.072793 1.537500 -0.271667 -v 0.140625 1.537500 -0.243570 -v 0.198874 1.537500 -0.198874 -v 0.243570 1.537500 -0.140625 -v 0.271667 1.537500 -0.072793 -v 0.281250 1.537500 0.000000 -v 0.271667 1.537500 0.072793 -v 0.243570 1.537500 0.140625 -v 0.198874 1.537500 0.198874 -v 0.140625 1.537500 0.243570 -v 0.072793 1.537500 0.271667 -v 0.000000 1.537500 0.281250 -v -0.072793 1.537500 0.271667 -v -0.140625 1.537500 0.243570 -v -0.198874 1.537500 0.198874 -v -0.243570 1.537500 0.140625 -v -0.271667 1.537500 0.072793 -v -0.281250 1.537500 0.000000 -v -0.271667 1.537500 -0.072793 -v -0.243570 1.537500 -0.140625 -v -0.198874 1.537500 -0.198874 -v -0.140625 1.537500 -0.243569 -v -0.072793 1.537500 -0.271667 -v 0.000000 1.287500 0.281250 -v 0.072793 1.287500 0.271667 -v 0.140625 1.287500 0.243570 -v 0.198874 1.287500 0.198874 -v 0.243570 1.287500 0.140625 -v 0.271667 1.287500 0.072793 -v 0.281250 1.287500 0.000000 -v 0.271667 1.287500 -0.072793 -v 0.243570 1.287500 -0.140625 -v 0.198874 1.287500 -0.198874 -v 0.140625 1.287500 -0.243570 -v 0.072793 1.287500 -0.271667 -v 0.000000 1.287500 -0.281250 -v -0.072793 1.287500 0.271667 -v -0.140625 1.287500 0.243570 -v -0.198874 1.287500 0.198874 -v -0.243570 1.287500 0.140625 -v -0.271667 1.287500 0.072793 -v -0.281250 1.287500 0.000000 -v -0.271667 1.287500 -0.072793 -v -0.243570 1.287500 -0.140625 -v -0.198874 1.287500 -0.198874 -v -0.140625 1.287500 -0.243569 -v -0.072793 1.287500 -0.271667 -vt 0.190885 0.497428 -vt 0.190885 0.622697 -vt 0.128251 0.622697 -vt 0.607699 0.748393 -vt 0.542295 0.748393 -vt 0.542295 0.623125 -vt 0.062848 0.622697 -vt 0.000214 0.622697 -vt 0.000214 0.497429 -vt 0.367975 0.748393 -vt 0.302572 0.748393 -vt 0.302572 0.623125 -vt 0.670333 0.748821 -vt 0.670333 0.874089 -vt 0.607699 0.874089 -vt 0.128251 0.748393 -vt 0.062848 0.748393 -vt 0.062848 0.623125 -vt 0.542296 0.874090 -vt 0.479662 0.874090 -vt 0.479662 0.748821 -vt 0.607699 0.999786 -vt 0.542296 0.999786 -vt 0.542296 0.874518 -vt 0.430609 0.748821 -vt 0.430609 0.874090 -vt 0.367975 0.874090 -vt 0.367975 0.999786 -vt 0.302572 0.999786 -vt 0.302572 0.874518 -vt 0.302572 0.874090 -vt 0.239938 0.874090 -vt 0.239938 0.748821 -vt 0.128251 0.999786 -vt 0.062848 0.999786 -vt 0.062848 0.874518 -vt 0.190886 0.748821 -vt 0.190886 0.874090 -vt 0.128251 0.874089 -vt 0.607699 0.622697 -vt 0.542295 0.622697 -vt 0.542295 0.497428 -vt 0.000214 0.874089 -vt 0.000214 0.748821 -vt 0.062848 0.748821 -vt 0.367975 0.622697 -vt 0.302572 0.622697 -vt 0.302572 0.497428 -vt 0.670333 0.623125 -vt 0.670333 0.748393 -vt 0.062848 0.497429 -vt 0.479661 0.748393 -vt 0.479661 0.623125 -vt 0.542296 0.748821 -vt 0.430609 0.623125 -vt 0.430609 0.748393 -vt 0.302572 0.748821 -vt 0.176700 0.075008 -vt 0.134220 0.099534 -vt 0.096090 0.049843 -vt 0.062848 0.874089 -vt 0.239938 0.748393 -vt 0.049843 0.096090 -vt 0.099534 0.134219 -vt 0.075008 0.176700 -vt 0.719385 0.748393 -vt 0.190885 0.748393 -vt 0.128251 0.623125 -vt 0.000214 0.748393 -vt 0.190885 0.623125 -vt 0.670333 0.999786 -vt 0.607699 0.874518 -vt 0.719385 0.999786 -vt 0.670333 0.874518 -vt 0.479661 0.999786 -vt 0.479661 0.874518 -vt 0.430609 0.999786 -vt 0.430609 0.874518 -vt 0.239938 0.999786 -vt 0.190885 0.999786 -vt 0.190885 0.874518 -vt 0.239938 0.874518 -vt 0.719385 0.622697 -vt 0.670333 0.622697 -vt 0.670333 0.497428 -vt 0.239938 0.622697 -vt 0.239938 0.497428 -vt 0.479661 0.622697 -vt 0.430609 0.622697 -vt 0.430609 0.497428 -vt 0.000214 0.999786 -vt 0.000214 0.874518 -vt 0.719385 0.874089 -vt 0.479661 0.497428 -vt 0.323144 0.191413 -vt 0.397680 0.134219 -vt 0.422206 0.176700 -vt 0.273133 0.062312 -vt 0.224081 0.062312 -vt 0.215906 0.000214 -vt 0.362995 0.099534 -vt 0.320514 0.075008 -vt 0.344483 0.017142 -vt 0.480073 0.152731 -vt 0.434902 0.224081 -vt 0.497000 0.215905 -vt 0.497000 0.281309 -vt 0.397680 0.362995 -vt 0.422206 0.320514 -vt 0.480073 0.344483 -vt 0.362995 0.397680 -vt 0.401124 0.447371 -vt 0.344484 0.480073 -vt 0.224081 0.434902 -vt 0.273133 0.434902 -vt 0.281309 0.497000 -vt 0.134219 0.397680 -vt 0.176700 0.422206 -vt 0.152731 0.480073 -vt 0.017142 0.344483 -vt 0.075008 0.320514 -vt 0.099534 0.362995 -vt 0.062312 0.224081 -vt 0.062312 0.273133 -vt 0.000214 0.281309 -vt 0.305801 0.174071 -vt 0.521955 0.167717 -vt 0.521955 0.084205 -vt 0.546481 0.084205 -vt 0.546481 0.335598 -vt 0.546481 0.252086 -vt 0.571007 0.252086 -vt 0.497428 0.251658 -vt 0.497428 0.168145 -vt 0.521955 0.168145 -vt 0.571007 0.083752 -vt 0.571036 0.000239 -vt 0.595562 0.000248 -vt 0.546481 0.167717 -vt 0.571007 0.084205 -vt 0.521955 0.251658 -vt 0.546481 0.168145 -vt 0.571007 0.335598 -vt 0.595533 0.252086 -vt 0.571007 0.167717 -vt 0.595533 0.084205 -vt 0.595533 0.083760 -vt 0.620088 0.000256 -vt 0.546481 0.251658 -vt 0.571007 0.168145 -vt 0.595533 0.167717 -vt 0.620059 0.084205 -vt 0.595533 0.335598 -vt 0.620059 0.252086 -vt 0.571007 0.251658 -vt 0.595533 0.168145 -vt 0.620059 0.083769 -vt 0.644614 0.000265 -vt 0.620059 0.167717 -vt 0.644585 0.084205 -vt 0.497428 0.083726 -vt 0.497457 0.000214 -vt 0.521983 0.000223 -vt 0.595533 0.251658 -vt 0.620059 0.168145 -vt 0.620059 0.335598 -vt 0.644585 0.252086 -vt 0.497428 0.335598 -vt 0.497428 0.252086 -vt 0.521955 0.252086 -vt 0.620059 0.251658 -vt 0.644585 0.168145 -vt 0.521955 0.083735 -vt 0.546510 0.000231 -vt 0.497428 0.167717 -vt 0.497428 0.084205 -vt 0.521955 0.335598 -vt 0.546481 0.083743 -vt 0.341755 0.236344 -vt 0.335407 0.212654 -vt 0.434902 0.273133 -vt 0.341755 0.260870 -vt 0.335407 0.284561 -vt 0.323144 0.305801 -vt 0.305801 0.323144 -vt 0.284561 0.335407 -vt 0.260870 0.341754 -vt 0.320514 0.422206 -vt 0.236344 0.341754 -vt 0.212654 0.335407 -vt 0.191413 0.323144 -vt 0.174071 0.305801 -vt 0.161808 0.284561 -vt 0.155460 0.260870 -vt 0.155460 0.236344 -vt 0.161808 0.212653 -vt 0.174071 0.191413 -vt 0.191413 0.174071 -vt 0.212654 0.161807 -vt 0.236344 0.155460 -vt 0.260870 0.155460 -vt 0.284561 0.161808 -vt 0.128251 0.497428 -vt 0.607699 0.623125 -vt 0.367975 0.623125 -vt 0.607699 0.748821 -vt 0.367975 0.748821 -vt 0.367975 0.874518 -vt 0.128251 0.874518 -vt 0.128251 0.748821 -vt 0.607699 0.497428 -vt 0.367975 0.497428 -vt 0.152731 0.017142 -vt 0.239938 0.623125 -vt 0.017142 0.152731 -vt 0.719385 0.623125 -vt 0.000214 0.623125 -vt 0.719385 0.874518 -vt 0.719385 0.497428 -vt 0.719385 0.748821 -vt 0.281309 0.000214 -vt 0.401124 0.049843 -vt 0.447371 0.096090 -vt 0.447371 0.401124 -vt 0.215906 0.497000 -vt 0.096090 0.447371 -vt 0.049843 0.401124 -vt 0.000214 0.215905 -vt 0.644585 0.083777 -vt 0.644585 0.167717 -vt 0.644585 0.335598 -vt 0.644585 0.251658 -vn 0.258800 0.000000 0.965900 -vn 0.382700 0.000000 -0.923900 -vn -0.000000 0.000000 -1.000000 -vn 0.793400 0.000000 -0.608800 -vn -0.258800 0.000000 0.965900 -vn 0.991400 0.000000 -0.130500 -vn 0.500000 0.000000 -0.866000 -vn 0.923900 0.000000 0.382700 -vn -0.707100 0.000000 0.707100 -vn 0.608800 0.000000 0.793400 -vn 0.866000 0.000000 -0.500000 -vn 0.130500 0.000000 0.991400 -vn -0.965900 0.000000 0.258800 -vn -0.382700 0.000000 0.923900 -vn 1.000000 0.000000 -0.000000 -vn -0.793400 0.000000 0.608800 -vn -0.965900 0.000000 -0.258800 -vn -0.991400 0.000000 0.130500 -vn 0.866000 0.000000 0.500000 -vn -0.923900 0.000000 -0.382700 -vn -0.707100 0.000000 -0.707100 -vn -0.608800 0.000000 -0.793400 -vn 0.000000 1.000000 -0.000000 -vn -0.130500 0.000000 -0.991400 -vn 0.500000 0.000000 0.866000 -vn 0.130500 0.000000 -0.991400 -vn -0.258800 0.000000 -0.965900 -vn 0.608800 0.000000 -0.793400 -vn 0.000000 0.000000 1.000000 -vn 0.923900 0.000000 -0.382700 -vn 0.258800 0.000000 -0.965900 -vn 0.991400 0.000000 0.130500 -vn -0.500000 0.000000 0.866000 -vn 0.793400 0.000000 0.608800 -vn 0.707100 0.000000 -0.707100 -vn 0.382700 0.000000 0.923900 -vn -0.866000 0.000000 0.500000 -vn -0.130500 0.000000 0.991400 -vn -0.500000 0.000000 -0.866000 -vn -0.608800 0.000000 0.793400 -vn 0.965900 0.000000 -0.258800 -vn -0.923900 0.000000 0.382700 -vn -1.000000 0.000000 0.000000 -vn -0.991400 0.000000 -0.130500 -vn 0.965900 0.000000 0.258800 -vn -0.793400 0.000000 -0.608800 -vn -0.866000 0.000000 -0.500000 -vn 0.707100 0.000000 0.707100 -vn -0.382700 0.000000 -0.923900 -s off -f 83/1/1 84/2/1 36/3/1 -f 4/4/2 6/5/2 5/6/2 -f 38/7/3 86/8/3 85/9/3 -f 8/10/4 10/11/4 9/12/4 -f 87/13/5 88/14/5 40/15/5 -f 12/16/6 14/17/6 13/18/6 -f 42/19/7 90/20/7 89/21/7 -f 16/22/8 18/23/8 17/24/8 -f 91/25/9 92/26/9 44/27/9 -f 20/28/10 22/29/10 21/30/10 -f 46/31/11 94/32/11 93/33/11 -f 24/34/12 26/35/12 25/36/12 -f 95/37/13 96/38/13 48/39/13 -f 28/40/14 30/41/14 29/42/14 -f 50/43/15 49/44/15 1/45/15 -f 32/46/16 34/47/16 33/48/16 -f 51/49/17 52/50/17 4/4/17 -f 36/3/18 38/7/18 37/51/18 -f 6/5/19 54/52/19 53/53/19 -f 40/15/20 42/19/20 41/54/20 -f 55/55/21 56/56/21 8/10/21 -f 44/27/22 46/31/22 45/57/22 -f 80/58/23 82/59/23 34/60/23 -f 48/39/24 2/61/24 1/45/24 -f 9/12/25 10/11/25 58/62/25 -f 36/63/23 84/64/23 86/65/23 -f 50/66/26 52/50/26 51/49/26 -f 60/67/27 12/16/27 11/68/27 -f 54/52/28 56/56/28 55/55/28 -f 13/18/29 14/17/29 62/69/29 -f 58/62/30 60/67/30 59/70/30 -f 64/71/31 16/22/31 15/72/31 -f 62/73/32 64/71/32 63/74/32 -f 18/23/33 66/75/33 65/76/33 -f 66/75/34 68/77/34 67/78/34 -f 67/78/35 68/77/35 20/28/35 -f 70/79/36 72/80/36 71/81/36 -f 22/29/37 70/79/37 69/82/37 -f 74/83/38 76/84/38 75/85/38 -f 34/47/39 82/86/39 81/87/39 -f 78/88/40 80/89/40 79/90/40 -f 71/81/41 72/80/41 24/34/41 -f 82/86/42 84/2/42 83/1/42 -f 26/35/43 74/91/43 73/92/43 -f 86/93/44 88/14/44 87/13/44 -f 75/85/45 76/84/45 28/40/45 -f 90/20/46 92/26/46 91/25/46 -f 30/41/47 78/88/47 77/94/47 -f 79/90/48 80/89/48 32/46/48 -f 94/32/49 96/38/49 95/37/49 -f 107/95/23 70/96/23 68/97/23 -f 76/98/23 78/99/23 30/100/23 -f 72/101/23 74/102/23 26/103/23 -f 20/104/23 68/97/23 70/96/23 -f 66/105/23 18/106/23 16/107/23 -f 60/108/23 62/109/23 14/110/23 -f 58/111/23 10/112/23 8/113/23 -f 52/114/23 54/115/23 6/116/23 -f 96/117/23 50/118/23 2/119/23 -f 44/120/23 92/121/23 94/122/23 -f 88/123/23 90/124/23 42/125/23 -f 108/126/23 72/101/23 70/96/23 -f 116/127/8 140/128/8 141/129/8 -f 105/130/46 125/131/46 124/132/46 -f 109/133/26 121/134/26 134/135/26 -f 100/136/16 130/137/16 129/138/16 -f 117/139/34 141/129/34 142/140/34 -f 110/141/2 134/135/2 135/142/2 -f 106/143/22 124/132/22 123/144/22 -f 118/145/10 142/140/10 143/146/10 -f 101/147/42 129/138/42 128/148/42 -f 111/149/28 135/142/28 136/150/28 -f 119/151/36 143/146/36 144/152/36 -f 107/153/49 123/144/49 122/154/49 -f 112/155/4 136/150/4 137/156/4 -f 102/157/18 128/148/18 127/158/18 -f 120/159/12 144/152/12 133/160/12 -f 97/161/38 133/162/38 132/163/38 -f 113/164/30 137/156/30 138/165/30 -f 108/166/24 122/154/24 121/167/24 -f 103/168/44 127/169/44 126/170/44 -f 114/171/6 138/165/6 139/172/6 -f 98/173/14 132/163/14 131/174/14 -f 115/175/32 139/176/32 140/128/32 -f 104/177/20 126/170/20 125/131/20 -f 99/178/40 131/174/40 130/137/40 -f 105/179/23 106/180/23 68/97/23 -f 64/181/23 104/182/23 105/179/23 -f 103/183/23 104/182/23 64/181/23 -f 102/184/23 103/183/23 62/109/23 -f 101/185/23 102/184/23 60/108/23 -f 100/186/23 101/185/23 58/111/23 -f 99/187/23 100/186/23 56/188/23 -f 52/114/23 98/189/23 99/187/23 -f 97/190/23 98/189/23 52/114/23 -f 120/191/23 97/190/23 50/118/23 -f 119/192/23 120/191/23 96/117/23 -f 118/193/23 119/192/23 94/122/23 -f 117/194/23 118/193/23 92/121/23 -f 116/195/23 117/194/23 90/124/23 -f 115/196/23 116/195/23 88/123/23 -f 84/64/23 114/197/23 115/196/23 -f 82/59/23 113/198/23 114/197/23 -f 112/199/23 113/198/23 82/59/23 -f 78/99/23 111/200/23 112/199/23 -f 110/201/23 111/200/23 78/99/23 -f 74/102/23 109/202/23 110/201/23 -f 108/126/23 109/202/23 74/102/23 -f 35/203/1 83/1/1 36/3/1 -f 3/204/2 4/4/2 5/6/2 -f 37/51/3 38/7/3 85/9/3 -f 7/205/4 8/10/4 9/12/4 -f 39/206/5 87/13/5 40/15/5 -f 11/68/6 12/16/6 13/18/6 -f 41/54/7 42/19/7 89/21/7 -f 15/72/8 16/22/8 17/24/8 -f 43/207/9 91/25/9 44/27/9 -f 19/208/10 20/28/10 21/30/10 -f 45/57/11 46/31/11 93/33/11 -f 23/209/12 24/34/12 25/36/12 -f 47/210/13 95/37/13 48/39/13 -f 27/211/14 28/40/14 29/42/14 -f 2/61/15 50/43/15 1/45/15 -f 31/212/16 32/46/16 33/48/16 -f 3/204/17 51/49/17 4/4/17 -f 35/203/18 36/3/18 37/51/18 -f 5/6/19 6/5/19 53/53/19 -f 39/206/20 40/15/20 41/54/20 -f 7/205/21 55/55/21 8/10/21 -f 43/207/22 44/27/22 45/57/22 -f 32/213/23 80/58/23 34/60/23 -f 47/210/24 48/39/24 1/45/24 -f 57/214/25 9/12/25 58/62/25 -f 38/215/23 36/63/23 86/65/23 -f 49/216/26 50/66/26 51/49/26 -f 59/70/27 60/67/27 11/68/27 -f 53/53/28 54/52/28 55/55/28 -f 61/217/29 13/18/29 62/69/29 -f 57/214/30 58/62/30 59/70/30 -f 63/74/31 64/71/31 15/72/31 -f 61/218/32 62/73/32 63/74/32 -f 17/24/33 18/23/33 65/76/33 -f 65/76/34 66/75/34 67/78/34 -f 19/208/35 67/78/35 20/28/35 -f 69/82/36 70/79/36 71/81/36 -f 21/30/37 22/29/37 69/82/37 -f 73/219/38 74/83/38 75/85/38 -f 33/48/39 34/47/39 81/87/39 -f 77/94/40 78/88/40 79/90/40 -f 23/209/41 71/81/41 24/34/41 -f 81/87/42 82/86/42 83/1/42 -f 25/36/43 26/35/43 73/92/43 -f 85/220/44 86/93/44 87/13/44 -f 27/211/45 75/85/45 28/40/45 -f 89/21/46 90/20/46 91/25/46 -f 29/42/47 30/41/47 77/94/47 -f 31/212/48 79/90/48 32/46/48 -f 93/33/49 94/32/49 95/37/49 -f 106/180/23 107/95/23 68/97/23 -f 28/221/23 76/98/23 30/100/23 -f 24/222/23 72/101/23 26/103/23 -f 22/223/23 20/104/23 70/96/23 -f 64/181/23 66/105/23 16/107/23 -f 12/224/23 60/108/23 14/110/23 -f 56/188/23 58/111/23 8/113/23 -f 4/225/23 52/114/23 6/116/23 -f 48/226/23 96/117/23 2/119/23 -f 46/227/23 44/120/23 94/122/23 -f 40/228/23 88/123/23 42/125/23 -f 107/95/23 108/126/23 70/96/23 -f 117/139/8 116/127/8 141/129/8 -f 106/143/46 105/130/46 124/132/46 -f 110/141/26 109/133/26 134/135/26 -f 101/147/16 100/136/16 129/138/16 -f 118/145/34 117/139/34 142/140/34 -f 111/149/2 110/141/2 135/142/2 -f 107/153/22 106/143/22 123/144/22 -f 119/151/10 118/145/10 143/146/10 -f 102/157/42 101/147/42 128/148/42 -f 112/155/28 111/149/28 136/150/28 -f 120/159/36 119/151/36 144/152/36 -f 108/166/49 107/153/49 122/154/49 -f 113/164/4 112/155/4 137/156/4 -f 103/229/18 102/157/18 127/158/18 -f 97/230/12 120/159/12 133/160/12 -f 98/173/38 97/161/38 132/163/38 -f 114/171/30 113/164/30 138/165/30 -f 109/231/24 108/166/24 121/167/24 -f 104/177/44 103/168/44 126/170/44 -f 115/232/6 114/171/6 139/172/6 -f 99/178/14 98/173/14 131/174/14 -f 116/127/32 115/175/32 140/128/32 -f 105/130/20 104/177/20 125/131/20 -f 100/136/40 99/178/40 130/137/40 -f 66/105/23 105/179/23 68/97/23 -f 66/105/23 64/181/23 105/179/23 -f 62/109/23 103/183/23 64/181/23 -f 60/108/23 102/184/23 62/109/23 -f 58/111/23 101/185/23 60/108/23 -f 56/188/23 100/186/23 58/111/23 -f 54/115/23 99/187/23 56/188/23 -f 54/115/23 52/114/23 99/187/23 -f 50/118/23 97/190/23 52/114/23 -f 96/117/23 120/191/23 50/118/23 -f 94/122/23 119/192/23 96/117/23 -f 92/121/23 118/193/23 94/122/23 -f 90/124/23 117/194/23 92/121/23 -f 88/123/23 116/195/23 90/124/23 -f 86/65/23 115/196/23 88/123/23 -f 86/65/23 84/64/23 115/196/23 -f 84/64/23 82/59/23 114/197/23 -f 80/58/23 112/199/23 82/59/23 -f 80/58/23 78/99/23 112/199/23 -f 76/98/23 110/201/23 78/99/23 -f 76/98/23 74/102/23 110/201/23 -f 72/101/23 108/126/23 74/102/23 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png new file mode 100644 index 0000000000000000000000000000000000000000..19221af066c73104c8d5226f6e1e33f50c46a3d1 GIT binary patch literal 3517 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 MPv%C22F}<10u Date: Tue, 8 Jul 2025 16:46:41 +0200 Subject: [PATCH 074/323] needle punch fuck machine --- .../ContainerMachineAssemblyMachine.java | 74 +++++++ .../gui/GUIMachineAssemblyMachine.java | 121 +++++++++++ .../recipes/AssemblyMachineRecipes.java | 56 +++++ .../inventory/recipes/anvil/AnvilRecipes.java | 5 +- .../recipes/loader/SerializableRecipe.java | 1 + src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../machine/ModuleMachineAssembler.java | 3 +- .../tileentity/RenderAssemblyMachine.java | 157 ++++++++++++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityMachineAssembler.java | 1 + .../TileEntityMachineAssemblerBase.java | 1 + .../TileEntityMachineAssemblyMachine.java | 192 +++++++++++++++++- .../textures/gui/processing/gui_assembler.png | Bin 3517 -> 3445 bytes 14 files changed, 607 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java create mode 100644 src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java new file mode 100644 index 000000000..f7bc0d499 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java @@ -0,0 +1,74 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemAssemblyTemplate; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.util.InventoryUtil; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachineAssemblyMachine extends ContainerBase { + + public ContainerMachineAssemblyMachine(InventoryPlayer invPlayer, IInventory assembler) { + super(invPlayer, assembler); + + // Battery + this.addSlotToContainer(new SlotNonRetarded(assembler, 0, 152, 81)); + // Schematic + this.addSlotToContainer(new SlotNonRetarded(assembler, 1, 35, 126)); + // Upgrades + this.addSlots(assembler, 2, 152, 108, 2, 1); + // Input + this.addSlots(assembler, 4, 8, 18, 4, 3); + // Output + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, assembler, 16, 98, 45)); + + this.playerInv(invPlayer, 8, 174); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack slotOriginal = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + slotOriginal = slotStack.copy(); + + if(index <= tile.getSizeInventory() - 1) { + SlotCraftingOutput.checkAchievements(player, slotStack); + if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemAssemblyTemplate) { + if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { + if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 7, false)) return null; + } + } + + if(slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + slot.onPickupFromSlot(player, slotStack); + } + + return slotOriginal; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java new file mode 100644 index 000000000..8218c4057 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -0,0 +1,121 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineAssemblyMachine; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineAssemblyMachine extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_assembler.png"); + private TileEntityMachineAssemblyMachine assembler; + + public GUIMachineAssemblyMachine(InventoryPlayer invPlayer, TileEntityMachineAssemblyMachine tedf) { + super(new ContainerMachineAssemblyMachine(invPlayer, tedf)); + assembler = tedf; + + this.xSize = 176; + this.ySize = 256; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 115, 34, 16); + assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 115, 34, 16); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); + + if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { + if(this.assembler.assemblerModule.recipe != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.recipe)) { + GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule.recipe); + this.func_146283_a(recipe.print(), mouseX, mouseY); + } else { + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + } + } + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, this); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.assembler.hasCustomInventoryName() ? this.assembler.getInventoryName() : I18n.format(this.assembler.getInventoryName()); + + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int p = (int) (assembler.power * 61 / assembler.maxPower); + drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); + + if(assembler.assemblerModule.progress > 0) { + int j = (int) Math.ceil(70 * assembler.assemblerModule.progress); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + } + + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + + /// LEFT LED + if(assembler.didProcess) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); + } + + /// RIGHT LED + if(assembler.didProcess) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null && assembler.power >= recipe.power) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); + } + + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); + + if(recipe != null && recipe.inputItem != null) { + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule.inputSlots[i]); + if(!slot.getHasStack()) this.renderItem(recipe.inputItem[i].extractForCyclingDisplay(20), slot.xDisplayPosition, slot.yDisplayPosition, 10F); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + this.zLevel = 300F; + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule.inputSlots[i]); + if(!slot.getHasStack()) drawTexturedModalRect(guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, slot.xDisplayPosition, slot.yDisplayPosition, 16, 16); + } + this.zLevel = 0F; + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } + + assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 34, 16, 1); + assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 34, 16, 1); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java new file mode 100644 index 000000000..c018e55c9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -0,0 +1,56 @@ +package com.hbm.inventory.recipes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import static com.hbm.inventory.OreDictManager.*; +import static com.hbm.inventory.material.Mats.*; + +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemFluidIcon; + +import net.minecraft.item.ItemStack; + +public class AssemblyMachineRecipes extends GenericRecipes { + + public static final AssemblyMachineRecipes INSTANCE = new AssemblyMachineRecipes(); + + @Override public int inputItemLimit() { return 12; } + @Override public int inputFluidLimit() { return 1; } + @Override public int outputItemLimit() { return 1; } + @Override public int outputFluidLimit() { return 1; } + + @Override public String getFileName() { return "hbmAsemblyMachine.json"; } + @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } + + @Override + public void registerDefaults() { + + this.register(new GenericRecipe("ass.test").setup(100, 1_000) + .inputItems(new OreDictStack(STEEL.ingot(), 5)) + .outputItems(new ItemStack(ModItems.plate_welded, 1, MAT_STEEL.id))); + } + + public static HashMap getRecipes() { + HashMap recipes = new HashMap(); + + for(GenericRecipe recipe : INSTANCE.recipeOrderedList) { + List input = new ArrayList(); + if(recipe.inputItem != null) for(AStack stack : recipe.inputItem) input.add(stack); + if(recipe.inputFluid != null) for(FluidStack stack : recipe.inputFluid) input.add(ItemFluidIcon.make(stack)); + List output = new ArrayList(); + if(recipe.outputItem != null) for(IOutput stack : recipe.outputItem) output.add(stack.getAllPossibilities()); + if(recipe.outputFluid != null) for(FluidStack stack : recipe.outputFluid) output.add(ItemFluidIcon.make(stack)); + recipes.put(input.toArray(), output.toArray()); + } + + return recipes; + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index fca1efb87..a98931abb 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -229,12 +229,11 @@ public class AnvilRecipes extends SerializableRecipe { int ukModifier = 1; constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { - new OreDictStack(KEY_CLEARGLASS, 4 * ukModifier), new OreDictStack(STEEL.ingot(), 8 * ukModifier), - new OreDictStack(CU.ingot(), 8 * ukModifier), + new OreDictStack(CU.plate(), 4 * ukModifier), new ComparableStack(ModItems.motor, 2 * ukModifier), new ComparableStack(ModItems.circuit, 4 * ukModifier, EnumCircuitType.VACUUM_TUBE.ordinal()) - }, new AnvilOutput(new ItemStack(ModBlocks.machine_assembler))).setTier(2)); + }, new AnvilOutput(new ItemStack(ModBlocks.machine_assembly_machine))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index ec30b16b3..f633298f1 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -83,6 +83,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new PedestalRecipes()); //GENERIC + recipeHandlers.add(AssemblyMachineRecipes.INSTANCE); recipeHandlers.add(ChemicalPlantRecipes.INSTANCE); recipeHandlers.add(new MatDistribution()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 128a8f8b4..1d934e87d 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -267,6 +267,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChimneyIndustrial.class, new RenderChimneyIndustrial()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineMiningLaser.class, new RenderLaserMiner()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssembler.class, new RenderAssembler()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemblyMachine.class, new RenderAssemblyMachine()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemfac.class, new RenderAssemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemplant.class, new RenderChemplant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalPlant.class, new RenderChemicalPlant()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 5ec3d90fc..a1fee2c2c 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -140,6 +140,7 @@ public class ResourceManager { public static final IModelCustom assembler_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_cog.obj")); public static final IModelCustom assembler_slider = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_slider.obj")); public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj")); + public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")); public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")); //Chemplant @@ -574,6 +575,7 @@ public class ResourceManager { public static final ResourceLocation assembler_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_cog_new.png"); public static final ResourceLocation assembler_slider_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_slider_new.png"); public static final ResourceLocation assembler_arm_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_arm_new.png"); + public static final ResourceLocation assembly_machine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_machine.png"); public static final ResourceLocation assemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assemfac.png"); //Chemplant diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java index 2188b306a..1823b540b 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -1,6 +1,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import api.hbm.energymk2.IEnergyHandlerMK2; @@ -18,7 +19,7 @@ public class ModuleMachineAssembler extends ModuleMachineBase { @Override public GenericRecipe getRecipe() { - return null; + return AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.recipe); } public ModuleMachineAssembler itemInput(int from) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = from + i; return this; } diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java new file mode 100644 index 000000000..6bb9a7f21 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -0,0 +1,157 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.main.MainRegistry; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; +import com.hbm.util.BobMathUtil; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements IItemRendererProvider { + + public static EntityItem dummy; + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glRotated(90, 0, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntityMachineAssemblyMachine assembler = (TileEntityMachineAssemblyMachine) tileEntity; + + bindTexture(ResourceManager.assembly_machine_tex); + ResourceManager.assembly_machine.renderPart("Base"); + if(assembler.frame) ResourceManager.assembly_machine.renderPart("Frame"); + + GL11.glPushMatrix(); + + double spin = BobMathUtil.interp(assembler.prevRing, assembler.ring, interp); + double[] arm1 = assembler.arms[0].getPositions(interp); + double[] arm2 = assembler.arms[1].getPositions(interp); + + // arm1 = arm2 = new double[] {60, -15, 15, -0.25}; // heart + + GL11.glRotated(spin, 0, 1, 0); + ResourceManager.assembly_machine.renderPart("Ring"); + + GL11.glPushMatrix(); { + GL11.glTranslated(0, 1.625, 0.9375); + GL11.glRotated(arm1[0], 1, 0, 0); + GL11.glTranslated(0, -1.625, -0.9375); + ResourceManager.assembly_machine.renderPart("ArmLower1"); + + GL11.glTranslated(0, 2.375, 0.9375); + GL11.glRotated(arm1[1], 1, 0, 0); + GL11.glTranslated(0, -2.375, -0.9375); + ResourceManager.assembly_machine.renderPart("ArmUpper1"); + + GL11.glTranslated(0, 2.375, 0.4375); + GL11.glRotated(arm1[2], 1, 0, 0); + GL11.glTranslated(0, -2.375, -0.4375); + ResourceManager.assembly_machine.renderPart("Head1"); + GL11.glTranslated(0, arm1[3], 0); + ResourceManager.assembly_machine.renderPart("Spike1"); + } GL11.glPopMatrix(); + + GL11.glPushMatrix(); { + GL11.glTranslated(0, 1.625, -0.9375); + GL11.glRotated(-arm2[0], 1, 0, 0); + GL11.glTranslated(0, -1.625, 0.9375); + ResourceManager.assembly_machine.renderPart("ArmLower2"); + + GL11.glTranslated(0, 2.375, -0.9375); + GL11.glRotated(-arm2[1], 1, 0, 0); + GL11.glTranslated(0, -2.375, 0.9375); + ResourceManager.assembly_machine.renderPart("ArmUpper2"); + + GL11.glTranslated(0, 2.375, -0.4375); + GL11.glRotated(-arm2[2], 1, 0, 0); + GL11.glTranslated(0, -2.375, 0.4375); + ResourceManager.assembly_machine.renderPart("Head2"); + GL11.glTranslated(0, arm2[3], 0); + ResourceManager.assembly_machine.renderPart("Spike2"); + } GL11.glPopMatrix(); + + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + if(recipe != null && MainRegistry.proxy.me().getDistanceSq(tileEntity.xCoord + 0.5, tileEntity.yCoord + 1, tileEntity.zCoord + 0.5) < 35 * 35) { + + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, 1.0625, 0); + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack stack = recipe.getIcon(); + + if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { + GL11.glRotated(-90, 1, 0, 0); + GL11.glTranslated(0, -0.25, 0); + } + + GL11.glScaled(1.25, 1.25, 1.25); + + if(dummy == null || dummy.worldObj != tileEntity.getWorldObj()) dummy = new EntityItem(tileEntity.getWorldObj(), 0, 0, 0, stack); + dummy.setEntityItemStack(stack); + dummy.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_assembly_machine); + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + + public void renderInventory() { + GL11.glTranslated(0, -2.75, 0); + GL11.glScaled(4.5, 4.5, 4.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotated(90, 0, 1, 0); + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.assembly_machine_tex); + ResourceManager.assembly_machine.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 20e51d5fc..ca3281bd1 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -340,6 +340,7 @@ public class TileMappings { put(TileEntityMachineCombustionEngine.class, "tileentity_combustion_engine"); put(TileEntityMachineAssembler.class, "tileentity_assembly_machine"); + put(TileEntityMachineAssemblyMachine.class, "tileentity_assemblymachine"); put(TileEntityMachineAssemfac.class, "tileentity_assemfac"); put(TileEntityMachineChemplant.class, "tileentity_chemical_plant"); put(TileEntityMachineChemicalPlant.class, "tileentity_chemicalplant"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java index 53b47d04b..1117d6674 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java @@ -31,6 +31,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase implements IUpgradeInfoProvider { public int recipe = -1; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index d0d58dfb4..bcf3172d1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -22,6 +22,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +@Deprecated public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 3a057c184..7007e54e5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -2,14 +2,15 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; +import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.UpgradeManagerNT; -import com.hbm.inventory.container.ContainerMachineChemicalPlant; +import com.hbm.inventory.container.ContainerMachineAssemblyMachine; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.gui.GUIMachineChemicalPlant; +import com.hbm.inventory.gui.GUIMachineAssemblyMachine; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -33,7 +34,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -51,6 +51,13 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl private AudioWrapper audio; public ModuleMachineAssembler assemblerModule; + + public AssemblerArm[] arms = new AssemblerArm[2]; + public double prevRing; + public double ring; + public double ringSpeed; + public double ringTarget; + public int ringDelay; public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); @@ -59,6 +66,8 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl this.inputTank = new FluidTank(Fluids.NONE, 32_000); this.outputTank = new FluidTank(Fluids.NONE, 32_000); + for(int i = 0; i < this.arms.length; i++) this.arms[i] = new AssemblerArm(); + this.assemblerModule = new ModuleMachineAssembler(0, this, slots) .itemInput(4).itemOutput(16) .fluidInput(inputTank).fluidOutput(outputTank); @@ -128,11 +137,50 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl audio = null; } } + + for(AssemblerArm arm : arms) { + arm.updateInterp(); + if(didProcess) { + arm.updateArm(); + } else{ + arm.returnToNullPos(); + } + } + + this.prevRing = this.ring; + + if(didProcess) { + if(this.ring != this.ringTarget) { + double ringDelta = Math.abs(this.ringTarget - this.ring); + if(ringDelta <= this.ringSpeed) this.ring = this.ringTarget; + if(this.ringTarget > this.ring) this.ring += this.ringSpeed; + if(this.ringTarget < this.ring) this.ring -= this.ringSpeed; + if(this.ringTarget == this.ring) { + if(ringTarget >= 360) { + this.ringTarget -= 360D; + this.ring -= 360D; + this.prevRing -= 360D; + } + if(ringTarget <= -360) { + this.ringTarget += 360D; + this.ring += 360D; + this.prevRing += 360D; + } + this.ringDelay = 20 + worldObj.rand.nextInt(21); + } + } else { + if(this.ringDelay > 0) this.ringDelay--; + if(this.ringDelay <= 0) { + this.ringTarget += (worldObj.rand.nextDouble() * 2 - 1) * 135; + this.ringSpeed = 10D + worldObj.rand.nextDouble() * 5D; + } + } + } } } @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.assembler", xCoord, yCoord, zCoord, 1F, 15F, 1.0F, 20); + return MainRegistry.proxy.getLoopedSound("hbm:block.chemicalPlant", xCoord, yCoord, zCoord, 1F, 15F, 1.0F, 20); } @Override public void onChunkUnload() { @@ -216,6 +264,11 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl return i == 16; } + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + } + @Override public long getPower() { return power; } @Override public void setPower(long power) { this.power = power; } @Override public long getMaxPower() { return maxPower; } @@ -283,4 +336,135 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl upgrades.put(UpgradeType.OVERDRIVE, 3); return upgrades; } + + public static class AssemblerArm { + + public double[] angles = new double[4]; + public double[] prevAngles = new double[4]; + public double[] targetAngles = new double[4]; + public double[] speed = new double[4]; + + Random rand = new Random(); + ArmActionState state = ArmActionState.ASSUME_POSITION; + int actionDelay = 0; + + public static enum ArmActionState { + ASSUME_POSITION, + EXTEND_STRIKER, + RETRACT_STRIKER + } + + public AssemblerArm() { + this.resetSpeed(); + } + + private void updateInterp() { + for(int i = 0; i < angles.length; i++) { + prevAngles[i] = angles[i]; + } + } + + private void returnToNullPos() { + for(int i = 0; i < 4; i++) this.targetAngles[i] = 0; + for(int i = 0; i < 3; i++) this.speed[i] = 3; + this.speed[3] = 0.25; + this.state = ArmActionState.RETRACT_STRIKER; + + this.move(); + } + + private void resetSpeed() { + speed[0] = 15; //Pivot + speed[1] = 15; //Arm + speed[2] = 15; //Piston + speed[3] = 0.5; //Striker + } + + public void updateArm() { + resetSpeed(); + + if(actionDelay > 0) { + actionDelay--; + return; + } + + switch(state) { + // Move. If done moving, set a delay and progress to EXTEND + case ASSUME_POSITION: + if(move()) { + actionDelay = 2; + state = ArmActionState.EXTEND_STRIKER; + targetAngles[3] = -0.75D; + } + break; + case EXTEND_STRIKER: + if(move()) { + state = ArmActionState.RETRACT_STRIKER; + targetAngles[3] = 0D; + } + break; + case RETRACT_STRIKER: + if(move()) { + actionDelay = 2 + rand.nextInt(5); + chooseNewArmPoistion(); + state = ArmActionState.ASSUME_POSITION; + } + break; + + } + } + + private double[][] pos = new double[][] { // possible positions for the arms + {45, -15, -5}, + {15, 15, -15}, + {25, 10, -15}, + {30, 0, -10}, + {70, -10, -25}, + }; // sure it's not truly random like with the old assemfac, but at least now the striker always hits the center and doesn't clip through the board + + public void chooseNewArmPoistion() { + int chosen = rand.nextInt(pos.length); + this.targetAngles[0] = pos[chosen][0]; + this.targetAngles[1] = pos[chosen][1]; + this.targetAngles[2] = pos[chosen][2]; + } + + private boolean move() { + boolean didMove = false; + + for(int i = 0; i < angles.length; i++) { + if(angles[i] == targetAngles[i]) + continue; + + didMove = true; + + double angle = angles[i]; + double target = targetAngles[i]; + double turn = speed[i]; + double delta = Math.abs(angle - target); + + if(delta <= turn) { + angles[i] = targetAngles[i]; + continue; + } + + if(angle < target) { + angles[i] += turn; + } else { + angles[i] -= turn; + } + } + + return !didMove; + } + + public double[] getPositions(float interp) { + return new double[] { + BobMathUtil.interp(this.prevAngles[0], this.angles[0], interp), + BobMathUtil.interp(this.prevAngles[1], this.angles[1], interp), + BobMathUtil.interp(this.prevAngles[2], this.angles[2], interp), + BobMathUtil.interp(this.prevAngles[3], this.angles[3], interp) + }; + } + } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png index 19221af066c73104c8d5226f6e1e33f50c46a3d1..dc9f7034bfa3723926a9e3a087278070caec4777 100644 GIT binary patch literal 3445 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 LjP>(Q6Yu{E9d9*S literal 3517 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 MPv%C22F}<10u Date: Tue, 8 Jul 2025 22:39:15 +0300 Subject: [PATCH 075/323] Extend RBMK crane reach forward Enables close-to-real-life reactor hall replicas, with the storage columns being located further in the reactor hall than the reactor itself --- .../com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 120efd4f5..dca789607 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -275,7 +275,7 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.centerY = y + RBMKDials.getColumnHeight(worldObj) + 1; this.centerZ = z; - this.spanF = 7; + this.spanF = 16; this.spanB = 7; this.spanL = 7; this.spanR = 7; From 097b2bb12c7742ff59d8e453eabc03d9b2f18ae3 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 00:22:59 +0300 Subject: [PATCH 076/323] Fix RBMK crane girder rendering with unequal spans --- .../render/tileentity/RenderCraneConsole.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index f25ef7f0e..8ebf386a9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -22,12 +22,14 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glDisable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_LIGHTING); + int teFacing = 0; switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: teFacing = 90; break; + case 4: teFacing = 180; break; + case 3: teFacing = 270; break; + case 5: teFacing = 0; break; } + GL11.glRotatef(teFacing, 0F, 1F, 0F); TileEntityCraneConsole console = (TileEntityCraneConsole) te; @@ -99,12 +101,7 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { double cranePosZ = (-te.zCoord + console.centerZ); GL11.glTranslated(cranePosX, cranePosY, cranePosZ); - switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; - } + GL11.glRotatef(teFacing, 0F, 1F, 0F); double posX = (console.lastPosFront + (console.posFront - console.lastPosFront) * interp); double posZ = (console.lastPosLeft + (console.posLeft - console.lastPosLeft) * interp); @@ -116,22 +113,22 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glPushMatrix(); int girderSpan = 0; GL11.glRotatef(-craneRotationOffset, 0F, 1F, 0F); - switch(craneRotationOffset) { + switch((craneRotationOffset + teFacing) % 360) { case 0: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX - console.spanL, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX + console.spanB, 0, 0); break; case 90: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ + console.spanB); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ - console.spanR); break; case 180: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX + console.spanR, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX - console.spanF, 0, 0); break; case 270: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ - console.spanF); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ + console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); From d8080835f854d8cbbc204d1449245859e2849ebf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 00:53:14 +0300 Subject: [PATCH 077/323] Detect room bounds when linking RBMK crane --- .../render/tileentity/RenderCraneConsole.java | 10 ++++---- .../machine/rbmk/TileEntityCraneConsole.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index 8ebf386a9..3cb8e1f35 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -116,26 +116,26 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { switch((craneRotationOffset + teFacing) % 360) { case 0: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX + console.spanB, 0, 0); + GL11.glTranslated(posX - console.spanB, 0, 0); break; case 90: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ - console.spanR); + GL11.glTranslated(0, 0, -posZ + console.spanR); break; case 180: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX - console.spanF, 0, 0); + GL11.glTranslated(posX + console.spanF, 0, 0); break; case 270: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ + console.spanL); + GL11.glTranslated(0, 0, -posZ - console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); for(int i = 0; i < girderSpan; i++) { ResourceManager.rbmk_crane.renderPart("Girder"); - GL11.glTranslated(1, 0, 0); + GL11.glTranslated(-1, 0, 0); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index dca789607..74ce6ec07 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -275,10 +275,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.centerY = y + RBMKDials.getColumnHeight(worldObj) + 1; this.centerZ = z; - this.spanF = 16; - this.spanB = 7; - this.spanL = 7; - this.spanR = 7; + int girderY = centerY + 6; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + this.spanF = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanR = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanB = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanL = this.findRoomExtent(x, girderY, z, dir, 0); this.height = 7; @@ -287,6 +293,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.markDirty(); } + private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int def) { + for (int i = 1; i < 32; i++) { + if (!worldObj.isAirBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i)) { + return i - 1; + } + } + + return def; + } + public void cycleCraneRotation() { this.craneRotationOffset = (this.craneRotationOffset + 90) % 360; } From 0e5e114b1267a0a7bf63b1eff046597191663fcd Mon Sep 17 00:00:00 2001 From: abel1502 Date: Tue, 8 Jul 2025 19:13:04 +0300 Subject: [PATCH 078/323] Stop QE sliding door model clipping --- src/main/java/com/hbm/tileentity/DoorDecl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index d28ae1e22..ee1c96bc0 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -586,7 +586,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) public void doOffsetTransform() { - GL11.glTranslated(0.4375, 0, 0.5); + GL11.glTranslated(0.40625, 0, 0.5); }; @Override @@ -598,12 +598,12 @@ public abstract class DoorDecl { public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { if(open) { if(z == 0) { - return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 0.125, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 0.125, 1, 1); } } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 1, 1, 1); } }; From 19fd4791705c945df04b41b6b8f7fbc9afa9c54d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 01:48:51 +0300 Subject: [PATCH 079/323] Fix stuff --- .../render/tileentity/RenderCraneConsole.java | 10 +++++----- .../machine/rbmk/TileEntityCraneConsole.java | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index 3cb8e1f35..87fc5309e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -113,22 +113,22 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glPushMatrix(); int girderSpan = 0; GL11.glRotatef(-craneRotationOffset, 0F, 1F, 0F); - switch((craneRotationOffset + teFacing) % 360) { + switch(craneRotationOffset) { case 0: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX - console.spanB, 0, 0); + GL11.glTranslated(posX + console.spanB, 0, 0); break; case 90: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ + console.spanR); + GL11.glTranslated(0, 0, -posZ - console.spanR); break; case 180: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX + console.spanF, 0, 0); + GL11.glTranslated(posX - console.spanF, 0, 0); break; case 270: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ - console.spanL); + GL11.glTranslated(0, 0, -posZ + console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 74ce6ec07..2c3b4ebb4 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -277,14 +277,14 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp int girderY = centerY + 6; - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - this.spanF = this.findRoomExtent(x, girderY, z, dir, 0); + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + this.spanF = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanR = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanR = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanB = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanB = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanL = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanL = this.findRoomExtent(x, girderY, z, dir, 16); this.height = 7; @@ -293,14 +293,14 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.markDirty(); } - private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int def) { - for (int i = 1; i < 32; i++) { + private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int max) { + for (int i = 1; i < max; i++) { if (!worldObj.isAirBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i)) { return i - 1; } } - return def; + return max; } public void cycleCraneRotation() { From dcdf5c4f27d92f50606d328145e7d7cb650d82e8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 9 Jul 2025 09:57:49 +0200 Subject: [PATCH 080/323] Revert "Merge pull request #2261 from 70000hp/the-lob-block" This reverts commit f24c244730c0ae9bf83437b5d2f0d062a5482e61, reversing changes made to 0cf9d88e36f0a7209a840419ce1f3cbf277e3a9a. --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 - .../hbm/blocks/generic/BlockWandSpawner.java | 343 ------------------ .../hbm/blocks/generic/DungeonSpawner.java | 191 ++++------ src/main/java/com/hbm/main/MainRegistry.java | 2 - .../java/com/hbm/main/ModEventHandler.java | 140 ++++++- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ---------- .../world/gen/util/DungeonSpawnerActions.java | 261 ------------- .../gen/util/DungeonSpawnerConditions.java | 96 ----- .../gen/util/DungeonSpawnerInteractions.java | 80 ---- src/main/resources/assets/hbm/lang/en_US.lang | 2 - .../hbm/textures/blocks/wand_spawner.png | Bin 730 -> 0 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 743 -> 0 bytes 13 files changed, 199 insertions(+), 1121 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java delete mode 100644 src/main/java/com/hbm/util/MobUtil.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java delete mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f69f85497..f6dcd2065 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,7 +1243,6 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; - public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2397,8 +2396,6 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); - wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); - } private static void registerBlock() { @@ -3545,7 +3542,6 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); - register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java deleted file mode 100644 index b6c042838..000000000 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ /dev/null @@ -1,343 +0,0 @@ -package com.hbm.blocks.generic; - -import api.hbm.block.IToolable; -import com.hbm.blocks.IBlockSideRotation; -import com.hbm.blocks.ILookOverlay; -import com.hbm.blocks.ITooltipProvider; -import com.hbm.blocks.ModBlocks; -import com.hbm.config.StructureConfig; -import com.hbm.interfaces.IBomb; -import com.hbm.interfaces.ICopiable; -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.TileEntityLoadedBase; -import com.hbm.util.BufferUtil; -import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.ArrayList; -import java.util.List; - -public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { - - @SideOnly(Side.CLIENT) protected IIcon iconTop; - - public BlockWandSpawner() { - super(Material.iron); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); - } - - @Override - public IIcon getIcon(int side, int meta) { - return (side <= 1) ? iconTop : blockIcon; - } - - @Override - public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { - if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); - if(side == 1) return world.getBlockMetadata(x, y, z); - return 0; - } - - @Override - public int getRenderType() { - return IBlockSideRotation.getRenderType(); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if (i == 0) world.setBlockMetadataWithNotify(x, y, z, 3, 2); - if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); - if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); - if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); - - ForgeDirection dir = ForgeDirection.UNKNOWN; - switch(i){ - case 0: dir = ForgeDirection.SOUTH;break; - case 1: dir = ForgeDirection.WEST; break; - case 2: dir = ForgeDirection.NORTH;break; - case 3: dir = ForgeDirection.EAST; break; - } - TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - - ItemStack stack = player.getHeldItem(); - - if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { - ItemBlock ib = (ItemBlock) stack.getItem(); - Block block = ib.field_150939_a; - - if (block.renderAsNormalBlock() && block != this) { - - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityWandSpawner){ - TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; - spawner.disguise = block; - spawner.disguiseMeta = stack.getItemDamage() & 15; - return true; - } - } - } - return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); - } - - @Override - public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return false; - - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - - switch(tool) { - case SCREWDRIVER: - List actionNames = DungeonSpawnerActions.getActionNames(); - int indexA = actionNames.indexOf(spawner.actionID); - - indexA += player.isSneaking() ? -1 : 1; - indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); - - spawner.actionID = actionNames.get(indexA); - return true; - case DEFUSER: - List conditionNames = DungeonSpawnerConditions.getConditionNames(); - int indexC = conditionNames.indexOf(spawner.conditionID); - - indexC += player.isSneaking() ? -1 : 1; - indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); - - spawner.conditionID = conditionNames.get(indexC); - - return true; - case HAND_DRILL: - List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); - int indexI = interactionNames.indexOf(spawner.interactionID); - - indexI += player.isSneaking() ? -1 : 1; - indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); - - spawner.interactionID = interactionNames.get(indexI); - - return true; - - default: return false; - } - } - - @Override - public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return; - - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - - List text = new ArrayList<>(); - text.add("Action: " + spawner.actionID); - text.add("Condition: " + spawner.conditionID); - text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); - - String block; - - if(spawner.disguise != null && spawner.disguise != Blocks.air) - block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); - else - block = "None"; - - text.add("Disguise Block: " + block); - - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); - list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); - list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); - } - - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityWandSpawner(); - } - - @Override - public BombReturnCode explode(World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return null; - - ((TileEntityWandSpawner) te).triggerReplace = true; - - return BombReturnCode.TRIGGERED; - } - - public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { - private boolean triggerReplace; - - public int placedRotation; - - Block disguise; - int disguiseMeta = -1; - - public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "EMPTY"; - public String interactionID; - - @Override - public void updateEntity() { - if(!worldObj.isRemote) { - if(triggerReplace) { - // On the first tick of this TE, replace with intended block and fill with loot - replace(); - } else { - networkPackNT(15); - } - } - } - - private void replace() { - if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { - MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); - return; - } - worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); - - TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); - - if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { - MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); - te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); - worldObj.setTileEntity(xCoord, yCoord, zCoord, te); - } - - if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ - DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; - spawner.actionID = actionID; - spawner.conditionID = conditionID; - spawner.interactionID = interactionID; - spawner.direction = ForgeDirection.getOrientation(placedRotation); - spawner.disguise = disguise; - spawner.disguiseMeta = disguiseMeta; - } - - } - - @Override - public void transformTE(World world, int coordBaseMode) { - triggerReplace = !StructureConfig.debugStructures; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - nbt.setString("interactionID", interactionID); - nbt.setInteger("rotation", placedRotation); - if(disguise != null){ - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - nbt.setInteger("disguiseMeta", disguiseMeta); - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - actionID = nbt.getString("actionID"); - conditionID = nbt.getString("conditionID"); - interactionID = nbt.getString("interactionID"); - placedRotation = nbt.getInteger("rotation"); - if(nbt.hasKey("disguise")){ - disguise = Block.getBlockFromName(nbt.getString("disguise")); - disguiseMeta = nbt.getInteger("disguiseMeta"); - } - } - - @Override - public void serialize(ByteBuf buf) { - buf.writeInt(placedRotation); - BufferUtil.writeString(buf, actionID); - BufferUtil.writeString(buf, conditionID); - BufferUtil.writeString(buf, interactionID); - buf.writeInt(Block.getIdFromBlock(disguise)); - buf.writeInt(disguiseMeta); - } - - @Override - public void deserialize(ByteBuf buf) { - placedRotation = buf.readInt(); - actionID = BufferUtil.readString(buf); - conditionID = BufferUtil.readString(buf); - interactionID = BufferUtil.readString(buf); - disguise = Block.getBlockById(buf.readInt()); - disguiseMeta = buf.readInt(); - } - - @Override - public NBTTagCompound getSettings(World world, int x, int y, int z) { - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - if(disguise != null){ - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - nbt.setInteger("disguiseMeta", disguiseMeta); - } - - return nbt; - } - - @Override - public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { - actionID = nbt.getString("actionID"); - conditionID = nbt.getString("conditionID"); - interactionID = nbt.getString("interactionID"); - if(nbt.hasKey("disguise")){ - disguise = Block.getBlockFromName(nbt.getString("disguise")); - disguiseMeta = nbt.getInteger("disguiseMeta"); - } - } - } -} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 52dbb6099..4a6fc10d8 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,32 +7,18 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.BufferUtil; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.util.EnumUtil; import com.hbm.util.Vec3NT; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,76 +30,19 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityDungeonSpawner){ - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; - if(spawner.disguise != null){ - return spawner.disguise.getIcon(side, spawner.disguiseMeta); - } - } - - return super.getIcon(world, x, y, z, side); - } - - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - TileEntity te = worldIn.getTileEntity(x, y, z); - if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { - ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); - return true; - } - - return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); - } - + public static class TileEntityDungeonSpawner extends TileEntity { - - //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; public int timer = 0; - - public Block disguise; - public int disguiseMeta; - - /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ - public String conditionID = "ABERRATOR"; - public String actionID = "ABERRATOR"; - /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ - public String interactionID; - - public Function condition; - public Consumer action; - /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ - public Consumer interaction; - - public EntityPlayer player; - - public ForgeDirection direction = ForgeDirection.UNKNOWN; + public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - if(action == null){ - action = DungeonSpawnerActions.actions.get(actionID); - } - if(condition == null){ - condition = DungeonSpawnerConditions.conditions.get(conditionID); - } - if(interaction == null && interactionID != null){ - interaction = DungeonSpawnerInteractions.interactions.get(interactionID); - } - - if(action == null || condition == null){ - worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); - return; - } - action.accept(this); - if(condition.apply(this)) { + type.phase.accept(this); + if(type.phaseCondition.apply(this)) { phase++; timer = 0; } else { @@ -126,47 +55,83 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - - nbt.setInteger("direction", direction.ordinal()); - if(disguise != null){ - nbt.setInteger("disguiseMeta", disguiseMeta); - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - } + nbt.setByte("type", (byte) type.ordinal()); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - - this.actionID = nbt.getString("actionID"); - this.conditionID = nbt.getString("conditionID"); - if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); - - this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); - - if(nbt.hasKey("disguise")){ - disguiseMeta = nbt.getInteger("disguiseMeta"); - disguise = Block.getBlockFromName(nbt.getString("disguise")); - } - } - - @Override - public Packet getDescriptionPacket() { - NBTTagCompound nbt = new NBTTagCompound(); - this.writeToNBT(nbt); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - this.readFromNBT(pkt.func_148857_g()); + this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); } } + + public static enum EnumSpawnerType { + + ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); + public Function phaseCondition; + public Consumer phase; + + private EnumSpawnerType(Function con, Consumer ph) { + this.phaseCondition = con; + this.phase = ph; + } + } + + public static Function CON_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1 || tile.phase == 2) { + if(tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for(int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for(int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if(mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if(tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if(te instanceof TileEntitySkeletonHolder) { + TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; + if(world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 199127431..0d64ee670 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,8 +877,6 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); - MobUtil.intializeMobPools(); - proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 655656174..cd368b165 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,18 +387,74 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - slotPools = MobUtil.slotPoolCommon; + + if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine + equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); + return; + } + + slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPools.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPools.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPools.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPools.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, + {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} + })); } else if(entity instanceof EntitySkeleton) { - slotPools = MobUtil.slotPoolRanged; + + slotPools.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPools.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPools.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPools.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - MobUtil.assignItemsToEntity(entity, slotPools, rand); + assignItemsToEntity(entity, slotPools); + } + + private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -417,30 +473,74 @@ public class ModEventHandler { return pool; } - private static ItemStack getSkelegun(float soot, Random rand) { - if (!MobConfig.enableMobWeapons) return null; - if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList<>(); + public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); - if(soot < 0.3){ - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); - pool.add(new WeightedRandomObject(null, 20)); - } else if(soot > 0.3 && soot < 1) { - pool.addAll(MobUtil.slotPoolGuns.get(0.3)); - } else if (soot < 3) { - pool.addAll(MobUtil.slotPoolGuns.get(1D)); - } else if (soot < 5) { - pool.addAll(MobUtil.slotPoolGuns.get(3D)); - } else { - pool.addAll(MobUtil.slotPoolGuns.get(5D)); + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } } + } + + private static ItemStack getSkelegun(float soot, Random rand) { + if(!MobConfig.enableMobWeapons) return null; + if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + + ArrayList pool = new ArrayList(); + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); + + if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); + if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); + + if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); + if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); + + if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } + // these fucking tasks keep stacking on top of themselves + private static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } + @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -449,7 +549,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - MobUtil.addFireTask(living); + addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f688059be..ca3281bd1 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,7 +19,6 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; -import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -237,7 +236,6 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); - put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -430,7 +428,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java deleted file mode 100644 index 8779c1ed2..000000000 --- a/src/main/java/com/hbm/util/MobUtil.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.hbm.util; - -import com.hbm.entity.mob.ai.EntityAIFireGun; -import com.hbm.items.ModItems; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAITasks; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.WeightedRandom; - -import java.util.*; - -public class MobUtil { - - - public static Map> slotPoolCommon = new HashMap<>(); - public static Map> slotPoolRanged = new HashMap<>(); - - public static Map> slotPoolAdv = new HashMap<>(); - public static Map> slotPoolAdvRanged; - /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ - public static HashMap> slotPoolGuns = new HashMap<>(); - - - public static void intializeMobPools(){ - slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, - {ModItems.wrench, 20} - })); - - slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - - slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ - {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} - })); - slotPoolGuns.put(1D, createSlotPool(new Object[][]{ - {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} - })); - slotPoolGuns.put(3D, createSlotPool(new Object[][]{ - {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} - })); - slotPoolGuns.put(5D, createSlotPool(new Object[][]{ - {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} - })); - - slotPoolAdv.put(4, createSlotPool(new Object[][]{ - {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, - {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, - {ModItems.hazmat_helmet, 6} - })); - slotPoolAdv.put(3, createSlotPool(new Object[][]{ - {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, - {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, - {ModItems.steel_plate, 8} - })); - slotPoolAdv.put(2, createSlotPool(new Object[][]{ - {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, - {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, - {ModItems.steel_legs, 8} - })); - slotPoolAdv.put(1, createSlotPool(new Object[][]{ - {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, - {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, - {ModItems.robes_boots, 8} - })); - slotPoolAdv.put(0, createSlotPool(new Object[][]{ - {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, - {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, - {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, - {ModItems.wrench, 20} - })); - - slotPoolAdvRanged = new HashMap<>(slotPoolAdv); - slotPoolAdvRanged.remove(0); - - } - - public static List createSlotPool(int nullWeight, Object[][] items) { - List pool = new ArrayList<>(); - pool.add(new WeightedRandomObject(null, nullWeight)); - for (Object[] item : items) { - Object obj = item[0]; - int weight = (int) item[1]; - - if (obj instanceof Item) { - pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); - } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell - pool.add(new WeightedRandomObject(obj, weight)); - } - } - return pool; - } - public static List createSlotPool(Object[][] items) { - List pool = new ArrayList<>(); - for (Object[] item : items) { - Object obj = item[0]; - int weight = (int) item[1]; - - if (obj instanceof Item) { - pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); - } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell - pool.add(new WeightedRandomObject(obj, weight)); - } - } - return pool; - } - - public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); - } - - public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - - // these fucking tasks keep stacking on top of themselves - public static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java deleted file mode 100644 index fee835c2e..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.BlockDummyable; -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockSkeletonHolder; -import com.hbm.blocks.generic.DungeonSpawner; -import com.hbm.entity.item.EntityFallingBlockNT; -import com.hbm.entity.missile.EntityMissileTier2; -import com.hbm.entity.mob.EntityUndeadSoldier; -import com.hbm.items.ItemEnums; -import com.hbm.items.ModItems; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; -import com.hbm.util.ContaminationUtil; -import com.hbm.util.MobUtil; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.init.Blocks; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.*; -import java.util.function.Consumer; - -public class DungeonSpawnerActions { - - public static LinkedHashMap> actions = new LinkedHashMap<>(); - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if (tile.phase == 1 || tile.phase == 2) { - if (tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for (int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if (mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if (tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { - BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; - if (world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; - - public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 0) return; - - //from explosionChaos because i cannot be assed - int r = 4; - int r2 = r * r; - int r22 = r2 / 2; - - for (int xx = -r; xx < r; xx++) { - int X = xx + x; - int XX = xx * xx; - for (int yy = -r; yy < r; yy++) { - int Y = yy + y; - int YY = XX + yy * yy; - for (int zz = -r; zz < r; zz++) { - int Z = zz + z; - int ZZ = YY + zz * zz; - if (ZZ < r22) { - - if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { - EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); - world.spawnEntityInWorld(entityfallingblock); - } - } - } - } - } - world.setBlock(x, y, z, ModBlocks.block_steel); - - }; - - public static Consumer FODDER_WAVE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if (tile.phase == 1) { - Vec3NT vec = new Vec3NT(5, 0, 0); - for (int i = 0; i < 10; i++) { - EntityZombie mob = new EntityZombie(world); - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - world.spawnEntityInWorld(mob); - - vec.rotateAroundYDeg(36D); - } - world.setBlock(x, y, z, ModBlocks.block_steel); - } - }; - - public static Consumer PUZZLE_TEST = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 2){ - world.setBlock(x,y,z, ModBlocks.crate_steel); - - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); - world.spawnEntityInWorld(blitz); - - TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); - ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); - } - }; - - public static Consumer MISSILE_STRIKE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase != 1) return; - - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); - - ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); - - EntityMissileTier2.EntityMissileStrong missile = - new EntityMissileTier2.EntityMissileStrong( - world, - x + tile.direction.offsetX * 300, - 200, - z + tile.direction.offsetZ * 300, - x + parallel.offsetX * 30 + tile.direction.offsetX * 30, - z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); - WorldUtil.loadAndSpawnEntityInWorld(missile); - - world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); - }; - - public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - ForgeDirection direction = tile.direction.getOpposite(); - ForgeDirection rot = direction.getRotation(ForgeDirection.UP); - - AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); - - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); - - for(EntityLivingBase e : entities) { - - Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); - double len = vec.lengthVector(); - vec = vec.normalize(); - - len = Math.max(len,1D); - - float res = 0; - - for(int i = 1; i < len; i++) { - - int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); - int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); - int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); - - res += world.getBlock(ix, iy, iz).getExplosionResistance(null); - } - - if(res < 1) - res = 1; - - float eRads = 100F; - eRads /= (float)res; - eRads /= (float)(len * len); - - ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); - } - - if (tile.phase == 2 && tile.timer > 40){ - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( - EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + - EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); - - for(int i = 1; i < 20; i++) { - int checkX, checkY, checkZ; - checkX = x + direction.offsetX * i; - checkY = y + 1; - checkZ = z + direction.offsetZ * i; - Block block = world.getBlock(checkX, checkY,checkZ); - TileEntity te = null; - if(block instanceof BlockDummyable){ - int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); - te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); - } - - if (te instanceof TileEntityDoorGeneric) { - TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; - door.setPins(456); - door.close(); - door.lock(); - break; - } - } - - tile.phase = 3; - } - }; - - public static List getActionNames(){ - return new ArrayList<>(actions.keySet()); - } - - //register new actions here - static{ - actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); - actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); - actions.put("FODDER_WAVE", FODDER_WAVE); - actions.put("PUZZLE_TEST", PUZZLE_TEST); - actions.put("MISSILE_STRIKE", MISSILE_STRIKE); - actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); - } - - - -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java deleted file mode 100644 index 83dd773e8..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; -import com.hbm.blocks.generic.DungeonSpawner; -import com.hbm.entity.mob.EntityUndeadSoldier; -import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.function.Function; - -public class DungeonSpawnerConditions { - - public static LinkedHashMap> conditions = new LinkedHashMap<>(); - - /**For use with interactions, for having them handle all conditional tasks*/ - public static Function EMPTY = (tile) -> false; - - public static Function ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Function PLAYER_CUBE_5 = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); - }; - - public static Function REDSTONE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - return world.isBlockIndirectlyGettingPowered(x,y,z); - }; - - public static Function PUZZLE_TEST = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); - world.setBlock(x,y + 1,z, ModBlocks.pedestal); - return true; - } - - TileEntity pedestal = world.getTileEntity(x,y + 1,z); - - return tile.phase == 1 - && pedestal instanceof BlockPedestal.TileEntityPedestal - && ((BlockPedestal.TileEntityPedestal) pedestal).item != null - && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; - }; - - public static List getConditionNames(){ - return new ArrayList<>(conditions.keySet()); - } - - //register new conditions here - static { - conditions.put("EMPTY", EMPTY); - conditions.put("ABERRATOR", ABERRATOR); - conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); - conditions.put("REDSTONE", REDSTONE); - conditions.put("PUZZLE_TEST", PUZZLE_TEST); - } - -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java deleted file mode 100644 index 32c19b81d..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; -import com.hbm.entity.missile.EntityMissileTier2; -import com.hbm.items.ModItems; -import com.hbm.potion.HbmPotion; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.function.Consumer; - -/**Interactions are called when the player right-clicks the block**/ -public class DungeonSpawnerInteractions { - - /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, - * in that order **/ - public static LinkedHashMap> interactions = new LinkedHashMap<>(); - - public static Consumer TEST = (array) -> { - World world = (World) array[0]; - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; - int x = (int) array[2]; - int y = (int) array[3]; - int z = (int) array[4]; - EntityPlayer player = (EntityPlayer) array[5]; - int side = (int) array[6]; - - if(spawner.phase > 1) return; - - if(player.getHeldItem() != null) - player.getHeldItem().stackSize--; - - spawner.phase++; - }; - - public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; - EntityPlayer player = (EntityPlayer) array[5]; - - if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ - player.getHeldItem().stackSize--; - player.addChatMessage(new ChatComponentText( - EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + - EnumChatFormatting.RESET + " Radiation treatment administered")); - player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); - player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); - spawner.phase = 2; - spawner.timer = 0; - } - }; - - - - public static List getInteractionNames(){ - return new ArrayList<>(interactions.keySet()); - } - - //register new interactions here - static{ - interactions.put("TEST", TEST); - interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); - } - - - -} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index dcb6d68b3..74c5a343b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,7 +5279,6 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain -tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -6062,7 +6061,6 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) -tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png deleted file mode 100644 index 4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png deleted file mode 100644 index 65e3106a96f970891be895a960ccfb53a60b3915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flMn;7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`VaCJ Date: Wed, 9 Jul 2025 16:56:42 +0200 Subject: [PATCH 081/323] scum construction machine --- changelog | 24 +++------ .../java/com/hbm/inventory/material/Mats.java | 2 +- .../inventory/recipes/AssemblerRecipes.java | 3 +- .../recipes/AssemblyMachineRecipes.java | 51 +++++++++++++++++-- src/main/java/com/hbm/items/ModItems.java | 3 -- src/main/java/com/hbm/main/MainRegistry.java | 1 + 6 files changed, 57 insertions(+), 27 deletions(-) diff --git a/changelog b/changelog index 666ddeaaa..d6b838a91 100644 --- a/changelog +++ b/changelog @@ -1,19 +1,7 @@ -## Changed -* The chemistry achievement now requires the new chemical plant -* The new chemical plant can now be used to upgrade the meteorite sword -* Fluid containers are now re-registered when using `/ntmreload` which should correctly generate fluid container items for freshly added custom fluids -* Recipe configs will no longer try to parse null value recipes, meaing that trailing commas in a recipe config will no longer create an error -* Refinery solid byproducts now build up substantially faster - * This means fracking solution from standard oil is now a lot more viable - * This also makes the volume of oil spent consistent with the NEI handler +## Added +* New assembler -## Fixed -* Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled -* Fixed NTM adding mob spawns to the mushroom island -* Fixed line break not working on the tip of the day -* Fixed an issue where AoE abilities can break bedrock -* Fixed chemical factory not saving its water and steam tanks -* Fixed siphon not working with some newer machines due to using legacy API -* Potentially fixed an incompatibility with Aether due to the loading screen replacement - * The loading screen replacement will only run up to 25 times per session, with a fixed delay of 5 seconds minimum - * The loading screen replacement can be disabled completely in the config \ No newline at end of file +## Changed +* Removed levitation unit + +## Fixed \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 6e810bbcc..5a03bf288 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -136,7 +136,7 @@ public class Mats { //Alloys public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); - public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, BLOCK).m(); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, DENSEWIRE, BLOCK).m(); public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT).m(); public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x82A59C, 0x06281E, 0x42665C).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index e1efbf9db..233f67933 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -79,7 +79,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.centrifuge_element, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1), }, 100); makeRecipe(new ComparableStack(ModItems.reactor_core, 1), new AStack[] {new OreDictStack(PB.ingot(), 8), new OreDictStack(BE.ingot(), 6), new OreDictStack(STEEL.plate(), 16), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(FIBER.ingot(), 2) },100); makeRecipe(new ComparableStack(ModItems.rtg_unit, 1), new AStack[] {new ComparableStack(ModItems.thermo_element, 2), new OreDictStack(CU.plateCast(), 1), new OreDictStack(PB.ingot(), 2), new OreDictStack(STEEL.plate(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CAPACITOR.ordinal()), },100); - makeRecipe(new ComparableStack(ModItems.levitation_unit, 1), new AStack[] {new ComparableStack(ModItems.coil_copper, 4), new ComparableStack(ModItems.coil_tungsten, 2), new OreDictStack(TI.plate(), 6), new ComparableStack(ModItems.nugget_schrabidium, 2), },100); makeRecipe(new ComparableStack(ModItems.drill_titanium, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(DURA.ingot(), 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(TI.plate(), 6), },100); makeRecipe(new ComparableStack(ModItems.entanglement_kit, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(DURA.ingot(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(Fluids.XENON.getDict(1_000))},200); makeRecipe(new ComparableStack(ModItems.dysfunctional_reactor, 1), new AStack[] {new OreDictStack(STEEL.plate(), 15), new OreDictStack(PB.ingot(), 5), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack("dyeBrown", 3), },200); @@ -168,7 +167,7 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.nuke_n2, 1), new AStack[] {new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack("dyeBlack", 8), },300); makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 8), },600, ModItems.journal_pip, ModItems.journal_bj); makeRecipe(new ComparableStack(ModBlocks.nuke_custom, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 4), },300); - makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireFine(), 6), },250); + makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index c018e55c9..1e741f6b7 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -7,7 +7,9 @@ import java.util.List; import static com.hbm.inventory.OreDictManager.*; import static com.hbm.inventory.material.Mats.*; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; +import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; @@ -15,7 +17,9 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; public class AssemblyMachineRecipes extends GenericRecipes { @@ -33,9 +37,50 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public void registerDefaults() { - this.register(new GenericRecipe("ass.test").setup(100, 1_000) - .inputItems(new OreDictStack(STEEL.ingot(), 5)) - .outputItems(new ItemStack(ModItems.plate_welded, 1, MAT_STEEL.id))); + // plates and ingots + this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) + .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); + this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) + .inputItems(new ComparableStack(ModBlocks.block_meteor, 1))); + + // cloth + this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) + .inputItems(new OreDictStack(PB.dust(), 4), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.firecloth").setup(50, 100).outputItems(new ItemStack(ModItems.asbestos_cloth, 4)) + .inputItems(new OreDictStack(ASBESTOS.ingot(), 1), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.filtercoal").setup(50, 100).outputItems(new ItemStack(ModItems.filter_coal, 1)) + .inputItems(new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1))); + + // machine parts + this.register(new GenericRecipe("ass.centrifugetower").setup(100, 100).outputItems(new ItemStack(ModItems.centrifuge_element, 1)) + .inputItems(new OreDictStack(DURA.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.reactorcore").setup(100, 100).outputItems(new ItemStack(ModItems.reactor_core, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 4), new OreDictStack(BE.ingot(), 8), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(ASBESTOS.ingot(), 4))); + this.register(new GenericRecipe("ass.thermoelement").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(MINGRADE.wireFine(), 2), new OreDictStack(NETHERQUARTZ.dust(), 2))); + this.register(new GenericRecipe("ass.thermoelementsilicon").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(GOLD.wireFine(), 2), new OreDictStack(SI.billet(), 1))); + this.register(new GenericRecipe("ass.rtgunit").setup(100, 100).outputItems(new ItemStack(ModItems.rtg_unit, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 2), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.thermo_element, 2))); + this.register(new GenericRecipe("ass.titaniumdrill").setup(100, 100).outputItems(new ItemStack(ModItems.drill_titanium, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 1), new OreDictStack(TI.plate(), 8))); + + // bunker blocks + this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); + this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) + .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); + this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // machines + this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 7387de265..b66b8f403 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -560,7 +560,6 @@ public class ModItems { public static Item centrifuge_element; public static Item reactor_core; public static Item rtg_unit; - public static Item levitation_unit; public static Item coil_advanced_alloy; public static Item coil_advanced_torus; @@ -2724,7 +2723,6 @@ public class ModItems { centrifuge_element = new Item().setUnlocalizedName("centrifuge_element").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":centrifuge_element"); reactor_core = new Item().setUnlocalizedName("reactor_core").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":reactor_core"); rtg_unit = new Item().setUnlocalizedName("rtg_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":rtg_unit"); - levitation_unit = new Item().setUnlocalizedName("levitation_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":levitation_unit"); coil_magnetized_tungsten = new Item().setUnlocalizedName("coil_magnetized_tungsten").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_magnetized_tungsten"); coil_gold = new Item().setUnlocalizedName("coil_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold"); coil_gold_torus = new Item().setUnlocalizedName("coil_gold_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold_torus"); @@ -5511,7 +5509,6 @@ public class ModItems { GameRegistry.registerItem(centrifuge_element, centrifuge_element.getUnlocalizedName()); GameRegistry.registerItem(reactor_core, reactor_core.getUnlocalizedName()); GameRegistry.registerItem(rtg_unit, rtg_unit.getUnlocalizedName()); - GameRegistry.registerItem(levitation_unit, levitation_unit.getUnlocalizedName()); GameRegistry.registerItem(pipes_steel, pipes_steel.getUnlocalizedName()); GameRegistry.registerItem(drill_titanium, drill_titanium.getUnlocalizedName()); GameRegistry.registerItem(photo_panel, photo_panel.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0d64ee670..4c8e7f954 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1701,6 +1701,7 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.hadron_cooler"); ignoreMappings.add("hbm:tile.machine_transformer_20"); ignoreMappings.add("hbm:tile.machine_transformer_dnt_20"); + ignoreMappings.add("hbm:item.levitation_unit"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); From 453c47c6f0037374e4ef25a034326e40178153ea Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 082/323] the gob block --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 + .../hbm/blocks/generic/BlockWandSpawner.java | 249 ++++++++++++++++++ .../hbm/blocks/generic/DungeonSpawner.java | 106 ++------ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ModEventHandler.java | 140 ++-------- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ++++++++++++++ .../world/gen/util/DungeonSpawnerActions.java | 165 ++++++++++++ .../gen/util/DungeonSpawnerConditions.java | 91 +++++++ src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/blocks/wand_spawner.png | Bin 0 -> 730 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 0 -> 740 bytes 12 files changed, 760 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java create mode 100644 src/main/java/com/hbm/util/MobUtil.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f6dcd2065..f69f85497 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,6 +1243,7 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; + public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2396,6 +2397,8 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); + wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + } private static void registerBlock() { @@ -3542,6 +3545,7 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); + register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java new file mode 100644 index 000000000..fdfca7689 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -0,0 +1,249 @@ +package com.hbm.blocks.generic; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +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.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandSpawner() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if (i == 0) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityWandSpawner) + ((TileEntityWandSpawner)te).placedRotation = i; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return false; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + switch(tool) { + case SCREWDRIVER: + List actionNames = DungeonSpawnerActions.getActionNames(); + int indexA = actionNames.indexOf(spawner.actionID); + + indexA += player.isSneaking() ? -1 : 1; + indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); + + spawner.actionID = actionNames.get(indexA); + return true; + case DEFUSER: + List conditionNames = DungeonSpawnerConditions.getConditionNames(); + int indexC = conditionNames.indexOf(spawner.conditionID); + + indexC += player.isSneaking() ? -1 : 1; + indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); + + spawner.conditionID = conditionNames.get(indexC); + + return true; + + default: return false; + } + } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + List text = new ArrayList(); + text.add("Action: " + spawner.actionID); + text.add("Condition: " + spawner.conditionID); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); + list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityWandSpawner(); + } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return null; + + ((TileEntityWandSpawner) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + + public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + private boolean triggerReplace; + + public int placedRotation; + + public String actionID = "PHASE_ABERRATOR"; + public String conditionID = "ABERRATOR"; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + return; + } + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { + MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + worldObj.setTileEntity(xCoord, yCoord, zCoord, te); + } + + if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ + DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; + spawner.actionID = actionID; + spawner.conditionID = conditionID; + } + + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + nbt.setInteger("rotation", placedRotation); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + placedRotation = nbt.getInteger("rotation"); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(placedRotation); + BufferUtil.writeString(buf, actionID); + BufferUtil.writeString(buf, conditionID); + } + + @Override + public void deserialize(ByteBuf buf) { + placedRotation = buf.readInt(); + actionID = BufferUtil.readString(buf); + conditionID = BufferUtil.readString(buf); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 4a6fc10d8..ffbb14239 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,7 +7,8 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.EnumUtil; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; import net.minecraft.block.BlockContainer; @@ -30,19 +31,35 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - + public static class TileEntityDungeonSpawner extends TileEntity { - + public int phase = 0; public int timer = 0; - public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; - + + public String conditionID = "ABERRATOR"; + //actions always get called before conditions, use the phase timer in order to control behavior via condition + public String actionID = "ABERRATOR"; + + public Function condition; + public Consumer action; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - type.phase.accept(this); - if(type.phaseCondition.apply(this)) { + if(action == null){ + action = DungeonSpawnerActions.actions.get(actionID); + } + if(condition == null){ + condition = DungeonSpawnerConditions.conditions.get(conditionID); + } + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { phase++; timer = 0; } else { @@ -55,83 +72,16 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setByte("type", (byte) type.ordinal()); + nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); + this.conditionID = nbt.getString("conditionID"); } } - - public static enum EnumSpawnerType { - - ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); - public Function phaseCondition; - public Consumer phase; - - private EnumSpawnerType(Function con, Consumer ph) { - this.phaseCondition = con; - this.phase = ph; - } - } - - public static Function CON_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 1 || tile.phase == 2) { - if(tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for(int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for(int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if(mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if(tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if(te instanceof TileEntitySkeletonHolder) { - TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; - if(world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4c8e7f954..0891e4012 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,6 +877,8 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); + MobUtil.intializeMobPools(); + proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index cd368b165..655656174 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,74 +387,18 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - - if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine - equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); - return; - } - - slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPools.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPools.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPools.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, - {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} - })); + slotPools = MobUtil.slotPoolCommon; } else if(entity instanceof EntitySkeleton) { - - slotPools.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPools.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPools.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - + slotPools = MobUtil.slotPoolRanged; ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - assignItemsToEntity(entity, slotPools); - } - - private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + MobUtil.assignItemsToEntity(entity, slotPools, rand); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -473,74 +417,30 @@ public class ModEventHandler { return pool; } - - public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - private static ItemStack getSkelegun(float soot, Random rand) { - if(!MobConfig.enableMobWeapons) return null; - if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + if (!MobConfig.enableMobWeapons) return null; + if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList(); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + ArrayList pool = new ArrayList<>(); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); - - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); - - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); - - if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); + if(soot < 0.3){ + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); + pool.add(new WeightedRandomObject(null, 20)); + } else if(soot > 0.3 && soot < 1) { + pool.addAll(MobUtil.slotPoolGuns.get(0.3)); + } else if (soot < 3) { + pool.addAll(MobUtil.slotPoolGuns.get(1D)); + } else if (soot < 5) { + pool.addAll(MobUtil.slotPoolGuns.get(3D)); + } else { + pool.addAll(MobUtil.slotPoolGuns.get(5D)); + } WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } - // these fucking tasks keep stacking on top of themselves - private static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } - @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -549,7 +449,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - addFireTask(living); + MobUtil.addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ca3281bd1..f688059be 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,6 +19,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -236,6 +237,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -428,7 +430,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java new file mode 100644 index 000000000..8779c1ed2 --- /dev/null +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -0,0 +1,197 @@ +package com.hbm.util; + +import com.hbm.entity.mob.ai.EntityAIFireGun; +import com.hbm.items.ModItems; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.*; + +public class MobUtil { + + + public static Map> slotPoolCommon = new HashMap<>(); + public static Map> slotPoolRanged = new HashMap<>(); + + public static Map> slotPoolAdv = new HashMap<>(); + public static Map> slotPoolAdvRanged; + /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ + public static HashMap> slotPoolGuns = new HashMap<>(); + + + public static void intializeMobPools(){ + slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, + {ModItems.wrench, 20} + })); + + slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + + slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + })); + slotPoolGuns.put(1D, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} + })); + slotPoolGuns.put(3D, createSlotPool(new Object[][]{ + {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} + })); + slotPoolGuns.put(5D, createSlotPool(new Object[][]{ + {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} + })); + + slotPoolAdv.put(4, createSlotPool(new Object[][]{ + {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, + {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, + {ModItems.hazmat_helmet, 6} + })); + slotPoolAdv.put(3, createSlotPool(new Object[][]{ + {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, + {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, + {ModItems.steel_plate, 8} + })); + slotPoolAdv.put(2, createSlotPool(new Object[][]{ + {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, + {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, + {ModItems.steel_legs, 8} + })); + slotPoolAdv.put(1, createSlotPool(new Object[][]{ + {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, + {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, + {ModItems.robes_boots, 8} + })); + slotPoolAdv.put(0, createSlotPool(new Object[][]{ + {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, + {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, + {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, + {ModItems.wrench, 20} + })); + + slotPoolAdvRanged = new HashMap<>(slotPoolAdv); + slotPoolAdvRanged.remove(0); + + } + + public static List createSlotPool(int nullWeight, Object[][] items) { + List pool = new ArrayList<>(); + pool.add(new WeightedRandomObject(null, nullWeight)); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + public static List createSlotPool(Object[][] items) { + List pool = new ArrayList<>(); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + + public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + } + + public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); + + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } + } + } + + // these fucking tasks keep stacking on top of themselves + public static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java new file mode 100644 index 000000000..120ea00e8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -0,0 +1,165 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.BlockSkeletonHolder; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ItemEnums; +import com.hbm.items.ModItems; +import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.MobUtil; +import com.hbm.util.Vec3NT; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.function.Consumer; + +public class DungeonSpawnerActions { + + public static HashMap> actions = new HashMap<>(); + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1 || tile.phase == 2) { + if (tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for (int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if (mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if (tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; + + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) return; + + //from explosionChaos because i cannot be assed + int r = 4; + int r2 = r * r; + int r22 = r2 / 2; + + for (int xx = -r; xx < r; xx++) { + int X = xx + x; + int XX = xx * xx; + for (int yy = -r; yy < r; yy++) { + int Y = yy + y; + int YY = XX + yy * yy; + for (int zz = -r; zz < r; zz++) { + int Z = zz + z; + int ZZ = YY + zz * zz; + if (ZZ < r22) { + + if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { + EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); + world.spawnEntityInWorld(entityfallingblock); + } + } + } + } + } + world.setBlock(x, y, z, ModBlocks.block_steel); + + }; + + public static Consumer FODDER_WAVE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1) { + Vec3NT vec = new Vec3NT(5, 0, 0); + for (int i = 0; i < 10; i++) { + EntityZombie mob = new EntityZombie(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + if (mob.getCanSpawnHere()) { + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); + } + world.setBlock(x, y, z, ModBlocks.block_steel); + } + }; + + public static Consumer PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 2){ + world.setBlock(x,y,z, ModBlocks.crate_steel); + + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + world.spawnEntityInWorld(blitz); + + TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); + ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); + } + }; + + public static List getActionNames(){ + return new ArrayList<>(actions.keySet()); + } + + //register new actions here + static{ + actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("PUZZLE_TEST", PUZZLE_TEST); + } + + + +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java new file mode 100644 index 000000000..0a634c271 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -0,0 +1,91 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; + +public class DungeonSpawnerConditions { + + public static HashMap> conditions = new HashMap<>(); + + public static Function ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Function PLAYER_CUBE_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); + }; + + public static Function REDSTONE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + return world.isBlockIndirectlyGettingPowered(x,y,z); + }; + + public static Function PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); + world.setBlock(x,y + 1,z, ModBlocks.pedestal); + return true; + } + + TileEntity pedestal = world.getTileEntity(x,y + 1,z); + + return tile.phase == 1 + && pedestal instanceof BlockPedestal.TileEntityPedestal + && ((BlockPedestal.TileEntityPedestal) pedestal).item != null + && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; + }; + + public static List getConditionNames(){ + return new ArrayList<>(conditions.keySet()); + } + + //register new conditions here + static { + conditions.put("ABERRATOR", ABERRATOR); + conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); + conditions.put("REDSTONE", REDSTONE); + conditions.put("PUZZLE_TEST", PUZZLE_TEST); + } + +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 74c5a343b..0a90eddf7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6061,6 +6061,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4788b84883581058c6fdf5525b3239d0e888f352 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flPBx7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`Va7jCRdIWMFVqh|G_VDx+T*Ri*utcI?R3P2J0O%k? Wj>Vsvd|H4;FnGH9xvX Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 083/323] the gob block From 274995ebd6ec87b23b4e8939baf70013f954cd80 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 084/323] copy tool support and working directional offsets --- .../hbm/blocks/generic/BlockWandSpawner.java | 11 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 4 +++ .../world/gen/util/DungeonSpawnerActions.java | 33 +++++++++++++++++- .../hbm/textures/blocks/wand_spawner_top.png | Bin 740 -> 743 bytes 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index fdfca7689..0508002d7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -33,6 +33,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; @@ -78,9 +79,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + ForgeDirection dir = ForgeDirection.UNKNOWN; + switch(i){ + case 0: dir = ForgeDirection.SOUTH;break; + case 1: dir = ForgeDirection.WEST; break; + case 2: dir = ForgeDirection.NORTH;break; + case 3: dir = ForgeDirection.EAST; break; + } TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = i; + ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } @Override @@ -193,6 +201,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.direction = ForgeDirection.getOrientation(placedRotation); } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index ffbb14239..41fa907b5 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -20,6 +20,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,6 +45,7 @@ public class DungeonSpawner extends BlockContainer { public Function condition; public Consumer action; + public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override public void updateEntity() { @@ -74,6 +76,7 @@ public class DungeonSpawner extends BlockContainer { nbt.setInteger("phase", phase); nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); + nbt.setInteger("direction", direction.ordinal()); } @Override @@ -81,6 +84,7 @@ public class DungeonSpawner extends BlockContainer { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 120ea00e8..1e32d9dc7 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -5,6 +5,7 @@ import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; @@ -12,6 +13,7 @@ import com.hbm.main.ModEventHandler; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -21,7 +23,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.HashMap; @@ -140,7 +145,7 @@ public class DungeonSpawnerActions { if(tile.phase == 2){ world.setBlock(x,y,z, ModBlocks.crate_steel); - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); world.spawnEntityInWorld(blitz); TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); @@ -148,6 +153,31 @@ public class DungeonSpawnerActions { } }; + public static Consumer MISSILE_STRIKE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase != 1) return; + + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); + + ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); + + EntityMissileTier2.EntityMissileStrong missile = + new EntityMissileTier2.EntityMissileStrong( + world, + x + tile.direction.offsetX * 300, + 200, + z + tile.direction.offsetZ * 300, + x + parallel.offsetX * 30 + tile.direction.offsetX * 30, + z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); + WorldUtil.loadAndSpawnEntityInWorld(missile); + + world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -158,6 +188,7 @@ public class DungeonSpawnerActions { actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); + actions.put("MISSILE_STRIKE", MISSILE_STRIKE); } diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png index 4788b84883581058c6fdf5525b3239d0e888f352..65e3106a96f970891be895a960ccfb53a60b3915 100644 GIT binary patch delta 87 zcmaFD`kZyc3?_doPZ!4!iOb0e2?8uk3P&|K*q9Fw delta 84 zcmaFP`h<1E3??6QPZ!4!iOb0e2?8uk3P&|K*q9bP0l+XkK_SqL` From acb01b13e00b00f83477a118baaf2bbcb95fc0ea Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 085/323] copy tool support and working directional offsets From 714a5298a976fa26ef4708d950c966a6a16c2e04 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 086/323] disguises for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 65 ++++++++++++++++++- .../hbm/blocks/generic/DungeonSpawner.java | 51 +++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 0508002d7..6d4a6f8a3 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,14 +16,18 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -91,6 +95,30 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityWandSpawner){ + TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; + spawner.disguise = block; + spawner.disguiseMeta = stack.getItemDamage() & 15; + return true; + } + } + } + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); @@ -132,10 +160,17 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - List text = new ArrayList(); + List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + String block; + if(spawner.disguise != null && spawner.disguise != Blocks.air) + block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + else + block = "None"; + + text.add("Disguise Block: " + block); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -167,9 +202,14 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public int placedRotation; + Block disguise; + int disguiseMeta = -1; + public String actionID = "PHASE_ABERRATOR"; public String conditionID = "ABERRATOR"; + public boolean noDisguise; + @Override public void updateEntity() { if(!worldObj.isRemote) { @@ -202,6 +242,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.actionID = actionID; spawner.conditionID = conditionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); + spawner.disguise = disguise; + spawner.disguiseMeta = disguiseMeta; } } @@ -217,6 +259,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); nbt.setInteger("rotation", placedRotation); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } } @Override @@ -225,6 +271,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); placedRotation = nbt.getInteger("rotation"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } @Override @@ -232,6 +282,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + buf.writeInt(Block.getIdFromBlock(disguise)); + buf.writeInt(disguiseMeta); } @Override @@ -239,6 +291,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + disguise = Block.getBlockById(buf.readInt()); + disguiseMeta = buf.readInt(); } @Override @@ -246,6 +300,11 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(disguise != null){ + nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + return nbt; } @@ -253,6 +312,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 41fa907b5..bba6ebfe7 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,18 +7,29 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; +import com.hbm.util.BufferUtil; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,11 +44,31 @@ public class DungeonSpawner extends BlockContainer { return new TileEntityDungeonSpawner(); } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityDungeonSpawner){ + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; + if(spawner.disguise != null){ + return spawner.disguise.getIcon(side, spawner.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + + public static class TileEntityDungeonSpawner extends TileEntity { public int phase = 0; public int timer = 0; + public Block disguise; + public int disguiseMeta; + public String conditionID = "ABERRATOR"; //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; @@ -77,6 +108,10 @@ public class DungeonSpawner extends BlockContainer { nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } } @Override @@ -85,6 +120,22 @@ public class DungeonSpawner extends BlockContainer { this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); } } From 3d77afab1f950d64dca34eff12650311a5defc21 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 087/323] disguises for the logic block From 21efc6b61cc1c2f79765020a831bb39553094ff8 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 088/323] Interactions for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 32 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 34 +++++- .../world/gen/util/DungeonSpawnerActions.java | 105 ++++++++++++++---- .../gen/util/DungeonSpawnerConditions.java | 7 +- .../gen/util/DungeonSpawnerInteractions.java | 80 +++++++++++++ 5 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 6d4a6f8a3..b6c042838 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,6 +16,7 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -146,6 +147,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.conditionID = conditionNames.get(indexC); + return true; + case HAND_DRILL: + List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(spawner.interactionID); + + indexI += player.isSneaking() ? -1 : 1; + indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); + + spawner.interactionID = interactionNames.get(indexI); + return true; default: return false; @@ -163,6 +174,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + String block; if(spawner.disguise != null && spawner.disguise != Blocks.air) @@ -171,6 +184,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT block = "None"; text.add("Disguise Block: " + block); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -178,7 +192,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); + list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); } @Override @@ -206,9 +221,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT int disguiseMeta = -1; public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "ABERRATOR"; - - public boolean noDisguise; + public String conditionID = "EMPTY"; + public String interactionID; @Override public void updateEntity() { @@ -241,6 +255,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.interactionID = interactionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); spawner.disguise = disguise; spawner.disguiseMeta = disguiseMeta; @@ -258,6 +273,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.writeToNBT(nbt); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + nbt.setString("interactionID", interactionID); nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); @@ -270,6 +286,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.readFromNBT(nbt); actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); placedRotation = nbt.getInteger("rotation"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); @@ -282,6 +299,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + BufferUtil.writeString(buf, interactionID); buf.writeInt(Block.getIdFromBlock(disguise)); buf.writeInt(disguiseMeta); } @@ -291,6 +309,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + interactionID = BufferUtil.readString(buf); disguise = Block.getBlockById(buf.readInt()); disguiseMeta = buf.readInt(); } @@ -300,8 +319,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); if(disguise != null){ - nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); nbt.setInteger("disguiseMeta", disguiseMeta); } @@ -312,6 +333,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); disguiseMeta = nbt.getInteger("disguiseMeta"); diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index bba6ebfe7..52dbb6099 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -12,6 +12,7 @@ import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -59,22 +60,38 @@ public class DungeonSpawner extends BlockContainer { return super.getIcon(world, x, y, z, side); } + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { + ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } public static class TileEntityDungeonSpawner extends TileEntity { + //phase is incremented per condition check, timer counts since last condition check by default public int phase = 0; public int timer = 0; public Block disguise; public int disguiseMeta; + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ public String conditionID = "ABERRATOR"; - //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; public Function condition; public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override @@ -87,6 +104,10 @@ public class DungeonSpawner extends BlockContainer { if(condition == null){ condition = DungeonSpawnerConditions.conditions.get(conditionID); } + if(interaction == null && interactionID != null){ + interaction = DungeonSpawnerInteractions.interactions.get(interactionID); + } + if(action == null || condition == null){ worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); return; @@ -105,8 +126,12 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + nbt.setInteger("direction", direction.ordinal()); if(disguise != null){ nbt.setInteger("disguiseMeta", disguiseMeta); @@ -118,8 +143,13 @@ public class DungeonSpawner extends BlockContainer { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ disguiseMeta = nbt.getInteger("disguiseMeta"); disguise = Block.getBlockFromName(nbt.getString("disguise")); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 1e32d9dc7..fee835c2e 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -1,7 +1,7 @@ package com.hbm.world.gen.util; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; @@ -9,34 +9,30 @@ import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; -import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.ContaminationUtil; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.function.Consumer; public class DungeonSpawnerActions { - public static HashMap> actions = new HashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -122,14 +118,10 @@ public class DungeonSpawnerActions { Vec3NT vec = new Vec3NT(5, 0, 0); for (int i = 0; i < 10; i++) { EntityZombie mob = new EntityZombie(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - if (mob.getCanSpawnHere()) { - world.spawnEntityInWorld(mob); - break; - } - } + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + world.spawnEntityInWorld(mob); + vec.rotateAroundYDeg(36D); } world.setBlock(x, y, z, ModBlocks.block_steel); @@ -178,6 +170,78 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + ForgeDirection direction = tile.direction.getOpposite(); + ForgeDirection rot = direction.getRotation(ForgeDirection.UP); + + AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); + + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); + + for(EntityLivingBase e : entities) { + + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); + double len = vec.lengthVector(); + vec = vec.normalize(); + + len = Math.max(len,1D); + + float res = 0; + + for(int i = 1; i < len; i++) { + + int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); + int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); + int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); + + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); + } + + if(res < 1) + res = 1; + + float eRads = 100F; + eRads /= (float)res; + eRads /= (float)(len * len); + + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); + } + + if (tile.phase == 2 && tile.timer > 40){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); + + for(int i = 1; i < 20; i++) { + int checkX, checkY, checkZ; + checkX = x + direction.offsetX * i; + checkY = y + 1; + checkZ = z + direction.offsetZ * i; + Block block = world.getBlock(checkX, checkY,checkZ); + TileEntity te = null; + if(block instanceof BlockDummyable){ + int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); + te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); + } + + if (te instanceof TileEntityDoorGeneric) { + TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; + door.setPins(456); + door.close(); + door.lock(); + break; + } + } + + tile.phase = 3; + } + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -189,6 +253,7 @@ public class DungeonSpawnerActions { actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); + actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 0a634c271..83dd773e8 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -15,12 +15,16 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; public class DungeonSpawnerConditions { - public static HashMap> conditions = new HashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); + + /**For use with interactions, for having them handle all conditional tasks*/ + public static Function EMPTY = (tile) -> false; public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -82,6 +86,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); conditions.put("REDSTONE", REDSTONE); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java new file mode 100644 index 000000000..32c19b81d --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java @@ -0,0 +1,80 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.items.ModItems; +import com.hbm.potion.HbmPotion; +import com.hbm.tileentity.TileEntityDoorGeneric; +import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/**Interactions are called when the player right-clicks the block**/ +public class DungeonSpawnerInteractions { + + /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, + * in that order **/ + public static LinkedHashMap> interactions = new LinkedHashMap<>(); + + public static Consumer TEST = (array) -> { + World world = (World) array[0]; + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + int x = (int) array[2]; + int y = (int) array[3]; + int z = (int) array[4]; + EntityPlayer player = (EntityPlayer) array[5]; + int side = (int) array[6]; + + if(spawner.phase > 1) return; + + if(player.getHeldItem() != null) + player.getHeldItem().stackSize--; + + spawner.phase++; + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ + player.getHeldItem().stackSize--; + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Radiation treatment administered")); + player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); + player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); + spawner.phase = 2; + spawner.timer = 0; + } + }; + + + + public static List getInteractionNames(){ + return new ArrayList<>(interactions.keySet()); + } + + //register new interactions here + static{ + interactions.put("TEST", TEST); + interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); + } + + + +} From 541c6a1c997d51a9cd5f9f4c94f8b207c1283ce3 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 089/323] Interactions for the logic block --- src/main/resources/assets/hbm/lang/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 0a90eddf7..dcb6d68b3 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,6 +5279,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain +tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port From 603cc10696deb39faf0c580a850cd400eb34d108 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 090/323] Interactions for the logic block From c33b962043c533925012d20ef69ec6bc806c301b Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:04:32 -0400 Subject: [PATCH 091/323] misc fix --- .../com/hbm/entity/mob/EntityUndeadSoldier.java | 14 ++++++++++---- .../hbm/world/gen/util/DungeonSpawnerActions.java | 12 +++++++++--- .../world/gen/util/DungeonSpawnerConditions.java | 6 ++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java index 1a18c36c7..f2b042085 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -16,10 +16,11 @@ import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; public class EntityUndeadSoldier extends EntityMob { - + public static final int DW_TYPE = 12; public static final byte TYPE_ZOMBIE = 0; public static final byte TYPE_SKELETON = 1; @@ -66,7 +67,7 @@ public class EntityUndeadSoldier extends EntityMob { this.setCurrentItemOrArmor(3, new ItemStack(ModItems.taurun_plate)); this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); - + int gun = rand.nextInt(5); if(gun == 0) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); if(gun == 1) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_light_revolver)); @@ -74,7 +75,7 @@ public class EntityUndeadSoldier extends EntityMob { if(gun == 3) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_maresleg)); if(gun == 4) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_greasegun)); } - + @Override protected String getLivingSound() { byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); @@ -110,7 +111,12 @@ public class EntityUndeadSoldier extends EntityMob { public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEAD; } - + + @Override + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); + } + @Override protected void dropFewItems(boolean player, int loot) { } @Override protected void dropEquipment(boolean player, int loot) { } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index fee835c2e..252bc543b 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -40,19 +40,25 @@ public class DungeonSpawnerActions { int y = tile.yCoord; int z = tile.zCoord; if (tile.phase == 1 || tile.phase == 2) { + tile.player = world.getClosestPlayer(x,y,z, 25); if (tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); + Vec3NT vec = new Vec3NT(20, 0, 0); for (int i = 0; i < 10; i++) { + + if(vec.xCoord > 8) vec.xCoord += world.rand.nextInt(10) - 5; + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue((int) (x + 0.5 + vec.xCoord),(int) (z + 0.5 + vec.zCoord)), z + 0.5 + vec.zCoord, i * 36F, 0); if (mob.getCanSpawnHere()) { mob.onSpawnWithEgg(null); + if(tile.player != null){ + mob.setTarget(tile.player); + } world.spawnEntityInWorld(mob); break; } } - vec.rotateAroundYDeg(36D); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 83dd773e8..1e0cc9d5a 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -32,13 +32,15 @@ public class DungeonSpawnerConditions { int x = tile.xCoord; int y = tile.yCoord; int z = tile.zCoord; + + boolean aoeCheck = !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(10, 10, 10)).isEmpty(); if(tile.phase == 0) { if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + return aoeCheck; } if(tile.phase < 3) { if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty() && aoeCheck; } return false; }; From e7ebc7dd07846f847f18d40937218fce9c8d0d67 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:03:48 -0400 Subject: [PATCH 092/323] thunder fire all your generation --- src/main/java/com/hbm/blocks/ModBlocks.java | 14 +- ...ckWandSpawner.java => BlockWandLogic.java} | 100 ++++----- .../hbm/blocks/generic/DungeonSpawner.java | 191 +++++++----------- .../com/hbm/blocks/generic/LogicBlock.java | 162 +++++++++++++++ .../hbm/tileentity/TileEntityDoorGeneric.java | 13 +- .../java/com/hbm/tileentity/TileMappings.java | 6 +- ...nerActions.java => LogicBlockActions.java} | 22 +- ...ditions.java => LogicBlockConditions.java} | 18 +- ...tions.java => LogicBlockInteractions.java} | 26 +-- src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/textures/blocks/logic_block.png | Bin 0 -> 910 bytes .../{wand_spawner.png => wand_logic.png} | Bin ...and_spawner_top.png => wand_logic_top.png} | Bin 13 files changed, 347 insertions(+), 209 deletions(-) rename src/main/java/com/hbm/blocks/generic/{BlockWandSpawner.java => BlockWandLogic.java} (74%) create mode 100644 src/main/java/com/hbm/blocks/generic/LogicBlock.java rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerActions.java => LogicBlockActions.java} (91%) rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerConditions.java => LogicBlockConditions.java} (79%) rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerInteractions.java => LogicBlockInteractions.java} (73%) create mode 100644 src/main/resources/assets/hbm/textures/blocks/logic_block.png rename src/main/resources/assets/hbm/textures/blocks/{wand_spawner.png => wand_logic.png} (100%) rename src/main/resources/assets/hbm/textures/blocks/{wand_spawner_top.png => wand_logic_top.png} (100%) diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f69f85497..5f3de7f83 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,7 +1243,9 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; - public static Block wand_spawner; + public static Block wand_logic; + + public static Block logic_block; public static Material materialGas = new MaterialGas(); @@ -1978,7 +1980,7 @@ public class ModBlocks { ladder_cobalt = new BlockNTMLadder().setBlockName("ladder_cobalt").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_cobalt"); ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); - + trapdoor_steel = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_steel").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_steel"); barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); @@ -2397,7 +2399,9 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); - wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + wand_logic = new BlockWandLogic().setBlockName("wand_logic").setBlockTextureName(RefStrings.MODID + ":wand_logic"); + + logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); } @@ -3545,7 +3549,9 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); - register(wand_spawner); + register(wand_logic); + + register(logic_block); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java similarity index 74% rename from src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java rename to src/main/java/com/hbm/blocks/generic/BlockWandLogic.java index b6c042838..01d8df298 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -13,10 +13,10 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.util.LogicBlockActions; import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -43,19 +43,19 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { +public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { @SideOnly(Side.CLIENT) protected IIcon iconTop; - public BlockWandSpawner() { + public BlockWandLogic() { super(Material.iron); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic_top"); } @Override @@ -92,8 +92,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT case 3: dir = ForgeDirection.EAST; break; } TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); + if(te instanceof TileEntityWandLogic) + ((TileEntityWandLogic)te).placedRotation = dir.ordinal(); } @Override @@ -109,10 +109,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntity tile = world.getTileEntity(x, y, z); - if(tile instanceof TileEntityWandSpawner){ - TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; - spawner.disguise = block; - spawner.disguiseMeta = stack.getItemDamage() & 15; + if(tile instanceof TileEntityWandLogic){ + TileEntityWandLogic logic = (TileEntityWandLogic) tile; + logic.disguise = block; + logic.disguiseMeta = stack.getItemDamage() & 15; return true; } } @@ -124,38 +124,38 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return false; + if(!(te instanceof TileEntityWandLogic)) return false; - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + TileEntityWandLogic logic = (TileEntityWandLogic) te; switch(tool) { case SCREWDRIVER: - List actionNames = DungeonSpawnerActions.getActionNames(); - int indexA = actionNames.indexOf(spawner.actionID); + List actionNames = LogicBlockActions.getActionNames(); + int indexA = actionNames.indexOf(logic.actionID); indexA += player.isSneaking() ? -1 : 1; indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); - spawner.actionID = actionNames.get(indexA); + logic.actionID = actionNames.get(indexA); return true; case DEFUSER: - List conditionNames = DungeonSpawnerConditions.getConditionNames(); - int indexC = conditionNames.indexOf(spawner.conditionID); + List conditionNames = LogicBlockConditions.getConditionNames(); + int indexC = conditionNames.indexOf(logic.conditionID); indexC += player.isSneaking() ? -1 : 1; indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); - spawner.conditionID = conditionNames.get(indexC); + logic.conditionID = conditionNames.get(indexC); return true; case HAND_DRILL: - List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); - int indexI = interactionNames.indexOf(spawner.interactionID); + List interactionNames = LogicBlockInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(logic.interactionID); indexI += player.isSneaking() ? -1 : 1; indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); - spawner.interactionID = interactionNames.get(indexI); + logic.interactionID = interactionNames.get(indexI); return true; @@ -167,19 +167,19 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return; + if(!(te instanceof TileEntityWandLogic)) return; - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + TileEntityWandLogic logic = (TileEntityWandLogic) te; List text = new ArrayList<>(); - text.add("Action: " + spawner.actionID); - text.add("Condition: " + spawner.conditionID); - text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + text.add("Action: " + logic.actionID); + text.add("Condition: " + logic.conditionID); + text.add("Interaction: " + (logic.interactionID != null ? logic.interactionID : "None")); String block; - if(spawner.disguise != null && spawner.disguise != Blocks.air) - block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + if(logic.disguise != null && logic.disguise != Blocks.air) + block = I18nUtil.resolveKey(logic.disguise.getUnlocalizedName() + ".name"); else block = "None"; @@ -198,21 +198,21 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT @Override public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityWandSpawner(); + return new TileEntityWandLogic(); } @Override public BombReturnCode explode(World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return null; + if(!(te instanceof TileEntityWandLogic)) return null; - ((TileEntityWandSpawner) te).triggerReplace = true; + ((TileEntityWandLogic) te).triggerReplace = true; return BombReturnCode.TRIGGERED; } - public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + public static class TileEntityWandLogic extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { private boolean triggerReplace; public int placedRotation; @@ -220,8 +220,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT Block disguise; int disguiseMeta = -1; - public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "EMPTY"; + public String actionID = "FODDER_WAVE"; + public String conditionID = "PLAYER_CUBE_5"; public String interactionID; @Override @@ -237,28 +237,28 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT } private void replace() { - if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { - MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLogic)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a logic block but we're doing a TE update as if it is, cancelling!"); return; } - worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.logic_block); TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { - MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); - te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + MainRegistry.logger.warn("TE for logic block set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_logic.createTileEntity(worldObj, 0); worldObj.setTileEntity(xCoord, yCoord, zCoord, te); } - if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ - DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; - spawner.actionID = actionID; - spawner.conditionID = conditionID; - spawner.interactionID = interactionID; - spawner.direction = ForgeDirection.getOrientation(placedRotation); - spawner.disguise = disguise; - spawner.disguiseMeta = disguiseMeta; + if(te instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) te; + logic.actionID = actionID; + logic.conditionID = conditionID; + logic.interactionID = interactionID; + logic.direction = ForgeDirection.getOrientation(placedRotation); + logic.disguise = disguise; + logic.disguiseMeta = disguiseMeta; } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 52dbb6099..4a6fc10d8 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,32 +7,18 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.BufferUtil; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.util.EnumUtil; import com.hbm.util.Vec3NT; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,76 +30,19 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityDungeonSpawner){ - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; - if(spawner.disguise != null){ - return spawner.disguise.getIcon(side, spawner.disguiseMeta); - } - } - - return super.getIcon(world, x, y, z, side); - } - - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - TileEntity te = worldIn.getTileEntity(x, y, z); - if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { - ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); - return true; - } - - return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); - } - + public static class TileEntityDungeonSpawner extends TileEntity { - - //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; public int timer = 0; - - public Block disguise; - public int disguiseMeta; - - /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ - public String conditionID = "ABERRATOR"; - public String actionID = "ABERRATOR"; - /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ - public String interactionID; - - public Function condition; - public Consumer action; - /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ - public Consumer interaction; - - public EntityPlayer player; - - public ForgeDirection direction = ForgeDirection.UNKNOWN; + public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - if(action == null){ - action = DungeonSpawnerActions.actions.get(actionID); - } - if(condition == null){ - condition = DungeonSpawnerConditions.conditions.get(conditionID); - } - if(interaction == null && interactionID != null){ - interaction = DungeonSpawnerInteractions.interactions.get(interactionID); - } - - if(action == null || condition == null){ - worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); - return; - } - action.accept(this); - if(condition.apply(this)) { + type.phase.accept(this); + if(type.phaseCondition.apply(this)) { phase++; timer = 0; } else { @@ -126,47 +55,83 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - - nbt.setInteger("direction", direction.ordinal()); - if(disguise != null){ - nbt.setInteger("disguiseMeta", disguiseMeta); - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - } + nbt.setByte("type", (byte) type.ordinal()); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - - this.actionID = nbt.getString("actionID"); - this.conditionID = nbt.getString("conditionID"); - if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); - - this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); - - if(nbt.hasKey("disguise")){ - disguiseMeta = nbt.getInteger("disguiseMeta"); - disguise = Block.getBlockFromName(nbt.getString("disguise")); - } - } - - @Override - public Packet getDescriptionPacket() { - NBTTagCompound nbt = new NBTTagCompound(); - this.writeToNBT(nbt); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - this.readFromNBT(pkt.func_148857_g()); + this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); } } + + public static enum EnumSpawnerType { + + ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); + public Function phaseCondition; + public Consumer phase; + + private EnumSpawnerType(Function con, Consumer ph) { + this.phaseCondition = con; + this.phase = ph; + } + } + + public static Function CON_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1 || tile.phase == 2) { + if(tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for(int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for(int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if(mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if(tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if(te instanceof TileEntitySkeletonHolder) { + TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; + if(world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; } diff --git a/src/main/java/com/hbm/blocks/generic/LogicBlock.java b/src/main/java/com/hbm/blocks/generic/LogicBlock.java new file mode 100644 index 000000000..462755811 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/LogicBlock.java @@ -0,0 +1,162 @@ +package com.hbm.blocks.generic; + +import com.hbm.world.gen.util.LogicBlockActions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class LogicBlock extends BlockContainer { + + public LogicBlock() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new LogicBlock.TileEntityLogicBlock(); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logicBlock = (LogicBlock.TileEntityLogicBlock) tile; + if(logicBlock.disguise != null){ + return logicBlock.disguise.getIcon(side, logicBlock.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof LogicBlock.TileEntityLogicBlock && ((LogicBlock.TileEntityLogicBlock) te).interaction != null) { + ((LogicBlock.TileEntityLogicBlock) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } + + public static class TileEntityLogicBlock extends TileEntity { + + //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; + public int timer = 0; + + public Block disguise; + public int disguiseMeta; + + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ + public String conditionID = "PLAYER_CUBE_5"; + public String actionID = "FODDER_WAVE"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; + + public Function condition; + public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; + + public ForgeDirection direction = ForgeDirection.UNKNOWN; + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + if(action == null){ + action = LogicBlockActions.actions.get(actionID); + } + if(condition == null){ + condition = LogicBlockConditions.conditions.get(conditionID); + } + if(interaction == null && interactionID != null){ + interaction = LogicBlockInteractions.interactions.get(interactionID); + } + + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { + phase++; + timer = 0; + } else { + timer++; + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("phase", phase); + + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + + nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); + this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + } + +} diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 9b8751d05..e460bc08b 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -21,7 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDoorGeneric extends TileEntityLockableBase { +public class TileEntityDoorGeneric extends TileEntityLockableBase { //0: closed, 1: open, 2: closing, 3: opening public byte state = 0; @@ -318,6 +318,15 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { return true; } + /**Useful for logic block interactions, as a way to close/open doors**/ + public void open(){ + if(state == 0) state = 3; + } + + public void close() { + if(state == 1) state = 2; + } + @Override public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; @@ -404,4 +413,4 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f688059be..1c938ab18 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,8 +19,9 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; -import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; +import com.hbm.blocks.generic.BlockWandLogic.TileEntityWandLogic; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; @@ -209,6 +210,7 @@ public class TileMappings { put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); put(TileEntitySkeletonHolder.class, "tileentity_ntm_skeleton"); put(TileEntityDungeonSpawner.class, "tileentity_ntm_dungeon_spawner"); + put(LogicBlock.TileEntityLogicBlock.class, "tileentity_ntm_logic_block"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); put(TileEntitySnowglobe.class, "tileentity_ntm_snowglobe"); put(TileEntityPlushie.class, "tileentity_ntm_plushie"); @@ -237,7 +239,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); - put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); + put(TileEntityWandLogic.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java similarity index 91% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index 252bc543b..2b3682c7c 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -4,6 +4,7 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; @@ -30,11 +31,11 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.*; import java.util.function.Consumer; -public class DungeonSpawnerActions { +public class LogicBlockActions { - public static LinkedHashMap> actions = new LinkedHashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); - public static Consumer PHASE_ABERRATOR = (tile) -> { + public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -79,7 +80,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -115,7 +116,7 @@ public class DungeonSpawnerActions { }; - public static Consumer FODDER_WAVE = (tile) -> { + public static Consumer FODDER_WAVE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -134,7 +135,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer PUZZLE_TEST = (tile) -> { + public static Consumer PUZZLE_TEST = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -151,7 +152,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer MISSILE_STRIKE = (tile) -> { + public static Consumer MISSILE_STRIKE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -176,7 +177,7 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; - public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -254,9 +255,10 @@ public class DungeonSpawnerActions { //register new actions here static{ - actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); - actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + //example actions actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java similarity index 79% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java index 1e0cc9d5a..5065a38fd 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -3,9 +3,9 @@ package com.hbm.world.gen.util; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -14,19 +14,18 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; -public class DungeonSpawnerConditions { +public class LogicBlockConditions { - public static LinkedHashMap> conditions = new LinkedHashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); /**For use with interactions, for having them handle all conditional tasks*/ - public static Function EMPTY = (tile) -> false; + public static Function EMPTY = (tile) -> false; - public static Function ABERRATOR = (tile) -> { + public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); if(world.difficultySetting.ordinal() == 0) return false; int x = tile.xCoord; @@ -45,7 +44,7 @@ public class DungeonSpawnerConditions { return false; }; - public static Function PLAYER_CUBE_5 = (tile) -> { + public static Function PLAYER_CUBE_5 = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -53,7 +52,7 @@ public class DungeonSpawnerConditions { return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); }; - public static Function REDSTONE = (tile) -> { + public static Function REDSTONE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -62,7 +61,7 @@ public class DungeonSpawnerConditions { return world.isBlockIndirectlyGettingPowered(x,y,z); }; - public static Function PUZZLE_TEST = (tile) -> { + public static Function PUZZLE_TEST = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -88,6 +87,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + //example conditions conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java similarity index 73% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java index 32c19b81d..decf997a6 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -1,30 +1,22 @@ package com.hbm.world.gen.util; -import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; -import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.blocks.generic.LogicBlock; +import com.hbm.blocks.generic.LogicBlock.TileEntityLogicBlock; import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.function.Consumer; /**Interactions are called when the player right-clicks the block**/ -public class DungeonSpawnerInteractions { +public class LogicBlockInteractions { /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, * in that order **/ @@ -32,23 +24,23 @@ public class DungeonSpawnerInteractions { public static Consumer TEST = (array) -> { World world = (World) array[0]; - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; int x = (int) array[2]; int y = (int) array[3]; int z = (int) array[4]; EntityPlayer player = (EntityPlayer) array[5]; int side = (int) array[6]; - if(spawner.phase > 1) return; + if(logic.phase > 1) return; if(player.getHeldItem() != null) player.getHeldItem().stackSize--; - spawner.phase++; + logic.phase++; }; public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; EntityPlayer player = (EntityPlayer) array[5]; if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ @@ -58,8 +50,8 @@ public class DungeonSpawnerInteractions { EnumChatFormatting.RESET + " Radiation treatment administered")); player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); - spawner.phase = 2; - spawner.timer = 0; + logic.phase = 2; + logic.timer = 0; } }; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index dcb6d68b3..c5fd461eb 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,7 +5279,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain -tile.dungeon_spawner.name=Dungeon Action Block +tile.logic_block.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -6062,7 +6062,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) -tile.wand_spawner.name=Structure Wand Block (Actions) +tile.wand_logic.name=Structure Wand Block (Logic) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/logic_block.png b/src/main/resources/assets/hbm/textures/blocks/logic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0d69e2f3a978d2bf12ddc5b5cbfb1842ba7510 GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#X;^dWMl%nE(*xb zY-a(BX93wDkO0IW{V*EMQU+$Aci0(NfGP}(j13qUKuiVcU|j$)X$p`H0!%=2n7}H7 zEG>X6s4hbT1CZ?M21ViEc@`Q#b+(=^jv*HQzCpSEw*o}=>F?dEtN)5U!RbuG4&KgV zE{oqaci#N3F7Vi4ruQ+EnJOGSncgqo?tMGYY15mUjB}@p=K-O2eqNr%b4LM-zRAlp zmx|QsO&5035$mq8>(82`k|<$x?Ad3_z5DjX>4{yuJ^QTXNoG&U`_ogS;hZ4FDZYqw~rU$lJ8xq{k3lIKhI1bj>8vh zk8jMCo@>20aBI}s+_h16Cl=M$%l|CenG-q9Q>ck;%?S=i9^RutFaQ0kGm!Z5yY_l% zYp$}TRDb*7hwJag`ets7ND;8&W%6j5yDci-jIEYqr@*Cc$@lGnpi8MeHR0Lseac53 zU%veIZSMBlXWNX}cFy%v*Jn|Smg$|z{54Y4G`!<*bMxfM!pS~+4DWpW^y$-=H#{5+ z+e8+8x8a{YO--1D8D1it-Rb>DsQqh|{(-fj4_hd;{s>7^O>l{;j1w;tN< z#rnm7!E32d+%tB?*D4zet`%5MnQ(sVtQFS_x9{F^q(96+N#5J1z z(8F|LpIJ)ta?j+OJ>MKDaD4sx^^;Gs%zj`!*N^dmPV(~b@bK=NXRcYXEWft1rcSmk zq4A~4#mrsLcYVk`9W+Nf*`mZ{hF>Pr#vmp^$-_CbA8lMB67;CuxJT2e>8cmUNAY#m VmCt%+=9_>Lm8Ywp%Q~loCIFqXPX_=1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic.png similarity index 100% rename from src/main/resources/assets/hbm/textures/blocks/wand_spawner.png rename to src/main/resources/assets/hbm/textures/blocks/wand_logic.png diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png similarity index 100% rename from src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png rename to src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png From ef54c6e23b47447666d765bf147738d5c7b86ae4 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Wed, 9 Jul 2025 23:22:51 +0200 Subject: [PATCH 093/323] Added Forge MicroBlocks support --- .../microblocks/MicroBlocksCompatHandler.java | 77 +++++++++++++++++++ src/main/java/com/hbm/main/MainRegistry.java | 7 +- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java diff --git a/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java new file mode 100644 index 000000000..3abe4eb0d --- /dev/null +++ b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java @@ -0,0 +1,77 @@ +package com.hbm.handler.microblocks; + +import com.hbm.blocks.ModBlocks; +import cpw.mods.fml.common.event.FMLInterModComms; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +public class MicroBlocksCompatHandler { + public static void preInit() { + registerMicroBlockCompat(ModBlocks.basalt); + registerMicroBlockCompat(ModBlocks.basalt_smooth); + registerMicroBlockCompat(ModBlocks.basalt_brick); + registerMicroBlockCompat(ModBlocks.basalt_polished); + registerMicroBlockCompat(ModBlocks.basalt_tiles); + + registerMicroBlockCompat(ModBlocks.deco_titanium); + registerMicroBlockCompat(ModBlocks.deco_red_copper); + registerMicroBlockCompat(ModBlocks.deco_tungsten); + registerMicroBlockCompat(ModBlocks.deco_aluminium); + registerMicroBlockCompat(ModBlocks.deco_steel); + registerMicroBlockCompat(ModBlocks.deco_rusty_steel); + registerMicroBlockCompat(ModBlocks.deco_lead); + registerMicroBlockCompat(ModBlocks.deco_beryllium); + registerMicroBlockCompat(ModBlocks.deco_asbestos); + registerMicroBlockCompat(ModBlocks.deco_rbmk); + registerMicroBlockCompat(ModBlocks.deco_rbmk_smooth); + + registerMicroBlockCompat(ModBlocks.asphalt); + registerMicroBlockCompat(ModBlocks.asphalt_light); + + registerMicroBlockCompat(ModBlocks.reinforced_brick); + registerMicroBlockCompat(ModBlocks.reinforced_ducrete); + registerMicroBlockCompat(ModBlocks.reinforced_sand); + + registerMicroBlockCompat(ModBlocks.reinforced_stone); + registerMicroBlockCompat(ModBlocks.concrete_smooth); + registerMicroBlockCompat(ModBlocks.concrete_colored); + registerMicroBlockCompat(ModBlocks.concrete_colored_ext); + registerMicroBlockCompat(ModBlocks.concrete); + registerMicroBlockCompat(ModBlocks.concrete_asbestos); + registerMicroBlockCompat(ModBlocks.concrete_super); + registerMicroBlockCompat(ModBlocks.concrete_super_broken); + registerMicroBlockCompat(ModBlocks.ducrete_smooth); + registerMicroBlockCompat(ModBlocks.ducrete); + registerMicroBlockCompat(ModBlocks.concrete_pillar); + registerMicroBlockCompat(ModBlocks.brick_concrete); + registerMicroBlockCompat(ModBlocks.brick_concrete_mossy); + registerMicroBlockCompat(ModBlocks.brick_concrete_cracked); + registerMicroBlockCompat(ModBlocks.brick_concrete_broken); + registerMicroBlockCompat(ModBlocks.brick_concrete_marked); + registerMicroBlockCompat(ModBlocks.brick_ducrete); + registerMicroBlockCompat(ModBlocks.brick_obsidian); + registerMicroBlockCompat(ModBlocks.brick_light); + registerMicroBlockCompat(ModBlocks.brick_compound); + registerMicroBlockCompat(ModBlocks.brick_asbestos); + registerMicroBlockCompat(ModBlocks.brick_fire); + registerMicroBlockCompat(ModBlocks.lightstone); + + registerMicroBlockCompat(ModBlocks.cmb_brick); + registerMicroBlockCompat(ModBlocks.cmb_brick_reinforced); + registerMicroBlockCompat(ModBlocks.vinyl_tile); + + registerMicroBlockCompat(ModBlocks.tile_lab); + registerMicroBlockCompat(ModBlocks.tile_lab_cracked); + registerMicroBlockCompat(ModBlocks.tile_lab_broken); + } + + private static void registerMicroBlockCompat(Block block) { + for(int meta = 0; meta < 15; meta++) { + registerMicroBlockCompat(block, meta); + } + } + + private static void registerMicroBlockCompat(Block block, int meta) { + FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(block, 1, meta)); + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4c8e7f954..87c33fced 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -18,6 +18,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.handler.imc.IMCCrystallizer; import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.microblocks.MicroBlocksCompatHandler; import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -661,6 +662,8 @@ public class MainRegistry { } } }); + + MicroBlocksCompatHandler.preInit(); } @EventHandler @@ -903,14 +906,14 @@ public class MainRegistry { Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); CommandReloadClient.register(); - + // to make sure that foreign registered fluids are accounted for, // even when the reload listener is registered too late due to load order Fluids.reloadFluids(); //ExplosionTests.runTest(); } - + @EventHandler public void preInit(FMLPreInitializationEvent event) { if(logger == null) From 89100738f46bddce02101106497f5e24866113e2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 10 Jul 2025 16:58:37 +0200 Subject: [PATCH 094/323] holy cungadero do i feel good --- changelog | 7 +- .../hbm/entity/mob/EntityHunterChopper.java | 16 +-- .../gui/GUIMachineAssemblyMachine.java | 8 +- .../inventory/recipes/AssemblerRecipes.java | 7 -- .../recipes/AssemblyMachineRecipes.java | 58 +++++++++- src/main/java/com/hbm/items/ModItems.java | 28 +---- .../com/hbm/items/special/ItemStarterKit.java | 108 ++++++++---------- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 6 +- src/main/java/com/hbm/main/MainRegistry.java | 7 ++ .../java/com/hbm/main/ModEventHandler.java | 2 - .../tileentity/RenderAssemblyMachine.java | 10 +- .../machine/TileEntityMachineCentrifuge.java | 5 +- .../machine/TileEntityMachineGasCent.java | 47 ++++---- .../hbm/world/gen/util/LogicBlockActions.java | 1 - .../world/gen/util/LogicBlockConditions.java | 1 - .../gen/util/LogicBlockInteractions.java | 1 - 16 files changed, 167 insertions(+), 145 deletions(-) diff --git a/changelog b/changelog index d6b838a91..d0426ccf0 100644 --- a/changelog +++ b/changelog @@ -3,5 +3,10 @@ ## Changed * Removed levitation unit +* Many of NTM's regular building blocks now have forge microblock support +* RBMK crane models now conform to the dimensions of the room they're in -## Fixed \ No newline at end of file +## Fixed +* Fixed gas centrifuge sound persisting when broken or when unloaded +* Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots +* Fixed guns that don't have durability always displaying a condition of 0% \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java index 91b544fdc..647348883 100644 --- a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java +++ b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java @@ -3,6 +3,7 @@ package com.hbm.entity.mob; import com.hbm.entity.projectile.EntityBullet; import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.handler.threading.PacketThreading; +import com.hbm.interfaces.Spaghetti; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; @@ -26,6 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +@Spaghetti("this sucks complete donkey shit") public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisplayData, IRadiationImmune { public int courseChangeCooldown; @@ -335,20 +337,6 @@ public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisp * kill this mob. */ protected void dropItems() { - - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_head, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_torso, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_wing, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_tail, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_gun, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_blades, 1); - this.dropItem(ModItems.combine_scrap, rand.nextInt(8) + 1); this.dropItem(ModItems.plate_combine_steel, rand.nextInt(5) + 1); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index 8218c4057..1572ed3be 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -33,8 +33,8 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 115, 34, 16); - assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 115, 34, 16); + assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 99, 52, 16); + assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 99, 52, 16); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); @@ -115,7 +115,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { GL11.glDisable(GL11.GL_BLEND); } - assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 34, 16, 1); - assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 34, 16, 1); + assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 52, 16, 1); + assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 52, 16, 1); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 233f67933..f725cd17a 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -100,12 +100,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.warhead_volcano, 1), new AStack[] {new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()) }, 600); makeRecipe(new ComparableStack(ModItems.missile_stealth, 1), new AStack[] { new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(CU.plate(), 10), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32) },1200); makeRecipe(new ComparableStack(ModItems.thruster_nuclear, 1), new AStack[] {new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel) },600); - makeRecipe(new ComparableStack(ModItems.chopper_head, 1), new AStack[] {new ComparableStack(ModBlocks.reinforced_glass, 2), new OreDictStack(CMB.ingot(), 22), new OreDictStack(MAGTUNG.wireFine(), 4), },300); - makeRecipe(new ComparableStack(ModItems.chopper_gun, 1), new AStack[] {new OreDictStack(CMB.plate(), 4), new OreDictStack(CMB.ingot(), 2), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 1), new ComparableStack(ModItems.motor, 1), },150); - makeRecipe(new ComparableStack(ModItems.chopper_torso, 1), new AStack[] {new OreDictStack(CMB.ingot(), 26), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.chopper_blades, 2), },350); - makeRecipe(new ComparableStack(ModItems.chopper_tail, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(CMB.ingot(), 5), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.chopper_blades, 2), },200); - makeRecipe(new ComparableStack(ModItems.chopper_wing, 1), new AStack[] {new OreDictStack(CMB.plate(), 6), new OreDictStack(CMB.ingot(), 3), new OreDictStack(MAGTUNG.wireFine(), 2), },150); - makeRecipe(new ComparableStack(ModItems.chopper_blades, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(STEEL.plate(), 2), new OreDictStack(CMB.ingot(), 2), },200); makeRecipe(new ComparableStack(ModItems.tritium_deuterium_cake, 1), new AStack[] {new ComparableStack(ModItems.cell_deuterium, 6), new ComparableStack(ModItems.cell_tritium, 2), new OreDictStack(LI.ingot(), 4), },150); makeRecipe(new ComparableStack(ModItems.pellet_cluster, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new ComparableStack(Blocks.tnt, 1), }, 50); makeRecipe(new ComparableStack(ModItems.pellet_buckshot, 1), new AStack[] {new OreDictStack(PB.nugget(), 6), }, 50); @@ -170,7 +164,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); - makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); makeRecipe(new ComparableStack(ModItems.grenade_fire, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_shrapnel, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_cluster, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2), },200); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 1e741f6b7..5031cc364 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -13,6 +13,7 @@ import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; @@ -62,9 +63,61 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(GOLD.wireFine(), 2), new OreDictStack(SI.billet(), 1))); this.register(new GenericRecipe("ass.rtgunit").setup(100, 100).outputItems(new ItemStack(ModItems.rtg_unit, 1)) .inputItems(new OreDictStack(PB.plateCast(), 2), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.thermo_element, 2))); + this.register(new GenericRecipe("ass.magnetron").setup(40, 100).outputItems(new ItemStack(ModItems.magnetron, 1)) + .inputItems(new OreDictStack(CU.plate(), 3), new OreDictStack(W.wireFine(), 4))); this.register(new GenericRecipe("ass.titaniumdrill").setup(100, 100).outputItems(new ItemStack(ModItems.drill_titanium, 1)) .inputItems(new OreDictStack(DURA.plateCast(), 1), new OreDictStack(TI.plate(), 8))); + this.register(new GenericRecipe("ass.entanglementkit").setup(200, 100).outputItems(new ItemStack(ModItems.entanglement_kit, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 8_000))); + this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + // weapon parts + this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); + this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) + .inputItems(new OreDictStack(PB.nugget(), 6))); + + // missile parts + this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) + .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_generic_small, 1)) + .inputItems(new OreDictStack(TI.plate(), 4), new ComparableStack(ModItems.ball_dynamite, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CHIP))); + this.register(new GenericRecipe("ass.warheadhe2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_generic_medium, 1)) + .inputItems(new OreDictStack(TI.plate(), 8), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_generic_large, 1)) + .inputItems(new OreDictStack(TI.plate(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.warheadinc1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(P_RED.dust(), 2))); + this.register(new GenericRecipe("ass.warheadinc2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(P_RED.dust(), 4))); + this.register(new GenericRecipe("ass.warheadinc3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(P_RED.dust(), 8))); + this.register(new GenericRecipe("ass.warheadcl1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_cluster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new ComparableStack(ModItems.pellet_cluster, 2))); + this.register(new GenericRecipe("ass.warheadcl2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_cluster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new ComparableStack(ModItems.pellet_cluster, 4))); + this.register(new GenericRecipe("ass.warheadcl3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_cluster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new ComparableStack(ModItems.pellet_cluster, 8))); + this.register(new GenericRecipe("ass.warheadbb1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_buster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 2))); + this.register(new GenericRecipe("ass.warheadbb2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_buster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4))); + this.register(new GenericRecipe("ass.warheadbb3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_buster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8))); + this.register(new GenericRecipe("ass.warheadnuke").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_nuclear, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(U235.billet(), 6), new ComparableStack(ModItems.cordite, 12), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.warheadthermonuke").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_mirv, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(PU239.billet(), 8), new ComparableStack(ModItems.ball_tatb, 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER_ADVANCED)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 4_000))); + this.register(new GenericRecipe("ass.warheadvolcano").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_volcano, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(STEEL.plateCast(), 6), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()))); + this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) + .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); + this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); + // bunker blocks this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); @@ -72,7 +125,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); - this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); // machines @@ -81,6 +134,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + // rancid shit mob spawners + this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) + .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b66b8f403..d3a6cef3c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -642,13 +642,7 @@ public class ModItems { public static Item seg_10; public static Item seg_15; public static Item seg_20; - - public static Item chopper_head; - public static Item chopper_gun; - public static Item chopper_torso; - public static Item chopper_tail; - public static Item chopper_wing; - public static Item chopper_blades; + public static Item combine_scrap; public static Item shimmer_head; @@ -746,15 +740,12 @@ public class ModItems { public static Item pellet_rtg_gold; public static Item pellet_rtg_lead; - public static Item tritium_deuterium_cake; + @Deprecated public static Item tritium_deuterium_cake; public static Item piston_selenium; public static Item piston_set; public static Item drillbit; - //public static Item crystal_energy; - //public static Item pellet_coolant; - public static Item rune_blank; public static Item rune_isa; public static Item rune_dagaz; @@ -2191,7 +2182,6 @@ public class ModItems { public static Item polaroid; public static Item glitch; - public static Item letter; public static Item book_secret; public static Item book_of_; public static Item page_of_; @@ -2791,12 +2781,6 @@ public class ModItems { seg_15 = new Item().setUnlocalizedName("seg_15").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_15"); seg_20 = new Item().setUnlocalizedName("seg_20").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_20"); - chopper_head = new Item().setUnlocalizedName("chopper_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_head"); - chopper_gun = new Item().setUnlocalizedName("chopper_gun").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_gun"); - chopper_torso = new Item().setUnlocalizedName("chopper_torso").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_torso"); - chopper_tail = new Item().setUnlocalizedName("chopper_tail").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_tail"); - chopper_wing = new Item().setUnlocalizedName("chopper_wing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_wing"); - chopper_blades = new Item().setUnlocalizedName("chopper_blades").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_blades"); combine_scrap = new Item().setUnlocalizedName("combine_scrap").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":combine_scrap"); shimmer_head = new Item().setUnlocalizedName("shimmer_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":shimmer_head_original"); @@ -4933,7 +4917,6 @@ public class ModItems { polaroid = new ItemPolaroid().setUnlocalizedName("polaroid").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":polaroid_" + MainRegistry.polaroidID); glitch = new ItemGlitch().setUnlocalizedName("glitch").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":glitch_" + MainRegistry.polaroidID); - letter = new ItemStarterKit().setUnlocalizedName("letter").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":letter"); book_secret = new ItemCustomLore().setUnlocalizedName("book_secret").setCreativeTab(MainRegistry.polaroidID == 11 ? MainRegistry.consumableTab : null).setTextureName(RefStrings.MODID + ":book_secret"); book_of_ = new ItemBook().setUnlocalizedName("book_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":book_of_"); page_of_ = new ItemEnumMulti(ItemEnums.EnumPages.class, true, false).setUnlocalizedName("page_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":page_of_"); @@ -5593,12 +5576,6 @@ public class ModItems { GameRegistry.registerItem(seg_20, seg_20.getUnlocalizedName()); //Chopper parts - GameRegistry.registerItem(chopper_head, chopper_head.getUnlocalizedName()); - GameRegistry.registerItem(chopper_gun, chopper_gun.getUnlocalizedName()); - GameRegistry.registerItem(chopper_torso, chopper_torso.getUnlocalizedName()); - GameRegistry.registerItem(chopper_tail, chopper_tail.getUnlocalizedName()); - GameRegistry.registerItem(chopper_wing, chopper_wing.getUnlocalizedName()); - GameRegistry.registerItem(chopper_blades, chopper_blades.getUnlocalizedName()); GameRegistry.registerItem(combine_scrap, combine_scrap.getUnlocalizedName()); //Hammer Parts @@ -7116,7 +7093,6 @@ public class ModItems { GameRegistry.registerItem(euphemium_kit, euphemium_kit.getUnlocalizedName()); GameRegistry.registerItem(legacy_toolbox, legacy_toolbox.getUnlocalizedName()); GameRegistry.registerItem(toolbox, toolbox.getUnlocalizedName()); - GameRegistry.registerItem(letter, letter.getUnlocalizedName()); //Misile Loot Boxes GameRegistry.registerItem(loot_10, loot_10.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index 4e70ed205..ba8bf97b4 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -10,7 +10,6 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; import com.hbm.items.machine.ItemBreedingRod.BreedingRodType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; -import com.hbm.util.ShadyUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,10 +21,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; -@Deprecated //not deprecated per se but please stop using it wherever possible +@Deprecated @Spaghetti("i do not care how much 'optimization' you want to throw at this dumpster fire but there's no saving grace here") public class ItemStarterKit extends Item { @@ -75,8 +73,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_difurnace_off, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_gascent, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_reactor_breeding, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.reactor_research, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway, 8)); @@ -95,7 +93,6 @@ public class ItemStarterKit extends Item { if(this == ModItems.nuke_advanced_kit) { - player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_yellowcake, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_plutonium, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.ingot_steel, 64)); @@ -113,8 +110,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_radgen, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_rtg_grey, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 3)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 2)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 3)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_fluidtank, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); @@ -128,7 +125,6 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway_strong, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radx, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pill_iodine, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModItems.tritium_deuterium_cake, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.geiger_counter, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.survey_scanner, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.gas_mask_m65, 1)); @@ -440,29 +436,17 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(Item.getItemFromBlock(ModBlocks.statue_elb_f), 1)); } - if(this == ModItems.hazmat_kit) - { + if(this == ModItems.hazmat_kit) { giveHaz(world, player, 0); } - - if(this == ModItems.hazmat_red_kit) - { + + if(this == ModItems.hazmat_red_kit) { giveHaz(world, player, 1); } - - if(this == ModItems.hazmat_grey_kit) - { + + if(this == ModItems.hazmat_grey_kit) { giveHaz(world, player, 2); } - - if(this == ModItems.letter && world.isRemote) - { - if(player.getUniqueID().toString().equals(ShadyUtil.a20)) { - player.addChatMessage(new ChatComponentText("Error: null reference @ com.hbm.items.ItemStarterKit.class, please report this to the modder!")); - } else { - player.addChatMessage(new ChatComponentText("You rip the letter in half; nothing happens.")); - } - } world.playSoundAtEntity(player, "hbm:item.unpack", 1.0F, 1.0F); stack.stackSize--; @@ -470,42 +454,42 @@ public class ItemStarterKit extends Item { } - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.nuke_electric_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.t45_kit || - this == ModItems.grenade_kit || - this == ModItems.missile_kit || - this == ModItems.multi_kit) { - list.add("Please empty inventory before opening!"); - } - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.hazmat_kit) { - list.add("Armor will be displaced by hazmat suit."); - } - } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.nuke_electric_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.t45_kit || + this == ModItems.grenade_kit || + this == ModItems.missile_kit || + this == ModItems.multi_kit) { + list.add("Please empty inventory before opening!"); + } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.hazmat_kit) { + list.add("Armor will be displaced by hazmat suit."); + } + } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index 3539a712b..66cb14695 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -184,8 +184,10 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I } float maxDura = config.getDurability(stack); - int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); - list.add("Condition: " + dura + "%"); + if(maxDura > 0) { + int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); + list.add("Condition: " + dura + "%"); + } for(ItemStack upgrade : WeaponModManager.getUpgradeItems(stack, i)) { list.add(EnumChatFormatting.YELLOW + upgrade.getDisplayName()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4bd2975ed..5b9d63062 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1707,6 +1707,13 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.machine_transformer_20"); ignoreMappings.add("hbm:tile.machine_transformer_dnt_20"); ignoreMappings.add("hbm:item.levitation_unit"); + ignoreMappings.add("hbm:item.letter"); + ignoreMappings.add("hbm:item.chopper_head"); + ignoreMappings.add("hbm:item.chopper_gun"); + ignoreMappings.add("hbm:item.chopper_torso"); + ignoreMappings.add("hbm:item.chopper_tail"); + ignoreMappings.add("hbm:item.chopper_wing"); + ignoreMappings.add("hbm:item.chopper_blades"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 655656174..1f0be79bf 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -10,7 +10,6 @@ import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; import com.hbm.config.ServerConfig; import com.hbm.entity.mob.*; -import com.hbm.entity.mob.ai.EntityAIFireGun; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityBurningFOEQ; import com.hbm.entity.train.EntityRailCarBase; @@ -76,7 +75,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.*; diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java index 6bb9a7f21..1111a998a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -111,8 +111,16 @@ public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack stack = recipe.getIcon(); + stack.stackSize = 1; - if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { + if(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock) { + if(RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType())) { + GL11.glTranslated(0, -0.0625, 0); + } else { + GL11.glTranslated(0, -0.125, 0); + GL11.glScaled(0.5, 0.5, 0.5); + } + } else { GL11.glRotated(-90, 1, 0, 0); GL11.glTranslated(0, -0.25, 0); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 07c5ea852..c5b5e9da6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -236,7 +236,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -247,6 +247,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -276,7 +277,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 62e76ae0e..7a63ee4d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -151,7 +151,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(te instanceof TileEntityMachineGasCent) { TileEntityMachineGasCent cent = (TileEntityMachineGasCent) te; - if(cent.tank.getFill() == 0 && cent.tank.getTankType() == tank.getTankType()) { + if(cent.tank.getTankType() == tank.getTankType()) { if(cent.inputTank.getTankType() != outputTank.getTankType() && outputTank.getTankType() != PseudoFluidType.NONE) { cent.inputTank.setTankType(outputTank.getTankType()); cent.outputTank.setTankType(outputTank.getTankType().getOutputType()); @@ -237,7 +237,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -248,6 +248,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -261,7 +262,27 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } } @Override @@ -314,21 +335,9 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I }; } - @Override - public void setPower(long i) { - power = i; - } - - @Override - public long getPower() { - return power; - - } - - @Override - public long getMaxPower() { - return maxPower; - } + @Override public void setPower(long i) { power = i; } + @Override public long getPower() { return power; } + @Override public long getMaxPower() { return maxPower; } public int getProcessingSpeed() { if(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed) { @@ -352,7 +361,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I tank.setTankType(newType); } } - } } @@ -374,7 +382,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(bb == null) { bb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } - return bb; } diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index 2b3682c7c..af2c41356 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -3,7 +3,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockSkeletonHolder; -import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.entity.missile.EntityMissileTier2; diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java index 5065a38fd..b51b96c23 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -2,7 +2,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockPedestal; -import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java index decf997a6..bf3bc47eb 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -1,7 +1,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.generic.LogicBlock; -import com.hbm.blocks.generic.LogicBlock.TileEntityLogicBlock; import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; import net.minecraft.entity.player.EntityPlayer; From 16fcac0a3c7dac86a86ebe98adfc9e8086cad566 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 14:53:50 +0300 Subject: [PATCH 095/323] Support collision-only/visual-only boxes on doors --- .../hbm/blocks/generic/BlockDoorGeneric.java | 12 +++--- .../java/com/hbm/tileentity/DoorDecl.java | 42 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 365187ff4..3dfe4814a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -94,7 +94,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) { - AxisAlignedBB box = getBoundingBox(worldIn, x, y ,z); + AxisAlignedBB box = getBoundingBox(worldIn, x, y, z, true); box = AxisAlignedBB.getBoundingBox( Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)); @@ -113,7 +113,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z); + AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z, true); if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null; return aabb; } @@ -121,7 +121,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { // Enables clicking through the open door @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) { - AxisAlignedBB box = getBoundingBox(world, x, y ,z); + AxisAlignedBB box = getBoundingBox(world, x, y, z, false); box = AxisAlignedBB.getBoundingBox( Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ) @@ -158,11 +158,11 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - return getBoundingBox(world, x, y, z); + return getBoundingBox(world, x, y, z, false); //return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); } - public AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { + public AxisAlignedBB getBoundingBox(World world, int x, int y, int z, boolean forCollision) { int meta = world.getBlockMetadata(x, y, z); TileEntity te = world.getTileEntity(x, y, z); int[] core = this.findCore(world, x, y, z); @@ -173,7 +173,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { TileEntity te2 = world.getTileEntity(core[0], core[1], core[2]); ForgeDirection dir = ForgeDirection.getOrientation(te2.getBlockMetadata() - BlockDummyable.offset); BlockPos pos = new BlockPos(x - core[0], y - core[1], z - core[2]).rotate(Rotation.getBlockRotation(dir).add(Rotation.COUNTERCLOCKWISE_90)); - AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open); + AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open, forCollision); switch(te2.getBlockMetadata() - offset){ case 2: return AxisAlignedBB.getBoundingBox(x + 1 - box.minX, y + box.minY, z + 1 - box.minZ, x + 1 - box.maxX, y + box.maxY, z + 1 - box.maxZ); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index ee1c96bc0..9c9887c13 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -67,8 +67,8 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - return super.getBlockBound(x, y, z, open); + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -156,7 +156,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); if(z == 1) { @@ -168,7 +168,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); } else { - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -240,7 +240,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); @@ -248,7 +248,7 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); } } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -327,7 +327,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0, 1); return AxisAlignedBB.getBoundingBox(0, 0.9375, 1 - 0.25, 1, 1, 1); @@ -429,7 +429,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { if(y > 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); @@ -441,7 +441,7 @@ public abstract class DoorDecl { } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); } else { - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -504,9 +504,9 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 1) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -2) { @@ -516,7 +516,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -595,7 +595,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(z == 0) { return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); @@ -691,14 +691,14 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 1, 1); if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); else if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -814,7 +814,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 1, 1); } else if(y > 1) { @@ -822,7 +822,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1018,15 +1018,15 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 3) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -3) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1159,7 +1159,7 @@ public abstract class DoorDecl { public void doOffsetTransform() { } - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } From 3c2d49419fe1392a3e1cd0522bb660ff2c02ec7d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 15:07:42 +0300 Subject: [PATCH 096/323] Use separate collision and visual boxes on doors Also improve the user experience with smaller doors, by making the visual hitbox cover the entire door even when open. (In repsonse to Mellow's critique) --- .../java/com/hbm/tileentity/DoorDecl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 9c9887c13..d04b030d3 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -166,7 +166,7 @@ public abstract class DoorDecl { } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.75, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.1, 1); } else { return super.getBlockBound(x, y, z, open, forCollision); } @@ -245,7 +245,7 @@ public abstract class DoorDecl { if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.08, 1); } } return super.getBlockBound(x, y, z, open, forCollision); @@ -328,9 +328,8 @@ public abstract class DoorDecl { @Override public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { - if(open) { - if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0, 1); - return AxisAlignedBB.getBoundingBox(0, 0.9375, 1 - 0.25, 1, 1, 1); + if(forCollision && open) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0); } else { return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 1, 1); } @@ -437,7 +436,7 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } if(y == 1) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); } else { @@ -514,7 +513,7 @@ public abstract class DoorDecl { } else if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; @@ -596,7 +595,7 @@ public abstract class DoorDecl { @Override public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { - if(open) { + if(forCollision && open) { if(z == 0) { return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); } else { @@ -697,7 +696,7 @@ public abstract class DoorDecl { if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); else if(y == 0) - return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, forCollision ? 0 : 0.1, 1); return super.getBlockBound(x, y, z, open, forCollision); }; @@ -820,7 +819,7 @@ public abstract class DoorDecl { } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.85, 0.75, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, forCollision ? 0 : 0.15, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; @@ -1025,6 +1024,8 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -3) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; From f2f3e04bb0419b0423d141acac58e9a853bdf97a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 15:19:13 +0300 Subject: [PATCH 097/323] Fix gap in secure access door --- src/main/java/com/hbm/tileentity/DoorDecl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index d04b030d3..e7cf6981f 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -439,7 +439,9 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); - } else { + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + }else { return super.getBlockBound(x, y, z, open, forCollision); } } From 10d8551ce36dbb6d786a1482e28b39c3f7ab011d Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 11 Jul 2025 14:56:46 +0200 Subject: [PATCH 098/323] all zinced up --- changelog | 7 ++ .../com/hbm/inventory/UpgradeManagerNT.java | 2 +- .../recipes/AssemblyMachineRecipes.java | 78 ++++++++++++++----- src/main/java/com/hbm/items/ModItems.java | 2 +- .../TileEntityMachineCrystallizer.java | 34 ++++---- .../com/hbm/util/DamageResistanceHandler.java | 46 ++++++----- src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- 8 files changed, 114 insertions(+), 59 deletions(-) diff --git a/changelog b/changelog index d0426ccf0..914e54d80 100644 --- a/changelog +++ b/changelog @@ -1,10 +1,17 @@ ## Added * New assembler + * Features a brand new animated model, GUI and the new recipe selection system + * Many recipes have been reworked, with the microcrafting complexity reduced + * The redcoil didn't get a recipe. It's gonna die soon. ## Changed * Removed levitation unit * Many of NTM's regular building blocks now have forge microblock support * RBMK crane models now conform to the dimensions of the room they're in +* Projectile resistance for armor has been renamed to "physical" and now also extends to all direct forms of attack by other entities that don't fall into any other categories (mostly melee attacks) + * This should fix the issue where most armors are quite weak against swords +* Electric attacks (i.e. tesla cannon) are now in the "energy damage" category + * This means that armors that have energy resistance actually properly work against the tesla cannon ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded diff --git a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java index 3ae55ae72..fae7ac9ef 100644 --- a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java +++ b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java @@ -31,7 +31,7 @@ public class UpgradeManagerNT { public UpgradeManagerNT(TileEntity te) { this.owner = te; } @Deprecated public UpgradeManagerNT() { } - public void checkSlots(ItemStack[] slots, int start, int end) { checkSlots(owner, slots, start, end); } + public void checkSlots(ItemStack[] slots, int start, int end) { checkSlotsInternal(owner, slots, start, end); } @Deprecated public void checkSlots(TileEntity te, ItemStack[] slots, int start, int end) { checkSlotsInternal(te, slots, start, end); } private void checkSlotsInternal(TileEntity te, ItemStack[] slots, int start, int end) { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 5031cc364..fa7202ec5 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -73,6 +73,64 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + // powders + this.register(new GenericRecipe("ass.partlith").setup(40, 100).outputItems(new ItemStack(ModItems.part_lithium, 8)) + .inputItems(new OreDictStack(LI.dust(), 1))); + this.register(new GenericRecipe("ass.partberyl").setup(40, 100).outputItems(new ItemStack(ModItems.part_beryllium, 8)) + .inputItems(new OreDictStack(BE.dust(), 1))); + this.register(new GenericRecipe("ass.partcoal").setup(40, 100).outputItems(new ItemStack(ModItems.part_carbon, 8)) + .inputItems(new OreDictStack(COAL.dust(), 1))); + this.register(new GenericRecipe("ass.partcop").setup(40, 100).outputItems(new ItemStack(ModItems.part_copper, 8)) + .inputItems(new OreDictStack(CU.dust(), 1))); + this.register(new GenericRecipe("ass.partplut").setup(40, 100).outputItems(new ItemStack(ModItems.part_plutonium, 8)) + .inputItems(new OreDictStack(PU.dust(), 1))); + + // bunker blocks + this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); + this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) + .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); + this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // machines + this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) + .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3))); + this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + + // batteries + this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); + this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CO.dust(), 12), new OreDictStack(LI.dust(), 12))); + this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); + this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); + + // rancid shit mob spawners + this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) + .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); + // weapon parts this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); @@ -117,26 +175,6 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); - - // bunker blocks - this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) - .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); - this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) - .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); - this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); - this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); - - // machines - this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); - this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); - - // rancid shit mob spawners - this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) - .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d3a6cef3c..251e2d396 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -322,7 +322,7 @@ public class ModItems { public static Item plate_combine_steel; public static Item plate_mixed; public static Item plate_paa; - public static Item pipes_steel; + @Deprecated public static Item pipes_steel; public static Item drill_titanium; public static Item plate_dalekanium; public static Item plate_euphemium; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index a72d1996e..1c1a940e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -31,7 +31,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -51,7 +50,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public FluidTank tank; - public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); public TileEntityMachineCrystallizer() { super(8); @@ -76,7 +75,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme tank.setType(7, slots); tank.loadTank(3, 4, slots); - upgradeManager.checkSlots(this, slots, 5, 6); + upgradeManager.checkSlots(slots, 5, 6); for(int i = 0; i < getCycleCount(); i++) { @@ -299,14 +298,8 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - - CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack, tank.getTankType()); - if(i == 0 && recipe != null) { - return true; - } - - if(i == 1 && itemStack.getItem() instanceof IBatteryItem) - return true; + if(i == 0 && CrystallizerRecipes.getOutput(itemStack, tank.getTankType()) != null) return true; + if(i == 1 && itemStack.getItem() instanceof IBatteryItem) return true; return false; } @@ -318,13 +311,26 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public int[] getAccessibleSlotsFromSide(int side) { - - return side == 0 ? new int[] { 2 } : new int[] { 0, 2 }; + return new int[] { 0, 2 }; } + AxisAlignedBB bb = null; + @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 10, + zCoord + 2 + ); + } + + return bb; } @Override diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index d5e475de9..154891677 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -28,6 +28,7 @@ import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraftforge.event.entity.living.LivingAttackEvent; @@ -48,7 +49,7 @@ public class DamageResistanceHandler { public static final String CATEGORY_EXPLOSION = "EXPL"; public static final String CATEGORY_FIRE = "FIRE"; - public static final String CATEGORY_PROJECTILE = "PROJ"; + public static final String CATEGORY_PHYSICAL = "PHYS"; public static final String CATEGORY_ENERGY = "EN"; public static final Gson gson = new Gson(); @@ -121,70 +122,70 @@ public class DamageResistanceHandler { entityStats.put(EntityCreeper.class, new ResistanceStats().addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); itemStats.put(ModItems.jackt, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); itemStats.put(ModItems.jackt2, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); registerSet(ModItems.steel_helmet, ModItems.steel_plate, ModItems.steel_legs, ModItems.steel_boots, new ResistanceStats()); registerSet(ModItems.titanium_helmet, ModItems.titanium_plate, ModItems.titanium_legs, ModItems.titanium_boots, new ResistanceStats()); registerSet(ModItems.alloy_helmet, ModItems.alloy_plate, ModItems.alloy_legs, ModItems.alloy_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.cobalt_helmet, ModItems.cobalt_plate, ModItems.cobalt_legs, ModItems.cobalt_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.starmetal_helmet, ModItems.starmetal_plate, ModItems.starmetal_legs, ModItems.starmetal_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 3F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 3F, 0.25F) .setOther(1F, 0.1F)); registerSet(ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, new ResistanceStats() .setOther(0F, 1F)); registerSet(ModItems.dnt_helmet, ModItems.dnt_plate, ModItems.dnt_legs, ModItems.dnt_boots, new ResistanceStats()); registerSet(ModItems.cmb_helmet, ModItems.cmb_plate, ModItems.cmb_legs, ModItems.cmb_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .setOther(5F, 0.25F)); registerSet(ModItems.schrabidium_helmet, ModItems.schrabidium_plate, ModItems.schrabidium_legs, ModItems.schrabidium_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 10F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 10F, 0.65F) .setOther(5F, 0.5F)); registerSet(ModItems.robes_helmet, ModItems.robes_plate, ModItems.robes_legs, ModItems.robes_boots, new ResistanceStats()); registerSet(ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); registerSet(ModItems.steamsuit_helmet, ModItems.steamsuit_plate, ModItems.steamsuit_legs, ModItems.steamsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.25F) .addExact(DamageSource.fall.damageType, 5F, 0.25F) .setOther(0F, 0.1F)); registerSet(ModItems.dieselsuit_helmet, ModItems.dieselsuit_plate, ModItems.dieselsuit_legs, ModItems.dieselsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 1F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 1F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.15F) .setOther(0F, 0.1F)); registerSet(ModItems.t45_helmet, ModItems.t45_plate, ModItems.t45_legs, ModItems.t45_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.1F)); registerSet(ModItems.ajr_helmet, ModItems.ajr_plate, ModItems.ajr_legs, ModItems.ajr_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.ajro_helmet, ModItems.ajro_plate, ModItems.ajro_legs, ModItems.ajro_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 25F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 25F, 0.65F) .addCategory(CATEGORY_FIRE, 10F, 0.9F) .addCategory(CATEGORY_EXPLOSION, 15F, 0.25F) .addCategory(CATEGORY_ENERGY, 25F, 0.75F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(15F, 0.3F)); ResistanceStats bj = new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 2.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 10F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -197,14 +198,14 @@ public class DamageResistanceHandler { .addExact(DamageSource.fall.damageType, 5F, 0.75F) .setOther(0F, 0.1F)); registerSet(ModItems.hev_helmet, ModItems.hev_plate, ModItems.hev_legs, ModItems.hev_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.25F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.onFire.damageType, 0F, 1F) .addExact(DamageSource.fall.damageType, 10F, 0F) .setOther(2F, 0.25F)); registerSet(ModItems.bismuth_helmet, ModItems.bismuth_plate, ModItems.bismuth_legs, ModItems.bismuth_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -220,13 +221,13 @@ public class DamageResistanceHandler { .addCategory(CATEGORY_FIRE, 0F, 1F) .setOther(1000F, 1F)); registerSet(ModItems.taurun_helmet, ModItems.taurun_plate, ModItems.taurun_legs, ModItems.taurun_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0F, 0.25F) .addCategory(CATEGORY_EXPLOSION, 0F, 0.25F) .addExact(DamageSource.fall.damageType, 4F, 0.5F) .setOther(2F, 0.1F)); registerSet(ModItems.trenchmaster_helmet, ModItems.trenchmaster_plate, ModItems.trenchmaster_legs, ModItems.trenchmaster_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageClass.LASER.name(), 15F, 0.9F) @@ -443,10 +444,13 @@ public class DamageResistanceHandler { public static String typeToCategory(DamageSource source) { if(source.isExplosion()) return CATEGORY_EXPLOSION; if(source.isFireDamage()) return CATEGORY_FIRE; - if(source.isProjectile()) return CATEGORY_PROJECTILE; + if(source.isProjectile()) return CATEGORY_PHYSICAL; if(source.damageType.equals(DamageClass.LASER.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.MICROWAVE.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.SUBATOMIC.name())) return CATEGORY_ENERGY; + if(source.damageType.equals(DamageClass.ELECTRIC.name())) return CATEGORY_ENERGY; + if(source == DamageSource.cactus) return CATEGORY_PHYSICAL; + if(source instanceof EntityDamageSource) return CATEGORY_PHYSICAL; return source.damageType; } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a031be603..50aa4a009 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -509,7 +509,7 @@ damage.item=Resistenz wenn getragen: damage.category.EN=Energie damage.category.EXPL=Explosion damage.category.FIRE=Feuer -damage.category.PROJ=Projektil +damage.category.PHYS=Physisch damage.exact.drown=Ertrinken damage.exact.fall=Fallschaden damage.exact.LASER=Laser diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c5fd461eb..cb32c226e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -925,7 +925,7 @@ damage.item=Resistances when worn: damage.category.EN=Energy damage.category.EXPL=Explosion damage.category.FIRE=Fire -damage.category.PROJ=Projectile +damage.category.PHYS=Physical damage.exact.drown=Drowning damage.exact.fall=Fall damage damage.exact.LASER=Laser From 4b6cf3473d8aa70312cfb210a888f4d84881f74a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 12 Jul 2025 22:32:32 +0300 Subject: [PATCH 099/323] Save electrolyzer GUI --- .../hbm/blocks/machine/MachineElectrolyser.java | 2 +- .../machine/TileEntityElectrolyser.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index ab91cbb43..ec787564a 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -35,7 +35,7 @@ public class MachineElectrolyser extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - return this.standardOpenBehavior(world, x, y, z, player, 0); + return this.standardOpenBehavior(world, x, y, z, player, -1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 084aa7859..403e516f8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -66,6 +66,8 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public MaterialStack leftStack; public MaterialStack rightStack; public int maxMaterial = MaterialShapes.BLOCK.q(16); + + private int lastSelectedGUI = 0; public FluidTank[] tanks; @@ -248,6 +250,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn buf.writeInt(rightStack.material.id); buf.writeInt(rightStack.amount); } + buf.writeInt(lastSelectedGUI); } @Override @@ -269,6 +272,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(right) { this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); } + this.lastSelectedGUI = buf.readInt(); } public boolean canProcessFluid() { @@ -423,6 +427,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); else this.rightStack = null; for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + this.lastSelectedGUI = nbt.getInteger("lastSelectedGUI"); } @Override @@ -443,7 +448,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn nbt.setInteger("rightAmount", rightStack.amount); } for(int i = 0; i < 4; i++) tanks[i].writeToNBT(nbt, "t" + i); - + nbt.setInteger("lastSelectedGUI", this.lastSelectedGUI); } AxisAlignedBB bb = null; @@ -503,6 +508,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); return new ContainerElectrolyserMetal(player.inventory, this); } @@ -510,6 +516,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); return new GUIElectrolyserMetal(player.inventory, this); } @@ -520,8 +527,10 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { - if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); - if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); + if(data.hasKey("sgm")) lastSelectedGUI = 1; + if(data.hasKey("sgf")) lastSelectedGUI = 0; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, lastSelectedGUI, worldObj, xCoord, yCoord, zCoord); } @Override From fb32763c88397e3a87226c57fbb61066b438fbd9 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Jul 2025 11:45:17 -0500 Subject: [PATCH 100/323] Update PistonInserter.java; Fix server crash due to client-side variable. --- src/main/java/com/hbm/blocks/machine/PistonInserter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index bb33d205d..4683f1ec6 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -282,8 +282,6 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid if(this.slot != null) { BufferUtil.writeNBT(buf, slot.stackTagCompound); } - - this.turnProgress = 2; } @Override From 2841c8b67b8f459573142bbf33b1727f57159495 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 21:05:28 +0200 Subject: [PATCH 101/323] the spinniest of the fidgets CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing. --- .../inventory/gui/GUIMachineTurbineGas.java | 15 +++++++++------ .../machine/TileEntityMachineTurbineGas.java | 13 ++++++++++--- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 18254 -> 36270 bytes 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 310bc7db0..6200eefa3 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -115,15 +115,18 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.powerSliderPos == 0) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); - else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); + if(turbinegas.state == 1) { + double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); + } + else { + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); + } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index f7e3349f5..bcb00ea06 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -100,10 +100,17 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } } - if(autoMode) { //power production depending on power requirement + if(autoMode) { //power production depending on power requirement and fuel level - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); + int powerSliderTarget; + + //when low on fuel, decrease consumption linearly + if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { + powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge + } + else { + powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); + } if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 336ad59dc..d19afdb54 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -961,7 +961,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network +desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 290e3810bc5904d60a3feda9ccae75c7318be4d0..4e33cca35052cf5e838ca844047ae0e55adf1c76 100644 GIT binary patch literal 36270 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 literal 18254 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 KMNUMnLSTZkam`Ku From da2abe281dc303d4ddf8e76654e6262077429f5c Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Sun, 13 Jul 2025 14:57:43 -0500 Subject: [PATCH 102/323] add paintable network cable --- src/main/java/com/hbm/blocks/ModBlocks.java | 11 + .../BlockOpenComputersCablePaintable.java | 244 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 7 +- .../java/com/hbm/tileentity/TileMappings.java | 9 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/blocks/oc_cable_base.png | Bin 0 -> 624 bytes .../hbm/textures/blocks/oc_cable_overlay.png | Bin 0 -> 340 bytes 7 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_overlay.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5f3de7f83..01b28241f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -34,6 +34,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import cpw.mods.fml.common.Loader; import java.util.ArrayList; @@ -803,6 +804,7 @@ public class ModBlocks { public static Block radio_torch_reader; public static Block radio_torch_controller; public static Block radio_telex; + public static Block oc_cable_paintable; public static Block conveyor; public static Block conveyor_express; @@ -2340,6 +2342,10 @@ public class ModBlocks { absorber_pink = new BlockAbsorber(Material.iron, 10000F).setBlockName("absorber_pink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_pink"); decon = new BlockDecon(Material.iron).setBlockName("decon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":decon_side"); + if (Loader.isModLoaded("OpenComputers")) { + oc_cable_paintable = new BlockOpenComputersCablePaintable().setBlockName("oc_cable_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + } + volcano_core = new BlockVolcano().setBlockName("volcano_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_core"); volcano_rad_core = new BlockVolcano().setBlockName("volcano_rad_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_rad_core"); @@ -3532,6 +3538,11 @@ public class ModBlocks { GameRegistry.registerBlock(gas_explosive, gas_explosive.getUnlocalizedName()); GameRegistry.registerBlock(vacuum, vacuum.getUnlocalizedName()); + // OC Compat Items + if (Loader.isModLoaded("OpenComputers")) { + register(oc_cable_paintable); + } + //??? GameRegistry.registerBlock(crystal_virus, crystal_virus.getUnlocalizedName()); GameRegistry.registerBlock(crystal_hardened, crystal_hardened.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java new file mode 100644 index 000000000..b755006d5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -0,0 +1,244 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.TileEntityLoadedBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import li.cil.oc.api.network.Environment; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import li.cil.oc.api.network.Message; +import li.cil.oc.api.network.Node; +import li.cil.oc.api.Network; +import li.cil.oc.api.network.Visibility; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.Loader; + +public class BlockOpenComputersCablePaintable extends BlockContainer implements IToolable, IBlockMultiPass { + + @SideOnly(Side.CLIENT) protected IIcon overlay; + + public BlockOpenComputersCablePaintable() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityOpenComputersCablePaintable(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":oc_cable_base"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":oc_cable_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + if(RenderBlockMultipass.currentPass == 1) { + return this.overlay; + } else { + return pipe.block.getIcon(side, pipe.meta); + } + } + } + + return RenderBlockMultipass.currentPass == 1 ? this.overlay : this.blockIcon; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if(stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if(block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block == null) { + pipe.block = block; + pipe.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + } + } + + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) return false; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + + @Override + public int getPasses() { + return 2; + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + // WHY the fuck is this not compiling + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers")}) + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment { + + protected Node node; + protected boolean addedToNetwork = false; + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + public TileEntityOpenComputersCablePaintable() { + node = Network.newNode(this, Visibility.None).create(); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + + if(!this.getWorldObj().isRemote && !addedToNetwork) { + addedToNetwork = true; + Network.joinOrCreateNetwork(this); + } + + } + + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + + if (node != null && node.host() == this) { + node.load(nbt.getCompoundTag("oc:node")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + + if (node != null && node.host() == this) { + final NBTTagCompound nodeNbt = new NBTTagCompound(); + node.save(nodeNbt); + nbt.setTag("oc:node", nodeNbt); + } + } + + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + + // OC Cable Things + @Override + public Node node() { + return node; + } + + @Override + public void onConnect(Node node) {} + + @Override + public void onDisconnect(Node node) {} + + @Override + public void onMessage(Message message) {} + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + if (node != null) node.remove(); + } + + public void invalidate() { + super.invalidate(); + if (node != null) node.remove(); + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 67b872581..3892e6a3a 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -237,6 +237,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 1), new Object[] { "BBB", "WFW", "RRR", 'B', BE.ingot(), 'R', ModItems.coil_tungsten, 'W', CU.plateCast(), 'F', Item.getItemFromBlock(Blocks.furnace) }); addRecipeAuto(new ItemStack(ModBlocks.red_wire_coated, 16), new Object[] { "WRW", "RIR", "WRW", 'W', ModItems.plate_polymer, 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.red_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); + addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.cable_switch, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_detector, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_diode, 1), new Object[] { " Q ", "CAC", " Q ", 'Q', SI.nugget(), 'C', ModBlocks.red_cable, 'A', AL.ingot() }); @@ -410,7 +411,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.basalt_polished, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_smooth }); addRecipeAuto(new ItemStack(ModBlocks.basalt_brick, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_polished }); addRecipeAuto(new ItemStack(ModBlocks.basalt_tiles, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_brick }); - + addShapelessAuto(new ItemStack(ModBlocks.lightstone, 4), new Object[] { Blocks.stone, Blocks.stone, Blocks.stone, ModItems.powder_limestone }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.TILE.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, 0) }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.BRICKS.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, LightstoneType.TILE.ordinal()) }); @@ -442,7 +443,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_ultradeath, 4), new Object[] { "BCB", "CIC", "BCB", 'B', ModBlocks.barbed_wire, 'C', ModItems.powder_yellowcake, 'I', ModItems.nuclear_waste }); addShapelessAuto(new ItemStack(ModBlocks.sandbags, 4), new Object[] { ModItems.plate_polymer, KEY_SAND, KEY_SAND, KEY_SAND }); - + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.tape_recorder), 4), new Object[] { "TST", "SSS", 'T', W.ingot(), 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_poles), 16), new Object[] { "S S", "SSS", "S S", 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.pole_top), 1), new Object[] { "T T", "TRT", "BBB", 'T', W.ingot(), 'B', BE.ingot(), 'R', MINGRADE.ingot() }); @@ -610,7 +611,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fluid_pump, 1), new Object[] { " S ", "PGP", "IMI", 'S', STEEL.shell(), 'P', STEEL.pipe(), 'G', GRAPHITE.ingot(), 'I', STEEL.ingot(), 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 8), new Object[] { "CRC", 'C', CU.plateCast(), 'R', ANY_RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 24), new Object[] { "CRC", 'C', CU.plateWelded(), 'R', ANY_RUBBER.ingot() }); - + addRecipeAuto(new ItemStack(ModItems.template_folder, 1), new Object[] { "LPL", "BPB", "LPL", 'P', Items.paper, 'L', "dye", 'B', "dye" }); addRecipeAuto(new ItemStack(ModItems.pellet_antimatter, 1), new Object[] { "###", "###", "###", '#', ModItems.cell_antimatter }); addRecipeAuto(new ItemStack(ModItems.fluid_tank_empty, 8), new Object[] { "121", "1G1", "121", '1', AL.plate(), '2', IRON.plate(), 'G', KEY_ANYPANE }); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 1c938ab18..438b6c605 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -40,6 +40,7 @@ import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; import com.hbm.blocks.network.FluidDuctPaintableBlockExhaust.TileEntityPipeExhaustPaintable; import com.hbm.blocks.network.FluidPump.TileEntityFluidPump; import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; +import com.hbm.blocks.network.BlockOpenComputersCablePaintable.TileEntityOpenComputersCablePaintable; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.deco.*; import com.hbm.tileentity.machine.*; @@ -50,6 +51,7 @@ import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; import com.hbm.tileentity.turret.*; +import cpw.mods.fml.common.Loader; import net.minecraft.tileentity.TileEntity; @@ -451,6 +453,13 @@ public class TileMappings { put(TileEntityDroneRequester.class, "tileentity_drone_requester"); put(TileEntityRailSwitch.class, "tileentity_rail_switch"); + + // OC Compat items + boolean ocPresent = Loader.isModLoaded("OpenComputers"); + + if (ocPresent) { + put(TileEntityOpenComputersCablePaintable.class, "tileentity_oc_cable_paintable"); + } } private static void put(Class clazz, String... names) { diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..c7ab3f6fe 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6227,3 +6227,5 @@ desc.gui.upgrade.effectiveness= * §aEffectiveness§r: Stacks to level 3 desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 + +tile.oc_cable_paintable.name=Paintable Network Cable diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png new file mode 100644 index 0000000000000000000000000000000000000000..243c2da7f8f52b96ec7dba690200d6902ca3ea4d GIT binary patch literal 624 zcmV-$0+0QPP)nh*GJ9h6YW3HdHDVeE9eYiM2I|nFmv}&*K3B__eWtZ{L5& z9ihduSAnH<9qXH0XxigO#UPZ+WgKX2mEZ=(C+?QMBx2ZTUApGP*Eg%})ovtS9(mcD=%kJ~)klnBb)8}p|4|)RuMCV>&E0wANxOd|#TAUijrUFWy z8LXcfunZ9n4NzZC5HquLH301L0&>P3|zt8 z$@}U>a*|oVD+hy`dvoO(PS6G7^>bP0l+XkK De2Z3~ literal 0 HcmV?d00001 From 119b8a037b222fe8aa6d8fa54c75b22bf0826d01 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:30:34 +0200 Subject: [PATCH 103/323] Revert "the spinniest of the fidgets" This reverts commit 2841c8b67b8f459573142bbf33b1727f57159495. --- .../inventory/gui/GUIMachineTurbineGas.java | 15 ++++++--------- .../machine/TileEntityMachineTurbineGas.java | 13 +++---------- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 36270 -> 18254 bytes 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 21945ed89..eee3c7fad 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -115,18 +115,15 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.state == 1) { - double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); - } - else { - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); - } + if(turbinegas.powerSliderPos == 0) + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); + else + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index a198b14c5..0e5d6b9a1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -107,17 +107,10 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } <<<<<<< HEAD - if(autoMode) { //power production depending on power requirement and fuel level + if(autoMode) { //power production depending on power requirement - int powerSliderTarget; - - //when low on fuel, decrease consumption linearly - if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { - powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge - } - else { - powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); - } + //scales the slider proportionally to the power gauge + int powerSliderTarget = 60 - (int) (60 * power / maxPower); ======= diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ed0747f04..cb32c226e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1033,7 +1033,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank +desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 4e33cca35052cf5e838ca844047ae0e55adf1c76..290e3810bc5904d60a3feda9ccae75c7318be4d0 100644 GIT binary patch literal 18254 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 KMNUMnLSTZkam`Ku literal 36270 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 From fa6497146ac55e88e4d18aa6b2dcdf058bcb4fd7 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:43:02 +0200 Subject: [PATCH 104/323] hopefully i didn't fuck up CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing. --- .../inventory/gui/GUIMachineTurbineGas.java | 18 ++++++++------ .../machine/TileEntityMachineTurbineGas.java | 22 ++++++++---------- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 18254 -> 36270 bytes 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index eee3c7fad..241b1e6eb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -109,21 +109,24 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } @Override - public void drawScreen(int mouseX, int mouseY, float f) { +public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.powerSliderPos == 0) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); - else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); + if(turbinegas.state == 1) { + double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); + } + else { + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); + } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); @@ -146,6 +149,7 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { if(turbinegas.tanks[0].getFill() < 5000 || turbinegas.tanks[1].getFill() < 1000) this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34 + 32, 16, 16, guiLeft - 8, guiTop + 44 + 16, warning); } + @Override protected void drawGuiContainerBackgroundLayer(float iinterpolation, int x, int y) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 0e5d6b9a1..b0705734c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -105,21 +105,19 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[0].setTankType(fluid); } } -<<<<<<< HEAD - if(autoMode) { //power production depending on power requirement + if(autoMode) { //power production depending on power requirement and fuel level - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); + int powerSliderTarget; + + //when low on fuel, decrease consumption linearly + if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { + powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge + } + else { + powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); + } -======= - - if(autoMode) { //power production depending on power requirement - - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); - ->>>>>>> origin/master if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..ed0747f04 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1033,7 +1033,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network +desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 290e3810bc5904d60a3feda9ccae75c7318be4d0..4e33cca35052cf5e838ca844047ae0e55adf1c76 100644 GIT binary patch literal 36270 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 literal 18254 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 KMNUMnLSTZkam`Ku From dc042267139c33f6fbf4066637831838dd148115 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:45:05 +0200 Subject: [PATCH 105/323] fuck --- .../java/com/hbm/inventory/gui/GUIMachineTurbineGas.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 241b1e6eb..924a893c5 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -109,7 +109,7 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } @Override -public void drawScreen(int mouseX, int mouseY, float f) { + public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -124,9 +124,9 @@ public void drawScreen(int mouseX, int mouseY, float f) { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "�C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20�C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); From 982e50556bd1e078bf40183fb93250109c3ae0e4 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:47:48 +0200 Subject: [PATCH 106/323] mauricio i can't move it move it anymore AAAAAAAAAAAAAAAAAAAAA --- src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 924a893c5..87895df93 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -124,9 +124,9 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "�C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20�C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); From c83a53b62a90f13695f1690ff6bddeef9991502c Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 13 Jul 2025 23:27:29 +0200 Subject: [PATCH 107/323] ass embluh --- .../recipes/AssemblyMachineRecipes.java | 158 +- .../recipes/loader/GenericRecipes.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 1 - .../TileEntityMachineAssemblyMachine.java | 16 +- .../hbm/models/machines/assembly_machine.obj | 4082 +++++++++-------- src/main/resources/assets/hbm/sounds.json | 3 + .../hbm/sounds/block/assemblerStart.ogg | Bin 0 -> 5915 bytes .../assets/hbm/sounds/block/assemblerStop.ogg | Bin 0 -> 6581 bytes .../hbm/sounds/block/assemblerStrike1.ogg | Bin 0 -> 7855 bytes .../hbm/sounds/block/assemblerStrike2.ogg | Bin 0 -> 8532 bytes .../models/machines/assembly_machine.png | Bin 2748 -> 2825 bytes 11 files changed, 2225 insertions(+), 2037 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index fa7202ec5..629e10584 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -17,8 +17,10 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; +import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -98,12 +100,14 @@ public class AssemblyMachineRecipes extends GenericRecipes { // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); - this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) @@ -116,7 +120,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 3), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3), new OreDictStack(DURA.plate(), 4))); + this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); + // generators + this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) + .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); @@ -126,6 +144,37 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); + + // fluid tanks + this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4))); + this.register(new GenericRecipe("ass.bat9k").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_bat9000, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16))); + this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1))); + + // fusion reactor + this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) + .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); + this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) + .inputItems(new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 6), new OreDictStack(ALLOY.wireFine(), 24))); + this.register(new GenericRecipe("ass.fusionmotor").setup(400, 100).outputItems(new ItemStack(ModBlocks.fusion_motor, 1)) + .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4))); + this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) + .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); + + // watz + this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.watzcooler").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_cooler, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2))); + this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ // rancid shit mob spawners this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) @@ -137,6 +186,111 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) .inputItems(new OreDictStack(PB.nugget(), 6))); + // bombs + this.register(new GenericRecipe("ass.minenaval").setup(300, 100).outputItems(new ItemStack(ModBlocks.mine_naval, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 24))); + this.register(new GenericRecipe("ass.gadget").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_gadget, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new ComparableStack(ModItems.fins_flat, 2), new ComparableStack(ModItems.pedestal_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.littleboy").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_boy, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_BLUE, 4))); + this.register(new GenericRecipe("ass.fatman").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_man, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_YELLOW, 6))); + this.register(new GenericRecipe("ass.ivymike").setup(600, 100).outputItems(new ItemStack(ModBlocks.nuke_mike, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(AL.shell(), 4), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_LIGHTGRAY, 16))); + this.register(new GenericRecipe("ass.tsarbomba").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.nuke_tsar, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_tri_steel, 1), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_BLACK, 8))); + this.register(new GenericRecipe("ass.ninadidnothingwrong").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_prototype, 1)) + .inputItems(new ComparableStack(ModItems.dysfunctional_reactor, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.ingot_euphemium, 3), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.fleija").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_fleija, 1)) + .inputItems(new OreDictStack(AL.shell(), 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_WHITE, 4))); + this.register(new GenericRecipe("ass.solinium").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_solinium, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.n2mine").setup(200, 100).outputItems(new ItemStack(ModBlocks.nuke_n2, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GREEN, 8))); + this.register(new GenericRecipe("ass.balefirebomb").setup(400, 100).outputItems(new ItemStack(ModBlocks.nuke_fstbmb, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.customnuke").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_custom, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 4))); + this.register(new GenericRecipe("ass.levibomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.float_bomb, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); + this.register(new GenericRecipe("ass.endobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_endo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + this.register(new GenericRecipe("ass.exobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_exo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // bomb parts + this.register(new GenericRecipe("ass.explosivelenses1").setup(400, 100).outputItems(new ItemStack(ModItems.early_explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(GOLD.wireFine(), 16), new ComparableStack(ModBlocks.det_cord, 8), new OreDictStack(CU.plate(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 20), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.explosivelenses2").setup(400, 100).outputItems(new ItemStack(ModItems.explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 4), new OreDictStack(CU.plate(), 2), new ComparableStack(ModItems.ball_tatb, 16), new OreDictStack(RUBBER.ingot(), 2))); + this.register(new GenericRecipe("ass.wiring").setup(200, 100).outputItems(new ItemStack(ModItems.gadget_wireing, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(GOLD.wireFine(), 12))); + this.register(new GenericRecipe("ass.core1").setup(1_200, 100).outputItems(new ItemStack(ModItems.gadget_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 7), new OreDictStack(U238.nugget(), 3))); + this.register(new GenericRecipe("ass.boyshield").setup(200, 100).outputItems(new ItemStack(ModItems.boy_shielding, 1)) + .inputItems(new OreDictStack(OreDictManager.getReflector(), 12), new OreDictStack(STEEL.plate528(), 4))); + this.register(new GenericRecipe("ass.boytarget").setup(200, 100).outputItems(new ItemStack(ModItems.boy_target, 1)) + .inputItems(new OreDictStack(U235.nugget(), 18))); + this.register(new GenericRecipe("ass.boybullet").setup(200, 100).outputItems(new ItemStack(ModItems.boy_bullet, 1)) + .inputItems(new OreDictStack(U235.nugget(), 9))); + this.register(new GenericRecipe("ass.boypropellant").setup(200, 100).outputItems(new ItemStack(ModItems.boy_propellant, 1)) + .inputItems(new ComparableStack(ModItems.cordite, 8), new OreDictStack(IRON.plate528(), 8), new OreDictStack(AL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 4))); + this.register(new GenericRecipe("ass.boyigniter").setup(200, 100).outputItems(new ItemStack(ModItems.boy_igniter, 1)) + .inputItems(new OreDictStack(AL.shell(), 3), new OreDictStack(DURA.plateCast(), 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 16))); + this.register(new GenericRecipe("ass.manigniter").setup(200, 100).outputItems(new ItemStack(ModItems.man_igniter, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 6), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 9))); + this.register(new GenericRecipe("ass.mancore").setup(1_200, 100).outputItems(new ItemStack(ModItems.man_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 8), new OreDictStack(BE.nugget(), 2))); + this.register(new GenericRecipe("ass.mikecore").setup(1_200, 100).outputItems(new ItemStack(ModItems.mike_core, 1)) + .inputItems(new OreDictStack(U238.nugget(), 24), new OreDictStack(PB.ingot(), 6))); + this.register(new GenericRecipe("ass.mikedeut").setup(600, 100).outputItems(new ItemStack(ModItems.mike_deut, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.cell_deuterium, 10))); + this.register(new GenericRecipe("ass.mikecooler").setup(300, 100).outputItems(new ItemStack(ModItems.mike_cooling_unit, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 8), new ComparableStack(ModItems.coil_copper, 5), new ComparableStack(ModItems.coil_tungsten, 5), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.fleijaigniter").setup(200, 100).outputItems(new ItemStack(ModItems.fleija_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 6), new OreDictStack(SA326.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.fleijacore").setup(600, 100).outputItems(new ItemStack(ModItems.fleija_core, 1)) + .inputItems(new OreDictStack(U235.nugget(), 8), new OreDictStack(NP237.nugget(), 2), new OreDictStack(BE.nugget(), 4), new ComparableStack(ModItems.coil_copper, 2))); + this.register(new GenericRecipe("ass.fleijacharge").setup(300, 100).outputItems(new ItemStack(ModItems.fleija_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(SA326.plate(), 8))); + this.register(new GenericRecipe("ass.soliniumigniter").setup(200, 100).outputItems(new ItemStack(ModItems.solinium_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 4), new OreDictStack(ALLOY.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new ComparableStack(ModItems.coil_gold, 1))); + this.register(new GenericRecipe("ass.soliniumcore").setup(600, 100).outputItems(new ItemStack(ModItems.solinium_core, 1)) + .inputItems(new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1))); + this.register(new GenericRecipe("ass.soliniumcharge").setup(300, 100).outputItems(new ItemStack(ModItems.solinium_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4))); + + // grenades + this.register(new GenericRecipe("ass.incgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_fire, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2))); + this.register(new GenericRecipe("ass.shrapgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_shrapnel, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.clustergrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_cluster, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.signalflare").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_flare, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(Items.glowstone_dust, 1), new OreDictStack(AL.plate(), 2))); + this.register(new GenericRecipe("ass.electricgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_electric, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CAPACITOR.ordinal()), new OreDictStack(GOLD.plate(), 2))); + this.register(new GenericRecipe("ass.pulsegrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_pulse, 4)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(IRON.plate(), 3), new OreDictStack(MINGRADE.wireFine(), 6), new ComparableStack(Items.diamond, 1))); + this.register(new GenericRecipe("ass.plasmagrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_plasma, 2)) + .inputItems(new OreDictStack(STEEL.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.cell_deuterium, 1), new ComparableStack(ModItems.cell_tritium, 1))); + this.register(new GenericRecipe("ass.taugrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_tau, 2)) + .inputItems(new OreDictStack(PB.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.ammo_standard, 1, EnumAmmo.TAU_URANIUM))); + this.register(new GenericRecipe("ass.schrabgrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_schrabidium, 1)) + .inputItems(new ComparableStack(ModItems.grenade_flare, 1), new OreDictStack(SA326.dust(), 1), new OreDictStack(OreDictManager.getReflector(), 2))); + this.register(new GenericRecipe("ass.nukagrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_nuclear, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(STEEL.plate(), 1), new OreDictStack(PU239.nugget(), 2), new OreDictStack(MINGRADE.wireFine(), 2))); + this.register(new GenericRecipe("ass.zomggrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_zomg, 1)) + .inputItems(new ComparableStack(ModItems.plate_paa, 3), new OreDictStack(OreDictManager.getReflector(), 1), new ComparableStack(ModItems.coil_magnetized_tungsten, 3), new ComparableStack(ModItems.powder_power, 3))); + this.register(new GenericRecipe("ass.bholegrenade").setup(1_200, 100).outputItems(new ItemStack(ModItems.grenade_black_hole, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 6), new OreDictStack(OreDictManager.getReflector(), 3), new ComparableStack(ModItems.coil_magnetized_tungsten, 2), new ComparableStack(ModItems.black_hole, 1))); + // missile parts this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 6cb020bd6..4738b449a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -55,7 +55,7 @@ public abstract class GenericRecipes extends Serializab public void register(T recipe) { this.recipeOrderedList.add(recipe); - if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been reciped with a duplicate ID!"); + if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been registered with a duplicate ID!"); this.recipeNameMap.put(recipe.name, recipe); } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 67b872581..3b85c6c60 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -258,7 +258,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.capacitor_niobium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', RUBBER.ingot(), 'C', NB.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_tantalium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', TA.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_schrabidate, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', SBD.block(), 'W', STEEL.ingot() }); - //addRecipeAuto(new ItemStack(ModBlocks.machine_coal_off, 1), new Object[] { "STS", "SCS", "SFS", 'S', STEEL.ingot(), 'T', ModItems.tank_steel, 'C', MINGRADE.ingot(), 'F', Blocks.furnace }); addRecipeAuto(new ItemStack(ModBlocks.machine_wood_burner, 1), new Object[] { "PPP", "CFC", "I I" , 'P', STEEL.plate528(), 'C', ModItems.coil_copper, 'I', IRON.ingot(), 'F', Blocks.furnace}); addRecipeAuto(new ItemStack(ModBlocks.machine_turbine, 1), new Object[] { "SMS", "PTP", "SMS", 'S', STEEL.ingot(), 'T', ModItems.turbine_titanium, 'M', ModItems.coil_copper, 'P', ANY_PLASTIC.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_converter_he_rf, 1), new Object[] { "RRR", "WWW", "III", 'R', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'W', REDSTONE.dust(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 7007e54e5..508259c48 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -129,7 +129,8 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl audio = rebootAudio(audio); } audio.keepAlive(); - audio.updateVolume(this.getVolume(1F)); + audio.updatePitch(0.75F); + audio.updateVolume(this.getVolume(0.5F)); } else { if(audio != null) { @@ -145,6 +146,10 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl } else{ arm.returnToNullPos(); } + + if(!this.muffled && arm.prevAngles[3] != arm.angles[3] && arm.angles[3] == -0.75) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStrike", this.getVolume(0.5F), 1F); + } } this.prevRing = this.ring; @@ -167,12 +172,14 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl this.prevRing += 360D; } this.ringDelay = 20 + worldObj.rand.nextInt(21); + //MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); } } else { if(this.ringDelay > 0) this.ringDelay--; if(this.ringDelay <= 0) { this.ringTarget += (worldObj.rand.nextDouble() * 2 - 1) * 135; this.ringSpeed = 10D + worldObj.rand.nextDouble() * 5D; + if(!this.muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStart", this.getVolume(0.25F), 1.25F + worldObj.rand.nextFloat() * 0.25F); } } } @@ -180,7 +187,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl } @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.chemicalPlant", xCoord, yCoord, zCoord, 1F, 15F, 1.0F, 20); + return MainRegistry.proxy.getLoopedSound("hbm:block.motor", xCoord, yCoord, zCoord, 0.5F, 15F, 0.75F, 20); } @Override public void onChunkUnload() { @@ -223,12 +230,17 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); + boolean wasProcessing = this.didProcess; this.inputTank.deserialize(buf); this.outputTank.deserialize(buf); this.power = buf.readLong(); this.maxPower = buf.readLong(); this.didProcess = buf.readBoolean(); this.assemblerModule.deserialize(buf); + + if(wasProcessing && !didProcess) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); + } } @Override diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj index 52d865f16..bf0e3b1c4 100644 --- a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -1,5 +1,302 @@ # Blender v2.79 (sub 0) OBJ File: 'assembler.blend' # www.blender.org +o Head2 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 -0.000000 +v -0.125000 2.750000 -0.250000 +v 0.125000 2.750000 -0.250000 +v -0.125000 1.750000 -0.250000 +v -0.125000 1.750000 0.000000 +v 0.125000 1.750000 -0.000000 +v 0.125000 1.750000 -0.250000 +v -0.062500 2.500000 -0.250000 +v 0.062500 2.500000 -0.250000 +v -0.062500 2.500000 -0.437500 +v 0.062500 2.500000 -0.437500 +v -0.062500 2.250000 -0.437500 +v 0.062500 2.250000 -0.437500 +v -0.062500 2.250000 -0.250000 +v 0.062500 2.250000 -0.250000 +v 0.250000 2.625000 -0.093750 +v 0.250000 1.875000 -0.093750 +v 0.250000 2.625000 -0.156250 +v 0.250000 1.875000 -0.156250 +v 0.125000 2.625000 -0.093750 +v 0.125000 1.875000 -0.093750 +v 0.125000 2.625000 -0.156250 +v 0.125000 1.875000 -0.156250 +v 0.187500 2.562500 -0.093750 +v 0.187500 1.937500 -0.093750 +v 0.187500 2.562500 -0.156250 +v 0.187500 1.937500 -0.156250 +v 0.125000 2.562500 -0.093750 +v 0.125000 1.937500 -0.093750 +v 0.125000 2.562500 -0.156250 +v 0.125000 1.937500 -0.156250 +v -0.250001 2.625000 -0.156250 +v -0.250001 1.875000 -0.156250 +v -0.250001 2.625000 -0.093750 +v -0.250001 1.875000 -0.093750 +v -0.125001 2.625000 -0.156250 +v -0.125001 1.875000 -0.156250 +v -0.125001 2.625000 -0.093750 +v -0.125001 1.875000 -0.093750 +v -0.187501 2.562500 -0.156250 +v -0.187501 1.937500 -0.156250 +v -0.187501 2.562500 -0.093750 +v -0.187501 1.937500 -0.093750 +v -0.125001 2.562500 -0.156250 +v -0.125001 1.937500 -0.156250 +v -0.125001 2.562500 -0.093750 +v -0.125001 1.937500 -0.093750 +v -0.125000 2.375000 -0.562500 +v -0.000000 2.375000 -0.562500 +v -0.125000 2.286612 -0.525888 +v -0.000000 2.286612 -0.525888 +v -0.125000 2.250000 -0.437500 +v -0.000000 2.250000 -0.437500 +v -0.125000 2.286612 -0.349112 +v -0.000000 2.286612 -0.349112 +v -0.125000 2.375000 -0.312500 +v -0.000000 2.375000 -0.312500 +v -0.125000 2.463388 -0.349112 +v -0.000000 2.463388 -0.349112 +v -0.125000 2.500000 -0.437500 +v -0.000000 2.500000 -0.437500 +v -0.125000 2.463388 -0.525888 +v -0.000000 2.463388 -0.525888 +v -0.130000 1.875000 -0.234375 +v -0.130000 1.875000 -0.171875 +v -0.130000 2.062500 -0.234375 +v -0.130000 2.062500 -0.171875 +vt 0.750000 0.907407 +vt 0.723684 0.870370 +vt 0.750000 0.870370 +vt 0.750000 0.685185 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.750000 0.722222 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.694444 +vt 0.723684 0.685185 +vt 0.723684 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.710526 0.833333 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.559211 0.944444 +vt 0.460526 0.898148 +vt 0.559211 0.898148 +vt 0.723684 0.907407 +vt 0.717105 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.460526 0.944444 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +s off +f 1/1/1 4/2/1 3/3/1 +f 6/4/2 8/5/2 7/6/2 +f 2/7/3 8/8/3 4/9/3 +f 3/3/4 6/10/4 1/11/4 +f 4/2/5 5/12/5 3/3/5 +f 1/11/6 7/13/6 2/7/6 +f 10/14/1 11/15/1 9/16/1 +f 12/17/5 13/18/5 11/19/5 +f 14/20/2 15/21/2 13/22/2 +f 16/23/3 12/17/3 10/14/3 +f 13/22/4 9/24/4 11/25/4 +f 18/26/3 19/27/3 17/28/3 +f 18/26/2 24/29/2 20/30/2 +f 19/27/1 21/31/1 17/28/1 +f 25/32/4 28/33/4 26/34/4 +f 28/35/1 30/36/1 26/37/1 +f 29/38/2 27/39/2 25/40/2 +f 21/31/6 25/41/6 17/28/6 +f 23/42/5 27/39/5 31/43/5 +f 20/30/5 27/44/5 19/27/5 +f 24/29/5 28/35/5 20/30/5 +f 17/28/6 26/45/6 18/26/6 +f 22/46/6 26/47/6 30/48/6 +f 34/49/4 35/50/4 33/51/4 +f 34/49/2 40/52/2 36/53/2 +f 33/51/1 39/54/1 37/55/1 +f 41/56/3 44/57/3 42/58/3 +f 48/59/1 42/60/1 44/61/1 +f 45/62/2 43/63/2 41/64/2 +f 37/55/5 41/65/5 33/51/5 +f 39/54/6 43/63/6 47/66/6 +f 36/53/6 43/67/6 35/50/6 +f 40/52/6 44/61/6 36/53/6 +f 33/51/5 42/68/5 34/49/5 +f 38/69/5 42/70/5 46/71/5 +f 62/72/3 58/73/3 54/74/3 +f 59/75/4 61/76/4 63/77/4 +f 66/78/4 67/79/4 65/80/4 +f 1/1/1 2/81/1 4/2/1 +f 6/4/2 5/12/2 8/5/2 +f 2/7/3 7/13/3 8/8/3 +f 3/3/4 5/12/4 6/10/4 +f 4/2/5 8/5/5 5/12/5 +f 1/11/6 6/10/6 7/13/6 +f 10/14/1 12/17/1 11/15/1 +f 12/17/5 14/20/5 13/18/5 +f 14/20/2 16/23/2 15/21/2 +f 16/23/3 14/20/3 12/17/3 +f 13/22/4 15/21/4 9/24/4 +f 18/26/3 20/30/3 19/27/3 +f 18/26/2 22/46/2 24/29/2 +f 19/27/1 23/42/1 21/31/1 +f 25/32/4 27/44/4 28/33/4 +f 28/35/1 32/82/1 30/36/1 +f 29/38/2 31/43/2 27/39/2 +f 21/31/6 29/83/6 25/41/6 +f 23/42/5 19/27/5 27/39/5 +f 20/30/5 28/33/5 27/44/5 +f 24/29/5 32/82/5 28/35/5 +f 17/28/6 25/84/6 26/45/6 +f 22/46/6 18/26/6 26/47/6 +f 34/49/4 36/53/4 35/50/4 +f 34/49/2 38/69/2 40/52/2 +f 33/51/1 35/50/1 39/54/1 +f 41/56/3 43/67/3 44/57/3 +f 48/59/1 46/85/1 42/60/1 +f 45/62/2 47/66/2 43/63/2 +f 37/55/5 45/86/5 41/65/5 +f 39/54/6 35/50/6 43/63/6 +f 36/53/6 44/57/6 43/67/6 +f 40/52/6 48/59/6 44/61/6 +f 33/51/5 41/87/5 42/68/5 +f 38/69/5 34/49/5 42/70/5 +f 54/74/3 52/88/3 50/89/3 +f 50/89/3 64/90/3 62/72/3 +f 62/72/3 60/91/3 58/73/3 +f 58/73/3 56/92/3 54/74/3 +f 54/74/3 50/89/3 62/72/3 +f 63/77/4 49/93/4 51/94/4 +f 51/94/4 53/95/4 63/77/4 +f 53/95/4 55/96/4 63/77/4 +f 55/96/4 57/97/4 63/77/4 +f 57/97/4 59/75/4 63/77/4 +f 66/78/4 68/98/4 67/79/4 +s 1 +f 50/99/5 51/100/7 49/101/5 +f 52/102/7 53/103/2 51/100/7 +f 54/104/2 55/105/8 53/106/2 +f 56/107/8 57/108/6 55/105/8 +f 58/109/6 59/110/9 57/108/6 +f 60/111/9 61/112/1 59/110/9 +f 62/113/1 63/114/10 61/112/1 +f 64/115/10 49/101/5 63/114/10 +f 50/99/5 52/102/7 51/100/7 +f 52/102/7 54/116/2 53/103/2 +f 54/104/2 56/107/8 55/105/8 +f 56/107/8 58/109/6 57/108/6 +f 58/109/6 60/111/9 59/110/9 +f 60/111/9 62/113/1 61/112/1 +f 62/113/1 64/115/10 63/114/10 +f 64/115/10 50/99/5 49/101/5 o Ring v -0.000000 1.250000 -1.375000 v -0.526190 1.250000 -1.270334 @@ -195,79 +492,79 @@ vt 0.210526 0.222222 vt 0.263158 0.240741 vt 0.263158 0.222222 vt 0.210526 0.259259 -vt 0.263158 0.277778 -vt 0.217105 0.277778 +vt 0.259868 0.277778 +vt 0.213816 0.277778 vt 0.157895 0.259259 -vt 0.210526 0.277778 -vt 0.164474 0.277778 +vt 0.207237 0.277778 +vt 0.161184 0.277778 vt 0.105263 0.259259 -vt 0.157895 0.277778 -vt 0.111842 0.277778 +vt 0.154605 0.277778 +vt 0.108553 0.277778 vt 0.052632 0.259259 -vt 0.105263 0.277778 -vt 0.059211 0.277778 +vt 0.101974 0.277778 +vt 0.055921 0.277778 vt -0.000000 0.259259 -vt 0.052632 0.277778 -vt 0.006579 0.277778 +vt 0.049342 0.277778 +vt 0.003289 0.277778 vt 0.842105 0.259259 -vt 0.796053 0.277778 +vt 0.792763 0.277778 vt 0.789474 0.259259 vt 0.736842 0.259259 -vt 0.789474 0.277778 -vt 0.743421 0.277778 -vt 0.690789 0.277778 +vt 0.786184 0.277778 +vt 0.740132 0.277778 +vt 0.687500 0.277778 vt 0.684211 0.259259 -vt 0.638158 0.277778 +vt 0.634869 0.277778 vt 0.631579 0.259259 -vt 0.585526 0.277778 +vt 0.582237 0.277778 vt 0.578947 0.259259 -vt 0.532895 0.277778 +vt 0.529605 0.277778 vt 0.526316 0.259259 -vt 0.480263 0.277778 +vt 0.476974 0.277778 vt 0.473684 0.259259 -vt 0.427632 0.277778 +vt 0.424342 0.277778 vt 0.421053 0.259259 -vt 0.375000 0.277778 +vt 0.371711 0.277778 vt 0.368421 0.259259 vt 0.315789 0.259259 -vt 0.368421 0.277778 -vt 0.322368 0.277778 +vt 0.365132 0.277778 +vt 0.319079 0.277778 vt 0.263158 0.259259 -vt 0.315789 0.277778 -vt 0.269737 0.277778 +vt 0.312500 0.277778 +vt 0.266447 0.277778 vt 0.263158 0.185185 -vt 0.315789 0.148148 +vt 0.312500 0.148148 vt 0.315789 0.185185 vt 0.210526 0.185185 -vt 0.263158 0.148148 +vt 0.259868 0.148148 vt 0.157895 0.185185 -vt 0.210526 0.148148 +vt 0.207237 0.148148 vt 0.105263 0.185185 -vt 0.157895 0.148148 +vt 0.154605 0.148148 vt 0.052632 0.185185 -vt 0.105263 0.148148 +vt 0.101974 0.148148 vt 0.000000 0.185185 -vt 0.052632 0.148148 -vt 0.796053 0.148148 +vt 0.049342 0.148148 +vt 0.792763 0.148148 vt 0.842105 0.185185 vt 0.789474 0.185185 -vt 0.743421 0.148148 +vt 0.740132 0.148148 vt 0.736842 0.185185 -vt 0.690789 0.148148 +vt 0.687500 0.148148 vt 0.684211 0.185185 -vt 0.638158 0.148148 +vt 0.634869 0.148148 vt 0.631579 0.185185 -vt 0.585526 0.148148 +vt 0.582237 0.148148 vt 0.578947 0.185185 -vt 0.532895 0.148148 +vt 0.529605 0.148148 vt 0.526316 0.185185 -vt 0.480263 0.148148 +vt 0.476974 0.148148 vt 0.473684 0.185185 -vt 0.427632 0.148148 +vt 0.424342 0.148148 vt 0.421053 0.185185 -vt 0.375000 0.148148 +vt 0.371711 0.148148 vt 0.368421 0.185185 -vt 0.368421 0.148148 +vt 0.365132 0.148148 vt 0.861842 0.490741 vt 0.796053 0.518519 vt 0.796053 0.490741 @@ -281,12 +578,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.688096 0.624161 -vt 0.688096 0.598061 -vt 0.706641 0.598061 +vt 0.720395 0.629566 +vt 0.707282 0.611111 +vt 0.720395 0.592656 +vt 0.684807 0.624161 +vt 0.684807 0.598061 +vt 0.703351 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -310,12 +607,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.688096 0.624161 -vt 0.688096 0.598061 -vt 0.706641 0.598061 +vt 0.720395 0.629566 +vt 0.707282 0.611111 +vt 0.720395 0.592656 +vt 0.684807 0.624161 +vt 0.684807 0.598061 +vt 0.703351 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -327,72 +624,72 @@ vt 0.894737 0.444444 vt 0.947368 0.444444 vt 0.934211 0.462963 vt 0.842105 0.240741 -vt 0.842105 0.277778 -vt 0.736842 0.277778 -vt 0.684211 0.277778 -vt 0.631579 0.277778 -vt 0.578947 0.277778 -vt 0.526316 0.277778 -vt 0.473684 0.277778 -vt 0.421053 0.277778 -vt 0.269737 0.148148 -vt 0.217105 0.148148 -vt 0.164474 0.148148 -vt 0.111842 0.148148 -vt 0.059211 0.148148 -vt 0.006579 0.148148 -vt 0.842105 0.148148 -vt 0.789474 0.148148 -vt 0.736842 0.148148 -vt 0.684211 0.148148 -vt 0.631579 0.148148 -vt 0.578947 0.148148 -vt 0.526316 0.148148 -vt 0.473684 0.148148 -vt 0.421053 0.148148 -vt 0.322368 0.148148 +vt 0.838816 0.277778 +vt 0.733553 0.277778 +vt 0.680921 0.277778 +vt 0.628289 0.277778 +vt 0.575658 0.277778 +vt 0.523026 0.277778 +vt 0.470395 0.277778 +vt 0.417763 0.277778 +vt 0.266447 0.148148 +vt 0.213816 0.148148 +vt 0.161184 0.148148 +vt 0.108553 0.148148 +vt 0.055921 0.148148 +vt 0.003289 0.148148 +vt 0.838816 0.148148 +vt 0.786184 0.148148 +vt 0.733553 0.148148 +vt 0.680921 0.148148 +vt 0.628289 0.148148 +vt 0.575658 0.148148 +vt 0.523026 0.148148 +vt 0.470395 0.148148 +vt 0.417763 0.148148 +vt 0.319079 0.148148 vt 0.947368 0.574074 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.697369 0.592656 -vt 0.710481 0.611111 -vt 0.706641 0.624161 -vt 0.697369 0.629566 +vt 0.729667 0.598061 +vt 0.733508 0.611111 +vt 0.729667 0.624161 +vt 0.711123 0.624161 +vt 0.711123 0.598061 +vt 0.680966 0.611111 +vt 0.694079 0.592656 +vt 0.707192 0.611111 +vt 0.703351 0.624161 +vt 0.694079 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.947368 0.574074 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.697369 0.592656 -vt 0.710481 0.611111 -vt 0.706641 0.624161 -vt 0.697369 0.629566 +vt 0.729667 0.598061 +vt 0.733508 0.611111 +vt 0.729667 0.624161 +vt 0.711123 0.624161 +vt 0.711123 0.598061 +vt 0.680966 0.611111 +vt 0.694079 0.592656 +vt 0.707192 0.611111 +vt 0.703351 0.624161 +vt 0.694079 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 -vt 0.322368 0.296296 -vt 0.796053 0.296296 -vt 0.375000 0.296296 -vt 0.006579 0.296296 -vt 0.427632 0.296296 -vt 0.059211 0.296296 -vt 0.480263 0.296296 -vt 0.111842 0.296296 -vt 0.532895 0.296296 -vt 0.164474 0.296296 -vt 0.638158 0.296296 -vt 0.585526 0.296296 -vt 0.217105 0.296296 -vt 0.690789 0.296296 -vt 0.269737 0.296296 -vt 0.743421 0.296296 +vt 0.319079 0.296296 +vt 0.792763 0.296296 +vt 0.371711 0.296296 +vt 0.003289 0.296296 +vt 0.424342 0.296296 +vt 0.055921 0.296296 +vt 0.476974 0.296296 +vt 0.108553 0.296296 +vt 0.529605 0.296296 +vt 0.161184 0.296296 +vt 0.634869 0.296296 +vt 0.582237 0.296296 +vt 0.213816 0.296296 +vt 0.687500 0.296296 +vt 0.266447 0.296296 +vt 0.740132 0.296296 vt 0.763158 0.574074 vt 0.776316 0.592593 vt 0.763158 0.592593 @@ -427,22 +724,22 @@ vt 0.736842 0.592593 vt 0.736842 0.574074 vt 0.750000 0.592593 vt 0.750000 0.574074 -vt 0.368421 0.296296 -vt 0.842105 0.296296 -vt 0.421053 0.296296 -vt 0.052632 0.296296 -vt 0.473684 0.296296 -vt 0.105263 0.296296 -vt 0.526316 0.296296 -vt 0.157895 0.296296 -vt 0.578947 0.296296 -vt 0.210526 0.296296 -vt 0.684211 0.296296 -vt 0.631579 0.296296 -vt 0.263158 0.296296 -vt 0.736842 0.296296 -vt 0.315789 0.296296 -vt 0.789474 0.296296 +vt 0.365132 0.296296 +vt 0.838816 0.296296 +vt 0.417763 0.296296 +vt 0.049342 0.296296 +vt 0.470395 0.296296 +vt 0.101974 0.296296 +vt 0.523026 0.296296 +vt 0.154605 0.296296 +vt 0.575658 0.296296 +vt 0.207237 0.296296 +vt 0.680921 0.296296 +vt 0.628289 0.296296 +vt 0.259868 0.296296 +vt 0.733553 0.296296 +vt 0.312500 0.296296 +vt 0.786184 0.296296 vt 0.789474 0.574074 vt 0.776316 0.574074 vn 0.0000 1.0000 0.0000 @@ -468,299 +765,299 @@ vn 0.0000 -0.7071 0.7071 vn 0.0000 0.7071 0.7071 vn 0.0000 0.7071 -0.7071 s off -f 27/1/1 44/2/1 43/3/1 -f 28/4/1 45/5/1 44/2/1 -f 30/6/1 45/5/1 29/7/1 -f 31/8/1 46/9/1 30/6/1 -f 32/10/1 47/11/1 31/8/1 -f 17/12/1 48/13/1 32/10/1 -f 18/14/1 33/15/1 17/12/1 -f 19/16/1 34/17/1 18/14/1 -f 20/18/1 35/19/1 19/16/1 -f 21/20/1 36/21/1 20/18/1 -f 22/22/1 37/23/1 21/24/1 -f 22/22/1 39/25/1 38/26/1 -f 23/27/1 40/28/1 39/25/1 -f 24/29/1 41/30/1 40/28/1 -f 25/31/1 42/32/1 41/30/1 -f 26/33/1 43/3/1 42/32/1 -f 57/34/1 74/35/1 73/36/1 -f 56/37/1 73/38/1 72/39/1 -f 55/40/1 72/41/1 71/42/1 -f 54/43/1 71/44/1 70/45/1 -f 53/46/1 70/47/1 69/48/1 -f 53/49/1 68/50/1 52/51/1 -f 51/52/1 68/53/1 67/54/1 -f 51/52/1 66/55/1 50/56/1 -f 50/56/1 65/57/1 49/58/1 -f 49/58/1 80/59/1 64/60/1 -f 64/60/1 79/61/1 63/62/1 -f 63/62/1 78/63/1 62/64/1 -f 62/64/1 77/65/1 61/66/1 -f 61/66/1 76/67/1 60/68/1 -f 59/69/1 76/70/1 75/71/1 -f 58/72/1 75/73/1 74/74/1 -f 10/75/2 91/76/2 11/77/2 -f 9/78/2 90/79/2 10/75/2 -f 8/80/2 89/81/2 9/78/2 -f 7/82/2 88/83/2 8/80/2 -f 6/84/2 87/85/2 7/82/2 -f 5/86/2 86/87/2 6/84/2 -f 84/88/2 5/89/2 4/90/2 -f 83/91/2 4/90/2 3/92/2 -f 82/93/2 3/92/2 2/94/2 -f 81/95/2 2/94/2 1/96/2 -f 96/97/2 1/96/2 16/98/2 -f 95/99/2 16/98/2 15/100/2 -f 94/101/2 15/100/2 14/102/2 -f 93/103/2 14/102/2 13/104/2 -f 92/105/2 13/104/2 12/106/2 -f 11/77/2 92/107/2 12/106/2 -f 99/108/2 98/109/2 97/110/2 -f 103/111/1 101/112/1 102/113/1 -f 98/109/3 102/114/3 97/115/3 -f 100/116/4 103/111/4 98/109/4 -f 97/117/5 101/118/5 99/119/5 -f 99/119/6 104/120/6 100/116/6 -f 118/121/4 114/122/4 110/123/4 -f 119/124/5 107/125/5 111/126/5 -f 127/127/1 125/128/1 126/129/1 -f 122/130/6 126/129/6 121/131/6 -f 124/132/5 127/133/5 122/130/5 -f 121/131/4 125/128/4 123/134/4 -f 123/135/3 128/136/3 124/132/3 -f 131/137/2 130/138/2 129/139/2 -f 135/140/1 133/141/1 134/142/1 -f 130/138/6 134/143/6 129/144/6 -f 132/145/5 135/140/5 130/138/5 -f 129/146/4 133/147/4 131/148/4 -f 131/148/3 136/149/3 132/145/3 -f 150/150/5 146/151/5 142/152/5 -f 151/153/4 139/154/4 143/155/4 -f 159/156/1 157/157/1 158/158/1 -f 154/159/3 158/158/3 153/160/3 -f 156/161/4 159/162/4 154/159/4 -f 153/160/5 157/157/5 155/163/5 -f 155/164/6 160/165/6 156/161/6 -f 27/1/1 28/4/1 44/2/1 -f 28/4/1 29/7/1 45/5/1 -f 30/6/1 46/9/1 45/5/1 -f 31/8/1 47/11/1 46/9/1 -f 32/10/1 48/13/1 47/11/1 -f 17/12/1 33/15/1 48/13/1 -f 18/14/1 34/17/1 33/15/1 -f 19/16/1 35/19/1 34/17/1 -f 20/18/1 36/21/1 35/19/1 -f 21/20/1 37/166/1 36/21/1 -f 22/22/1 38/26/1 37/23/1 -f 22/22/1 23/27/1 39/25/1 -f 23/27/1 24/29/1 40/28/1 -f 24/29/1 25/31/1 41/30/1 -f 25/31/1 26/33/1 42/32/1 -f 26/33/1 27/1/1 43/3/1 -f 57/34/1 58/72/1 74/35/1 -f 56/37/1 57/34/1 73/38/1 -f 55/40/1 56/37/1 72/41/1 -f 54/43/1 55/40/1 71/44/1 -f 53/46/1 54/43/1 70/47/1 -f 53/49/1 69/167/1 68/50/1 -f 51/52/1 52/51/1 68/53/1 -f 51/52/1 67/168/1 66/55/1 -f 50/56/1 66/169/1 65/57/1 -f 49/58/1 65/170/1 80/59/1 -f 64/60/1 80/171/1 79/61/1 -f 63/62/1 79/172/1 78/63/1 -f 62/64/1 78/173/1 77/65/1 -f 61/66/1 77/174/1 76/67/1 -f 59/69/1 60/68/1 76/70/1 -f 58/72/1 59/69/1 75/73/1 -f 10/75/2 90/175/2 91/76/2 -f 9/78/2 89/176/2 90/79/2 -f 8/80/2 88/177/2 89/81/2 -f 7/82/2 87/178/2 88/83/2 -f 6/84/2 86/179/2 87/85/2 -f 5/86/2 85/180/2 86/87/2 -f 84/88/2 85/181/2 5/89/2 -f 83/91/2 84/182/2 4/90/2 -f 82/93/2 83/183/2 3/92/2 -f 81/95/2 82/184/2 2/94/2 -f 96/97/2 81/185/2 1/96/2 -f 95/99/2 96/186/2 16/98/2 -f 94/101/2 95/187/2 15/100/2 -f 93/103/2 94/188/2 14/102/2 -f 92/105/2 93/189/2 13/104/2 -f 11/77/2 91/190/2 92/107/2 -f 99/108/2 100/116/2 98/109/2 -f 103/111/1 104/120/1 101/112/1 -f 98/109/3 103/111/3 102/114/3 -f 100/116/4 104/120/4 103/111/4 -f 97/117/5 102/191/5 101/118/5 -f 99/119/6 101/118/6 104/120/6 -f 110/123/4 108/192/4 106/193/4 -f 106/193/4 120/194/4 110/123/4 -f 120/194/4 118/121/4 110/123/4 -f 118/121/4 116/195/4 114/122/4 -f 114/122/4 112/196/4 110/123/4 -f 119/124/5 105/197/5 107/125/5 -f 107/125/5 109/198/5 111/126/5 -f 111/126/5 113/199/5 119/124/5 -f 113/199/5 115/200/5 119/124/5 -f 115/200/5 117/201/5 119/124/5 -f 127/127/1 128/202/1 125/128/1 -f 122/130/6 127/133/6 126/129/6 -f 124/132/5 128/136/5 127/133/5 -f 121/131/4 126/129/4 125/128/4 -f 123/135/3 125/203/3 128/136/3 -f 131/137/2 132/145/2 130/138/2 -f 135/140/1 136/149/1 133/141/1 -f 130/138/6 135/140/6 134/143/6 -f 132/145/5 136/149/5 135/140/5 -f 129/146/4 134/204/4 133/147/4 -f 131/148/3 133/147/3 136/149/3 -f 142/152/5 140/205/5 138/206/5 -f 138/206/5 152/207/5 142/152/5 -f 152/207/5 150/150/5 142/152/5 -f 150/150/5 148/208/5 146/151/5 -f 146/151/5 144/209/5 142/152/5 -f 151/153/4 137/210/4 139/154/4 -f 139/154/4 141/211/4 143/155/4 -f 143/155/4 145/212/4 151/153/4 -f 145/212/4 147/213/4 151/153/4 -f 147/213/4 149/214/4 151/153/4 -f 159/156/1 160/215/1 157/157/1 -f 154/159/3 159/162/3 158/158/3 -f 156/161/4 160/165/4 159/162/4 -f 153/160/5 158/158/5 157/157/5 -f 155/164/6 157/216/6 160/165/6 +f 95/117/11 112/118/11 111/119/11 +f 96/120/11 113/121/11 112/118/11 +f 98/122/11 113/121/11 97/123/11 +f 99/124/11 114/125/11 98/122/11 +f 100/126/11 115/127/11 99/124/11 +f 85/128/11 116/129/11 100/126/11 +f 86/130/11 101/131/11 85/128/11 +f 87/132/11 102/133/11 86/130/11 +f 88/134/11 103/135/11 87/132/11 +f 89/136/11 104/137/11 88/134/11 +f 90/138/11 105/139/11 89/140/11 +f 90/138/11 107/141/11 106/142/11 +f 91/143/11 108/144/11 107/141/11 +f 92/145/11 109/146/11 108/144/11 +f 93/147/11 110/148/11 109/146/11 +f 94/149/11 111/119/11 110/148/11 +f 125/150/11 142/151/11 141/152/11 +f 124/153/11 141/154/11 140/155/11 +f 123/156/11 140/157/11 139/158/11 +f 122/159/11 139/160/11 138/161/11 +f 121/162/11 138/163/11 137/164/11 +f 121/165/11 136/166/11 120/167/11 +f 119/168/11 136/169/11 135/170/11 +f 119/168/11 134/171/11 118/172/11 +f 118/172/11 133/173/11 117/174/11 +f 117/174/11 148/175/11 132/176/11 +f 132/176/11 147/177/11 131/178/11 +f 131/178/11 146/179/11 130/180/11 +f 130/180/11 145/181/11 129/182/11 +f 129/182/11 144/183/11 128/184/11 +f 127/185/11 144/186/11 143/187/11 +f 126/188/11 143/189/11 142/190/11 +f 78/191/12 159/192/12 79/193/12 +f 77/194/12 158/195/12 78/191/12 +f 76/196/12 157/197/12 77/194/12 +f 75/198/12 156/199/12 76/196/12 +f 74/200/12 155/201/12 75/198/12 +f 73/202/12 154/203/12 74/200/12 +f 152/204/12 73/205/12 72/206/12 +f 151/207/12 72/206/12 71/208/12 +f 150/209/12 71/208/12 70/210/12 +f 149/211/12 70/210/12 69/212/12 +f 164/213/12 69/212/12 84/214/12 +f 163/215/12 84/214/12 83/216/12 +f 162/217/12 83/216/12 82/218/12 +f 161/219/12 82/218/12 81/220/12 +f 160/221/12 81/220/12 80/222/12 +f 79/193/12 160/223/12 80/222/12 +f 167/224/12 166/225/12 165/226/12 +f 171/227/11 169/228/11 170/229/11 +f 166/225/13 170/230/13 165/231/13 +f 168/232/14 171/227/14 166/225/14 +f 165/233/15 169/234/15 167/235/15 +f 167/235/16 172/236/16 168/232/16 +f 186/237/14 182/238/14 178/239/14 +f 187/240/15 175/241/15 179/242/15 +f 195/243/11 193/244/11 194/245/11 +f 190/246/16 194/245/16 189/247/16 +f 192/248/15 195/249/15 190/246/15 +f 189/247/14 193/244/14 191/250/14 +f 191/251/13 196/252/13 192/248/13 +f 199/253/12 198/254/12 197/255/12 +f 203/256/11 201/257/11 202/258/11 +f 198/254/16 202/259/16 197/260/16 +f 200/261/15 203/256/15 198/254/15 +f 197/262/14 201/263/14 199/264/14 +f 199/264/13 204/265/13 200/261/13 +f 218/266/15 214/267/15 210/268/15 +f 219/269/14 207/270/14 211/271/14 +f 227/272/11 225/273/11 226/274/11 +f 222/275/13 226/274/13 221/276/13 +f 224/277/14 227/278/14 222/275/14 +f 221/276/15 225/273/15 223/279/15 +f 223/280/16 228/281/16 224/277/16 +f 95/117/11 96/120/11 112/118/11 +f 96/120/11 97/123/11 113/121/11 +f 98/122/11 114/125/11 113/121/11 +f 99/124/11 115/127/11 114/125/11 +f 100/126/11 116/129/11 115/127/11 +f 85/128/11 101/131/11 116/129/11 +f 86/130/11 102/133/11 101/131/11 +f 87/132/11 103/135/11 102/133/11 +f 88/134/11 104/137/11 103/135/11 +f 89/136/11 105/282/11 104/137/11 +f 90/138/11 106/142/11 105/139/11 +f 90/138/11 91/143/11 107/141/11 +f 91/143/11 92/145/11 108/144/11 +f 92/145/11 93/147/11 109/146/11 +f 93/147/11 94/149/11 110/148/11 +f 94/149/11 95/117/11 111/119/11 +f 125/150/11 126/188/11 142/151/11 +f 124/153/11 125/150/11 141/154/11 +f 123/156/11 124/153/11 140/157/11 +f 122/159/11 123/156/11 139/160/11 +f 121/162/11 122/159/11 138/163/11 +f 121/165/11 137/283/11 136/166/11 +f 119/168/11 120/167/11 136/169/11 +f 119/168/11 135/284/11 134/171/11 +f 118/172/11 134/285/11 133/173/11 +f 117/174/11 133/286/11 148/175/11 +f 132/176/11 148/287/11 147/177/11 +f 131/178/11 147/288/11 146/179/11 +f 130/180/11 146/289/11 145/181/11 +f 129/182/11 145/290/11 144/183/11 +f 127/185/11 128/184/11 144/186/11 +f 126/188/11 127/185/11 143/189/11 +f 78/191/12 158/291/12 159/192/12 +f 77/194/12 157/292/12 158/195/12 +f 76/196/12 156/293/12 157/197/12 +f 75/198/12 155/294/12 156/199/12 +f 74/200/12 154/295/12 155/201/12 +f 73/202/12 153/296/12 154/203/12 +f 152/204/12 153/297/12 73/205/12 +f 151/207/12 152/298/12 72/206/12 +f 150/209/12 151/299/12 71/208/12 +f 149/211/12 150/300/12 70/210/12 +f 164/213/12 149/301/12 69/212/12 +f 163/215/12 164/302/12 84/214/12 +f 162/217/12 163/303/12 83/216/12 +f 161/219/12 162/304/12 82/218/12 +f 160/221/12 161/305/12 81/220/12 +f 79/193/12 159/306/12 160/223/12 +f 167/224/12 168/232/12 166/225/12 +f 171/227/11 172/236/11 169/228/11 +f 166/225/13 171/227/13 170/230/13 +f 168/232/14 172/236/14 171/227/14 +f 165/233/15 170/307/15 169/234/15 +f 167/235/16 169/234/16 172/236/16 +f 178/239/14 176/308/14 174/309/14 +f 174/309/14 188/310/14 178/239/14 +f 188/310/14 186/237/14 178/239/14 +f 186/237/14 184/311/14 182/238/14 +f 182/238/14 180/312/14 178/239/14 +f 187/240/15 173/313/15 175/241/15 +f 175/241/15 177/314/15 179/242/15 +f 179/242/15 181/315/15 187/240/15 +f 181/315/15 183/316/15 187/240/15 +f 183/316/15 185/317/15 187/240/15 +f 195/243/11 196/318/11 193/244/11 +f 190/246/16 195/249/16 194/245/16 +f 192/248/15 196/252/15 195/249/15 +f 189/247/14 194/245/14 193/244/14 +f 191/251/13 193/319/13 196/252/13 +f 199/253/12 200/261/12 198/254/12 +f 203/256/11 204/265/11 201/257/11 +f 198/254/16 203/256/16 202/259/16 +f 200/261/15 204/265/15 203/256/15 +f 197/262/14 202/320/14 201/263/14 +f 199/264/13 201/263/13 204/265/13 +f 210/268/15 208/321/15 206/322/15 +f 206/322/15 220/323/15 210/268/15 +f 220/323/15 218/266/15 210/268/15 +f 218/266/15 216/324/15 214/267/15 +f 214/267/15 212/325/15 210/268/15 +f 219/269/14 205/326/14 207/270/14 +f 207/270/14 209/327/14 211/271/14 +f 211/271/14 213/328/14 219/269/14 +f 213/328/14 215/329/14 219/269/14 +f 215/329/14 217/330/14 219/269/14 +f 227/272/11 228/331/11 225/273/11 +f 222/275/13 227/278/13 226/274/13 +f 224/277/14 228/281/14 227/278/14 +f 221/276/15 226/274/15 225/273/15 +f 223/280/16 225/332/16 228/281/16 s 1 -f 13/104/4 28/4/7 12/106/7 -f 6/84/8 21/24/5 5/86/5 -f 14/102/9 29/7/4 13/104/4 -f 7/82/10 22/22/8 6/84/8 -f 15/100/11 30/6/9 14/102/9 -f 8/80/12 23/27/10 7/82/10 -f 16/98/13 31/8/11 15/100/11 -f 9/78/3 24/29/12 8/80/12 -f 2/94/14 17/12/6 1/96/6 -f 1/96/6 32/10/13 16/98/13 -f 10/75/15 25/31/3 9/78/3 -f 3/92/16 18/14/14 2/94/14 -f 11/77/17 26/33/15 10/75/15 -f 4/90/18 19/16/16 3/92/16 -f 12/106/7 27/1/17 11/77/17 -f 5/89/5 20/18/18 4/90/18 -f 34/17/15 49/58/3 33/15/3 -f 33/15/3 64/60/12 48/13/12 -f 42/32/14 57/34/6 41/30/6 -f 35/19/17 50/56/15 34/17/15 -f 43/3/16 58/72/14 42/32/14 -f 36/21/7 51/52/17 35/19/17 -f 44/2/18 59/69/16 43/3/16 -f 37/166/4 52/51/7 36/21/7 -f 45/5/5 60/68/18 44/2/18 -f 38/26/9 53/46/4 37/23/4 -f 46/9/8 61/66/5 45/5/5 -f 39/25/11 54/43/9 38/26/9 -f 47/11/10 62/64/8 46/9/8 -f 40/28/13 55/40/11 39/25/11 -f 48/13/12 63/62/10 47/11/10 -f 41/30/6 56/37/13 40/28/13 -f 76/70/18 91/217/16 75/71/16 -f 69/167/4 84/218/7 68/50/7 -f 77/174/5 92/219/18 76/67/18 -f 70/47/9 85/220/4 69/48/4 -f 78/173/8 93/221/5 77/65/5 -f 71/44/11 86/222/9 70/45/9 -f 79/172/10 94/223/8 78/63/8 -f 72/41/13 87/224/11 71/42/11 -f 80/171/12 95/225/10 79/61/10 -f 73/38/6 88/226/13 72/39/13 -f 66/169/15 81/227/3 65/57/3 -f 65/170/3 96/228/12 80/59/12 -f 74/35/14 89/229/6 73/36/6 -f 67/168/17 82/230/15 66/55/15 -f 75/73/16 90/231/14 74/74/14 -f 68/53/7 83/232/17 67/54/17 -f 106/233/6 107/234/19 105/235/6 -f 108/236/19 109/237/2 107/234/19 -f 110/238/2 111/239/20 109/240/2 -f 112/241/20 113/242/3 111/239/20 -f 114/243/3 115/244/21 113/242/3 -f 116/245/21 117/246/1 115/244/21 -f 118/247/1 119/248/22 117/246/1 -f 120/249/22 105/235/6 119/248/22 -f 138/250/3 139/251/20 137/252/3 -f 139/251/20 142/253/2 141/254/2 -f 142/255/2 143/256/19 141/257/2 -f 144/258/19 145/259/6 143/256/19 -f 146/260/6 147/261/22 145/259/6 -f 148/262/22 149/263/1 147/261/22 -f 150/264/1 151/265/21 149/263/1 -f 152/266/21 137/252/3 151/265/21 -f 13/104/4 29/7/4 28/4/7 -f 6/84/8 22/22/8 21/24/5 -f 14/102/9 30/6/9 29/7/4 -f 7/82/10 23/27/10 22/22/8 -f 15/100/11 31/8/11 30/6/9 -f 8/80/12 24/29/12 23/27/10 -f 16/98/13 32/10/13 31/8/11 -f 9/78/3 25/31/3 24/29/12 -f 2/94/14 18/14/14 17/12/6 -f 1/96/6 17/12/6 32/10/13 -f 10/75/15 26/33/15 25/31/3 -f 3/92/16 19/16/16 18/14/14 -f 11/77/17 27/1/17 26/33/15 -f 4/90/18 20/18/18 19/16/16 -f 12/106/7 28/4/7 27/1/17 -f 5/89/5 21/20/5 20/18/18 -f 34/17/15 50/56/15 49/58/3 -f 33/15/3 49/58/3 64/60/12 -f 42/32/14 58/72/14 57/34/6 -f 35/19/17 51/52/17 50/56/15 -f 43/3/16 59/69/16 58/72/14 -f 36/21/7 52/51/7 51/52/17 -f 44/2/18 60/68/18 59/69/16 -f 37/166/4 53/49/4 52/51/7 -f 45/5/5 61/66/5 60/68/18 -f 38/26/9 54/43/9 53/46/4 -f 46/9/8 62/64/8 61/66/5 -f 39/25/11 55/40/11 54/43/9 -f 47/11/10 63/62/10 62/64/8 -f 40/28/13 56/37/13 55/40/11 -f 48/13/12 64/60/12 63/62/10 -f 41/30/6 57/34/6 56/37/13 -f 76/70/18 92/267/18 91/217/16 -f 69/167/4 85/268/4 84/218/7 -f 77/174/5 93/269/5 92/219/18 -f 70/47/9 86/270/9 85/220/4 -f 78/173/8 94/271/8 93/221/5 -f 71/44/11 87/272/11 86/222/9 -f 79/172/10 95/273/10 94/223/8 -f 72/41/13 88/274/13 87/224/11 -f 80/171/12 96/275/12 95/225/10 -f 73/38/6 89/276/6 88/226/13 -f 66/169/15 82/277/15 81/227/3 -f 65/170/3 81/278/3 96/228/12 -f 74/35/14 90/279/14 89/229/6 -f 67/168/17 83/280/17 82/230/15 -f 75/73/16 91/281/16 90/231/14 -f 68/53/7 84/282/7 83/232/17 -f 106/233/6 108/236/19 107/234/19 -f 108/236/19 110/283/2 109/237/2 -f 110/238/2 112/241/20 111/239/20 -f 112/241/20 114/243/3 113/242/3 -f 114/243/3 116/245/21 115/244/21 -f 116/245/21 118/247/1 117/246/1 -f 118/247/1 120/249/22 119/248/22 -f 120/249/22 106/233/6 105/235/6 -f 138/250/3 140/284/20 139/251/20 -f 139/251/20 140/284/20 142/253/2 -f 142/255/2 144/258/19 143/256/19 -f 144/258/19 146/260/6 145/259/6 -f 146/260/6 148/262/22 147/261/22 -f 148/262/22 150/264/1 149/263/1 -f 150/264/1 152/266/21 151/265/21 -f 152/266/21 138/250/3 137/252/3 +f 81/220/14 96/120/17 80/222/17 +f 74/200/18 89/140/15 73/202/15 +f 82/218/19 97/123/14 81/220/14 +f 75/198/20 90/138/18 74/200/18 +f 83/216/21 98/122/19 82/218/19 +f 76/196/22 91/143/20 75/198/20 +f 84/214/23 99/124/21 83/216/21 +f 77/194/13 92/145/22 76/196/22 +f 70/210/24 85/128/16 69/212/16 +f 69/212/16 100/126/23 84/214/23 +f 78/191/25 93/147/13 77/194/13 +f 71/208/26 86/130/24 70/210/24 +f 79/193/27 94/149/25 78/191/25 +f 72/206/28 87/132/26 71/208/26 +f 80/222/17 95/117/27 79/193/27 +f 73/205/15 88/134/28 72/206/28 +f 102/133/25 117/174/13 101/131/13 +f 101/131/13 132/176/22 116/129/22 +f 110/148/24 125/150/16 109/146/16 +f 103/135/27 118/172/25 102/133/25 +f 111/119/26 126/188/24 110/148/24 +f 104/137/17 119/168/27 103/135/27 +f 112/118/28 127/185/26 111/119/26 +f 105/282/14 120/167/17 104/137/17 +f 113/121/15 128/184/28 112/118/28 +f 106/142/19 121/162/14 105/139/14 +f 114/125/18 129/182/15 113/121/15 +f 107/141/21 122/159/19 106/142/19 +f 115/127/20 130/180/18 114/125/18 +f 108/144/23 123/156/21 107/141/21 +f 116/129/22 131/178/20 115/127/20 +f 109/146/16 124/153/23 108/144/23 +f 144/186/28 159/333/26 143/187/26 +f 137/283/14 152/334/17 136/166/17 +f 145/290/15 160/335/28 144/183/28 +f 138/163/19 153/336/14 137/164/14 +f 146/289/18 161/337/15 145/181/15 +f 139/160/21 154/338/19 138/161/19 +f 147/288/20 162/339/18 146/179/18 +f 140/157/23 155/340/21 139/158/21 +f 148/287/22 163/341/20 147/177/20 +f 141/154/16 156/342/23 140/155/23 +f 134/285/25 149/343/13 133/173/13 +f 133/286/13 164/344/22 148/175/22 +f 142/151/24 157/345/16 141/152/16 +f 135/284/27 150/346/25 134/171/25 +f 143/189/26 158/347/24 142/190/24 +f 136/169/17 151/348/27 135/170/27 +f 174/349/16 175/350/29 173/351/16 +f 176/352/29 177/353/12 175/350/29 +f 178/354/12 179/355/30 177/356/12 +f 180/357/30 181/358/13 179/355/30 +f 182/359/13 183/360/31 181/358/13 +f 184/361/31 185/362/11 183/360/31 +f 186/363/11 187/364/32 185/362/11 +f 188/365/32 173/351/16 187/364/32 +f 206/366/13 207/367/30 205/368/13 +f 207/367/30 210/369/12 209/370/12 +f 210/371/12 211/372/29 209/373/12 +f 212/374/29 213/375/16 211/372/29 +f 214/376/16 215/377/32 213/375/16 +f 216/378/32 217/379/11 215/377/32 +f 218/380/11 219/381/31 217/379/11 +f 220/382/31 205/368/13 219/381/31 +f 81/220/14 97/123/14 96/120/17 +f 74/200/18 90/138/18 89/140/15 +f 82/218/19 98/122/19 97/123/14 +f 75/198/20 91/143/20 90/138/18 +f 83/216/21 99/124/21 98/122/19 +f 76/196/22 92/145/22 91/143/20 +f 84/214/23 100/126/23 99/124/21 +f 77/194/13 93/147/13 92/145/22 +f 70/210/24 86/130/24 85/128/16 +f 69/212/16 85/128/16 100/126/23 +f 78/191/25 94/149/25 93/147/13 +f 71/208/26 87/132/26 86/130/24 +f 79/193/27 95/117/27 94/149/25 +f 72/206/28 88/134/28 87/132/26 +f 80/222/17 96/120/17 95/117/27 +f 73/205/15 89/136/15 88/134/28 +f 102/133/25 118/172/25 117/174/13 +f 101/131/13 117/174/13 132/176/22 +f 110/148/24 126/188/24 125/150/16 +f 103/135/27 119/168/27 118/172/25 +f 111/119/26 127/185/26 126/188/24 +f 104/137/17 120/167/17 119/168/27 +f 112/118/28 128/184/28 127/185/26 +f 105/282/14 121/165/14 120/167/17 +f 113/121/15 129/182/15 128/184/28 +f 106/142/19 122/159/19 121/162/14 +f 114/125/18 130/180/18 129/182/15 +f 107/141/21 123/156/21 122/159/19 +f 115/127/20 131/178/20 130/180/18 +f 108/144/23 124/153/23 123/156/21 +f 116/129/22 132/176/22 131/178/20 +f 109/146/16 125/150/16 124/153/23 +f 144/186/28 160/383/28 159/333/26 +f 137/283/14 153/384/14 152/334/17 +f 145/290/15 161/385/15 160/335/28 +f 138/163/19 154/386/19 153/336/14 +f 146/289/18 162/387/18 161/337/15 +f 139/160/21 155/388/21 154/338/19 +f 147/288/20 163/389/20 162/339/18 +f 140/157/23 156/390/23 155/340/21 +f 148/287/22 164/391/22 163/341/20 +f 141/154/16 157/392/16 156/342/23 +f 134/285/25 150/393/25 149/343/13 +f 133/286/13 149/394/13 164/344/22 +f 142/151/24 158/395/24 157/345/16 +f 135/284/27 151/396/27 150/346/25 +f 143/189/26 159/397/26 158/347/24 +f 136/169/17 152/398/17 151/348/27 +f 174/349/16 176/352/29 175/350/29 +f 176/352/29 178/399/12 177/353/12 +f 178/354/12 180/357/30 179/355/30 +f 180/357/30 182/359/13 181/358/13 +f 182/359/13 184/361/31 183/360/31 +f 184/361/31 186/363/11 185/362/11 +f 186/363/11 188/365/32 187/364/32 +f 188/365/32 174/349/16 173/351/16 +f 206/366/13 208/400/30 207/367/30 +f 207/367/30 208/400/30 210/369/12 +f 210/371/12 212/374/29 211/372/29 +f 212/374/29 214/376/16 213/375/16 +f 214/376/16 216/378/32 215/377/32 +f 216/378/32 218/380/11 217/379/11 +f 218/380/11 220/382/31 219/381/31 +f 220/382/31 206/366/13 205/368/13 o ArmLower1 v 0.031250 1.625000 0.875000 v 0.093750 1.625000 0.875000 @@ -891,71 +1188,71 @@ vn 0.0000 0.7071 -0.7071 vn 0.0000 1.0000 -0.0000 vn 0.0000 0.7071 0.7071 s off -f 163/285/23 165/286/23 164/287/23 -f 162/288/24 166/289/24 163/285/24 -f 161/290/25 168/291/25 162/292/25 -f 164/287/26 167/293/26 161/290/26 -f 182/294/26 178/295/26 174/296/26 -f 183/297/24 171/298/24 175/299/24 -f 198/300/26 194/301/26 190/302/26 -f 195/303/24 197/304/24 199/305/24 -f 163/285/23 166/289/23 165/286/23 -f 162/288/24 168/306/24 166/289/24 -f 161/290/25 167/293/25 168/291/25 -f 164/287/26 165/286/26 167/293/26 -f 174/296/26 172/307/26 170/308/26 -f 170/308/26 184/309/26 174/296/26 -f 184/309/26 182/294/26 174/296/26 -f 182/294/26 180/310/26 178/295/26 -f 178/295/26 176/311/26 174/296/26 -f 183/297/24 169/312/24 171/298/24 -f 171/298/24 173/313/24 175/299/24 -f 175/299/24 177/314/24 183/297/24 -f 177/314/24 179/315/24 183/297/24 -f 179/315/24 181/316/24 183/297/24 -f 190/302/26 188/317/26 186/318/26 -f 186/318/26 200/319/26 198/300/26 -f 198/300/26 196/320/26 194/301/26 -f 194/301/26 192/321/26 190/302/26 -f 190/302/26 186/318/26 198/300/26 -f 199/305/24 185/322/24 187/323/24 -f 187/323/24 189/324/24 199/305/24 -f 189/324/24 191/325/24 199/305/24 -f 191/325/24 193/326/24 199/305/24 -f 193/326/24 195/303/24 199/305/24 +f 231/401/33 233/402/33 232/403/33 +f 230/404/34 234/405/34 231/401/34 +f 229/406/35 236/407/35 230/408/35 +f 232/403/36 235/409/36 229/406/36 +f 250/410/36 246/411/36 242/412/36 +f 251/413/34 239/414/34 243/415/34 +f 266/416/36 262/417/36 258/418/36 +f 263/419/34 265/420/34 267/421/34 +f 231/401/33 234/405/33 233/402/33 +f 230/404/34 236/422/34 234/405/34 +f 229/406/35 235/409/35 236/407/35 +f 232/403/36 233/402/36 235/409/36 +f 242/412/36 240/423/36 238/424/36 +f 238/424/36 252/425/36 242/412/36 +f 252/425/36 250/410/36 242/412/36 +f 250/410/36 248/426/36 246/411/36 +f 246/411/36 244/427/36 242/412/36 +f 251/413/34 237/428/34 239/414/34 +f 239/414/34 241/429/34 243/415/34 +f 243/415/34 245/430/34 251/413/34 +f 245/430/34 247/431/34 251/413/34 +f 247/431/34 249/432/34 251/413/34 +f 258/418/36 256/433/36 254/434/36 +f 254/434/36 268/435/36 266/416/36 +f 266/416/36 264/436/36 262/417/36 +f 262/417/36 260/437/36 258/418/36 +f 258/418/36 254/434/36 266/416/36 +f 267/421/34 253/438/34 255/439/34 +f 255/439/34 257/440/34 267/421/34 +f 257/440/34 259/441/34 267/421/34 +f 259/441/34 261/442/34 267/421/34 +f 261/442/34 263/419/34 267/421/34 s 1 -f 170/327/23 171/328/27 169/329/23 -f 172/330/27 173/331/28 171/328/27 -f 174/332/28 175/333/29 173/334/28 -f 176/335/29 177/336/25 175/333/29 -f 178/337/25 179/338/30 177/336/25 -f 180/339/30 181/340/31 179/338/30 -f 182/341/31 183/342/32 181/340/31 -f 184/343/32 169/329/23 183/342/32 -f 186/344/23 187/345/27 185/346/23 -f 188/347/27 189/348/28 187/345/27 -f 190/349/28 191/350/29 189/351/28 -f 192/352/29 193/353/25 191/350/29 -f 194/354/25 195/355/30 193/353/25 -f 195/355/30 198/356/31 197/357/31 -f 198/356/31 199/358/32 197/357/31 -f 200/359/32 185/346/23 199/358/32 -f 170/327/23 172/330/27 171/328/27 -f 172/330/27 174/360/28 173/331/28 -f 174/332/28 176/335/29 175/333/29 -f 176/335/29 178/337/25 177/336/25 -f 178/337/25 180/339/30 179/338/30 -f 180/339/30 182/341/31 181/340/31 -f 182/341/31 184/343/32 183/342/32 -f 184/343/32 170/327/23 169/329/23 -f 186/344/23 188/347/27 187/345/27 -f 188/347/27 190/361/28 189/348/28 -f 190/349/28 192/352/29 191/350/29 -f 192/352/29 194/354/25 193/353/25 -f 194/354/25 196/362/30 195/355/30 -f 195/355/30 196/362/30 198/356/31 -f 198/356/31 200/359/32 199/358/32 -f 200/359/32 186/344/23 185/346/23 +f 238/443/33 239/444/37 237/445/33 +f 240/446/37 241/447/38 239/444/37 +f 242/448/38 243/449/39 241/450/38 +f 244/451/39 245/452/35 243/449/39 +f 246/453/35 247/454/40 245/452/35 +f 248/455/40 249/456/41 247/454/40 +f 250/457/41 251/458/42 249/456/41 +f 252/459/42 237/445/33 251/458/42 +f 254/460/33 255/461/37 253/462/33 +f 256/463/37 257/464/38 255/461/37 +f 258/465/38 259/466/39 257/467/38 +f 260/468/39 261/469/35 259/466/39 +f 262/470/35 263/471/40 261/469/35 +f 263/471/40 266/472/41 265/473/41 +f 266/472/41 267/474/42 265/473/41 +f 268/475/42 253/462/33 267/474/42 +f 238/443/33 240/446/37 239/444/37 +f 240/446/37 242/476/38 241/447/38 +f 242/448/38 244/451/39 243/449/39 +f 244/451/39 246/453/35 245/452/35 +f 246/453/35 248/455/40 247/454/40 +f 248/455/40 250/457/41 249/456/41 +f 250/457/41 252/459/42 251/458/42 +f 252/459/42 238/443/33 237/445/33 +f 254/460/33 256/463/37 255/461/37 +f 256/463/37 258/477/38 257/464/38 +f 258/465/38 260/468/39 259/466/39 +f 260/468/39 262/470/35 261/469/35 +f 262/470/35 264/478/40 263/471/40 +f 263/471/40 264/478/40 266/472/41 +f 266/472/41 268/475/42 267/474/42 +f 268/475/42 254/460/33 253/462/33 o ArmLower2 v -0.031250 1.625000 -0.875000 v -0.093750 1.625000 -0.875000 @@ -1086,71 +1383,71 @@ vn 0.0000 0.7071 0.7071 vn 0.0000 1.0000 0.0000 vn 0.0000 0.7071 -0.7071 s off -f 203/363/33 205/364/33 204/365/33 -f 202/366/34 206/367/34 203/363/34 -f 201/368/35 208/369/35 202/370/35 -f 204/365/36 207/371/36 201/368/36 -f 222/372/36 218/373/36 214/374/36 -f 223/375/34 211/376/34 215/377/34 -f 238/378/36 234/379/36 230/380/36 -f 235/381/34 237/382/34 239/383/34 -f 203/363/33 206/367/33 205/364/33 -f 202/366/34 208/384/34 206/367/34 -f 201/368/35 207/371/35 208/369/35 -f 204/365/36 205/364/36 207/371/36 -f 214/374/36 212/385/36 210/386/36 -f 210/386/36 224/387/36 214/374/36 -f 224/387/36 222/372/36 214/374/36 -f 222/372/36 220/388/36 218/373/36 -f 218/373/36 216/389/36 214/374/36 -f 223/375/34 209/390/34 211/376/34 -f 211/376/34 213/391/34 215/377/34 -f 215/377/34 217/392/34 223/375/34 -f 217/392/34 219/393/34 223/375/34 -f 219/393/34 221/394/34 223/375/34 -f 230/380/36 228/395/36 226/396/36 -f 226/396/36 240/397/36 238/378/36 -f 238/378/36 236/398/36 234/379/36 -f 234/379/36 232/399/36 230/380/36 -f 230/380/36 226/396/36 238/378/36 -f 239/383/34 225/400/34 227/401/34 -f 227/401/34 229/402/34 239/383/34 -f 229/402/34 231/403/34 239/383/34 -f 231/403/34 233/404/34 239/383/34 -f 233/404/34 235/381/34 239/383/34 +f 271/479/43 273/480/43 272/481/43 +f 270/482/44 274/483/44 271/479/44 +f 269/484/45 276/485/45 270/486/45 +f 272/481/46 275/487/46 269/484/46 +f 290/488/46 286/489/46 282/490/46 +f 291/491/44 279/492/44 283/493/44 +f 306/494/46 302/495/46 298/496/46 +f 303/497/44 305/498/44 307/499/44 +f 271/479/43 274/483/43 273/480/43 +f 270/482/44 276/500/44 274/483/44 +f 269/484/45 275/487/45 276/485/45 +f 272/481/46 273/480/46 275/487/46 +f 282/490/46 280/501/46 278/502/46 +f 278/502/46 292/503/46 282/490/46 +f 292/503/46 290/488/46 282/490/46 +f 290/488/46 288/504/46 286/489/46 +f 286/489/46 284/505/46 282/490/46 +f 291/491/44 277/506/44 279/492/44 +f 279/492/44 281/507/44 283/493/44 +f 283/493/44 285/508/44 291/491/44 +f 285/508/44 287/509/44 291/491/44 +f 287/509/44 289/510/44 291/491/44 +f 298/496/46 296/511/46 294/512/46 +f 294/512/46 308/513/46 306/494/46 +f 306/494/46 304/514/46 302/495/46 +f 302/495/46 300/515/46 298/496/46 +f 298/496/46 294/512/46 306/494/46 +f 307/499/44 293/516/44 295/517/44 +f 295/517/44 297/518/44 307/499/44 +f 297/518/44 299/519/44 307/499/44 +f 299/519/44 301/520/44 307/499/44 +f 301/520/44 303/497/44 307/499/44 s 1 -f 210/405/33 211/406/37 209/407/33 -f 212/408/37 213/409/38 211/406/37 -f 214/410/38 215/411/39 213/412/38 -f 216/413/39 217/414/35 215/411/39 -f 218/415/35 219/416/40 217/414/35 -f 220/417/40 221/418/41 219/416/40 -f 222/419/41 223/420/42 221/418/41 -f 224/421/42 209/407/33 223/420/42 -f 226/422/33 227/423/37 225/424/33 -f 228/425/37 229/426/38 227/423/37 -f 230/427/38 231/428/39 229/429/38 -f 232/430/39 233/431/35 231/428/39 -f 234/432/35 235/433/40 233/431/35 -f 236/434/40 237/435/41 235/433/40 -f 238/436/41 239/437/42 237/435/41 -f 240/438/42 225/424/33 239/437/42 -f 210/405/33 212/408/37 211/406/37 -f 212/408/37 214/439/38 213/409/38 -f 214/410/38 216/413/39 215/411/39 -f 216/413/39 218/415/35 217/414/35 -f 218/415/35 220/417/40 219/416/40 -f 220/417/40 222/419/41 221/418/41 -f 222/419/41 224/421/42 223/420/42 -f 224/421/42 210/405/33 209/407/33 -f 226/422/33 228/425/37 227/423/37 -f 228/425/37 230/440/38 229/426/38 -f 230/427/38 232/430/39 231/428/39 -f 232/430/39 234/432/35 233/431/35 -f 234/432/35 236/434/40 235/433/40 -f 236/434/40 238/436/41 237/435/41 -f 238/436/41 240/438/42 239/437/42 -f 240/438/42 226/422/33 225/424/33 +f 278/521/43 279/522/47 277/523/43 +f 280/524/47 281/525/48 279/522/47 +f 282/526/48 283/527/49 281/528/48 +f 284/529/49 285/530/45 283/527/49 +f 286/531/45 287/532/50 285/530/45 +f 288/533/50 289/534/51 287/532/50 +f 290/535/51 291/536/52 289/534/51 +f 292/537/52 277/523/43 291/536/52 +f 294/538/43 295/539/47 293/540/43 +f 296/541/47 297/542/48 295/539/47 +f 298/543/48 299/544/49 297/545/48 +f 300/546/49 301/547/45 299/544/49 +f 302/548/45 303/549/50 301/547/45 +f 304/550/50 305/551/51 303/549/50 +f 306/552/51 307/553/52 305/551/51 +f 308/554/52 293/540/43 307/553/52 +f 278/521/43 280/524/47 279/522/47 +f 280/524/47 282/555/48 281/525/48 +f 282/526/48 284/529/49 283/527/49 +f 284/529/49 286/531/45 285/530/45 +f 286/531/45 288/533/50 287/532/50 +f 288/533/50 290/535/51 289/534/51 +f 290/535/51 292/537/52 291/536/52 +f 292/537/52 278/521/43 277/523/43 +f 294/538/43 296/541/47 295/539/47 +f 296/541/47 298/556/48 297/542/48 +f 298/543/48 300/546/49 299/544/49 +f 300/546/49 302/548/45 301/547/45 +f 302/548/45 304/550/50 303/549/50 +f 304/550/50 306/552/51 305/551/51 +f 306/552/51 308/554/52 307/553/52 +f 308/554/52 294/538/43 293/540/43 o ArmUpper2 v 0.031250 2.312500 -0.937500 v 0.093750 2.312500 -0.937500 @@ -1281,71 +1578,71 @@ vn 0.0000 0.0000 1.0000 vn 0.0000 0.7071 0.7071 vn 0.0000 0.7071 -0.7071 s off -f 243/441/43 248/442/43 244/443/43 -f 242/444/44 246/445/44 241/446/44 -f 244/443/45 247/447/45 242/444/45 -f 241/448/46 245/449/46 243/441/46 -f 262/450/45 258/451/45 254/452/45 -f 259/453/46 261/454/46 263/455/46 -f 278/456/45 274/457/45 270/458/45 -f 275/459/46 277/460/46 279/461/46 -f 243/441/43 245/449/43 248/442/43 -f 242/444/44 247/447/44 246/445/44 -f 244/443/45 248/442/45 247/447/45 -f 241/448/46 246/462/46 245/449/46 -f 254/452/45 252/463/45 250/464/45 -f 250/464/45 264/465/45 262/450/45 -f 262/450/45 260/466/45 258/451/45 -f 258/451/45 256/467/45 254/452/45 -f 254/452/45 250/464/45 262/450/45 -f 263/455/46 249/468/46 251/469/46 -f 251/469/46 253/470/46 263/455/46 -f 253/470/46 255/471/46 263/455/46 -f 255/471/46 257/472/46 263/455/46 -f 257/472/46 259/453/46 263/455/46 -f 270/458/45 268/473/45 266/474/45 -f 266/474/45 280/475/45 278/456/45 -f 278/456/45 276/476/45 274/457/45 -f 274/457/45 272/477/45 270/458/45 -f 270/458/45 266/474/45 278/456/45 -f 279/461/46 265/478/46 267/479/46 -f 267/479/46 269/480/46 279/461/46 -f 269/480/46 271/481/46 279/461/46 -f 271/481/46 273/482/46 279/461/46 -f 273/482/46 275/459/46 279/461/46 +f 311/557/53 316/558/53 312/559/53 +f 310/560/54 314/561/54 309/562/54 +f 312/559/55 315/563/55 310/560/55 +f 309/564/56 313/565/56 311/557/56 +f 330/566/55 326/567/55 322/568/55 +f 327/569/56 329/570/56 331/571/56 +f 346/572/55 342/573/55 338/574/55 +f 343/575/56 345/576/56 347/577/56 +f 311/557/53 313/565/53 316/558/53 +f 310/560/54 315/563/54 314/561/54 +f 312/559/55 316/558/55 315/563/55 +f 309/564/56 314/578/56 313/565/56 +f 322/568/55 320/579/55 318/580/55 +f 318/580/55 332/581/55 330/566/55 +f 330/566/55 328/582/55 326/567/55 +f 326/567/55 324/583/55 322/568/55 +f 322/568/55 318/580/55 330/566/55 +f 331/571/56 317/584/56 319/585/56 +f 319/585/56 321/586/56 331/571/56 +f 321/586/56 323/587/56 331/571/56 +f 323/587/56 325/588/56 331/571/56 +f 325/588/56 327/569/56 331/571/56 +f 338/574/55 336/589/55 334/590/55 +f 334/590/55 348/591/55 346/572/55 +f 346/572/55 344/592/55 342/573/55 +f 342/573/55 340/593/55 338/574/55 +f 338/574/55 334/590/55 346/572/55 +f 347/577/56 333/594/56 335/595/56 +f 335/595/56 337/596/56 347/577/56 +f 337/596/56 339/597/56 347/577/56 +f 339/597/56 341/598/56 347/577/56 +f 341/598/56 343/575/56 347/577/56 s 1 -f 250/483/47 251/484/48 249/485/47 -f 252/486/48 253/487/44 251/484/48 -f 254/488/44 255/489/49 253/490/44 -f 256/491/49 257/492/50 255/489/49 -f 258/493/50 259/494/51 257/492/50 -f 260/495/51 261/496/43 259/494/51 -f 262/497/43 263/498/52 261/496/43 -f 264/499/52 249/485/47 263/498/52 -f 266/500/47 267/501/48 265/502/47 -f 268/503/48 269/504/44 267/501/48 -f 270/505/44 271/506/49 269/507/44 -f 272/508/49 273/509/50 271/506/49 -f 274/510/50 275/511/51 273/509/50 -f 276/512/51 277/513/43 275/511/51 -f 278/514/43 279/515/52 277/513/43 -f 280/516/52 265/502/47 279/515/52 -f 250/483/47 252/486/48 251/484/48 -f 252/486/48 254/517/44 253/487/44 -f 254/488/44 256/491/49 255/489/49 -f 256/491/49 258/493/50 257/492/50 -f 258/493/50 260/495/51 259/494/51 -f 260/495/51 262/497/43 261/496/43 -f 262/497/43 264/499/52 263/498/52 -f 264/499/52 250/483/47 249/485/47 -f 266/500/47 268/503/48 267/501/48 -f 268/503/48 270/518/44 269/504/44 -f 270/505/44 272/508/49 271/506/49 -f 272/508/49 274/510/50 273/509/50 -f 274/510/50 276/512/51 275/511/51 -f 276/512/51 278/514/43 277/513/43 -f 278/514/43 280/516/52 279/515/52 -f 280/516/52 266/500/47 265/502/47 +f 318/599/57 319/600/58 317/601/57 +f 320/602/58 321/603/54 319/600/58 +f 322/604/54 323/605/59 321/606/54 +f 324/607/59 325/608/60 323/605/59 +f 326/609/60 327/610/61 325/608/60 +f 328/611/61 329/612/53 327/610/61 +f 330/613/53 331/614/62 329/612/53 +f 332/615/62 317/601/57 331/614/62 +f 334/616/57 335/617/58 333/618/57 +f 336/619/58 337/620/54 335/617/58 +f 338/621/54 339/622/59 337/623/54 +f 340/624/59 341/625/60 339/622/59 +f 342/626/60 343/627/61 341/625/60 +f 344/628/61 345/629/53 343/627/61 +f 346/630/53 347/631/62 345/629/53 +f 348/632/62 333/618/57 347/631/62 +f 318/599/57 320/602/58 319/600/58 +f 320/602/58 322/633/54 321/603/54 +f 322/604/54 324/607/59 323/605/59 +f 324/607/59 326/609/60 325/608/60 +f 326/609/60 328/611/61 327/610/61 +f 328/611/61 330/613/53 329/612/53 +f 330/613/53 332/615/62 331/614/62 +f 332/615/62 318/599/57 317/601/57 +f 334/616/57 336/619/58 335/617/58 +f 336/619/58 338/634/54 337/620/54 +f 338/621/54 340/624/59 339/622/59 +f 340/624/59 342/626/60 341/625/60 +f 342/626/60 344/628/61 343/627/61 +f 344/628/61 346/630/53 345/629/53 +f 346/630/53 348/632/62 347/631/62 +f 348/632/62 334/616/57 333/618/57 o ArmUpper1 v -0.031250 2.312500 0.937500 v -0.093750 2.312500 0.937500 @@ -1476,358 +1773,71 @@ vn 0.0000 0.0000 -1.0000 vn 0.0000 0.7071 -0.7071 vn 0.0000 0.7071 0.7071 s off -f 283/519/53 288/520/53 284/521/53 -f 282/522/54 286/523/54 281/524/54 -f 284/521/55 287/525/55 282/522/55 -f 281/526/56 285/527/56 283/519/56 -f 302/528/55 298/529/55 294/530/55 -f 299/531/56 301/532/56 303/533/56 -f 318/534/55 314/535/55 310/536/55 -f 315/537/56 317/538/56 319/539/56 -f 283/519/53 285/527/53 288/520/53 -f 282/522/54 287/525/54 286/523/54 -f 284/521/55 288/520/55 287/525/55 -f 281/526/56 286/540/56 285/527/56 -f 294/530/55 292/541/55 290/542/55 -f 290/542/55 304/543/55 302/528/55 -f 302/528/55 300/544/55 298/529/55 -f 298/529/55 296/545/55 294/530/55 -f 294/530/55 290/542/55 302/528/55 -f 303/533/56 289/546/56 291/547/56 -f 291/547/56 293/548/56 303/533/56 -f 293/548/56 295/549/56 303/533/56 -f 295/549/56 297/550/56 303/533/56 -f 297/550/56 299/531/56 303/533/56 -f 310/536/55 308/551/55 306/552/55 -f 306/552/55 320/553/55 318/534/55 -f 318/534/55 316/554/55 314/535/55 -f 314/535/55 312/555/55 310/536/55 -f 310/536/55 306/552/55 318/534/55 -f 319/539/56 305/556/56 307/557/56 -f 307/557/56 309/558/56 319/539/56 -f 309/558/56 311/559/56 319/539/56 -f 311/559/56 313/560/56 319/539/56 -f 313/560/56 315/537/56 319/539/56 +f 351/635/63 356/636/63 352/637/63 +f 350/638/64 354/639/64 349/640/64 +f 352/637/65 355/641/65 350/638/65 +f 349/642/66 353/643/66 351/635/66 +f 370/644/65 366/645/65 362/646/65 +f 367/647/66 369/648/66 371/649/66 +f 386/650/65 382/651/65 378/652/65 +f 383/653/66 385/654/66 387/655/66 +f 351/635/63 353/643/63 356/636/63 +f 350/638/64 355/641/64 354/639/64 +f 352/637/65 356/636/65 355/641/65 +f 349/642/66 354/656/66 353/643/66 +f 362/646/65 360/657/65 358/658/65 +f 358/658/65 372/659/65 370/644/65 +f 370/644/65 368/660/65 366/645/65 +f 366/645/65 364/661/65 362/646/65 +f 362/646/65 358/658/65 370/644/65 +f 371/649/66 357/662/66 359/663/66 +f 359/663/66 361/664/66 371/649/66 +f 361/664/66 363/665/66 371/649/66 +f 363/665/66 365/666/66 371/649/66 +f 365/666/66 367/647/66 371/649/66 +f 378/652/65 376/667/65 374/668/65 +f 374/668/65 388/669/65 386/650/65 +f 386/650/65 384/670/65 382/651/65 +f 382/651/65 380/671/65 378/652/65 +f 378/652/65 374/668/65 386/650/65 +f 387/655/66 373/672/66 375/673/66 +f 375/673/66 377/674/66 387/655/66 +f 377/674/66 379/675/66 387/655/66 +f 379/675/66 381/676/66 387/655/66 +f 381/676/66 383/653/66 387/655/66 s 1 -f 290/561/57 291/562/58 289/563/57 -f 291/562/58 294/564/54 293/565/54 -f 294/566/54 295/567/59 293/568/54 -f 296/569/59 297/570/60 295/567/59 -f 298/571/60 299/572/61 297/570/60 -f 300/573/61 301/574/53 299/572/61 -f 302/575/53 303/576/62 301/574/53 -f 304/577/62 289/563/57 303/576/62 -f 306/578/57 307/579/58 305/580/57 -f 308/581/58 309/582/54 307/579/58 -f 310/583/54 311/584/59 309/585/54 -f 311/584/59 314/586/60 313/587/60 -f 314/586/60 315/588/61 313/587/60 -f 315/588/61 318/589/53 317/590/53 -f 318/589/53 319/591/62 317/590/53 -f 320/592/62 305/580/57 319/591/62 -f 290/561/57 292/593/58 291/562/58 -f 291/562/58 292/593/58 294/564/54 -f 294/566/54 296/569/59 295/567/59 -f 296/569/59 298/571/60 297/570/60 -f 298/571/60 300/573/61 299/572/61 -f 300/573/61 302/575/53 301/574/53 -f 302/575/53 304/577/62 303/576/62 -f 304/577/62 290/561/57 289/563/57 -f 306/578/57 308/581/58 307/579/58 -f 308/581/58 310/594/54 309/582/54 -f 310/583/54 312/595/59 311/584/59 -f 311/584/59 312/595/59 314/586/60 -f 314/586/60 316/596/61 315/588/61 -f 315/588/61 316/596/61 318/589/53 -f 318/589/53 320/592/62 319/591/62 -f 320/592/62 306/578/57 305/580/57 -o Head2 -v -0.125000 2.750000 0.000000 -v 0.125000 2.750000 0.000000 -v -0.125000 2.750000 -0.250000 -v 0.125000 2.750000 -0.250000 -v -0.125000 1.750000 -0.250000 -v -0.125000 1.750000 0.000000 -v 0.125000 1.750000 0.000000 -v 0.125000 1.750000 -0.250000 -v -0.062500 2.500000 -0.250000 -v 0.062500 2.500000 -0.250000 -v -0.062500 2.500000 -0.437500 -v 0.062500 2.500000 -0.437500 -v -0.062500 2.250000 -0.437500 -v 0.062500 2.250000 -0.437500 -v -0.062500 2.250000 -0.250000 -v 0.062500 2.250000 -0.250000 -v 0.250000 2.625000 -0.093750 -v 0.250000 1.875000 -0.093750 -v 0.250000 2.625000 -0.156250 -v 0.250000 1.875000 -0.156250 -v 0.125000 2.625000 -0.093750 -v 0.125000 1.875000 -0.093750 -v 0.125000 2.625000 -0.156250 -v 0.125000 1.875000 -0.156250 -v 0.187500 2.562500 -0.093750 -v 0.187500 1.937500 -0.093750 -v 0.187500 2.562500 -0.156250 -v 0.187500 1.937500 -0.156250 -v 0.125000 2.562500 -0.093750 -v 0.125000 1.937500 -0.093750 -v 0.125000 2.562500 -0.156250 -v 0.125000 1.937500 -0.156250 -v -0.250001 2.625000 -0.156250 -v -0.250001 1.875000 -0.156250 -v -0.250001 2.625000 -0.093750 -v -0.250001 1.875000 -0.093750 -v -0.125001 2.625000 -0.156250 -v -0.125001 1.875000 -0.156250 -v -0.125001 2.625000 -0.093750 -v -0.125001 1.875000 -0.093750 -v -0.187501 2.562500 -0.156250 -v -0.187501 1.937500 -0.156250 -v -0.187501 2.562500 -0.093750 -v -0.187501 1.937500 -0.093750 -v -0.125001 2.562500 -0.156250 -v -0.125001 1.937500 -0.156250 -v -0.125001 2.562500 -0.093750 -v -0.125001 1.937500 -0.093750 -v -0.125000 2.375000 -0.562500 -v -0.000000 2.375000 -0.562500 -v -0.125000 2.286612 -0.525888 -v -0.000000 2.286612 -0.525888 -v -0.125000 2.250000 -0.437500 -v -0.000000 2.250000 -0.437500 -v -0.125000 2.286612 -0.349112 -v -0.000000 2.286612 -0.349112 -v -0.125000 2.375000 -0.312500 -v -0.000000 2.375000 -0.312500 -v -0.125000 2.463388 -0.349112 -v -0.000000 2.463388 -0.349112 -v -0.125000 2.500000 -0.437500 -v -0.000000 2.500000 -0.437500 -v -0.125000 2.463388 -0.525888 -v -0.000000 2.463388 -0.525888 -vt 0.723684 0.907407 -vt 0.750000 0.870370 -vt 0.750000 0.907407 -vt 0.750000 0.722222 -vt 0.723684 0.685185 -vt 0.750000 0.685185 -vt 0.802632 0.870370 -vt 0.828947 0.722222 -vt 0.828947 0.870370 -vt 0.776316 0.722222 -vt 0.776316 0.870370 -vt 0.723684 0.870370 -vt 0.802632 0.722222 -vt 0.875000 0.574074 -vt 0.861842 0.601852 -vt 0.861842 0.574074 -vt 0.875000 0.601852 -vt 0.901316 0.620370 -vt 0.875000 0.620370 -vt 0.901316 0.601852 -vt 0.914474 0.574074 -vt 0.914474 0.601852 -vt 0.901316 0.574074 -vt 0.940789 0.574074 -vt 0.940789 0.601852 -vt 0.703947 0.703704 -vt 0.710526 0.814815 -vt 0.703947 0.814815 -vt 0.710526 0.685185 -vt 0.710526 0.703704 -vt 0.703947 0.833333 -vt 0.723684 0.805556 -vt 0.717105 0.712963 -vt 0.723684 0.712963 -vt 0.717105 0.685185 -vt 0.723684 0.694444 -vt 0.717105 0.694444 -vt 0.723684 0.833333 -vt 0.717105 0.824074 -vt 0.723684 0.824074 -vt 0.697368 0.824074 -vt 0.710526 0.833333 -vt 0.717105 0.833333 -vt 0.717105 0.805556 -vt 0.697368 0.712963 -vt 0.703947 0.685185 -vt 0.697368 0.694444 -vt 0.697368 0.685185 -vt 0.703947 0.703704 -vt 0.710526 0.814815 -vt 0.703947 0.814815 -vt 0.710526 0.685185 -vt 0.710526 0.703704 -vt 0.703947 0.833333 -vt 0.723684 0.805556 -vt 0.717105 0.712963 -vt 0.723684 0.712963 -vt 0.717105 0.685185 -vt 0.723684 0.694444 -vt 0.717105 0.694444 -vt 0.723684 0.833333 -vt 0.717105 0.824074 -vt 0.723684 0.824074 -vt 0.697368 0.824074 -vt 0.710526 0.833333 -vt 0.717105 0.833333 -vt 0.717105 0.805556 -vt 0.697368 0.712963 -vt 0.703947 0.685185 -vt 0.697368 0.694444 -vt 0.697368 0.685185 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.706641 0.624161 -vt 0.697369 0.629566 -vt 0.688096 0.624161 -vt 0.723684 0.722222 -vt 0.723684 0.685185 -vt 0.697368 0.833333 -vt 0.697368 0.805556 -vt 0.723684 0.685185 -vt 0.697368 0.833333 -vt 0.697368 0.805556 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.688096 0.598061 -vt 0.697369 0.592656 -vt 0.706641 0.598061 -vt 0.710481 0.611111 -vt 0.763158 0.574074 -vt 0.776316 0.592593 -vt 0.763158 0.592593 -vt 0.776316 0.574074 -vt 0.789474 0.592593 -vt 0.684211 0.574074 -vt 0.697368 0.592593 -vt 0.684211 0.592593 -vt 0.697368 0.574074 -vt 0.710526 0.592593 -vt 0.710526 0.574074 -vt 0.723684 0.592593 -vt 0.723684 0.574074 -vt 0.736842 0.592593 -vt 0.736842 0.574074 -vt 0.750000 0.592593 -vt 0.750000 0.574074 -vt 0.789474 0.574074 -vn 0.0000 1.0000 0.0000 -vn 0.0000 -1.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 0.7071 -0.7071 -s off -f 322/597/63 323/598/63 321/599/63 -f 325/600/64 327/601/64 326/602/64 -f 322/603/65 328/604/65 324/605/65 -f 323/598/66 326/606/66 321/607/66 -f 324/608/67 325/600/67 323/598/67 -f 321/607/68 327/609/68 322/603/68 -f 330/610/63 331/611/63 329/612/63 -f 332/613/67 333/614/67 331/615/67 -f 334/616/64 335/617/64 333/618/64 -f 336/619/65 332/613/65 330/610/65 -f 333/618/66 329/620/66 331/621/66 -f 338/622/65 339/623/65 337/624/65 -f 338/622/64 344/625/64 340/626/64 -f 339/623/63 341/627/63 337/624/63 -f 345/628/66 348/629/66 346/630/66 -f 352/631/63 346/632/63 348/633/63 -f 349/634/64 347/635/64 345/636/64 -f 341/627/68 345/637/68 337/624/68 -f 343/638/67 347/635/67 351/639/67 -f 340/626/67 347/640/67 339/623/67 -f 344/625/67 348/633/67 340/626/67 -f 337/624/68 346/641/68 338/622/68 -f 342/642/68 346/643/68 350/644/68 -f 354/645/66 355/646/66 353/647/66 -f 354/645/64 360/648/64 356/649/64 -f 355/646/63 357/650/63 353/647/63 -f 361/651/65 364/652/65 362/653/65 -f 368/654/63 362/655/63 364/656/63 -f 365/657/64 363/658/64 361/659/64 -f 357/650/67 361/660/67 353/647/67 -f 359/661/68 363/658/68 367/662/68 -f 356/649/68 363/663/68 355/646/68 -f 360/648/68 364/656/68 356/649/68 -f 353/647/67 362/664/67 354/645/67 -f 358/665/67 362/666/67 366/667/67 -f 382/668/65 378/669/65 374/670/65 -f 379/671/66 381/672/66 383/673/66 -f 322/597/63 324/608/63 323/598/63 -f 325/600/64 328/674/64 327/601/64 -f 322/603/65 327/609/65 328/604/65 -f 323/598/66 325/600/66 326/606/66 -f 324/608/67 328/674/67 325/600/67 -f 321/607/68 326/606/68 327/609/68 -f 330/610/63 332/613/63 331/611/63 -f 332/613/67 334/616/67 333/614/67 -f 334/616/64 336/619/64 335/617/64 -f 336/619/65 334/616/65 332/613/65 -f 333/618/66 335/617/66 329/620/66 -f 338/622/65 340/626/65 339/623/65 -f 338/622/64 342/642/64 344/625/64 -f 339/623/63 343/638/63 341/627/63 -f 345/628/66 347/640/66 348/629/66 -f 352/631/63 350/675/63 346/632/63 -f 349/634/64 351/639/64 347/635/64 -f 341/627/68 349/676/68 345/637/68 -f 343/638/67 339/623/67 347/635/67 -f 340/626/67 348/629/67 347/640/67 -f 344/625/67 352/631/67 348/633/67 -f 337/624/68 345/677/68 346/641/68 -f 342/642/68 338/622/68 346/643/68 -f 354/645/66 356/649/66 355/646/66 -f 354/645/64 358/665/64 360/648/64 -f 355/646/63 359/661/63 357/650/63 -f 361/651/65 363/663/65 364/652/65 -f 368/654/63 366/678/63 362/655/63 -f 365/657/64 367/662/64 363/658/64 -f 357/650/67 365/679/67 361/660/67 -f 359/661/68 355/646/68 363/658/68 -f 356/649/68 364/652/68 363/663/68 -f 360/648/68 368/654/68 364/656/68 -f 353/647/67 361/680/67 362/664/67 -f 358/665/67 354/645/67 362/666/67 -f 374/670/65 372/681/65 370/682/65 -f 370/682/65 384/683/65 382/668/65 -f 382/668/65 380/684/65 378/669/65 -f 378/669/65 376/685/65 374/670/65 -f 374/670/65 370/682/65 382/668/65 -f 383/673/66 369/686/66 371/687/66 -f 371/687/66 373/688/66 383/673/66 -f 373/688/66 375/689/66 383/673/66 -f 375/689/66 377/690/66 383/673/66 -f 377/690/66 379/671/66 383/673/66 -s 1 -f 370/691/67 371/692/69 369/693/67 -f 372/694/69 373/695/64 371/692/69 -f 374/696/64 375/697/70 373/698/64 -f 376/699/70 377/700/68 375/697/70 -f 378/701/68 379/702/71 377/700/68 -f 380/703/71 381/704/63 379/702/71 -f 382/705/63 383/706/72 381/704/63 -f 384/707/72 369/693/67 383/706/72 -f 370/691/67 372/694/69 371/692/69 -f 372/694/69 374/708/64 373/695/64 -f 374/696/64 376/699/70 375/697/70 -f 376/699/70 378/701/68 377/700/68 -f 378/701/68 380/703/71 379/702/71 -f 380/703/71 382/705/63 381/704/63 -f 382/705/63 384/707/72 383/706/72 -f 384/707/72 370/691/67 369/693/67 +f 358/677/67 359/678/68 357/679/67 +f 359/678/68 362/680/64 361/681/64 +f 362/682/64 363/683/69 361/684/64 +f 364/685/69 365/686/70 363/683/69 +f 366/687/70 367/688/71 365/686/70 +f 368/689/71 369/690/63 367/688/71 +f 370/691/63 371/692/72 369/690/63 +f 372/693/72 357/679/67 371/692/72 +f 374/694/67 375/695/68 373/696/67 +f 376/697/68 377/698/64 375/695/68 +f 378/699/64 379/700/69 377/701/64 +f 379/700/69 382/702/70 381/703/70 +f 382/702/70 383/704/71 381/703/70 +f 383/704/71 386/705/63 385/706/63 +f 386/705/63 387/707/72 385/706/63 +f 388/708/72 373/696/67 387/707/72 +f 358/677/67 360/709/68 359/678/68 +f 359/678/68 360/709/68 362/680/64 +f 362/682/64 364/685/69 363/683/69 +f 364/685/69 366/687/70 365/686/70 +f 366/687/70 368/689/71 367/688/71 +f 368/689/71 370/691/63 369/690/63 +f 370/691/63 372/693/72 371/692/72 +f 372/693/72 358/677/67 357/679/67 +f 374/694/67 376/697/68 375/695/68 +f 376/697/68 378/710/64 377/698/64 +f 378/699/64 380/711/69 379/700/69 +f 379/700/69 380/711/69 382/702/70 +f 382/702/70 384/712/71 383/704/71 +f 383/704/71 384/712/71 386/705/63 +f 386/705/63 388/708/72 387/707/72 +f 388/708/72 374/694/67 373/696/67 o Head1 v 0.125000 2.750000 -0.000000 v -0.125000 2.750000 0.000000 @@ -1893,6 +1903,10 @@ v 0.125000 2.500000 0.437500 v 0.000000 2.500000 0.437500 v 0.125000 2.463388 0.525888 v 0.000000 2.463388 0.525888 +v 0.130000 1.875000 0.234375 +v 0.130000 1.875000 0.171875 +v 0.130000 2.062500 0.234375 +v 0.130000 2.062500 0.171875 vt 0.750000 0.907407 vt 0.723684 0.870370 vt 0.750000 0.870370 @@ -1970,6 +1984,9 @@ vt 0.723684 0.592656 vt 0.706641 0.624161 vt 0.697369 0.629566 vt 0.688096 0.624161 +vt 0.559211 1.000000 +vt 0.460526 0.953704 +vt 0.559211 0.953704 vt 0.723684 0.907407 vt 0.717105 0.685185 vt 0.697368 0.833333 @@ -1987,6 +2004,7 @@ vt 0.688096 0.598061 vt 0.697369 0.592656 vt 0.706641 0.598061 vt 0.710481 0.611111 +vt 0.460526 1.000000 vt 0.763158 0.574074 vt 0.776316 0.592593 vt 0.763158 0.592593 @@ -2016,105 +2034,107 @@ vn 0.0000 -0.7071 -0.7071 vn 0.0000 0.7071 -0.7071 vn 0.0000 0.7071 0.7071 s off -f 385/709/73 388/710/73 387/711/73 -f 390/712/74 392/713/74 391/714/74 -f 386/715/75 392/716/75 388/717/75 -f 387/711/76 390/718/76 385/719/76 -f 388/710/77 389/720/77 387/711/77 -f 385/719/78 391/721/78 386/715/78 -f 394/722/73 395/723/73 393/724/73 -f 396/725/77 397/726/77 395/727/77 -f 398/728/74 399/729/74 397/730/74 -f 400/731/75 396/725/75 394/722/75 -f 397/730/76 393/732/76 395/733/76 -f 402/734/75 403/735/75 401/736/75 -f 402/734/74 408/737/74 404/738/74 -f 403/735/73 405/739/73 401/736/73 -f 409/740/76 412/741/76 410/742/76 -f 412/743/73 414/744/73 410/745/73 -f 413/746/74 411/747/74 409/748/74 -f 405/739/78 409/749/78 401/736/78 -f 407/750/77 411/747/77 415/751/77 -f 404/738/77 411/752/77 403/735/77 -f 408/737/77 412/743/77 404/738/77 -f 401/736/78 410/753/78 402/734/78 -f 406/754/78 410/755/78 414/756/78 -f 418/757/76 419/758/76 417/759/76 -f 418/757/74 424/760/74 420/761/74 -f 417/759/73 423/762/73 421/763/73 -f 425/764/75 428/765/75 426/766/75 -f 432/767/73 426/768/73 428/769/73 -f 429/770/74 427/771/74 425/772/74 -f 421/763/77 425/773/77 417/759/77 -f 423/762/78 427/771/78 431/774/78 -f 420/761/78 427/775/78 419/758/78 -f 424/760/78 428/769/78 420/761/78 -f 417/759/77 426/776/77 418/757/77 -f 422/777/77 426/778/77 430/779/77 -f 446/780/75 442/781/75 438/782/75 -f 443/783/76 445/784/76 447/785/76 -f 385/709/73 386/786/73 388/710/73 -f 390/712/74 389/720/74 392/713/74 -f 386/715/75 391/721/75 392/716/75 -f 387/711/76 389/720/76 390/718/76 -f 388/710/77 392/713/77 389/720/77 -f 385/719/78 390/718/78 391/721/78 -f 394/722/73 396/725/73 395/723/73 -f 396/725/77 398/728/77 397/726/77 -f 398/728/74 400/731/74 399/729/74 -f 400/731/75 398/728/75 396/725/75 -f 397/730/76 399/729/76 393/732/76 -f 402/734/75 404/738/75 403/735/75 -f 402/734/74 406/754/74 408/737/74 -f 403/735/73 407/750/73 405/739/73 -f 409/740/76 411/752/76 412/741/76 -f 412/743/73 416/787/73 414/744/73 -f 413/746/74 415/751/74 411/747/74 -f 405/739/78 413/788/78 409/749/78 -f 407/750/77 403/735/77 411/747/77 -f 404/738/77 412/741/77 411/752/77 -f 408/737/77 416/787/77 412/743/77 -f 401/736/78 409/789/78 410/753/78 -f 406/754/78 402/734/78 410/755/78 -f 418/757/76 420/761/76 419/758/76 -f 418/757/74 422/777/74 424/760/74 -f 417/759/73 419/758/73 423/762/73 -f 425/764/75 427/775/75 428/765/75 -f 432/767/73 430/790/73 426/768/73 -f 429/770/74 431/774/74 427/771/74 -f 421/763/77 429/791/77 425/773/77 -f 423/762/78 419/758/78 427/771/78 -f 420/761/78 428/765/78 427/775/78 -f 424/760/78 432/767/78 428/769/78 -f 417/759/77 425/792/77 426/776/77 -f 422/777/77 418/757/77 426/778/77 -f 438/782/75 436/793/75 434/794/75 -f 434/794/75 448/795/75 446/780/75 -f 446/780/75 444/796/75 442/781/75 -f 442/781/75 440/797/75 438/782/75 -f 438/782/75 434/794/75 446/780/75 -f 447/785/76 433/798/76 435/799/76 -f 435/799/76 437/800/76 447/785/76 -f 437/800/76 439/801/76 447/785/76 -f 439/801/76 441/802/76 447/785/76 -f 441/802/76 443/783/76 447/785/76 +f 389/713/73 392/714/73 391/715/73 +f 394/716/74 396/717/74 395/718/74 +f 390/719/75 396/720/75 392/721/75 +f 391/715/76 394/722/76 389/723/76 +f 392/714/77 393/724/77 391/715/77 +f 389/723/78 395/725/78 390/719/78 +f 398/726/73 399/727/73 397/728/73 +f 400/729/77 401/730/77 399/731/77 +f 402/732/74 403/733/74 401/734/74 +f 404/735/75 400/729/75 398/726/75 +f 401/734/76 397/736/76 399/737/76 +f 406/738/75 407/739/75 405/740/75 +f 406/738/74 412/741/74 408/742/74 +f 407/739/73 409/743/73 405/740/73 +f 413/744/76 416/745/76 414/746/76 +f 416/747/73 418/748/73 414/749/73 +f 417/750/74 415/751/74 413/752/74 +f 409/743/78 413/753/78 405/740/78 +f 411/754/77 415/751/77 419/755/77 +f 408/742/77 415/756/77 407/739/77 +f 412/741/77 416/747/77 408/742/77 +f 405/740/78 414/757/78 406/738/78 +f 410/758/78 414/759/78 418/760/78 +f 422/761/76 423/762/76 421/763/76 +f 422/761/74 428/764/74 424/765/74 +f 421/763/73 427/766/73 425/767/73 +f 429/768/75 432/769/75 430/770/75 +f 436/771/73 430/772/73 432/773/73 +f 433/774/74 431/775/74 429/776/74 +f 425/767/77 429/777/77 421/763/77 +f 427/766/78 431/775/78 435/778/78 +f 424/765/78 431/779/78 423/762/78 +f 428/764/78 432/773/78 424/765/78 +f 421/763/77 430/780/77 422/761/77 +f 426/781/77 430/782/77 434/783/77 +f 450/784/75 446/785/75 442/786/75 +f 447/787/76 449/788/76 451/789/76 +f 454/790/76 455/791/76 453/792/76 +f 389/713/73 390/793/73 392/714/73 +f 394/716/74 393/724/74 396/717/74 +f 390/719/75 395/725/75 396/720/75 +f 391/715/76 393/724/76 394/722/76 +f 392/714/77 396/717/77 393/724/77 +f 389/723/78 394/722/78 395/725/78 +f 398/726/73 400/729/73 399/727/73 +f 400/729/77 402/732/77 401/730/77 +f 402/732/74 404/735/74 403/733/74 +f 404/735/75 402/732/75 400/729/75 +f 401/734/76 403/733/76 397/736/76 +f 406/738/75 408/742/75 407/739/75 +f 406/738/74 410/758/74 412/741/74 +f 407/739/73 411/754/73 409/743/73 +f 413/744/76 415/756/76 416/745/76 +f 416/747/73 420/794/73 418/748/73 +f 417/750/74 419/755/74 415/751/74 +f 409/743/78 417/795/78 413/753/78 +f 411/754/77 407/739/77 415/751/77 +f 408/742/77 416/745/77 415/756/77 +f 412/741/77 420/794/77 416/747/77 +f 405/740/78 413/796/78 414/757/78 +f 410/758/78 406/738/78 414/759/78 +f 422/761/76 424/765/76 423/762/76 +f 422/761/74 426/781/74 428/764/74 +f 421/763/73 423/762/73 427/766/73 +f 429/768/75 431/779/75 432/769/75 +f 436/771/73 434/797/73 430/772/73 +f 433/774/74 435/778/74 431/775/74 +f 425/767/77 433/798/77 429/777/77 +f 427/766/78 423/762/78 431/775/78 +f 424/765/78 432/769/78 431/779/78 +f 428/764/78 436/771/78 432/773/78 +f 421/763/77 429/799/77 430/780/77 +f 426/781/77 422/761/77 430/782/77 +f 442/786/75 440/800/75 438/801/75 +f 438/801/75 452/802/75 450/784/75 +f 450/784/75 448/803/75 446/785/75 +f 446/785/75 444/804/75 442/786/75 +f 442/786/75 438/801/75 450/784/75 +f 451/789/76 437/805/76 439/806/76 +f 439/806/76 441/807/76 451/789/76 +f 441/807/76 443/808/76 451/789/76 +f 443/808/76 445/809/76 451/789/76 +f 445/809/76 447/787/76 451/789/76 +f 454/790/76 456/810/76 455/791/76 s 1 -f 434/803/77 435/804/79 433/805/77 -f 436/806/79 437/807/74 435/804/79 -f 438/808/74 439/809/80 437/810/74 -f 440/811/80 441/812/78 439/809/80 -f 442/813/78 443/814/81 441/812/78 -f 444/815/81 445/816/73 443/814/81 -f 446/817/73 447/818/82 445/816/73 -f 448/819/82 433/805/77 447/818/82 -f 434/803/77 436/806/79 435/804/79 -f 436/806/79 438/820/74 437/807/74 -f 438/808/74 440/811/80 439/809/80 -f 440/811/80 442/813/78 441/812/78 -f 442/813/78 444/815/81 443/814/81 -f 444/815/81 446/817/73 445/816/73 -f 446/817/73 448/819/82 447/818/82 -f 448/819/82 434/803/77 433/805/77 +f 438/811/77 439/812/79 437/813/77 +f 440/814/79 441/815/74 439/812/79 +f 442/816/74 443/817/80 441/818/74 +f 444/819/80 445/820/78 443/817/80 +f 446/821/78 447/822/81 445/820/78 +f 448/823/81 449/824/73 447/822/81 +f 450/825/73 451/826/82 449/824/73 +f 452/827/82 437/813/77 451/826/82 +f 438/811/77 440/814/79 439/812/79 +f 440/814/79 442/828/74 441/815/74 +f 442/816/74 444/819/80 443/817/80 +f 444/819/80 446/821/78 445/820/78 +f 446/821/78 448/823/81 447/822/81 +f 448/823/81 450/825/73 449/824/73 +f 450/825/73 452/827/82 451/826/82 +f 452/827/82 438/811/77 437/813/77 o Spike2 v -0.062500 2.875000 -0.062500 v 0.062500 2.875000 -0.062500 @@ -2151,20 +2171,20 @@ vn 0.0000 -0.2425 -0.9701 vn 0.9701 -0.2425 0.0000 vn 0.0000 -0.2425 0.9701 s off -f 450/821/83 451/822/83 449/823/83 -f 450/824/84 456/825/84 452/826/84 -f 451/822/85 454/827/85 449/828/85 -f 452/829/86 453/830/86 451/822/86 -f 449/828/87 455/831/87 450/824/87 -f 454/827/88 453/830/88 457/832/88 -f 453/830/89 456/833/89 457/834/89 -f 456/825/90 455/831/90 457/835/90 -f 455/831/91 454/827/91 457/836/91 -f 450/821/83 452/829/83 451/822/83 -f 450/824/84 455/831/84 456/825/84 -f 451/822/85 453/830/85 454/827/85 -f 452/829/86 456/833/86 453/830/86 -f 449/828/87 454/827/87 455/831/87 +f 458/829/83 459/830/83 457/831/83 +f 458/832/84 464/833/84 460/834/84 +f 459/830/85 462/835/85 457/836/85 +f 460/837/86 461/838/86 459/830/86 +f 457/836/87 463/839/87 458/832/87 +f 462/835/88 461/838/88 465/840/88 +f 461/838/89 464/841/89 465/842/89 +f 464/833/90 463/839/90 465/843/90 +f 463/839/91 462/835/91 465/844/91 +f 458/829/83 460/837/83 459/830/83 +f 458/832/84 463/839/84 464/833/84 +f 459/830/85 461/838/85 462/835/85 +f 460/837/86 464/841/86 461/838/86 +f 457/836/87 462/835/87 463/839/87 o Spike1 v 0.062500 2.875000 0.062500 v -0.062500 2.875000 0.062500 @@ -2201,20 +2221,20 @@ vn 0.0000 -0.2425 0.9701 vn -0.9701 -0.2425 0.0000 vn 0.0000 -0.2425 -0.9701 s off -f 458/837/92 461/838/92 460/839/92 -f 459/840/93 465/841/93 461/842/93 -f 460/839/94 463/843/94 458/844/94 -f 461/838/95 462/845/95 460/839/95 -f 458/844/96 464/846/96 459/840/96 -f 463/843/97 462/845/97 466/847/97 -f 462/845/98 465/848/98 466/849/98 -f 465/841/99 464/846/99 466/850/99 -f 464/846/100 463/843/100 466/851/100 -f 458/837/92 459/852/92 461/838/92 -f 459/840/93 464/846/93 465/841/93 -f 460/839/94 462/845/94 463/843/94 -f 461/838/95 465/848/95 462/845/95 -f 458/844/96 463/843/96 464/846/96 +f 466/845/92 469/846/92 468/847/92 +f 467/848/93 473/849/93 469/850/93 +f 468/847/94 471/851/94 466/852/94 +f 469/846/95 470/853/95 468/847/95 +f 466/852/96 472/854/96 467/848/96 +f 471/851/97 470/853/97 474/855/97 +f 470/853/98 473/856/98 474/857/98 +f 473/849/99 472/854/99 474/858/99 +f 472/854/100 471/851/100 474/859/100 +f 466/845/92 467/860/92 469/846/92 +f 467/848/93 472/854/93 473/849/93 +f 468/847/94 470/853/94 471/851/94 +f 469/846/95 473/856/95 470/853/95 +f 466/852/96 471/851/96 472/854/96 o Frame v 1.250000 2.750000 -1.250000 v 1.250000 3.000000 -1.250000 @@ -2455,118 +2475,118 @@ vn 0.0000 0.0000 1.0000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 s off -f 468/853/101 469/854/101 467/855/101 -f 470/856/102 473/857/102 469/854/102 -f 474/858/103 471/859/103 473/857/103 -f 472/860/104 467/855/104 471/861/104 -f 473/857/105 467/862/105 469/863/105 -f 470/864/106 472/865/106 474/858/106 -f 476/866/101 477/867/101 475/868/101 -f 478/869/102 481/870/102 477/867/102 -f 482/871/103 479/872/103 481/870/103 -f 480/873/104 475/868/104 479/874/104 -f 481/870/105 475/875/105 477/876/105 -f 478/877/106 480/878/106 482/871/106 -f 484/879/101 485/880/101 483/881/101 -f 486/882/102 489/883/102 485/880/102 -f 490/884/103 487/885/103 489/883/103 -f 488/886/104 483/881/104 487/887/104 -f 489/883/105 483/888/105 485/889/105 -f 486/890/106 488/891/106 490/884/106 -f 492/892/101 493/893/101 491/894/101 -f 494/895/102 497/896/102 493/893/102 -f 498/897/103 495/898/103 497/896/103 -f 496/899/104 491/894/104 495/900/104 -f 497/896/105 491/901/105 493/902/105 -f 494/903/106 496/904/106 498/897/106 -f 502/905/103 500/906/103 501/907/103 -f 501/907/105 506/908/105 502/905/105 -f 499/909/106 504/910/106 500/906/106 -f 506/911/101 504/910/101 503/912/101 +f 476/861/101 477/862/101 475/863/101 +f 478/864/102 481/865/102 477/862/102 +f 482/866/103 479/867/103 481/865/103 +f 480/868/104 475/863/104 479/869/104 +f 481/865/105 475/870/105 477/871/105 +f 478/872/106 480/873/106 482/866/106 +f 484/874/101 485/875/101 483/876/101 +f 486/877/102 489/878/102 485/875/102 +f 490/879/103 487/880/103 489/878/103 +f 488/881/104 483/876/104 487/882/104 +f 489/878/105 483/883/105 485/884/105 +f 486/885/106 488/886/106 490/879/106 +f 492/887/101 493/888/101 491/889/101 +f 494/890/102 497/891/102 493/888/102 +f 498/892/103 495/893/103 497/891/103 +f 496/894/104 491/889/104 495/895/104 +f 497/891/105 491/896/105 493/897/105 +f 494/898/106 496/899/106 498/892/106 +f 500/900/101 501/901/101 499/902/101 +f 502/903/102 505/904/102 501/901/102 +f 506/905/103 503/906/103 505/904/103 +f 504/907/104 499/902/104 503/908/104 +f 505/904/105 499/909/105 501/910/105 +f 502/911/106 504/912/106 506/905/106 f 510/913/103 508/914/103 509/915/103 -f 509/916/105 514/917/105 510/918/105 -f 507/919/106 512/920/106 508/914/106 -f 514/917/101 512/920/101 511/921/101 -f 518/922/102 516/923/102 517/924/102 -f 517/924/105 522/925/105 518/922/105 -f 515/926/106 520/927/106 516/923/106 -f 522/928/104 520/927/104 519/929/104 +f 509/915/105 514/916/105 510/913/105 +f 507/917/106 512/918/106 508/914/106 +f 514/919/101 512/918/101 511/920/101 +f 518/921/103 516/922/103 517/923/103 +f 517/924/105 522/925/105 518/926/105 +f 515/927/106 520/928/106 516/922/106 +f 522/925/101 520/928/101 519/929/101 f 526/930/102 524/931/102 525/932/102 -f 525/933/105 530/934/105 526/935/105 -f 523/936/106 528/937/106 524/931/106 -f 530/934/104 528/937/104 527/938/104 -f 534/939/102 532/940/102 533/941/102 -f 533/941/101 538/942/101 534/939/101 -f 531/943/103 536/944/103 532/940/103 +f 525/932/105 530/933/105 526/930/105 +f 523/934/106 528/935/106 524/931/106 +f 530/936/104 528/935/104 527/937/104 +f 534/938/102 532/939/102 533/940/102 +f 533/941/105 538/942/105 534/943/105 +f 531/944/106 536/945/106 532/939/106 f 538/942/104 536/945/104 535/946/104 f 542/947/102 540/948/102 541/949/102 f 541/949/101 546/950/101 542/947/101 -f 539/951/103 544/952/103 540/953/103 -f 546/950/104 544/952/104 543/954/104 +f 539/951/103 544/952/103 540/948/103 +f 546/950/104 544/953/104 543/954/104 f 550/955/102 548/956/102 549/957/102 f 549/957/101 554/958/101 550/955/101 -f 547/959/103 552/960/103 548/956/103 -f 554/961/104 552/960/104 551/962/104 +f 547/959/103 552/960/103 548/961/103 +f 554/958/104 552/960/104 551/962/104 f 558/963/102 556/964/102 557/965/102 -f 557/966/101 562/967/101 558/968/101 -f 555/969/103 560/970/103 556/964/103 -f 562/967/104 560/970/104 559/971/104 -f 468/853/101 470/856/101 469/854/101 -f 470/856/102 474/858/102 473/857/102 -f 474/858/103 472/865/103 471/859/103 -f 472/860/104 468/853/104 467/855/104 -f 473/857/105 471/859/105 467/862/105 -f 470/864/106 468/972/106 472/865/106 -f 476/866/101 478/869/101 477/867/101 -f 478/869/102 482/871/102 481/870/102 -f 482/871/103 480/878/103 479/872/103 -f 480/873/104 476/866/104 475/868/104 -f 481/870/105 479/872/105 475/875/105 -f 478/877/106 476/973/106 480/878/106 -f 484/879/101 486/882/101 485/880/101 -f 486/882/102 490/884/102 489/883/102 -f 490/884/103 488/891/103 487/885/103 -f 488/886/104 484/879/104 483/881/104 -f 489/883/105 487/885/105 483/888/105 -f 486/890/106 484/974/106 488/891/106 -f 492/892/101 494/895/101 493/893/101 -f 494/895/102 498/897/102 497/896/102 -f 498/897/103 496/904/103 495/898/103 -f 496/899/104 492/892/104 491/894/104 -f 497/896/105 495/898/105 491/901/105 -f 494/903/106 492/975/106 496/904/106 -f 502/905/103 499/909/103 500/906/103 -f 501/907/105 505/976/105 506/908/105 -f 499/909/106 503/912/106 504/910/106 -f 506/911/101 505/977/101 504/910/101 -f 510/913/103 507/919/103 508/914/103 -f 509/916/105 513/978/105 514/917/105 -f 507/919/106 511/921/106 512/920/106 -f 514/917/101 513/978/101 512/920/101 -f 518/922/102 515/926/102 516/923/102 -f 517/924/105 521/979/105 522/925/105 -f 515/926/106 519/929/106 520/927/106 -f 522/928/104 521/980/104 520/927/104 -f 526/930/102 523/936/102 524/931/102 -f 525/933/105 529/981/105 530/934/105 -f 523/936/106 527/938/106 528/937/106 -f 530/934/104 529/981/104 528/937/104 -f 534/939/102 531/943/102 532/940/102 -f 533/941/101 537/982/101 538/942/101 -f 531/943/103 535/983/103 536/944/103 -f 538/942/104 537/982/104 536/945/104 -f 542/947/102 539/984/102 540/948/102 -f 541/949/101 545/985/101 546/950/101 -f 539/951/103 543/954/103 544/952/103 -f 546/950/104 545/985/104 544/952/104 -f 550/955/102 547/959/102 548/956/102 -f 549/957/101 553/986/101 554/958/101 +f 557/965/101 562/966/101 558/963/101 +f 555/967/103 560/968/103 556/964/103 +f 562/969/104 560/968/104 559/970/104 +f 566/971/102 564/972/102 565/973/102 +f 565/974/101 570/975/101 566/976/101 +f 563/977/103 568/978/103 564/972/103 +f 570/975/104 568/978/104 567/979/104 +f 476/861/101 478/864/101 477/862/101 +f 478/864/102 482/866/102 481/865/102 +f 482/866/103 480/873/103 479/867/103 +f 480/868/104 476/861/104 475/863/104 +f 481/865/105 479/867/105 475/870/105 +f 478/872/106 476/980/106 480/873/106 +f 484/874/101 486/877/101 485/875/101 +f 486/877/102 490/879/102 489/878/102 +f 490/879/103 488/886/103 487/880/103 +f 488/881/104 484/874/104 483/876/104 +f 489/878/105 487/880/105 483/883/105 +f 486/885/106 484/981/106 488/886/106 +f 492/887/101 494/890/101 493/888/101 +f 494/890/102 498/892/102 497/891/102 +f 498/892/103 496/899/103 495/893/103 +f 496/894/104 492/887/104 491/889/104 +f 497/891/105 495/893/105 491/896/105 +f 494/898/106 492/982/106 496/899/106 +f 500/900/101 502/903/101 501/901/101 +f 502/903/102 506/905/102 505/904/102 +f 506/905/103 504/912/103 503/906/103 +f 504/907/104 500/900/104 499/902/104 +f 505/904/105 503/906/105 499/909/105 +f 502/911/106 500/983/106 504/912/106 +f 510/913/103 507/917/103 508/914/103 +f 509/915/105 513/984/105 514/916/105 +f 507/917/106 511/920/106 512/918/106 +f 514/919/101 513/985/101 512/918/101 +f 518/921/103 515/927/103 516/922/103 +f 517/924/105 521/986/105 522/925/105 +f 515/927/106 519/929/106 520/928/106 +f 522/925/101 521/986/101 520/928/101 +f 526/930/102 523/934/102 524/931/102 +f 525/932/105 529/987/105 530/933/105 +f 523/934/106 527/937/106 528/935/106 +f 530/936/104 529/988/104 528/935/104 +f 534/938/102 531/944/102 532/939/102 +f 533/941/105 537/989/105 538/942/105 +f 531/944/106 535/946/106 536/945/106 +f 538/942/104 537/989/104 536/945/104 +f 542/947/102 539/951/102 540/948/102 +f 541/949/101 545/990/101 546/950/101 +f 539/951/103 543/991/103 544/952/103 +f 546/950/104 545/990/104 544/953/104 +f 550/955/102 547/992/102 548/956/102 +f 549/957/101 553/993/101 554/958/101 f 547/959/103 551/962/103 552/960/103 -f 554/961/104 553/987/104 552/960/104 -f 558/963/102 555/969/102 556/964/102 -f 557/966/101 561/988/101 562/967/101 -f 555/969/103 559/971/103 560/970/103 -f 562/967/104 561/988/104 560/970/104 +f 554/958/104 553/993/104 552/960/104 +f 558/963/102 555/967/102 556/964/102 +f 557/965/101 561/994/101 562/966/101 +f 555/967/103 559/970/103 560/968/103 +f 562/969/104 561/995/104 560/968/104 +f 566/971/102 563/977/102 564/972/102 +f 565/974/101 569/996/101 570/975/101 +f 563/977/103 567/979/103 568/978/103 +f 570/975/104 569/996/104 568/978/104 o Base v 1.500000 0.125000 -1.250000 v 1.500000 0.125000 1.250000 @@ -3233,78 +3253,78 @@ vt 0.052632 0.296296 vt 0.210526 0.296296 vt 0.052632 0.518519 vt 0.263158 0.074074 -vt 0.315789 0.111111 -vt 0.269737 0.111111 +vt 0.312500 0.111111 +vt 0.266447 0.111111 vt 0.210526 0.074074 -vt 0.263158 0.111111 -vt 0.217105 0.111111 +vt 0.259868 0.111111 +vt 0.213816 0.111111 vt 0.157895 0.074074 -vt 0.210526 0.111111 -vt 0.164474 0.111111 +vt 0.207237 0.111111 +vt 0.161184 0.111111 vt 0.105263 0.074074 -vt 0.157895 0.111111 -vt 0.111842 0.111111 +vt 0.154605 0.111111 +vt 0.108553 0.111111 vt 0.052632 0.074074 -vt 0.105263 0.111111 -vt 0.059211 0.111111 +vt 0.101974 0.111111 +vt 0.055921 0.111111 vt -0.000000 0.074074 -vt 0.052632 0.111111 -vt 0.006579 0.111111 +vt 0.049342 0.111111 +vt 0.003289 0.111111 vt 0.842105 0.074074 -vt 0.796053 0.111111 +vt 0.792763 0.111111 vt 0.789474 0.074074 -vt 0.743421 0.111111 +vt 0.740132 0.111111 vt 0.736842 0.074074 -vt 0.690789 0.111111 +vt 0.687500 0.111111 vt 0.684211 0.074074 -vt 0.638158 0.111111 +vt 0.634869 0.111111 vt 0.631579 0.074074 -vt 0.585526 0.111111 +vt 0.582237 0.111111 vt 0.578947 0.074074 -vt 0.532895 0.111111 +vt 0.529605 0.111111 vt 0.526316 0.074074 -vt 0.480263 0.111111 +vt 0.476974 0.111111 vt 0.473684 0.074074 -vt 0.427632 0.111111 +vt 0.424342 0.111111 vt 0.421053 0.074074 -vt 0.375000 0.111111 +vt 0.371711 0.111111 vt 0.368421 0.074074 vt 0.315789 0.074074 -vt 0.368421 0.111111 -vt 0.322368 0.111111 +vt 0.365132 0.111111 +vt 0.319079 0.111111 vt 0.263158 0.037037 -vt 0.315789 0.000000 +vt 0.312500 0.000000 vt 0.315789 0.037037 vt 0.210526 0.037037 -vt 0.263158 0.000000 +vt 0.259868 0.000000 vt 0.157895 0.037037 -vt 0.210526 0.000000 +vt 0.207237 0.000000 vt 0.105263 0.037037 -vt 0.157895 0.000000 +vt 0.154605 0.000000 vt 0.052632 0.037037 -vt 0.105263 0.000000 +vt 0.101974 0.000000 vt -0.000000 0.037037 -vt 0.052632 0.000000 -vt 0.802632 0.000000 +vt 0.049342 0.000000 +vt 0.799342 0.000000 vt 0.842105 0.037037 vt 0.789474 0.037037 -vt 0.750000 0.000000 +vt 0.746711 0.000000 vt 0.736842 0.037037 -vt 0.697368 0.000000 +vt 0.694079 0.000000 vt 0.684211 0.037037 -vt 0.644737 0.000000 +vt 0.641447 0.000000 vt 0.631579 0.037037 -vt 0.592105 0.000000 +vt 0.588816 0.000000 vt 0.578947 0.037037 -vt 0.539474 0.000000 +vt 0.536184 0.000000 vt 0.526316 0.037037 -vt 0.480263 0.000000 +vt 0.476974 0.000000 vt 0.473684 0.037037 -vt 0.427632 0.000000 +vt 0.424342 0.000000 vt 0.421053 0.037037 -vt 0.375000 0.000000 +vt 0.371711 0.000000 vt 0.368421 0.037037 -vt 0.368421 0.000000 +vt 0.365132 0.000000 vt 0.578947 0.722222 vt 0.657895 0.833333 vt 0.578947 0.833333 @@ -3739,31 +3759,31 @@ vt 0.263158 0.740741 vt 0.368421 0.296296 vt 0.526316 0.592593 vt 0.052632 0.888889 -vt 0.842105 0.111111 -vt 0.789474 0.111111 -vt 0.736842 0.111111 -vt 0.684211 0.111111 -vt 0.631579 0.111111 -vt 0.578947 0.111111 -vt 0.526316 0.111111 -vt 0.473684 0.111111 -vt 0.421053 0.111111 -vt 0.269737 0.000000 -vt 0.217105 0.000000 -vt 0.164474 0.000000 -vt 0.111842 0.000000 -vt 0.059211 0.000000 -vt 0.006579 0.000000 -vt 0.842105 0.000000 -vt 0.789474 0.000000 -vt 0.736842 0.000000 -vt 0.684211 0.000000 -vt 0.631579 0.000000 -vt 0.578947 0.000000 -vt 0.526316 0.000000 -vt 0.473684 0.000000 -vt 0.421053 0.000000 -vt 0.322368 0.000000 +vt 0.838816 0.111111 +vt 0.786184 0.111111 +vt 0.733553 0.111111 +vt 0.680921 0.111111 +vt 0.628289 0.111111 +vt 0.575658 0.111111 +vt 0.523026 0.111111 +vt 0.470395 0.111111 +vt 0.417763 0.111111 +vt 0.266447 0.000000 +vt 0.213816 0.000000 +vt 0.161184 0.000000 +vt 0.108553 0.000000 +vt 0.055921 0.000000 +vt 0.003289 0.000000 +vt 0.838816 0.000000 +vt 0.786184 0.000000 +vt 0.733553 0.000000 +vt 0.680921 0.000000 +vt 0.628289 0.000000 +vt 0.575658 0.000000 +vt 0.523026 0.000000 +vt 0.470395 0.000000 +vt 0.417763 0.000000 +vt 0.319079 0.000000 vt 0.644737 0.888889 vt 0.697368 0.740741 vt 0.539474 0.814815 @@ -3824,22 +3844,22 @@ vt 0.473684 0.685185 vt 0.513158 0.592593 vt 0.578947 0.648148 vt 0.473684 0.685185 -vt 0.059211 0.148148 -vt 0.111842 0.148148 -vt 0.164474 0.148148 -vt 0.217105 0.148148 -vt 0.269737 0.148148 -vt 0.322368 0.148148 -vt 0.375000 0.148148 -vt 0.427632 0.148148 -vt 0.480263 0.148148 -vt 0.638158 0.148148 -vt 0.532895 0.148148 -vt 0.690789 0.148148 -vt 0.585526 0.148148 -vt 0.743421 0.148148 -vt 0.796053 0.148148 -vt 0.006579 0.148148 +vt 0.055921 0.148148 +vt 0.108553 0.148148 +vt 0.161184 0.148148 +vt 0.213816 0.148148 +vt 0.266447 0.148148 +vt 0.319079 0.148148 +vt 0.371711 0.148148 +vt 0.424342 0.148148 +vt 0.476974 0.148148 +vt 0.634869 0.148148 +vt 0.529605 0.148148 +vt 0.687500 0.148148 +vt 0.582237 0.148148 +vt 0.740132 0.148148 +vt 0.792763 0.148148 +vt 0.003289 0.148148 vt 0.960526 0.000000 vt 0.980263 0.370370 vt 0.960526 0.370370 @@ -3857,22 +3877,22 @@ vt 0.921053 0.370370 vt 0.921053 0.000000 vt 0.940789 0.370370 vt 0.940789 0.000000 -vt 0.105263 0.148148 -vt 0.157895 0.148148 -vt 0.210526 0.148148 -vt 0.263158 0.148148 -vt 0.315789 0.148148 -vt 0.368421 0.148148 -vt 0.421053 0.148148 -vt 0.473684 0.148148 -vt 0.526316 0.148148 -vt 0.684211 0.148148 -vt 0.578947 0.148148 -vt 0.736842 0.148148 -vt 0.631579 0.148148 -vt 0.789474 0.148148 -vt 0.842105 0.148148 -vt 0.052632 0.148148 +vt 0.101974 0.148148 +vt 0.154605 0.148148 +vt 0.207237 0.148148 +vt 0.259868 0.148148 +vt 0.312500 0.148148 +vt 0.365132 0.148148 +vt 0.417763 0.148148 +vt 0.470395 0.148148 +vt 0.523026 0.148148 +vt 0.680921 0.148148 +vt 0.575658 0.148148 +vt 0.733553 0.148148 +vt 0.628289 0.148148 +vt 0.786184 0.148148 +vt 0.838816 0.148148 +vt 0.049342 0.148148 vt 1.000000 0.000000 vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 @@ -3899,752 +3919,752 @@ vn -0.9239 0.0000 0.3827 vn -0.0000 -0.7071 -0.7071 vn -0.0000 -0.7071 0.7071 s off -f 566/989/107 564/990/107 565/991/107 -f 568/992/108 569/993/108 567/994/108 -f 570/995/109 573/996/109 569/993/109 -f 574/997/107 571/998/107 573/996/107 -f 572/999/110 567/994/110 571/1000/110 -f 573/996/111 567/1001/111 569/1002/111 -f 570/1003/112 572/1004/112 574/997/112 -f 576/1005/108 577/1006/108 575/1007/108 -f 578/1008/109 581/1009/109 577/1006/109 -f 582/1010/107 579/1011/107 581/1009/107 -f 580/1012/110 575/1007/110 579/1013/110 -f 581/1009/111 575/1014/111 577/1015/111 -f 578/1016/112 580/1017/112 582/1010/112 -f 584/1018/108 585/1019/108 583/1020/108 -f 586/1021/109 589/1022/109 585/1019/109 -f 590/1023/107 587/1024/107 589/1022/107 -f 588/1025/110 583/1020/110 587/1026/110 -f 589/1022/111 583/1027/111 585/1028/111 -f 586/1029/112 588/1030/112 590/1023/112 -f 592/1031/108 593/1032/108 591/1033/108 -f 594/1034/109 597/1035/109 593/1032/109 -f 598/1036/107 595/1037/107 597/1035/107 -f 596/1038/110 591/1033/110 595/1039/110 -f 597/1035/111 591/1040/111 593/1041/111 -f 594/1042/112 596/1043/112 598/1036/112 -f 565/991/111 602/1044/111 566/989/111 -f 563/1045/112 600/1046/112 564/990/112 -f 602/1044/108 600/1047/108 599/1048/108 -f 606/1049/107 604/1050/107 605/1051/107 -f 605/1051/111 610/1052/111 606/1049/111 -f 603/1053/112 608/1054/112 604/1055/112 -f 610/1052/108 608/1054/108 607/1056/108 -f 614/1057/109 612/1058/109 613/1059/109 +f 574/997/107 572/998/107 573/999/107 +f 576/1000/108 577/1001/108 575/1002/108 +f 578/1003/109 581/1004/109 577/1001/109 +f 582/1005/107 579/1006/107 581/1004/107 +f 580/1007/110 575/1002/110 579/1008/110 +f 581/1004/111 575/1009/111 577/1010/111 +f 578/1011/112 580/1012/112 582/1005/112 +f 584/1013/108 585/1014/108 583/1015/108 +f 586/1016/109 589/1017/109 585/1014/109 +f 590/1018/107 587/1019/107 589/1017/107 +f 588/1020/110 583/1015/110 587/1021/110 +f 589/1017/111 583/1022/111 585/1023/111 +f 586/1024/112 588/1025/112 590/1018/112 +f 592/1026/108 593/1027/108 591/1028/108 +f 594/1029/109 597/1030/109 593/1027/109 +f 598/1031/107 595/1032/107 597/1030/107 +f 596/1033/110 591/1028/110 595/1034/110 +f 597/1030/111 591/1035/111 593/1036/111 +f 594/1037/112 596/1038/112 598/1031/112 +f 600/1039/108 601/1040/108 599/1041/108 +f 602/1042/109 605/1043/109 601/1040/109 +f 606/1044/107 603/1045/107 605/1043/107 +f 604/1046/110 599/1041/110 603/1047/110 +f 605/1043/111 599/1048/111 601/1049/111 +f 602/1050/112 604/1051/112 606/1044/112 +f 573/999/111 610/1052/111 574/997/111 +f 571/1053/112 608/1054/112 572/998/112 +f 610/1052/108 608/1055/108 607/1056/108 +f 614/1057/107 612/1058/107 613/1059/107 f 613/1059/111 618/1060/111 614/1057/111 -f 611/1061/112 616/1062/112 612/1058/112 -f 618/1060/110 616/1063/110 615/1064/110 +f 611/1061/112 616/1062/112 612/1063/112 +f 618/1060/108 616/1062/108 615/1064/108 f 622/1065/109 620/1066/109 621/1067/109 f 621/1067/111 626/1068/111 622/1065/111 -f 619/1069/112 624/1070/112 620/1071/112 -f 626/1068/110 624/1070/110 623/1072/110 -f 628/1073/107 629/1074/107 627/1075/107 -f 633/1076/111 642/1077/111 634/1078/111 -f 630/1079/109 635/1080/109 629/1074/109 -f 627/1075/110 637/1081/110 628/1073/110 -f 628/1073/111 638/1082/111 630/1079/111 -f 629/1074/112 636/1083/112 627/1075/112 -f 632/1084/108 635/1085/108 631/1086/108 -f 633/1087/108 636/1088/108 632/1089/108 -f 634/1078/108 637/1090/108 633/1076/108 -f 631/1091/108 638/1092/108 634/1093/108 -f 631/1086/112 640/1094/112 632/1084/112 -f 634/1093/109 639/1095/109 631/1091/109 -f 632/1089/110 641/1096/110 633/1087/110 -f 645/1097/111 644/1098/111 643/1099/111 -f 649/1100/112 647/1101/112 648/1102/112 -f 645/1103/108 650/1104/108 646/1105/108 -f 644/1098/107 648/1102/107 643/1099/107 -f 646/1106/109 649/1100/109 644/1107/109 -f 643/1108/110 647/1101/110 645/1109/110 -f 653/1110/111 652/1111/111 651/1112/111 -f 657/1113/112 655/1114/112 656/1115/112 -f 653/1116/108 658/1117/108 654/1118/108 -f 652/1111/107 656/1115/107 651/1112/107 -f 654/1119/109 657/1113/109 652/1120/109 -f 651/1121/110 655/1114/110 653/1122/110 -f 661/1123/111 660/1124/111 659/1125/111 -f 665/1126/112 663/1127/112 664/1128/112 -f 661/1129/108 666/1130/108 662/1131/108 -f 660/1124/107 664/1128/107 659/1125/107 -f 662/1132/109 665/1126/109 660/1133/109 -f 659/1134/110 663/1127/110 661/1135/110 -f 667/1136/111 676/1137/111 668/1138/111 -f 673/1139/112 677/1140/112 672/1141/112 -f 668/1138/107 678/1142/107 673/1143/107 -f 669/1144/109 674/1145/109 670/1146/109 -f 668/1138/110 672/1147/110 667/1136/110 -f 677/1140/109 676/1137/109 675/1148/109 -f 672/1149/108 675/1148/108 667/1136/108 -f 680/1150/109 681/1151/109 679/1152/109 -f 686/1153/110 683/1154/110 684/1155/110 -f 681/1156/111 684/1157/111 679/1158/111 -f 679/1159/108 683/1154/108 680/1150/108 -f 680/1150/112 685/1160/112 682/1161/112 -f 682/1161/107 686/1162/107 681/1156/107 -f 689/1163/110 688/1164/110 687/1165/110 -f 669/1166/108 690/1167/108 671/1168/108 -f 671/1168/112 689/1163/112 674/1145/112 -f 670/1169/111 688/1170/111 669/1171/111 -f 674/1145/107 687/1172/107 670/1169/107 -f 700/1173/112 717/1174/112 716/1175/112 -f 699/1176/112 716/1177/112 715/1178/112 -f 698/1179/112 715/1180/112 714/1181/112 -f 697/1182/112 714/1183/112 713/1184/112 -f 696/1185/112 713/1186/112 712/1187/112 -f 695/1188/112 712/1189/112 711/1190/112 -f 695/1191/112 710/1192/112 694/1193/112 -f 694/1193/112 709/1194/112 693/1195/112 -f 693/1195/112 708/1196/112 692/1197/112 -f 692/1197/112 707/1198/112 691/1199/112 -f 691/1199/112 722/1200/112 706/1201/112 -f 706/1201/112 721/1202/112 705/1203/112 -f 705/1203/112 720/1204/112 704/1205/112 -f 704/1205/112 719/1206/112 703/1207/112 -f 703/1207/112 718/1208/112 702/1209/112 -f 701/1210/112 718/1211/112 717/1212/112 -f 732/1213/111 749/1214/111 733/1215/111 -f 731/1216/111 748/1217/111 732/1213/111 -f 730/1218/111 747/1219/111 731/1216/111 -f 729/1220/111 746/1221/111 730/1218/111 -f 728/1222/111 745/1223/111 729/1220/111 -f 727/1224/111 744/1225/111 728/1222/111 -f 742/1226/111 727/1227/111 726/1228/111 -f 741/1229/111 726/1228/111 725/1230/111 -f 739/1231/111 725/1230/111 723/1232/111 -f 740/1233/111 723/1232/111 724/1234/111 -f 754/1235/111 724/1234/111 738/1236/111 -f 753/1237/111 738/1236/111 737/1238/111 -f 752/1239/111 737/1238/111 736/1240/111 -f 751/1241/111 736/1240/111 735/1242/111 -f 750/1243/111 735/1242/111 734/1244/111 -f 733/1215/111 750/1245/111 734/1244/111 -f 756/1246/112 757/1247/112 755/1248/112 -f 761/1249/107 802/1250/107 762/1251/107 -f 757/1247/108 796/1252/108 755/1248/108 -f 758/1253/109 795/1254/109 757/1247/109 -f 755/1248/110 797/1255/110 756/1246/110 -f 756/1246/107 798/1256/107 758/1253/107 -f 794/1257/108 863/1258/108 792/1259/108 -f 791/1260/107 865/1261/107 793/1262/107 -f 779/1263/108 851/1264/108 781/1265/108 -f 781/1265/109 854/1266/109 782/1267/109 -f 780/1268/110 852/1269/110 779/1263/110 -f 785/1270/112 784/1271/112 786/1272/112 -f 769/1273/112 768/1274/112 770/1275/112 -f 764/1276/110 858/1277/110 763/1278/110 -f 765/1279/109 855/1280/109 766/1281/109 -f 763/1278/108 856/1282/108 765/1279/108 -f 775/1283/107 861/1284/107 777/1285/107 -f 778/1286/108 859/1287/108 776/1288/108 -f 776/1288/109 862/1289/109 775/1283/109 -f 777/1290/110 860/1291/110 778/1286/110 -f 772/1292/112 773/1293/112 771/1294/112 -f 766/1281/107 857/1295/107 764/1296/107 -f 792/1259/109 866/1297/109 791/1260/109 -f 793/1298/110 864/1299/110 794/1257/110 -f 788/1300/112 789/1301/112 787/1302/112 -f 782/1267/107 853/1303/107 780/1304/107 -f 760/1305/111 795/1306/111 759/1307/111 -f 761/1308/111 796/1309/111 760/1310/111 -f 762/1251/111 797/1311/111 761/1249/111 -f 759/1312/111 798/1313/111 762/1314/111 -f 799/1315/111 801/1316/111 800/1317/111 -f 759/1307/108 800/1318/108 760/1305/108 -f 762/1314/109 799/1319/109 759/1312/109 -f 760/1310/110 801/1320/110 761/1308/110 -f 805/1321/111 804/1322/111 803/1323/111 -f 808/1324/112 810/1325/112 807/1326/112 -f 804/1322/113 808/1324/113 803/1323/113 -f 805/1327/114 810/1325/114 806/1328/114 +f 619/1069/112 624/1070/112 620/1066/112 +f 626/1068/110 624/1071/110 623/1072/110 +f 630/1073/109 628/1074/109 629/1075/109 +f 629/1075/111 634/1076/111 630/1073/111 +f 627/1077/112 632/1078/112 628/1079/112 +f 634/1076/110 632/1078/110 631/1080/110 +f 636/1081/107 637/1082/107 635/1083/107 +f 641/1084/111 650/1085/111 642/1086/111 +f 638/1087/109 643/1088/109 637/1082/109 +f 635/1083/110 645/1089/110 636/1081/110 +f 636/1081/111 646/1090/111 638/1087/111 +f 637/1082/112 644/1091/112 635/1083/112 +f 640/1092/108 643/1093/108 639/1094/108 +f 641/1095/108 644/1096/108 640/1097/108 +f 642/1086/108 645/1098/108 641/1084/108 +f 639/1099/108 646/1100/108 642/1101/108 +f 639/1094/112 648/1102/112 640/1092/112 +f 642/1101/109 647/1103/109 639/1099/109 +f 640/1097/110 649/1104/110 641/1095/110 +f 653/1105/111 652/1106/111 651/1107/111 +f 657/1108/112 655/1109/112 656/1110/112 +f 653/1111/108 658/1112/108 654/1113/108 +f 652/1106/107 656/1110/107 651/1107/107 +f 654/1114/109 657/1108/109 652/1115/109 +f 651/1116/110 655/1109/110 653/1117/110 +f 661/1118/111 660/1119/111 659/1120/111 +f 665/1121/112 663/1122/112 664/1123/112 +f 661/1124/108 666/1125/108 662/1126/108 +f 660/1119/107 664/1123/107 659/1120/107 +f 662/1127/109 665/1121/109 660/1128/109 +f 659/1129/110 663/1122/110 661/1130/110 +f 669/1131/111 668/1132/111 667/1133/111 +f 673/1134/112 671/1135/112 672/1136/112 +f 669/1137/108 674/1138/108 670/1139/108 +f 668/1132/107 672/1136/107 667/1133/107 +f 670/1140/109 673/1134/109 668/1141/109 +f 667/1142/110 671/1135/110 669/1143/110 +f 675/1144/111 684/1145/111 676/1146/111 +f 681/1147/112 685/1148/112 680/1149/112 +f 676/1146/107 686/1150/107 681/1151/107 +f 677/1152/109 682/1153/109 678/1154/109 +f 676/1146/110 680/1155/110 675/1144/110 +f 685/1148/109 684/1145/109 683/1156/109 +f 680/1157/108 683/1156/108 675/1144/108 +f 688/1158/109 689/1159/109 687/1160/109 +f 694/1161/110 691/1162/110 692/1163/110 +f 689/1164/111 692/1165/111 687/1166/111 +f 687/1167/108 691/1162/108 688/1158/108 +f 688/1158/112 693/1168/112 690/1169/112 +f 690/1169/107 694/1170/107 689/1164/107 +f 697/1171/110 696/1172/110 695/1173/110 +f 677/1174/108 698/1175/108 679/1176/108 +f 679/1176/112 697/1171/112 682/1153/112 +f 678/1177/111 696/1178/111 677/1179/111 +f 682/1153/107 695/1180/107 678/1177/107 +f 708/1181/112 725/1182/112 724/1183/112 +f 707/1184/112 724/1185/112 723/1186/112 +f 706/1187/112 723/1188/112 722/1189/112 +f 705/1190/112 722/1191/112 721/1192/112 +f 704/1193/112 721/1194/112 720/1195/112 +f 703/1196/112 720/1197/112 719/1198/112 +f 703/1199/112 718/1200/112 702/1201/112 +f 702/1201/112 717/1202/112 701/1203/112 +f 701/1203/112 716/1204/112 700/1205/112 +f 700/1205/112 715/1206/112 699/1207/112 +f 699/1207/112 730/1208/112 714/1209/112 +f 714/1209/112 729/1210/112 713/1211/112 +f 713/1211/112 728/1212/112 712/1213/112 +f 712/1213/112 727/1214/112 711/1215/112 +f 711/1215/112 726/1216/112 710/1217/112 +f 709/1218/112 726/1219/112 725/1220/112 +f 740/1221/111 757/1222/111 741/1223/111 +f 739/1224/111 756/1225/111 740/1221/111 +f 738/1226/111 755/1227/111 739/1224/111 +f 737/1228/111 754/1229/111 738/1226/111 +f 736/1230/111 753/1231/111 737/1228/111 +f 735/1232/111 752/1233/111 736/1230/111 +f 750/1234/111 735/1235/111 734/1236/111 +f 749/1237/111 734/1236/111 733/1238/111 +f 747/1239/111 733/1238/111 731/1240/111 +f 748/1241/111 731/1240/111 732/1242/111 +f 762/1243/111 732/1242/111 746/1244/111 +f 761/1245/111 746/1244/111 745/1246/111 +f 760/1247/111 745/1246/111 744/1248/111 +f 759/1249/111 744/1248/111 743/1250/111 +f 758/1251/111 743/1250/111 742/1252/111 +f 741/1223/111 758/1253/111 742/1252/111 +f 764/1254/112 765/1255/112 763/1256/112 +f 769/1257/107 810/1258/107 770/1259/107 +f 765/1255/108 804/1260/108 763/1256/108 +f 766/1261/109 803/1262/109 765/1255/109 +f 763/1256/110 805/1263/110 764/1254/110 +f 764/1254/107 806/1264/107 766/1261/107 +f 802/1265/108 871/1266/108 800/1267/108 +f 799/1268/107 873/1269/107 801/1270/107 +f 787/1271/108 859/1272/108 789/1273/108 +f 789/1273/109 862/1274/109 790/1275/109 +f 788/1276/110 860/1277/110 787/1271/110 +f 793/1278/112 792/1279/112 794/1280/112 +f 777/1281/112 776/1282/112 778/1283/112 +f 772/1284/110 866/1285/110 771/1286/110 +f 773/1287/109 863/1288/109 774/1289/109 +f 771/1286/108 864/1290/108 773/1287/108 +f 783/1291/107 869/1292/107 785/1293/107 +f 786/1294/108 867/1295/108 784/1296/108 +f 784/1296/109 870/1297/109 783/1291/109 +f 785/1298/110 868/1299/110 786/1294/110 +f 780/1300/112 781/1301/112 779/1302/112 +f 774/1289/107 865/1303/107 772/1304/107 +f 800/1267/109 874/1305/109 799/1268/109 +f 801/1306/110 872/1307/110 802/1265/110 +f 796/1308/112 797/1309/112 795/1310/112 +f 790/1275/107 861/1311/107 788/1312/107 +f 768/1313/111 803/1314/111 767/1315/111 +f 769/1316/111 804/1317/111 768/1318/111 +f 770/1259/111 805/1319/111 769/1257/111 +f 767/1320/111 806/1321/111 770/1322/111 +f 807/1323/111 809/1324/111 808/1325/111 +f 767/1315/108 808/1326/108 768/1313/108 +f 770/1322/109 807/1327/109 767/1320/109 +f 768/1318/110 809/1328/110 769/1316/110 f 813/1329/111 812/1330/111 811/1331/111 f 816/1332/112 818/1333/112 815/1334/112 -f 812/1330/115 816/1332/115 811/1331/115 -f 813/1335/116 818/1333/116 814/1336/116 -f 820/1337/112 840/1338/112 837/1339/112 -f 849/1340/108 848/1341/108 850/1342/108 -f 838/1343/111 841/1344/111 819/1345/111 -f 846/1346/111 849/1340/111 843/1347/111 -f 841/1344/107 840/1338/107 842/1348/107 -f 830/1349/107 828/1350/107 826/1351/107 -f 844/1352/112 848/1341/112 845/1353/112 -f 827/1354/108 831/1355/108 835/1356/108 -f 784/1357/117 852/1269/117 786/1358/117 -f 786/1359/118 853/1360/118 785/1361/118 -f 785/1270/119 854/1266/119 783/1362/119 -f 783/1363/120 851/1264/120 784/1364/120 -f 767/1365/120 856/1282/120 768/1366/120 -f 769/1273/119 855/1280/119 767/1367/119 -f 770/1368/118 857/1369/118 769/1370/118 -f 768/1371/117 858/1277/117 770/1372/117 -f 773/1373/117 860/1291/117 771/1374/117 -f 771/1375/118 861/1376/118 772/1377/118 -f 772/1292/119 862/1289/119 774/1378/119 -f 774/1379/120 859/1287/120 773/1380/120 -f 789/1381/117 864/1299/117 787/1382/117 -f 787/1383/118 865/1384/118 788/1385/118 -f 788/1300/119 866/1297/119 790/1386/119 -f 790/1387/120 863/1258/120 789/1388/120 -f 868/1389/107 869/1390/107 867/1391/107 -f 873/1392/111 882/1393/111 874/1394/111 -f 870/1395/109 875/1396/109 869/1390/109 -f 867/1391/110 877/1397/110 868/1389/110 -f 868/1389/111 878/1398/111 870/1395/111 -f 869/1390/112 876/1399/112 867/1391/112 -f 872/1400/108 875/1401/108 871/1402/108 -f 873/1403/108 876/1404/108 872/1405/108 -f 874/1394/108 877/1406/108 873/1392/108 -f 871/1407/108 878/1408/108 874/1409/108 -f 871/1402/112 880/1410/112 872/1400/112 -f 874/1409/109 879/1411/109 871/1407/109 -f 872/1405/110 881/1412/110 873/1403/110 -f 884/1413/107 885/1414/107 883/1415/107 -f 889/1416/111 898/1417/111 890/1418/111 -f 886/1419/109 891/1420/109 885/1414/109 -f 883/1415/110 893/1421/110 884/1413/110 -f 884/1413/111 894/1422/111 886/1419/111 -f 885/1414/112 892/1423/112 883/1415/112 -f 888/1424/108 891/1425/108 887/1426/108 -f 889/1427/108 892/1428/108 888/1429/108 -f 890/1418/108 893/1430/108 889/1416/108 -f 887/1431/108 894/1432/108 890/1433/108 -f 887/1426/112 896/1434/112 888/1424/112 -f 890/1433/109 895/1435/109 887/1431/109 -f 888/1429/110 897/1436/110 889/1427/110 -f 900/1437/108 901/1438/108 899/1439/108 -f 905/1440/111 914/1441/111 906/1442/111 -f 902/1443/110 907/1444/110 901/1438/110 -f 899/1439/109 909/1445/109 900/1437/109 -f 900/1437/111 910/1446/111 902/1443/111 -f 901/1438/112 908/1447/112 899/1439/112 -f 904/1448/107 907/1449/107 903/1450/107 -f 905/1451/107 908/1452/107 904/1453/107 -f 906/1442/107 909/1454/107 905/1440/107 -f 903/1455/107 910/1456/107 906/1457/107 -f 903/1450/112 912/1458/112 904/1448/112 -f 906/1457/110 911/1459/110 903/1455/110 -f 904/1453/109 913/1460/109 905/1451/109 -f 916/1461/108 917/1462/108 915/1463/108 -f 921/1464/111 930/1465/111 922/1466/111 -f 918/1467/110 923/1468/110 917/1462/110 -f 915/1463/109 925/1469/109 916/1461/109 -f 916/1461/111 926/1470/111 918/1467/111 -f 917/1462/112 924/1471/112 915/1463/112 -f 920/1472/107 923/1473/107 919/1474/107 -f 921/1475/107 924/1476/107 920/1477/107 -f 922/1466/107 925/1478/107 921/1464/107 -f 919/1479/107 926/1480/107 922/1481/107 -f 919/1474/112 928/1482/112 920/1472/112 -f 922/1481/110 927/1483/110 919/1479/110 -f 920/1477/109 929/1484/109 921/1475/109 -f 932/1485/108 933/1486/108 931/1487/108 -f 937/1488/111 946/1489/111 938/1490/111 -f 934/1491/110 939/1492/110 933/1486/110 -f 931/1487/109 941/1493/109 932/1485/109 -f 932/1485/111 942/1494/111 934/1491/111 -f 933/1486/112 940/1495/112 931/1487/112 -f 936/1496/107 939/1497/107 935/1498/107 -f 937/1499/107 940/1500/107 936/1501/107 -f 938/1490/107 941/1502/107 937/1488/107 -f 935/1503/107 942/1504/107 938/1505/107 -f 935/1498/112 944/1506/112 936/1496/112 -f 938/1505/110 943/1507/110 935/1503/110 -f 936/1501/109 945/1508/109 937/1499/109 -f 948/1509/109 949/1510/109 947/1511/109 -f 953/1512/111 962/1513/111 954/1514/111 -f 950/1515/108 955/1516/108 949/1510/108 -f 947/1511/107 957/1517/107 948/1509/107 -f 948/1509/111 958/1518/111 950/1515/111 -f 949/1510/112 956/1519/112 947/1511/112 -f 952/1520/110 955/1521/110 951/1522/110 -f 953/1523/110 956/1524/110 952/1525/110 -f 954/1514/110 957/1526/110 953/1512/110 -f 951/1527/110 958/1528/110 954/1529/110 -f 951/1522/112 960/1530/112 952/1520/112 -f 954/1529/108 959/1531/108 951/1527/108 -f 952/1525/107 961/1532/107 953/1523/107 -f 964/1533/109 965/1534/109 963/1535/109 -f 969/1536/111 978/1537/111 970/1538/111 -f 966/1539/108 971/1540/108 965/1534/108 -f 963/1535/107 973/1541/107 964/1533/107 -f 964/1533/111 974/1542/111 966/1539/111 -f 965/1534/112 972/1543/112 963/1535/112 -f 968/1544/110 971/1545/110 967/1546/110 -f 969/1547/110 972/1548/110 968/1549/110 -f 970/1538/110 973/1550/110 969/1536/110 -f 967/1551/110 974/1552/110 970/1553/110 -f 967/1546/112 976/1554/112 968/1544/112 -f 970/1553/108 975/1555/108 967/1551/108 -f 968/1549/107 977/1556/107 969/1547/107 -f 980/1557/109 981/1558/109 979/1559/109 -f 985/1560/111 994/1561/111 986/1562/111 -f 982/1563/108 987/1564/108 981/1558/108 -f 979/1559/107 989/1565/107 980/1557/107 -f 980/1557/111 990/1566/111 982/1563/111 -f 981/1558/112 988/1567/112 979/1559/112 -f 984/1568/110 987/1569/110 983/1570/110 -f 985/1571/110 988/1572/110 984/1573/110 -f 986/1562/110 989/1574/110 985/1560/110 -f 983/1575/110 990/1576/110 986/1577/110 -f 984/1568/112 991/1578/112 992/1579/112 -f 986/1577/108 991/1580/108 983/1575/108 -f 984/1573/107 993/1581/107 985/1571/107 -f 996/1582/110 997/1583/110 995/1584/110 -f 1001/1585/111 1010/1586/111 1002/1587/111 -f 998/1588/107 1003/1589/107 997/1583/107 -f 995/1584/108 1005/1590/108 996/1582/108 -f 996/1582/111 1006/1591/111 998/1588/111 -f 997/1583/112 1004/1592/112 995/1584/112 -f 1000/1593/109 1003/1594/109 999/1595/109 -f 1001/1596/109 1004/1597/109 1000/1598/109 -f 1002/1587/109 1005/1599/109 1001/1585/109 -f 999/1600/109 1006/1601/109 1002/1602/109 -f 1000/1593/112 1007/1603/112 1008/1604/112 -f 1002/1602/107 1007/1605/107 999/1600/107 -f 1000/1598/108 1009/1606/108 1001/1596/108 -f 1012/1607/110 1013/1608/110 1011/1609/110 -f 1017/1610/111 1026/1611/111 1018/1612/111 -f 1014/1613/107 1019/1614/107 1013/1608/107 -f 1011/1609/108 1021/1615/108 1012/1607/108 -f 1012/1607/111 1022/1616/111 1014/1613/111 -f 1013/1608/112 1020/1617/112 1011/1609/112 -f 1016/1618/109 1019/1619/109 1015/1620/109 -f 1017/1621/109 1020/1622/109 1016/1623/109 -f 1018/1612/109 1021/1624/109 1017/1610/109 -f 1015/1625/109 1022/1626/109 1018/1627/109 -f 1015/1620/112 1024/1628/112 1016/1618/112 -f 1018/1627/107 1023/1629/107 1015/1625/107 -f 1016/1623/108 1025/1630/108 1017/1621/108 -f 1028/1631/110 1029/1632/110 1027/1633/110 -f 1033/1634/111 1042/1635/111 1034/1636/111 -f 1030/1637/107 1035/1638/107 1029/1632/107 -f 1027/1633/108 1037/1639/108 1028/1631/108 -f 1028/1631/111 1038/1640/111 1030/1637/111 -f 1027/1633/112 1035/1641/112 1036/1642/112 -f 1032/1643/109 1035/1641/109 1031/1644/109 -f 1033/1645/109 1036/1646/109 1032/1647/109 -f 1034/1636/109 1037/1648/109 1033/1634/109 -f 1031/1649/109 1038/1650/109 1034/1651/109 -f 1032/1643/112 1039/1652/112 1040/1653/112 -f 1034/1651/107 1039/1654/107 1031/1649/107 -f 1032/1647/108 1041/1655/108 1033/1645/108 -f 566/989/107 563/1045/107 564/990/107 -f 568/992/108 570/995/108 569/993/108 -f 570/995/109 574/997/109 573/996/109 -f 574/997/107 572/1004/107 571/998/107 -f 572/999/110 568/992/110 567/994/110 -f 573/996/111 571/998/111 567/1001/111 -f 570/1003/112 568/1656/112 572/1004/112 -f 576/1005/108 578/1008/108 577/1006/108 -f 578/1008/109 582/1010/109 581/1009/109 -f 582/1010/107 580/1017/107 579/1011/107 -f 580/1012/110 576/1005/110 575/1007/110 -f 581/1009/111 579/1011/111 575/1014/111 -f 578/1016/112 576/1657/112 580/1017/112 -f 584/1018/108 586/1021/108 585/1019/108 -f 586/1021/109 590/1023/109 589/1022/109 -f 590/1023/107 588/1030/107 587/1024/107 -f 588/1025/110 584/1018/110 583/1020/110 -f 589/1022/111 587/1024/111 583/1027/111 -f 586/1029/112 584/1658/112 588/1030/112 -f 592/1031/108 594/1034/108 593/1032/108 -f 594/1034/109 598/1036/109 597/1035/109 -f 598/1036/107 596/1043/107 595/1037/107 -f 596/1038/110 592/1031/110 591/1033/110 -f 597/1035/111 595/1037/111 591/1040/111 -f 594/1042/112 592/1659/112 596/1043/112 -f 565/991/111 601/1660/111 602/1044/111 -f 563/1045/112 599/1661/112 600/1046/112 -f 602/1044/108 601/1660/108 600/1047/108 -f 606/1049/107 603/1662/107 604/1050/107 -f 605/1051/111 609/1663/111 610/1052/111 -f 603/1053/112 607/1056/112 608/1054/112 -f 610/1052/108 609/1663/108 608/1054/108 -f 614/1057/109 611/1061/109 612/1058/109 -f 613/1059/111 617/1664/111 618/1060/111 -f 611/1061/112 615/1665/112 616/1062/112 -f 618/1060/110 617/1664/110 616/1063/110 -f 622/1065/109 619/1666/109 620/1066/109 -f 621/1067/111 625/1667/111 626/1068/111 -f 619/1069/112 623/1072/112 624/1070/112 -f 626/1068/110 625/1667/110 624/1070/110 -f 628/1073/107 630/1079/107 629/1074/107 -f 633/1076/111 641/1668/111 642/1077/111 -f 630/1079/109 638/1092/109 635/1080/109 -f 627/1075/110 636/1088/110 637/1081/110 -f 628/1073/111 637/1090/111 638/1082/111 -f 629/1074/112 635/1085/112 636/1083/112 -f 632/1084/108 636/1083/108 635/1085/108 -f 633/1087/108 637/1081/108 636/1088/108 -f 634/1078/108 638/1082/108 637/1090/108 -f 631/1091/108 635/1080/108 638/1092/108 -f 631/1086/112 639/1669/112 640/1094/112 -f 634/1093/109 642/1670/109 639/1095/109 -f 632/1089/110 640/1671/110 641/1096/110 -f 645/1097/111 646/1672/111 644/1098/111 -f 649/1100/112 650/1104/112 647/1101/112 -f 645/1103/108 647/1101/108 650/1104/108 -f 644/1098/107 649/1100/107 648/1102/107 -f 646/1106/109 650/1104/109 649/1100/109 -f 643/1108/110 648/1102/110 647/1101/110 -f 653/1110/111 654/1673/111 652/1111/111 -f 657/1113/112 658/1117/112 655/1114/112 -f 653/1116/108 655/1114/108 658/1117/108 -f 652/1111/107 657/1113/107 656/1115/107 -f 654/1119/109 658/1117/109 657/1113/109 -f 651/1121/110 656/1115/110 655/1114/110 -f 661/1123/111 662/1674/111 660/1124/111 -f 665/1126/112 666/1130/112 663/1127/112 -f 661/1129/108 663/1127/108 666/1130/108 -f 660/1124/107 665/1126/107 664/1128/107 -f 662/1132/109 666/1130/109 665/1126/109 -f 659/1134/110 664/1128/110 663/1127/110 -f 667/1136/111 675/1148/111 676/1137/111 -f 673/1139/112 678/1675/112 677/1140/112 -f 668/1138/107 676/1137/107 678/1142/107 -f 669/1144/109 671/1168/109 674/1145/109 -f 668/1138/110 673/1676/110 672/1147/110 -f 677/1140/109 678/1675/109 676/1137/109 -f 672/1149/108 677/1677/108 675/1148/108 -f 680/1150/109 682/1161/109 681/1151/109 -f 686/1153/110 685/1160/110 683/1154/110 -f 681/1156/111 686/1162/111 684/1157/111 -f 679/1159/108 684/1678/108 683/1154/108 -f 680/1150/112 683/1154/112 685/1160/112 -f 682/1161/107 685/1160/107 686/1162/107 -f 689/1163/110 690/1167/110 688/1164/110 -f 669/1166/108 688/1679/108 690/1167/108 -f 671/1168/112 690/1167/112 689/1163/112 -f 670/1169/111 687/1172/111 688/1170/111 -f 674/1145/107 689/1163/107 687/1172/107 -f 700/1173/112 701/1210/112 717/1174/112 -f 699/1176/112 700/1173/112 716/1177/112 -f 698/1179/112 699/1176/112 715/1180/112 -f 697/1182/112 698/1179/112 714/1183/112 -f 696/1185/112 697/1182/112 713/1186/112 -f 695/1188/112 696/1185/112 712/1189/112 -f 695/1191/112 711/1680/112 710/1192/112 -f 694/1193/112 710/1681/112 709/1194/112 -f 693/1195/112 709/1682/112 708/1196/112 -f 692/1197/112 708/1683/112 707/1198/112 -f 691/1199/112 707/1684/112 722/1200/112 -f 706/1201/112 722/1685/112 721/1202/112 -f 705/1203/112 721/1686/112 720/1204/112 -f 704/1205/112 720/1687/112 719/1206/112 -f 703/1207/112 719/1688/112 718/1208/112 -f 701/1210/112 702/1209/112 718/1211/112 -f 732/1213/111 748/1689/111 749/1214/111 -f 731/1216/111 747/1690/111 748/1217/111 -f 730/1218/111 746/1691/111 747/1219/111 -f 729/1220/111 745/1692/111 746/1221/111 -f 728/1222/111 744/1693/111 745/1223/111 -f 727/1224/111 743/1694/111 744/1225/111 -f 742/1226/111 743/1695/111 727/1227/111 -f 741/1229/111 742/1696/111 726/1228/111 -f 739/1231/111 741/1697/111 725/1230/111 -f 740/1233/111 739/1698/111 723/1232/111 -f 754/1235/111 740/1699/111 724/1234/111 -f 753/1237/111 754/1700/111 738/1236/111 -f 752/1239/111 753/1701/111 737/1238/111 -f 751/1241/111 752/1702/111 736/1240/111 -f 750/1243/111 751/1703/111 735/1242/111 -f 733/1215/111 749/1704/111 750/1245/111 -f 756/1246/112 758/1253/112 757/1247/112 -f 761/1249/107 801/1316/107 802/1250/107 -f 757/1247/108 795/1306/108 796/1252/108 -f 758/1253/109 798/1313/109 795/1254/109 -f 755/1248/110 796/1309/110 797/1255/110 -f 756/1246/107 797/1311/107 798/1256/107 -f 794/1257/108 864/1299/108 863/1258/108 -f 791/1260/107 866/1297/107 865/1261/107 -f 779/1263/108 852/1269/108 851/1264/108 -f 781/1265/109 851/1264/109 854/1266/109 -f 780/1268/110 853/1360/110 852/1269/110 -f 785/1270/112 783/1362/112 784/1271/112 -f 769/1273/112 767/1367/112 768/1274/112 -f 764/1276/110 857/1369/110 858/1277/110 -f 765/1279/109 856/1282/109 855/1280/109 -f 763/1278/108 858/1277/108 856/1282/108 -f 775/1283/107 862/1289/107 861/1284/107 -f 778/1286/108 860/1291/108 859/1287/108 -f 776/1288/109 859/1287/109 862/1289/109 -f 777/1290/110 861/1376/110 860/1291/110 -f 772/1292/112 774/1378/112 773/1293/112 -f 766/1281/107 855/1280/107 857/1295/107 -f 792/1259/109 863/1258/109 866/1297/109 -f 793/1298/110 865/1384/110 864/1299/110 -f 788/1300/112 790/1386/112 789/1301/112 -f 782/1267/107 854/1266/107 853/1303/107 -f 760/1305/111 796/1252/111 795/1306/111 -f 761/1308/111 797/1255/111 796/1309/111 -f 762/1251/111 798/1256/111 797/1311/111 -f 759/1312/111 795/1254/111 798/1313/111 -f 799/1315/111 802/1250/111 801/1316/111 -f 759/1307/108 799/1705/108 800/1318/108 -f 762/1314/109 802/1706/109 799/1319/109 -f 760/1310/110 800/1707/110 801/1320/110 -f 805/1321/111 806/1708/111 804/1322/111 -f 808/1324/112 809/1709/112 810/1325/112 -f 804/1322/113 809/1709/113 808/1324/113 -f 805/1327/114 807/1326/114 810/1325/114 -f 813/1329/111 814/1710/111 812/1330/111 -f 816/1332/112 817/1711/112 818/1333/112 -f 812/1330/115 817/1711/115 816/1332/115 -f 813/1335/116 815/1334/116 818/1333/116 -f 820/1337/112 842/1348/112 840/1338/112 -f 849/1340/108 847/1712/108 848/1341/108 -f 838/1343/111 839/1713/111 841/1344/111 -f 846/1346/111 847/1712/111 849/1340/111 -f 841/1344/107 839/1713/107 840/1338/107 -f 826/1351/107 824/1714/107 822/1715/107 -f 822/1715/107 836/1716/107 826/1351/107 -f 836/1716/107 834/1717/107 826/1351/107 -f 834/1717/107 832/1718/107 826/1351/107 -f 832/1718/107 830/1349/107 826/1351/107 -f 844/1352/112 850/1342/112 848/1341/112 -f 835/1356/108 821/1719/108 823/1720/108 -f 823/1720/108 825/1721/108 827/1354/108 -f 827/1354/108 829/1722/108 831/1355/108 -f 831/1355/108 833/1723/108 835/1356/108 -f 835/1356/108 823/1720/108 827/1354/108 -f 784/1357/117 851/1264/117 852/1269/117 -f 786/1359/118 852/1269/118 853/1360/118 -f 785/1270/119 853/1303/119 854/1266/119 -f 783/1363/120 854/1266/120 851/1264/120 -f 767/1365/120 855/1280/120 856/1282/120 -f 769/1273/119 857/1295/119 855/1280/119 -f 770/1368/118 858/1277/118 857/1369/118 -f 768/1371/117 856/1282/117 858/1277/117 -f 773/1373/117 859/1287/117 860/1291/117 -f 771/1375/118 860/1291/118 861/1376/118 -f 772/1292/119 861/1284/119 862/1289/119 -f 774/1379/120 862/1289/120 859/1287/120 -f 789/1381/117 863/1258/117 864/1299/117 -f 787/1383/118 864/1299/118 865/1384/118 -f 788/1300/119 865/1261/119 866/1297/119 -f 790/1387/120 866/1297/120 863/1258/120 -f 868/1389/107 870/1395/107 869/1390/107 -f 873/1392/111 881/1724/111 882/1393/111 -f 870/1395/109 878/1408/109 875/1396/109 -f 867/1391/110 876/1404/110 877/1397/110 -f 868/1389/111 877/1406/111 878/1398/111 -f 869/1390/112 875/1401/112 876/1399/112 -f 872/1400/108 876/1399/108 875/1401/108 -f 873/1403/108 877/1397/108 876/1404/108 -f 874/1394/108 878/1398/108 877/1406/108 -f 871/1407/108 875/1396/108 878/1408/108 -f 871/1402/112 879/1725/112 880/1410/112 -f 874/1409/109 882/1726/109 879/1411/109 -f 872/1405/110 880/1727/110 881/1412/110 -f 884/1413/107 886/1419/107 885/1414/107 -f 889/1416/111 897/1728/111 898/1417/111 -f 886/1419/109 894/1432/109 891/1420/109 -f 883/1415/110 892/1428/110 893/1421/110 -f 884/1413/111 893/1430/111 894/1422/111 -f 885/1414/112 891/1425/112 892/1423/112 -f 888/1424/108 892/1423/108 891/1425/108 -f 889/1427/108 893/1421/108 892/1428/108 -f 890/1418/108 894/1422/108 893/1430/108 -f 887/1431/108 891/1420/108 894/1432/108 -f 887/1426/112 895/1729/112 896/1434/112 -f 890/1433/109 898/1730/109 895/1435/109 -f 888/1429/110 896/1731/110 897/1436/110 -f 900/1437/108 902/1443/108 901/1438/108 -f 905/1440/111 913/1732/111 914/1441/111 -f 902/1443/110 910/1456/110 907/1444/110 -f 899/1439/109 908/1452/109 909/1445/109 -f 900/1437/111 909/1454/111 910/1446/111 -f 901/1438/112 907/1449/112 908/1447/112 -f 904/1448/107 908/1447/107 907/1449/107 -f 905/1451/107 909/1445/107 908/1452/107 -f 906/1442/107 910/1446/107 909/1454/107 -f 903/1455/107 907/1444/107 910/1456/107 -f 903/1450/112 911/1733/112 912/1458/112 -f 906/1457/110 914/1734/110 911/1459/110 -f 904/1453/109 912/1735/109 913/1460/109 -f 916/1461/108 918/1467/108 917/1462/108 -f 921/1464/111 929/1736/111 930/1465/111 -f 918/1467/110 926/1480/110 923/1468/110 -f 915/1463/109 924/1476/109 925/1469/109 -f 916/1461/111 925/1478/111 926/1470/111 -f 917/1462/112 923/1473/112 924/1471/112 -f 920/1472/107 924/1471/107 923/1473/107 -f 921/1475/107 925/1469/107 924/1476/107 -f 922/1466/107 926/1470/107 925/1478/107 -f 919/1479/107 923/1468/107 926/1480/107 -f 919/1474/112 927/1737/112 928/1482/112 -f 922/1481/110 930/1738/110 927/1483/110 -f 920/1477/109 928/1739/109 929/1484/109 -f 932/1485/108 934/1491/108 933/1486/108 -f 937/1488/111 945/1740/111 946/1489/111 -f 934/1491/110 942/1504/110 939/1492/110 -f 931/1487/109 940/1500/109 941/1493/109 -f 932/1485/111 941/1502/111 942/1494/111 -f 933/1486/112 939/1497/112 940/1495/112 -f 936/1496/107 940/1495/107 939/1497/107 -f 937/1499/107 941/1493/107 940/1500/107 -f 938/1490/107 942/1494/107 941/1502/107 -f 935/1503/107 939/1492/107 942/1504/107 -f 935/1498/112 943/1741/112 944/1506/112 -f 938/1505/110 946/1742/110 943/1507/110 -f 936/1501/109 944/1743/109 945/1508/109 -f 948/1509/109 950/1515/109 949/1510/109 -f 953/1512/111 961/1744/111 962/1513/111 -f 950/1515/108 958/1528/108 955/1516/108 -f 947/1511/107 956/1524/107 957/1517/107 -f 948/1509/111 957/1526/111 958/1518/111 -f 949/1510/112 955/1521/112 956/1519/112 -f 952/1520/110 956/1519/110 955/1521/110 -f 953/1523/110 957/1517/110 956/1524/110 -f 954/1514/110 958/1518/110 957/1526/110 -f 951/1527/110 955/1516/110 958/1528/110 -f 951/1522/112 959/1745/112 960/1530/112 -f 954/1529/108 962/1746/108 959/1531/108 -f 952/1525/107 960/1747/107 961/1532/107 -f 964/1533/109 966/1539/109 965/1534/109 -f 969/1536/111 977/1748/111 978/1537/111 -f 966/1539/108 974/1552/108 971/1540/108 -f 963/1535/107 972/1548/107 973/1541/107 -f 964/1533/111 973/1550/111 974/1542/111 -f 965/1534/112 971/1545/112 972/1543/112 -f 968/1544/110 972/1543/110 971/1545/110 -f 969/1547/110 973/1541/110 972/1548/110 -f 970/1538/110 974/1542/110 973/1550/110 -f 967/1551/110 971/1540/110 974/1552/110 -f 967/1546/112 975/1749/112 976/1554/112 -f 970/1553/108 978/1750/108 975/1555/108 -f 968/1549/107 976/1751/107 977/1556/107 -f 980/1557/109 982/1563/109 981/1558/109 -f 985/1560/111 993/1752/111 994/1561/111 -f 982/1563/108 990/1576/108 987/1564/108 -f 979/1559/107 988/1572/107 989/1565/107 -f 980/1557/111 989/1574/111 990/1566/111 -f 981/1558/112 987/1569/112 988/1567/112 -f 984/1568/110 988/1567/110 987/1569/110 -f 985/1571/110 989/1565/110 988/1572/110 -f 986/1562/110 990/1566/110 989/1574/110 -f 983/1575/110 987/1564/110 990/1576/110 -f 984/1568/112 983/1570/112 991/1578/112 -f 986/1577/108 994/1753/108 991/1580/108 -f 984/1573/107 992/1754/107 993/1581/107 -f 996/1582/110 998/1588/110 997/1583/110 -f 1001/1585/111 1009/1755/111 1010/1586/111 -f 998/1588/107 1006/1601/107 1003/1589/107 -f 995/1584/108 1004/1597/108 1005/1590/108 -f 996/1582/111 1005/1599/111 1006/1591/111 -f 997/1583/112 1003/1594/112 1004/1592/112 -f 1000/1593/109 1004/1592/109 1003/1594/109 -f 1001/1596/109 1005/1590/109 1004/1597/109 -f 1002/1587/109 1006/1591/109 1005/1599/109 -f 999/1600/109 1003/1589/109 1006/1601/109 -f 1000/1593/112 999/1595/112 1007/1603/112 -f 1002/1602/107 1010/1756/107 1007/1605/107 -f 1000/1598/108 1008/1757/108 1009/1606/108 -f 1012/1607/110 1014/1613/110 1013/1608/110 -f 1017/1610/111 1025/1758/111 1026/1611/111 -f 1014/1613/107 1022/1626/107 1019/1614/107 -f 1011/1609/108 1020/1622/108 1021/1615/108 -f 1012/1607/111 1021/1624/111 1022/1616/111 -f 1013/1608/112 1019/1619/112 1020/1617/112 -f 1016/1618/109 1020/1617/109 1019/1619/109 -f 1017/1621/109 1021/1615/109 1020/1622/109 -f 1018/1612/109 1022/1616/109 1021/1624/109 -f 1015/1625/109 1019/1614/109 1022/1626/109 -f 1015/1620/112 1023/1759/112 1024/1628/112 -f 1018/1627/107 1026/1760/107 1023/1629/107 -f 1016/1623/108 1024/1761/108 1025/1630/108 -f 1028/1631/110 1030/1637/110 1029/1632/110 -f 1033/1634/111 1041/1762/111 1042/1635/111 -f 1030/1637/107 1038/1650/107 1035/1638/107 -f 1027/1633/108 1036/1646/108 1037/1639/108 -f 1028/1631/111 1037/1648/111 1038/1640/111 -f 1027/1633/112 1029/1632/112 1035/1641/112 -f 1032/1643/109 1036/1642/109 1035/1641/109 -f 1033/1645/109 1037/1639/109 1036/1646/109 -f 1034/1636/109 1038/1640/109 1037/1648/109 -f 1031/1649/109 1035/1638/109 1038/1650/109 -f 1032/1643/112 1031/1644/112 1039/1652/112 -f 1034/1651/107 1042/1763/107 1039/1654/107 -f 1032/1647/108 1040/1764/108 1041/1655/108 +f 812/1330/113 816/1332/113 811/1331/113 +f 813/1335/114 818/1333/114 814/1336/114 +f 821/1337/111 820/1338/111 819/1339/111 +f 824/1340/112 826/1341/112 823/1342/112 +f 820/1338/115 824/1340/115 819/1339/115 +f 821/1343/116 826/1341/116 822/1344/116 +f 828/1345/112 848/1346/112 845/1347/112 +f 857/1348/108 856/1349/108 858/1350/108 +f 846/1351/111 849/1352/111 827/1353/111 +f 854/1354/111 857/1348/111 851/1355/111 +f 849/1352/107 848/1346/107 850/1356/107 +f 838/1357/107 836/1358/107 834/1359/107 +f 852/1360/112 856/1349/112 853/1361/112 +f 835/1362/108 839/1363/108 843/1364/108 +f 792/1365/117 860/1277/117 794/1366/117 +f 794/1367/118 861/1368/118 793/1369/118 +f 793/1278/119 862/1274/119 791/1370/119 +f 791/1371/120 859/1272/120 792/1372/120 +f 775/1373/120 864/1290/120 776/1374/120 +f 777/1281/119 863/1288/119 775/1375/119 +f 778/1376/118 865/1377/118 777/1378/118 +f 776/1379/117 866/1285/117 778/1380/117 +f 781/1381/117 868/1299/117 779/1382/117 +f 779/1383/118 869/1384/118 780/1385/118 +f 780/1300/119 870/1297/119 782/1386/119 +f 782/1387/120 867/1295/120 781/1388/120 +f 797/1389/117 872/1307/117 795/1390/117 +f 795/1391/118 873/1392/118 796/1393/118 +f 796/1308/119 874/1305/119 798/1394/119 +f 798/1395/120 871/1266/120 797/1396/120 +f 876/1397/107 877/1398/107 875/1399/107 +f 881/1400/111 890/1401/111 882/1402/111 +f 878/1403/109 883/1404/109 877/1398/109 +f 875/1399/110 885/1405/110 876/1397/110 +f 876/1397/111 886/1406/111 878/1403/111 +f 877/1398/112 884/1407/112 875/1399/112 +f 880/1408/108 883/1409/108 879/1410/108 +f 881/1411/108 884/1412/108 880/1413/108 +f 882/1402/108 885/1414/108 881/1400/108 +f 879/1415/108 886/1416/108 882/1417/108 +f 879/1410/112 888/1418/112 880/1408/112 +f 882/1417/109 887/1419/109 879/1415/109 +f 880/1413/110 889/1420/110 881/1411/110 +f 892/1421/107 893/1422/107 891/1423/107 +f 897/1424/111 906/1425/111 898/1426/111 +f 894/1427/109 899/1428/109 893/1422/109 +f 891/1423/110 901/1429/110 892/1421/110 +f 892/1421/111 902/1430/111 894/1427/111 +f 893/1422/112 900/1431/112 891/1423/112 +f 896/1432/108 899/1433/108 895/1434/108 +f 897/1435/108 900/1436/108 896/1437/108 +f 898/1426/108 901/1438/108 897/1424/108 +f 895/1439/108 902/1440/108 898/1441/108 +f 895/1434/112 904/1442/112 896/1432/112 +f 898/1441/109 903/1443/109 895/1439/109 +f 896/1437/110 905/1444/110 897/1435/110 +f 908/1445/108 909/1446/108 907/1447/108 +f 913/1448/111 922/1449/111 914/1450/111 +f 910/1451/110 915/1452/110 909/1446/110 +f 907/1447/109 917/1453/109 908/1445/109 +f 908/1445/111 918/1454/111 910/1451/111 +f 909/1446/112 916/1455/112 907/1447/112 +f 912/1456/107 915/1457/107 911/1458/107 +f 913/1459/107 916/1460/107 912/1461/107 +f 914/1450/107 917/1462/107 913/1448/107 +f 911/1463/107 918/1464/107 914/1465/107 +f 911/1458/112 920/1466/112 912/1456/112 +f 914/1465/110 919/1467/110 911/1463/110 +f 912/1461/109 921/1468/109 913/1459/109 +f 924/1469/108 925/1470/108 923/1471/108 +f 929/1472/111 938/1473/111 930/1474/111 +f 926/1475/110 931/1476/110 925/1470/110 +f 923/1471/109 933/1477/109 924/1469/109 +f 924/1469/111 934/1478/111 926/1475/111 +f 925/1470/112 932/1479/112 923/1471/112 +f 928/1480/107 931/1481/107 927/1482/107 +f 929/1483/107 932/1484/107 928/1485/107 +f 930/1474/107 933/1486/107 929/1472/107 +f 927/1487/107 934/1488/107 930/1489/107 +f 927/1482/112 936/1490/112 928/1480/112 +f 930/1489/110 935/1491/110 927/1487/110 +f 928/1485/109 937/1492/109 929/1483/109 +f 940/1493/108 941/1494/108 939/1495/108 +f 945/1496/111 954/1497/111 946/1498/111 +f 942/1499/110 947/1500/110 941/1494/110 +f 939/1495/109 949/1501/109 940/1493/109 +f 940/1493/111 950/1502/111 942/1499/111 +f 941/1494/112 948/1503/112 939/1495/112 +f 944/1504/107 947/1505/107 943/1506/107 +f 945/1507/107 948/1508/107 944/1509/107 +f 946/1498/107 949/1510/107 945/1496/107 +f 943/1511/107 950/1512/107 946/1513/107 +f 943/1506/112 952/1514/112 944/1504/112 +f 946/1513/110 951/1515/110 943/1511/110 +f 944/1509/109 953/1516/109 945/1507/109 +f 956/1517/109 957/1518/109 955/1519/109 +f 961/1520/111 970/1521/111 962/1522/111 +f 958/1523/108 963/1524/108 957/1518/108 +f 955/1519/107 965/1525/107 956/1517/107 +f 956/1517/111 966/1526/111 958/1523/111 +f 957/1518/112 964/1527/112 955/1519/112 +f 960/1528/110 963/1529/110 959/1530/110 +f 961/1531/110 964/1532/110 960/1533/110 +f 962/1522/110 965/1534/110 961/1520/110 +f 959/1535/110 966/1536/110 962/1537/110 +f 959/1530/112 968/1538/112 960/1528/112 +f 962/1537/108 967/1539/108 959/1535/108 +f 960/1533/107 969/1540/107 961/1531/107 +f 972/1541/109 973/1542/109 971/1543/109 +f 977/1544/111 986/1545/111 978/1546/111 +f 974/1547/108 979/1548/108 973/1542/108 +f 971/1543/107 981/1549/107 972/1541/107 +f 972/1541/111 982/1550/111 974/1547/111 +f 973/1542/112 980/1551/112 971/1543/112 +f 976/1552/110 979/1553/110 975/1554/110 +f 977/1555/110 980/1556/110 976/1557/110 +f 978/1546/110 981/1558/110 977/1544/110 +f 975/1559/110 982/1560/110 978/1561/110 +f 975/1554/112 984/1562/112 976/1552/112 +f 978/1561/108 983/1563/108 975/1559/108 +f 976/1557/107 985/1564/107 977/1555/107 +f 988/1565/109 989/1566/109 987/1567/109 +f 993/1568/111 1002/1569/111 994/1570/111 +f 990/1571/108 995/1572/108 989/1566/108 +f 987/1567/107 997/1573/107 988/1565/107 +f 988/1565/111 998/1574/111 990/1571/111 +f 989/1566/112 996/1575/112 987/1567/112 +f 992/1576/110 995/1577/110 991/1578/110 +f 993/1579/110 996/1580/110 992/1581/110 +f 994/1570/110 997/1582/110 993/1568/110 +f 991/1583/110 998/1584/110 994/1585/110 +f 992/1576/112 999/1586/112 1000/1587/112 +f 994/1585/108 999/1588/108 991/1583/108 +f 992/1581/107 1001/1589/107 993/1579/107 +f 1004/1590/110 1005/1591/110 1003/1592/110 +f 1009/1593/111 1018/1594/111 1010/1595/111 +f 1006/1596/107 1011/1597/107 1005/1591/107 +f 1003/1592/108 1013/1598/108 1004/1590/108 +f 1004/1590/111 1014/1599/111 1006/1596/111 +f 1005/1591/112 1012/1600/112 1003/1592/112 +f 1008/1601/109 1011/1602/109 1007/1603/109 +f 1009/1604/109 1012/1605/109 1008/1606/109 +f 1010/1595/109 1013/1607/109 1009/1593/109 +f 1007/1608/109 1014/1609/109 1010/1610/109 +f 1008/1601/112 1015/1611/112 1016/1612/112 +f 1010/1610/107 1015/1613/107 1007/1608/107 +f 1008/1606/108 1017/1614/108 1009/1604/108 +f 1020/1615/110 1021/1616/110 1019/1617/110 +f 1025/1618/111 1034/1619/111 1026/1620/111 +f 1022/1621/107 1027/1622/107 1021/1616/107 +f 1019/1617/108 1029/1623/108 1020/1615/108 +f 1020/1615/111 1030/1624/111 1022/1621/111 +f 1021/1616/112 1028/1625/112 1019/1617/112 +f 1024/1626/109 1027/1627/109 1023/1628/109 +f 1025/1629/109 1028/1630/109 1024/1631/109 +f 1026/1620/109 1029/1632/109 1025/1618/109 +f 1023/1633/109 1030/1634/109 1026/1635/109 +f 1023/1628/112 1032/1636/112 1024/1626/112 +f 1026/1635/107 1031/1637/107 1023/1633/107 +f 1024/1631/108 1033/1638/108 1025/1629/108 +f 1036/1639/110 1037/1640/110 1035/1641/110 +f 1041/1642/111 1050/1643/111 1042/1644/111 +f 1038/1645/107 1043/1646/107 1037/1640/107 +f 1035/1641/108 1045/1647/108 1036/1639/108 +f 1036/1639/111 1046/1648/111 1038/1645/111 +f 1035/1641/112 1043/1649/112 1044/1650/112 +f 1040/1651/109 1043/1649/109 1039/1652/109 +f 1041/1653/109 1044/1654/109 1040/1655/109 +f 1042/1644/109 1045/1656/109 1041/1642/109 +f 1039/1657/109 1046/1658/109 1042/1659/109 +f 1040/1651/112 1047/1660/112 1048/1661/112 +f 1042/1659/107 1047/1662/107 1039/1657/107 +f 1040/1655/108 1049/1663/108 1041/1653/108 +f 574/997/107 571/1053/107 572/998/107 +f 576/1000/108 578/1003/108 577/1001/108 +f 578/1003/109 582/1005/109 581/1004/109 +f 582/1005/107 580/1012/107 579/1006/107 +f 580/1007/110 576/1000/110 575/1002/110 +f 581/1004/111 579/1006/111 575/1009/111 +f 578/1011/112 576/1664/112 580/1012/112 +f 584/1013/108 586/1016/108 585/1014/108 +f 586/1016/109 590/1018/109 589/1017/109 +f 590/1018/107 588/1025/107 587/1019/107 +f 588/1020/110 584/1013/110 583/1015/110 +f 589/1017/111 587/1019/111 583/1022/111 +f 586/1024/112 584/1665/112 588/1025/112 +f 592/1026/108 594/1029/108 593/1027/108 +f 594/1029/109 598/1031/109 597/1030/109 +f 598/1031/107 596/1038/107 595/1032/107 +f 596/1033/110 592/1026/110 591/1028/110 +f 597/1030/111 595/1032/111 591/1035/111 +f 594/1037/112 592/1666/112 596/1038/112 +f 600/1039/108 602/1042/108 601/1040/108 +f 602/1042/109 606/1044/109 605/1043/109 +f 606/1044/107 604/1051/107 603/1045/107 +f 604/1046/110 600/1039/110 599/1041/110 +f 605/1043/111 603/1045/111 599/1048/111 +f 602/1050/112 600/1667/112 604/1051/112 +f 573/999/111 609/1668/111 610/1052/111 +f 571/1053/112 607/1669/112 608/1054/112 +f 610/1052/108 609/1668/108 608/1055/108 +f 614/1057/107 611/1670/107 612/1058/107 +f 613/1059/111 617/1671/111 618/1060/111 +f 611/1061/112 615/1064/112 616/1062/112 +f 618/1060/108 617/1671/108 616/1062/108 +f 622/1065/109 619/1069/109 620/1066/109 +f 621/1067/111 625/1672/111 626/1068/111 +f 619/1069/112 623/1673/112 624/1070/112 +f 626/1068/110 625/1672/110 624/1071/110 +f 630/1073/109 627/1674/109 628/1074/109 +f 629/1075/111 633/1675/111 634/1076/111 +f 627/1077/112 631/1080/112 632/1078/112 +f 634/1076/110 633/1675/110 632/1078/110 +f 636/1081/107 638/1087/107 637/1082/107 +f 641/1084/111 649/1676/111 650/1085/111 +f 638/1087/109 646/1100/109 643/1088/109 +f 635/1083/110 644/1096/110 645/1089/110 +f 636/1081/111 645/1098/111 646/1090/111 +f 637/1082/112 643/1093/112 644/1091/112 +f 640/1092/108 644/1091/108 643/1093/108 +f 641/1095/108 645/1089/108 644/1096/108 +f 642/1086/108 646/1090/108 645/1098/108 +f 639/1099/108 643/1088/108 646/1100/108 +f 639/1094/112 647/1677/112 648/1102/112 +f 642/1101/109 650/1678/109 647/1103/109 +f 640/1097/110 648/1679/110 649/1104/110 +f 653/1105/111 654/1680/111 652/1106/111 +f 657/1108/112 658/1112/112 655/1109/112 +f 653/1111/108 655/1109/108 658/1112/108 +f 652/1106/107 657/1108/107 656/1110/107 +f 654/1114/109 658/1112/109 657/1108/109 +f 651/1116/110 656/1110/110 655/1109/110 +f 661/1118/111 662/1681/111 660/1119/111 +f 665/1121/112 666/1125/112 663/1122/112 +f 661/1124/108 663/1122/108 666/1125/108 +f 660/1119/107 665/1121/107 664/1123/107 +f 662/1127/109 666/1125/109 665/1121/109 +f 659/1129/110 664/1123/110 663/1122/110 +f 669/1131/111 670/1682/111 668/1132/111 +f 673/1134/112 674/1138/112 671/1135/112 +f 669/1137/108 671/1135/108 674/1138/108 +f 668/1132/107 673/1134/107 672/1136/107 +f 670/1140/109 674/1138/109 673/1134/109 +f 667/1142/110 672/1136/110 671/1135/110 +f 675/1144/111 683/1156/111 684/1145/111 +f 681/1147/112 686/1683/112 685/1148/112 +f 676/1146/107 684/1145/107 686/1150/107 +f 677/1152/109 679/1176/109 682/1153/109 +f 676/1146/110 681/1684/110 680/1155/110 +f 685/1148/109 686/1683/109 684/1145/109 +f 680/1157/108 685/1685/108 683/1156/108 +f 688/1158/109 690/1169/109 689/1159/109 +f 694/1161/110 693/1168/110 691/1162/110 +f 689/1164/111 694/1170/111 692/1165/111 +f 687/1167/108 692/1686/108 691/1162/108 +f 688/1158/112 691/1162/112 693/1168/112 +f 690/1169/107 693/1168/107 694/1170/107 +f 697/1171/110 698/1175/110 696/1172/110 +f 677/1174/108 696/1687/108 698/1175/108 +f 679/1176/112 698/1175/112 697/1171/112 +f 678/1177/111 695/1180/111 696/1178/111 +f 682/1153/107 697/1171/107 695/1180/107 +f 708/1181/112 709/1218/112 725/1182/112 +f 707/1184/112 708/1181/112 724/1185/112 +f 706/1187/112 707/1184/112 723/1188/112 +f 705/1190/112 706/1187/112 722/1191/112 +f 704/1193/112 705/1190/112 721/1194/112 +f 703/1196/112 704/1193/112 720/1197/112 +f 703/1199/112 719/1688/112 718/1200/112 +f 702/1201/112 718/1689/112 717/1202/112 +f 701/1203/112 717/1690/112 716/1204/112 +f 700/1205/112 716/1691/112 715/1206/112 +f 699/1207/112 715/1692/112 730/1208/112 +f 714/1209/112 730/1693/112 729/1210/112 +f 713/1211/112 729/1694/112 728/1212/112 +f 712/1213/112 728/1695/112 727/1214/112 +f 711/1215/112 727/1696/112 726/1216/112 +f 709/1218/112 710/1217/112 726/1219/112 +f 740/1221/111 756/1697/111 757/1222/111 +f 739/1224/111 755/1698/111 756/1225/111 +f 738/1226/111 754/1699/111 755/1227/111 +f 737/1228/111 753/1700/111 754/1229/111 +f 736/1230/111 752/1701/111 753/1231/111 +f 735/1232/111 751/1702/111 752/1233/111 +f 750/1234/111 751/1703/111 735/1235/111 +f 749/1237/111 750/1704/111 734/1236/111 +f 747/1239/111 749/1705/111 733/1238/111 +f 748/1241/111 747/1706/111 731/1240/111 +f 762/1243/111 748/1707/111 732/1242/111 +f 761/1245/111 762/1708/111 746/1244/111 +f 760/1247/111 761/1709/111 745/1246/111 +f 759/1249/111 760/1710/111 744/1248/111 +f 758/1251/111 759/1711/111 743/1250/111 +f 741/1223/111 757/1712/111 758/1253/111 +f 764/1254/112 766/1261/112 765/1255/112 +f 769/1257/107 809/1324/107 810/1258/107 +f 765/1255/108 803/1314/108 804/1260/108 +f 766/1261/109 806/1321/109 803/1262/109 +f 763/1256/110 804/1317/110 805/1263/110 +f 764/1254/107 805/1319/107 806/1264/107 +f 802/1265/108 872/1307/108 871/1266/108 +f 799/1268/107 874/1305/107 873/1269/107 +f 787/1271/108 860/1277/108 859/1272/108 +f 789/1273/109 859/1272/109 862/1274/109 +f 788/1276/110 861/1368/110 860/1277/110 +f 793/1278/112 791/1370/112 792/1279/112 +f 777/1281/112 775/1375/112 776/1282/112 +f 772/1284/110 865/1377/110 866/1285/110 +f 773/1287/109 864/1290/109 863/1288/109 +f 771/1286/108 866/1285/108 864/1290/108 +f 783/1291/107 870/1297/107 869/1292/107 +f 786/1294/108 868/1299/108 867/1295/108 +f 784/1296/109 867/1295/109 870/1297/109 +f 785/1298/110 869/1384/110 868/1299/110 +f 780/1300/112 782/1386/112 781/1301/112 +f 774/1289/107 863/1288/107 865/1303/107 +f 800/1267/109 871/1266/109 874/1305/109 +f 801/1306/110 873/1392/110 872/1307/110 +f 796/1308/112 798/1394/112 797/1309/112 +f 790/1275/107 862/1274/107 861/1311/107 +f 768/1313/111 804/1260/111 803/1314/111 +f 769/1316/111 805/1263/111 804/1317/111 +f 770/1259/111 806/1264/111 805/1319/111 +f 767/1320/111 803/1262/111 806/1321/111 +f 807/1323/111 810/1258/111 809/1324/111 +f 767/1315/108 807/1713/108 808/1326/108 +f 770/1322/109 810/1714/109 807/1327/109 +f 768/1318/110 808/1715/110 809/1328/110 +f 813/1329/111 814/1716/111 812/1330/111 +f 816/1332/112 817/1717/112 818/1333/112 +f 812/1330/113 817/1717/113 816/1332/113 +f 813/1335/114 815/1334/114 818/1333/114 +f 821/1337/111 822/1718/111 820/1338/111 +f 824/1340/112 825/1719/112 826/1341/112 +f 820/1338/115 825/1719/115 824/1340/115 +f 821/1343/116 823/1342/116 826/1341/116 +f 828/1345/112 850/1356/112 848/1346/112 +f 857/1348/108 855/1720/108 856/1349/108 +f 846/1351/111 847/1721/111 849/1352/111 +f 854/1354/111 855/1720/111 857/1348/111 +f 849/1352/107 847/1721/107 848/1346/107 +f 834/1359/107 832/1722/107 830/1723/107 +f 830/1723/107 844/1724/107 834/1359/107 +f 844/1724/107 842/1725/107 834/1359/107 +f 842/1725/107 840/1726/107 834/1359/107 +f 840/1726/107 838/1357/107 834/1359/107 +f 852/1360/112 858/1350/112 856/1349/112 +f 843/1364/108 829/1727/108 831/1728/108 +f 831/1728/108 833/1729/108 835/1362/108 +f 835/1362/108 837/1730/108 839/1363/108 +f 839/1363/108 841/1731/108 843/1364/108 +f 843/1364/108 831/1728/108 835/1362/108 +f 792/1365/117 859/1272/117 860/1277/117 +f 794/1367/118 860/1277/118 861/1368/118 +f 793/1278/119 861/1311/119 862/1274/119 +f 791/1371/120 862/1274/120 859/1272/120 +f 775/1373/120 863/1288/120 864/1290/120 +f 777/1281/119 865/1303/119 863/1288/119 +f 778/1376/118 866/1285/118 865/1377/118 +f 776/1379/117 864/1290/117 866/1285/117 +f 781/1381/117 867/1295/117 868/1299/117 +f 779/1383/118 868/1299/118 869/1384/118 +f 780/1300/119 869/1292/119 870/1297/119 +f 782/1387/120 870/1297/120 867/1295/120 +f 797/1389/117 871/1266/117 872/1307/117 +f 795/1391/118 872/1307/118 873/1392/118 +f 796/1308/119 873/1269/119 874/1305/119 +f 798/1395/120 874/1305/120 871/1266/120 +f 876/1397/107 878/1403/107 877/1398/107 +f 881/1400/111 889/1732/111 890/1401/111 +f 878/1403/109 886/1416/109 883/1404/109 +f 875/1399/110 884/1412/110 885/1405/110 +f 876/1397/111 885/1414/111 886/1406/111 +f 877/1398/112 883/1409/112 884/1407/112 +f 880/1408/108 884/1407/108 883/1409/108 +f 881/1411/108 885/1405/108 884/1412/108 +f 882/1402/108 886/1406/108 885/1414/108 +f 879/1415/108 883/1404/108 886/1416/108 +f 879/1410/112 887/1733/112 888/1418/112 +f 882/1417/109 890/1734/109 887/1419/109 +f 880/1413/110 888/1735/110 889/1420/110 +f 892/1421/107 894/1427/107 893/1422/107 +f 897/1424/111 905/1736/111 906/1425/111 +f 894/1427/109 902/1440/109 899/1428/109 +f 891/1423/110 900/1436/110 901/1429/110 +f 892/1421/111 901/1438/111 902/1430/111 +f 893/1422/112 899/1433/112 900/1431/112 +f 896/1432/108 900/1431/108 899/1433/108 +f 897/1435/108 901/1429/108 900/1436/108 +f 898/1426/108 902/1430/108 901/1438/108 +f 895/1439/108 899/1428/108 902/1440/108 +f 895/1434/112 903/1737/112 904/1442/112 +f 898/1441/109 906/1738/109 903/1443/109 +f 896/1437/110 904/1739/110 905/1444/110 +f 908/1445/108 910/1451/108 909/1446/108 +f 913/1448/111 921/1740/111 922/1449/111 +f 910/1451/110 918/1464/110 915/1452/110 +f 907/1447/109 916/1460/109 917/1453/109 +f 908/1445/111 917/1462/111 918/1454/111 +f 909/1446/112 915/1457/112 916/1455/112 +f 912/1456/107 916/1455/107 915/1457/107 +f 913/1459/107 917/1453/107 916/1460/107 +f 914/1450/107 918/1454/107 917/1462/107 +f 911/1463/107 915/1452/107 918/1464/107 +f 911/1458/112 919/1741/112 920/1466/112 +f 914/1465/110 922/1742/110 919/1467/110 +f 912/1461/109 920/1743/109 921/1468/109 +f 924/1469/108 926/1475/108 925/1470/108 +f 929/1472/111 937/1744/111 938/1473/111 +f 926/1475/110 934/1488/110 931/1476/110 +f 923/1471/109 932/1484/109 933/1477/109 +f 924/1469/111 933/1486/111 934/1478/111 +f 925/1470/112 931/1481/112 932/1479/112 +f 928/1480/107 932/1479/107 931/1481/107 +f 929/1483/107 933/1477/107 932/1484/107 +f 930/1474/107 934/1478/107 933/1486/107 +f 927/1487/107 931/1476/107 934/1488/107 +f 927/1482/112 935/1745/112 936/1490/112 +f 930/1489/110 938/1746/110 935/1491/110 +f 928/1485/109 936/1747/109 937/1492/109 +f 940/1493/108 942/1499/108 941/1494/108 +f 945/1496/111 953/1748/111 954/1497/111 +f 942/1499/110 950/1512/110 947/1500/110 +f 939/1495/109 948/1508/109 949/1501/109 +f 940/1493/111 949/1510/111 950/1502/111 +f 941/1494/112 947/1505/112 948/1503/112 +f 944/1504/107 948/1503/107 947/1505/107 +f 945/1507/107 949/1501/107 948/1508/107 +f 946/1498/107 950/1502/107 949/1510/107 +f 943/1511/107 947/1500/107 950/1512/107 +f 943/1506/112 951/1749/112 952/1514/112 +f 946/1513/110 954/1750/110 951/1515/110 +f 944/1509/109 952/1751/109 953/1516/109 +f 956/1517/109 958/1523/109 957/1518/109 +f 961/1520/111 969/1752/111 970/1521/111 +f 958/1523/108 966/1536/108 963/1524/108 +f 955/1519/107 964/1532/107 965/1525/107 +f 956/1517/111 965/1534/111 966/1526/111 +f 957/1518/112 963/1529/112 964/1527/112 +f 960/1528/110 964/1527/110 963/1529/110 +f 961/1531/110 965/1525/110 964/1532/110 +f 962/1522/110 966/1526/110 965/1534/110 +f 959/1535/110 963/1524/110 966/1536/110 +f 959/1530/112 967/1753/112 968/1538/112 +f 962/1537/108 970/1754/108 967/1539/108 +f 960/1533/107 968/1755/107 969/1540/107 +f 972/1541/109 974/1547/109 973/1542/109 +f 977/1544/111 985/1756/111 986/1545/111 +f 974/1547/108 982/1560/108 979/1548/108 +f 971/1543/107 980/1556/107 981/1549/107 +f 972/1541/111 981/1558/111 982/1550/111 +f 973/1542/112 979/1553/112 980/1551/112 +f 976/1552/110 980/1551/110 979/1553/110 +f 977/1555/110 981/1549/110 980/1556/110 +f 978/1546/110 982/1550/110 981/1558/110 +f 975/1559/110 979/1548/110 982/1560/110 +f 975/1554/112 983/1757/112 984/1562/112 +f 978/1561/108 986/1758/108 983/1563/108 +f 976/1557/107 984/1759/107 985/1564/107 +f 988/1565/109 990/1571/109 989/1566/109 +f 993/1568/111 1001/1760/111 1002/1569/111 +f 990/1571/108 998/1584/108 995/1572/108 +f 987/1567/107 996/1580/107 997/1573/107 +f 988/1565/111 997/1582/111 998/1574/111 +f 989/1566/112 995/1577/112 996/1575/112 +f 992/1576/110 996/1575/110 995/1577/110 +f 993/1579/110 997/1573/110 996/1580/110 +f 994/1570/110 998/1574/110 997/1582/110 +f 991/1583/110 995/1572/110 998/1584/110 +f 992/1576/112 991/1578/112 999/1586/112 +f 994/1585/108 1002/1761/108 999/1588/108 +f 992/1581/107 1000/1762/107 1001/1589/107 +f 1004/1590/110 1006/1596/110 1005/1591/110 +f 1009/1593/111 1017/1763/111 1018/1594/111 +f 1006/1596/107 1014/1609/107 1011/1597/107 +f 1003/1592/108 1012/1605/108 1013/1598/108 +f 1004/1590/111 1013/1607/111 1014/1599/111 +f 1005/1591/112 1011/1602/112 1012/1600/112 +f 1008/1601/109 1012/1600/109 1011/1602/109 +f 1009/1604/109 1013/1598/109 1012/1605/109 +f 1010/1595/109 1014/1599/109 1013/1607/109 +f 1007/1608/109 1011/1597/109 1014/1609/109 +f 1008/1601/112 1007/1603/112 1015/1611/112 +f 1010/1610/107 1018/1764/107 1015/1613/107 +f 1008/1606/108 1016/1765/108 1017/1614/108 +f 1020/1615/110 1022/1621/110 1021/1616/110 +f 1025/1618/111 1033/1766/111 1034/1619/111 +f 1022/1621/107 1030/1634/107 1027/1622/107 +f 1019/1617/108 1028/1630/108 1029/1623/108 +f 1020/1615/111 1029/1632/111 1030/1624/111 +f 1021/1616/112 1027/1627/112 1028/1625/112 +f 1024/1626/109 1028/1625/109 1027/1627/109 +f 1025/1629/109 1029/1623/109 1028/1630/109 +f 1026/1620/109 1030/1624/109 1029/1632/109 +f 1023/1633/109 1027/1622/109 1030/1634/109 +f 1023/1628/112 1031/1767/112 1032/1636/112 +f 1026/1635/107 1034/1768/107 1031/1637/107 +f 1024/1631/108 1032/1769/108 1033/1638/108 +f 1036/1639/110 1038/1645/110 1037/1640/110 +f 1041/1642/111 1049/1770/111 1050/1643/111 +f 1038/1645/107 1046/1658/107 1043/1646/107 +f 1035/1641/108 1044/1654/108 1045/1647/108 +f 1036/1639/111 1045/1656/111 1046/1648/111 +f 1035/1641/112 1037/1640/112 1043/1649/112 +f 1040/1651/109 1044/1650/109 1043/1649/109 +f 1041/1653/109 1045/1647/109 1044/1654/109 +f 1042/1644/109 1046/1648/109 1045/1656/109 +f 1039/1657/109 1043/1646/109 1046/1658/109 +f 1040/1651/112 1039/1652/112 1047/1660/112 +f 1042/1659/107 1050/1771/107 1047/1662/107 +f 1040/1655/108 1048/1772/108 1049/1663/108 s 1 -f 698/1179/121 731/1216/110 699/1176/110 -f 713/1186/115 744/1765/122 712/1187/122 -f 699/1176/110 732/1213/123 700/1173/123 -f 714/1183/124 745/1766/115 713/1184/115 -f 700/1173/123 733/1215/113 701/1210/113 -f 715/1180/109 746/1767/124 714/1181/124 -f 701/1210/113 734/1244/125 702/1209/125 -f 716/1177/126 747/1768/109 715/1178/109 -f 702/1209/125 735/1242/107 703/1207/107 -f 717/1174/114 748/1769/126 716/1175/126 -f 703/1207/107 736/1240/122 704/1205/122 -f 718/1211/127 749/1770/114 717/1212/114 -f 704/1205/122 737/1238/115 705/1203/115 -f 691/1199/109 723/1232/126 692/1197/126 -f 719/1688/108 750/1771/127 718/1208/127 -f 705/1203/115 738/1236/124 706/1201/124 -f 692/1197/126 725/1230/114 693/1195/114 -f 720/1687/128 751/1772/108 719/1206/108 -f 706/1201/124 724/1234/109 691/1199/109 -f 693/1195/114 726/1228/127 694/1193/127 -f 721/1686/116 752/1773/128 720/1204/128 -f 708/1683/123 740/1774/110 707/1198/110 -f 694/1193/127 727/1227/108 695/1191/108 -f 722/1685/121 753/1775/116 721/1202/116 -f 709/1682/113 739/1776/123 708/1196/123 -f 695/1188/108 728/1222/128 696/1185/128 -f 707/1684/110 754/1777/121 722/1200/121 -f 710/1681/125 741/1778/113 709/1194/113 -f 696/1185/128 729/1220/116 697/1182/116 -f 711/1680/107 742/1779/125 710/1192/125 -f 697/1182/116 730/1218/121 698/1179/121 -f 712/1189/122 743/1780/107 711/1190/107 -f 822/1781/109 823/1782/129 821/1783/109 -f 824/1784/129 825/1785/111 823/1782/129 -f 826/1786/111 827/1787/130 825/1788/111 -f 828/1789/130 829/1790/110 827/1787/130 -f 830/1791/110 831/1792/118 829/1790/110 -f 832/1793/118 833/1794/112 831/1792/118 -f 834/1795/112 835/1796/120 833/1794/112 -f 836/1797/120 821/1783/109 835/1796/120 -f 698/1179/121 730/1218/121 731/1216/110 -f 713/1186/115 745/1798/115 744/1765/122 -f 699/1176/110 731/1216/110 732/1213/123 -f 714/1183/124 746/1799/124 745/1766/115 -f 700/1173/123 732/1213/123 733/1215/113 -f 715/1180/109 747/1800/109 746/1767/124 -f 701/1210/113 733/1215/113 734/1244/125 -f 716/1177/126 748/1801/126 747/1768/109 -f 702/1209/125 734/1244/125 735/1242/107 -f 717/1174/114 749/1802/114 748/1769/126 -f 703/1207/107 735/1242/107 736/1240/122 -f 718/1211/127 750/1803/127 749/1770/114 -f 704/1205/122 736/1240/122 737/1238/115 -f 691/1199/109 724/1234/109 723/1232/126 -f 719/1688/108 751/1804/108 750/1771/127 -f 705/1203/115 737/1238/115 738/1236/124 -f 692/1197/126 723/1232/126 725/1230/114 -f 720/1687/128 752/1805/128 751/1772/108 -f 706/1201/124 738/1236/124 724/1234/109 -f 693/1195/114 725/1230/114 726/1228/127 -f 721/1686/116 753/1806/116 752/1773/128 -f 708/1683/123 739/1807/123 740/1774/110 -f 694/1193/127 726/1228/127 727/1227/108 -f 722/1685/121 754/1808/121 753/1775/116 -f 709/1682/113 741/1809/113 739/1776/123 -f 695/1188/108 727/1224/108 728/1222/128 -f 707/1684/110 740/1810/110 754/1777/121 -f 710/1681/125 742/1811/125 741/1778/113 -f 696/1185/128 728/1222/128 729/1220/116 -f 711/1680/107 743/1812/107 742/1779/125 -f 697/1182/116 729/1220/116 730/1218/121 -f 712/1189/122 744/1813/122 743/1780/107 -f 822/1781/109 824/1784/129 823/1782/129 -f 824/1784/129 826/1814/111 825/1785/111 -f 826/1786/111 828/1789/130 827/1787/130 -f 828/1789/130 830/1791/110 829/1790/110 -f 830/1791/110 832/1793/118 831/1792/118 -f 832/1793/118 834/1795/112 833/1794/112 -f 834/1795/112 836/1797/120 835/1796/120 -f 836/1797/120 822/1781/109 821/1783/109 +f 706/1187/121 739/1224/110 707/1184/110 +f 721/1194/115 752/1773/122 720/1195/122 +f 707/1184/110 740/1221/123 708/1181/123 +f 722/1191/124 753/1774/115 721/1192/115 +f 708/1181/123 741/1223/113 709/1218/113 +f 723/1188/109 754/1775/124 722/1189/124 +f 709/1218/113 742/1252/125 710/1217/125 +f 724/1185/126 755/1776/109 723/1186/109 +f 710/1217/125 743/1250/107 711/1215/107 +f 725/1182/114 756/1777/126 724/1183/126 +f 711/1215/107 744/1248/122 712/1213/122 +f 726/1219/127 757/1778/114 725/1220/114 +f 712/1213/122 745/1246/115 713/1211/115 +f 699/1207/109 731/1240/126 700/1205/126 +f 727/1696/108 758/1779/127 726/1216/127 +f 713/1211/115 746/1244/124 714/1209/124 +f 700/1205/126 733/1238/114 701/1203/114 +f 728/1695/128 759/1780/108 727/1214/108 +f 714/1209/124 732/1242/109 699/1207/109 +f 701/1203/114 734/1236/127 702/1201/127 +f 729/1694/116 760/1781/128 728/1212/128 +f 716/1691/123 748/1782/110 715/1206/110 +f 702/1201/127 735/1235/108 703/1199/108 +f 730/1693/121 761/1783/116 729/1210/116 +f 717/1690/113 747/1784/123 716/1204/123 +f 703/1196/108 736/1230/128 704/1193/128 +f 715/1692/110 762/1785/121 730/1208/121 +f 718/1689/125 749/1786/113 717/1202/113 +f 704/1193/128 737/1228/116 705/1190/116 +f 719/1688/107 750/1787/125 718/1200/125 +f 705/1190/116 738/1226/121 706/1187/121 +f 720/1197/122 751/1788/107 719/1198/107 +f 830/1789/109 831/1790/129 829/1791/109 +f 832/1792/129 833/1793/111 831/1790/129 +f 834/1794/111 835/1795/130 833/1796/111 +f 836/1797/130 837/1798/110 835/1795/130 +f 838/1799/110 839/1800/118 837/1798/110 +f 840/1801/118 841/1802/112 839/1800/118 +f 842/1803/112 843/1804/120 841/1802/112 +f 844/1805/120 829/1791/109 843/1804/120 +f 706/1187/121 738/1226/121 739/1224/110 +f 721/1194/115 753/1806/115 752/1773/122 +f 707/1184/110 739/1224/110 740/1221/123 +f 722/1191/124 754/1807/124 753/1774/115 +f 708/1181/123 740/1221/123 741/1223/113 +f 723/1188/109 755/1808/109 754/1775/124 +f 709/1218/113 741/1223/113 742/1252/125 +f 724/1185/126 756/1809/126 755/1776/109 +f 710/1217/125 742/1252/125 743/1250/107 +f 725/1182/114 757/1810/114 756/1777/126 +f 711/1215/107 743/1250/107 744/1248/122 +f 726/1219/127 758/1811/127 757/1778/114 +f 712/1213/122 744/1248/122 745/1246/115 +f 699/1207/109 732/1242/109 731/1240/126 +f 727/1696/108 759/1812/108 758/1779/127 +f 713/1211/115 745/1246/115 746/1244/124 +f 700/1205/126 731/1240/126 733/1238/114 +f 728/1695/128 760/1813/128 759/1780/108 +f 714/1209/124 746/1244/124 732/1242/109 +f 701/1203/114 733/1238/114 734/1236/127 +f 729/1694/116 761/1814/116 760/1781/128 +f 716/1691/123 747/1815/123 748/1782/110 +f 702/1201/127 734/1236/127 735/1235/108 +f 730/1693/121 762/1816/121 761/1783/116 +f 717/1690/113 749/1817/113 747/1784/123 +f 703/1196/108 735/1232/108 736/1230/128 +f 715/1692/110 748/1818/110 762/1785/121 +f 718/1689/125 750/1819/125 749/1786/113 +f 704/1193/128 736/1230/128 737/1228/116 +f 719/1688/107 751/1820/107 750/1787/125 +f 705/1190/116 737/1228/116 738/1226/121 +f 720/1197/122 752/1821/122 751/1788/107 +f 830/1789/109 832/1792/129 831/1790/129 +f 832/1792/129 834/1822/111 833/1793/111 +f 834/1794/111 836/1797/130 835/1795/130 +f 836/1797/130 838/1799/110 837/1798/110 +f 838/1799/110 840/1801/118 839/1800/118 +f 840/1801/118 842/1803/112 841/1802/112 +f 842/1803/112 844/1805/120 843/1804/120 +f 844/1805/120 830/1789/109 829/1791/109 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index d7c59ae2c..2d472a53a 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -68,6 +68,9 @@ "block.motor": {"category": "block", "sounds": [{"name": "block/motor", "stream": false}]}, "block.engine": {"category": "block", "sounds": [{"name": "block/engine", "stream": false}]}, "block.chemicalPlant": {"category": "block", "sounds": [{"name": "block/chemicalPlant", "stream": false}]}, + "block.assemblerStrike": {"category": "block", "sounds": ["block/assemblerStrike1", "block/assemblerStrike2"]}, + "block.assemblerStart": {"category": "block", "sounds": [{"name": "block/assemblerStart", "stream": false}]}, + "block.assemblerStop": {"category": "block", "sounds": [{"name": "block/assemblerStop", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5761f14fe77c5c6b7e598febb16dbf24a226a59d GIT binary patch literal 5915 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 F{RhyDxEBBb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a6e656e9134fcc8bfcd3b5ffb4208a93f842b0d9 GIT binary patch literal 6581 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6ef5dcf3885957e0163b91e9c94e2c27ab2349cc GIT binary patch literal 7855 zcmahuXIPWXvKx9gR1pFMBvJ$=^nge}DG5Cgs-YJVQKSjh2%#$?(!{_AQlyB2LMVz- z0|L@}SCpzE7C`aS`v%WZBV3e4T~x zhDpN0&jx$?hcG%|;4-6v(vLq?9n6YB`R~M_gh4GTR~CjZ==Xmle&#=Hl%P>Z|DcnH ztb+ZJr~N(ccbOw`NL3ZIh6-9m11bOJF6G}@fgzLx^x2;E4L$D>?4xIU_Dm$w_H5W0 zZ=~_rU_T$E_92x$5W;Z-J0m?+6%{RIw2HE-28{L3d@_c|>|p>4fNY4UqH$4(2n8-? zXuWR%Vb~k+exIQ^e-uL1+@%{8k|JH0XBh7yf2}`-2p9x$1`$G(L<0_K3QEs0HCj#& zg5ohypFg7yZun1OggFU~8gNKZ7F4u(qTgw6BPd1~M>y2CjHK)_tjmsmfPs)@HB7Ce z*)YopN{f}Z_Ewiw0FAVTEN9I^(cDbZ{OouU+D z14sfkOq~#=+n_{@qKM&;q9E11g+U4cdH3WK@5yt)#U68kP5|Io8=;PKh?lnzFRKvT z9K24fjD6#P@Jtg6O_Sf6rph{{qIUCQLYY$cceA)Oaj0DxRCNlMIVm)Sw8q)i6k&5nx zpnFs&o@@wjiQ1Ou#PtV~tBUN;R%G;@>s@iD^3x&cKt*Iq_Kg|{Vy*B`&Ni!pAk+Ft z!d){)UkHQMZn4_Ff}jdAnk9|(8F%~JA;^lpGE0U38)X-7SIN+NvGCX%9@7dOgG(oo z#{8aQsw)Ot%PO2=(Nx3Lf#s8hX*wLJ^m7Ef+#iKA0W61fj1a-}pTaXr; zH6n)jjAev5)n0ZPk0EVco`Ldqn1^GAkJJCjf0hoNKO|)Ae-@%Z7Y*sbEX$_B|5+xq zp&&@eWY^wsk7dmUWnT>{S$$Er64bL1G8$4R4hWNMv;u83eTFnhwwffOeV{`|pbIT* zD${3b>+;-xWD@)C5(NOzN!_oIDx;9Ppq(s>!=CI^1Xwo4iA;PWpS+-*DvL`+`KS6t zW|Z8?Ub&O2ShkA-;0zQ-N-T~@ER9GkiAY|KPd#}jqog$ZU{~?`hKFnaEpzW0xGVsn zvL?Z@CInd{0tD=8m(0V^E}|7JYZR>1J*fU?jRS&ukU||o|6CgX+5iA}URDZq4!Dz&m_}`Mnkh+B+q*zYIfo(!idX-C3aGc6niSli-%LD^

tAsJtx! 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 YaczwCwuhcrq;BLX_|f}WJi6e200IwrB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2850ce7ac84cfb742cb920b126e2c973a5a8ee18 GIT binary patch literal 8532 zcmaiZc|4Tg_xPQ$jkU3_^&VS{5V8%aA-ild#=bAvB8>4)MS~$BX|jh9*+tnRMI_l0 zZ=`Hd#+IdpQtJDRKA+F`^ZVoX`rg-l?sM+F=bn4+x#!$-p8Ht(`r-i`{44!6Fc?7x zyBMqmV25B4=fXVwiSz~-h@!uswEO4P0<)x#{7<5fgh92&ua^#Uh5Y`n#Le)Bj6Bq9 z?;ql)Xc^{KdZR#Q?|QbWnk-=h2{qv=c?gdY64GvR-Gg!$;;&jm-K z@aIUu-YCO!VZJ^nO+}>x5Q4t0je(Ael9GmkvXX*|8jR`Bd=h%6Y+(QkfD}QNxBGeinNYB zHBLqcf)X)Mn?Jn`srT=~0OJSs>LLzO7L+tO;y!486QdYl?2%C05{hy_uO&CG8UrCq zsTo_vF=Lj*C{N{OlVZD-S_CMJYO*P@@0EK0iDTDG%#AZq`zAv1)jcopXAUV{fyV4KGHgBQOfh*Uv9&<3yxG|D?E9oJImPZ_V zv6!bk1VP1l4jj1<9xboC(1Gm_BvT(boGV9f3msZ^&*Scapu;thX}Q-LA&9BQKQ-5^ z9)gS?M&fRn(c6f0Qv1cqvt_Y7UV62>{bA;<;b#zJ*|R*8hx`x9KHk2Nq4i>s3D-QP z(1;P5AIgy1Q$%H1cV|h7RU|G?Z{^jJUrD+aLOLT9XDahY;BbINh{yBcjQ?GDCWD$0vfRQlx~4D1(LYt;|9v^kW!k*AK-bmQlj*YT!XD+U`->= z6kVE*W80S>3X;7Zv#@uXHJ!3&BDyRuj7_fmk2q2EtpULDlh`Znga4bi#9nesTk}9! zVN^wJ6mLKv`AlSz9Gat?UdOxaL`_5a8_B~y)5qce$$yp(*&hm0_CE_j_XrUOFiTSD z$bT;r+E5U}XSA@SfA04=H{nks>&E@-AonPB~T*7%B72NI}V_@6`LUmE}b$BR0? z{#Rn=Jkn!01p;1S3}-NgC;VT@d{ot(7ZNNh-C#S!C_@V6X(p@+*-5h9QcE~p7WC4P zQf%Q44<;_}IUhzZttZojl1;ZOMqmxum2$6gw^-Pa^@^0i5Jv7`X%EJz;?6(TruBD) zj+sg~*#s`+LDd!6QW3M{gQa|4N%hbmzydw&MZ;x^MVPQ5IH?oHn$)brU91T{ z4iM!CpNS@d-8jjd&t(E{KFLoYWD+LFd)^j0X?W#`(UYS7zo7Z(i|yNMtdjRc2@C^s8| zo1M?3hONUkWQX;nSs_Eh7zrN{??&=*YazKg1iR24HC;RVqfdGD@v)zV;cl9lV@>FL z!R%ettKXik%eQSF(HU(ZjS@)HHZE>iK~BQKE=K!A9ln{{ZO1!JTw55A@)dT;s_naf zwEBKENAreg*ZPmA_un*y4m70(uJ+acF!kBV@Hrp!*6xgp%s^|9Slhj0(H@X5=pZuy zESc4(a9=(00EkN?CZZ8HJR#?Yjz{8>gyPaLGSXfarfBI#E7JgOFQnY_67L}s*3t$( zQ-5^&h$C9M$;vdjrqK}}Sf7A%WG`*7H}zL;wDk(C=}A;(%^~7cXeH@5$0MZ;nHZx| zVj7M`yp)PdmM#@KLM!newq8b+*x;^Kl<;}UO7~E4Dbl4PPDu*QLPRcz6z*z0)RByS zF5or9?PUd#f+k0oHrSd5)Pz}>LZk+CO(0TcCg?LmCM&3te{_xLq)gBdS7#woW+uu_ zLd0NnlZdH5L@Lk(-2;(QXqwVO)Wq9(a+G$z_8fTFXdAdcd9`%u8_()SXmZZdZhKq> zeMD9Lgpk)Dy2%-ztkx`au~wnkmB@9X(UzEmo)GX_S8hfH4z>S{gjU`yWO}v!nQdUQ zGR?}Az78{!dT8>Xn(;$W2YvF29wD!x`W{z&U}KZeMGJ*-XX1K$k62tl%_2k!-INzt z+deTB3x!bb`zA+GvGVIR1t>NEloFI_C{;Gdi={I|)_IePVG*aKtI$xCG#pKgLUmlt zi?cEfEKN^$Os-F-;sTWgAYVTRd1&{zyWR63KB1Zs;9!6w)ytv4H@7mNKUF%iK(_L3 z)k>43LxD_EWo2bkP-FobdbifrI_f?+`0uyKuRexGRaVv>>3@8#vJyIJp|E1} zR^>`7)N=nLd(~>+efhUd!J=I&tx&|#6tvnG3L*V?TrXzSRQsb<>1R&}bnYJSgn{yo zgfVW5q#igs{V4Q?SnNT0BXPYb3gl1Glyn^Al9&S z4h7agE_2^+{(lP?!0~bc+yQkzQ+cjGa^$DW5q(!Ijzg;}oj7bFD_shSH7|~eGtD64 zOid~p$LZQim);p9&R?NNBybP~Ni;=y8`2+z9!KI!9Z2Vs8^@=JP*v>WOI^fGTvg+u z7=^2{(J^oc^9^-6uzp-59H}P+$fJ<>FSvKDAY=@@V*b4W2uix=05s_-Q{_c^sB+~` zm1v>d166eqMf6^}N2d4E1JMC!&*LD2%qMc~hooBjy$JE}KUF;_2HlTUhyN9|7SWOE z@hc3FnYbWVqh6gFf>RZ+r>hb@PKYg@%j605gK^3?O&Hp3+cDjEGcq0CW=vkXIAp=Qay@P!f0H>sdfAWRu9sNKZ#5x?*mw1gTH4MI~~tjiq_B$_$2>$c}dAKx~_F0D{Div_jY)s8`mKiqtj&6oAFD-&Si|B zQ&bQ;=XZ0Og#^{`(&N--nG+WG)T6oPX1xbDy11l+MBA8@^wR2(HnptkbFGzvpxPK$%R)C!=OZ zj9cB2z8d(RDVK<~c?nWM#z3(&->Cntes3{_Cu<0rD{!W&*OCVd}v;-ri-|tw(wcHm;XD#1~Ha8ShLN?iVW3g3f;kc z<(fJ@B4Efl@p2T!!Ww2$=$@g z#^kNzF9MG%8I(1+wf^0ruk=%&uts*xtUCEDBXcRihAj76ZYDII7L}B-I#Rz*i*xqg zs}z}fJpJ_ez2Y|_d(_%5&XX5ihgMA_FJ5IWH{D^~>UpW16}4tf`Wo73seC)>$LjZM zPY-W>ng3+{eV(QS{EW4keoirozf!8+`5KRjO&E~8AR%2?dHH@~Ekpf z*Tf;1NHxDje?n^CDLC!)?AE|VWxoTjn((vRlJR1zgA2BmwWP78-urFV8xg5@@sW#6 zI*Mh!#H3NGXLC39c295ay{g~O8j1~rJ5F5Rd*y}IJAM_o`SOzw?Tii15C0`Px;Ddc zV9c6@63{Tqx7l*E`&?jCwQ0SK_5$R_t7~QA0#sH=bj!$;;VxaZSwYQh`vX zdx76QiSy1o!cj4L_&HJx&)Sgf#_@-@%Sw6UFZ|}Y=g0ia(2Jn!OJj0YnBh?x3 zzCvG@ACi1uUyul-eM#%$t=1{Q#<2^K*_D7cI38op3MfK&hJy3(H=yvQhH?I~59;k& z+ofmkb|$1kZ@rz#K1R807BH7=UZH3mud6$TaIGBf)-op>nh+QyAHvia_+;U(dc5UY zRcGVC2UR{<@t$(7l-zUokya<7`PT7;PsnykuirnwZl7!o)#{pQ4|7@j{@WtrG+#FH z#n2B-W;^dt?_k$2w5cC63u4#*_1w0&6s^HD{L487rS#dd>?$TKeDtxN02?9qsapMX z?;TYZLgMJD72rw}?YRlZ$`^7Xw$_5xN4BSeQeUU0a_bGLadm{n8HP!85S9&xnL$2> z%7BmilieUc;$Cae^GOSB>Mhgt+eu2Dq8b`k?YQCQq`^M7VsZd0Dt)zT>q~R9VcDl# z#g=n=y1maA`8vE$swTt*ywB3$-ByX!({KIu_H_v2w@3Z(z0lVWKGz=zpS#Mt5|wj> zrl8ki%KmW%^{k@wT35t(^(EDju;T3>ys0@U-#?zvY%Y|Oy2v?!n5cPUnXDgC%3E4m zaonY@@XR%y3*2GscBMiCe$61-NEB5BQn(8pu9bZ9s`2)2&uQAha?a}k_Zl6*o_Wid z>5@Ymg35K6qwVQ<^v!$Ht6t^#!rY=ZnHB!`rcBRr{2Jk^tkwUJQ~-BoTIV<^`4uxK z#b~rEb8=z$>f@W~xl03sCtrG)<0nu}8@(xqRQ6Ju*zd>Iw@4h-^0<(D?C^D~*E_kt zeyn+_*EydV&L9tL+!elsA>2FTbkbWUu;?=4#%fa@p$hOZUHBsL?SU&7Z?9aMitT_| z%xwD>cJR}=Dt|>wZmND;H6FM=@1q)n#2fCEXLb0~CkhzqJD+Jrq~NMo)9V-G7=adS z=_t0f^V3WbT!oR$Cs=fJ2fr2|y(|1S@@Li9v#G}Ss`#RJ-IcG&vLALaEp}JglSY^{ z6!?nmit;YL^^NDSvvm0tHP&guU!xg6Q2z4KWKQQR(KDLKruU*Hg}Z7iMvfcMR+aJ2 z7t{_^UZZ~9s%qBu^=e6@Og^)FrafXZVvyLjtCIiH?9z49TZePpc&|PclAd3qqdi47J}72JCMocXsdHe-K7jnR?@F{ zCsaa&cfMoTj~Qkd9J_ltdraf;hLYTuao&f9JBy_U(s7-?Bpsr;!|Fzv*B|6x`v+6! zF+z)4d7_%EeW=c%1YW67A>`oZd-hY*_7&dJ4n1|%!c<1YUFI|pb23i(IQay765}En zOh~yJ;kc3HI#yM7z4}d*UE=hpQR+~`cZrENg}&e^dqz1uG@bagF)msIXOT9in2}JJoY6 z59@d1Pv0>*{eVisT|V_&W0FY7pe_VnXh>wQ1Dg*z++iI=XSG-uFKQJ9ix!-RqUv1v9O})9bcO-ZqknzUEIB^5 zmi=l*|NWan84z+5SQZk+WZ?f)Fr%zw`3lD!%wp?*tm!DWuKd28o2{3%C`-Ertl(s} zhD{NG_2AVZo+^6uW#&eFzhTtQm|?|7pRSWH*G0ses-kMnmaShJkTw52UMh2DLkS3V zTnu3fJz&23h;*5S6!7ZZN_^~mO_VGQKKd(PCD}24!Uy~Ps1#U0Rxs450`lIEPHvzX zEYo}nyT@23y~G$Ts3(E|FG^$D6xEqh=Rd@GA=jiLyw=jJ?@uW5AnH1aYTzBLL(Pu? ztJzwc4E`1YjBNaGcC`31s5lrIIOi6HP)5IS-K617(49292*eqV}~u- z0U*?`A2X-bZo=3B>w_B}WD8VVU%lrkWBdDJL+|+Zxp@w=#$)H>nB2byep7g4aphzH zF!One0Oel4tMXT^0X7TA;7&GHBmYo>b;tT_At){LJ>z{AFbEnPN7mgmP z(Z0{s+Pg+sZ<{Q84Z>qNXZ*oWhD}D0Oi>3HGFsoA?a*`u5@Y_y<#3cgJbMmhV$hwxX3Wwe&eRbKG-2tS zC@z3i9fd+(q#{rqSsiyI4`A3YEZ`339&!8`9`cmex0n6c#QoPCkl|6)xTX1>`*yGE(2JG23Xz4rB((YC0bVnE3tyP z!x93ze)b2I@??gnpQIY62$ejy547UGQO6R0cO3=BT|?N`^FW6Uz{Sj;hAzdde?qzg zvY*I6VLVbBoF9`o29@Bj? z-o2QCJ)4odf&L*c9eID(op#+p!c|b^(5Jpfm`0JJ(JH_%@@%QzmidbT)wd%#KLQ3R zeKP^(?rcw&KGKwh9Zc0D?{ezzoh=!;#@Zj6B=5%a@aqe-nXJbd{hYxVrWOrR&>}!C z1Xq~=6KLraMM3{A*x1iUZ86VTz&m_T!|ok<@$qmY=(yPF8pj0^VM+|i-vc`sxxw)D zSstKIK2WG-HRHZB`(OdhGn|=d56R{iwWd$ zW%1bp0tXqcWgk0K7S$W!4M(`I*ti;#I(TdfY{0a91Ozi9HEOv=rb|W;vFt! z^HN7tJlEX4cgl$gb;W#GeN}d`)Gp7B!?(>%0rsotH(eOW?oyd<=!6WV|@z1u9n*jYlde0lfxbn34`(k<`T3Ae>6H?MOk zm`1M8<4yx`6#5s0z=2`3cQF{|0CK<=(teigu5%1b9k9d|y*NdmvB$9paKfM<*1XUy zkj!Ca6lAWqUU&HFUqL#~=RM0PTdalTtpR&#_tIk-p9`dHhQ3dG#TN=$#7QMS%z{WuchC84*B07-#eht(Waso8Tg~rnfzjQr^cbYvgdvEf=yhClr^5wI}ywclGi}=CZ z+jI~PkXCH^Tj!v&6GStt@4x{Pwq*A61&z#nQ`2AqcKrTz>cJyhhosy&w^nkoZ%t1B z{N-l`SbtF2*xbo7;NWLpVsUS<-raD|t-hCg1L*;$q(A1Tw>>uc^01z`TP7t7Pug1z z@|9mMsVtx^OD=ruZMLQ#{UKF`yvHxINPtiFlW#qU8MKJc?)cKK?%4+6yw z%Z_GG{6Le=*|_Gd?_u{*cq47@%roK)N{n1UB_T0 zP*UixMLe;bOnS3oJmCXRB7IZOe*8|?x7GK9kDPh``ifTFJ@&QQ%N|xH8C~^7w`*VS zeEaPmGfI-ckz6W%X?sZOZisf8;jV0?9hRnqE->B^uP}O**|{xuM7mh(5|=^7k99Ez zWgC3nyIaaMTQl8M6CbXLY?&eLC}}aL+KsB7=*R-v!-HvMrFvyjT&?c&u-?J;3p@6) zgKKR>HQgyETT>n@`Ia5z`$uM)92XYV^+ajiXCJ1l8~uu$z1e%n_Kv?6dZRy5E*>g0Oj6S_uI=p>tthZ?-Y%@N^0pY_u;tz4Sgk@bQjUakM}< zXmT(jkv__0zwqp~@p28!Z$r{Q_#p45C9{jT*hSq8b z_FcS`oa}HpiufqERYvgOhxFmw*FH45+nk9}F4&3um|oU@b;jR0?!Y1P*us`-&MU_| zW}*Prx6^KS)C7@Uw5i&y9?|!An9{i?s*3?^02Rc{>2kek_x*K_S8AfIg_F-=Aq5pb zN5Pkg%^fS-gHD3hr6s27wfXtAlINz@BrE?OOg4R?!y7-7Sbs4`T0sjh;b6O?mbG0G z|EMO!;aym3pV;Xu&kBrZ+ok%4s#gc6BeI7=@LBBJrhF<#uaz8#prpz1ED7T$ql8SI`V)pye3Pk*3Ffha;!5jL> z%gM(RzWp_PUfA_6Q8C8Zkzb^IQWmwMnU)Fr1}u~(b>c{q*`J4E&9bD?NuE3S(XJGnfa9@t2@iNd z+4m^-U@4TUah*s&2tcMwrz9pCM{4sriX*u})AO$%Z(aBjt2Fcb%r%DMO_lSgL`4h# zsgnnIixrS>SI#6T2yJPn-T%Z{T9CvuW%x6gO~UtP@^$&SPupRV4EKZ8Z?r{n%!l&d z`M&+AltZu&B*hJcLJvClpoUTe zjxLcef%qY4jA`+^zl(b_mM^&&ddta=f_W_%xwKH;<`5C^(Fap>>&12GMd&4mb+rd? z(}wNgz1cS!?arT_8O@B|e8ASu&T4-nz3={h^Irj+FdB_=aDSM`j~@pB0K2=p#pg)V zv^Zab8~_6Bm39p}2FkT(k_I{m!_Z_olro>sAq+!E(^RLKvImkS$TLS{G#cfuiz`i2 z*xlXDk)Xmb)FCijPyw8Z$wQ%mCp16t+DOy1@W5%B7XKt6y^%9sDaV8#00g4xdszB@ zNt*S3yeumM+kXa-_X0TeY$y*GVpUq8&X!}ZLCLW(&>y)<2vzy`J#b;&Kgqi%AS^^7 zFhx(j72tKSFbsv#1T?XbdB%l>$Qhx#ET0r#U7Kqj3~zn8To-%z@Zrkmzy%|kK7rLL zBwLwe9nB~#q2T#t9<7eOviGleux)^>gNddIL|cW{RDb+w;gHNP6UIG3FIXkct>~t} z#X;7=B>KTfcs!I9;v&75X!?G|=R@aN@5kAiRwRz5elQ-PTI0cNVe49v080D8SmBWr z)5gR#91d4(#c^!B-dD!fwIUVwgNfvC{0|(*F#rGzhr>;q=B5x>Rb6E=nP`0~A3b^m z004*Y#eeYKYk=Q;Tkp$4Pc$hk@=0ewmP3_i=yto62#DG-@JKK`va$dds;A%8fPp3QhAf7?Bn$TXTzkxQy_H4f&ncxx@<+0^W;X zRz8*oW2HBN^&Si%DnNYf6M+4IkbeTabLURwwWRk#=a3h}#}GxozBb~=FnKA&7KS4jKEBJFkCdapq@N=veJsZaew2+N)~#D)noGp2*(s{=A(G?%czp|{lO$Q0=S9}Z09IR< zS(dHMir~T3L2iUI9?W!zl!dlzt?qm;7jQ;kCOsJPM7U?dJxdftrFAlrDj}T-f%yArcqNcs$O_`oUC*YMXFIU@rHA$-tT# zZR@T&2p=Lj?@z*0=TgPzcRz#|FOT34fBI)>S~dNCzgTFJWf{z7v)Ur&_F$@8Rb<`5 z_7I6P9*={n*%Uf>@$v}1`R2RIw9OO(BUcgOY+}w8YZZ}g9t=RtbAQ$C2LpgLPbKQP zWR|`GtZqGpx>}meW-*nBMniVpp)9P{46<*Vz>vp6J?#qiQ7e5vs}9B*hKl1j;8{*b zTXu)e*AXe#_DwcmQ;5Xb^!{me;Sre;fkjaS2L}ghYYtT$)50=|Z5|Avd;he$yJVxW z&t9)5>{*eJ$kB%j7k@6S*r7aOsS|ya#g=E`iywm#WPIb7B9qx|cm*G?=&L#}i!%Z<6@MaapD#BY4)b#t*Za7B000%| z%YH-x7b0sunh%kj_pieANQdnkt2pDqY!#R-^W|*C8G)H@McT^NcrYI#J#}!#gL#3K zW5ZVEG@KC_D}<4Qzhvc`<$=k;YY}XiFJ~*xgh<-#0iKo|O+Yf!ZA`Z!y$6$o)el5l zkI3_TlYc5OIbZJcyB}8Oy?A*9?_a529L&mBf%O7oVZ&rd0Q2+Z0FDI%0Py~mcCozx zE}*h}-8d5>t4NXr_V@Qo*B935Y8Z`1c^HN;pU+pu+-PY4{qwINLw)Z0HS)Te?u*{^soe_SZj^EfST6=xBW7e?P9w!{>AB!rNDCU$<8i7TD|L zKYwehPjGa9!QQ@F`-5vgkt`9NhUi#U1J>8oA<{I3bDGD-ynVIyQSZJkgayW`1Lz)n z_4ZZUza&>62EGpF?Q6x?!MuH~_&V5`xBsSenP_+q=Iv`GNdDf=0RVpX@$tO8e|&k| z?^>1q=$F5sK0$x^;$PJF%ci}3wf4XG{eMpBy;SjrNMTT#g|08x+t*`XCw{2tjNA7^ zMc%$u_C z_@z#~eY5sO@k2%4zE*sQ^k~Hk%%c_G4|c}U-IM=+4^9Dw()kom00000NkvXXu0mjf D!x(^6 delta 2724 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 Date: Mon, 14 Jul 2025 16:42:54 +0200 Subject: [PATCH 108/323] half-priced salammi --- changelog | 6 + .../java/com/hbm/crafting/ToolRecipes.java | 2 +- .../ContainerMachineAssemblyMachine.java | 5 +- .../gui/GUIMachineAssemblyMachine.java | 3 +- .../gui/GUIMachineChemicalFactory.java | 3 +- .../gui/GUIMachineChemicalPlant.java | 3 +- .../gui/GUIScreenRecipeSelector.java | 24 +- .../inventory/recipes/AssemblerRecipes.java | 1 - .../recipes/AssemblyMachineRecipes.java | 313 +++++++++++++++++- .../recipes/loader/GenericRecipe.java | 12 + .../recipes/loader/GenericRecipes.java | 29 ++ .../recipes/loader/SerializableRecipe.java | 2 + src/main/java/com/hbm/items/ModItems.java | 13 +- .../com/hbm/items/machine/ItemBlueprints.java | 132 ++++++++ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../hbm/module/machine/ModuleMachineBase.java | 11 +- .../TileEntityMachineAssemblyMachine.java | 3 +- .../TileEntityMachineChemicalFactory.java | 4 +- .../TileEntityMachineChemicalPlant.java | 3 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/gui/processing/gui_assembler.png | Bin 3445 -> 3490 bytes .../gui/processing/gui_chemical_factory.png | Bin 3531 -> 3644 bytes .../textures/gui/processing/gui_chemplant.png | Bin 3535 -> 3594 bytes .../assets/hbm/textures/items/blueprints.png | Bin 0 -> 379 bytes .../textures/items/blueprints_discover.png | Bin 0 -> 397 bytes .../hbm/textures/items/blueprints_secret.png | Bin 0 -> 313 bytes 27 files changed, 536 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/hbm/items/machine/ItemBlueprints.java create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints_discover.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints_secret.png diff --git a/changelog b/changelog index 914e54d80..6be709682 100644 --- a/changelog +++ b/changelog @@ -3,6 +3,12 @@ * Features a brand new animated model, GUI and the new recipe selection system * Many recipes have been reworked, with the microcrafting complexity reduced * The redcoil didn't get a recipe. It's gonna die soon. + * Neither did the schrabidium transmutator + * Balls-o-tron's spawner can now be made without a worm coin, using a silver key instead. This means that, while expensive, it's possible to summon him without finding a jungle dungeon +* Blueprins + * Replace the journals + * Instead of opening them and making a template, they act as a multi template + * Blueprints need to remain in the slot, removing them will disable the recipes again ## Changed * Removed levitation unit diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 39c00cde5..de9dc346f 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -159,7 +159,7 @@ public class ToolRecipes { //Bobmazon CraftingManager.addShapelessAuto(new ItemStack(ModItems.bobmazon), new Object[] { Items.book, Items.gold_nugget, Items.string, KEY_BLUE }); - + //Carts CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.WOOD, EnumMinecart.EMPTY), new Object[] { "P P", "WPW", 'P',KEY_SLAB, 'W', KEY_PLANKS }); CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.STEEL, EnumMinecart.EMPTY), new Object[] { "P P", "IPI", 'P', STEEL.plate(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java index f7bc0d499..507d41e66 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java @@ -3,7 +3,6 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -51,12 +50,12 @@ public class ContainerMachineAssemblyMachine extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; - } else if(slotOriginal.getItem() instanceof ItemAssemblyTemplate) { + } else if(slotOriginal.getItem() == ModItems.blueprints) { if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; } else { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 7, false)) return null; + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 16, false)) return null; } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index 1572ed3be..d69a8f062 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineAssemblyMachine; import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; @@ -52,7 +53,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java index a31917752..567b2e256 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory; @@ -57,7 +58,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, this); + for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, ItemBlueprints.grabPool(chemplant.slots[4 + i * 7]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index 9f02d0adf..78a2e619b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant; @@ -54,7 +55,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java index 6f101ef29..4a5e3bb83 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java @@ -50,16 +50,18 @@ public class GUIScreenRecipeSelector extends GuiScreen { protected int index; protected IControlReceiver tile; protected GuiScreen previousScreen; + protected String installedPool; - public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { - FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, previousScreen)); + public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { + FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, installedPool, previousScreen)); } - public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { + public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { this.recipeSet = recipeSet; this.tile = tile; this.selection = selection; this.index = index; + this.installedPool = installedPool; this.previousScreen = previousScreen; if(this.selection == null) this.selection = NULL_SELECTION; @@ -83,7 +85,11 @@ public class GUIScreenRecipeSelector extends GuiScreen { private void regenerateRecipes() { this.recipes.clear(); - this.recipes.addAll(recipeSet.recipeOrderedList); + + for(Object o : recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } resetPaging(); } @@ -92,15 +98,17 @@ public class GUIScreenRecipeSelector extends GuiScreen { this.recipes.clear(); if(search.isEmpty()) { - this.recipes.addAll(recipeSet.recipeOrderedList); + regenerateRecipes(); } else { for(Object o : recipeSet.recipeOrderedList) { GenericRecipe recipe = (GenericRecipe) o; - if(recipe.matchesSearch(search)) this.recipes.add(recipe); + if(recipe.matchesSearch(search)) { + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } } + + resetPaging(); } - - resetPaging(); } private void resetPaging() { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index f725cd17a..13e823907 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -197,7 +197,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.solinium_core, 1), new AStack[] {new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1), },400); makeRecipe(new ComparableStack(ModItems.solinium_propellant, 1), new AStack[] {new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4), },350); makeRecipe(new ComparableStack(ModItems.schrabidium_hammer, 1), new AStack[] {new OreDictStack(SA326.block(), 35), new ComparableStack(ModItems.billet_yharonite, 128), new ComparableStack(Items.nether_star, 3), new ComparableStack(ModItems.fragment_meteorite, 512), },1000); - makeRecipe(new ComparableStack(ModItems.component_emitter, 1), new AStack[] {new OreDictStack(STEEL.shell(), 3), new OreDictStack(AL.shell(), 2), new OreDictStack(STEEL.plate(), 32), new OreDictStack(PB.plate(), 24), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.pipes_steel, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new OreDictStack(STAR.ingot(), 26), new ComparableStack(ModItems.powder_magic, 48), new ComparableStack(ModItems.crystal_xen, 1), },2500); makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 8), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(ANY_RUBBER.ingot(), 8), new ComparableStack(ModItems.magnetron, 3), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); makeRecipe(new ComparableStack(ModBlocks.machine_radar_large, 1), new AStack[] {new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 16), new OreDictStack(ANY_RUBBER.ingot(), 16), new ComparableStack(ModItems.magnetron, 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_copper, 32), new ComparableStack(ModItems.crt_display, 4), },600); makeRecipe(new ComparableStack(ModBlocks.machine_forcefield, 1), new AStack[] {new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1), },1000); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 629e10584..39f2fc198 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.List; import static com.hbm.inventory.OreDictManager.*; -import static com.hbm.inventory.material.Mats.*; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; @@ -17,11 +16,18 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumCasingType; +import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.items.machine.ItemPistons.EnumPistonType; +import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -41,6 +47,20 @@ public class AssemblyMachineRecipes extends GenericRecipes { public void registerDefaults() { // plates and ingots + this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plategold").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gold, 1)).inputItems(new OreDictStack(GOLD.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platetitanium").setup(60, 100).outputItems(new ItemStack(ModItems.plate_titanium, 1)).inputItems(new OreDictStack(TI.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platealu").setup(60, 100).outputItems(new ItemStack(ModItems.plate_aluminium, 1)).inputItems(new OreDictStack(AL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platesteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_steel, 1)).inputItems(new OreDictStack(STEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platelead").setup(60, 100).outputItems(new ItemStack(ModItems.plate_lead, 1)).inputItems(new OreDictStack(PB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platecopper").setup(60, 100).outputItems(new ItemStack(ModItems.plate_copper, 1)).inputItems(new OreDictStack(CU.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platealloy").setup(60, 100).outputItems(new ItemStack(ModItems.plate_advanced_alloy, 1)).inputItems(new OreDictStack(ALLOY.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plateschrab").setup(60, 100).outputItems(new ItemStack(ModItems.plate_schrabidium, 1)).inputItems(new OreDictStack(SA326.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platecmb").setup(60, 100).outputItems(new ItemStack(ModItems.plate_combine_steel, 1)).inputItems(new OreDictStack(CMB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plategunmetal").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gunmetal, 1)).inputItems(new OreDictStack(GUNMETAL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) @@ -96,6 +116,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // nuclear door mod + this.register(new GenericRecipe("ass.vaultdoor").setup(600, 100).outputItems(new ItemStack(ModBlocks.vault_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 32), new OreDictStack(DURA.ingot(), 32), new OreDictStack(PB.plateCast(), 8), new OreDictStack(ANY_RUBBER.ingot(), 12), new OreDictStack(DURA.bolt(), 32), new ComparableStack(ModItems.motor, 3))); + this.register(new GenericRecipe("ass.blastdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.blast_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(PB.plate(), 6), new OreDictStack(ALLOY.plate(), 6), new OreDictStack(ANY_RUBBER.ingot(), 2), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.firedoor").setup(300, 100).outputItems(new ItemStack(ModBlocks.fire_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(ALLOY.plate(), 8), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 2))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) @@ -106,6 +139,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.arcfurnace").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_arc_furnace, 1)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal()))); this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) @@ -122,19 +157,69 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) + .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.ingot(), 12), new OreDictStack(W.ingot(), 4))); + this.register(new GenericRecipe("ass.drillsteeldiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal()), new OreDictStack(DIAMOND.dust(), 16))); + this.register(new GenericRecipe("ass.drilldura").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(TI.ingot(), 8))); + this.register(new GenericRecipe("ass.drillduradiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal()), new OreDictStack(DIAMOND.dust(), 24))); + this.register(new GenericRecipe("ass.drilldesh").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(RUBBER.ingot(), 12), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.drilldeshdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal()), new OreDictStack(DIAMOND.dust(), 32))); + this.register(new GenericRecipe("ass.drilltc").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 20), new OreDictStack(DESH.ingot(), 12), new OreDictStack(RUBBER.ingot(), 8))); + this.register(new GenericRecipe("ass.drilltcdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal()), new OreDictStack(DIAMOND.dust(), 48))); + this.register(new GenericRecipe("ass.drillferro").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal())) + .inputItems(new OreDictStack(FERRO.ingot(), 24), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 12), new OreDictStack(BI.ingot(), 4))); + this.register(new GenericRecipe("ass.drillferrodiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal()), new OreDictStack(DIAMOND.dust(), 56))); + this.register(new GenericRecipe("ass.slopper").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_ore_slopper, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(TI.plate(), 8), new OreDictStack(CU.pipe(), 3), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) - .inputItems(new ComparableStack(ModItems.tank_steel, 3), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3), new OreDictStack(DURA.plate(), 4))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(TI.shell(), 4), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3))); this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); - + this.register(new GenericRecipe("ass.radar").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_radar, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(ANY_RUBBER.ingot(), 12), new ComparableStack(ModItems.magnetron, 5), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.radarlarge").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radar_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) + .inputItems(new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); + this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) + .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))); + // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.combustiongen").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_combustion_engine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.pistonsetsteel").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 4), new OreDictStack(W.ingot(), 8), new OreDictStack(W.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdura").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DURA.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 24), new OreDictStack(TI.plate(), 8), new OreDictStack(W.ingot(), 8), new OreDictStack(DURA.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdesh").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(CU.plate(), 24), new OreDictStack(W.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); + this.register(new GenericRecipe("ass.pistonsetstar").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STARMETAL.ordinal())) + .inputItems(new OreDictStack(STAR.ingot(), 24), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(NB.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); - + this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16))); + + // condensers + this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4))); + // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); @@ -144,7 +229,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); - + this.register(new GenericRecipe("ass.fensusan").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.machine_fensu, 1)) + .inputItems(new ComparableStack(ModItems.ingot_electronium, 32), + new ComparableStack(ModBlocks.machine_dineutronium_battery, 16), + new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 64), + new OreDictStack(DURA.block(), 16), + new OreDictStack(STAR.block(), 64), + new ComparableStack(ModBlocks.machine_transformer_dnt, 8), + new ComparableStack(ModItems.coil_magnetized_tungsten, 24), + new ComparableStack(ModItems.powder_magic, 64), + new ComparableStack(ModItems.plate_dineutronium, 24), + new ComparableStack(ModItems.ingot_u238m2), + new ComparableStack(ModItems.ingot_cft, 128))); + // fluid tanks this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4))); @@ -153,7 +250,18 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1))); + // accelerators + this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + + // reactors + this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + + // fusion reactor + this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) @@ -162,6 +270,12 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4))); this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); + this.register(new GenericRecipe("ass.blankettungsten").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_tungsten, 1)) + .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96))); + this.register(new GenericRecipe("ass.blanketdesh").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_desh, 1)) + .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96))); + this.register(new GenericRecipe("ass.blanketchlorophyte").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_chlorophyte, 1)) + .inputItems(new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48))); // watz this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) @@ -171,6 +285,13 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + // upgrades + this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.overdrive2").setup(600, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_2, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_1, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + this.register(new GenericRecipe("ass.overdrive3").setup(1_200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_3, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_2, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(ANY_BISMOIDBRONZE.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); @@ -179,6 +300,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { // rancid shit mob spawners this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.ballsotron").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_worm, 1)) + .inputItems(new OreDictStack(TI.plateWelded(), 32), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.motor, 64), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(U238.block(), 10), new ComparableStack(ModItems.mech_key, 1))); // weapon parts this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) @@ -212,7 +335,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.customnuke").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_custom, 1)) .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 4))); this.register(new GenericRecipe("ass.levibomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.float_bomb, 1)) - .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(SA326.nugget(), 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); this.register(new GenericRecipe("ass.endobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_endo, 1)) .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); this.register(new GenericRecipe("ass.exobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_exo, 1)) @@ -249,7 +372,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.mikecore").setup(1_200, 100).outputItems(new ItemStack(ModItems.mike_core, 1)) .inputItems(new OreDictStack(U238.nugget(), 24), new OreDictStack(PB.ingot(), 6))); this.register(new GenericRecipe("ass.mikedeut").setup(600, 100).outputItems(new ItemStack(ModItems.mike_deut, 1)) - .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.cell_deuterium, 10))); + .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 10_000))); this.register(new GenericRecipe("ass.mikecooler").setup(300, 100).outputItems(new ItemStack(ModItems.mike_cooling_unit, 1)) .inputItems(new OreDictStack(IRON.plate528(), 8), new ComparableStack(ModItems.coil_copper, 5), new ComparableStack(ModItems.coil_tungsten, 5), new ComparableStack(ModItems.motor, 2))); this.register(new GenericRecipe("ass.fleijaigniter").setup(200, 100).outputItems(new ItemStack(ModItems.fleija_igniter, 1)) @@ -290,7 +414,50 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.plate_paa, 3), new OreDictStack(OreDictManager.getReflector(), 1), new ComparableStack(ModItems.coil_magnetized_tungsten, 3), new ComparableStack(ModItems.powder_power, 3))); this.register(new GenericRecipe("ass.bholegrenade").setup(1_200, 100).outputItems(new ItemStack(ModItems.grenade_black_hole, 1)) .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 6), new OreDictStack(OreDictManager.getReflector(), 3), new ComparableStack(ModItems.coil_magnetized_tungsten, 2), new ComparableStack(ModItems.black_hole, 1))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ + // turrets + this.register(new GenericRecipe("ass.turretchekhov").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_chekhov, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretfriendly").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_friendly, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 1), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretjeremy").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_jeremy, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(STEEL.shell(), 3), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrettauon").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_tauon, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(CU.ingot(), 32), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.battery_lithium, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretrichard").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_richard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.shell(), 8), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrethoward").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_howard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 10), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.maxwell").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_maxwell, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 4), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.magnetron, 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.fritz").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_fritz, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel))); + this.register(new GenericRecipe("ass.arty").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_arty, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himars").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_himars, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himarssmall").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallhe").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_HE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallwp").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_WP)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(P_WHITE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalltb").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 32), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 12), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallnuke").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_MINI_NUKE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 6), new OreDictStack(PU239.nugget(), 12), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalllava").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_LAVA)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 32), new ComparableStack(ModItems.ball_tatb, 4), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarslarge").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.himarslargetb").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 24), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 16), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + // missile parts this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); @@ -328,7 +495,137 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); + .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new OreDictStack(STEEL.pipe(), 4))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // weapons + this.register(new GenericRecipe("ass.schrabhammer").setup(6_000, 100).outputItems(new ItemStack(ModItems.schrabidium_hammer, 1)) + .inputItems( + new OreDictStack(SA326.block(), 35), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.coin_ufo, 1), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64))); + + // ammo + this.register(new GenericRecipe("ass.50bmgsm").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 6), new OreDictStack(STAR.ingot(), 3)) + .setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "silverstorm")); + this.register(new GenericRecipe("ass.50bmgbypass").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) + .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + + // space + this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) + .inputItems(new OreDictStack(TI.shell(), 32), + new OreDictStack(RUBBER.ingot(), 64), + new ComparableStack(ModItems.rocket_fuel, 64), + new ComparableStack(ModItems.thruster_small, 12), + new ComparableStack(ModItems.thruster_medium, 12), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER), + new ComparableStack(ModItems.part_generic, 32, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.lander").setup(2_400, 100).outputItems(new ItemStack(ModItems.missile_soyuz_lander, 1)) + .inputItems(new OreDictStack(AL.shell(), 4), + new OreDictStack(RUBBER.ingot(), 16), + new ComparableStack(ModItems.rocket_fuel, 16), + new ComparableStack(ModItems.thruster_small, 3), + new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.part_generic, 12, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.satellitebase").setup(600, 100).outputItems(new ItemStack(ModItems.sat_base, 1)) + .inputItems(new OreDictStack(RUBBER.ingot(), 12), + new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.thruster_large, 1), + new ComparableStack(ModItems.part_generic, 8, EnumPartType.LDE), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.photo_panel, 24), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.BASIC), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitemapper").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_mapper, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satellitescanner").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_scanner, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 8), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.magnetron, 8), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satelliteradar").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_radar, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 12), + new ComparableStack(ModItems.magnetron, 12), + new ComparableStack(ModItems.coil_gold, 16), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satellitelaser").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_laser, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), + new OreDictStack(CU.plateCast(), 24), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.crystal_diamond, 8), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satelliteresonator").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_resonator, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), + new OreDictStack(STAR.ingot(), 12), + new OreDictStack(ANY_PLASTIC.ingot(), 48), + new ComparableStack(ModItems.crystal_xen, 1), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.satelliterelay").setup(600, 100).outputItems(new ItemStack(ModItems.sat_foeq, 1)) + .inputItems(new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.plate_desh, 8), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.HYDROGEN.getID()), + new ComparableStack(ModItems.photo_panel, 16), + new ComparableStack(ModItems.thruster_nuclear, 1), + new ComparableStack(ModItems.ingot_uranium_fuel, 6), + new ComparableStack(ModItems.circuit, 24, EnumCircuitType.BASIC), + new ComparableStack(ModItems.magnetron, 3), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satelliteasteroidminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_miner, 1)) + .inputItems(new OreDictStack(BIGMT.plate(), 24), + new ComparableStack(ModItems.motor_desh, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModItems.centrifuge_element, 4), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitelunarminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_lunar_miner, 1)) + .inputItems(new ComparableStack(ModItems.ingot_meteorite, 4), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.motor, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.gerald").setup(6_000, 100).outputItems(new ItemStack(ModItems.sat_gerald, 1)) + .inputItems(new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new ComparableStack(ModBlocks.det_nuke, 64), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), + new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index f2c8dfd42..eff9d27a8 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -31,11 +31,22 @@ public class GenericRecipe { protected ItemStack icon; public boolean writeIcon = false; public boolean customLocalization = false; + protected String[] blueprintPools = null; public GenericRecipe(String name) { this.name = name; } + public boolean isPooled() { + return blueprintPools != null; + } + + public boolean isPartOfPool(String lookingFor) { + if(!isPooled()) return false; + for(String pool : blueprintPools) if (pool.equals(lookingFor)) return true; + return false; + } + public GenericRecipe setDuration(int duration) { this.duration = duration; return this; } public GenericRecipe setPower(long power) { this.power = power; return this; } public GenericRecipe setup(int duration, long power) { return this.setDuration(duration).setPower(power); } @@ -45,6 +56,7 @@ public class GenericRecipe { public GenericRecipe setIcon(Item item) { return this.setIcon(new ItemStack(item)); } public GenericRecipe setIcon(Block block) { return this.setIcon(new ItemStack(block)); } public GenericRecipe setNamed() { this.customLocalization = true; return this; } + public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 4738b449a..1cb5cadb2 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -32,8 +32,20 @@ public abstract class GenericRecipes extends Serializab public static final Random RNG = new Random(); + /** Alternate recipes, i.e. obtainable otherwise */ + public static final String POOL_PREFIX_ALT = "alt."; + /** Discoverable recipes, i.e. not obtainable otherwise */ + public static final String POOL_PREFIX_DISCOVER = "discover."; + /** Secret recipes, self-explantory. Why even have this comment? */ + public static final String POOL_PREFIX_SECRET = "secret."; + public List recipeOrderedList = new ArrayList(); public HashMap recipeNameMap = new HashMap(); + + /** Blueprint pool name to list of recipe names that are part of this pool */ + public static HashMap> blueprintPools = new HashMap(); + /** Name to recipe map for all recipes that are part of pools for lookup */ + public static HashMap pooledBlueprints = new HashMap(); public abstract int inputItemLimit(); public abstract int inputFluidLimit(); @@ -41,6 +53,21 @@ public abstract class GenericRecipes extends Serializab public abstract int outputFluidLimit(); public boolean hasDuration() { return true; } public boolean hasPower() { return true; } + + public static void addToPool(String pool, GenericRecipe recipe) { + List list = blueprintPools.get(pool); + if(list == null) { + list = new ArrayList(); + blueprintPools.put(pool, list); + } + list.add(recipe.name); + pooledBlueprints.put(recipe.name, recipe); + } + + public static void clearPools() { + blueprintPools.clear(); + pooledBlueprints.clear(); + } @Override public Object getRecipeObject() { @@ -75,6 +102,7 @@ public abstract class GenericRecipes extends Serializab if(obj.has("icon")) recipe.setIcon(this.readItemStack(obj.get("icon").getAsJsonArray())); if(obj.has("named") && obj.get("named").getAsBoolean()) recipe.setNamed(); + if(obj.has("blueprintpool")) recipe.setPools(obj.get("blueprintpool").getAsString().split(":")); readExtraData(element, recipe); @@ -123,6 +151,7 @@ public abstract class GenericRecipes extends Serializab } if(recipe.customLocalization) writer.name("named").value(true); + if(recipe.blueprintPools != null && recipe.blueprintPools.length > 0) writer.name("blueprintpool").value(String.join(":", recipe.blueprintPools)); writeExtraData(recipe, writer); } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index f633298f1..8fa127907 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -106,6 +106,8 @@ public abstract class SerializableRecipe { MainRegistry.logger.info("Starting recipe init!"); + GenericRecipes.clearPools(); + for(SerializableRecipe recipe : recipeHandlers) { recipe.deleteRecipes(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 251e2d396..f6afda0e0 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -553,7 +553,7 @@ public class ModItems { public static Item coil_copper; public static Item coil_copper_torus; public static Item coil_tungsten; - public static Item tank_steel; + @Deprecated public static Item tank_steel; public static Item motor; public static Item motor_desh; public static Item motor_bismuth; @@ -566,8 +566,6 @@ public class ModItems { public static Item coil_magnetized_tungsten; public static Item coil_gold; public static Item coil_gold_torus; - public static Item component_limiter; - public static Item component_emitter; public static Item chlorine_pinwheel; public static Item deuterium_filter; @@ -1183,6 +1181,7 @@ public class ModItems { public static Item radar_linker; public static Item settings_tool; + public static Item blueprints; public static Item template_folder; public static Item journal_pip; public static Item journal_bj; @@ -2716,8 +2715,6 @@ public class ModItems { coil_magnetized_tungsten = new Item().setUnlocalizedName("coil_magnetized_tungsten").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_magnetized_tungsten"); coil_gold = new Item().setUnlocalizedName("coil_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold"); coil_gold_torus = new Item().setUnlocalizedName("coil_gold_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold_torus"); - component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); - component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); FluidTank.noDualUnload.add(chlorine_pinwheel); ring_starmetal = new Item().setUnlocalizedName("ring_starmetal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ring_starmetal"); @@ -4103,6 +4100,7 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); + blueprints = new ItemBlueprints().setUnlocalizedName("blueprints").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprints"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); journal_pip = new ItemTemplateFolder().setUnlocalizedName("journal_pip").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_pip"); journal_bj = new ItemTemplateFolder().setUnlocalizedName("journal_bj").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_bj"); @@ -5521,10 +5519,6 @@ public class ModItems { //GameRegistry.registerItem(telepad, telepad.getUnlocalizedName()); GameRegistry.registerItem(entanglement_kit, entanglement_kit.getUnlocalizedName()); - //AMS Parts - GameRegistry.registerItem(component_limiter, component_limiter.getUnlocalizedName()); - GameRegistry.registerItem(component_emitter, component_emitter.getUnlocalizedName()); - //Bomb Parts GameRegistry.registerItem(fins_flat, fins_flat.getUnlocalizedName()); GameRegistry.registerItem(fins_small_steel, fins_small_steel.getUnlocalizedName()); @@ -5748,6 +5742,7 @@ public class ModItems { GameRegistry.registerItem(fusion_core_infinite, fusion_core_infinite.getUnlocalizedName()); //Folders + GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); GameRegistry.registerItem(journal_pip, journal_pip.getUnlocalizedName()); GameRegistry.registerItem(journal_bj, journal_bj.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java new file mode 100644 index 000000000..84976e8c5 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -0,0 +1,132 @@ +package com.hbm.items.machine; + +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBlueprints extends Item { + + @SideOnly(Side.CLIENT) protected IIcon iconDiscover; + @SideOnly(Side.CLIENT) protected IIcon iconSecret; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.iconDiscover = reg.registerIcon(this.getIconString() + "_discover"); + this.iconSecret = reg.registerIcon(this.getIconString() + "_secret"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + return this.getIcon(stack, 0); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + + if(stack.hasTagCompound()) { + String poolName = stack.stackTagCompound.getString("pool"); + if(poolName == null) return this.itemIcon; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_DISCOVER)) return this.iconDiscover; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) return this.iconSecret; + } + + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(Entry> pool : GenericRecipes.blueprintPools.entrySet()) { + list.add(make(pool.getKey())); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + if(!player.inventory.hasItem(Items.paper)) return stack; + + player.inventory.consumeInventoryItem(Items.paper); + player.swingItem(); + + ItemStack copy = stack.copy(); + copy.stackSize = 1; + + if(!player.capabilities.isCreativeMode) { + if(stack.stackSize < stack.getMaxStackSize()) { + stack.stackSize++; + return stack; + } + + if(!player.inventory.addItemStackToInventory(copy)) { + copy = stack.copy(); + copy.stackSize = 1; + player.dropPlayerItemWithRandomChoice(copy, false); + } + + player.inventoryContainer.detectAndSendChanges(); + } else { + player.dropPlayerItemWithRandomChoice(copy, false); + } + + return stack; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.RED + "Right-click to copy (requires paper)"); + + if(!stack.hasTagCompound()) { + return; + } + + String poolName = stack.stackTagCompound.getString("pool"); + List pool = GenericRecipes.blueprintPools.get(poolName); + + if(pool == null || pool.isEmpty()) { + return; + } + + for(String name : pool) { + GenericRecipe recipe = GenericRecipes.pooledBlueprints.get(name); + if(recipe != null) { + list.add(recipe.getLocalizedName()); + } + } + } + + public static String grabPool(ItemStack stack) { + if(stack == null) return null; + if(stack.getItem() != ModItems.blueprints) return null; + if(!stack.hasTagCompound()) return null; + if(!stack.stackTagCompound.hasKey("pool")) return null; + return stack.stackTagCompound.getString("pool"); + } + + public ItemStack make(String pool) { + ItemStack stack = new ItemStack(ModItems.blueprints); + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setString("pool", pool); + return stack; + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 5b9d63062..756760d15 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1714,6 +1714,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.chopper_tail"); ignoreMappings.add("hbm:item.chopper_wing"); ignoreMappings.add("hbm:item.chopper_blades"); + ignoreMappings.add("hbm:item.component_emitter"); + ignoreMappings.add("hbm:item.component_limiter"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 7787b4fbd..9815c0803 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -3,6 +3,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; +import com.hbm.items.machine.ItemBlueprints; import api.hbm.energymk2.IEnergyHandlerMK2; import cpw.mods.fml.common.network.ByteBufUtils; @@ -130,8 +131,16 @@ public abstract class ModuleMachineBase { public abstract GenericRecipe getRecipe(); - public void update(double speed, double power, boolean extraCondition) { + public void update(double speed, double power, boolean extraCondition, ItemStack blueprint) { GenericRecipe recipe = getRecipe(); + + if(recipe != null && recipe.isPooled() && !recipe.isPartOfPool(ItemBlueprints.grabPool(blueprint))) { + this.didProcess = false; + this.progress = 0F; + this.recipe = "null"; + return; + } + this.setupTanks(recipe); this.didProcess = false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 508259c48..2ad98b8c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -104,7 +104,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; - this.assemblerModule.update(speed, pow, true); + this.assemblerModule.update(speed, pow, true, slots[1]); this.didProcess = this.assemblerModule.didProcess; if(this.assemblerModule.markDirty) this.markDirty(); @@ -266,6 +266,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades if(this.assemblerModule.isItemValid(slot, stack)) return true; // recipe input crap return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 62b9f0a68..dfcd1c50d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -10,6 +10,7 @@ import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalFactory; +import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -101,6 +102,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + for(int i = 0; i < 4; i++) if(slot == 4 + i * 7 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 1 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades for(int i = 0; i < 4; i++) if(this.chemplantModule[i].isItemValid(slot, stack)) return true; // recipe input crap return false; @@ -163,7 +165,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl boolean markDirty = false; for(int i = 0; i < 4; i++) { - this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool()); + this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool(), slots[4 + i * 7]); this.didProcess[i] = this.chemplantModule[i].didProcess; markDirty |= this.chemplantModule[i].markDirty; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 47e0a7d62..6a21f07de 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -110,7 +110,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; - this.chemplantModule.update(speed, pow, true); + this.chemplantModule.update(speed, pow, true, slots[1]); this.didProcess = this.chemplantModule.didProcess; if(this.chemplantModule.markDirty) this.markDirty(); @@ -232,6 +232,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades if(slot >= 10 && slot <= 12) return true; // input fluid if(slot >= 16 && slot <= 18) return true; // output fluid diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 50aa4a009..7def2090a 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1416,6 +1416,7 @@ item.blades_schrabidium.name=Schrabidiumsägeblatt item.blades_steel.name=Stahlsägeblatt item.blades_titanium.name=Titansägeblatt item.blowtorch.name=Lötlampe +item.blueprints.name=Blaupausen item.board_copper.name=Kupfertafel item.boat_rubber.name=Schlauchboot item.bobmazon.name=Bobmazon diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..0d27f7c80 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2160,6 +2160,7 @@ item.blades_desh.name=Desh Shredder Blades item.blades_steel.name=Steel Shredder Blades item.blades_titanium.name=Titanium Shredder Blades item.blowtorch.name=Blowtorch +item.blueprints.name=Blueprints item.board_copper.name=Copper Panel item.boat_rubber.name=Rubber Boat item.bobmazon.name=Bobmazon diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png index dc9f7034bfa3723926a9e3a087278070caec4777..3101c24f903633853b12ac0e0fc9f60d57105786 100644 GIT binary patch literal 3490 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 literal 3445 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 LjP>(Q6Yu{E9d9*S diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png index 7e6aa8347e4fff3bda07f1e73bea1f64835e6b4c..ae4a7ef6dfebea7a10da1bbe415b94fcc2daca3b 100644 GIT binary patch literal 3644 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 E0rwknW&i*H literal 3531 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 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png index d58713d9c3f848312cd58d877fd04d93f618154d..3ce1bc32c7c7bc336caa829c6559d5caf3a9c325 100644 GIT binary patch literal 3594 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 AKmY&$ literal 3535 zcma)8c|6ox8~^=gX@)n$6mh4qMcFE3Ez1nqNwTM6sH{n(!N|}iA$8jX6!xQqE z*NFnc#)&W!jx4)I+E}8ozcPG$jM}!s1vlCW&jybdSFBXdRreonDf+UZkXLkN{fi@u(HTSf@DTS_fRyEJ#pzqkkUcekIBivBedf; zBnjyOErLB=-BZK6x+|#jC~oNTe0Ibp_EKYsB;-;c)4I=Yk>3VhEf6SQP;JpMzX z8#S4BSb0T%5BRc*I`1ckTFSgT7%@Amb?g-Ca@w);eu9$v&sx2o`OA{}C(9>CldX1? zmX&!qIXQ(%=)mT=)n5fyxGjGPa11P4`+FNS`xz~X10QPz^w9mKpZxWjT z7p-KgTd7O0#lX646m$@I(w|Lxd>Kc?Zvyt6qfmU`4FxZs^EOafP>ecjBxqogb!c)A ziIo-_R~xAYK~@JduUhjZ!Rn+b-VXOpYT_}8=``_)bHiXf&?lsaP^b{3$3kX7H$_d6 z(z#%rG)Oe;DgdoO-tKdsIWW|8hV^`BQ~Bn{GSK}g<%0AvF3=2FDjopbUcQW3Msm3! z-=?PS+Usm-y|Q~&S^}sgGqVTNmjZ`IGM2|g z$zeY%^3(22J7-f%uo)~aFzh(zRVso?hShc8D*G^YbF;pq4>H@8OXk(DV~MGMW@-@_ z=f%o8Z@TE@<<45}(swunk9p?|Gdt&b$WKnBgql~MqxcXAyk%Ofol_WYvc4!M47t&m zl|weM)nVlE4&H~J@|#L;)qRc3)x#TY#`li;JMxl3kPn6H0I6vIkhaR5maC? zh5}N=eA%16;ldoBBh~^^{2Ecjc*HXmWK4hQ29=1VhmPTlj7KyCdAoka#cib2N3BOX z4ESTc5)OE6Dk0mhBBhuJNLf!I4LoDdT9l9tTYBSUqU$ppMx64=WaDLmFQA$WA}kyb z_9N_~1OycGz$5TnnfjXI_Tsc+&;}9zM+6`eIKVa%kiyLUhcFj_JRXd3sc!4D6M=+k z16&^RG{5{mypFC)A+sul!$%a4vFR$~{GU?p;YlectnthFKE+=|>eJ`#>|2edeLY$V zqY-uQXDFadfE*|2r@?>Q{u8woQd{N3HS1l~i9u*f@`Rs%D9mif^qP-inSG0@1I?>Hx3)<|bqQ-AKlD^@K4$LdhnjdmhB@Os z8!%mWJ3(D{en5MRJ)&^W%c7v~4r@;aMY-sN$Y=D$uLH0eVu@HD3(3Lb#&k1_CEIwx zXGl@dE3wmKT_X6dLiC*^o>=f*hY~@%=Di}EpE4QDIb-EjdD(z+$z;RjckezFl4HAu zCD$$|(leJZ>x|7s@|X+0sEs8G*o`>RCL5nNN7uUhRSSNCHVu52e0B8S4YlcWzcF$( zpYn=lhIgDz-P2rw!>Mi!%_Z+U`832fW>Trz_|8yW>t`DB+dy?A|7;mYt3US10>K`8 zl6OXk>(~R2xTg#0L`o2Kaaan+= zx(VnN;{(pbBcdGrUwkYZ+90hSHwUAiqm99dTr*%0fqJ=N6M%zgFIa45iYhB-MjGUY zWMrR`dvEH7%?MheX4LD}AtThC#Ygm?=8uq57Q7$tJ54!Hzh3Yw1U++TMC(`p>?WR1 z3NQz>1o)(cpy3*4>je+YXK1gn=q~(N5Dj2e)pJ)w1CZS_x+z~Z!OQ72qNW>Dmquvf zz4bR1JE7GtnqXUfjpXSrPGm!W;LvnDqSF9|X4bg%JQRd?%($4qMtc>B#`wigJ8n0= zJ*@wEKf(BXQW?5;B1Lj)9H(c+6gInbdq%&9Kc{ z@EcB*nv7hJjohnj-U z4`!tAsU5?pOF;tx2ZthnikYiPRy)26R&-x`)6&A$FSCpoetTlilgdgx$lMod3#{G_ zJWK)JFOQwF0{SPl8zsNY%(N{mQG<090wcm0JDYIa@Lk=aHb=4EUDMv(?OO2qbk&@9 zc}HO?;T2iO-!F0Jwu*0mvhC)*t<$HOH6&8x@|PfYpRTjsl1i|lTNc3m{nLHcPsf0- zbT%`VnDSs#)Zq`TRJALm9)`+qrkkofWmySnRhw0s_V82sLY1R5pJR!w!TXNkM1-r; zw}Wql7o4$XHx|)SO?zn8Ii97I3FWG2wJQ?c|DqqHB7j{`uOiyx>JBw4ijjIsF!S4z zAmE*_h$aPoAkZ*pHXjTzyoZldUx?1xAY`<5*JL7%K)@FetRqCOGge6 z4ch>gSP^XSHV!;-*mG{YXPlyDM6gg(S|k&LDEviayelav5BrXl}^|4(({*?b10lx^f%DnIK>$fMFZ%Se4T9GKD0WH{y7BJ2?+}F@Vq-_UAM)u0Csi)UiEmV_FBQGQCqK89mV$e;va$x6d915Kv40JM+3Q{GbeH+z}PjQBpKXcrT=>sv}x4^Q?`05Xfn!RJtlx zmzPVGN2xKe#BnH)X{XUb7hxn^Jur}V3MrIuiEv>B&f@zhvCKAH%{g;pYoj7V(#3xR DKjunf diff --git a/src/main/resources/assets/hbm/textures/items/blueprints.png b/src/main/resources/assets/hbm/textures/items/blueprints.png new file mode 100644 index 0000000000000000000000000000000000000000..225bec283a40a368b2fe88ed70f545c848ca102b GIT binary patch literal 379 zcmV->0fhdEP)3b->*B=6m`_w6kFQPHsh=bUSYqiAowd(3!w`|SM- zA$!EZVBnNe0N89qnrwU8z~u4TOVZh;JLeqzG1gkFwW#+8w4tpuX%cyBg;C{1{dy08 zQVN@m+7xNxC+SS4AI#=Uuc-~tA2(}klBCJD4=|fAn>+dZDxEPalH`P&yEktLfT^FP z$cF%wdePj0n2lLcg_# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_discover.png b/src/main/resources/assets/hbm/textures/items/blueprints_discover.png new file mode 100644 index 0000000000000000000000000000000000000000..66cdcea650c4eb892facdfd28145531b98aae877 GIT binary patch literal 397 zcmV;80doF{P)gJZI z8f4uWChFVZKrLhn(aO@KsuScc{lnOj?Pq#-@4fH+-u2**(tb(^!&NEQlgWK6|6718 z91O12*>3mQg0ujm(WumQ9e^P4NYjmqnWo)>s71A-<2(YO>pDT;DL|TTS`e*iRd#gU zw_iazLc9}2+gi{xZG?CMpePEa(>ZCnQE`AM+7gDVQuDm0GD!|tRv*`OYDqwA9N!lJ z?Drq1J6J3pO3Uiggj6rC3K05FU$0G(=ak{s}Tp~f&x8{ZeqW_KKqM~b4rFuE8< zmn_T4vi$THs$@0!asP r9AAEk64G=aJ2rLpP(m&h{+qr4spP$PtFypF00000NkvXXu0mjf)by^B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_secret.png b/src/main/resources/assets/hbm/textures/items/blueprints_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..9abb970571fc173b44a8a56657a9e92cd66fc43d GIT binary patch literal 313 zcmV-90mlA`P)2t*>Om%54B| zz!Y~R7%PbbBm@XU7WMcf%fOq_y-;J%>Yo7&0GK&m%=6r=X#gT(r4#@_tre$rjk%x0 zp@C#TbR5SK08mOntu+cx>)JrNt*UqYKA&HLbVOvT3TBQ;k8E-|9%CEnJpR;)$N(5K z+wU+KGe?SuiHI%BV$5v+#*tw_M93!j;Ic{I_W%GQY7Mf9r+1pB$wb76DC&^zNCVlX z1AOeDFaMmXYQ7DBZdLPGRqtNH8 Date: Mon, 14 Jul 2025 20:31:54 -0500 Subject: [PATCH 109/323] add dyable cable color functionality to paintable network cable --- .../BlockOpenComputersCablePaintable.java | 116 +++++++++++++++++- .../java/com/hbm/handler/CompatHandler.java | 84 +++++++++---- .../hbm/textures/blocks/oc_cable_base.png | Bin 624 -> 612 bytes .../hbm/textures/blocks/oc_cable_color.png | Bin 0 -> 111 bytes .../hbm/textures/blocks/oc_cable_overlay.png | Bin 340 -> 139 bytes 5 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index b755006d5..915fb58f0 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,6 +2,8 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ILookOverlay; +import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -13,7 +15,9 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -29,10 +33,16 @@ import li.cil.oc.api.Network; import li.cil.oc.api.network.Visibility; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.Loader; +import li.cil.oc.api.network.SidedEnvironment; +import net.minecraftforge.common.util.ForgeDirection; +import li.cil.oc.api.internal.Colored; +import com.hbm.handler.CompatHandler.OCColors; +import net.minecraftforge.oredict.OreDictionary; public class BlockOpenComputersCablePaintable extends BlockContainer implements IToolable, IBlockMultiPass { @SideOnly(Side.CLIENT) protected IIcon overlay; + @SideOnly(Side.CLIENT) protected IIcon overlayColor; public BlockOpenComputersCablePaintable() { super(Material.iron); @@ -48,6 +58,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements public void registerBlockIcons(IIconRegister reg) { this.blockIcon = reg.registerIcon(RefStrings.MODID + ":oc_cable_base"); this.overlay = reg.registerIcon(RefStrings.MODID + ":oc_cable_overlay"); + this.overlayColor = reg.registerIcon(RefStrings.MODID + ":oc_cable_color"); } @Override @@ -61,13 +72,29 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(pipe.block != null) { if(RenderBlockMultipass.currentPass == 1) { return this.overlay; + } else if(RenderBlockMultipass.currentPass == 2) { + return this.overlayColor; } else { return pipe.block.getIcon(side, pipe.meta); } } } - return RenderBlockMultipass.currentPass == 1 ? this.overlay : this.blockIcon; + return RenderBlockMultipass.currentPass == 1 ? this.overlay : RenderBlockMultipass.currentPass == 2 ? this.overlayColor : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + if (RenderBlockMultipass.currentPass == 2) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + if (tile == null) + return 0xffffff; + + return tile.getColor(); + } + + return 0xffffff; } @Override @@ -75,7 +102,10 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements ItemStack stack = player.getHeldItem(); - if(stack != null && stack.getItem() instanceof ItemBlock) { + if (stack == null) + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + + if (stack.getItem() instanceof ItemBlock) { ItemBlock ib = (ItemBlock) stack.getItem(); Block block = ib.field_150939_a; @@ -95,6 +125,21 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements } } } + } else { + boolean isDye = false; + int[] dicts = OreDictionary.getOreIDs(stack); + for (int dict : dicts) { + String dictName = OreDictionary.getOreName(dict); + if (dictName.equals("dye")) + isDye = true; + } + + if (isDye) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + tile.setColor(OCColors.fromDye(stack).getColor()); + world.markBlockForUpdate(x, y, z); + tile.markDirty(); + } } return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); @@ -123,7 +168,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements @Override public int getPasses() { - return 2; + return 3; } @Override @@ -131,9 +176,12 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements return IBlockMultiPass.getRenderType(); } - // WHY the fuck is this not compiling - @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers")}) - public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment { + @Optional.InterfaceList({ + @Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.Colored", modid = "OpenComputers") + }) + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored { protected Node node; protected boolean addedToNetwork = false; @@ -142,6 +190,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements private int meta; private Block lastBlock; private int lastMeta; + private OCColors color = OCColors.LIGHTGRAY; public TileEntityOpenComputersCablePaintable() { node = Network.newNode(this, Visibility.None).create(); @@ -181,6 +230,8 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements this.block = id == 0 ? null : Block.getBlockById(id); this.meta = nbt.getInteger("meta"); + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); + if (node != null && node.host() == this) { node.load(nbt.getCompoundTag("oc:node")); } @@ -192,6 +243,8 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); nbt.setInteger("meta", meta); + nbt.setInteger("dyeColor", color.getColor()); + if (node != null && node.host() == this) { final NBTTagCompound nodeNbt = new NBTTagCompound(); node.save(nodeNbt); @@ -212,6 +265,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(nbt.hasKey("paintblock")) { this.block = Block.getBlockById(nbt.getInteger("paintblock")); this.meta = nbt.getInteger("paintmeta"); + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); } } @@ -221,6 +275,30 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements return node; } + public Node sidedNode(ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return null; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + if (neighbor instanceof Environment) + return node; + else + return null; + } + + Colored cable = (Colored) neighbor; + if (cable.getColor() == color.getColor()) + return node; + else + return null; + } + @Override public void onConnect(Node node) {} @@ -240,5 +318,31 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements super.invalidate(); if (node != null) node.remove(); } + + public boolean canConnect(net.minecraftforge.common.util.ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return false; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + return neighbor instanceof Environment; + } + + Colored cable = (Colored) neighbor; + return cable.getColor() == color.getColor(); + } + + public void setColor(int newColor) { + color = OCColors.fromInt(newColor); + } + + public int getColor() { + return color.getColor(); + } } } diff --git a/src/main/java/com/hbm/handler/CompatHandler.java b/src/main/java/com/hbm/handler/CompatHandler.java index 46ce74fc0..ac4bbe114 100644 --- a/src/main/java/com/hbm/handler/CompatHandler.java +++ b/src/main/java/com/hbm/handler/CompatHandler.java @@ -1,11 +1,13 @@ package com.hbm.handler; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.network.BlockOpenComputersCablePaintable; import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.util.ItemStackUtil; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Optional; import li.cil.oc.api.Items; @@ -15,6 +17,7 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.*; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -108,27 +111,66 @@ public class CompatHandler { } } - /** - * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. - */ - public enum OCColors { - BLACK, //0x444444 - RED, //0xB3312C - GREEN, //0x339911 - BROWN, //0x51301A - BLUE, //0x6666FF - PURPLE, //0x7B2FBE - CYAN, //0x66FFFF - LIGHTGRAY, //0xABABAB - GRAY, //0x666666 - PINK, //0xD88198 - LIME, //0x66FF66 - YELLOW, //0xFFFF66 - LIGHTBLUE, //0xAAAAFF - MAGENTA, //0xC354CD - ORANGE, //0xEB8844 - WHITE //0xF0F0F0 - } + /** + * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. + */ + public enum OCColors { + BLACK(0x444444, "dyeBlack"), + RED(0xB3312C, "dyeRed"), + GREEN(0x339911, "dyeGreen"), + BROWN(0x51301A, "dyeBrown"), + BLUE(0x6666FF, "dyeBlue"), + PURPLE(0x7B2FBE, "dyePurple"), + CYAN(0x66FFFF, "dyeCyan"), + LIGHTGRAY(0xABABAB, "dyeLightGray"), + GRAY(0x666666, "dyeGray"), + PINK(0xD88198, "dyePink"), + LIME(0x66FF66, "dyeLime"), + YELLOW(0xFFFF66, "dyeYellow"), + LIGHTBLUE(0xAAAAFF, "dyeLightBlue"), + MAGENTA(0xC354CD, "dyeMagenta"), + ORANGE(0xEB8844, "dyeOrange"), + WHITE(0xF0F0F0, "dyeWhite"), + NONE(0x0, ""); + + private final int color; + private final String dictName; + + OCColors(int color, String dictName) { + this.color = color; + this.dictName = dictName; + } + + public int getColor() { + return color; + } + + public static OCColors fromInt(int intColor) { + for (OCColors iColor : OCColors.values()) { + if (intColor == iColor.getColor()) + return iColor; + } + return OCColors.NONE; + } + + public static OCColors fromDye(ItemStack stack) { + List oreNames = ItemStackUtil.getOreDictNames(stack); + + for(String dict : oreNames) { + if(!(dict.length() > 3) || !dict.startsWith("dye")) + continue; + + for (OCColors color : OCColors.values()) { + if(!color.dictName.equals(dict)) + continue; + + return color; + } + } + + return OCColors.NONE; + } + } // Where all disks are stored with their name and `FloppyDisk` class. public static HashMap disks = new HashMap<>(); diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png index 243c2da7f8f52b96ec7dba690200d6902ca3ea4d..7c9e1b0dd15b54f089e760fd3361342c81d78654 100644 GIT binary patch delta 587 zcmV-R0<`_`1mpyeB!4SOL_t(IPmPn$PZL2D$G=k+DQj)Cdg0)e#GnvMsUcv=Dq1mk zl0sX-#DBp*fP+_zH{!u7fq3#FXhm!Vg9a-ej8PK~#%R)@K)Wsd-5uvmvg?-Cgh@6t zdHddHzVF8{pU=lHUhtz>D&bcu1w~PCR8`@2xnOXPcBd20wtqHMDiyS}DB^RVR;%ID zm#;`|Z-Xs9Uf?G^9&iA^cXsgo$4_zMIORDZVR|-;Kf8NyA9JB*a8#>RobKola04^5 z55Z>d&v0)~w*+i#enc#uKv~?z#qCF06{zhhNA&-_}7;uOn0x=PAaM6DY&~vs6?~{Ps%S4FbwC2Bh=Klo zyhyyZ6f|wY0iy+&42QYjdtNHgv$;df0Tq$nhHT@VsVVO5K8KfUYe;8w2{5P7ywsdV z`*czl2t>k0uaEG_v72}_H!oi#Ihg^p(;}#OHg}o<={FPz@Lr)HvHsR_Gz08!zz(yQ Z<1fjbRIG!_>}LP~002ovPDHLkV1lxO4jupi delta 599 zcmV-d0;v7u1n>lqB!4$aL_t(IPmNPePg6k@JyTw#t(9P9L!!nNiBTbzrUt4-6pa{N zNufnBaZBRDf8ZXs#DyypB5|R(p?)A*!5|?O7cSHUjWL=u$Vb~(`rUV(JISlB+C*;h zGLw1to;l~-JHqGl(Ww)DD-OeCOb8g{!}XmYz@5W(qiz<<%$h*GJ9h6YW3HdHDV zeE9eYiM2I|nFmv}&*K3B__eWtZ{L5&9ihduSAnH<9qXH0XxigO#UPZ+WgKX2mEZ=( zC+?QMBx2ZTUApGP*Eg%}XW;v8-aT2oV_!(S(V^C)XVPk>X6;A2Gi$m zC=YrA0Yv9sVk?!Z0l0VLD_Wcy#-;*Fo*As48L$iy4u1_$Ur!J-vvV~7?DFHAU$CAl zV@bb-$%oVR0V1Ig_4l2X5}womc$%AWy1N^P4(?a8@hBRt0&r*e0>$8Jc!*B={g|Df zmo)!K_@A5H0R_M&2D`fOJodVV!Hxk&!eR1zk1GagJ+q@ZU=z7Js*Tr2N6FiM3@;WI zkW8f&fKWMwCJS>Kt<%X}U=VTXVn2-xT*2MR`|3qbLAOOc|E}(bxH=Y l#kbW&v%vZWtYB7uegh`$POLLim?QuI002ovPDHLkV1jWf8Vvvd diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3be6c7bb723b6a0d52cc6190ff27529f04a829 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr}70DGLM)f>z8=+#&Tr zo?}BRud={`?qpu(35+kgHg-1hNS|X15b0R5TV+J!Z|a0VjCfT@vZ7+!wnWN6x=%|Mm`bv{=a#Cg9nWG^=%&j5S6G7^>bP0l+XkK De2Z3~ From 76368acbf8aa770605a2f65e3b142baa70acf217 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Mon, 14 Jul 2025 20:52:12 -0500 Subject: [PATCH 110/323] remove unused imports in BlockOpenComputersCablePaintable.java --- .../hbm/blocks/network/BlockOpenComputersCablePaintable.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index 915fb58f0..c18f5ce2b 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,8 +2,6 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; -import com.hbm.blocks.ILookOverlay; -import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -15,9 +13,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -32,7 +28,6 @@ import li.cil.oc.api.network.Node; import li.cil.oc.api.Network; import li.cil.oc.api.network.Visibility; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.Loader; import li.cil.oc.api.network.SidedEnvironment; import net.minecraftforge.common.util.ForgeDirection; import li.cil.oc.api.internal.Colored; From 5f8b0f6aedc1445b934a59ef5b73543f62584995 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Tue, 15 Jul 2025 04:10:06 -0500 Subject: [PATCH 111/323] fix TileEntityOpenComputersCablePaintable not implementing ICopyable and add null check for ModBlocks.oc_cable_paintable in CraftingManager.java --- .../hbm/blocks/network/BlockOpenComputersCablePaintable.java | 3 ++- src/main/java/com/hbm/main/CraftingManager.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index c18f5ce2b..d40d81595 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,6 +2,7 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -176,7 +177,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements @Optional.Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputers"), @Optional.Interface(iface = "li.cil.oc.api.network.Colored", modid = "OpenComputers") }) - public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored { + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored, ICopiable { protected Node node; protected boolean addedToNetwork = false; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d91f00033..89650f200 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -237,7 +237,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 1), new Object[] { "BBB", "WFW", "RRR", 'B', BE.ingot(), 'R', ModItems.coil_tungsten, 'W', CU.plateCast(), 'F', Item.getItemFromBlock(Blocks.furnace) }); addRecipeAuto(new ItemStack(ModBlocks.red_wire_coated, 16), new Object[] { "WRW", "RIR", "WRW", 'W', ModItems.plate_polymer, 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.red_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); - addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); + if (ModBlocks.oc_cable_paintable != null) + addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.cable_switch, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_detector, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_diode, 1), new Object[] { " Q ", "CAC", " Q ", 'Q', SI.nugget(), 'C', ModBlocks.red_cable, 'A', AL.ingot() }); From 281e66b37e3852d3ce466ebaea0347b889af1b87 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 15 Jul 2025 16:00:43 +0200 Subject: [PATCH 112/323] my love is a quickscope --- changelog | 1 + .../com/hbm/crafting/ConsumableRecipes.java | 2 - .../inventory/recipes/AssemblerRecipes.java | 21 -- .../recipes/AssemblyMachineRecipes.java | 181 +++++++++++++++++- src/main/java/com/hbm/items/ModItems.java | 8 +- .../java/com/hbm/items/food/ItemEnergy.java | 54 +----- .../weapon/sedna/factory/XFactoryTool.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 2 + 8 files changed, 187 insertions(+), 84 deletions(-) diff --git a/changelog b/changelog index 6be709682..6221f663e 100644 --- a/changelog +++ b/changelog @@ -18,6 +18,7 @@ * This should fix the issue where most armors are quite weak against swords * Electric attacks (i.e. tesla cannon) are now in the "energy damage" category * This means that armors that have energy resistance actually properly work against the tesla cannon +* Heavy components are being deprecated ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index 8d867f56e..6c3e6f3b3 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -89,8 +89,6 @@ public class ConsumableRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.bottle2_empty, 6), new Object[] { " G ", "G G", "G G", 'G', KEY_ANYPANE }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust(), ST.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust(), TH232.dust() }); //Syringes CraftingManager.addRecipeAuto(new ItemStack(ModItems.syringe_empty, 6), new Object[] { "P", "C", "B", 'B', Item.getItemFromBlock(Blocks.iron_bars), 'C', ModItems.cell_empty, 'P', IRON.plate() }); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 13e823907..1960d4dfb 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -23,9 +23,7 @@ import com.hbm.config.GeneralConfig; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.*; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.items.ItemEnums.EnumCasingType; @@ -842,19 +840,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemfac, 1), new AStack[] { - !exp ? new OreDictStack(STEEL.ingot(), 48) : new OreDictStack(STEEL.heavyComp(), 2), - new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), - new OreDictStack(NB.ingot(), 4), - new OreDictStack(RUBBER.ingot(), 16), - new OreDictStack(STEEL.shell(), 12), - new ComparableStack(ModItems.tank_steel, 8), - new ComparableStack(ModItems.motor_desh, 4), - new ComparableStack(ModItems.coil_tungsten, 24), - new OreDictStack(STEEL.pipe(), 8), - new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) - }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemical_factory, 1), new AStack[] { new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), @@ -1310,12 +1295,6 @@ public class AssemblerRecipes extends SerializableRecipe { } } - for(NTMMaterial mat : Mats.orderedList) { - if(mat.autogen.contains(MaterialShapes.CASTPLATE) && mat.autogen.contains(MaterialShapes.HEAVY_COMPONENT)) { - makeRecipe(new ComparableStack(ModItems.heavy_component, 1, mat.id), new AStack[] { new OreDictStack(MaterialShapes.CASTPLATE.name() + mat.names[0], 256) }, 12_000); - } - } - // WarTec compatibility code try { Class wartecmodAssemblerRecipes = ClassLoader.getSystemClassLoader().loadClass("com.wartec.wartecmod.inventory.wartecmodAssemblerRecipes"); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 39f2fc198..aed9b4798 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -7,12 +7,17 @@ import java.util.List; import static com.hbm.inventory.OreDictManager.*; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockCap.EnumCapBlock; +import com.hbm.blocks.machine.BlockICFLaserComponent.EnumICFPart; +import com.hbm.config.GeneralConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; @@ -22,11 +27,14 @@ import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import cpw.mods.fml.common.Loader; +import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -65,6 +73,14 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) .inputItems(new ComparableStack(ModBlocks.block_meteor, 1))); + this.register(new GenericRecipe("ass.platedesh").setup(200, 100).outputItems(new ItemStack(ModItems.plate_desh, 4)) + .inputItems(new OreDictStack(DESH.ingot(), 4), new OreDictStack(ANY_PLASTIC.dust(), 2), new OreDictStack(DURA.ingot(), 1))); + this.register(new GenericRecipe("ass.platebismuth").setup(200, 100).outputItems(new ItemStack(ModItems.plate_bismuth, 1)) + .inputItems(new ComparableStack(ModItems.nugget_bismuth, 2), new OreDictStack(U238.billet(), 2), new OreDictStack(NB.dust(), 1))); + this.register(new GenericRecipe("ass.plateeuphemium").setup(600, 100).outputItems(new ItemStack(ModItems.plate_euphemium, 1)) + .inputItems(new OreDictStack(EUPH.ingot(), 4), new OreDictStack(AT.dust(), 3), new OreDictStack(BI.dust(), 1), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.ingot_osmiridium))); + this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) + .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); // cloth this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) @@ -124,7 +140,42 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(PB.plate(), 6), new OreDictStack(ALLOY.plate(), 6), new OreDictStack(ANY_RUBBER.ingot(), 2), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 1))); this.register(new GenericRecipe("ass.firedoor").setup(300, 100).outputItems(new ItemStack(ModBlocks.fire_door, 1)) .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(ALLOY.plate(), 8), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.seal").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.transition_seal, 1)) + .inputItems(new ComparableStack(ModBlocks.cmb_brick_reinforced, 16), new OreDictStack(STEEL.plate(), 64), new OreDictStack(ALLOY.plate(), 40), new OreDictStack(ANY_RUBBER.ingot(), 36), new OreDictStack(STEEL.block(), 24), new ComparableStack(ModItems.motor_desh, 16), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_YELLOW, 4))); + this.register(new GenericRecipe("ass.slidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_blast_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(W.ingot(), 8), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ANY_RUBBER.ingot(), 4), new OreDictStack(DURA.bolt(), 16), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.vehicledoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.large_vehicle_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.waterdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.water_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_RED, 1))); + this.register(new GenericRecipe("ass.qedoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.qe_containment, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(ALLOY.plate(), 4), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_BLACK, 4))); + this.register(new GenericRecipe("ass.queslidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.qe_sliding_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 4), new ComparableStack(Blocks.glass, 4))); + this.register(new GenericRecipe("ass.roundairlock").setup(400, 100).outputItems(new ItemStack(ModBlocks.round_airlock_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.secureaccess").setup(400, 100).outputItems(new ItemStack(ModBlocks.secure_access_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_RED, 8))); + this.register(new GenericRecipe("ass.slidingseal").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_seal_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 2))); + this.register(new GenericRecipe("ass.silohatch").setup(200, 100).outputItems(new ItemStack(ModBlocks.silo_hatch, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.silohatchlarge").setup(300, 100).outputItems(new ItemStack(ModBlocks.silo_hatch_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8))); + // decoration + this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) + .inputItems(new ComparableStack(ModItems.cap_nuka, 128))); + this.register(new GenericRecipe("ass.capquantum").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.QUANTUM)) + .inputItems(new ComparableStack(ModItems.cap_quantum, 128))); + this.register(new GenericRecipe("ass.capsparkle").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.SPARKLE)) + .inputItems(new ComparableStack(ModItems.cap_sparkle, 128))); + this.register(new GenericRecipe("ass.caprad").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.RAD)) + .inputItems(new ComparableStack(ModItems.cap_rad, 128))); + this.register(new GenericRecipe("ass.capfritz").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.FRITZ)) + .inputItems(new ComparableStack(ModItems.cap_fritz, 128))); + this.register(new GenericRecipe("ass.capkorl").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.KORL)) + .inputItems(new ComparableStack(ModItems.cap_korl, 128))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); @@ -143,20 +194,48 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal()))); this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.electrolyzer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_electrolyser, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1))); this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.fracker").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_fracking_tower, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 24), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3))); this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.crackingtower").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_cracker, 1)) + .inputItems(new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(STEEL.shell(), 6), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(NB.ingot(), 2), new ComparableStack(ModItems.catalyst_clay, 12))); + this.register(new GenericRecipe("ass.radiolysis").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_radiolysis, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.thermo_element, 8))); this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.vaccumrefinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_vacuum_distill, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CHIP_BISMOID))); + this.register(new GenericRecipe("ass.reformer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_reformer, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 3), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.hydrotreater").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hydrotreater, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(CU.plateCast(), 4), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 2), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.pyrooven").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_pyrooven, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 4), new OreDictStack(CU.pipe(), 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.liquefactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_liquefactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 12), new OreDictStack(ANY_TAR.any(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_tungsten, 8))); + this.register(new GenericRecipe("ass.solidifier").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_solidifier, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(AL.plate528(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.compressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.compactcompressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor_compact, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(TI.shell(), 4), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.fel").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_fel, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.silex").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_silex, 1)) + .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8))); this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) @@ -191,9 +270,15 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4))); this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) .inputItems(new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); + this.register(new GenericRecipe("ass.difurnacertg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_difurnace_rtg_off, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(DESH.ingot(), 4), new OreDictStack(PB.plate528(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(CU.plate(), 12))); this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))); - + this.register(new GenericRecipe("ass.assemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_assemfac, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 48), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor, 18), new OreDictStack(W.bolt(), 16), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); @@ -211,11 +296,15 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + this.register(new GenericRecipe("ass.hephaestus").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hephaestus, 1)) + .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16))); this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16))); - + this.register(new GenericRecipe("ass.radgen").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radgen, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "radgen") + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1))); + // condensers this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4))); @@ -223,11 +312,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); - this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_lithium_battery, 1)) .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CO.dust(), 12), new OreDictStack(LI.dust(), 12))); - this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_schrabidium_battery, 1)) .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); - this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_dineutronium_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); this.register(new GenericRecipe("ass.fensusan").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.machine_fensu, 1)) .inputItems(new ComparableStack(ModItems.ingot_electronium, 32), @@ -253,11 +342,34 @@ public class AssemblyMachineRecipes extends GenericRecipes { // accelerators this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.beamline").setup(200, 100).outputItems(new ItemStack(ModBlocks.pa_beamline, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4))); + this.register(new GenericRecipe("ass.rfc").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_rfc, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16))); + this.register(new GenericRecipe("ass.quadrupole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_quadrupole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 1), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.dipole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_dipole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 2), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.source").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_source, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.detector").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_detector, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 128))); + this.register(new GenericRecipe("ass.panbti").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.NIOBIUM.ordinal())).inputItems(new OreDictStack(NB.wireDense(), 64), new OreDictStack(TI.wireDense(), 64))); + this.register(new GenericRecipe("ass.pabscco").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.BSCCO.ordinal())).inputItems(new OreDictStack(BSCCO.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64))); + this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 128), new ComparableStack(ModItems.powder_chlorophyte, 16))); + this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) + .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16))); // reactors + this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) + .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.researchreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.reactor_research, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); - + this.register(new GenericRecipe("ass.rbmk").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_blank, 1)) + .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4))); // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) @@ -285,6 +397,33 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + // ICF + this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) + .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16))); + this.register(new GenericRecipe("ass.icfemitter").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.EMITTER.ordinal())) + .inputItems(new OreDictStack(W.plateWelded(), 4), new OreDictStack(MAGTUNG.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 16_000))); + this.register(new GenericRecipe("ass.icfcapacitor").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CAPACITOR.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 1), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.ingot(), 2))); + this.register(new GenericRecipe("ass.icfturbo").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.TURBO.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new OreDictStack(DNT.wireDense(), 4), new OreDictStack(SBD.ingot(), 4))); + this.register(new GenericRecipe("ass.icfcasing").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CASING.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16))); + this.register(new GenericRecipe("ass.icfport").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.PORT.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 4))); + this.register(new GenericRecipe("ass.icfcontroller").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_controller, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.icfscaffold").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 0)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(TI.plateWelded(), 2))); + this.register(new GenericRecipe("ass.icfvessel").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 1), new OreDictStack(CMB.plateCast(), 1), new OreDictStack(W.plateWelded(), 2))); + this.register(new GenericRecipe("ass.icfstructural").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 3)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 1))); + this.register(new GenericRecipe("ass.icfcore").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.struct_icf_core, 1)) + .inputItems(new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.icfpress").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_icf_press, 1)) + .inputItems(new OreDictStack(GOLD.plateCast(), 8), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + // upgrades this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); @@ -492,11 +631,16 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.DEUTERIUM, 4_000))); this.register(new GenericRecipe("ass.warheadvolcano").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_volcano, 1)) .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(STEEL.plateCast(), 6), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()))); - this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) - .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new OreDictStack(STEEL.pipe(), 4))); - + this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) + .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); + this.register(new GenericRecipe("ass.shuttlemissile").setup(200, 100).outputItems(new ItemStack(ModItems.missile_shuttle, 1)) + .inputItems(new ComparableStack(ModItems.missile_generic, 2), new ComparableStack(ModItems.missile_strong, 1), new OreDictStack(KEY_ORANGE, 5), new ComparableStack(ModItems.canister_full, 24, Fluids.GASOLINE_LEADED.getID()), new OreDictStack(FIBER.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 8), new OreDictStack(KEY_ANYPANE, 6), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.launchpad").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad_large, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(ANY_CONCRETE.any(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModBlocks.steel_scaffold, 24), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.launchpadsilo").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_CONCRETE.any(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) .inputItems()); @@ -526,6 +670,10 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + // tools + this.register(new GenericRecipe("ass.multitool").setup(100, 100).outputItems(new ItemStack(ModItems.multitool_hit, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.plate(), 4), new OreDictStack(GOLD.wireFine(), 12), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + // space this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) .inputItems(new OreDictStack(TI.shell(), 32), @@ -626,6 +774,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + if(GeneralConfig.enableMekanismChanges && Loader.isModLoaded("Mekanism")) { + Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); + if(mb != null) { + + this.register(new GenericRecipe("ass.digimemer").setup(1_200, 100).outputItems(new ItemStack(mb, 1, 4)) + .inputItems(new OreDictStack(BIGMT.plateCast(), 16), + new OreDictStack(CU.plateWelded(), 12), + new OreDictStack("alloyUltimate", 32), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), + new ComparableStack(ModItems.circuit, 32, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.wire_dense, 32, Mats.MAT_GOLD.id), + new ComparableStack(ModItems.motor_bismuth, 3))); + } + } + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f6afda0e0..3ded60786 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -914,8 +914,6 @@ public class ModItems { public static Item bottle2_empty; public static Item bottle2_korl; public static Item bottle2_fritz; - public static Item bottle2_korl_special; - public static Item bottle2_fritz_special; public static Item flask_empty; public static Item flask_infusion; public static Item chocolate_milk; @@ -2925,7 +2923,7 @@ public class ModItems { ingot_raw = new ItemAutogen(MaterialShapes.INGOT).setUnlocalizedName("ingot_raw").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_raw"); plate_cast = new ItemAutogen(MaterialShapes.CASTPLATE).aot(Mats.MAT_BISMUTH, "plate_cast_bismuth").setUnlocalizedName("plate_cast").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_cast"); plate_welded = new ItemAutogen(MaterialShapes.WELDEDPLATE).setUnlocalizedName("plate_welded").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_welded"); - heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":heavy_component"); + heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(null).setTextureName(RefStrings.MODID + ":heavy_component"); wire_fine = new ItemAutogen(MaterialShapes.WIRE) .aot(Mats.MAT_ALUMINIUM, "wire_aluminium").aot(Mats.MAT_COPPER, "wire_copper") .aot(Mats.MAT_MINGRADE, "wire_red_copper").aot(Mats.MAT_GOLD, "wire_gold") @@ -3093,8 +3091,6 @@ public class ModItems { bottle2_empty = new Item().setUnlocalizedName("bottle2_empty").setTextureName(RefStrings.MODID + ":bottle2_empty"); bottle2_korl = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); bottle2_fritz = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); - bottle2_korl_special = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); - bottle2_fritz_special = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); flask_infusion = new ItemFlask().setUnlocalizedName("flask_infusion").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":flask"); chocolate_milk = new ItemEnergy().setUnlocalizedName("chocolate_milk").setTextureName(RefStrings.MODID + ":chocolate_milk"); coffee = new ItemEnergy().setUnlocalizedName("coffee").setTextureName(RefStrings.MODID + ":coffee"); @@ -6705,8 +6701,6 @@ public class ModItems { GameRegistry.registerItem(bottle2_empty, bottle2_empty.getUnlocalizedName()); GameRegistry.registerItem(bottle2_korl, bottle2_korl.getUnlocalizedName()); GameRegistry.registerItem(bottle2_fritz, bottle2_fritz.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_korl_special, bottle2_korl_special.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_fritz_special, bottle2_fritz_special.getUnlocalizedName()); GameRegistry.registerItem(bottle_opener, bottle_opener.getUnlocalizedName()); //Flasks diff --git a/src/main/java/com/hbm/items/food/ItemEnergy.java b/src/main/java/com/hbm/items/food/ItemEnergy.java index b01195ad9..caa47fc5c 100644 --- a/src/main/java/com/hbm/items/food/ItemEnergy.java +++ b/src/main/java/com/hbm/items/food/ItemEnergy.java @@ -23,6 +23,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; +@Spaghetti("wtf is this shit") public class ItemEnergy extends Item { private Item container = null; @@ -142,18 +143,6 @@ public class ItemEnergy extends Item { player.addPotionEffect(new PotionEffect(Potion.resistance.id, 30 * 20, 2)); player.addPotionEffect(new PotionEffect(Potion.jump.id, 30 * 20, 2)); } - if(this == ModItems.bottle2_korl_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 120 * 20, 2)); - } - if(this == ModItems.bottle2_fritz_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.resistance.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.jump.id, 120 * 20, 2)); - } if(this == ModItems.bottle_sparkle) { player.heal(10F); player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); @@ -202,28 +191,24 @@ public class ItemEnergy extends Item { } @Override - public int getMaxItemUseDuration(ItemStack p_77626_1_) { + public int getMaxItemUseDuration(ItemStack stack) { return 32; } @Override - public EnumAction getItemUseAction(ItemStack p_77661_1_) { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.drink; } @Spaghetti("cover yourself in oil") @Override - public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(VersatileConfig.hasPotionSickness(player)) return stack; + if(this.requiresOpener && !player.inventory.hasItem(ModItems.bottle_opener)) return stack; - if(VersatileConfig.hasPotionSickness(p_77659_3_)) - return p_77659_1_; - - if(this.requiresOpener && !p_77659_3_.inventory.hasItem(ModItems.bottle_opener)) - return p_77659_1_; + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); - p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); - - return p_77659_1_; + return stack; } @Override @@ -260,51 +245,32 @@ public class ItemEnergy extends Item { } if(this == ModItems.bottle_nuka) { list.add("Contains about 210 kcal and 1500 mSv."); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_cherry) { list.add("Now with severe radiation poisoning in every seventh bottle!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_quantum) { list.add("Comes with a colorful mix of over 70 isotopes!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_korl) { list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_fritz) { list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_korl_special) { - if(MainRegistry.polaroidID == 11) - list.add("shgehgev u rguer"); - else - list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_fritz_special) { - if(MainRegistry.polaroidID == 11) - list.add("ygrogr fgrof bf"); - else - list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_sparkle) { if(MainRegistry.polaroidID == 11) list.add("Contains trace amounts of taint."); else list.add("The most delicious beverage in the wasteland!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_rad) { if(MainRegistry.polaroidID == 11) list.add("Now with 400% more radiation!"); else list.add("Tastes like radish and radiation."); - list.add("[Requires bottle opener]"); } + + if(this.requiresOpener) list.add("[Requires bottle opener]"); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java index 91cb0f688..6800ea13f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java @@ -242,7 +242,7 @@ public class XFactoryTool { .setOnUpdate(LAMBDA_FOAM_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_FOAM_HIT); - fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 1)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) + fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 2)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) .setOnUpdate(LAMBDA_SAND_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_SAND_HIT); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 756760d15..8588f66c2 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1716,6 +1716,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.chopper_blades"); ignoreMappings.add("hbm:item.component_emitter"); ignoreMappings.add("hbm:item.component_limiter"); + ignoreMappings.add("hbm:item.bottle2_korl_special"); + ignoreMappings.add("hbm:item.bottle2_fritz_special"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); From f94fd70cf0e8b93d0443edb912b3040f4707e0c2 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 15 Jul 2025 21:42:05 +0200 Subject: [PATCH 113/323] falling in love with a corporate illustration --- changelog | 3 +- .../inventory/gui/GUIMachineTurbineGas.java | 4 +- .../recipes/AssemblyMachineRecipes.java | 2 +- .../tileentity/RenderSkeletonHolder.java | 8 +-- src/main/resources/assets/hbm/lang/de_DE.lang | 4 +- src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/models/machines/assembly_machine.obj | 64 +++++++++--------- .../blocks/pneumatic_tube_connector.png | Bin 322 -> 354 bytes .../hbm/textures/blocks/pneumatic_tube_in.png | Bin 415 -> 425 bytes .../textures/blocks/pneumatic_tube_out.png | Bin 429 -> 439 bytes .../hbm/textures/items/canister_biofuel.png | Bin 448 -> 0 bytes .../hbm/textures/items/canister_bitumen.png | Bin 478 -> 0 bytes .../hbm/textures/items/canister_blank.png | Bin 464 -> 221 bytes .../hbm/textures/items/canister_canola.png | Bin 426 -> 0 bytes .../hbm/textures/items/canister_empty.png | Bin 457 -> 398 bytes .../hbm/textures/items/canister_ethanol.png | Bin 563 -> 0 bytes .../hbm/textures/items/canister_fracksol.png | Bin 491 -> 0 bytes .../hbm/textures/items/canister_fuel.png | Bin 415 -> 0 bytes .../hbm/textures/items/canister_gasoline.png | Bin 451 -> 0 bytes .../textures/items/canister_heatingoil.png | Bin 454 -> 0 bytes .../hbm/textures/items/canister_heavyoil.png | Bin 435 -> 0 bytes .../hbm/textures/items/canister_kerosene.png | Bin 472 -> 0 bytes .../hbm/textures/items/canister_lightoil.png | Bin 473 -> 0 bytes .../hbm/textures/items/canister_napalm.png | Bin 515 -> 385 bytes .../hbm/textures/items/canister_naphtha.png | Bin 460 -> 0 bytes .../hbm/textures/items/canister_oil.png | Bin 431 -> 0 bytes .../hbm/textures/items/canister_overlay.png | Bin 424 -> 354 bytes .../hbm/textures/items/canister_petroil.png | Bin 444 -> 0 bytes .../hbm/textures/items/canister_reoil.png | Bin 450 -> 0 bytes .../hbm/textures/items/canister_smear.png | Bin 453 -> 0 bytes .../hbm/textures/items/canister_superfuel.png | Bin 454 -> 0 bytes .../hbm/textures/items/fluid_barrel.png | Bin 237 -> 305 bytes .../textures/items/fluid_barrel_infinite.png | Bin 289 -> 421 bytes .../textures/items/fluid_barrel_overlay.png | Bin 156 -> 208 bytes .../assets/hbm/textures/items/fluid_tank.png | Bin 172 -> 337 bytes .../hbm/textures/items/fluid_tank_overlay.png | Bin 143 -> 181 bytes .../assets/hbm/textures/items/gas_bottle.png | Bin 201 -> 211 bytes .../assets/hbm/textures/items/gas_empty.png | Bin 262 -> 252 bytes .../assets/hbm/textures/items/gas_label.png | Bin 118 -> 142 bytes .../assets/hbm/textures/items/inf_water.png | Bin 288 -> 432 bytes .../hbm/textures/items/inf_water_mk2.png | Bin 431 -> 436 bytes 41 files changed, 47 insertions(+), 42 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_biofuel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_bitumen.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_canola.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_ethanol.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_fracksol.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_fuel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_gasoline.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_heatingoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_heavyoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_kerosene.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_lightoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_naphtha.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_oil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_petroil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_reoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_smear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_superfuel.png diff --git a/changelog b/changelog index 6221f663e..00743753b 100644 --- a/changelog +++ b/changelog @@ -23,4 +23,5 @@ ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded * Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots -* Fixed guns that don't have durability always displaying a condition of 0% \ No newline at end of file +* Fixed guns that don't have durability always displaying a condition of 0% +* Fixed GL state leak caused by skeletons \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 87895df93..66a3b7152 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -124,9 +124,9 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index aed9b4798..c6e98b525 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -48,7 +48,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public int outputItemLimit() { return 1; } @Override public int outputFluidLimit() { return 1; } - @Override public String getFileName() { return "hbmAsemblyMachine.json"; } + @Override public String getFileName() { return "hbmAssemblyMachine.json"; } @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } @Override diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java index adcbea5e9..45401d406 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -23,6 +23,10 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.enableStandardItemLighting(); + switch(te.getBlockMetadata()) { case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; @@ -30,10 +34,6 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; } //why the FUCK did this not commit properl;y - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_CULL_FACE); - RenderHelper.enableStandardItemLighting(); - bindTexture(ResourceManager.skeleton_holder_tex); ResourceManager.skeleton_holder.renderPart("Holder1"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7def2090a..955ecfdc9 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -371,6 +371,7 @@ container.leadBox=Sicherheitsbehälter container.machineAmmoPress=Munitionspresse container.machineArcWelder=Lichtbogenschweißer container.machineArcFurnaceLarge=Lichtbogenofen +container.machineAssemblyMachine=Montagemaschine container.machineBoiler=Ölwärmer container.machineChemicalFactory=Chemiefabrik container.machineChemicalPlant=Chemiewerk @@ -4347,8 +4348,9 @@ tile.machine_arc_welder.name=Lichtbogenschweißer tile.machine_armor_table.name=Rüstungsmodifikationstisch tile.machine_ashpit.name=Aschekasten tile.machine_ashpit.desc=Sammelt Asche von Feuerbüchsen und Heizöfen -tile.machine_assembler.name=Fertigungsmaschine +tile.machine_assembler.name=Fertigungsmaschine (Legacy) tile.machine_assemfac.name=Fertigungsfabrik +tile.machine_assembly_machine.name=Montagemaschine tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autosaw.name=Automatische Kreissäge tile.machine_autosaw.desc=Schneidet Pflanzen nieder, pflanzt Bäume nach$Akzeptiert:$-Holzöl$-Ethanol$-Fischöl$-Schweröl diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index be8eeaa6e..b70a4e262 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -773,6 +773,7 @@ container.leadBox=Containment Box container.machineAmmoPress=Ammo Press container.machineArcWelder=Arc Welder container.machineArcFurnaceLarge=Arc Furnace +container.machineAssemblyMachine=Assembly Machine container.machineBoiler=Oil Heater container.machineChemicalFactory=Chemical Factory container.machineChemicalPlant=Chemical Plant @@ -5480,8 +5481,9 @@ tile.machine_arc_welder.name=Arc Welder tile.machine_armor_table.name=Armor Modification Table tile.machine_ashpit.name=Ashpit tile.machine_ashpit.desc=Collects ashes from fireboxes and heating ovens -tile.machine_assembler.name=Assembly Machine +tile.machine_assembler.name=Assembly Machine (Legacy) tile.machine_assemfac.name=Assembly Factory +tile.machine_assembly_machine.name=Assembly Machine tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autosaw.name=Automatic Buzz Saw tile.machine_autosaw.desc=Cuts down nearby plants, re-plants trees$Accepts:$-Wood oil$-Ethanol$-Fish oil$-Heavy oil diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj index bf0e3b1c4..1b79436d5 100644 --- a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -578,12 +578,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.720395 0.629566 -vt 0.707282 0.611111 -vt 0.720395 0.592656 -vt 0.684807 0.624161 -vt 0.684807 0.598061 -vt 0.703351 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -607,12 +607,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.720395 0.629566 -vt 0.707282 0.611111 -vt 0.720395 0.592656 -vt 0.684807 0.624161 -vt 0.684807 0.598061 -vt 0.703351 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -649,29 +649,29 @@ vt 0.470395 0.148148 vt 0.417763 0.148148 vt 0.319079 0.148148 vt 0.947368 0.574074 -vt 0.729667 0.598061 -vt 0.733508 0.611111 -vt 0.729667 0.624161 -vt 0.711123 0.624161 -vt 0.711123 0.598061 -vt 0.680966 0.611111 -vt 0.694079 0.592656 -vt 0.707192 0.611111 -vt 0.703351 0.624161 -vt 0.694079 0.629566 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.947368 0.574074 -vt 0.729667 0.598061 -vt 0.733508 0.611111 -vt 0.729667 0.624161 -vt 0.711123 0.624161 -vt 0.711123 0.598061 -vt 0.680966 0.611111 -vt 0.694079 0.592656 -vt 0.707192 0.611111 -vt 0.703351 0.624161 -vt 0.694079 0.629566 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.319079 0.296296 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png index 1a0327a1a6fa923581191f2307459f461157af23..133f16515b841b72527b5a39d54085787c0a2844 100644 GIT binary patch delta 312 zcmV-80muHr0^$OYGk*aYNkl7xV5dKnGLPTs#2q6ZDEMW1#l!?6yYoDN< z`yd^dcmrO8DHB5$gseo0P*r(is}f~OhhW!su3b9xBrkX0&-r`~;Kd^WEsG1kS zAzm~-U^E_(Zd9EuH!D;!Z`;1RuAjH$05#F(FgeI<)JgfZhWkgeyQ8uuA4gPB-VB3sqx3>!Hu* z&PLh>n)Byp3^9Dr+jP?WCh&TFcQ~C*9E}I~=`#TUt}g!nKhqbl=#dMOF3KT22Gk*a2NklqDUwIu1Ui-QkB!vF8RpX4V7H0=F(=>`k*of-Ph3^|XH z^B4sexZIyug=a(NcXR^)D7a|E!edHNX@j0KZN&WLkThU=;D3I50EbgGsGJ64@6St} zVA%t*8kJ{mut32@we5G+U3WwptnF%+HSBZS0F-TKS*D0h)2!FBhSg#MQ4|3HJkL|& zvWDe6ZZ&9wtodr7S0)V#E)X8mMxW&~>yR}+x6#l^+sU~6X0S=Fil*@rEqj2r&jbKS eRQ~@z(+js6a1oopDE09G0000DDlF+FR?F&izoO;{4`@Zjvd-oaSV&XN{ z&29@zI9S3Vk^zwnh-Jvd2$-ALmLc>#b}hO|f1Om1ASQGcnHcd({Tpd@UU8 zb9b|oQ{8lSbn0OJADlWVgo4PCfE1BVLXeu+q12&9^Wy}e9~{Sh_q^YI+}*2?ih*5U zHabl-(?Bx~0^t$}mr!^-Pv;zro|HJBPZt0Pg-5GDOyn-B6@N-)J;SQ90!6cicYXS^ z9{0M~?QI!~l1^MyD@)l)0MpkQCzF?iMj6=kWgGyct^T#2Z*-c3!lP)`;O-HCtIb_$ zf#dROj%!rSG}ya!&`cu%`@WwT@rY~GNLV{O&z$Hu4vynw@)4_<25KN&X}kZ4K)AmJ z#=UL^uq+G9vTZW?hz*2G?r3N8>?YWtwDpNUTLAEo(Mkc-B^b$msq}+LhFeD>LmU>}-GAIUQf4|B`b| S(AW?F0000@RRNTC#wPTeG>QyjvJN&4#I8Sg#ky!Xz%Pa%V$ zRSWB_2AZLx89IUI6L>yrZ^nGN;e7I;B>8IA0ATIS0O%fF(tqpp0hmlzGOFC5U{qrv zfbER1nkA`0E?ZcBeZ%;ji{o0VK4%m4GEjzAEli1la-}FeP1euVTMgFUjDk^x@jC#` z?x{3DAxvs=BJEzMA75KDbWW}wQl~#2=9w=yaVGcAHvp(YoJ8RH0JyG;>$*S`Y!bar zAI;EF1zBd0gnwq}Ql1)kK91c^HN+m6rip2qQUk|s6L>z#>zNr&rYo#wDSjisK{-#s zsHQe@I(UhDLi6u2Dp}Iq{$BW(!S&)ZrP!bSo%~an20000+5cHB<8?kSW20ZS=}d+fnq7Itfq=*Yt1@a>60_cFj)XF zJikyHbW713&pFeK3VOSR?Ti!fX0u6*xNK*P-fp28mB=7|VR5;xi|e||Sg$jP3_|HC zfxjq}US#0dmU|KqLLh`t#vI!slpfiw^qJ1r^rawRcK`~7!pX{gOYkF5LyH50&a_7b%- g9%e%)SnZD3Z-UH_nIKn+<^TWy07*qoM6N<$f+vZy(f|Me diff --git a/src/main/resources/assets/hbm/textures/items/canister_biofuel.png b/src/main/resources/assets/hbm/textures/items/canister_biofuel.png deleted file mode 100644 index 5e509e6b80799c0a8b270869d235e8d7df96a281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmV;x0YCnUP)k+K1P`#{y{B zKz0$j6ogU0BO#>-@x1p7ClD);h}T%QbJtcA9Pwr%Nl zVR(fOuh6{!V+_tYMBwPCU^<1H3rx2QRh2+H0g$>DMOy9Z_VyB^3Uv+V!yJ-@XpF&H zi!lZfuFb2x<1n&(Z z$$E@&73>axwHD`+srh_Pr_&*X6yVpGI{=Ht0)QA($ET-vdcEV7JFqsbKLWh>D;FuO zsxmaqJ7rk{Ai`E<01?4CM~rZKnld>!C8yf+dGjTP`VQ3@g=%5+hbIxTOJr%RrKH2Hae z2%3aQ*p{$ep(|i_<`xJGhihGBx}DYebk58eu4=JZ=xjD)wOUcvHOuAF@I=|insr@M zmgQ4g0Fvv+X0!P(@eN@9<|9qhaR2-Ts>=I!Z*{xf@_W-Cr2{yfPJ|G!)^a=^i7}F8 z8LA%?;LqQ$H=xc8j4>ohf`~924$1SJZ$CbpEX(lT^Xlap)C&NJF)|noh%sXA`TP6N zFGf`<%aUjAbqCUkV2r_9i!lZfVKSL8pMO$-s;cnbQxrx23{;g60wRKlpsG|=1%Pu7 zRc&288bMVN5sWdUX^L|W5uq$gLI}hdi81yAthFS`+0=f&XEYj7*EQbzPRw4w;cx&T zgg^*^^?J>8I&IxqYf;sHfOD>OQ4|H(=`5bnE~+Td>xW=Q+FGuI;I6dt6D9V2veSrMNlG%b{GdUe+ceIOo{k|LSNS0N16> UPSvZUiU0rr07*qoM6N<$g2^e;O#lD@ diff --git a/src/main/resources/assets/hbm/textures/items/canister_blank.png b/src/main/resources/assets/hbm/textures/items/canister_blank.png index 9e19878bc2ad4c8583d33e118f159ec5e37ba27f..0524cbe1d224218436c66b826765752ccfe08e8d 100644 GIT binary patch delta 193 zcmcb>e3x;8NGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8Z$2u~Ns5DWigiGl+hOAk7Pg?+Q1a`MBEkI5pIF%0WCmPER`wmQ1Fv^+dJ+nne5 zxw*+detcARbe^%mL}E|X*RF@Rwq_^HifBk;wzs#xW5s>sh8>sN!30Jg9)=a0q*zwv ley#&r!j~H1nda-upao=e05J$$3Z4w2JYD@<);T3K0Ra2HLf`-Z delta 438 zcmV;n0ZIPd0nh`GB!2{RLP=Bz2nYy#2xN!=00D!) znz`U6bPs|q!WFp;SK%T8I#VzSYDWhS4BcIS@G!i5pa1b|)>YiYyCX)%f z-41Il+wE5IOX;7Q)>_K4{7nmh`TjT@4*w+vXjv?ZLaM6be1AS8BE)gb>2zYTSbU7q z8XS*Dx!rEu?|16DCXVA57=Yz+`37qJfl>-%3?T%1y&id{PHwuQITd>zUw>q`(q gAc`VZt5r+$2au@B`n#pLLI3~&07*qoM6N<$g6Jf{%K!iX diff --git a/src/main/resources/assets/hbm/textures/items/canister_canola.png b/src/main/resources/assets/hbm/textures/items/canister_canola.png deleted file mode 100644 index 7f5a44f9151c048fe296ef25ea16037549dfec9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmV;b0agBqP)1u2W+5S=A>pSd;Q)FHZ78+!2wGcv0x#e(Y%D2k zJOMO@0@%RrLP5d0J7e*&!hkMun#ugU&%Ez9pWY&`nSzE zjtRr?oE89cxR^{P{}Kau7S|tvOOh`Z3vdoYhKNcn8aO+-e2uHKeHk0OoU< zuOCi9UJaB|7z5Tqy$-V(T-=~K9q4x9^%++R0LXKwRAkn>)5}|wa}b8`^5{dnA}XcO z+M$%VXt&|>O$1RSE{Zt60-SSXnTV~GLPn9C1%a&fk!O7juojepW>ZAgiuEj$Sb1Io z&{|`5o;Dk3G$4+}`aWg}V7s+|yq0A!9z(BJxD)%%l>mZ3E*T@m>UJSXBo0WN*k9t0k{hs}iHIo~Ay)`vt9~d6vulo^$*(mocZmaMGGZqZC;SfwdCx?#b7D14%rW Ue#f&!lmGw#07*qoM6N<$f~J_VNdN!< diff --git a/src/main/resources/assets/hbm/textures/items/canister_empty.png b/src/main/resources/assets/hbm/textures/items/canister_empty.png index 36c11231afd707e4a594f18815272d13529af96e..a41347e9525b4b57f7dd1178de906f44c24cd5d6 100644 GIT binary patch delta 355 zcmV-p0i6EH1C9fbG=D`&L_t(Ijg6DBs=_c7hQD4MI|YYAaVWSuIQasub@m-Px%DAB z_y~^fK7w=;x)eG&NT3$UAcc-~N=R=4dZwJ@e1FdQ(+2z)S(c4@{d_(-pU(ln>{l>N zQ-)yxpss70rWvcM3MK-J#lqb3csznE%f>WK0XQ5E0BklJl7A#I%*=+D%O&&qoY(8c z`~4ob+bvQ`ilQJ4L*h6lNfPe&yDI?Dbsb&TnOrGF+qUfYd$VW56M@}s$LVx32YH^; zwyhUZO8GlD9*+j{f!c%1}ydEXniy zn-&1~_i;QP|4R(evbf!DwW=!4=QFBGuh-*rIg9B+;(`V+_tYM1+37PnxDI77H^TkBQ@$caWDM)^$y%)1j_wto{97E|*4C$@84~ zeBOezhG>kzT8l9T5n(hMv0kqgpePFBI3~+7J_1yg5CS5Ch@h$zMFD{K9#w5zy^Wx% zhzQ0QqA0?9kAH}e=Q$ySX0RUt)>@qVHFdpS84L!LWl0>zt(YGHx7!VX5CS0t4u=Di z$)s^-twmKo1HAW*i!95CxWrYV=prRk|^b6n23mo2>9`14SnS)T$C!F$hUvlwYPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0mw;2K~y+TeN#(r z6G0Gt)zco^pn&8>>?{ZbB*P6@h8uXr6}d;`WuzRyAR*hri9Z>H?U9|hKUDS1!lgjo zXf)l`U9Vn!hH!+zU=aKLK1QPvilV@9I8^8Vf~mg>;yj)rEE1e3`G*Vi{#E(;LZ z+WI_{#D~K+A_715_k2RgbA#E;;qv0$e^XHhA^1pSFy{68&lJsOWxu-vVvP9m{_PVY zmBOCGuTY}gj?r!#+};8o+vn8n0%vE0tDh6rr=bXlp9i;vwT9IM&LSlHrx)iGLgc~% z--aVaqPq}1tZAjCICQ%P%eak;u;J7Qy&jO+I&=@@* zir|su3!FoW_D+ssGbzv! z6oE8NQV<2Fr<5+|d4^&yqb;=|l;x(nTtgA;cE2#&EU;RE{|E3OMNFrTix^o^K$b}t z^e{ddO&JuE<*AJlktniso>5LO&n>=wzBuv${sNw9$G5M^G(-RZ002ovPDHLkV1j#j B{;L20 diff --git a/src/main/resources/assets/hbm/textures/items/canister_fracksol.png b/src/main/resources/assets/hbm/textures/items/canister_fracksol.png deleted file mode 100644 index 8111eab89d6322eaeab9c900054bbf19436625d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmV=0VyFV9{>@A z@Bthmg3JLa0Y_k+4&lIiEAOr&0^2j)1jd&4%yOc$>7FW8b(dkMhQpx_1_Q?9F?C%t z8jTDWl>J+?u4{^-xCje?+kH$Xlm7w(G$amRJlFYr&TKYARq1xSOs7+3N1s})G!(2> zD?$iZYgsOr#287_6uo~}0m=`b_lO!hFvj4VLqzEHdgOV|x7Tk?nx$9C;u~+~QLI7ZLa>~_%17K~(S_|4dM8ksjeyif;@hMLZZ*b48I9jZ~ zi3sPbp+H1%&JjZ3(amcls&qOX9wZU73GH(E?;YfMPFa@Qo~mxc<(%8Q!hXg#LD_iS h07Srh`0}-Z`3)5Z!{ThFwfO)5002ovPDHLkV1mZ_)a(EN diff --git a/src/main/resources/assets/hbm/textures/items/canister_fuel.png b/src/main/resources/assets/hbm/textures/items/canister_fuel.png deleted file mode 100644 index 359fba8c8fe156d12d8cc377d122b5f1257d2ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu@#P)9RogsE8+#_t*?fR$3L zz#9n#EiSA`iIdo-h=XG9Lc}9YF(1!=o_F4foM|?jwbSX;VzE#Zh539QxuE#D#iA&z zR;x>15Y8ugp8uB_dJ)^3oAx2k-It{nFL94ggLCKVm9X7x>~=db4%p!ex3ssk7Xfh` z8;{2tWXSP>=nB^z=$`=C@ApRC?WfI;L@k#1GJrfu5JC_;o_d2k%i284T3w3aWAwVv zG>xjN)Mz@$x3UCjHy=ihhk(Q3Aj0)zV%&k2s8Dy~uYeGOBuT)p&Bm)V^|On9(y)Xc zV7*@B*un~5w_ESil(YE5HuL~#nhGHZc)(jMw_ESB>{z0w>H+GymL!P-UU!BGzL({n z=+yww>%wR>a`*V?$Jtto7mkk?hBtcVkDorusn(OB!5E(hp5Iu9dunKgEyn-=002ov JPDHLkV1mMS!p{Hz diff --git a/src/main/resources/assets/hbm/textures/items/canister_gasoline.png b/src/main/resources/assets/hbm/textures/items/canister_gasoline.png deleted file mode 100644 index 1b466069cf6b4f726d94f2d531091d716c4c180c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)zU53XL=F~?=n3_;AiKKpQ%L5?W$t*?;@a002ovPDHLkV1lF6#V7y( diff --git a/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png b/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png deleted file mode 100644 index e8654568e2cb767d50f8217da3f36eb4ab5f5afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)g~sSa1X1!Uy1*Z~`yj3=W%k z#dwl&dxV_Ga&@tA?4&)x5hbr-%7`{$Ifz!1%(`whP{9z|8pa`GYMMfB4a?{+UVw*lxF|Dk5^&4~IEp!vKCR zyP%{7B0`pBm>GGVQ`dKVyZSA|;TdI_GrlP7Bmf}Bh;t5A#XY=!|5b^Zu`uD|`FR3K zQV@~DiZL=6obmP3djkj|@Xi@kOtVM;W`?Q~W5mobGeQVENAEG~N_NM97$YJ=Q4|kB z#_jDrs)|O?Qvl~2-tR=M*K7LyJ|Wywmic3vrvRJH24MG_D%aOFmzQr3>YTuF8xnx` z{?N*sn>)(#HEr8c6a@gW)5K?L;Jrsx84O-wX7qYJR;v{vJMo(%K&Op$U9((1x|u5^e-P2=uqRC{UXAa(F&oK8ZsDGfoh zf{4)X_qknGY(&h*(Ulrwpj_)( zK~+`cc@BVF0*DCSdt!`SzkH5}(ChUm%MxR{|JBJWSZi4<78Litk1>5rl6LZ=&amx8 dX-it0_yAQgt5u4}Bmn>b002ovPDHLkV1mmW$Ibu% diff --git a/src/main/resources/assets/hbm/textures/items/canister_kerosene.png b/src/main/resources/assets/hbm/textures/items/canister_kerosene.png deleted file mode 100644 index 61649e01baff42bf2048322b212bf048513848ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)l z*ELmDy_E%^^>R@Z#k;~gfQkLVzw0^I&LRlMb|^DH;~Retsx$yBmw4|n%CM9rAp~-j zb0H!C-?`iYHSa)cthGdmoY)g?M>7=zZDm?AyZ<8S^|09@%9Frc7#W)VhOFedtNjWo z5o1K5=zZ#unT#lrQcAq{JUorV0AsM$0VaYtYE|68IC10L@00SFTC-ZQBt zoP9i7+aYK)f*c04vJ7JkZPmt!V_*i%t2ud|uMJ6TS5qNIthEFQbm@{(;>aFRmgRHn zD^`t2^A(KYYIemfw>r=x(Or_7Ryf-jm#r78nySkfUWQV O0000=LDJDA#;Y@Avc(u zfK9SU4nP(p>}-QED@1TtWifzom|>LObxHsC`@hR^b|#aFjmKkVvl(?=Go4NyFC2Ml zSl2a0QM{xDAUeM+7K{H919T7{?%vvFvthMb0gxmKMN#na>+ffybO_qEC4_*8u;1?q zA&_Mm_qS#M_um#5Mx73vb9nDjReHT1Wm$3e@ZDuuMxN)~-@dY|1^^)hy!Qu^#|J-r z`QglrsuJG69(7DQ5u9^~2+lcFmEmy6=XY-mV7*>*b7PccH$}(5%m^W%s;DYQAwV3* znAwTy$p~hKs^Xj@O;e&MLRDEVmxqEOgex702;O@Dw%aZJexIgk$n*Rx<`sk8ZU;OT z*|sh7`JB;cbfOahvnvL19G@tvsv^&Gnx-L5QveRNJa3??L{UTtfx%#anUN$3P1E2G z?0^0t==_3+P?jZiU7u!V;JsjGM3K8#oQu^wF3K^h$dL}>7(V^{)zSO~=yJX0%cLH# P00000NkvXXu0mjfGsVpV diff --git a/src/main/resources/assets/hbm/textures/items/canister_napalm.png b/src/main/resources/assets/hbm/textures/items/canister_napalm.png index 66d2fae42382278729964d7502ef18479e424f2f..1c65524d3bc5465f02080ead482ae5c93df764ab 100644 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|+7sVrI15OLitM%rr(6kAn!^m%1vWhK*O9334)Lqqxb`PFA@D=RCP zmzQg6YsbaK85kJ!^z56EBS8!~Yq4jm}8<2!KD;7>U43!LT~GIk(}NQsRmXgVaR z>ur1xQ&q=7-Z9;cds1*Xd(}RtO0lL^t0j#_18XhLIXaz=;(rq9T}9^{gTdf3F92r! z_HMWPUuFOWkY$-zYv~=GlIJLiQ`eImew>jhU&w*xE`4pwsE7G)?8Uy~*qQV`7Xv z`TPiLEpHyYhcP5c0d&o z*Xjr4c}|+9vxdk&+5p5DF~;D%=gPr#M1*p=jB^g9=Gp&j0ycJ_wWi6h+Ugst^cHOS)E)O;*_`1G91?%qIl=0>4myU<8Nk z)t!=sNCuI>beZl}0-01j7d?|nr=1Kws6{>Mp1Su{341l2PIWSwFrUu}AuyZGgh$H! zs~JLIxm-S`1;FiZ7K_Dyi93MPSDw1A>3Km_8J|Aa>+2OCKm2$wN(->vZiz7>BE%R; zDUs(HXXhxur^_y=H3JdBT8paE@AoN+nv1tzB+pOqKI80sq(=b&DJ6_Cq?8b8&cA>6 zRaBKotSHfU5e9_t{>~BY@3j13-+C7$a9#KN*dl z?c5my=n;T(ZugW$QQ`el>bfS&8V4!Ssm=_nwZs@14xgZ^IOnLU3X#UU+_W=vp0Owj zR;xezU94470&5Si?2Lr_k8+pwPLRO#;M?c#EzMuYRJr}9ukn2V00005JitoLLwv<1OZvG0Eyq>qxlQiMMxwPF&lyi*fVd@ zR|JL9c6J`?9^JVf8}4ekT1|W`ORG(w8UjZV5F@`M5h~pR$p{gpp_kb;>YUy-q^KLimvOTpTWNGjWNb(t&P^&%=2uD zqA&peZ*bEz0F-43KwZ~lS>|T`o&-Lh4^m3XvLudU@;oQYGJm#hb2E<)j^jWnMccNn z=ff8Ven3Y+t)eI#?1yFHX__v*#|*4Uk|Y2D z{3-yDBni_raU2Iih+sdsf|N2C@q2sO7y~r(QK!8ZK+Gu?GOI@QokD!k^BA5<#Itp$n%`j>BMHUQU3(+-ivdN z$K%2K{U*53Q$U+wMJ`=h_GBPan6ZzP5`Q^LaFf!*|VvOGbT5F6k06d>h=JPpS*HM<` zXw9#H*Xsp92zCMQJ;&pbx~>Pi{x)9$)>^dIOePcBwxy~noO2XK0YFNL&l&+@j2L4G zA+T61NGUO$PU*UCQ131K8vR0+Wi(C0^?DuNQc6R(j4?wthMRmU^+D-%`+*oE)>?ME b-Du_qo`AEIJ!o%^00000NkvXXu0mjf&z!M4 diff --git a/src/main/resources/assets/hbm/textures/items/canister_petroil.png b/src/main/resources/assets/hbm/textures/items/canister_petroil.png deleted file mode 100644 index bc5aa6314620a337fbb58613419b3699bc7a9a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym zrV9N&)%QOJ5T2g0i_L~kfSD0v%wknA%R->^o@jP*buNOLp{gLlm#RX%&!D=_%}ptf zE`W0`HxbzFcJz8Z2q9ZP3C31TkRdNtqt|L-xps?lhq!{Lz0WI_mm@px=_r|esoAq3jC zeXkb)_xfWxoqnhpppf|Y`#`&{V?Gb4!trs%-Cg4HhP_q_1?%;i7$ergY6U4J`hB=k z6yV$KE~v=B7=v>T5jZ)in9bnJFHFA=O#@dK8MGGwd1_VV({BEL{f$wDwuPUrgcKHx zF<5Ic#vr1cpTnQewE{do2AT%$?+;|4s>B!(QA9vBHv)L?P>s*3-n5{qhzQ0&U4O!R zgGiPhVWi5i*s4jVzHpt>k&c@@Wti}u4@29*r@^_A~@%W5zfwXCPzmVA%th?t5^bxSFqMHo6UK6c)3$eIG3k8 sx4SqytGQj2t=H|diGcU;<6qhH9|pFrwJ5+fVE_OC07*qoM6N<$g0}CGmKpCORwO?GvL zb$U)7)b6SrjAmyhaY@~}sQ=^ttIP1J7K??>=W|x86(Izc%cbFsvVUua5U8r^EiC}< z^<%Ty{Fk@~`0{Z`)6{6zpsGB4{-E3KmLD(r&nPXx`FtkEh_#l}=|oD2>2!)}sQ^Fs z^gu0uF$U)xBEoPu2Qr9&A-g{KFXW4cEB7!l7JkRmo zBO+8)MU0V@Al(C4YjN&k>TozP8jT1cP!z?VnD+q3;}L)uBQZwS>ov34?B>qe&IY>x z@BPh1S(X$)z6AcVl>4&c-Qw0^-_%Wk)0zu(__ vs^DDq8*Z?j5WUm99?Es>YEb|W)E&()+bh3qQw-)%00000NkvXXu0mjft;Nw8 diff --git a/src/main/resources/assets/hbm/textures/items/canister_superfuel.png b/src/main/resources/assets/hbm/textures/items/canister_superfuel.png deleted file mode 100644 index f38d02ff7ad175f262f827122d3bb7a81e901c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)c4|F9 zdbx@SmJVAh5U7x~JCouf*=Okxo^EHDkN=;U6<)<~IJCiFz<4|+#>i+i5{`sBl#DS_ z*Y&Yp0Q~F6WHNbI^B&;K@*9gk3qHh04C7OAZ4dc@-`sXuX<688Hl&nrI5L@>GkyA8 zabs89*inFp;JrstPK#5fOu6HS^yw1_9D?i(G3QJ{LCzWXzx<1zVi+|wfzK^SYX%~M za}E(fO}XHLuhn-0n8!JRz>FE405c<{gqor#hB1$G07_qC$#$v^S}-$I6+x&zR+Lhr zC^a=HrDm|?Zh&(R?;BC8)rwxPM-c<)Ih&N;`-I4MquG47;4^V|Zow&0v&`Z(o@r(Mpn w;c1S`%A6QYXd5-$V+W-In07*qoM6N<$g3mm}lmGw# diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel.png index 8eb04cde2572e496c7d2ca7f8bb6321ac2b1d15f..fdc4318612fa761aed083d119c28fc133ed9d215 100644 GIT binary patch delta 289 zcmaFMxRGgsWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Z2;1l8+ z85!x|;80v#tgWrx)6=tH!2%y2pIy6lUA}x7sAS^Z)9Zm0S4ogx@P8O!*mOqcJW!Og zz$3Dlfr0NZ2s0kfUy%Y7%<-&uaSYK2F6|5CJD|Yf+^x{}JHBG=i+|USwCr=x_GWHzV=8wj0;t^|@Kk?rY z3p0N)&18;P_f73ezf*JKIKN1Te7rBxzDnF?D@$bZtp}5V7W1V>c&7RKGH6KwIUGO? S0+)h8QVgE1elF{r5}E)&t7ymo delta 220 zcmV<203-jg0__2i8Gi-<001BJ|6u?C00eVFNmK|32nc)#WQYI&0HjGoK~y-6-IL7? z!ypVsU#cGQ0AYO;saUmIV~<+ Wi&!*$Scgsk00000fhdc0;L0xGk*bGNklFx z>%m%Uj4@biIh{_P8+Ty`YORq{4uwMq0nj>=ad%T|4SnTR+Thiu3s##P1onn$PF$klqDd Z{QyTrvYXZF2jl<%002ovPDHLkV1mY1t}*}s delta 246 zcmV69lw2Y9In)pax=~1`tpMRTDQA z0RQY~&1;&q+urUc4+0lB2=FIvXBQy^-`hFox3P_LOC%yNGng5wigjJz65Wo;L<9g; zvZ|ICGpk4*#|q300MPe+mAv_nXb6U305c=!T=~1MgQ_+}4R67Q7$eNARIzX4BY}ui z=dvt?^b)TLxQO^X&kn!=cuL8~adZHF9Pj;_@<)Uae43{6vWQf6jIpWUR0AR^il>xL wg=|`I_a^8HRRymNbD&lHt5x3P+t2hjp4+v4w6(q{P5=M^07*qoM6N<$f=3%|vj6}9 diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png index 35cfb942d2daf603ff296520e107bf758703fae8..518122010d2046d12f05a8818cded6184e8ccec2 100644 GIT binary patch delta 164 zcmV;V09*f@0nh=EG=GOlL_t(IjqQ=K4Z|=D1Yd!d)jTS=iwgD{K1QekRb5qdz4cAU2o1gytjGa?x!Wp?9A-@zK6EW233s`RRsWuNX&chOX;>K zkMLD+IbjZ*VP>xjJ|zl>C|zwKB519l)|w72J)4+0K5^V`W*rz~fQT0V4{!(4_(jYF Sy0`!U0000IYdY*^ty4|tZAPWGkwRA?uaR8|68l{vKvSmx~-E52jpns~W^&=Q#$nzYfRBuev z)Yiui0PuaEIF9>$5Cls>3xI=@Q|@kW2*a?C-x+uJ_9=>DeS*vB6~{-1{RsCDj{uxS z(Pkq6BuN55Gk^bF+t#YHzQRvxV?fn3zXvpJ%g%84PYGVXZvIadUC%^BJQ5CacHn`yGf5A{Q3nylgUp@Jp^BqEfC zEB%&b=?$}4u0(gQ9lh~4g1c8UBZPn?BvDF15;^B4WPMxxV7oh}lmLh^c0I!l{(y%s inAy35&l(I*c|JQ#Vt95KbT@5`@G7 z3Gt4xVR4;h3hAAbKQuc)q0&1=1Rb~JH#25hpV+^#`Je&Q( rV@T>o?_IAtn7oi<2O{G7-e(2c+%)o31`!?r0000#WBR9H#tFqbqlL|zue#Y_xJYx|8d3O;p8b(rl@3a#xY9(frzLm zr&N>hpa1{o8|e!$e~>Ep|F5>~`T6<5S;sXLSQuVZinK;GU%Jcy1fH&bF6*2UngF?q BC$|6q diff --git a/src/main/resources/assets/hbm/textures/items/gas_bottle.png b/src/main/resources/assets/hbm/textures/items/gas_bottle.png index 7776838e646c5ab687528385b20f27752373834e..4e2b038df7f7fd1520d84ef1d98c473d347060fb 100644 GIT binary patch delta 167 zcmV;Y09gOY0n-7HG=GXoL_t(Ijop&54a6V}MSpGB@jT0_qH)PH&85W?rIs;;RE zxSMAHB7!l-;cm{kX0V^ZvH^gT!7|`(o&$);?*_~aRsA}T%OI}|07PW_)zw-ryKfnZ VI3tih*Hi!i002ovPDHLkV1k#4g(}=(D)t@ za*1@QqD*Pov(n1IZ&Pd4oU>l-99PFFCBzu05AWB0{j7xG=H;6L_t(IjkS`o4Z|Q1MSn7c2SBXiI>n8UH8O{b?7#+g#R{Y{ z&80a-vLZIPbde+5C!@%}Lh$eN^Z_t5-LLw%UDWcNt;5%Ig2)?0q(o!}t;#v4P1Dp5 z0zlVwI*z0EeQ(}=+8S=#7R-#45&$5^h!DcUzuAHJ{<{{DO-WL-#63DDfSHkV{@E*~ z)Dg@(s3rigAgB)5tK$Ng`G10x5=6x8WA!To01@f@>4srg^?m?n=t;Go8GE$=0000< KMNUMnLSTYD$YfUl delta 218 zcmV<0044wY0fqvQG=IHGL_t(IjbmV-C8$gC`Cpgh^BjmlU*9lnOLh3q zz`(%ZHTwV~Nd|lnHDp-x=`O>(dGjzd!T=L4iPqNE|N8p+3@R!r3`t2zIK9D)O|Y%4 z?Z1J60fT~q0s{vJ2gC2*zZn!16dKN-Ki^1{7hb%0!NAYY&r|U0*Dr==&z>>7c=3Ya z-Me>KU4Yd92?+@X1qB5Ld3kvTHa0efj~_oWeEs?rs{uH}fLJhU02K_NI2}+70EtLL U5)$@|zW@LL07*qoM6N<$f>hUDg8%>k diff --git a/src/main/resources/assets/hbm/textures/items/gas_label.png b/src/main/resources/assets/hbm/textures/items/gas_label.png index eee087c9ea3b9175ded8388710f356a01fe77f4f..5c0dde5432c6f7079812eff98a2b06bf493c7a8e 100644 GIT binary patch delta 96 zcmV-m0H6PMjscJ~T181jK~y-6?ar|cz%UF0!55GrwEuJ}Z8cKIERe!>8(&F)AmREG zN&3p4l~QJ6X8WsiP5}ZG5&I9SiZKS=jk_OQxR$(ct{q25)d@ua00009=KfSD cJa~bDLGG%o=bCkR6XL7HboV+go&jcx-7&U4H7-LA1gz0n|5qN`h zj>F*)QAGi1nzGq!8b)vK_xk{>*XzpxN-2s}4}jN~Z@S%XAStUc08bBJ*9qp!HXmh~yF_V#M26$Zm#yqP7&3V_;y18~yta{{GO`g>O|58Oy$g`Tq z=U>_5djcOa8NFW*NYfN(PQf|H{p}}02!y!%e+q-a0D%2|A9NuET5FthIOigQXqk$l zI9h9&&1PYIrxd&04j@{l_z(Wp^~i-fHTwDiQ46v*Ee~64od5s;07*qoM6N<$f;~gC A=l}o! delta 260 zcmdnMyntzfNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8YLi4xa{lHmNblJdl&REC1Y%)Ao4ywnl}6Fmbx%N*l6KcJe4o-U3d7XC~7FLEAG z;9;G+p1H(gzw80km;{3tPh}3!D+~;tu6{1- HoD!M<*6dqa diff --git a/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png b/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png index 9c53f6f1ed7da78ee586a09cd5283e7b9cfe5120..2513580a39729b46a8cd9949f16ede771c23f429 100644 GIT binary patch delta 394 zcmV;50d@Yb1GEE>G=FPJL_t(IjeU|mZo)tiMjug*UQMML<$pC?ID%b!lC zRyFrn6#@i7P!mfj0dgrNm&-*NwaVf`D5a#=>uCmQnieL6VSlJhG=lwp55QuvAWhR6 zMHq$vwA=0G5p3JWFbt;CX%!uS!C(MD`F%8lBuOv~gVAWD6$v2#$g+(4{jO1I2CnOJ zJRWPpLfq|k0f^(c+2DLWv)xSq*enm2rm0A_y9w`~;Cm~L;Guk(uZMhne6v{|n6HPL z*!NcW-io*QwSRepqPRF`<4Dm|yZ%W~j_q#3Y#cEgN42iyP>bX^PHx+_>N*=osz?Z- zOsvi`K=UHGt_$cw`27Lr=>^j?>2$pRf1%&+1JpKA2tk%*T(8&W5sERSlmtPb9_eGX#fBK delta 388 zcmV-~0ek+m1Fr*+G=FAEL_t(Ijir;lY63wNg+C?W42t>$+XO{~1v_gAq}aw%v9h+4 zQ~_VXCWW;{5MMx>Edn+QHc=aGQ%OLOm1V|hHiag{_>%-rdFRf7^UWE!QlWDP^?E%} zN};tzYfZP?J-K`Hb5N~T10e+IbQ&Q9Qc9$hY`5FM7(=hu3xAz8D3{AYCX*o&i2!_E z1}K$ED5WsQ1g`6bP8tBr=W~P*0Sk1YSGV~8&gycU`O?0&@Z-0k)7w+#M?&ns&wu6|>{tcp(631~^uh)2<$7Zu(I2@w2K8kSE@6Re*mUZxq i%jJ?&RlfQ&U9AtLV7X%xo<7z90000v#mt{ From 97556e4c5a743449098cb4344ea1c50f20d9958a Mon Sep 17 00:00:00 2001 From: wiesenmann <175506894+wiesenmann@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:50:53 +0200 Subject: [PATCH 114/323] add paintable pneumatic tube --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../network/PneumoTubePaintableBlock.java | 234 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 3 +- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../blocks/pneumatic_tube_paintable.png | Bin 0 -> 673 bytes .../pneumatic_tube_paintable_overlay.png | Bin 0 -> 810 bytes .../pneumatic_tube_paintable_overlay_in.png | Bin 0 -> 843 bytes .../pneumatic_tube_paintable_overlay_out.png | Bin 0 -> 844 bytes 10 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f6dcd2065..aa2189d46 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -828,6 +828,7 @@ public class ModBlocks { public static Block drone_crate_requester; public static Block pneumatic_tube; + public static Block pneumatic_tube_paintable; public static Block fan; @@ -1964,6 +1965,7 @@ public class ModBlocks { drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester"); pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube"); + pneumatic_tube_paintable = new PneumoTubePaintableBlock().setBlockName("pneumatic_tube_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -3231,6 +3233,7 @@ public class ModBlocks { register(drone_crate_provider); register(drone_crate_requester); register(pneumatic_tube); + register(pneumatic_tube_paintable); register(fan); register(piston_inserter); diff --git a/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java b/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java new file mode 100644 index 000000000..cb2d368aa --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java @@ -0,0 +1,234 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityPneumoTube; +import com.hbm.util.Compat; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; + +public class PneumoTubePaintableBlock extends BlockContainer implements IToolable, IBlockMultiPass { + + @SideOnly(Side.CLIENT) public IIcon overlay; + @SideOnly(Side.CLIENT) public IIcon overlayIn; + @SideOnly(Side.CLIENT) public IIcon overlayOut; + + public PneumoTubePaintableBlock() {super(Material.iron);} + + @Override + public TileEntity createNewTileEntity(World world, int meta) {return new TileEntityPneumoTubePaintable();} + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay"); + this.overlayIn = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay_in"); + this.overlayOut = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay_out"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (RenderBlockMultipass.currentPass == 0) { + if (tube.block != null) { + return tube.block.getIcon(side, tube.meta); + } else { + return this.blockIcon; + } + } else if (tube.ejectionDir.ordinal() == side) { + return this.overlayIn; + } else if (tube.insertionDir.ordinal() == side) { + return this.overlayOut; + } else { + return this.overlay; + } + } + return this.blockIcon; + } + + @Override + public int getPasses() {return 2;}; + + @Override + public int getRenderType() {return IBlockMultiPass.getRenderType();} + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if (tool == ToolType.HAND_DRILL) { + + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (tube.block != null) { + tube.block = null; + world.markBlockForUpdate(x, y, z); + tube.markDirty(); + } + } + } else if (tool == ToolType.SCREWDRIVER) { + + if (world.isRemote) return true; + TileEntityPneumoTube tube = (TileEntityPneumoTube) world.getTileEntity(x, y, z); + + ForgeDirection rot = player.isSneaking() ? tube.ejectionDir : tube.insertionDir; + ForgeDirection oth = player.isSneaking() ? tube.insertionDir : tube.ejectionDir; + + for (int i = 0; i < 7; i++) { + rot = ForgeDirection.getOrientation((rot.ordinal() + 1) % 7); + if (rot == ForgeDirection.UNKNOWN) break; //unknown is always valid, simply disables this part + if (rot == oth) continue; //skip if both positions collide + TileEntity tile = Compat.getTileStandard(world, x + rot.offsetX, y + rot.offsetY, z + rot.offsetZ); + if (tile instanceof TileEntityPneumoTube) continue; + if (tile instanceof IInventory) break; //valid if connected to an IInventory + } + + if(player.isSneaking()) tube.ejectionDir = rot; else tube.insertionDir = rot; + + tube.markDirty(); + if(world instanceof WorldServer) ((WorldServer) world).getPlayerManager().markBlockForUpdate(x, y, z); + + return true; + } + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + if (stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (tube.block == null) { + tube.block = block; + tube.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + tube.markDirty(); + return true; + } + } + } + } else if (ToolType.getType(stack) == ToolType.SCREWDRIVER || ToolType.getType(stack) == ToolType.HAND_DRILL) return false; + if (!player.isSneaking()) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTube) { + TileEntityPneumoTube tube = (TileEntityPneumoTube) tile; + if (tube.isCompressor()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + } + } + return false; + } + + public static class TileEntityPneumoTubePaintable extends TileEntityPneumoTube implements ICopiable { + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + @Override + public void updateEntity() { + super.updateEntity(); + + if (worldObj.isRemote && (lastMeta != meta || lastBlock != block )) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + super.onDataPacket(net, pkt); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + nbt.setByte("insertionDir", (byte) insertionDir.ordinal()); + nbt.setByte("ejectionDir", (byte) ejectionDir.ordinal()); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 67b872581..70f14d039 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -610,7 +610,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fluid_pump, 1), new Object[] { " S ", "PGP", "IMI", 'S', STEEL.shell(), 'P', STEEL.pipe(), 'G', GRAPHITE.ingot(), 'I', STEEL.ingot(), 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 8), new Object[] { "CRC", 'C', CU.plateCast(), 'R', ANY_RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 24), new Object[] { "CRC", 'C', CU.plateWelded(), 'R', ANY_RUBBER.ingot() }); - + addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube_paintable, 4), new Object[] { "SAS", "A A", "SAS", 'S', STEEL.plate(), 'A', ModBlocks.pneumatic_tube}); + addRecipeAuto(new ItemStack(ModItems.template_folder, 1), new Object[] { "LPL", "BPB", "LPL", 'P', Items.paper, 'L', "dye", 'B', "dye" }); addRecipeAuto(new ItemStack(ModItems.pellet_antimatter, 1), new Object[] { "###", "###", "###", '#', ModItems.cell_antimatter }); addRecipeAuto(new ItemStack(ModItems.fluid_tank_empty, 8), new Object[] { "121", "1G1", "121", '1', AL.plate(), '2', IRON.plate(), 'G', KEY_ANYPANE }); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ca3281bd1..c26b87500 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -37,6 +37,7 @@ import com.hbm.blocks.network.FluidDuctGauge.TileEntityPipeGauge; import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; import com.hbm.blocks.network.FluidDuctPaintableBlockExhaust.TileEntityPipeExhaustPaintable; import com.hbm.blocks.network.FluidPump.TileEntityFluidPump; +import com.hbm.blocks.network.PneumoTubePaintableBlock.TileEntityPneumoTubePaintable; import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.deco.*; @@ -428,8 +429,9 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); + put(TileEntityPneumoTubePaintable.class, "tileentity_pneumatic_tube_paintable"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a031be603..b28db0408 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4656,6 +4656,7 @@ tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur tile.pneumatic_tube.name=Rohrpost tile.pneumatic_tube.desc=Sendted Items mit Druckluft.$Rechtsklick mit Schraubenzieher aktiviert den Eingang.$Shift-Rechtskick mit Schrabuenzieher aktiviert den Ausgang.$Eingänge können konfiguriert und mit Druckluft verbunden werden.$Sendet bis zu einem Stack, vier Mal pro Sekunde. +tile.pneumatic_tube_paintable=Geschirmte Rohrpost (Färbbar) tile.pole_satellite_receiver.name=Satellitenschüssel tile.pole_top.name=Antennenspitze tile.press_preheater.name=Presse-Vorheizer diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 74c5a343b..08a834b03 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5802,6 +5802,7 @@ tile.plasma_heater.name=Plasma Heater tile.plushie.name=%s Plushie tile.pneumatic_tube.name=Pneumatic Tube tile.pneumatic_tube.desc=Sends items using compressed air.$Right-click with screwdriver to toggle an input.$Shift right-click with screwdriver to toggle an output.$Inputs can be configured, and connected to compressed air.$Sends up to one stack, four times per second. +tile.pneumatic_tube_paintable.name=Paintable Pneumatic Tube tile.pole_satellite_receiver.name=Satellite Dish tile.pole_top.name=Antenna Top tile.press_preheater.name=Burner Press Preheater diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7f15d129c5447b961527fce16d0760bfff1f86 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#X;^dWMl%nE(*xb zY-a(BX93wDkO0IW{V*EMQU+$Aci0(NfGP}(j13qUKuiVcU|j$)X$p`H0!%=2n7}H7 zEG>X6s4hbT1CZ?M21ViEc@`Q#+X6gY978PpdxH+<9yZ{aqPo!4<(Bf6ew_=lxAG=2 zHl4fZ?)FlN_18IupVz0Quxywk=c}sm$;11DV^H~(xeL;E-0LaP_l-scSJ{6EW8&^EqQxgC~Eo)FR$s+T8=S7hu3Y}&wN2s^}?35Eb>u- zN7uZ)EEMG*dChsoHu1|2?Ckva7e%*AeV)K=5#I9jWVnKj{VBQk~F7KFc$)SI8_tksFwC&h5 zF10Y~O#r@OfX~f^UL)Z#LQ2Gcdnj zls|3j2|JVZhi|4v8gF}8!yF~gwQKS3ptWZlta#U}fAZaYp@_Hl^U`~D-z@hvFDWrC zWZhkTVd}&;ty=H%R=jz8-ng#*$UesVJw=!D4ypD6V}&QcC&YEZf&~T!20$JVh%IG( z1*BL?g8YL2|Nqb6ptbS~kk47*5n0T@pr-`FjH@2qodgt=C~=J_3C>R|DNig)We7;j z%q!9Ja}7~2)iczykj{Ly0;on3q{cZvH#aq}gu%HeHL)Z$MWH;iBtya7(>EZzkxv|` zXjN*2XPT#{76S*6!^$AV$jZP7WO)IxG?WcWOd5>LU~wiO+mMk7oVcQZ?96r+uy_`b z4FdNkvoO2>ra2gm<}wDL)C6`07NAN4BV&WMNlXkvK=u?MW?TTV0qAisz;G}_`QAN| zOP2+Lyr$;q;uxY4oSfjsd__2cftf?t$%u(@6@##_B4df}i#8?3Q>-&)GG@gytxU?a QF$Njv>FVdQ&MBb@0C+MOv;Y7A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png new file mode 100644 index 0000000000000000000000000000000000000000..03dc6b483ca4f5d2278607420784d1927e2a58e3 GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47@ISlodZ0bofQI#^3yVNQh^fZ zr%tr=V0M&fwO=eG*xah=qPwjlY+0b-#z`7o3luzA)*rgt+u8U=?TuTG4r}zmLyJFZ z<*eDdb%Q9&LFOZI8-lh7M*hFa!Rf@p-uAP?_`Tt0HYRq<%SEr-4s7c7tI=6@_RP7= zgXv8z87ULW?v`**?!2fHdi=PqY1ZD(RXYF7omQ$|Z;|q?IH6k~F7KFc$)SI8_tksFwC&h5 zF10Y~O#r@OfX~f^UL)Z#LQ2Gcdnj zls|3j2|JVZhi|4v8gF}8!yF~gwQKS3ptWZlta#U}fAZaYp@_Hl^U`~D-z@hvFDWrC zWZhkTVd}&;ty=H%R=jz8-ng#*$UesVJw=!D4ypD6V}(D!C&bm~Kf{6r3k(blfC4~p z=g50YAjMh|Qa0#5JNMI6tkVJh3R1 zAs{g`uSCz!HAKNw&rr`oI`h>Epc+Y#8t44n+|;}h2Ir#G#FEq$h4Rdj3-iXD}xjxD+42tU%NT%C6WAG8fGQ1)j1Af*F);`M*;9a+aRI~zpvS=g!@&&Y zd-p^xT^0!PnzN^iV~9p@XW6-gouSg0^Uy+Lx&-I&dv+5KhvVSQ8WTAkAG^ y!Gp_fW3|T_wKcUa(SfHfwhR2-_~x;f(k6!e@ywoQX4k2KZ1Z&Wb6Mw<&;$UsWi5&T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png new file mode 100644 index 0000000000000000000000000000000000000000..8e990e7760159d183250eb68c241438f585f7fa1 GIT binary patch literal 844 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47@ISlodZ0bofQI#^3yVNQh^fZ zr%tr=V0M&fwO=eG*xah=qPwjlY+0b-#z`7o3luzA)*rgt+u8U=?TuTG4r}zmLyJFZ z<*eDdb%Q9&LFOZI8-lh7M*hFa!Rf@p-uAP?_`Tt0HYRq<%SEr-4s7c7tI=6@_RP7= zgXv8z87ULW?v`**?!2fHdi=PqY1ZD(RXYF7omQ$|Z;|q?IH6k~F7KFc$)SI8_tksFwC&h5 zF10Y~O#r@OfX~f^UL)Z#LQ2Gcdnj zls|3j2|JVZhi|4v8gF}8!yF~gwQKS3ptWZlta#U}fAZaYp@_Hl^U`~D-z@hvFDWrC zWZhkTVd}&;ty=H%R=jz8-ng#*$UesVJw=!D4ypD6V}(D!C&cwX1H*y^3k(blfC4~J zAZSw!q*zOW{DS`j0mJWYe88w<;4JWnEM{QPQvzYeRgdmY0t!l$xJHx&=ckpFCl;kL z1SDqWmFW4ohA5co8R}U`XTDkiR3iyee zCk|A!DmB70&C^qhfdj~4WsqWIWncudynt95$_6DU4Mt|LI1`X<$jAgvU{OGJW;+X5 zJPXJMf%}tL7+wI=9gIeE83Ryi0y_f>P^E#9u|eA;CI%rOdkPRUE`Zno^f(w`IGCY) z@1Dq|%K|}ObMbU>4ABTK?PKI(P~bSS>CgY!(X*VwoIl8DnCbp;X`Z_$QR&UR9Ri1y znkMma%#WCE$Ce~p)wPT1`NhcsUpM~#x`g8@=l*zRPeY*-AdfS6y85}Sb4q9e0J*I$ AWB>pF literal 0 HcmV?d00001 From af6f3d76feb5d0bb8089dd68c0fcdcd3ef3d6735 Mon Sep 17 00:00:00 2001 From: wiesenmann <175506894+wiesenmann@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:08:48 +0200 Subject: [PATCH 115/323] german localization fix --- src/main/resources/assets/hbm/lang/de_DE.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index b28db0408..913b513bf 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4656,7 +4656,7 @@ tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur tile.pneumatic_tube.name=Rohrpost tile.pneumatic_tube.desc=Sendted Items mit Druckluft.$Rechtsklick mit Schraubenzieher aktiviert den Eingang.$Shift-Rechtskick mit Schrabuenzieher aktiviert den Ausgang.$Eingänge können konfiguriert und mit Druckluft verbunden werden.$Sendet bis zu einem Stack, vier Mal pro Sekunde. -tile.pneumatic_tube_paintable=Geschirmte Rohrpost (Färbbar) +tile.pneumatic_tube_paintable.name=Geschirmte Rohrpost (Färbbar) tile.pole_satellite_receiver.name=Satellitenschüssel tile.pole_top.name=Antennenspitze tile.press_preheater.name=Presse-Vorheizer @@ -5029,4 +5029,4 @@ weapon.ability.fire=Flammend weapon.ability.radiation=Radioaktive Schneide weapon.ability.phosphorus=Phosphorspitze weapon.ability.stun=Betäubend -weapon.ability.vampire=Vampir \ No newline at end of file +weapon.ability.vampire=Vampir From 6bbb354a9fb6c2fdf981ab6ef0ebfc3516c49fb2 Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Wed, 16 Jul 2025 19:46:37 +0800 Subject: [PATCH 116/323] Rape that wall --- src/main/resources/assets/hbm/lang/zh_CN.lang | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 2fa299904..92a56b5b8 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -819,7 +819,6 @@ damage.inset=成套装备时的获得的伤害减免: damage.item=装备时获得的伤害减免: damage.category.EXPL=爆炸 damage.category.FIRE=火焰 -damage.category.PROJ=投射物 damage.exact.drown=溺水 damage.exact.fall=摔落 damage.exact.LASER=激光 @@ -5176,7 +5175,7 @@ tile.machine_arc_welder.name=电弧焊机 tile.machine_armor_table.name=装甲改装台 tile.machine_ashpit.name=储灰槽 tile.machine_ashpit.desc=收集来自燃烧室和加热炉的灰烬 -tile.machine_assembler.name=装配机 +tile.machine_assembler.name=装配机(遗留) tile.machine_assemfac.name=装配厂 tile.machine_autocrafter.name=自动工作台 tile.machine_autosaw.name=自动嗡嗡锯 @@ -6097,3 +6096,12 @@ tile.fluid_duct_paintable_block_exhaust.name=可涂漆排气管 tile.machine_chemical_factory.name=大型化工厂 tile.machine_chemical_factory.desc=可处理四个配方的化工厂。$配方处理速度更快。$但也需要消耗更多电量。$需要水来运行。$会产生低压蒸汽。 tool.ability.hammer_flat=平整表面 +container.machineAssemblyMachine=装配机 +damage.category.PHYS=物理 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (黑雷霆) +item.blueprints.name=蓝图 +item.chunk_ore.moonstone.name=月长石 +tile.logic_block.name=地牢逻辑砖块 +tile.trapdoor_steel.name=钢活板门 +tile.machine_assembly_machine.name=装配机 +tile.wand_logic.name=结构魔杖方块(逻辑) From 9cf7cc6643222a108f14c2a372f244c2e4d0cb5b Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 16 Jul 2025 21:59:48 +0200 Subject: [PATCH 117/323] bluh --- .../com/hbm/items/weapon/sedna/factory/XFactory762mm.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java index 9ed290110..85e0d1b47 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java @@ -157,7 +157,6 @@ public class XFactory762mm { @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_CARBINE_ANIMS = (stack, type) -> { int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory); - boolean empty = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory) <= ammo; switch(type) { case EQUIP: return new BusAnimation() .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); @@ -170,7 +169,7 @@ public class XFactory762mm { case RELOAD: return new BusAnimation() .addBus("MAG", new BusAnimationSequence().addPos(0, -4, 0, 250, IType.SIN_UP).addPos(0, -4, 0, 750).addPos(0, 0, 0, 500, IType.SIN_DOWN)) .addBus("LIFT", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1000)) - .addBus("BULLET", new BusAnimationSequence().addPos(empty ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); + .addBus("BULLET", new BusAnimationSequence().addPos(ammo == 0 ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); case RELOAD_END: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 0).addPos(-25, 0, 0, 750).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -1, 100, IType.SIN_DOWN).addPos(0, 0, -1, 50).addPos(0, 0, 0, 100, IType.SIN_UP)) @@ -182,7 +181,7 @@ public class XFactory762mm { case INSPECT: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1500).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(0, 0, -0.75, 150, IType.SIN_DOWN).addPos(0, 0, -0.75, 1000).addPos(0, 0, 0, 100, IType.SIN_UP)) - .addBus(empty ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); + .addBus(ammo == 0 ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); } return null; From faa87edd40f106ab58e996e3ed9f2751bcd1bdc7 Mon Sep 17 00:00:00 2001 From: Wolf Date: Thu, 17 Jul 2025 11:20:15 -0400 Subject: [PATCH 118/323] Modified Radiolysis machine GUI to show rtg pellet location, tried to match with rtg style. I can also update to new gui style used in recent commits, but decided this was a start. --- .../hbm/textures/gui/gui_radiolysis.png | Bin 2722 -> 2925 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png b/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png index 16740bcd3b411f5662dbbab0d5a815a7fd0445e2..ebf7ab0e8fc27ac32c7b169737cd57c89f2acdca 100644 GIT binary patch literal 2925 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 F{sVt`5s3f* literal 2722 zcmcImX;c$d7JeZC0JcS0+l#>*lRGk&V#v!4HVjr}Rv8-ZOx`JFzbX>Sw*zJKQo{>98uoWIFCJD+%osU&!0Nfqats5@EluTf`QvsBW^=1pMpZbJ2NXWa z3IR{eNB1}bZqU(*Fl9K9eZRVT<*I_TwDfeOiH#kO$#z8JKK`8oEQfWJabz=7QwNjD z!9kZZMd(WdH=Sc;0L_;jPkqV|97yYYKcqYLB{o3Y+61Bq2N?$KlzUYnDwZ<5Vc-?7 zEd*w&=pz08a9tRL(wiqrlLkG8IFM?1<=5fFl#;Z;EsUOe@NMI=Z?df2>t~``j+#jO z5@(lTKKLKnGY@O-?eH4U(obR^xoU?iN;MITaRiT^Vx0DE+UaOmc|AadFEP+<3A-s3iNl8y1jA-u4&49IKRq@kW+ZPu zEO5Jx|BH!~*z;2mQqcB`86it-PN%*ymc2uw5%-tbI`Z+oS56Lb zs+}=n6N`~1C>668vd($~HyhOYlkvd1qf)QeZH;{~#sOhDj&jl7?VQAHJR|Fu_?$2B zmMJI5(opmU-FeXebT8kW678a&(AvZ7P-m$d8bU-&Wr}=2dCtcnRoxi2WhEJqQFQ0i zfjo_KNy2dnXGw6~L>SaEi}X{v*#X_A>i|_6^tLq3I?n>?jS!KzyeEI7B728yvNQHf zp2v-6GL75VbNt#`x(Eedip67e8_g-^@^nJML+Y0CgWFV^cA8MGsP5Nnw5bc(z$j97 z>ON5c;=6QHj`#^ubp`E0h2$zo47a7(#@9t$i5Onqw#3~kH=`lnm z3=J@~zl(01<}Vg&)RKiPF*p(5Dm25GKrf5W(iB3uhJp{F3ty0~6pZaPRnDOrDaZIe zc!)RV*tI{+7zW*Cxz@KcvEA+#lA7H6`R&n5Q4$A(1@@@E~J9WP7S z3u?002TD>YE8E-GZYISek6gA02YJ6DA(MtRW5?~R)|Rx+HLC6iT1tutXyIb*;ecRf^C9P0kB71!w~&C zd=?-(+>Hg=616RE-ZVw8VJ$ys_s%;eCm-sar|NP`iwAUONfs^jt7F02m zb%?XLVDi;s6ErDfG8XdUlST()cE@poN;oP9bche1a2CJUvmkXJ`Sx`8bSnrkeY7BV zdED>}cpCT#bB-3g-;9;YA7ntD*hk;FKFMr*P2UaNBNVtoa~T&Wk?t(9W9ga9$~G@Y z7xn6zweih;R33v6sQL`&3d-I08Rp+V%nz!PV5^szQ@o#S4d?KyLtc&6c_^wAiqAsk zx>EJ*H}tMnioNyV5WFRyhl_-fUUm)ZGv&UmMw&^Cx)$etW{UnzpO?sXN3*b~TbxlN zz5}_z30(z`)Sd?s_Eie)UhBY5scAk*<=Ab-AIAMEus9pqNTw7ZkR^%T71Fe7FU9S< zuFR*E{7|!XqINTIIytnkE;)P81!0+m7g^?y);M6F2^jG+6^vyJno`;VLU~7(z}VOX zadWb7LZYj6CZ+Dt8)#}p{+@ID4dX2c>!{spC`N5b2QPF_{ifWv*@c+84&p_dn{$PX zH=vfyIU@hW=i?cBm5}Z~wKE>VBD2SVo4YXH8ivK8F{l8w8*k6nd zY8jE4jwxJ>jIBv`nSq~;Dyjan3a4owQD!U1`S(lytKWZg;IGDifksxtVH)*nPNw<) zj%#ujLKoNiT(7u;sk?ACdTstg;e&Mb|1Hv&wSS~9m%E6OJEQV@H$T6RuAUN}qf)pP zoG}p=6My~s>Z_z5eDHw5=kwi|aEXUd-8A0Gm6o0+%5*@yU?BYe$mtLJQf1C Date: Thu, 17 Jul 2025 21:22:38 +0300 Subject: [PATCH 119/323] Fix RBMK console rotation --- .../machine/rbmk/TileEntityRBMKConsole.java | 103 +++++++++++------- 1 file changed, 61 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index bdb21f97c..0382b50c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -89,44 +89,28 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon double flux = 0; - for(int i = -7; i <= 7; i++) { - for(int j = -7; j <= 7; j++) { - int rx = i, rz = j; - switch (rotation) { - case 1: // 90° - rx = -j; - rz = i; - break; - case 2: // 180° - rx = -i; - rz = -j; - break; - case 3: // 270° - rx = j; - rz = -i; - break; + for(int index = 0; index < columns.length; index++) { + int rx = getXFromIndex(index); + int rz = getZFromIndex(index); + + TileEntity te = Compat.getTileStandard(worldObj, targetX + rx, targetY, targetZ + rz); + + if(te instanceof TileEntityRBMKBase) { + + TileEntityRBMKBase rbmk = (TileEntityRBMKBase)te; + + columns[index] = new RBMKColumn(rbmk.getConsoleType(), rbmk.getNBTForConsole()); + columns[index].data.setDouble("heat", rbmk.heat); + columns[index].data.setDouble("maxHeat", rbmk.maxHeat()); + if(rbmk.isModerated()) columns[index].data.setBoolean("moderated", true); //false is the default anyway and not setting it when we don't need to reduces cruft + + if(te instanceof TileEntityRBMKRod) { + TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; + flux += fuel.lastFluxQuantity; } - TileEntity te = Compat.getTileStandard(worldObj, targetX + rx, targetY, targetZ + rz); - int index = (i + 7) + (j + 7) * 15; - - if(te instanceof TileEntityRBMKBase) { - - TileEntityRBMKBase rbmk = (TileEntityRBMKBase)te; - - columns[index] = new RBMKColumn(rbmk.getConsoleType(), rbmk.getNBTForConsole()); - columns[index].data.setDouble("heat", rbmk.heat); - columns[index].data.setDouble("maxHeat", rbmk.maxHeat()); - if(rbmk.isModerated()) columns[index].data.setBoolean("moderated", true); //false is the default anyway and not setting it when we don't need to reduces cruft - - if(te instanceof TileEntityRBMKRod) { - TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.lastFluxQuantity; - } - - } else { - columns[index] = null; - } + } else { + columns[index] = null; } } @@ -281,8 +265,9 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(key.startsWith("sel_")) { - int x = data.getInteger(key) % 15 - 7; - int z = data.getInteger(key) / 15 - 7; + int index = data.getInteger(key); + int x = getXFromIndex(index); + int z = getZFromIndex(index); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -322,8 +307,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int[] cols = data.getIntArray("cols"); for(int i : cols) { - int x = i % 15 - 7; - int z = i / 15 - 7; + int x = getXFromIndex(i); + int z = getZFromIndex(i); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -339,8 +324,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int[] cols = data.getIntArray("cols"); for(int i : cols) { - int x = i % 15 - 7; - int z = i / 15 - 7; + int x = getXFromIndex(i); + int z = getZFromIndex(i); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -404,6 +389,40 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon rotation = (byte)((rotation + 1) % 4); } + public int getXFromIndex(int col) { + final int i = col % 15 - 7; + final int j = col / 15 - 7; + switch (rotation) { + case 0: // 0° + return i; + case 1: // 90° + return -j; + case 2: // 180° + return -i; + case 3: // 270° + return j; + } + + return i; + } + + public int getZFromIndex(int col) { + final int i = col % 15 - 7; + final int j = col / 15 - 7; + switch (rotation) { + case 0: // 0° + return j; + case 1: // 90° + return i; + case 2: // 180° + return -j; + case 3: // 270° + return -i; + } + + return j; + } + public static class RBMKColumn { public ColumnType type; From 0c5077b54aa19749864e489c76e1f35094cf6a3b Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 17 Jul 2025 21:40:32 +0300 Subject: [PATCH 120/323] Don't forget OpenComputers --- .../machine/rbmk/TileEntityRBMKConsole.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index 0382b50c0..db38eed4b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -575,13 +575,32 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int x = args.checkInteger(0) - 7; int y = -args.checkInteger(1) + 7; - int i = (y + 7) * 15 + (x + 7); + int i = x; + int j = y; + switch (rotation) { + case 0: + break; + case 1: + i = y; + j = -x; + break; + case 2: + i = -x; + j = -y; + break; + case 3: + i = -y; + j = x; + break; + } + + int index = (j + 7) * 15 + (i + 7); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + y); if (te instanceof TileEntityRBMKBase) { TileEntityRBMKBase column = (TileEntityRBMKBase) te; - NBTTagCompound column_data = columns[i].data; + NBTTagCompound column_data = columns[index].data; LinkedHashMap data_table = new LinkedHashMap<>(); data_table.put("type", column.getConsoleType().name()); data_table.put("hullTemp", column_data.getDouble("heat")); From 5fb88801ec665515073304dbdd4a583624242c91 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Thu, 17 Jul 2025 14:04:52 -0500 Subject: [PATCH 121/323] add oc compat for fluid pump --- .../com/hbm/blocks/network/FluidPump.java | 157 ++++++++++++++++-- 1 file changed, 142 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/FluidPump.java b/src/main/java/com/hbm/blocks/network/FluidPump.java index 416b1c579..746622c0c 100644 --- a/src/main/java/com/hbm/blocks/network/FluidPump.java +++ b/src/main/java/com/hbm/blocks/network/FluidPump.java @@ -3,6 +3,12 @@ package com.hbm.blocks.network; import java.util.ArrayList; import java.util.List; +import com.hbm.handler.CompatHandler; +import cpw.mods.fml.common.Optional; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; import org.lwjgl.input.Keyboard; import com.hbm.blocks.ILookOverlay; @@ -93,7 +99,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo return true; } } - + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } @@ -123,40 +129,41 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo public int transformMeta(int meta, int coordBaseMode) { return INBTTransformable.transformMetaDeco(meta, coordBaseMode); } - - public static class TileEntityFluidPump extends TileEntityLoadedBase implements IFluidStandardTransceiverMK2, IControlReceiver { - + + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) + public static class TileEntityFluidPump extends TileEntityLoadedBase implements IFluidStandardTransceiverMK2, IControlReceiver, SimpleComponent, CompatHandler.OCComponent { + public int bufferSize = 100; public FluidTank[] tank; public ConnectionPriority priority = ConnectionPriority.NORMAL; public boolean redstone = false; - + public TileEntityFluidPump() { this.tank = new FluidTank[1]; this.tank[0] = new FluidTank(Fluids.NONE, bufferSize); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + // if the capacity were changed directly, any excess buffered fluid would be destroyed // when running a closed loop or handling hard to get fluids, that's quite bad if(this.bufferSize != this.tank[0].getMaxFill()) { int nextBuffer = Math.max(this.tank[0].getFill(), this.bufferSize); this.tank[0].changeTankSize(nextBuffer); } - + this.redstone = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); ForgeDirection in = dir.getRotation(ForgeDirection.UP); ForgeDirection out = in.getOpposite(); - + this.trySubscribe(tank[0].getTankType(), worldObj, xCoord + in.offsetX, yCoord, zCoord + in.offsetZ, in); if(!redstone) this.tryProvide(tank[0], worldObj, xCoord + out.offsetX, yCoord, zCoord + out.offsetZ, out); - + this.networkPackNT(15); } } @@ -192,7 +199,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, buf.readByte()); bufferSize = buf.readInt(); } - + @Override public ConnectionPriority getFluidPriority() { return priority; } @Override public FluidTank[] getSendingTanks() { return redstone ? new FluidTank[0] : tank; } @Override public FluidTank[] getReceivingTanks() { return this.bufferSize < this.tank[0].getFill() ? new FluidTank[0] : tank; } @@ -214,9 +221,129 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo if(data.hasKey("priority")) { priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, data.getByte("priority")); } - + this.markDirty(); } + + @Override + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "ntm_fluid_pump"; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getFluid(Context context, Arguments args) { + return new Object[] { + tank[0].getTankType().getUnlocalizedName() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getPressure(Context context, Arguments args) { + return new Object[] { + tank[0].getPressure() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getFlow(Context context, Arguments args) { + return new Object[] { + bufferSize + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getPriority(Context context, Arguments args) { + return new Object[] { + getFluidPriority() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getInfo(Context context, Arguments args) { + return new Object[] { + tank[0].getTankType().getUnlocalizedName(), + tank[0].getPressure(), + bufferSize, + getFluidPriority() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] setPriority(Context context, Arguments args) { + int num = args.checkInteger(0); + switch (num) { + case 0: + priority = ConnectionPriority.LOWEST; + break; + case 1: + priority = ConnectionPriority.LOW; + break; + case 2: + priority = ConnectionPriority.NORMAL; + break; + case 3: + priority = ConnectionPriority.HIGH; + break; + case 4: + priority = ConnectionPriority.HIGHEST; + break; + default: + return new Object[] {null, "Not a valid Priority."}; + } + return new Object[] {true}; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] setFlow(Context context, Arguments args) { + int input = args.checkInteger(0); + if (input > 10000 || input < 0) + return new Object[] {null, "Number outside of bounds."}; + return new Object[] {true}; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public String[] methods() { + return new String[] { + "getPriority", + "getPressure", + "getFluid", + "getFlow", + "getInfo", + "setPriority", + "setFlow" + }; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public Object[] invoke(String method, Context context, Arguments args) throws Exception { + switch (method) { + case ("getPriority"): + return getPriority(context, args); + case ("getPressure"): + return getPressure(context, args); + case ("getFluid"): + return getFluid(context, args); + case ("getFlow"): + return getFlow(context, args); + case ("getInfo"): + return getInfo(context, args); + case ("setPriority"): + return setPriority(context, args); + case ("setFlow"): + return setFlow(context, args); + } + throw new NoSuchMethodException(); + } } public static class GUIPump extends GuiScreen { @@ -261,7 +388,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo drawString(fontRendererObj, "Priority:", this.width / 2 + 50, 80, 0xA0A0A0); buttonPriority.drawButton(mc, mouseX, mouseY); - + super.drawScreen(mouseX, mouseY, partialTicks); } From 8686a6414150ab5338c7a74147b9f4503a69717d Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Thu, 17 Jul 2025 14:46:57 -0500 Subject: [PATCH 122/323] fix CCGT allowing throttle over max when using OpenComputers callbacks --- .../machine/TileEntityMachineTurbineGas.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index b0705734c..0ce97569d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -105,11 +105,11 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[0].setTankType(fluid); } } - + if(autoMode) { //power production depending on power requirement and fuel level - + int powerSliderTarget; - + //when low on fuel, decrease consumption linearly if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge @@ -117,7 +117,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement else { powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); } - + if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; } @@ -403,12 +403,12 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement double waterPerTick = (consMax * energy * (temp - tempIdle) / 220000); //it just works fuck you this.waterToBoil = waterPerTick; //caching in a field for the EC compat to use - + int heatCycles = (int) Math.floor(waterToBoil); int waterCycles = tanks[2].getFill(); int steamCycles = (tanks[3].getMaxFill() - tanks[3].getFill()) / 10; int cycles = BobMathUtil.min(heatCycles, waterCycles, steamCycles); - + tanks[2].setFill(tanks[2].getFill() - cycles); tanks[3].setFill(tanks[3].getFill() + cycles * 10); } @@ -619,8 +619,11 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement @Callback(direct = true, limit = 4) @Optional.Method(modid = "OpenComputers") public Object[] setThrottle(Context context, Arguments args) { - powerSliderPos = (int) (args.checkInteger(0) * 60D / 100D); - return new Object[] {}; + double input = args.checkInteger(0) * 60D / 100D; + if (input < 0 || input > 100) + return new Object[] {null, "Input out of range."}; + powerSliderPos = (int) (input); + return new Object[] {true}; } @Callback(direct = true, limit = 4) From 06930f6ec810f10b04d8e2ab346226d7d6ba5446 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Fri, 18 Jul 2025 11:57:22 +0300 Subject: [PATCH 123/323] update uk_UA --- src/main/resources/assets/hbm/lang/uk_UA.lang | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 8d019103e..623aa6faa 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -773,6 +773,7 @@ container.leadBox=Свинцевий ящик container.machineAmmoPress=Прес для боєприпасів container.machineArcWelder=Дуговий зварювальник container.machineArcFurnaceLarge=Дугова піч +container.machineAssemblyMachine=Збиральна машина container.machineBoiler=Нагрівач нафти container.machineChemicalFactory=Хімічна фабрика container.machineChemicalPlant=Хімічний завод @@ -925,7 +926,7 @@ damage.item=Опір до: damage.category.EN=Енергії damage.category.EXPL=Вибухів damage.category.FIRE=Вогню -damage.category.PROJ=Снарядів +damage.category.PHYS=Фізики damage.exact.drown=Утоплення damage.exact.fall=Падіння damage.exact.LASER=Лазерів @@ -1033,7 +1034,7 @@ desc.gui.rtg.pellets=Допустимі пелети: desc.gui.rtg.pelletHeat=%s (%s тепла) desc.gui.rtg.pelletPower=%s (%s HE/тік) desc.gui.template=§9Шаблони§r$Шаблони можна створювати за$допомогою Папки шаблонів машин. -desc.gui.turbinegas.automode=§2Режим автоматичного дроселювання турбіни§r$Натиснувши кнопку "AUTO", турбіна$втоматично відрегулює виробництво електроенергії$на основі необхідної енергії в мережі +desc.gui.turbinegas.automode=§2Режим автоматичного дроселювання турбіни§r$Натиснувши кнопку "AUTO", турбіна$втоматично відрегулює виробництво електроенергії$на основі необхідної енергії в мережі$та рівня палива у внутрішньому баку desc.gui.turbinegas.fuels=§6Допустимі види палива:§r desc.gui.turbinegas.warning=§cНизький рівень палива або мастила!§r desc.gui.zirnox.coolant=§3Охолодження§r$CO2 передає тепло від реактора до води.$Це скип'ятить її до надзвичайно гарячу пару$Ефективність охолодження та виробництва пари$залежить від тиску. @@ -1805,6 +1806,7 @@ item.ammo_secret.folly_sm.name=Срібна куля item.ammo_secret.g12_equestrian.name=Флешетний снаряд з залізничними цвяхами 12-го калібру item.ammo_secret.m44_equestrian.name=.44 Magnum Череполом item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Чорна блискавка) item.ammo_standard.b75.name=Болт .75 item.ammo_standard.b75_exp.name=Болт .75 (Розривний) item.ammo_standard.b75_inc.name=Болт .75 (Запальний) @@ -2159,6 +2161,7 @@ item.blades_desh.name=Деш леза подрібнювача item.blades_steel.name=Стальні леза подрібнювача item.blades_titanium.name=Титанові леза подрібнювача item.blowtorch.name=Паяльна лампа +item.blueprints.name=Креслення item.board_copper.name=Мідна панель item.boat_rubber.name=Гумовий човен item.bobmazon.name=Бобмазон @@ -2389,6 +2392,7 @@ item.chopper_torso.name=Корпус Гвинтокрила Мисливця item.chopper_wing.name=Крило Гвинтокрила Мисливця item.chunk_ore.malachite.name=Шматок малахіту item.chunk_ore.rare.name=Шматок рідкоземельної руди +item.chunk_ore.moonstone.name=Місячний камінь item.chunk_ore.cryolite.name=Шматок кріоліту item.cigarette.name=Сигарети торгової марки FFI item.cinnebar.name=Кіновар @@ -3992,6 +3996,7 @@ item.radx.desc=Збільшує стійкість до радіації на 0. item.rag.name=Тканина item.rag_damp.name=Волога тканина item.rag_piss.name=Просочена сечею ганчірка +item.rangefinder.name=Прилад для вимірювання відстані item.rbmk_fuel_balefire.name=Паливний стрижень РБМК BF item.rbmk_fuel_balefire_gold.name=Паливний стрижень РБМК флешголду item.rbmk_fuel_drx.name=§cПаливний стрижень РБМК Дігамма§r @@ -5276,6 +5281,7 @@ tile.ducrete_smooth_stairs.name=Сходи з уранобетону tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Металевий ланцюг +tile.logic_block.name=Dungeon Action Block tile.dynamite.name=Динаміт tile.emp_bomb.name=Пристрій електромагнітного іпульсу tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -5475,8 +5481,9 @@ tile.machine_arc_welder.name=Дуговий зварювальник tile.machine_armor_table.name=Стіл модифікації броні tile.machine_ashpit.name=Зольник tile.machine_ashpit.desc=Збирає попіл з топок та нагрівальних печей -tile.machine_assembler.name=Збиральна машина +tile.machine_assembler.name=Збиральна машина (Legacy) tile.machine_assemfac.name=Збиральна фабрика +tile.machine_assembly_machine.name=Збиральна машина tile.machine_autocrafter.name=Автоматичний верстак tile.machine_autosaw.name=Автоматична пила tile.machine_autosaw.desc=Вирубує рослини поруч, заново висажує дерева$Приймає:$-Деревну смолу$-Етанол$-Риб'ячий жир$-Важку нафту @@ -5799,6 +5806,7 @@ tile.plasma_heater.name=Нагрівач плазми tile.plushie.name=%s плюшка tile.pneumatic_tube.name=Пневматична труба tile.pneumatic_tube.desc=Надсилає предмети за допомогою стисненого повітря.$Клацніть правою кнопкою миші викруткою, щоб перемкнути вхід.$Клацніть правою кнопкою миші з шифтом та викруткою, щоб перемкнути вихід.$Входи можна налаштувати та підключити до стисненого повітря.$Надсилає один стак чотири рази на секунду. +tile.pneumatic_tube_paintable.name=Пневматична труба, яку можна пофарбувати tile.pole_satellite_receiver.name=Супутникова тарілка tile.pole_top.name=Верхівка антени tile.press_preheater.name=Burner Press Preheater @@ -6058,6 +6066,7 @@ tile.volcano_rad_core.name=Радіоактивне вулканічне ядр tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_logic.name=Structure Wand Block (Logic) tile.waste_earth.name=Мертва трава tile.waste_leaves.name=Мертве листя tile.waste_log.name=Обвуглене дерево @@ -6221,4 +6230,6 @@ desc.gui.upgrade.afterburner= * §dФорсаж§r: Складається до desc.gui.upgrade.effectiveness= * §aЕфективність§r: Складається до 3 рівнів desc.gui.upgrade.overdrive= * §7Перевантаження§r: Складається до 3 рівнів desc.gui.upgrade.power= * §1Енергозбереження§r: Складається до 3 рівнів -desc.gui.upgrade.speed= * §4Швидкість§r: Складається до 3 рівнів \ No newline at end of file +desc.gui.upgrade.speed= * §4Швидкість§r: Складається до 3 рівнів + +tile.oc_cable_paintable.name=Мережевий кабель, який можна фарбувати \ No newline at end of file From b7641dcd54c57702c8e95c7d925a1f515ff567ab Mon Sep 17 00:00:00 2001 From: Bob Date: Fri, 18 Jul 2025 23:34:43 +0200 Subject: [PATCH 124/323] now's your chance to take a [BIG SHIT] --- changelog | 25 ++++++++++++- .../java/com/hbm/crafting/ToolRecipes.java | 2 +- .../java/com/hbm/handler/CompatHandler.java | 2 -- .../gui/GUIScreenTemplateFolder.java | 19 ---------- .../recipes/AssemblyMachineRecipes.java | 25 ++++++++++++- .../recipes/ChemicalPlantRecipes.java | 15 -------- .../com/hbm/itempool/ItemPoolsLegacy.java | 2 -- src/main/java/com/hbm/items/ModItems.java | 20 +++++++---- .../items/machine/ItemAssemblyTemplate.java | 5 ++- .../com/hbm/items/machine/ItemBlueprints.java | 14 ++++++-- .../hbm/items/machine/ItemChemistryIcon.java | 1 + .../items/machine/ItemChemistryTemplate.java | 5 ++- .../com/hbm/items/machine/ItemFluidTank.java | 33 ++++++------------ .../weapon/sedna/factory/Orchestras.java | 9 ++++- .../weapon/sedna/factory/XFactory12ga.java | 2 +- .../machine/ModuleMachineAssembler.java | 9 +++++ .../tileentity/RenderAssemblyMachine.java | 3 -- .../TileEntityMachineAssemblyMachine.java | 14 ++++++-- .../TileEntityMachineChemicalFactory.java | 14 +++++++- .../TileEntityMachineChemicalPlant.java | 10 +++++- src/main/java/com/hbm/util/ShadyUtil.java | 4 +-- .../gen/util/LogicBlockInteractions.java | 6 ---- src/main/resources/assets/hbm/lang/de_DE.lang | 8 +++-- src/main/resources/assets/hbm/lang/en_US.lang | 8 +++-- src/main/resources/assets/hbm/sounds.json | 1 + .../assets/hbm/sounds/weapon/hkShoot.ogg | Bin 0 -> 13919 bytes .../assets/hbm/textures/items/fluid_pack.png | Bin 0 -> 477 bytes .../hbm/textures/items/fluid_pack_overlay.png | Bin 0 -> 201 bytes .../hbm/textures/items/fluid_tank_lead.png | Bin 262 -> 289 bytes .../items/fluid_tank_lead_overlay.png | Bin 132 -> 180 bytes 30 files changed, 154 insertions(+), 102 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg create mode 100644 src/main/resources/assets/hbm/textures/items/fluid_pack.png create mode 100644 src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png diff --git a/changelog b/changelog index 00743753b..07f6038d5 100644 --- a/changelog +++ b/changelog @@ -9,8 +9,18 @@ * Replace the journals * Instead of opening them and making a template, they act as a multi template * Blueprints need to remain in the slot, removing them will disable the recipes again +* More paintables + * Paintable pneumatic tube + * Behaves the exact same as a regular pneumatic tube + * Can also be used as in and outputs + * Full block + * Paintable OpenComputers cable + * Only enabled if OpenComputers is installed + * Full block + * Also supports OC wire colors ## Changed +* Updated chinese and ukrainian localization * Removed levitation unit * Many of NTM's regular building blocks now have forge microblock support * RBMK crane models now conform to the dimensions of the room they're in @@ -19,9 +29,22 @@ * Electric attacks (i.e. tesla cannon) are now in the "energy damage" category * This means that armors that have energy resistance actually properly work against the tesla cannon * Heavy components are being deprecated +* Flow control pumps can now be interfaced with OpenComputers +* The electrolyzer now remembers the last visited GUI screen +* Retextured many fluid containers such as universal tanks, canisters and gas tanks +* Removed the legacy assembler and chemical plant recipes from the template folder +* Removed journals from various loot pools +* Drinking whiskey now gives strength III, resistance III and nausea +* Chemical artillery shell recipes have now been moved to the assembler +* The chemical plant and factory now scale their max power based on the recipe, similar to how the arc welder works +* The chemical plant's default max power is now 100kHE again instead of 1MHE ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded * Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots * Fixed guns that don't have durability always displaying a condition of 0% -* Fixed GL state leak caused by skeletons \ No newline at end of file +* Fixed GL state leak caused by skeletons +* Fixed OpenComputers integration for the CCGT +* Fixed rotated RBMK consoles not behaving correctly when trying to change rod insertion levels +* Fixed crash caused by piston inserters on servers +* Fixed flare gun not having a firing sound diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index de9dc346f..b01ee10cf 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -113,7 +113,7 @@ public class ToolRecipes { //Utility CraftingManager.addRecipeAuto(new ItemStack(ModItems.rangefinder, 1), new Object[] { "GRC", " S", 'G', KEY_ANYPANE, 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'S' ,STEEL.plate() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', IRON.plate(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { ModItems.rangefinder, ModItems.designator, ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_manual, 1), new Object[] { " A", "#C#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', PB.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'C', ModItems.designator }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), ANY_PLASTIC.ingot() }); diff --git a/src/main/java/com/hbm/handler/CompatHandler.java b/src/main/java/com/hbm/handler/CompatHandler.java index ac4bbe114..feb113b7a 100644 --- a/src/main/java/com/hbm/handler/CompatHandler.java +++ b/src/main/java/com/hbm/handler/CompatHandler.java @@ -1,7 +1,6 @@ package com.hbm.handler; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.network.BlockOpenComputersCablePaintable; import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -17,7 +16,6 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.*; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index 134b83c75..aebfa05ee 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -10,16 +10,11 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe; -import com.hbm.inventory.recipes.ChemplantRecipes; -import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemStamp; import com.hbm.items.machine.ItemStamp.StampType; @@ -83,22 +78,8 @@ public class GUIScreenTemplateFolder extends GuiScreen { } } } - - // Assembly Templates - for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) { - ComparableStack comp = AssemblerRecipes.recipeList.get(i); - AssemblerRecipe recipe = AssemblerRecipes.recipes.get(comp); - if(recipe != null && recipe.folders.contains(item)) { - allStacks.add(ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template, 1, i), comp)); - } - } if(!this.isJournal) { - // Chemistry Templates - for(int i = 0; i < ChemplantRecipes.recipes.size(); i++) { - ChemRecipe chem = ChemplantRecipes.recipes.get(i); - allStacks.add(new ItemStack(ModItems.chemistry_template, 1, chem.getId())); - } // Crucible Templates for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index c6e98b525..a8444a256 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -16,6 +16,7 @@ import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.Mats; import com.hbm.inventory.recipes.loader.GenericRecipe; @@ -233,7 +234,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.fel").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_fel, 1)) - .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.silex").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_silex, 1)) .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8))); this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) @@ -669,6 +670,15 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.50bmgbypass").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK.ordinal())) .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + this.register(new GenericRecipe("chem.shellchlorine").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 9)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.CHLORINE, 4_000))); + this.register(new GenericRecipe("ass.shellphosgene").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 10)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.PHOSGENE, 4_000))); + this.register(new GenericRecipe("ass.shellmustard").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 11)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.MUSTARDGAS, 4_000))); // tools this.register(new GenericRecipe("ass.multitool").setup(100, 100).outputItems(new ItemStack(ModItems.multitool_hit, 1)) @@ -773,6 +783,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + + this.register(new GenericRecipe("ass.emptypackage").setup(40, 100).outputItems(new ItemStack(ModItems.fluid_pack_empty, 1)) + .inputItems(new OreDictStack(TI.plate(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 2))); + + FluidType[] order = Fluids.getInNiceOrder(); + for(int i = 1; i < order.length; ++i) { + FluidType type = order[i]; + if(type.hasNoContainer()) continue; + this.register(new GenericRecipe("ass.package" + type.getUnlocalizedName()).setup(100, 100).outputItems(new ItemStack(ModItems.fluid_pack_full, 1, type.getID())) + .inputItems(new ComparableStack(ModItems.fluid_pack_empty)).inputFluids(new FluidStack(type, 32_000))); + this.register(new GenericRecipe("ass.unpackage" + type.getUnlocalizedName()).setup(100, 100).setIcon(ItemFluidIcon.make(type, 32_000)).outputItems(new ItemStack(ModItems.fluid_pack_empty)) + .inputItems(new ComparableStack(ModItems.fluid_pack_full, 1, type.getID())).outputFluids(new FluidStack(type, 32_000))); + } if(GeneralConfig.enableMekanismChanges && Loader.isModLoaded("Mekanism")) { Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); diff --git a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java index ca4bcc193..4bbf1074c 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java @@ -268,21 +268,6 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.UNSATURATEDS, 500, GeneralConfig.enable528 ? 1 : 0)) .outputItems(new ItemStack(ModItems.ingot_c4, 4))); - this.register(new GenericRecipe("chem.shellchlorine").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.CHLORINE, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 9))); - - this.register(new GenericRecipe("chem.shellphosgene").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.PHOSGENE, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 10))); - - this.register(new GenericRecipe("chem.shellmustard").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.MUSTARDGAS, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 11))); - /// GLASS /// this.register(new GenericRecipe("chem.laminate").setup(20, 100) .inputFluids(new FluidStack(Fluids.XYLENE, 50), new FluidStack(Fluids.PHOSGENE, 50)) diff --git a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java index ef3bc5569..289a495e9 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java @@ -130,8 +130,6 @@ public class ItemPoolsLegacy { weighted(ModItems.bomb_caller, 1, 1, 1, 1), weighted(ModItems.bomb_caller, 2, 1, 1, 1), weighted(ModItems.gas_mask_filter, 0, 1, 1, 4), - weighted(ModItems.journal_pip, 0, 1, 1, 1), - weighted(ModItems.journal_bj, 0, 1, 1, 1), weighted(ModItems.launch_code_piece, 0, 1, 1, 1), weighted(ModItems.gun_double_barrel, 0, 1, 1, 1), }; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 3ded60786..41b783fc6 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -844,6 +844,8 @@ public class ModItems { public static Item fluid_barrel_full; public static Item fluid_barrel_empty; public static Item fluid_barrel_infinite; + public static Item fluid_pack_full; + public static Item fluid_pack_empty; public static Item pipette; public static Item pipette_boron; public static Item pipette_laboratory; @@ -1181,12 +1183,12 @@ public class ModItems { public static Item blueprints; public static Item template_folder; - public static Item journal_pip; - public static Item journal_bj; - public static Item journal_silver; - public static Item assembly_template; - public static Item chemistry_template; - public static Item chemistry_icon; + @Deprecated public static Item journal_pip; + @Deprecated public static Item journal_bj; + @Deprecated public static Item journal_silver; + @Deprecated public static Item assembly_template; + @Deprecated public static Item chemistry_template; + @Deprecated public static Item chemistry_icon; public static Item crucible_template; public static Item fluid_identifier; public static Item fluid_identifier_multi; @@ -4115,6 +4117,8 @@ public class ModItems { fluid_barrel_empty = new Item().setUnlocalizedName("fluid_barrel_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_full = new ItemFluidTank().setUnlocalizedName("fluid_barrel_full").setContainerItem(ModItems.fluid_barrel_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_infinite = new ItemInfiniteFluid(null, 1_000_000_000).setUnlocalizedName("fluid_barrel_infinite").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel_infinite"); + fluid_pack_empty = new Item().setUnlocalizedName("fluid_pack_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_pack"); + fluid_pack_full = new ItemFluidTank().setUnlocalizedName("fluid_pack_full").setContainerItem(ModItems.fluid_pack_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_pack"); pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); @@ -5686,6 +5690,10 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_empty, fluid_barrel_empty.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); + + //Packaged fluids + GameRegistry.registerItem(fluid_pack_empty, fluid_pack_empty.getUnlocalizedName()); + GameRegistry.registerItem(fluid_pack_full, fluid_pack_full.getUnlocalizedName()); //Pipette GameRegistry.registerItem(pipette, pipette.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java index 7a1c26a0b..76f38f7d6 100644 --- a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java @@ -24,6 +24,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; +@Deprecated public class ItemAssemblyTemplate extends Item { @SideOnly(Side.CLIENT) @@ -157,6 +158,7 @@ public class ItemAssemblyTemplate extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Deprecated"); if(!(stack.getItem() instanceof ItemAssemblyTemplate)) return; @@ -198,9 +200,6 @@ public class ItemAssemblyTemplate extends Item { a++; } - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("info.templatefolder", String.join(" / ", names))); - list.add(""); - if(out == null) { list.add("I AM ERROR"); return; diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java index 84976e8c5..874cfd6f6 100644 --- a/src/main/java/com/hbm/items/machine/ItemBlueprints.java +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -56,13 +56,19 @@ public class ItemBlueprints extends Item { @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs tab, List list) { for(Entry> pool : GenericRecipes.blueprintPools.entrySet()) { - list.add(make(pool.getKey())); + String poolName = pool.getKey(); + if(!poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) list.add(make(poolName)); } } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(world.isRemote) return stack; + if(!stack.hasTagCompound()) return stack; + + String poolName = stack.stackTagCompound.getString("pool"); + + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) return stack; if(!player.inventory.hasItem(Items.paper)) return stack; player.inventory.consumeInventoryItem(Items.paper); @@ -94,7 +100,6 @@ public class ItemBlueprints extends Item { @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add(EnumChatFormatting.RED + "Right-click to copy (requires paper)"); if(!stack.hasTagCompound()) { return; @@ -106,6 +111,11 @@ public class ItemBlueprints extends Item { if(pool == null || pool.isEmpty()) { return; } + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) { + list.add(EnumChatFormatting.RED + "Cannot be copied!"); + } else { + list.add(EnumChatFormatting.YELLOW + "Right-click to copy (requires paper)"); + } for(String name : pool) { GenericRecipe recipe = GenericRecipes.pooledBlueprints.get(name); diff --git a/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java b/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java index f3e190dc5..41cd901c9 100644 --- a/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java +++ b/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java @@ -15,6 +15,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +@Deprecated public class ItemChemistryIcon extends Item { @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java index d644a4515..b310805b6 100644 --- a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java @@ -16,6 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +@Deprecated public class ItemChemistryTemplate extends Item { public ItemChemistryTemplate() { @@ -51,6 +52,7 @@ public class ItemChemistryTemplate extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Deprecated"); if(!(stack.getItem() instanceof ItemChemistryTemplate)) return; @@ -61,9 +63,6 @@ public class ItemChemistryTemplate extends Item { return; } - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("info.templatefolder", I18nUtil.resolveKey(ModItems.template_folder.getUnlocalizedName() + ".name"))); - list.add(""); - try { list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); for(int i = 0; i < 4; i++) { diff --git a/src/main/java/com/hbm/items/machine/ItemFluidTank.java b/src/main/java/com/hbm/items/machine/ItemFluidTank.java index ce7a2cd0d..a8642652a 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidTank.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidTank.java @@ -30,9 +30,7 @@ public class ItemFluidTank extends Item { for(int i = 1; i < order.length; ++i) { FluidType type = order[i]; - if(type.hasNoContainer()) - continue; - + if(type.hasNoContainer()) continue; int id = type.getID(); if(type.needsLeadContainer()) { @@ -46,14 +44,10 @@ public class ItemFluidTank extends Item { } } + @Override public String getItemStackDisplayName(ItemStack stack) { - String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); String s1 = ("" + StatCollector.translateToLocal(Fluids.fromID(stack.getItemDamage()).getConditionalName())).trim(); - - if(s1 != null) { - s = s + " " + s1; - } - + String s = ("" + StatCollector.translateToLocalFormatted(this.getUnlocalizedName() + ".name", s1)).trim(); return s; } @@ -68,12 +62,10 @@ public class ItemFluidTank extends Item { public void registerIcons(IIconRegister p_94581_1_) { super.registerIcons(p_94581_1_); - if(this == ModItems.fluid_tank_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_overlay"); - if(this == ModItems.fluid_tank_lead_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_lead_overlay"); - if(this == ModItems.fluid_barrel_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_barrel_overlay"); + if(this == ModItems.fluid_tank_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_overlay"); + if(this == ModItems.fluid_tank_lead_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_lead_overlay"); + if(this == ModItems.fluid_barrel_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_barrel_overlay"); + if(this == ModItems.fluid_pack_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_pack_overlay"); } @Override @@ -84,18 +76,13 @@ public class ItemFluidTank extends Item { @Override @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack stack, int p_82790_2_) { - if(p_82790_2_ == 0) { + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 0) { return 16777215; } else { int j = Fluids.fromID(stack.getItemDamage()).getColor(); - - if(j < 0) { - j = 16777215; - } - + if(j < 0) j = 16777215; return j; } } - } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index c13f16a26..33c583b54 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -27,6 +27,8 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.MovingObjectPosition; @@ -942,7 +944,7 @@ public class Orchestras { if(timer == 2) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); - if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? -0.0625 : -0.125, aiming ? 0 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? -0.0625 : -0.125, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); } } @@ -969,6 +971,11 @@ public class Orchestras { if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); if(timer == 35) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); if(timer == 50) entity.worldObj.playSoundAtEntity(entity, "hbm:player.groan", 1F, 1F); + if(timer == 60) { + entity.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 30 * 20, 2)); + entity.addPotionEffect(new PotionEffect(Potion.resistance.id, 30 * 20, 2)); + entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 10 * 20, 0)); + } } }; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 490bd64b7..44f9d046f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -375,7 +375,7 @@ public class XFactory12ga { ).setUnlocalizedName("gun_autoshotgun_shredder"); ModItems.gun_autoshotgun_sexy = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() - .dura(5_000).draw(20).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .dura(5_000).draw(20).inspect(65).reloadSequential(true).inspectCancel(false).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(64F).delay(4).auto(true).dryfireAfterAuto(true).reload(110).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 100).addConfigs(g12_equestrian_bj, g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus)) diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java index 1823b540b..2316ad787 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -3,6 +3,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.util.BobMathUtil; import api.hbm.energymk2.IEnergyHandlerMK2; import net.minecraft.item.ItemStack; @@ -21,6 +22,14 @@ public class ModuleMachineAssembler extends ModuleMachineBase { public GenericRecipe getRecipe() { return AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.recipe); } + + @Override + public void setupTanks(GenericRecipe recipe) { + super.setupTanks(recipe); + if(recipe == null) return; + for(int i = 0; i < inputTanks.length; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].changeTankSize(BobMathUtil.max(inputTanks[i].getFill(), recipe.inputFluid[i].fill * 2, 4_000)); + for(int i = 0; i < outputTanks.length; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].changeTankSize(BobMathUtil.max(outputTanks[i].getFill(), recipe.outputFluid[i].fill * 2, 4_000)); + } public ModuleMachineAssembler itemInput(int from) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = from + i; return this; } public ModuleMachineAssembler itemOutput(int a) { outputSlots[0] = a; return this; } diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java index 1111a998a..5900c0f84 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -13,13 +13,11 @@ import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; import com.hbm.util.BobMathUtil; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -109,7 +107,6 @@ public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements GL11.glRotated(90, 0, 1, 0); GL11.glTranslated(0, 1.0625, 0); - EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack stack = recipe.getIcon(); stack.stackSize = 1; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 2ad98b8c0..ecc1c787c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -11,6 +11,8 @@ import com.hbm.inventory.container.ContainerMachineAssemblyMachine; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineAssemblyMachine; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -44,7 +46,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl public FluidTank outputTank; public long power; - public long maxPower = 1_000_000; + public long maxPower = 100_000; public boolean didProcess = false; public boolean frame = false; @@ -63,8 +65,8 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl public TileEntityMachineAssemblyMachine() { super(17); - this.inputTank = new FluidTank(Fluids.NONE, 32_000); - this.outputTank = new FluidTank(Fluids.NONE, 32_000); + this.inputTank = new FluidTank(Fluids.NONE, 4_000); + this.outputTank = new FluidTank(Fluids.NONE, 4_000); for(int i = 0; i < this.arms.length; i++) this.arms[i] = new AssemblerArm(); @@ -85,6 +87,12 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl if(!worldObj.isRemote) { + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemblerModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); upgradeManager.checkSlots(slots, 2, 3); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index dfcd1c50d..ca0c259c7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -10,6 +10,8 @@ import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalFactory; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -49,7 +51,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl public FluidTank lps; public long power; - public long maxPower = 10_000_000; + public long maxPower = 1_000_000; public boolean[] didProcess = new boolean[4]; public boolean frame = false; @@ -130,6 +132,16 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl if(!worldObj.isRemote) { + long nextMaxPower = 0; + for(int i = 0; i < 4; i++) { + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule[i].recipe); + if(recipe != null) { + nextMaxPower += recipe.power * 100; + } + } + this.maxPower = nextMaxPower; + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); upgradeManager.checkSlots(slots, 1, 3); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 6a21f07de..97ebd11bf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -10,6 +10,8 @@ import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalPlant; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; @@ -43,7 +45,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem public FluidTank[] outputTanks; public long power; - public long maxPower = 1_000_000; + public long maxPower = 100_000; public boolean didProcess = false; public boolean frame = false; @@ -83,6 +85,12 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem if(!worldObj.isRemote) { + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); upgradeManager.checkSlots(slots, 2, 3); diff --git a/src/main/java/com/hbm/util/ShadyUtil.java b/src/main/java/com/hbm/util/ShadyUtil.java index 03a2390ab..7f6d3351f 100644 --- a/src/main/java/com/hbm/util/ShadyUtil.java +++ b/src/main/java/com/hbm/util/ShadyUtil.java @@ -144,8 +144,8 @@ public class ShadyUtil { Field field = ReflectionHelper.findField(test, decode(offset(checksum, -2))); if(field != null) { System.out.println("TEST SECTION START"); - Class toLoad = Class.forName(decode(offset(testCase, -2))); - Field toRead = ReflectionHelper.findField(toLoad, decode(offset(testValue, -2))); + //Class toLoad = Class.forName(decode(offset(testCase, -2))); + //Field toRead = ReflectionHelper.findField(toLoad, decode(offset(testValue, -2))); //ModEventHandler.reference = toRead; System.out.println("TEST SECTION END"); } diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java index bf3bc47eb..b9ee4dde1 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -7,7 +7,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -22,13 +21,8 @@ public class LogicBlockInteractions { public static LinkedHashMap> interactions = new LinkedHashMap<>(); public static Consumer TEST = (array) -> { - World world = (World) array[0]; LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; - int x = (int) array[2]; - int y = (int) array[3]; - int z = (int) array[4]; EntityPlayer player = (EntityPlayer) array[5]; - int side = (int) array[6]; if(logic.phase > 1) return; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 1e54344ec..2cc9428b9 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1966,7 +1966,7 @@ item.fleija_igniter.name=Impulszünder item.fleija_kit.name=F.L.E.I.J.A. Kit item.fleija_propellant.name=Schrabidiumtreibladung item.fluid_barrel_empty.name=Leeres Fass -item.fluid_barrel_full.name=Flüssigkeitsfass: +item.fluid_barrel_full.name=Flüssigkeitsfass: %s item.fluid_barrel_infinite.name=Unendliches Fass item.fluid_duct.name=Flüssigkeitsrohr: item.fluid_identifier.name=Flüssigkeits-Kennzeichnung @@ -1977,10 +1977,12 @@ item.fluid_identifier.usage2=einer maximalen Reichweite von 64 Rohren zuzuweisen item.fluid_identifier_multi.name=Multi-Flüssigkeits-Kennzeichnung item.fluid_identifier_multi.info=Universelle Flüssigkeits-Kennzeichnung für: item.fluid_identifier_multi.info2=Sekundärer Typ: +item.fluid_pack_empty.name=Großer Flüssigkeitsbehälter +item.fluid_pack_full.name=%s (Abgepackt) item.fluid_tank_empty.name=Leere universelle Flüssigkeitszelle -item.fluid_tank_full.name=Universelle Flüssigkeitszelle: +item.fluid_tank_full.name=Universelle Flüssigkeitszelle: %s item.fluid_tank_lead_empty.name=Leere Gefahrenstoffzelle -item.fluid_tank_lead_full.name=Gefahrenstoffzelle: +item.fluid_tank_lead_full.name=Gefahrenstoffzelle: %s item.fluorite.name=Fluorit item.flywheel_beryllium.name=Berylliumschwungscheibe item.fmn.name=Flunitrazepamtablette diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index fb3f37c9a..53f1112b2 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2772,7 +2772,7 @@ item.fleija_igniter.name=Pulse Igniter item.fleija_kit.name=F.L.E.I.J.A. Kit item.fleija_propellant.name=Schrabidium Propellant item.fluid_barrel_empty.name=Empty Fluid Barrel -item.fluid_barrel_full.name=Fluid Barrel: +item.fluid_barrel_full.name=Fluid Barrel: %s item.fluid_barrel_infinite.name=Infinite Fluid Barrel item.fluid_duct.name=Fluid Duct: item.fluid_identifier.name=Fluid Identifier @@ -2783,10 +2783,12 @@ item.fluid_identifier.usage2=up to a maximum range of 64 ducts. item.fluid_identifier_multi.name=Multi Fluid Identifier item.fluid_identifier_multi.info=Universal fluid identifier for: item.fluid_identifier_multi.info2=Secondary type: +item.fluid_pack_empty.name=Large Fluid Container +item.fluid_pack_full.name=Packaged %s item.fluid_tank_empty.name=Empty Universal Fluid Tank -item.fluid_tank_full.name=Universal Fluid Tank: +item.fluid_tank_full.name=Universal Fluid Tank: %s item.fluid_tank_lead_empty.name=Empty Hazardous Material Tank -item.fluid_tank_lead_full.name=Hazardous Material Tank: +item.fluid_tank_lead_full.name=Hazardous Material Tank: %s item.fluorite.name=Fluorite item.flywheel_beryllium.name=Beryllium Flywheel item.fmn.name=Flunitrazepam Tablet diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 2d472a53a..1b5db22f5 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -222,6 +222,7 @@ "weapon.explosionSmallNear": {"category": "player", "sounds": ["weapon/explosionSmallNear1", "weapon/explosionSmallNear2", "weapon/explosionSmallNear3"]}, "weapon.explosionSmallFar": {"category": "player", "sounds": ["weapon/explosionSmallFar1", "weapon/explosionSmallFar2"]}, "weapon.explosionTiny": {"category": "player", "sounds": ["weapon/explosionTiny1", "weapon/explosionTiny2"]}, + "weapon.hkShoot": {"category": "player", "sounds": [{"name": "weapon/hkShoot", "stream": false}]}, "weapon.dFlash": {"category": "player", "sounds": [{"name": "weapon/dFlash", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg b/src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..883b0e46a39fb7fa8fc73e9ef150d80b9c2dc337 GIT binary patch literal 13919 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 C3&rsO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/fluid_pack.png b/src/main/resources/assets/hbm/textures/items/fluid_pack.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c5de9aadd096d963c82b0e28760433d44875ae GIT binary patch literal 477 zcmV<30V4j1P)GQdk5fXlDuw5h7ON0tCql6dMaWF&5S-odsB1 zi22A=1ks_JV2ve|4RAB{#5z&pV4c$^G}LxLc{G)+`h zMV4jq`8_YDyDHU!fLgmSS*ssWB|C` zZk*3&5m+b`05}{DD2f8WZnu+U0MGN7&1Q_pV`Nzd;Q4&=csxXc`~42U^?D@?L&4tx zN~O}I+wG$3I?LsfdcBUW>*%_Us;UeI1Ho&x8kI_gTrP*$!Rw5!>;Bkw5Co|l;4OX} zt6VOVq%w&~UzvoWkKTZ>%-EK#*MF6&KOaJjt(wzUp TSkw6%00000NkvXXu0mjf^sUr1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0de07193ea21f97b716c3b3195a9433c0484c4c1 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfNS%G}%0G|+72L~TDHRF_&g0ixvWy>}(GxHxicG=fA5-1-u+2RY3;w%aB3;quU z48i^tLLk8ckH}&M2EM}}%y>M1MG8V>FE~M){gB*Er53MrABzB`T8K~y-6&62SR z!!QsdiD{a!EDOB%Sl1QK zxv0n`72_i*RWp%bV;Z)$Wg@{ug3D4LXQk>OUeLif-ZB6viUL~e!_V^^RaFJd*CPB` vfqg*pJYyJ!!}s39ITtXye!mB&SNXIaDsWj1790q700000NkvXXu0mjfG8kqY diff --git a/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png index 2fd03ec75d1b0bb9928ff8e8df98d451f10ec506..10b09d8fde13539a299a135348cedd59e1950ad4 100644 GIT binary patch delta 152 zcmZo++`>3PrJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{NT;9+AZi419+{nDKc2 ziWH!rzNd?0h=qT$1nc64We0BD_+ih%FjK+Dsv&b<@pHa7<{1l2*mhKZ*PCL>^?{j< wjp2u_;O-CU=bM3A`BEc1(|mmyw18|5AZB0?WMH@yJQ>9DboFyt=akR{0Q=M}T>t<8 delta 103 zcmdnO*upqLC4r^b$uool2x>S|Iv5xjtUX;ELo9le6C_xhW$x@QfBzo@Cg&cg*Eq1e zt#g9n_xJaYYx`edaAH``2xO;M{QF~>8*9KNA;Iv?TD( Date: Mon, 21 Jul 2025 00:52:02 +0200 Subject: [PATCH 125/323] 1v1 me on twitter vro --- changelog | 2 + gradle.properties | 2 +- .../handler/nei/AssemblerRecipeHandler.java | 176 ---------- .../nei/AssemblyMachineRecipeHandler.java | 18 + .../nei/ChemicalPlantRecipeHandler.java | 9 +- .../handler/nei/ChemplantRecipeHandler.java | 236 ------------- .../handler/nei/NEIGenericRecipeHandler.java | 321 ++++++++++++++++++ .../hbm/handler/nei/NEIUniversalHandler.java | 10 +- .../recipes/AssemblyMachineRecipes.java | 19 +- .../recipes/loader/GenericRecipe.java | 5 +- src/main/java/com/hbm/items/ModItems.java | 7 + .../com/hbm/items/machine/ItemBlueprints.java | 2 +- .../items/machine/ItemChemistryTemplate.java | 1 - src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/NEIRegistry.java | 3 +- .../assets/hbm/textures/gui/nei/gui_nei.png | Bin 1635 -> 1741 bytes 16 files changed, 372 insertions(+), 441 deletions(-) delete mode 100644 src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java delete mode 100644 src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java diff --git a/changelog b/changelog index 07f6038d5..1b5ea3998 100644 --- a/changelog +++ b/changelog @@ -9,6 +9,7 @@ * Replace the journals * Instead of opening them and making a template, they act as a multi template * Blueprints need to remain in the slot, removing them will disable the recipes again + * Not actually part of worldgen yet - yeah i ran out of time, cry about it * More paintables * Paintable pneumatic tube * Behaves the exact same as a regular pneumatic tube @@ -38,6 +39,7 @@ * Chemical artillery shell recipes have now been moved to the assembler * The chemical plant and factory now scale their max power based on the recipe, similar to how the arc welder works * The chemical plant's default max power is now 100kHE again instead of 1MHE +* The NEI handlers for the old chemplant and assembler have been deactivated, however they will continue to function for the time being ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded diff --git a/gradle.properties b/gradle.properties index 681ea595b..70b2eaeea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5383 +mod_build_number=5397 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java deleted file mode 100644 index d3ddb9df0..000000000 --- a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.hbm.handler.nei; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; -import com.hbm.inventory.RecipesCommon.ComparableStack; -import com.hbm.inventory.gui.GUIMachineAssembler; -import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemAssemblyTemplate; -import com.hbm.lib.RefStrings; - -import codechicken.nei.NEIServerUtils; -import codechicken.nei.PositionedStack; -import codechicken.nei.recipe.TemplateRecipeHandler; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.item.ItemStack; - -public class AssemblerRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); - public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_assembler), - new ItemStack(ModBlocks.machine_assemfac)}; - } - - @Override - public String getRecipeID() { - return "assembly"; - } - - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { - - List input; - PositionedStack result; - - public SmeltingSet(List in, ItemStack result) { - - input = new ArrayList(); - - ComparableStack comp = new ComparableStack(result); - ItemStack template = ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template), comp); - - for(int i = 0; i < Math.min(in.size(), 12); i++) { - input.add(new PositionedStack(in.get(i), 30 + (i % 4) * 18, 6 + (i / 4) * 18)); - } - - input.add(new PositionedStack(template, 66 + 45, 6)); - this.result = new PositionedStack(result, 138, 24); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 48, input); - } - - @Override - public PositionedStack getResult() { - return result; - } - } - - @Override - public String getRecipeName() { - return "Assembly Machine"; - } - - @Override - public String getGuiTexture() { - return RefStrings.MODID + ":textures/gui/nei/gui_nei_assembler.png"; - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - - if ((outputId.equals("assembly")) && getClass() == AssemblerRecipeHandler.class) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - - if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getKey(), result)) - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } - - @Override - public void loadUsageRecipes(String inputId, Object... ingredients) { - - if ((inputId.equals("assembly")) && getClass() == AssemblerRecipeHandler.class) { - loadCraftingRecipes("assembly", new Object[0]); - } else { - super.loadUsageRecipes(inputId, ingredients); - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - - for(Object o : recipe.getValue()) { - - if(o instanceof ItemStack && NEIServerUtils.areStacksSameTypeCrafting((ItemStack)o, ingredient)) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - - } else if(o instanceof List) { - - for(Object obj : (List)o) { - - if(obj instanceof ItemStack && NEIServerUtils.areStacksSameTypeCrafting((ItemStack)obj, ingredient)) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } - } - } - } - } - - @Override - public Class getGuiClass() { - return null; - } - - @Override - public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); - - transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 36, 23, 36, 18), "assembly")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), "assembly")); - guiGui.add(GUIMachineAssembler.class); - RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); - } - - @Override - public void drawExtras(int recipe) { - - drawProgressBar(83 - (18 * 4) - 9 + 1, 6, 0, 86, 16, 18 * 3 - 2, 480, 7); - - drawProgressBar(83 - 3 + 16 + 5, 5 + 18, 16, 86, 36, 18, 48, 0); - } - - @Override - public TemplateRecipeHandler newInstance() { - return super.newInstance(); - } - -} diff --git a/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java new file mode 100644 index 000000000..288b74db5 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java @@ -0,0 +1,18 @@ +package com.hbm.handler.nei; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; + +public class AssemblyMachineRecipeHandler extends NEIGenericRecipeHandler { + + public AssemblyMachineRecipeHandler() { + super(ModBlocks.machine_assembly_machine.getLocalizedName(), AssemblyMachineRecipes.INSTANCE, ModBlocks.machine_assembly_machine); + } + + @Override public String getRecipeID() { return "ntmAssemblyMachine"; } + + @Override public int getInputXOffset(GenericRecipe recipe, int inputCount) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } + @Override public int getOutputXOffset(GenericRecipe recipe, int outputCount) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } + @Override public int getMachineXOffset(GenericRecipe recipe) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } +} diff --git a/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java index 47d77945b..8bca29e98 100644 --- a/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java @@ -3,14 +3,11 @@ package com.hbm.handler.nei; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.recipes.ChemicalPlantRecipes; -public class ChemicalPlantRecipeHandler extends NEIUniversalHandler { //TODO: make a new universal handler +public class ChemicalPlantRecipeHandler extends NEIGenericRecipeHandler { public ChemicalPlantRecipeHandler() { - super(ModBlocks.machine_chemical_plant.getLocalizedName(), ModBlocks.machine_chemical_plant, ChemicalPlantRecipes.getRecipes()); + super(ModBlocks.machine_chemical_plant.getLocalizedName(), ChemicalPlantRecipes.INSTANCE, ModBlocks.machine_chemical_plant, ModBlocks.machine_chemical_factory); } - @Override - public String getKey() { - return "ntmChemicalPlant"; - } + @Override public String getRecipeID() { return "ntmChemicalPlant"; } } diff --git a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java deleted file mode 100644 index b0b5e19a4..000000000 --- a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.hbm.handler.nei; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; -import com.hbm.inventory.FluidStack; -import com.hbm.inventory.RecipesCommon.AStack; -import com.hbm.inventory.gui.GUIMachineChemplant; -import com.hbm.inventory.recipes.ChemplantRecipes; -import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemFluidIcon; -import com.hbm.lib.RefStrings; - -import codechicken.nei.NEIServerUtils; -import codechicken.nei.PositionedStack; -import codechicken.nei.recipe.TemplateRecipeHandler; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.item.ItemStack; - -public class ChemplantRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); - public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_chemplant), - new ItemStack(ModBlocks.machine_chemfac)}; - } - - @Override - public String getRecipeID() { - return "chemistry"; - } - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { - - PositionedStack[] itemIn = new PositionedStack[4]; - PositionedStack[] fluidIn = new PositionedStack[2]; - PositionedStack[] itemOut = new PositionedStack[4]; - PositionedStack[] fluidOut = new PositionedStack[2]; - PositionedStack template; - - public RecipeSet(ChemRecipe recipe) { - - for(int i = 0; i < recipe.inputs.length; i++) { - AStack in = recipe.inputs[i]; - if(in == null) continue; - this.itemIn[i] = new PositionedStack(in.extractForNEI(), 30 + (i % 2) * 18, 24 + (i / 2) * 18); - } - - for(int i = 0; i < recipe.inputFluids.length; i++) { - FluidStack in = recipe.inputFluids[i]; - if(in == null) continue; - ItemStack drop = ItemFluidIcon.make(in); - this.fluidIn[i] = new PositionedStack(drop, 30 + (i % 2) * 18, 6); - } - - for(int i = 0; i < recipe.outputs.length; i++) { - ItemStack out = recipe.outputs[i]; - if(out == null) continue; - this.itemOut[i] = new PositionedStack(out, 120 + (i % 2) * 18, 24 + (i / 2) * 18); - } - - for(int i = 0; i < recipe.outputFluids.length; i++) { - FluidStack out = recipe.outputFluids[i]; - if(out == null) continue; - ItemStack drop = ItemFluidIcon.make(out); - this.fluidOut[i] = new PositionedStack(drop, 120 + (i % 2) * 18, 6); - } - - this.template = new PositionedStack(new ItemStack(ModItems.chemistry_template, 1, recipe.getId()), 84, 6); - } - - @Override - public List getIngredients() { - List stacks = new ArrayList(); - - for(PositionedStack stack : itemIn) if(stack != null) stacks.add(stack); - for(PositionedStack stack : fluidIn) if(stack != null) stacks.add(stack); - stacks.add(template); - - return getCycledIngredients(cycleticks / 20, stacks); - } - - @Override - public List getOtherStacks() { - List stacks = new ArrayList(); - - for(PositionedStack stack : itemOut) if(stack != null) stacks.add(stack); - for(PositionedStack stack : fluidOut) if(stack != null) stacks.add(stack); - stacks.add(template); - - return stacks; - } - - @Override - public PositionedStack getResult() { - return null; - } - } - - @Override - public String getRecipeName() { - return "Chemical Plant"; - } - - @Override - public String getGuiTexture() { - return RefStrings.MODID + ":textures/gui/nei/gui_nei_chemplant.png"; - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - - if((outputId.equals("chemistry")) && getClass() == ChemplantRecipeHandler.class) { - - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - this.arecipes.add(new RecipeSet(recipe)); - } - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - - outer: - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - - for(ItemStack out : recipe.outputs) { - - if(out != null && NEIServerUtils.areStacksSameTypeCrafting(result, out)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - - for(FluidStack out : recipe.outputFluids) { - - if(out != null) { - ItemStack drop = ItemFluidIcon.make(out.type, out.fill); - - if(compareFluidStacks(result, drop)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - } - - @Override - public void loadUsageRecipes(String inputId, Object... ingredients) { - if((inputId.equals("chemistry")) && getClass() == ChemplantRecipeHandler.class) { - loadCraftingRecipes("chemistry", new Object[0]); - } else { - super.loadUsageRecipes(inputId, ingredients); - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - - outer: - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - - for(AStack in : recipe.inputs) { - - if(in != null) { - List stacks = in.extractForNEI(); - - for(ItemStack stack : stacks) { - if(NEIServerUtils.areStacksSameTypeCrafting(ingredient, stack)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - - for(FluidStack in : recipe.inputFluids) { - - if(in != null) { - ItemStack drop = ItemFluidIcon.make(in.type, in.fill); - - if(compareFluidStacks(ingredient, drop)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - } - - private boolean compareFluidStacks(ItemStack sta1, ItemStack sta2) { - return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); - } - - @Override - public Class getGuiClass() { - return null; - } - - @Override - public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); - - transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 72, 23, 18 * 3, 18), "chemistry")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), "chemistry")); - guiGui.add(GUIMachineChemplant.class); - RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); - } - - @Override - public void drawExtras(int recipe) { - - drawProgressBar(83 - (18 * 4) - 9 + 1, 6, 0, 86, 16, 18 * 3 - 2, 480, 7); - drawProgressBar(83 - 3 + 16 + 5 - 36, 5 + 18, 16, 86, 18 * 3, 18, 48, 0); - } - - @Override - public TemplateRecipeHandler newInstance() { - return super.newInstance(); - } -} diff --git a/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java b/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java new file mode 100644 index 000000000..becbbad76 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java @@ -0,0 +1,321 @@ +package com.hbm.handler.nei; + +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.config.ClientConfig; +import com.hbm.handler.imc.ICompatNHNEI; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public abstract class NEIGenericRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList transferRectsGui = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + public LinkedList> guiGui = new LinkedList>(); + + public final String displayName; + public final GenericRecipes recipeSet; + public final ItemStack[] machines; + + public NEIGenericRecipeHandler(String displayName, GenericRecipes recipeSet, Block... machines) { + ItemStack[] machineStacks = new ItemStack[machines.length]; + for(int i = 0; i < machines.length; i++) machineStacks[i] = new ItemStack(machines[i]); + this.displayName = displayName; + this.recipeSet = recipeSet; + this.machines = machineStacks; + } + + public NEIGenericRecipeHandler(String displayName, GenericRecipes recipeSet, ItemStack... machines) { + this.displayName = displayName; + this.recipeSet = recipeSet; + this.machines = machines; + } + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + protected GenericRecipe recipe; + protected PositionedStack[] input; + protected PositionedStack[] output; + protected PositionedStack machine; + protected PositionedStack template; + + public RecipeSet(GenericRecipe recipe) { + this.recipe = recipe; + int inputSize = 0; + int outputSize = 0; + + if(recipe.inputItem != null) inputSize += recipe.inputItem.length; // sure a ternary is "less code" but is it more readable? no? thought so + if(recipe.inputFluid != null) inputSize += recipe.inputFluid.length; + if(recipe.outputItem != null) outputSize += recipe.outputItem.length; + if(recipe.outputFluid != null) outputSize += recipe.outputFluid.length; + + int inputOffset = getInputXOffset(recipe, inputSize); + int outputOffset = getOutputXOffset(recipe, outputSize); + int machineOffset = getMachineXOffset(recipe); + + this.input = new PositionedStack[inputSize]; + int[][] inPos = getInputSlotPositions(inputSize); + inputSize = 0; // just gonna reuse this because fuck it why not + + if(recipe.inputItem != null) for(int i = 0; i < recipe.inputItem.length; i++) { + this.input[i] = new PositionedStack(recipe.inputItem[i].extractForNEI(), inPos[i][0] + inputOffset, inPos[i][1]); + inputSize = i + 1; + } + if(recipe.inputFluid != null) for(int i = 0; i < recipe.inputFluid.length; i++) { + this.input[inputSize + i] = new PositionedStack(ItemFluidIcon.make(recipe.inputFluid[i]), inPos[inputSize + i][0] + inputOffset, inPos[inputSize + i][1]); + } + + int[][] outPos = getOutputSlotPositions(outputSize); + this.output = new PositionedStack[outputSize]; + outputSize = 0; + + if(recipe.outputItem != null) for(int i = 0; i < recipe.outputItem.length; i++) { + this.output[i] = new PositionedStack(recipe.outputItem[i].getAllPossibilities(), outPos[i][0] + outputOffset, outPos[i][1]); + outputSize = i + 1; + } + if(recipe.outputFluid != null) for(int i = 0; i < recipe.outputFluid.length; i++) { + this.output[outputSize + i] = new PositionedStack(ItemFluidIcon.make(recipe.outputFluid[i]), outPos[outputSize + i][0] + outputOffset, outPos[outputSize + i][1]); + } + + if(recipe.isPooled()) { + String[] pools = recipe.getPools(); + ItemStack[] blueprints = new ItemStack[pools.length]; + for(int i = 0; i < pools.length; i++) blueprints[i] = ItemBlueprints.make(pools[i]); + this.template = new PositionedStack(blueprints, 75 + machineOffset, 10); + } + + ItemStack[] machineStacks = getMachines(recipe); + this.machine = new PositionedStack(machineStacks, 75 + machineOffset, template == null ? 31 : 38); + } + + @Override public List getIngredients() { return getCycledIngredients(cycleticks / 20, Arrays.asList(this.input)); } + @Override public PositionedStack getResult() { return this.output[0]; } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + for(int i = 1; i < this.output.length; i++) other.add(this.output[i]); + other.add(this.machine); + if(this.template != null) other.add(this.template); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override public String getRecipeName() { return this.displayName; } + @Override public ItemStack[] getMachinesForRecipe() { return machines; } + @Override public String getGuiTexture() { return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; } + + public int getInputXOffset(GenericRecipe recipe, int inputCount) { return 0; } + public int getOutputXOffset(GenericRecipe recipe, int outputCount) { return 0; } + public int getMachineXOffset(GenericRecipe recipe) { return 0; } + public ItemStack[] getMachines(GenericRecipe recipe) { return this.machines; } + + // ✨ magic number vomit land ✨ + public int[][] getInputSlotPositions(int count) { + + if(count == 1) return new int[][] { {48, 24} }; + if(count == 2) return new int[][] { {30, 24}, {48, 24} }; + if(count == 3) return new int[][] { {12, 24}, {30, 24}, {48, 24} }; + if(count == 4) return new int[][] { {30, 15}, {48, 15}, {30, 33}, {48, 33} }; + if(count == 5) return new int[][] { {12, 15}, {30, 15}, {48, 15}, {12, 33}, {30, 33} }; + if(count == 6) return new int[][] { {12, 15}, {30, 15}, {48, 15}, {12, 33}, {30, 33}, {48, 33} }; + + int[][] slots = new int[count][2]; + int cols = (count + 2) / 3; + + for(int i = 0; i < count; i++) { + slots[i][0] = 12 + (i % cols) * 18 - (cols == 4 ? 18 : 0); + slots[i][1] = 6 + (i / cols) * 18; + } + + return slots; + } + + public int[][] getOutputSlotPositions(int count) { + switch(count) { + case 1: return new int[][] { + {102, 24} + }; + case 2: return new int[][] { + {102, 24}, + {120, 24} + }; + case 3: return new int[][] { + {102, 24}, + {120, 24}, + {138, 24} + }; + case 4: return new int[][] { + {102, 24 - 9}, + {120, 24 - 9}, + {102, 24 + 9}, + {120, 24 + 9} + }; + case 5: return new int[][] { + {102, 24 - 9}, {120, 24 - 9}, + {102, 24 + 9}, {120, 24 + 9}, + {138, 24}, + }; + case 6: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + }; + case 7: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + {138, 24}, + }; + case 8: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + {138, 24}, {138, 42}, + }; + } + return new int[count][2]; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hasMatch = false; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(hide && recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) { + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + } + if(recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) { + if(hide && ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) hasMatch = true; + } + if(recipe.outputFluid != null) for(FluidStack fluid : recipe.outputFluid) { + if(areItemsAndMetaEqual(ItemFluidIcon.make(fluid), result)) hasMatch = true; + } + + if(hasMatch) this.arecipes.add(new RecipeSet(recipe)); + } + } + + /** load all */ + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals(getRecipeID())) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(hide && recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(hide && recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + + this.arecipes.add(new RecipeSet(recipe)); + } + + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + if(inputId.equals(getRecipeID())) { + loadCraftingRecipes(getRecipeID(), new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hasMatch = false; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) { + if(hide && ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(NEIServerUtils.areStacksSameTypeCrafting(stack, ingredient)) hasMatch = true; + } + if(recipe.inputFluid != null) for(FluidStack fluid : recipe.inputFluid) { + if(areItemsAndMetaEqual(ItemFluidIcon.make(fluid), ingredient)) hasMatch = true; + } + if(hide && recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) { + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + } + + if(hasMatch) this.arecipes.add(new RecipeSet(recipe)); + } + } + + public static boolean areItemsAndMetaEqual(ItemStack sta1, ItemStack sta2) { + return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); + } + + @Override + public void loadTransferRects() { + transferRectsGui = new LinkedList(); + guiGui = new LinkedList>(); + transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getRecipeID())); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } + + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + + RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); + + for(PositionedStack pos : rec.input) drawTexturedModalRect(pos.relx - 1, pos.rely - 1, 5, 87, 18, 18); + for(PositionedStack pos : rec.output) drawTexturedModalRect(pos.relx - 1, pos.rely - 1, 5, 87, 18, 18); + + if(rec.template == null) { + drawTexturedModalRect(74 + this.getMachineXOffset(rec.recipe), 14, 59, 87, 18, 36); + } else { + drawTexturedModalRect(74 + this.getMachineXOffset(rec.recipe), 7, 77, 87, 18, 50); + } + } +} diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index d82303b6c..31274e626 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -25,11 +25,6 @@ import net.minecraft.item.ItemStack; public abstract class NEIUniversalHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return machine; - } - public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); @@ -119,6 +114,11 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler implemen return this.display; } + @Override + public ItemStack[] getMachinesForRecipe() { + return machine; + } + @Override public String getGuiTexture() { return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index a8444a256..472a33cc1 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -166,17 +166,17 @@ public class AssemblyMachineRecipes extends GenericRecipes { // decoration this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) - .inputItems(new ComparableStack(ModItems.cap_nuka, 128))); + .inputItems(new ComparableStack(ModItems.cap_nuka, 64), new ComparableStack(ModItems.cap_nuka, 64))); this.register(new GenericRecipe("ass.capquantum").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.QUANTUM)) - .inputItems(new ComparableStack(ModItems.cap_quantum, 128))); + .inputItems(new ComparableStack(ModItems.cap_quantum, 64), new ComparableStack(ModItems.cap_quantum, 64))); this.register(new GenericRecipe("ass.capsparkle").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.SPARKLE)) - .inputItems(new ComparableStack(ModItems.cap_sparkle, 128))); + .inputItems(new ComparableStack(ModItems.cap_sparkle, 64), new ComparableStack(ModItems.cap_sparkle, 64))); this.register(new GenericRecipe("ass.caprad").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.RAD)) - .inputItems(new ComparableStack(ModItems.cap_rad, 128))); + .inputItems(new ComparableStack(ModItems.cap_rad, 64), new ComparableStack(ModItems.cap_rad, 64))); this.register(new GenericRecipe("ass.capfritz").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.FRITZ)) - .inputItems(new ComparableStack(ModItems.cap_fritz, 128))); + .inputItems(new ComparableStack(ModItems.cap_fritz, 64), new ComparableStack(ModItems.cap_fritz, 64))); this.register(new GenericRecipe("ass.capkorl").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.KORL)) - .inputItems(new ComparableStack(ModItems.cap_korl, 128))); + .inputItems(new ComparableStack(ModItems.cap_korl, 64), new ComparableStack(ModItems.cap_korl, 64))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); @@ -330,7 +330,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.powder_magic, 64), new ComparableStack(ModItems.plate_dineutronium, 24), new ComparableStack(ModItems.ingot_u238m2), - new ComparableStack(ModItems.ingot_cft, 128))); + new ComparableStack(ModItems.ingot_cft, 64), + new ComparableStack(ModItems.ingot_cft, 64))); // fluid tanks this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) @@ -791,9 +792,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { for(int i = 1; i < order.length; ++i) { FluidType type = order[i]; if(type.hasNoContainer()) continue; - this.register(new GenericRecipe("ass.package" + type.getUnlocalizedName()).setup(100, 100).outputItems(new ItemStack(ModItems.fluid_pack_full, 1, type.getID())) + this.register(new GenericRecipe("ass.package" + type.getUnlocalizedName()).setup(40, 100).outputItems(new ItemStack(ModItems.fluid_pack_full, 1, type.getID())) .inputItems(new ComparableStack(ModItems.fluid_pack_empty)).inputFluids(new FluidStack(type, 32_000))); - this.register(new GenericRecipe("ass.unpackage" + type.getUnlocalizedName()).setup(100, 100).setIcon(ItemFluidIcon.make(type, 32_000)).outputItems(new ItemStack(ModItems.fluid_pack_empty)) + this.register(new GenericRecipe("ass.unpackage" + type.getUnlocalizedName()).setup(40, 100).setIcon(ItemFluidIcon.make(type, 32_000)).outputItems(new ItemStack(ModItems.fluid_pack_empty)) .inputItems(new ComparableStack(ModItems.fluid_pack_full, 1, type.getID())).outputFluids(new FluidStack(type, 32_000))); } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index eff9d27a8..264e67cda 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -37,9 +37,8 @@ public class GenericRecipe { this.name = name; } - public boolean isPooled() { - return blueprintPools != null; - } + public boolean isPooled() { return blueprintPools != null; } + public String[] getPools() { return this.blueprintPools; } public boolean isPartOfPool(String lookingFor) { if(!isPooled()) return false; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 41b783fc6..5724185f5 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1,5 +1,7 @@ package com.hbm.items; +import java.util.HashSet; + import com.hbm.blocks.ModBlocks; import com.hbm.config.VersatileConfig; import com.hbm.handler.BucketHandler; @@ -62,6 +64,8 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; public class ModItems { + + public static HashSet excludeNEI = new HashSet(); public static void mainRegistry() { initializeItem(); @@ -4984,6 +4988,9 @@ public class ModItems { } private static void registerItem() { + + excludeNEI.add(item_secret); + //Weapons GameRegistry.registerItem(redstone_sword, redstone_sword.getUnlocalizedName()); GameRegistry.registerItem(big_sword, big_sword.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java index 874cfd6f6..13254d6de 100644 --- a/src/main/java/com/hbm/items/machine/ItemBlueprints.java +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -133,7 +133,7 @@ public class ItemBlueprints extends Item { return stack.stackTagCompound.getString("pool"); } - public ItemStack make(String pool) { + public static ItemStack make(String pool) { ItemStack stack = new ItemStack(ModItems.blueprints); stack.stackTagCompound = new NBTTagCompound(); stack.stackTagCompound.setString("pool", pool); diff --git a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java index b310805b6..49db2a232 100644 --- a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java @@ -4,7 +4,6 @@ import java.util.List; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; -import com.hbm.items.ModItems; import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index f3db74449..57e7c9744 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5383)"; + public static final String VERSION = "1.0.27 BETA (5397)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 0ba8b15b4..4f0b96595 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -24,14 +24,13 @@ public class NEIRegistry { handlers.add(new GasCentrifugeRecipeHandler()); handlers.add(new BreederRecipeHandler()); handlers.add(new CyclotronRecipeHandler()); - handlers.add(new AssemblerRecipeHandler()); + handlers.add(new AssemblyMachineRecipeHandler()); handlers.add(new RefineryRecipeHandler()); handlers.add(new VacuumRecipeHandler()); handlers.add(new CrackingHandler()); handlers.add(new RadiolysisRecipeHandler()); handlers.add(new ReformingHandler()); handlers.add(new HydrotreatingHandler()); - handlers.add(new ChemplantRecipeHandler()); handlers.add(new ChemicalPlantRecipeHandler()); handlers.add(new OreSlopperHandler()); //before acidizing handlers.add(new CrystallizerRecipeHandler()); diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png index ecdd6955099a67f0b843ee7faf0434d12169e612..0cc1a42c414d8b07ec3f97c977d93a31b887cf95 100644 GIT binary patch delta 1441 zcmb7?e>~H99LGO43lA*DkTJgsCyz!pc6NRw>f+M*nIv{3j4MPWd@0T}n%ZNeA-{i4 zLT-Ljr&d=ZiMcXetvD8uvKVvg{_5X*KOXOY-mll|`FKCxkGD{Tr&@rAvJScK^Gz;U z5R63Y&F)ZGir{JGIQvBIkAgYii)JQh^~KC94rtNu*R`g6TyU-1G1Ux<-U>n=b+N`w zLa~Tt`be|?6on}}+^Nngp};D96}r?3G21VvC-)t1>1em9N^>+&+wEb4+m8Dn5k&Zt zL=)zrnqh(J&C56U3E0s1#|{ZW8??{!PYmwWb<6YYUrgN$NIGnl+tCe#8Wis+i|CHj zW|D^KvI*Z0U(gZQU#RWhY03UJi0Veg*|u&ri45sX9sK%{3-{!&U>#C?J*=0upgZ=ZikN=ig>GeX7uwBQtV1G^TD!XgT?ly^ zz;Y^N+`;c(1=)?0T0!r4pHOVf?rD~|h4AKtD3o}UT}6D9~-WCK@MHe@c} zxD(U|d1=N;Ru_o&_LrGVCY72jI?fF_f^;$a*+|Yge3-L7GQDYdE4U9z*`N(<*p}(( zosnwTXHpb_)*_EHom*)hy7@=D|CZ!cno0j!mG}s~Yn}7TEz7f<0?Wvje0&tKJU1IM z#JDtT_oe9InW6S1Cn}X%RaK>JpD9@A`0{B5M`5R~Damk{7KnsIO7(kQMvru?sdGyQ zSx$~Udc@REO_KsBm?pCa3?$($yizmCUF^(_Y}mP`tQX-={$*KMW8iVuACo<8l6 zXVAZLP8B`-x-`Qwh}3^MVmWYXDkWJLc5_1t6)mrXY|Y&nrxPzQws_4s>gsWjC}m@< zWvjknUQZq{Be_RqlXYdI*k|(xT{qrDKvb$QABsoPc7ggQ)oR43&nCn605f0@%W%)n z8I&<*%a$SUvx#epz#_>}e(}r+abAcCgeccCGa|3>Jro9A7T&)fnw}08gsWNIucjaU zc$JLz<{rGr9NxvKfLk;25lBV`0`pBPK+Rr5|706Xcq#P`DJv6<0}Dk#FE$@J*)`xj zq4;f9bea5CG|Zm-*x4!3OL_K5`U&M4oK98a(+|HXx zTh&+DHY)o3W?9Is$%7|)@Z~^+E*b(7i6mbK-WKT#TovW&y@fEt${j|At`EzvY0Kf- zidV&Avwr&Deh+Tg9`KvpKSpSSN1{r>WA-&9c_LzTh4t%;?{S#uLhA=~R?QxnP=8h5 zc?XO4TXs?O6ehFr#YT7{Dz=!=2#d8P$0-Xnc2%RM%KhsoS_>F(~F4B5u+Xi(}|N8onVy`mp5 zxoJ7%{bQ06C{bs`A`H--APL=ODL;tlYAOgXm_JqC*43oO7)6}Z)_o1JmtY#?_qZ4! Ot3z&{uD4vs7ykvcqOw!~ delta 1302 zcmV+x1?l?D4dV=uG=CaNL_t(|obBAtYaHhp2k>Xj7KcDnXhTT~Jv5i*){CeaNynao zbz4je?kS;{*oO^!Q-wFQrWet@^kiR61+H?+zYuxxt$`d`QbJBOfl#W0+=v>s2Sq=; z+O5~x*_qKkpARgHq?wn8m-qedGrOy4jUq-drWMf|{~grLT7NBHyI*qwFspvu1uUac z#OU~O=iBGHYl2Cv)dd)zP?JhiS*zu1-I*|nAG)rhfvnZ?wY;&yWnrzBuidY?0GL(3 z?gEz3m59@c?N2=nnxQ}T%zRt|aA{bpWAuGC!s6h#q5QN+r-AC=NEFgpQ2ZF;@l$;MxK_oIl2*!VyQR7n6(xuPiI_U+qo zcz75qD=QHZ@#goA9#8f|Cr}{)KxNLh`p@2eKdxTAdVlnXPyY~4_K!CIF`Ym)1ON;7 z`kQY>Q53Q9!D*}i;~%~j-~HKpC&yg<+aDuBCr~v3z`}j~%-UL z+1u|&M8x6Y;kiy=XKOt^|MIIED_?#BfQ9?ctKX0P{eQ>K*7|d8e#B8H@cPeBF9!}D z{Wf;C)_-GXYdtn@-HSJV@M;Ye=OF-Cxc@%=S42c?+`4xX0^^;)!B5_cgM)*U<2G*H ziwAda#NWU8XPu=lJpsVNJ&RZ3KTn^=gS$7L3xQ)hTkG+c-@kM6^MkuL;=$b;adY!w z{Pe9K)lhLBz6r>}wd0$37O%w3&4(u;@bRC16Mw(@-6tole#GgQ{BLePjEIQ)o7dy7 zpZ%kzs&fzkRH7Z<#Qn|d=R)AP)sKky^)LS%5l0*U_#75X08p7pA#mL4N1S#5Hhy&k z0F@dKft#BT&%EOQqUP%I5dc)~YzW-nyzUjhMm`0g7RMoA^VdrUz(Q?rZ^!QLZrx=t z#SWy~E4d{YjkM~PV5M^jld%INlb-`Nlb-`Nlb-_ye^_f2F*^6lIx2w|IJZzEqGh?x zrQM(Wdy`7z^e1Nk^B6^pjvsfveXhGEn8aFLfbj`6sWg?fTE5nu36uDtO8^?kS}otS zHvvs5jbp8ruidY?0GL(3?gEz3m59@c?N2=nnxQ}T%zRt|aA{bp1<{c&?B8sAzdyL_5IM}yuTcT8x3|}bF(8XZ1we!le}F1AE&w8$5duPl45oezSf-0?roFwr ziQgl5nX#sgQPug-bdBr)nnWkSGOMHmnDtfk>}H#G&WpyHWsLFTW~oajz%puN2T;al zvti-ID(L`TMpc`?tWE+hvqp6QO?>6I`B`R-3V^1u`B`=XU<#X`3eBSpaU)~r3!%Ia2Q2VT=@KMw;O}O zpu~!xUa0~g;^H?KvH4j>jk_&)6$XRBONW5X50gO#b(2sA4;L5oKU??68jX_G%m4rY M07*qoM6N<$f_*=cAOHXW From 9d558a68f3317652b76ae78225f6759586069a4f Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Tue, 22 Jul 2025 18:42:21 +0800 Subject: [PATCH 126/323] =?UTF-8?q?=F0=9F=98=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/assets/hbm/lang/zh_CN.lang | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 92a56b5b8..14a8c62b0 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -2603,7 +2603,7 @@ item.fleija_igniter.name=脉冲点火器 item.fleija_kit.name=F.L.E.I.J.A. 套件 item.fleija_propellant.name=Sa326炸药 item.fluid_barrel_empty.name=空流体桶 -item.fluid_barrel_full.name=流体桶: +item.fluid_barrel_full.name=流体桶: %s item.fluid_barrel_infinite.name=无限流体桶 item.fluid_duct.name=流体管道: item.fluid_identifier.name=流体识别码 @@ -2615,9 +2615,9 @@ item.fluid_identifier_multi.name=多类型流体识别码 item.fluid_identifier_multi.info=通用流体识别码: item.fluid_identifier_multi.info2=次要类型: item.fluid_tank_empty.name=空通用流体罐 -item.fluid_tank_full.name=通用流体罐: +item.fluid_tank_full.name=通用流体罐: %s item.fluid_tank_lead_empty.name=空危险品罐 -item.fluid_tank_lead_full.name=危险品罐: +item.fluid_tank_lead_full.name=危险品罐:%s item.fluorite.name=氟石粉 item.flywheel_beryllium.name=铍制飞轮 item.fmn.name=氟硝西泮片 @@ -6105,3 +6105,7 @@ tile.logic_block.name=地牢逻辑砖块 tile.trapdoor_steel.name=钢活板门 tile.machine_assembly_machine.name=装配机 tile.wand_logic.name=结构魔杖方块(逻辑) +item.fluid_pack_empty.name=大型流体容器 +item.fluid_pack_full.name=流体包装 %s +tile.pneumatic_tube_paintable.name=可涂漆气动物流管道 +tile.oc_cable_paintable.name=可涂漆网线 From 2f74d178232052d10161e26eeb48eec94898f601 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 22 Jul 2025 23:17:59 +0200 Subject: [PATCH 127/323] pouring out the conk --- changelog | 58 +-- src/main/java/com/hbm/blocks/ModBlocks.java | 6 + .../com/hbm/blocks/generic/BlockRebar.java | 404 ++++++++++++++++++ .../com/hbm/blocks/rail/IRenderBlock.java | 1 + .../java/com/hbm/config/ClientConfig.java | 2 + .../java/com/hbm/crafting/ToolRecipes.java | 4 + .../java/com/hbm/inventory/fluid/Fluids.java | 5 +- .../inventory/recipes/AssemblerRecipes.java | 56 +-- .../recipes/AssemblyMachineRecipes.java | 14 +- .../recipes/ChemicalPlantRecipes.java | 9 +- .../recipes/loader/GenericRecipe.java | 2 +- .../com/hbm/itempool/ItemPoolsComponent.java | 6 +- .../com/hbm/itempool/ItemPoolsLegacy.java | 4 +- .../com/hbm/itempool/ItemPoolsRedRoom.java | 1 + .../com/hbm/itempool/ItemPoolsSingle.java | 1 + src/main/java/com/hbm/items/ModItems.java | 12 +- .../items/machine/ItemBlueprintFolder.java | 72 ++++ .../com/hbm/items/machine/ItemCatalyst.java | 6 - .../java/com/hbm/main/CraftingManager.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 3 + .../com/hbm/main/ModEventHandlerClient.java | 9 +- .../com/hbm/render/util/HorsePronter.java | 2 +- .../java/com/hbm/tileentity/TileMappings.java | 3 + src/main/java/com/hbm/uninos/NodeNet.java | 4 +- .../PneumaticNetworkProvider.java | 2 +- .../uninos/networkproviders/RebarNetwork.java | 9 + .../RebarNetworkProvider.java | 13 + src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../hbm/textures/blocks/concrete_rebar.png | Bin 0 -> 599 bytes .../textures/blocks/concrete_rebar_alt.png | Bin 0 -> 652 bytes .../assets/hbm/textures/blocks/rebar.png | Bin 0 -> 824 bytes .../assets/hbm/textures/blocks/rebar_base.png | Bin 0 -> 806 bytes .../hbm/textures/gui/fluids/concrete.png | Bin 0 -> 646 bytes .../hbm/textures/items/assembly_nuke.png | Bin 359 -> 415 bytes .../hbm/textures/items/blueprint_folder.png | Bin 0 -> 306 bytes .../items/blueprint_folder_discover.png | Bin 0 -> 301 bytes .../items/blueprint_folder_secret.png | Bin 0 -> 270 bytes .../textures/models/tank/tank_CONCRETE.png | Bin 0 -> 5002 bytes 39 files changed, 588 insertions(+), 129 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockRebar.java create mode 100644 src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java create mode 100644 src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java create mode 100644 src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/rebar.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/rebar_base.png create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/concrete.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprint_folder.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_CONCRETE.png diff --git a/changelog b/changelog index 1b5ea3998..958bb0f23 100644 --- a/changelog +++ b/changelog @@ -1,52 +1,16 @@ ## Added -* New assembler - * Features a brand new animated model, GUI and the new recipe selection system - * Many recipes have been reworked, with the microcrafting complexity reduced - * The redcoil didn't get a recipe. It's gonna die soon. - * Neither did the schrabidium transmutator - * Balls-o-tron's spawner can now be made without a worm coin, using a silver key instead. This means that, while expensive, it's possible to summon him without finding a jungle dungeon -* Blueprins - * Replace the journals - * Instead of opening them and making a template, they act as a multi template - * Blueprints need to remain in the slot, removing them will disable the recipes again - * Not actually part of worldgen yet - yeah i ran out of time, cry about it -* More paintables - * Paintable pneumatic tube - * Behaves the exact same as a regular pneumatic tube - * Can also be used as in and outputs - * Full block - * Paintable OpenComputers cable - * Only enabled if OpenComputers is installed - * Full block - * Also supports OC wire colors +* Blueprint booklets + * Can be found in worldgen + * Using it will create one random blueprint of the same type as the booklet +* Liquid concrete + * It's conk but liquid +* Rebar + * When hooked up to liquid concrete using pipes, will fill to create reinforced concrete + * Fills bottom to top, so connect the pipes to the top ## Changed -* Updated chinese and ukrainian localization -* Removed levitation unit -* Many of NTM's regular building blocks now have forge microblock support -* RBMK crane models now conform to the dimensions of the room they're in -* Projectile resistance for armor has been renamed to "physical" and now also extends to all direct forms of attack by other entities that don't fall into any other categories (mostly melee attacks) - * This should fix the issue where most armors are quite weak against swords -* Electric attacks (i.e. tesla cannon) are now in the "energy damage" category - * This means that armors that have energy resistance actually properly work against the tesla cannon -* Heavy components are being deprecated -* Flow control pumps can now be interfaced with OpenComputers -* The electrolyzer now remembers the last visited GUI screen -* Retextured many fluid containers such as universal tanks, canisters and gas tanks -* Removed the legacy assembler and chemical plant recipes from the template folder -* Removed journals from various loot pools -* Drinking whiskey now gives strength III, resistance III and nausea -* Chemical artillery shell recipes have now been moved to the assembler -* The chemical plant and factory now scale their max power based on the recipe, similar to how the arc welder works -* The chemical plant's default max power is now 100kHE again instead of 1MHE -* The NEI handlers for the old chemplant and assembler have been deactivated, however they will continue to function for the time being +* The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints ## Fixed -* Fixed gas centrifuge sound persisting when broken or when unloaded -* Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots -* Fixed guns that don't have durability always displaying a condition of 0% -* Fixed GL state leak caused by skeletons -* Fixed OpenComputers integration for the CCGT -* Fixed rotated RBMK consoles not behaving correctly when trying to change rod insertion levels -* Fixed crash caused by piston inserters on servers -* Fixed flare gun not having a firing sound +* Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit + * As an extra safeguard, the recipe loader now throws an exception if that happens \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 0a6cf6f64..1b7dd0f7d 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -315,12 +315,14 @@ public class ModBlocks { public static Block floodlight; public static Block floodlight_beam; + public static Block rebar; public static Block reinforced_stone; public static Block concrete_smooth; public static Block concrete_colored; public static Block concrete_colored_ext; public static Block concrete; public static Block concrete_asbestos; + public static Block concrete_rebar; public static Block concrete_super; public static Block concrete_super_broken; public static Block ducrete_smooth; @@ -1524,12 +1526,14 @@ public class ModBlocks { floodlight = new Floodlight(Material.iron).setBlockName("floodlight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); floodlight_beam = new FloodlightBeam().setBlockName("floodlight_beam"); + rebar = new BlockRebar().setBlockName("rebar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":rebar"); reinforced_stone = new BlockGeneric(Material.rock).setBlockName("reinforced_stone").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_stone"); concrete_smooth = new BlockRadResistant(Material.rock).setBlockName("concrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored = new BlockConcreteColored(Material.rock).setBlockName("concrete_colored").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored_ext = new BlockConcreteColoredExt(Material.rock).setBlockName("concrete_colored_ext").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete_colored_ext"); concrete = new BlockGeneric(Material.rock).setBlockName("concrete").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete_tile"); concrete_asbestos = new BlockGeneric(Material.rock).setBlockName("concrete_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(150.0F).setBlockTextureName(RefStrings.MODID + ":concrete_asbestos"); + concrete_rebar = new BlockGeneric(Material.rock).setBlockName("concrete_rebar").setCreativeTab(MainRegistry.blockTab).setHardness(50.0F).setResistance(240.0F).setBlockTextureName(RefStrings.MODID + ":concrete_rebar"); concrete_super = new BlockUberConcrete().setBlockName("concrete_super").setCreativeTab(MainRegistry.blockTab).setHardness(150.0F).setResistance(1000.0F); concrete_super_broken = new BlockFalling(Material.rock).setBlockName("concrete_super_broken").setCreativeTab(MainRegistry.blockTab).setHardness(10.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":concrete_super_broken"); concrete_pillar = new BlockRotatablePillar(Material.rock, RefStrings.MODID + ":concrete_pillar_top").setBlockName("concrete_pillar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(180.0F).setBlockTextureName(RefStrings.MODID + ":concrete_pillar_side"); @@ -2701,6 +2705,7 @@ public class ModBlocks { GameRegistry.registerBlock(reinforced_laminate_pane,ItemBlockBlastInfo.class, reinforced_laminate_pane.getUnlocalizedName()); //Bricks + register(rebar); GameRegistry.registerBlock(reinforced_stone, ItemBlockBlastInfo.class, reinforced_stone.getUnlocalizedName()); GameRegistry.registerBlock(reinforced_ducrete, ItemBlockBlastInfo.class, reinforced_ducrete.getUnlocalizedName()); GameRegistry.registerBlock(concrete_smooth, ItemBlockBlastInfo.class, concrete_smooth.getUnlocalizedName()); @@ -2708,6 +2713,7 @@ public class ModBlocks { GameRegistry.registerBlock(concrete_colored_ext, ItemBlockBlastInfo.class, concrete_colored_ext.getUnlocalizedName()); GameRegistry.registerBlock(concrete, ItemBlockBlastInfo.class, concrete.getUnlocalizedName()); GameRegistry.registerBlock(concrete_asbestos, ItemBlockBlastInfo.class, concrete_asbestos.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_rebar, ItemBlockBlastInfo.class, concrete_rebar.getUnlocalizedName()); GameRegistry.registerBlock(concrete_super, ItemBlockBlastInfo.class, concrete_super.getUnlocalizedName()); GameRegistry.registerBlock(concrete_super_broken, ItemBlockBlastInfo.class, concrete_super_broken.getUnlocalizedName()); GameRegistry.registerBlock(ducrete_smooth, ItemBlockBlastInfo.class, ducrete_smooth.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockRebar.java b/src/main/java/com/hbm/blocks/generic/BlockRebar.java new file mode 100644 index 000000000..67b9f13c7 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockRebar.java @@ -0,0 +1,404 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.config.ClientConfig; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.lib.Library; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.ISBRHUniversal; +import com.hbm.render.util.RenderBlocksNT; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.uninos.GenNode; +import com.hbm.uninos.INetworkProvider; +import com.hbm.uninos.UniNodespace; +import com.hbm.uninos.networkproviders.RebarNetwork; +import com.hbm.uninos.networkproviders.RebarNetworkProvider; +import com.hbm.util.BobMathUtil; +import com.hbm.util.Compat; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluidmk2.IFluidReceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockRebar extends BlockContainer implements ISBRHUniversal { + + @SideOnly(Side.CLIENT) protected IIcon concrete; + + public BlockRebar() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.concrete = reg.registerIcon(RefStrings.MODID + ":concrete_liquid"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRebar(); + } + + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityRebar)) return; + + TileEntityRebar rebar = (TileEntityRebar) tile; + rebar.hasConnection = false; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + TileEntity neighbor = Compat.getTileStandard(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + if(neighbor instanceof TileEntityPipeBaseNT) { + rebar.hasConnection = true; + return; + } + } + } + + public static class TileEntityRebar extends TileEntityLoadedBase implements IFluidReceiverMK2, IBufPacketReceiver { + + public int progress; + public int prevProgress; + protected RebarNode node; + public boolean hasConnection = false; + + @Override + public void updateEntity() { + + long time = worldObj.getTotalWorldTime(); + + if(!worldObj.isRemote) { + + if(prevProgress != progress) { + worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); + prevProgress = progress; + } + + if(this.progress >= 1_000) { + worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.concrete_rebar); + return; + } + + if(time % 60 == 0) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + this.trySubscribe(Fluids.CONCRETE, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } + } + + if(this.node == null || this.node.expired) { + + this.node = (RebarNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + UniNodespace.createNode(worldObj, this.node); + } + } + + this.networkPackNT(100); + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER); + } + } + } + + @Override public void serialize(ByteBuf buf) { buf.writeInt(progress); } + @Override public void deserialize(ByteBuf buf) { this.progress = buf.readInt(); } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.progress = nbt.getInteger("progress"); + this.hasConnection = nbt.getBoolean("hasConnection"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("progress", this.progress); + nbt.setBoolean("hasConnection", this.hasConnection); + } + + public RebarNode createNode() { + TileEntity tile = (TileEntity) this; + return new RebarNode(RebarNetworkProvider.THE_PROVIDER, new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(tile.xCoord + 1, tile.yCoord, tile.zCoord, Library.POS_X), + new DirPos(tile.xCoord - 1, tile.yCoord, tile.zCoord, Library.NEG_X), + new DirPos(tile.xCoord, tile.yCoord + 1, tile.zCoord, Library.POS_Y), + new DirPos(tile.xCoord, tile.yCoord - 1, tile.zCoord, Library.NEG_Y), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord + 1, Library.POS_Z), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord - 1, Library.NEG_Z) + ); + } + + @Override + public FluidTank[] getAllTanks() { + FluidTank tank = new FluidTank(Fluids.CONCRETE, 1_000); + tank.setFill(progress); + return new FluidTank[] {tank}; + } + + @Override + public long transferFluid(FluidType type, int pressure, long amount) { + if(type != Fluids.CONCRETE) return amount; + if(this.node == null || this.node.expired || !this.node.hasValidNet()) return amount; + + List lowestLinks = new ArrayList(); + int lowestY = 256; + int progress = 0; + int capacity = 0; + + for(Object o : this.node.net.links) { + RebarNode node = (RebarNode) o; + int y = node.positions[0].getY(); //rebar can only have one pos, there's no multiblock rebar + + if(y < lowestY) { + lowestY = y; + progress = 0; + capacity = 0; + lowestLinks.clear(); + } + + if(y == lowestY) { + TileEntity tile = worldObj.getTileEntity(node.positions[0].getX(), y, node.positions[0].getZ()); + if(!(tile instanceof TileEntityRebar)) continue; + + TileEntityRebar rebar = (TileEntityRebar) tile; + + progress += rebar.progress; + capacity += 1_000; + lowestLinks.add(rebar); + } + } + + if(capacity > 0 && !lowestLinks.isEmpty()) { + int maxSpeed = 50; + int maxAccept = (int) BobMathUtil.min(capacity - progress, amount, maxSpeed * lowestLinks.size()); + int target = Math.min((progress + maxAccept) / lowestLinks.size(), 1_000); + + for(TileEntityRebar rebar : lowestLinks) { + if(rebar.progress >= target) continue; + int delta = target - rebar.progress; + if(delta > amount) continue; + + rebar.progress += delta; + amount -= delta; + } + } + + return amount; + } + + @Override + public long getDemand(FluidType type, int pressure) { + return 10_000; + } + } + + public static class RebarNode extends GenNode { + + public RebarNode(INetworkProvider provider, BlockPos... positions) { + super(provider, positions); + } + + @Override + public RebarNode setConnections(DirPos... connections) { + super.setConnections(connections); + return this; + } + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) { + + GL11.glPushMatrix(); + RenderBlocks renderer = (RenderBlocks) renderBlocks; + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + double o = 0.25D; + renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D - o, 0.5625D - o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D + o, 0.5625D - o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D - o, 0.5625D + o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D + o, 0.5625D + o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D - o, 1D, 0.5625D - o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D + o, 1D, 0.5625D - o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D - o, 1D, 0.5625D + o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D + o, 1D, 0.5625D + o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + renderer.setRenderBounds(0.4375D - o, 0.4375D - o, 0D, 0.5625D - o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D - o, 0.4375D + o, 0D, 0.5625D - o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0.4375D - o, 0D, 0.5625D + o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0.4375D + o, 0D, 0.5625D + o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks) { + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + + double o = 0.25D; + double min = -0.001; + double max = 1.001; + + if(ClientConfig.RENDER_REBAR_SIMPLE.get()) { + renderer.setRenderBounds(0.4375D, min, 0.4375D, 0.5625D, max, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D, 0.4375D, max, 0.5625D, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D, 0.4375D, min, 0.5625D, 0.5625D, max); renderer.renderStandardBlock(block, x, y, z); + } else { + renderer.setRenderBounds(0.4375D - o, min, 0.4375D - o, 0.5625D - o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D - o, min, 0.4375D + o, 0.5625D - o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, min, 0.4375D - o, 0.5625D + o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, min, 0.4375D + o, 0.5625D + o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + + renderer.setRenderBounds(min, 0.4375D - o, 0.4375D - o, max, 0.5625D - o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D - o, 0.4375D + o, max, 0.5625D - o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D + o, 0.4375D - o, max, 0.5625D + o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D + o, 0.4375D + o, max, 0.5625D + o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + + renderer.setRenderBounds(0.4375D - o, 0.4375D - o, min, 0.5625D - o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D - o, 0.4375D + o, min, 0.5625D - o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, 0.4375D - o, min, 0.5625D + o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, 0.4375D + o, min, 0.5625D + o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z); + } + + /*TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityRebar) { + TileEntityRebar rebar = (TileEntityRebar) tile; + if(rebar.progress > 0) { + double height = rebar.progress / 1000D; + renderer.setOverrideBlockTexture(concrete); + renderer.setRenderBounds(0, 0, 0, 1, height, 1); renderer.renderStandardBlock(block, x, y, z); + renderer.clearOverrideBlockTexture(); + } + }*/ + + return true; + } + + // from ModEventHandlerClient.onRenderWorldLastEvent + @SideOnly(Side.CLIENT) + public static void renderRebar(List tiles, float interp) { + + List rebars = new ArrayList(); + for(Object o : tiles) { + if(!(o instanceof TileEntityRebar)) continue; + TileEntityRebar rebar = (TileEntityRebar) o; + if(rebar.progress > 0) rebars.add(rebar); + } + + if(!rebars.isEmpty()) { + + GL11.glPushMatrix(); + GL11.glShadeModel(GL11.GL_SMOOTH); + //RenderHelper.enableStandardItemLighting(); + + EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer; + entityRenderer.enableLightmap(interp); + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + World world = Minecraft.getMinecraft().theWorld; + + double dx = player.prevPosX + (player.posX - player.prevPosX) * interp; + double dy = player.prevPosY + (player.posY - player.prevPosY) * interp; + double dz = player.prevPosZ + (player.posZ - player.prevPosZ) * interp; + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + renderer.setOverrideBlockTexture(((BlockRebar) ModBlocks.rebar).concrete); + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + for(TileEntityRebar rebar : rebars) { + tess.setTranslation(-dx, -dy, -dz); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + renderer.setRenderBounds(0, 0, 0, 1, rebar.progress / 1000D, 1); + renderer.renderStandardBlock(ModBlocks.rebar, rebar.xCoord, rebar.yCoord, rebar.zCoord); + + /*IIcon icon = ((BlockRebar) ModBlocks.rebar).concrete; + double minU = icon.getInterpolatedU(renderer.renderMinX * 16.0D); + double maxU = icon.getInterpolatedU(renderer.renderMaxX * 16.0D); + double minV = icon.getInterpolatedV(renderer.renderMinZ * 16.0D); + double maxV = icon.getInterpolatedV(renderer.renderMaxZ * 16.0D); + + double minX = rebar.xCoord + renderer.renderMinX; + double maxX = rebar.xCoord + renderer.renderMaxX; + double minY = rebar.yCoord + renderer.renderMinY; + double maxY = rebar.yCoord + renderer.renderMaxY; + double minZ = rebar.zCoord + renderer.renderMinZ; + double maxZ = rebar.zCoord + renderer.renderMaxZ; + + //tess.setColorOpaque_F(0.5F, 1F, 1F); + tess.setNormal(0, 1, 0); + tess.addVertexWithUV(maxX, maxY, maxZ, maxU, maxV); + tess.addVertexWithUV(maxX, maxY, minZ, maxU, minV); + tess.addVertexWithUV(minX, maxY, minZ, minU, minV); + tess.addVertexWithUV(minX, maxY, maxZ, minU, maxV);*/ + } + + tess.draw(); + tess.setTranslation(0, 0, 0); + renderer.clearOverrideBlockTexture(); + entityRenderer.disableLightmap(interp); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/com/hbm/blocks/rail/IRenderBlock.java b/src/main/java/com/hbm/blocks/rail/IRenderBlock.java index 7cf90e9fd..f8b75055e 100644 --- a/src/main/java/com/hbm/blocks/rail/IRenderBlock.java +++ b/src/main/java/com/hbm/blocks/rail/IRenderBlock.java @@ -7,6 +7,7 @@ import net.minecraft.block.Block; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; +@Deprecated public interface IRenderBlock { public static int renderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index 1ddd4cf21..0dc370790 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -32,6 +32,7 @@ public class ClientConfig extends RunningConfig { public static ConfigWrapper RENDER_REEDS = new ConfigWrapper(!Compat.isModLoaded(Compat.MOD_ANG)); public static ConfigWrapper NEI_HIDE_SECRETS = new ConfigWrapper(true); public static ConfigWrapper COOLING_TOWER_PARTICLES = new ConfigWrapper(true); + public static ConfigWrapper RENDER_REBAR_SIMPLE = new ConfigWrapper(false); private static void initDefaults() { configMap.put("GEIGER_OFFSET_HORIZONTAL", GEIGER_OFFSET_HORIZONTAL); @@ -53,6 +54,7 @@ public class ClientConfig extends RunningConfig { configMap.put("RENDER_REEDS", RENDER_REEDS); configMap.put("NEI_HIDE_SECRETS", NEI_HIDE_SECRETS); configMap.put("COOLING_TOWER_PARTICLES", COOLING_TOWER_PARTICLES); + configMap.put("RENDER_REBAR_SIMPLE", RENDER_REBAR_SIMPLE); } /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index b01ee10cf..d8d52b0ce 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -160,6 +160,10 @@ public class ToolRecipes { //Bobmazon CraftingManager.addShapelessAuto(new ItemStack(ModItems.bobmazon), new Object[] { Items.book, Items.gold_nugget, Items.string, KEY_BLUE }); + //Blueprints + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.blueprint_folder, 1, 0), new Object[] { ModItems.blueprints, ModItems.blueprints, ModItems.blueprints }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.blueprint_folder, 1, 1), new Object[] { ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.fragment_meteorite }); + //Carts CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.WOOD, EnumMinecart.EMPTY), new Object[] { "P P", "WPW", 'P',KEY_SLAB, 'W', KEY_PLANKS }); CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.STEEL, EnumMinecart.EMPTY), new Object[] { "P P", "IPI", 'P', STEEL.plate(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index cadd39969..b020867c4 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -190,6 +190,7 @@ public class Fluids { public static FluidType SODIUM_ALUMINATE; public static FluidType BAUXITE_SOLUTION; public static FluidType ALUMINA; + public static FluidType CONCRETE; /* Lagacy names for compatibility purposes */ @Deprecated public static FluidType ACID; //JAOPCA uses this, apparently @@ -405,7 +406,8 @@ public class Fluids { SODIUM_ALUMINATE = new FluidType("SODIUM_ALUMINATE", 0xFFD191, 3, 0, 1, EnumSymbol.ACID).addTraits(new FT_Corrosive(30), LIQUID); BAUXITE_SOLUTION = new FluidType("BAUXITE_SOLUTION", 0xE2560F, 3, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(40), LIQUID, VISCOUS); ALUMINA = new FluidType("ALUMINA", 0xDDFFFF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); - AIR = new FluidType(151, "AIR", 0xE7EAEB, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS); + AIR = new FluidType("AIR", 0xE7EAEB, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS); + CONCRETE = new FluidType(152, "CONCRETE", 0xA2A2A2, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE @@ -553,6 +555,7 @@ public class Fluids { metaOrder.add(SODIUM_ALUMINATE); metaOrder.add(BAUXITE_SOLUTION); metaOrder.add(ALUMINA); + metaOrder.add(CONCRETE); //solutions and working fluids metaOrder.add(FRACKSOL); metaOrder.add(LYE); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 1960d4dfb..476cb5e31 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -26,8 +26,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.Mats; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; -import com.hbm.items.ItemEnums.EnumCasingType; -import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; @@ -36,7 +34,6 @@ import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; -import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.Loader; @@ -98,7 +95,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.warhead_volcano, 1), new AStack[] {new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()) }, 600); makeRecipe(new ComparableStack(ModItems.missile_stealth, 1), new AStack[] { new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(CU.plate(), 10), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32) },1200); makeRecipe(new ComparableStack(ModItems.thruster_nuclear, 1), new AStack[] {new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel) },600); - makeRecipe(new ComparableStack(ModItems.tritium_deuterium_cake, 1), new AStack[] {new ComparableStack(ModItems.cell_deuterium, 6), new ComparableStack(ModItems.cell_tritium, 2), new OreDictStack(LI.ingot(), 4), },150); makeRecipe(new ComparableStack(ModItems.pellet_cluster, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new ComparableStack(Blocks.tnt, 1), }, 50); makeRecipe(new ComparableStack(ModItems.pellet_buckshot, 1), new AStack[] {new OreDictStack(PB.nugget(), 6), }, 50); makeRecipe(new ComparableStack(ModItems.magnetron, 1), new AStack[] {new OreDictStack(CU.plate(), 3), new OreDictStack(W.wireFine(), 4), }, 40); @@ -157,7 +153,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.nuke_fleija, 1), new AStack[] {new OreDictStack(AL.shell(), 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack("dyeWhite", 4), },400); makeRecipe(new ComparableStack(ModBlocks.nuke_solinium, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack("dyeGray", 8), },400); makeRecipe(new ComparableStack(ModBlocks.nuke_n2, 1), new AStack[] {new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack("dyeBlack", 8), },300); - makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 8), },600, ModItems.journal_pip, ModItems.journal_bj); makeRecipe(new ComparableStack(ModBlocks.nuke_custom, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 4), },300); makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); @@ -237,13 +232,13 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.mp_warhead_10_buster, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(TI.plate(), 4), new ComparableStack(ModBlocks.det_charge, 1), new ComparableStack(ModBlocks.det_cord, 4), new OreDictStack(CU.plateCast(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), },100); makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(PU239.ingot(), 1), new OreDictStack(OreDictManager.getReflector(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear_large, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(AL.plate(), 4), new OreDictStack(PU239.ingot(), 2), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit,3, EnumCircuitType.ADVANCED), },300); - makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100, ModItems.journal_pip); - makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100, ModItems.journal_pip); + makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100); + makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_he, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_incendiary, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 2), new OreDictStack(P_RED.dust(), 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 24), new OreDictStack(TI.plate(), 12), new OreDictStack(PU239.ingot(), 3), new ComparableStack(ModBlocks.det_charge, 6), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.ADVANCED), },500); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_n2, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(TI.plate(), 20), new ComparableStack(ModBlocks.det_charge, 24), new ComparableStack(Blocks.redstone_block, 12), new OreDictStack(MAGTUNG.dust(), 6), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), },400); - makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), }, 60, ModItems.journal_bj); + makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), }, 60); makeRecipe(new ComparableStack(ModItems.fusion_shield_tungsten, 1), new AStack[] {new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96)}, 600); makeRecipe(new ComparableStack(ModItems.fusion_shield_desh, 1), new AStack[] {new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96)}, 600); makeRecipe(new ComparableStack(ModItems.fusion_shield_chlorophyte, 1), new AStack[] {new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48)}, 600); @@ -258,15 +253,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.part_generic, 32, EnumPartType.LDE) },600); - makeRecipe(new ComparableStack(ModItems.missile_soyuz_lander, 1), new AStack[] { - new OreDictStack(AL.shell(), 4), - new OreDictStack(RUBBER.ingot(), 16), - new ComparableStack(ModItems.rocket_fuel, 16), - new ComparableStack(ModItems.thruster_small, 3), - new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER_ADVANCED), - new ComparableStack(ModItems.part_generic, 12, EnumPartType.LDE) - },600, ModItems.journal_bj); - makeRecipe(new ComparableStack(ModItems.sat_base, 1), new AStack[] { new OreDictStack(RUBBER.ingot(), 12), new OreDictStack(TI.shell(), 3), @@ -397,7 +383,7 @@ public class AssemblerRecipes extends SerializableRecipe { new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), - new ComparableStack(ModItems.tank_steel, 4), + new OreDictStack(STEEL.shell(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC) }, 300); @@ -405,7 +391,7 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.ingot_firebrick, 12), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), - new ComparableStack(ModItems.tank_steel, 2), + new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8) }, 100); @@ -573,15 +559,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.coin_worm, 1) }, 1200); - makeRecipe(new ComparableStack(ModItems.sat_gerald, 1), new AStack[] { - new OreDictStack(SBD.plateCast(), 128), - new OreDictStack(BSCCO.wireDense(), 128), - new ComparableStack(ModBlocks.det_nuke, 64), - new ComparableStack(ModItems.part_generic, 256, EnumPartType.HDE), - new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), - new ComparableStack(ModItems.coin_ufo, 1), - }, 1200, ModItems.journal_bj); - makeRecipe(new ComparableStack(ModBlocks.vault_door, 1), new AStack[] { new OreDictStack(STEEL.ingot(), 32), new OreDictStack(W.ingot(), 32), @@ -785,18 +762,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), }, 100); - makeRecipe(new ComparableStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM), new AStack[] { - new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), - new OreDictStack(ANY_SMOKELESS.dust(), 6), - new OreDictStack(STAR.ingot(), 3), - }, 100, ModItems.journal_silver); - makeRecipe(new ComparableStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK), new AStack[] { - new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), - new OreDictStack(ANY_SMOKELESS.dust(), 24), - new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), - new ComparableStack(ModItems.black_diamond), - }, 1200, ModItems.journal_silver); - makeRecipe(new ComparableStack(ModBlocks.machine_silex, 1), new AStack[] { new ComparableStack(ModBlocks.glass_quartz, 16), !exp ? new OreDictStack(STEEL.plateCast(), 8) : new OreDictStack(STEEL.heavyComp(), 1), @@ -929,8 +894,8 @@ public class AssemblerRecipes extends SerializableRecipe { !exp ? new OreDictStack(STEEL.plateCast(), 8) : new OreDictStack(STEEL.heavyComp(), 2), !exp ? new OreDictStack(CU.plate528(), 16) : new OreDictStack(CU.heavyComp(), 1), new OreDictStack(RUBBER.ingot(), 8), + new OreDictStack(STEEL.shell(), 3), new ComparableStack(ModItems.ingot_firebrick, 16), - new ComparableStack(ModItems.tank_steel, 3), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC) }, 200); @@ -1112,7 +1077,6 @@ public class AssemblerRecipes extends SerializableRecipe { if(!GeneralConfig.enable528) { makeRecipe(new ComparableStack(ModBlocks.machine_hephaestus, 1), new AStack[] { new OreDictStack(STEEL.pipe(), 12), !exp ? new OreDictStack(STEEL.ingot(), 24) : new OreDictStack(STEEL.heavyComp(), 2), !exp ? new OreDictStack(CU.plate(), 24) : new OreDictStack(CU.heavyComp(), 2), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16) }, 150); - makeRecipe(new ComparableStack(ModBlocks.machine_radgen, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1), }, 400, ModItems.journal_pip); makeRecipe(new ComparableStack(ModBlocks.machine_reactor_breeding, 1), new AStack[] {new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)},150); makeRecipe(new ComparableStack(ModBlocks.reactor_research, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC), },300); @@ -1206,8 +1170,8 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.motor_desh, 2), !exp ? new ComparableStack(ModItems.plate_desh, 6) : new OreDictStack(DESH.heavyComp()), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), - new ComparableStack(ModItems.tank_steel, 24), - new ComparableStack(ModItems.pipes_steel, 2) + new OreDictStack(STEEL.shell(), 16), + new OreDictStack(STEEL.pipe(), 12) }, 600); makeRecipe(new ComparableStack(ModBlocks.machine_catalytic_cracker), new AStack[] { @@ -1243,8 +1207,8 @@ public class AssemblerRecipes extends SerializableRecipe { new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), - new ComparableStack(ModItems.thermo_element, 8), - new ComparableStack(ModItems.tank_steel, 3) + new OreDictStack(STEEL.shell(), 2), + new ComparableStack(ModItems.thermo_element, 8) }, 200); makeRecipe(new ComparableStack(ModBlocks.transition_seal, 1), new AStack[]{ diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 472a33cc1..1406819af 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -284,7 +284,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); this.register(new GenericRecipe("ass.combustiongen").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_combustion_engine, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.pistonsetsteel").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STEEL.ordinal())) .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 4), new OreDictStack(W.ingot(), 8), new OreDictStack(W.bolt(), 16))); this.register(new GenericRecipe("ass.pistonsetdura").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DURA.ordinal())) @@ -356,10 +356,10 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM))); this.register(new GenericRecipe("ass.detector").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_detector, 1)) .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM))); - this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 128))); + this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(GOLD.wireDense(), 64))); this.register(new GenericRecipe("ass.panbti").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.NIOBIUM.ordinal())).inputItems(new OreDictStack(NB.wireDense(), 64), new OreDictStack(TI.wireDense(), 64))); this.register(new GenericRecipe("ass.pabscco").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.BSCCO.ordinal())).inputItems(new OreDictStack(BSCCO.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64))); - this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 128), new ComparableStack(ModItems.powder_chlorophyte, 16))); + this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 64), new OreDictStack(CU.wireDense(), 64), new ComparableStack(ModItems.powder_chlorophyte, 16))); this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16))); @@ -385,9 +385,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); this.register(new GenericRecipe("ass.blankettungsten").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_tungsten, 1)) - .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96))); + .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 64))); this.register(new GenericRecipe("ass.blanketdesh").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_desh, 1)) - .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96))); + .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 64))); this.register(new GenericRecipe("ass.blanketchlorophyte").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_chlorophyte, 1)) .inputItems(new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48))); @@ -579,9 +579,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.fritz").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_fritz, 1)) .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel))); this.register(new GenericRecipe("ass.arty").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_arty, 1)) - .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(STEEL.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); this.register(new GenericRecipe("ass.himars").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_himars, 1)) - .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); this.register(new GenericRecipe("ass.himarssmall").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL)) .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.himarssmallhe").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_HE)) diff --git a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java index 4bbf1074c..ca0228ca0 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java @@ -60,7 +60,7 @@ public class ChemicalPlantRecipes extends GenericRecipes { this.register(new GenericRecipe("chem.xenonoxy").setupNamed(20, 1_000).setIcon(ModItems.gas_full, Fluids.XENON.getID()) .inputFluids(new FluidStack(Fluids.AIR, 8_000), new FluidStack(Fluids.OXYGEN, 250)) - .outputFluids(new FluidStack(Fluids.XENON, 50))); + .outputFluids(new FluidStack(Fluids.XENON, 50)).setPools(GenericRecipes.POOL_PREFIX_ALT + ".xenonoxy")); this.register(new GenericRecipe("chem.helium3").setupNamed(200, 2_000).setIcon(ModItems.gas_full, Fluids.HELIUM3.getID()) .inputItems(new ComparableStack(ModBlocks.moon_turf, 8)) @@ -131,6 +131,11 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.WATER, 2_000)) .outputItems(new ItemStack(ModBlocks.ducrete_smooth, 8))); + this.register(new GenericRecipe("chem.liquidconk").setup(100, 100) + .inputItems(new ComparableStack(ModItems.powder_cement, 1), new ComparableStack(Blocks.gravel, 8), new OreDictStack(KEY_SAND, 8)) + .inputFluids(new FluidStack(Fluids.WATER, 2_000)) + .outputFluids(new FluidStack(Fluids.CONCRETE, 16_000))); + this.register(new GenericRecipe("chem.asphalt").setup(100, 100) .inputItems(new ComparableStack(Blocks.gravel, 2), new OreDictStack(KEY_SAND, 6)) .inputFluids(new FluidStack(Fluids.BITUMEN, 1_000)) @@ -209,7 +214,7 @@ public class ChemicalPlantRecipes extends GenericRecipes { this.register(new GenericRecipe("chem.birkeland").setupNamed(200, 5_000) .inputFluids(new FluidStack(Fluids.AIR, 8_000), new FluidStack(Fluids.WATER, 2_000)) - .outputFluids(new FluidStack(Fluids.NITRIC_ACID, 1_000))); + .outputFluids(new FluidStack(Fluids.NITRIC_ACID, 1_000)).setPools(GenericRecipes.POOL_PREFIX_ALT + ".birkeland")); this.register(new GenericRecipe("chem.schrabidic").setup(100, 5_000) .inputItems(new ComparableStack(ModItems.pellet_charged)) diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 264e67cda..0f98be052 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -57,7 +57,7 @@ public class GenericRecipe { public GenericRecipe setNamed() { this.customLocalization = true; return this; } public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } - public GenericRecipe inputItems(AStack... input) { this.inputItem = input; return this; } + public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } public GenericRecipe outputFluids(FluidStack... output) { this.outputFluid = output; return this; } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java index 7bbeea0e0..8f1a78633 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java @@ -50,7 +50,8 @@ public class ItemPoolsComponent { weighted(ModItems.circuit, EnumCircuitType.VACUUM_TUBE.ordinal(), 1, 2, 4), weighted(ModItems.circuit, EnumCircuitType.PCB.ordinal(), 1, 3, 5), weighted(ModItems.circuit, EnumCircuitType.CAPACITOR.ordinal(), 1, 1, 3), - weighted(ModItems.blade_titanium, 0, 1, 8, 1) + weighted(ModItems.blade_titanium, 0, 1, 8, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -123,7 +124,8 @@ public class ItemPoolsComponent { weighted(ModItems.toothpicks, 0, 1, 16, 10), weighted(ModItems.dust, 0, 1, 1, 40), weighted(ModItems.dust_tiny, 0, 1, 3, 75), - weighted(ModItems.ink, 0, 1, 1, 1) + weighted(ModItems.ink, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 5) }; }}; diff --git a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java index 289a495e9..31d43ed4f 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java @@ -64,7 +64,8 @@ public class ItemPoolsLegacy { weighted(ModItems.canister_full, Fluids.DIESEL.getID(), 1, 2, 2), weighted(ModItems.canister_full, Fluids.BIOFUEL.getID(), 1, 2, 3), weighted(ModItems.gas_mask_m65, 60, 1, 1, 2), - weighted(ModItems.gas_mask_filter, 0, 1, 1, 3) + weighted(ModItems.gas_mask_filter, 0, 1, 1, 3), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -132,6 +133,7 @@ public class ItemPoolsLegacy { weighted(ModItems.gas_mask_filter, 0, 1, 1, 4), weighted(ModItems.launch_code_piece, 0, 1, 1, 1), weighted(ModItems.gun_double_barrel, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; diff --git a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java index 4b1c88353..44393be00 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java @@ -59,6 +59,7 @@ public class ItemPoolsRedRoom { weighted(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL.ordinal(), 4, 4, 10), weighted(ModItems.item_secret, EnumSecretType.CONTROLLER.ordinal(), 1, 1, 10), weighted(ModItems.item_secret, EnumSecretType.CANISTER.ordinal(), 1, 1, 10), + weighted(ModItems.blueprint_folder, 2, 1, 1, 1), }; }}; } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java index 47c0a9c17..f8dd79f0a 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java @@ -124,6 +124,7 @@ public class ItemPoolsSingle { weighted(ModItems.launch_code_piece, 0, 1, 1, 5), weighted(ModItems.egg_glyphid, 0, 1, 1, 5), weighted(ModItems.gem_alexandrite, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 5724185f5..ca9456f9d 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1186,10 +1186,8 @@ public class ModItems { public static Item settings_tool; public static Item blueprints; + public static Item blueprint_folder; public static Item template_folder; - @Deprecated public static Item journal_pip; - @Deprecated public static Item journal_bj; - @Deprecated public static Item journal_silver; @Deprecated public static Item assembly_template; @Deprecated public static Item chemistry_template; @Deprecated public static Item chemistry_icon; @@ -4103,10 +4101,8 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); blueprints = new ItemBlueprints().setUnlocalizedName("blueprints").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprints"); + blueprint_folder = new ItemBlueprintFolder().setUnlocalizedName("blueprint_folder").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprint_folder"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); - journal_pip = new ItemTemplateFolder().setUnlocalizedName("journal_pip").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_pip"); - journal_bj = new ItemTemplateFolder().setUnlocalizedName("journal_bj").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_bj"); - journal_silver = new ItemTemplateFolder().setUnlocalizedName("journal_silver").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_silver"); assembly_template = new ItemAssemblyTemplate().setUnlocalizedName("assembly_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":assembly_template"); chemistry_template = new ItemChemistryTemplate().setUnlocalizedName("chemistry_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":chemistry_template"); chemistry_icon = new ItemChemistryIcon().setUnlocalizedName("chemistry_icon").setMaxStackSize(1).setCreativeTab(null); @@ -5754,10 +5750,8 @@ public class ModItems { //Folders GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); + GameRegistry.registerItem(blueprint_folder, blueprint_folder.getUnlocalizedName()); GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); - GameRegistry.registerItem(journal_pip, journal_pip.getUnlocalizedName()); - GameRegistry.registerItem(journal_bj, journal_bj.getUnlocalizedName()); - GameRegistry.registerItem(journal_silver, journal_silver.getUnlocalizedName()); GameRegistry.registerItem(bobmazon, bobmazon.getUnlocalizedName()); GameRegistry.registerItem(bobmazon_hidden, bobmazon_hidden.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java b/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java new file mode 100644 index 000000000..a6fe26c04 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java @@ -0,0 +1,72 @@ +package com.hbm.items.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.recipes.loader.GenericRecipes; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBlueprintFolder extends Item { + + @SideOnly(Side.CLIENT) protected IIcon iconDiscover; + @SideOnly(Side.CLIENT) protected IIcon iconSecret; + + public ItemBlueprintFolder() { + this.setHasSubtypes(true); + this.setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.iconDiscover = reg.registerIcon(this.getIconString() + "_discover"); + this.iconSecret = reg.registerIcon(this.getIconString() + "_secret"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return meta == 1 ? iconDiscover : meta == 2 ? iconSecret : itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < 2; i++) list.add(new ItemStack(item, 1, i)); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + + List pools = new ArrayList(); + + for(String pool : GenericRecipes.blueprintPools.keySet()) { + if(stack.getItemDamage() == 0 && pool.startsWith(GenericRecipes.POOL_PREFIX_ALT)) pools.add(pool); + if(stack.getItemDamage() == 1 && pool.startsWith(GenericRecipes.POOL_PREFIX_DISCOVER)) pools.add(pool); + if(stack.getItemDamage() == 2 && pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) pools.add(pool); + } + + if(!pools.isEmpty()) { + stack.stackSize--; + + String chosen = pools.get(player.getRNG().nextInt(pools.size())); + ItemStack blueprint = ItemBlueprints.make(chosen); + + if(!player.inventory.addItemStackToInventory(blueprint)) + player.dropPlayerItemWithRandomChoice(blueprint, false); + } + + return stack; + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemCatalyst.java b/src/main/java/com/hbm/items/machine/ItemCatalyst.java index 99ffe4a11..25dae2545 100644 --- a/src/main/java/com/hbm/items/machine/ItemCatalyst.java +++ b/src/main/java/com/hbm/items/machine/ItemCatalyst.java @@ -37,12 +37,6 @@ public class ItemCatalyst extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - /*list.add("Absolute Energy Bonus: " + powerAbs + "HE"); - list.add("Energy Modifier: " + (powerMod >= 1 ? "+" : "") + (Math.round(powerMod * 1000) * .10 - 100) + "%"); - list.add("Heat Modifier: " + (heatMod >= 1 ? "+" : "") + (Math.round(heatMod * 1000) * .10 - 100) + "%"); - list.add("Fuel Modifier: " + (fuelMod >= 1 ? "+" : "") + (Math.round(fuelMod * 1000) * .10 - 100) + "%");*/ - //TODO: do something useful with this - list.add("Adds spice to the core."); list.add("Look at all those colors!"); } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d2262372e..4788a6fd0 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -458,6 +458,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate_wide), 4), new Object[] { "SS", 'S', ModBlocks.steel_grate }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 1), new Object[] { "SS", 'S', ModBlocks.steel_grate_wide }); + addRecipeAuto(new ItemStack(ModBlocks.rebar, 1), new Object[] { "BB", "BB", 'B', STEEL.bolt() }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 0), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeGray" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 1), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeRed" }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 8588f66c2..dffae8513 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1718,6 +1718,9 @@ public class MainRegistry { ignoreMappings.add("hbm:item.component_limiter"); ignoreMappings.add("hbm:item.bottle2_korl_special"); ignoreMappings.add("hbm:item.bottle2_fritz_special"); + ignoreMappings.add("hbm:item.journal_pip"); + ignoreMappings.add("hbm:item.journal_bj"); + ignoreMappings.add("hbm:item.journal_silver"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ea71876e6..ed62ac103 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -3,6 +3,7 @@ package com.hbm.main; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; +import com.hbm.blocks.generic.BlockRebar; import com.hbm.config.ClientConfig; import com.hbm.config.GeneralConfig; import com.hbm.entity.mob.EntityHunterChopper; @@ -924,9 +925,9 @@ public class ModEventHandlerClient { ); String prefix = "Gun "; - int gunScale = 16; - int defaultScale = 1; - int slotScale = gunScale; + //int gunScale = 16; + //int defaultScale = 1; + int slotScale = 16; boolean ignoreNonNTM = true; boolean onlyGuns = true; @@ -1138,6 +1139,8 @@ public class ModEventHandlerClient { public void onRenderWorldLastEvent(RenderWorldLastEvent event) { Clock.update(); + + BlockRebar.renderRebar(Minecraft.getMinecraft().theWorld.loadedTileEntityList, event.partialTicks); GL11.glPushMatrix(); diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java index bec1e9ef6..117f58db0 100644 --- a/src/main/java/com/hbm/render/util/HorsePronter.java +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -123,7 +123,7 @@ public class HorsePronter { GL11.glTranslated(offset.xCoord, offset.yCoord, offset.zCoord); GL11.glRotated(rotation.xCoord, 0, 1, 0); GL11.glRotated(rotation.yCoord, 1, 0, 0); - GL11.glRotated(rotation.zCoord, 0, 0, 1); //TODO: check pitch and roll axis + GL11.glRotated(rotation.zCoord, 0, 0, 1); GL11.glTranslated(-offset.xCoord, -offset.yCoord, -offset.zCoord); } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 1337d34c0..3b7676d73 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -14,6 +14,7 @@ import com.hbm.blocks.generic.BlockGlyphidSpawner.TileEntityGlpyhidSpawner; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; +import com.hbm.blocks.generic.BlockRebar.TileEntityRebar; import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; @@ -456,6 +457,8 @@ public class TileMappings { put(TileEntityRailSwitch.class, "tileentity_rail_switch"); + put(TileEntityRebar.class, "tileentity_rebar"); + // OC Compat items boolean ocPresent = Loader.isModLoaded("OpenComputers"); diff --git a/src/main/java/com/hbm/uninos/NodeNet.java b/src/main/java/com/hbm/uninos/NodeNet.java index f37446cec..eb4c99233 100644 --- a/src/main/java/com/hbm/uninos/NodeNet.java +++ b/src/main/java/com/hbm/uninos/NodeNet.java @@ -2,7 +2,7 @@ package com.hbm.uninos; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Random; import java.util.Set; @@ -16,7 +16,7 @@ public abstract class NodeNet { public static Random rand = new Random(); public boolean valid = true; - public Set links = new HashSet(); + public Set links = new LinkedHashSet(); public HashMap receiverEntries = new HashMap(); public HashMap providerEntries = new HashMap(); diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java index 330db1821..47d7c108f 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java @@ -2,7 +2,7 @@ package com.hbm.uninos.networkproviders; import com.hbm.uninos.INetworkProvider; -public class PneumaticNetworkProvider implements INetworkProvider{ +public class PneumaticNetworkProvider implements INetworkProvider { public static PneumaticNetworkProvider THE_PROVIDER = new PneumaticNetworkProvider(); diff --git a/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java new file mode 100644 index 000000000..23afb5ad8 --- /dev/null +++ b/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java @@ -0,0 +1,9 @@ +package com.hbm.uninos.networkproviders; + +import com.hbm.uninos.NodeNet; + +public class RebarNetwork extends NodeNet { + + @Override + public void update() { } +} diff --git a/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java b/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java new file mode 100644 index 000000000..df9b22707 --- /dev/null +++ b/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java @@ -0,0 +1,13 @@ +package com.hbm.uninos.networkproviders; + +import com.hbm.uninos.INetworkProvider; + +public class RebarNetworkProvider implements INetworkProvider { + + public static RebarNetworkProvider THE_PROVIDER = new RebarNetworkProvider(); + + @Override + public RebarNetwork provideNetwork() { + return new RebarNetwork(); + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2cc9428b9..599e12787 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -752,6 +752,7 @@ hbmfluid.coalgas=Kohlebenzin hbmfluid.coalgas_leaded=Bleikohlebenzin hbmfluid.colloid=Kolloid hbmfluid.coaloil=Kohleöl +hbmfluid.concrete=Nassbeton hbmfluid.coolant=Kühlflüssigkeit hbmfluid.coolant_hot=Heiße Kühlflüssigkeit hbmfluid.crackoil=Crack-Öl @@ -1417,6 +1418,7 @@ item.blades_schrabidium.name=Schrabidiumsägeblatt item.blades_steel.name=Stahlsägeblatt item.blades_titanium.name=Titansägeblatt item.blowtorch.name=Lötlampe +item.blueprint_folder.name=Blaupausenbuch item.blueprints.name=Blaupausen item.board_copper.name=Kupfertafel item.boat_rubber.name=Schlauchboot @@ -4029,6 +4031,7 @@ tile.concrete_colored_ext.pink.name=Builder's Choice Concrete - Männliches Pink tile.concrete_colored_ext.purple.name=Builder's Choice Concrete - Mysteriöses Lila tile.concrete_colored_ext.sand.name=Builder's Choice Concrete - Wüstensturm tile.concrete_pillar.name=Stahlbetonsäule +tile.concrete_rebar.name=Stahlbeton tile.concrete_slab.asphalt.name=Asphaltstufe tile.concrete_slab.concrete.name=Betonfliesenstufe tile.concrete_slab.concrete_asbestos.name=Asbestbetonstufe @@ -4752,6 +4755,7 @@ tile.reactor_ejector.name=Reaktor-Brennstoffauswurf tile.reactor_element.name=Reaktorkammer tile.reactor_hatch.name=Kraftwerkszugriffsluke tile.reactor_inserter.name=Reaktor-Brennstoffeinlass +tile.rebar.name=Armierungseisen tile.red_barrel.name=Explosives Fass tile.red_cable.name=Rotes Kupferkabel tile.red_cable_classic.name=Rotes Kupferkabel (Klassisch) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 53f1112b2..ff4e2e5cc 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1461,6 +1461,7 @@ hbmfluid.coalgas=Coal Gasoline hbmfluid.coalgas_leaded=Leaded Coal Gasoline hbmfluid.coaloil=Coal Oil hbmfluid.colloid=Colloid +hbmfluid.concrete=Liquid Concrete hbmfluid.coolant=Coolant hbmfluid.coolant_hot=Hot Coolant hbmfluid.crackoil=Cracked Oil @@ -2161,6 +2162,7 @@ item.blades_desh.name=Desh Shredder Blades item.blades_steel.name=Steel Shredder Blades item.blades_titanium.name=Titanium Shredder Blades item.blowtorch.name=Blowtorch +item.blueprint_folder.name=Blueprint Booklet item.blueprints.name=Blueprints item.board_copper.name=Copper Panel item.boat_rubber.name=Rubber Boat @@ -5145,6 +5147,7 @@ tile.concrete_colored_ext.pink.name=Builder's Choice Concrete - Manly Pink tile.concrete_colored_ext.purple.name=Builder's Choice Concrete - Mysterious Purple tile.concrete_colored_ext.sand.name=Builder's Choice Concrete - Desert Storm tile.concrete_pillar.name=Rebar Reinforced Concrete Pillar +tile.concrete_rebar.name=Reinforced Concrete tile.concrete_slab.asphalt.name=Asphalt Slab tile.concrete_slab.concrete.name=Concrete Tile Slab tile.concrete_slab.concrete_asbestos.name=Asbestos Concrete Slab @@ -5903,6 +5906,7 @@ tile.reactor_ejector.name=Reactor Waste Ejector tile.reactor_element.name=Reactor Chamber tile.reactor_hatch.name=Reactor Access Hatch tile.reactor_inserter.name=Reactor Fuel Inserter +tile.rebar.name=Rebar tile.red_barrel.name=Explosive Barrel tile.red_cable.name=Red Copper Cable tile.red_cable_classic.name=Red Copper Cable (Classic) diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2d6579fc7b332ff87fe4cdb73b371b33da0e5b GIT binary patch literal 599 zcmV-d0;v6oP)cZ8Sg!P-?x4UffyrwN{JXF03n11-nNZW3P9^? zt(m5Y&(BX{jA*UtFShURZ;UaNQYfWxo+sXW0E{tB(bv}(!!RI(VB0qOQVPqm@O(b; z-cw59_xG1l3PK1%2-I4UQu6cjL*Mrd!_XA#wZ=6Oab#d)4c zYc1AVlv3^2Wm%}TvTYmtzVr6>_8+;{np!J4XJprPxy#@V+^<34IxAurRCr{o@ts8LLjB2>pIqTQz&{`8h;13bhaMU!~kmdjY002ovPDHLkV1g!h5_$jt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d616f3ec1f7a930f8585a153f36526c44b6195 GIT binary patch literal 652 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/concrete.png b/src/main/resources/assets/hbm/textures/gui/fluids/concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..5d76282fe5c8438b922d95686c704a2396eb572e GIT binary patch literal 646 zcmV;10(t$3P)*cR5k zi@XS)Hd=_8IY;N4KVM&8f9H9|drzL{e1CsqjN$qDnd9*Yz%)&4+eQe15CX$6pp>Gj zDt6N}F^(f41gfgy^YfEo7yt+%q~aJO<2d5IM{5nhJkRXLab%h%>bk~zk8_U4xn8eW zYni4AV+iAp_Jl$J|`;xd7h(`;&!{;8z`mH1b}fI z)BW=DLS5Hrtr3xALu<{tuB_{da?T+lbX~_ZO;~F&#*pVZzrVk{zP>U|6W)82Qiw?U zaIH1Udrt^~x3{-csI_LEXRNifZHrQhx~}QEjx5U%5!Q7j%QALVRZ*7Z|6+6xLeic}^TCtu<}iQWOQlFwnLwP167{ z3TcoDeOVS_j2L6?5C1Jo2!TA$IUbM6O4oH< zE|)u%5BcLbvfu9kxZQ3^W?k0_AQ1uJ{r#P)s&LM+^WIaIB_e`zF2(b(BO)|SL*Mr} g=Qy2C06cc+AKE5D8*cmd+5i9m07*qoM6N<$f(yhcMgRZ+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/assembly_nuke.png b/src/main/resources/assets/hbm/textures/items/assembly_nuke.png index 3243576ba0105458024c50259a8ff68560cfe096..4a6dcc92f19e28b0e740e051498302a3f15442d7 100644 GIT binary patch delta 372 zcmV-)0gL|U0-pnrG=Ek}L_t(IjjdC=Y63wNJtGPUArJy0rr1VIVUte%hF~+F;18r* z{~_#0_yHC|SkfA>k|{&BNZ4X;u@)Cg5o2*vgq_T|D+H1Q12gBGd*?6@;EzyMD}9v>9v`~0Iny4;%qN@FkBQsh98YiTam{A)Q~=bDiGO$6l}yZB;!Y;`4WcNr zXXGU?#s~l;N#YH+sPF(l7>3FwC=4I8#d^I55di>#AOHaLdOa9pWHy_5X=-lQEXx4E z7Q1t1wt9idWFocj@=CHSt2DSMbY@1Y)k44D|4v{&_f{xS#6F(8ST2`Hk_7da{Z8Ex z2{VI;&EK45k*oXCj%k{r(P-ds zI9M)@jIGTQ Stvc=i0000;yBBhjeZMSV3j0*}#DJ|!G!x>|q zibNqYj^l&CGXw>aB-z+XslN&QhV_it-oZIX-}jq@JkR|c>VKlJqYw~6Y&)on!rp{H z*L9et=}@&S%SYvT1^{TS(KHQ%1%rs;aX8`b>NOOZW!4$bkIpvitu4 O00003Zh;@y>_0x62=qOt5_^rq`axFemN++l9pwG?)`+)$OU~>XbEUc+`5|$?Jnl z%V~iVRtM3(gB+$IC_V>X9 zCw@pd>$;@{or&x)H#RgdFt{^csDEL94g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png b/src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png new file mode 100644 index 0000000000000000000000000000000000000000..451232e7c18547b4ed45789cb7b10b639e82d885 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfyUv+oBh#1=dy#!J4%a61VaSo*fe)ce!v=I+c>*hykJrums2|bLj{{lk5&bD zD*XRKbnOji`^2R-bSC#D&M4|Ve>8Fb|4p-xNLal!Q|mKkOY%`$ zx7+XIK|M>}EkRQgPE1WGy}=Tfuz_QLI)g!6{N=>QrzG#l`i*ssnSwWVxgcJG&~C^499Wm6DbxYBg-&y)EH wQ#(ZR?tEo>kg+UIV2YXW0o5+9JLjvIcQGe0+TB>u2=p(5r>mdKI;Vst0FUc)%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png b/src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..d23d7ce41724d7c28b30f70c4ad38149d30cc6b9 GIT binary patch literal 270 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 Date: Wed, 23 Jul 2025 16:34:11 +0200 Subject: [PATCH 128/323] cast yourself a whole house, cast yourself a new mother, cast a vacation straight to fucking hell --- changelog | 4 + .../com/hbm/blocks/generic/BlockRebar.java | 152 ++++++-- .../java/com/hbm/crafting/ToolRecipes.java | 1 + .../ContainerMachineChemicalFactory.java | 9 + .../ContainerMachineChemicalPlant.java | 4 +- .../hbm/inventory/gui/GuiInfoContainer.java | 2 + .../recipes/ChemicalPlantRecipes.java | 6 + .../inventory/recipes/ShredderRecipes.java | 10 +- src/main/java/com/hbm/items/ModItems.java | 6 +- .../com/hbm/items/tool/ItemRebarPlacer.java | 337 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/textures/gui/gui_rebar.png | Bin 0 -> 3367 bytes .../hbm/textures/items/rebar_placer.png | Bin 0 -> 513 bytes 15 files changed, 498 insertions(+), 39 deletions(-) create mode 100644 src/main/java/com/hbm/items/tool/ItemRebarPlacer.java create mode 100644 src/main/resources/assets/hbm/textures/gui/gui_rebar.png create mode 100644 src/main/resources/assets/hbm/textures/items/rebar_placer.png diff --git a/changelog b/changelog index 958bb0f23..fa222ff1a 100644 --- a/changelog +++ b/changelog @@ -7,9 +7,13 @@ * Rebar * When hooked up to liquid concrete using pipes, will fill to create reinforced concrete * Fills bottom to top, so connect the pipes to the top +* Rebar placer + * Can be configured with different types of concrete, reinforced or not, or even colored + * Rebar created with the rebar placer will remember its type and assume it when being filled with liquid concrete ## Changed * The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints +* The chemical plant now has a recipe for making cobblestone from 25mB of lava (which can be liquefacted into even more lava, useful for cobblestone generation) ## Fixed * Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit diff --git a/src/main/java/com/hbm/blocks/generic/BlockRebar.java b/src/main/java/com/hbm/blocks/generic/BlockRebar.java index 67b9f13c7..391533e0a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockRebar.java +++ b/src/main/java/com/hbm/blocks/generic/BlockRebar.java @@ -7,11 +7,16 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.config.ClientConfig; +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemRebarPlacer; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.main.ServerProxy; import com.hbm.render.block.ISBRHUniversal; import com.hbm.render.util.RenderBlocksNT; import com.hbm.tileentity.IBufPacketReceiver; @@ -24,6 +29,7 @@ import com.hbm.uninos.networkproviders.RebarNetwork; import com.hbm.uninos.networkproviders.RebarNetworkProvider; import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; +import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -41,9 +47,13 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -97,10 +107,18 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { public static class TileEntityRebar extends TileEntityLoadedBase implements IFluidReceiverMK2, IBufPacketReceiver { + public Block concrete; + public int concreteMeta; public int progress; public int prevProgress; protected RebarNode node; public boolean hasConnection = false; + + public TileEntityRebar setup(Block b, int m) { + this.concrete = b; + this.concreteMeta = m; + return this; + } @Override public void updateEntity() { @@ -115,7 +133,11 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { } if(this.progress >= 1_000) { - worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.concrete_rebar); + if(concrete != null && ItemRebarPlacer.isValidConk(Item.getItemFromBlock(concrete), concreteMeta)) { + worldObj.setBlock(xCoord, yCoord, zCoord, concrete, concreteMeta, 3); + } else { + worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.concrete_rebar); + } return; } @@ -158,6 +180,11 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { super.readFromNBT(nbt); this.progress = nbt.getInteger("progress"); this.hasConnection = nbt.getBoolean("hasConnection"); + + if(nbt.hasKey("block")) { + this.concrete = Block.getBlockById(nbt.getInteger("block")); + this.concreteMeta = nbt.getInteger("meta"); + } } @Override @@ -165,6 +192,11 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { super.writeToNBT(nbt); nbt.setInteger("progress", this.progress); nbt.setBoolean("hasConnection", this.hasConnection); + + if(this.concrete != null) { + nbt.setInteger("block", Block.getIdFromBlock(this.concrete)); + nbt.setInteger("meta", this.concreteMeta); + } } public RebarNode createNode() { @@ -341,6 +373,14 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { TileEntityRebar rebar = (TileEntityRebar) o; if(rebar.progress > 0) rebars.add(rebar); } + + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; + World world = mc.theWorld; + + double dx = player.prevPosX + (player.posX - player.prevPosX) * interp; + double dy = player.prevPosY + (player.posY - player.prevPosY) * interp; + double dz = player.prevPosZ + (player.posZ - player.prevPosZ) * interp; if(!rebars.isEmpty()) { @@ -348,19 +388,12 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { GL11.glShadeModel(GL11.GL_SMOOTH); //RenderHelper.enableStandardItemLighting(); - EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer; + EntityRenderer entityRenderer = mc.entityRenderer; entityRenderer.enableLightmap(interp); - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - World world = Minecraft.getMinecraft().theWorld; - - double dx = player.prevPosX + (player.posX - player.prevPosX) * interp; - double dy = player.prevPosY + (player.posY - player.prevPosY) * interp; - double dz = player.prevPosZ + (player.posZ - player.prevPosZ) * interp; - RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); renderer.setOverrideBlockTexture(((BlockRebar) ModBlocks.rebar).concrete); - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); @@ -370,26 +403,6 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { tess.setColorRGBA_F(1F, 1F, 1F, 1F); renderer.setRenderBounds(0, 0, 0, 1, rebar.progress / 1000D, 1); renderer.renderStandardBlock(ModBlocks.rebar, rebar.xCoord, rebar.yCoord, rebar.zCoord); - - /*IIcon icon = ((BlockRebar) ModBlocks.rebar).concrete; - double minU = icon.getInterpolatedU(renderer.renderMinX * 16.0D); - double maxU = icon.getInterpolatedU(renderer.renderMaxX * 16.0D); - double minV = icon.getInterpolatedV(renderer.renderMinZ * 16.0D); - double maxV = icon.getInterpolatedV(renderer.renderMaxZ * 16.0D); - - double minX = rebar.xCoord + renderer.renderMinX; - double maxX = rebar.xCoord + renderer.renderMaxX; - double minY = rebar.yCoord + renderer.renderMinY; - double maxY = rebar.yCoord + renderer.renderMaxY; - double minZ = rebar.zCoord + renderer.renderMinZ; - double maxZ = rebar.zCoord + renderer.renderMaxZ; - - //tess.setColorOpaque_F(0.5F, 1F, 1F); - tess.setNormal(0, 1, 0); - tess.addVertexWithUV(maxX, maxY, maxZ, maxU, maxV); - tess.addVertexWithUV(maxX, maxY, minZ, maxU, minV); - tess.addVertexWithUV(minX, maxY, minZ, minU, minV); - tess.addVertexWithUV(minX, maxY, maxZ, minU, maxV);*/ } tess.draw(); @@ -400,5 +413,84 @@ public class BlockRebar extends BlockContainer implements ISBRHUniversal { GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); } + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.rebar_placer && player.getHeldItem().hasTagCompound() && + player.getHeldItem().stackTagCompound.hasKey("pos") && mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) { + + int[] pos = player.getHeldItem().stackTagCompound.getIntArray("pos"); + MovingObjectPosition mop = mc.objectMouseOver; + ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); + int iX = mop.blockX + dir.offsetX; + int iY = mop.blockY + dir.offsetY; + int iZ = mop.blockZ + dir.offsetZ; + + double minX = Math.min(pos[0], iX) + 0.125; + double maxX = Math.max(pos[0], iX) + 0.875; + double minY = Math.min(pos[1], iY) + 0.125; + double maxY = Math.max(pos[1], iY) + 0.875; + double minZ = Math.min(pos[2], iZ) + 0.125; + double maxZ = Math.max(pos[2], iZ) + 0.875; + + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(1F, 1F, 1F); + + Tessellator tess = Tessellator.instance; + tess.setTranslation(-dx, -dy, -dz); + tess.startDrawing(GL11.GL_LINES); + tess.setBrightness(240); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + + // top + tess.addVertex(minX, maxY, minZ); + tess.addVertex(minX, maxY, maxZ); + + tess.addVertex(minX, maxY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + + tess.addVertex(maxX, maxY, maxZ); + tess.addVertex(maxX, maxY, minZ); + + tess.addVertex(maxX, maxY, minZ); + tess.addVertex(minX, maxY, minZ); + + // bottom + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, minY, maxZ); + + tess.addVertex(minX, minY, maxZ); + tess.addVertex(maxX, minY, maxZ); + + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, minY, minZ); + + tess.addVertex(maxX, minY, minZ); + tess.addVertex(minX, minY, minZ); + + // sides + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, maxY, minZ); + + tess.addVertex(maxX, minY, minZ); + tess.addVertex(maxX, maxY, minZ); + + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + + tess.addVertex(minX, minY, maxZ); + tess.addVertex(minX, maxY, maxZ); + + tess.draw(); + tess.setTranslation(0, 0, 0); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + + int rebarLeft = InventoryUtil.countAStackMatches(player, new ComparableStack(ModBlocks.rebar), true); + int rebarRequired = (Math.max(pos[0], iX) - Math.min(pos[0], iX) + 1) * (Math.max(pos[1], iY) - Math.min(pos[1], iY) + 1) * (Math.max(pos[2], iZ) - Math.min(pos[2], iZ) + 1); + MainRegistry.proxy.displayTooltip((rebarRequired > rebarLeft ? EnumChatFormatting.RED : EnumChatFormatting.GREEN) + (rebarLeft + " / " + rebarRequired), 1_000, ServerProxy.ID_CABLE); + } } } diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index d8d52b0ce..45ad0922c 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -156,6 +156,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(ItemBlowtorch.getEmptyTool(ModItems.blowtorch), new Object[] { "CC ", " I ", "CCC", 'C', CU.plate528(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(ItemBlowtorch.getEmptyTool(ModItems.acetylene_torch), new Object[] { "SS ", " PS", " T ", 'S', STEEL.plate528(), 'P', ANY_PLASTIC.ingot(), 'T', ModItems.tank_steel }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.boltgun), new Object[] { "DPS", " RD", " D ", 'D', DURA.ingot(), 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'R', RUBBER.ingot(), 'S', STEEL.shell() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.rebar_placer), new Object[] { "RDR", "DWD", "RDR", 'R', ModBlocks.rebar, 'D', ModItems.ducttape, 'W', ModItems.wrench }); //Bobmazon CraftingManager.addShapelessAuto(new ItemStack(ModItems.bobmazon), new Object[] { Items.book, Items.gold_nugget, Items.string, KEY_BLUE }); diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java index 484dcfc21..fbdcba7a1 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java @@ -3,6 +3,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -53,6 +54,14 @@ public class ContainerMachineChemicalFactory extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 4, 5, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 11, 12, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 18, 19, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 25, 26, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 1, 4, false)) return null; } else { diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java index 2c4f4052a..30f50de65 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java @@ -3,7 +3,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemChemistryTemplate; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -57,7 +57,7 @@ public class ContainerMachineChemicalPlant extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; - } else if(slotOriginal.getItem() instanceof ItemChemistryTemplate) { + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index d3f151798..7c57a4dab 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -292,6 +292,8 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); } GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY); itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY, null); RenderHelper.disableStandardItemLighting(); diff --git a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java index ca0228ca0..f3b759658 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java @@ -116,6 +116,12 @@ public class ChemicalPlantRecipes extends GenericRecipes { .outputItems(DictFrame.fromOne(ModItems.fuel_additive, EnumFuelAdditive.DEICER))); /// THE CONC AND ASPHALE /// + this.register(new GenericRecipe("chem.cobble").setup(20, 100) + .inputFluids(new FluidStack(Fluids.WATER, 1_000), new FluidStack(Fluids.LAVA, 25)) + .outputItems(new ItemStack(Blocks.cobblestone))); + this.register(new GenericRecipe("chem.stone").setup(60, 500).setPools(GenericRecipes.POOL_PREFIX_DISCOVER) + .inputFluids(new FluidStack(Fluids.WATER, 1_000), new FluidStack(Fluids.LAVA, 25), new FluidStack(Fluids.AIR, 4_000)) + .outputItems(new ItemStack(Blocks.stone))); this.register(new GenericRecipe("chem.concrete").setup(100, 100) .inputItems(new ComparableStack(ModItems.powder_cement, 1), new ComparableStack(Blocks.gravel, 8), new OreDictStack(KEY_SAND, 8)) .inputFluids(new FluidStack(Fluids.WATER, 2_000)) diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index 908804a5e..af47669a1 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -264,12 +264,12 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModItems.crystal_cobalt, new ItemStack(ModItems.powder_cobalt, 3)); /* Misc recycling */ - ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 3)); - ShredderRecipes.setRecipe(ModBlocks.steel_roof, new ItemStack(ModItems.powder_steel_tiny, 13)); - ShredderRecipes.setRecipe(ModBlocks.steel_wall, new ItemStack(ModItems.powder_steel_tiny, 13)); - ShredderRecipes.setRecipe(ModBlocks.steel_corner, new ItemStack(ModItems.powder_steel_tiny, 26)); + ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 2)); + ShredderRecipes.setRecipe(ModBlocks.steel_roof, new ItemStack(ModItems.powder_steel_tiny, 9)); + ShredderRecipes.setRecipe(ModBlocks.steel_wall, new ItemStack(ModItems.powder_steel_tiny, 9)); + ShredderRecipes.setRecipe(ModBlocks.steel_corner, new ItemStack(ModItems.powder_steel_tiny, 18)); ShredderRecipes.setRecipe(ModBlocks.steel_beam, new ItemStack(ModItems.powder_steel_tiny, 3)); - ShredderRecipes.setRecipe(new ItemStack(ModBlocks.steel_scaffold, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.powder_steel_tiny, 7)); + ShredderRecipes.setRecipe(new ItemStack(ModBlocks.steel_scaffold, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.powder_steel_tiny, 4)); ShredderRecipes.setRecipe(ModItems.coil_copper, new ItemStack(ModItems.powder_red_copper, 1)); ShredderRecipes.setRecipe(ModItems.coil_copper_torus, new ItemStack(ModItems.powder_red_copper, 2)); ShredderRecipes.setRecipe(ModItems.coil_advanced_alloy, new ItemStack(ModItems.powder_advanced_alloy, 1)); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ca9456f9d..df5e429b2 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2075,6 +2075,8 @@ public class ModItems { public static Item hazmat_paa_legs; public static Item hazmat_paa_boots; + public static Item rebar_placer; + public static Item wand; public static Item wand_s; public static Item wand_d; @@ -4003,6 +4005,7 @@ public class ModItems { upgrade_stack = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_stack").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_stack"); upgrade_ejector = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_ejector").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_ejector"); + rebar_placer = new ItemRebarPlacer().setUnlocalizedName("rebar_placer").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":rebar_placer"); wand = new ItemWand().setUnlocalizedName("wand_k").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand"); wand_s = new ItemWandS().setUnlocalizedName("wand_s").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_s"); wand_d = new ItemWandD().setUnlocalizedName("wand_d").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_d"); @@ -7047,7 +7050,8 @@ public class ModItems { GameRegistry.registerItem(crystal_horn, crystal_horn.getUnlocalizedName()); GameRegistry.registerItem(crystal_charred, crystal_charred.getUnlocalizedName()); - //OP Tools + //Wands, Tools, Other Crap + GameRegistry.registerItem(rebar_placer, rebar_placer.getUnlocalizedName()); GameRegistry.registerItem(wand, wand.getUnlocalizedName()); GameRegistry.registerItem(wand_s, wand_s.getUnlocalizedName()); GameRegistry.registerItem(wand_d, wand_d.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java new file mode 100644 index 000000000..86b120769 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java @@ -0,0 +1,337 @@ +package com.hbm.items.tool; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockConcreteColoredExt.EnumConcreteType; +import com.hbm.blocks.generic.BlockRebar.TileEntityRebar; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.SlotPattern; +import com.hbm.inventory.gui.GuiInfoContainer; +import com.hbm.items.ItemInventory; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.ChatBuilder; +import com.hbm.util.InventoryUtil; +import com.hbm.util.ItemStackUtil; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.i18n.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemRebarPlacer extends Item implements IGUIProvider { + + public static List> acceptableConk = new ArrayList(); + + public ItemRebarPlacer() { + this.setMaxStackSize(1); + + acceptableConk.add(new Pair(ModBlocks.concrete, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_rebar, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_smooth, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_pillar, 0)); + + for(int i = 0; i < 16; i++) acceptableConk.add(new Pair(ModBlocks.concrete_colored, i)); + for(int i = 0; i < EnumConcreteType.values().length; i++) acceptableConk.add(new Pair(ModBlocks.concrete_colored_ext, i)); + } + + public static boolean isValidConk(Item item, int meta) { + + for(Pair conk : acceptableConk) { + if(item == Item.getItemFromBlock(conk.getKey()) && meta == conk.getValue()) return true; + } + return false; + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } + + // if the placer isn't equipped or no concrete is loaded, forget the cached position + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean held) { + if(stack.hasTagCompound() && stack.stackTagCompound.hasKey("pos")) { + ItemStack theConk = ItemStackUtil.readStacksFromNBT(stack, 1)[0]; + + if(!held || theConk == null) { + stack.stackTagCompound.removeTag("pos"); + return; + } + + if(!isValidConk(theConk.getItem(), theConk.getItemDamage())) { + stack.stackTagCompound.removeTag("pos"); + return; + } + } + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(!world.isRemote && player.isSneaking()) player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); + return stack; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { + if(world.isRemote) return true; + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + ItemStack theConk = ItemStackUtil.readStacksFromNBT(stack, 1)[0]; + + boolean hasConk = theConk != null && isValidConk(theConk.getItem(), theConk.getItemDamage()); + + if(!hasConk) { + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("No valid concrete type set!").color(EnumChatFormatting.RED).flush()); + return true; + } + + ForgeDirection dir = ForgeDirection.getOrientation(side); + + if(!stack.stackTagCompound.hasKey("pos")) { + stack.stackTagCompound.setIntArray("pos", new int[] {x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ}); + } else { + int rebarLeft = InventoryUtil.countAStackMatches(player, new ComparableStack(ModBlocks.rebar), true); + if(rebarLeft <= 0) { + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("Out of rebar!").color(EnumChatFormatting.RED).flush()); + stack.stackTagCompound.removeTag("pos"); + return true; + } + + int[] pos = stack.stackTagCompound.getIntArray("pos"); + int iX = x + dir.offsetX; + int iY = y + dir.offsetY; + int iZ = z + dir.offsetZ; + + int minX = Math.min(pos[0], iX); + int maxX = Math.max(pos[0], iX); + int minY = Math.min(pos[1], iY); + int maxY = Math.max(pos[1], iY); + int minZ = Math.min(pos[2], iZ); + int maxZ = Math.max(pos[2], iZ); + + int rebarUsed = 0; + + outer: for(int k = minY; k <= maxY; k++) { + for(int j = minZ; j <= maxZ; j++) { + for(int i = minX; i<= maxX; i++) { + if(rebarLeft <= 0) break outer; + + if(world.getBlock(i, k, j).isReplaceable(world, i, k, j) && player.canPlayerEdit(i, k, j, side, stack)) { + world.setBlock(i, k, j, ModBlocks.rebar); + TileEntity tile = world.getTileEntity(i, k, j); + if(tile instanceof TileEntityRebar) { + ((TileEntityRebar) tile).setup(Block.getBlockFromItem(theConk.getItem()), theConk.getItemDamage()); + } + rebarUsed++; + rebarLeft--; + } + } + } + } + + InventoryUtil.tryConsumeAStack(player.inventory.mainInventory, 0, player.inventory.mainInventory.length - 1, new ComparableStack(ModBlocks.rebar, rebarUsed)); + + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("Placed " + rebarUsed + " rebar!").color(EnumChatFormatting.GREEN).flush()); + + stack.stackTagCompound.removeTag("pos"); + player.inventoryContainer.detectAndSendChanges(); + } + + return true; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerRebar(player.inventory, new InventoryRebar(player, player.getHeldItem())); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIRebar(player.inventory, new InventoryRebar(player, player.getHeldItem())); + } + + public static class InventoryRebar extends ItemInventory { + + public InventoryRebar(EntityPlayer player, ItemStack box) { + this.player = player; + this.target = box; + slots = new ItemStack[this.getSizeInventory()]; + + if(!box.hasTagCompound()) box.setTagCompound(new NBTTagCompound()); + + ItemStack[] fromNBT = ItemStackUtil.readStacksFromNBT(box, slots.length); + if(fromNBT != null) System.arraycopy(fromNBT, 0, slots, 0, slots.length); + } + + @Override public int getSizeInventory() { return 1; } + @Override public String getInventoryName() { return "container.rebar"; } + @Override public boolean hasCustomInventoryName() { return target.hasDisplayName(); } + @Override public int getInventoryStackLimit() { return 1; } + } + + public static class ContainerRebar extends Container { + + private InventoryRebar rebar; + + public ContainerRebar(InventoryPlayer invPlayer, InventoryRebar rebar) { + this.rebar = rebar; + + this.addSlotToContainer(new SlotPattern(rebar, 0, 53, 36)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 100 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 158)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + // prevents the player from moving around the currently open box + if(mode == 2 && button == player.inventory.currentItem) return null; + if(index == player.inventory.currentItem + 47) return null; + + if(index != 0) return super.slotClick(index, button, mode, player); + + Slot slot = this.getSlot(index); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) ret = slot.getStack().copy(); + slot.putStack(held); + rebar.markDirty(); + + return ret; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return rebar.isUseableByPlayer(player); + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + } + } + + public static class GUIRebar extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_rebar.png"); + private final InventoryRebar inventory; + + public GUIRebar(InventoryPlayer invPlayer, InventoryRebar box) { + super(new ContainerRebar(invPlayer, box)); + this.inventory = box; + + this.xSize = 176; + this.ySize = 182; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + if(this.isMouseOverSlot(this.inventorySlots.getSlot(0), mouseX, mouseY) && !this.inventorySlots.getSlot(0).getHasStack()) { + + List lines = new ArrayList(); + List list = new ArrayList(); + for(Pair conk : acceptableConk) list.add(new ItemStack(conk.getKey(), 1, conk.getValue())); + ItemStack selected = list.get(0); + + if(list.size() > 1) { + int cycle = (int) ((System.currentTimeMillis() % (1000 * list.size())) / 1000); + selected = ((ItemStack) list.get(cycle)).copy(); + selected.stackSize = 0; + list.set(cycle, selected); + } + + if(list.size() < 10) { + lines.add(list.toArray()); + } else if(list.size() < 24) { + lines.add(list.subList(0, list.size() / 2).toArray()); + lines.add(list.subList(list.size() / 2, list.size()).toArray()); + } else { + int bound0 = (int) Math.ceil(list.size() / 3D); + int bound1 = (int) Math.ceil(list.size() / 3D * 2D); + lines.add(list.subList(0, bound0).toArray()); + lines.add(list.subList(bound0, bound1).toArray()); + lines.add(list.subList(bound1, list.size()).toArray()); + } + + lines.add(new Object[] {I18nUtil.resolveKey(selected.getDisplayName())}); + this.drawStackText(lines, mouseX, mouseY, this.fontRendererObj); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = I18n.format(this.inventory.getInventoryName()); + if(inventory.hasCustomInventoryName()) name = inventory.target.getDisplayName(); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(inventory.slots[0] == null || !ItemRebarPlacer.isValidConk(inventory.slots[0].getItem(), inventory.slots[0].getItemDamage())) + drawTexturedModalRect(guiLeft + 87, guiTop + 17, 176, 0, 56, 56); + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 4788a6fd0..d170e553b 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -458,7 +458,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate_wide), 4), new Object[] { "SS", 'S', ModBlocks.steel_grate }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 1), new Object[] { "SS", 'S', ModBlocks.steel_grate_wide }); - addRecipeAuto(new ItemStack(ModBlocks.rebar, 1), new Object[] { "BB", "BB", 'B', STEEL.bolt() }); + addRecipeAuto(new ItemStack(ModBlocks.rebar, 8), new Object[] { "BB", "BB", 'B', STEEL.bolt() }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 0), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeGray" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 1), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeRed" }); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 599e12787..c3dbefea1 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -449,6 +449,7 @@ container.reactor=Brutreaktor container.reactorControl=Reaktorfernsteuerung container.reactorLarge=Großer Atomreaktor container.reactorSmall=Atomreaktor +container.rebar=Armiereisen-Platzierer container.reix=Rei-X Hauptrechner container.rtg=Radioisotopengenerator container.rtgFurnace=RTG-Ofen @@ -3118,6 +3119,7 @@ item.rbmk_tool.set=RBMK verlinkt! item.reacher.name=Wolfram-Greifzange item.reactor_core.name=Brutreaktorkern item.reactor_sensor.name=Reaktor-Fernsensor +item.rebar_placer.name=Armiereisen-Platzierer item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ff4e2e5cc..b02964bcc 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -853,6 +853,7 @@ container.reactorBreeding=Breeding Reactor container.reactorControl=Reactor Remote Control Block container.reactorLarge=Big Nuclear Reactor container.reactorResearch=Research Reactor +container.rebar=Rebar Placer container.reix=Rei-X Mainframe container.rtg=RT Generator container.rtgFurnace=RTG Furnace @@ -4073,6 +4074,7 @@ item.rbmk_tool.set=RBMK linked! item.reacher.name=Tungsten Reacher item.reactor_core.name=Breeding Reactor Core item.reactor_sensor.name=Reactor Remote Sensor +item.rebar_placer.name=Rebar Placer item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep diff --git a/src/main/resources/assets/hbm/textures/gui/gui_rebar.png b/src/main/resources/assets/hbm/textures/gui/gui_rebar.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dfeb186d5bad3432726fba276eae6e61191b93 GIT binary patch literal 3367 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 DddB2B literal 0 HcmV?d00001 From a8485bdb5a6294debc2f4e44060c553c61e52dc5 Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Thu, 24 Jul 2025 00:31:25 +0800 Subject: [PATCH 129/323] kris --- src/main/resources/assets/hbm/lang/zh_CN.lang | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 14a8c62b0..b3a7c29c9 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6109,3 +6109,9 @@ item.fluid_pack_empty.name=大型流体容器 item.fluid_pack_full.name=流体包装 %s tile.pneumatic_tube_paintable.name=可涂漆气动物流管道 tile.oc_cable_paintable.name=可涂漆网线 +container.rebar=钢筋铺设器 +hbmfluid.concrete=液态混凝土 +item.blueprint_folder.name=蓝图册 +item.rebar_placer.name=钢筋铺设器 +tile.concrete_rebar.name=钢筋混凝土 +tile.rebar.name=钢筋 From 2102db622923fdd2cc76594f33bd71704b1baad9 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 24 Jul 2025 15:12:54 +0200 Subject: [PATCH 130/323] RBMK autoloader --- changelog | 5 +- src/main/java/com/hbm/blocks/ModBlocks.java | 12 +- .../hbm/blocks/machine/MachineArcFurnace.java | 288 ----- .../blocks/machine/rbmk/RBMKAutoloader.java | 42 + .../container/ContainerMachineArcFurnace.java | 90 -- .../ContainerMachineReactorBreeding.java | 4 +- .../container/ContainerRBMKAutoloader.java | 54 + .../inventory/gui/GUIMachineArcFurnace.java | 64 - .../hbm/inventory/gui/GUIRBMKAutoloader.java | 72 ++ src/main/java/com/hbm/items/ModItems.java | 2 +- .../com/hbm/items/tool/ItemRebarPlacer.java | 5 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ResourceManager.java | 2 + .../item/weapon/sedna/ItemRenderFlaregun.java | 7 + .../tileentity/RenderRBMKAutoloader.java | 62 + .../hbm/tileentity/TileEntityProxyCombo.java | 4 +- .../java/com/hbm/tileentity/TileMappings.java | 2 +- .../machine/TileEntityDiFurnaceRTG.java | 2 +- .../machine/TileEntityMachineArcFurnace.java | 419 ------- .../TileEntityMachineElectricFurnace.java | 2 +- .../machine/TileEntityRtgFurnace.java | 2 +- .../rbmk/TileEntityRBMKAutoloader.java | 290 +++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/models/rbmk/autoloader.obj | 1029 +++++++++++++++++ .../hbm/textures/blocks/rbmk_autoloader.png | Bin 0 -> 285 bytes .../assets/hbm/textures/gui/gui_arc.png | Bin 3054 -> 0 bytes .../textures/gui/machine/gui_autoloader.png | Bin 0 -> 1736 bytes .../models/machines/rbmk_autoloader.png | Bin 0 -> 1576 bytes 30 files changed, 1586 insertions(+), 880 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java create mode 100644 src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java delete mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java delete mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java create mode 100644 src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java create mode 100644 src/main/resources/assets/hbm/models/rbmk/autoloader.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png delete mode 100644 src/main/resources/assets/hbm/textures/gui/gui_arc.png create mode 100644 src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png diff --git a/changelog b/changelog index fa222ff1a..57f21b30a 100644 --- a/changelog +++ b/changelog @@ -14,7 +14,10 @@ ## Changed * The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints * The chemical plant now has a recipe for making cobblestone from 25mB of lava (which can be liquefacted into even more lava, useful for cobblestone generation) +* Removed the old arc furnace ## Fixed * Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit - * As an extra safeguard, the recipe loader now throws an exception if that happens \ No newline at end of file + * As an extra safeguard, the recipe loader now throws an exception if that happens +* Fixed dupe caused by the breeding reactor +* Fixed a potential crash caused by a change done to tile entity proxies in relation to EnergyControl \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 1b7dd0f7d..f9d312fa8 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -750,9 +750,6 @@ public class ModBlocks { public static Block machine_microwave; - public static Block machine_arc_furnace_off; - public static Block machine_arc_furnace_on; - //public static Block machine_deuterium; public static Block machine_battery_potato; @@ -1124,6 +1121,7 @@ public class ModBlocks { public static Block rbmk_heater; public static Block rbmk_console; public static Block rbmk_crane_console; + public static Block rbmk_autoloader; public static Block rbmk_loader; public static Block rbmk_steam_inlet; public static Block rbmk_steam_outlet; @@ -1526,7 +1524,7 @@ public class ModBlocks { floodlight = new Floodlight(Material.iron).setBlockName("floodlight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); floodlight_beam = new FloodlightBeam().setBlockName("floodlight_beam"); - rebar = new BlockRebar().setBlockName("rebar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":rebar"); + rebar = new BlockRebar().setBlockName("rebar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":rebar"); reinforced_stone = new BlockGeneric(Material.rock).setBlockName("reinforced_stone").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_stone"); concrete_smooth = new BlockRadResistant(Material.rock).setBlockName("concrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored = new BlockConcreteColored(Material.rock).setBlockName("concrete_colored").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); @@ -1877,8 +1875,6 @@ public class ModBlocks { machine_electric_furnace_off = new MachineElectricFurnace(false).setBlockName("machine_electric_furnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_electric_furnace_on = new MachineElectricFurnace(true).setBlockName("machine_electric_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); - machine_arc_furnace_off = new MachineArcFurnace(false).setBlockName("machine_arc_furnace_off").setHardness(5.0F).setResistance(10.0F); - machine_arc_furnace_on = new MachineArcFurnace(true).setBlockName("machine_arc_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_arc_furnace = new MachineArcFurnaceLarge().setBlockName("machine_arc_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_microwave = new MachineMicrowave(Material.iron).setBlockName("machine_microwave").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_microwave"); @@ -2173,6 +2169,7 @@ public class ModBlocks { rbmk_heater = new RBMKHeater().setBlockName("rbmk_heater").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_heater"); rbmk_console = new RBMKConsole().setBlockName("rbmk_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_console"); rbmk_crane_console = new RBMKCraneConsole().setBlockName("rbmk_crane_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_crane_console"); + rbmk_autoloader = new RBMKAutoloader().setBlockName("rbmk_autoloader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_autoloader"); rbmk_loader = new RBMKLoader(Material.iron).setBlockName("rbmk_loader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_loader"); rbmk_steam_inlet = new RBMKInlet(Material.iron).setBlockName("rbmk_steam_inlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_inlet"); rbmk_steam_outlet = new RBMKOutlet(Material.iron).setBlockName("rbmk_steam_outlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_outlet"); @@ -3188,6 +3185,7 @@ public class ModBlocks { GameRegistry.registerBlock(rbmk_heater, rbmk_heater.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_console, rbmk_console.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_crane_console, rbmk_crane_console.getUnlocalizedName()); + register(rbmk_autoloader); register(rbmk_loader); register(rbmk_steam_inlet); register(rbmk_steam_outlet); @@ -3293,8 +3291,6 @@ public class ModBlocks { GameRegistry.registerBlock(machine_converter_rf_he, machine_converter_rf_he.getUnlocalizedName()); GameRegistry.registerBlock(machine_electric_furnace_off, machine_electric_furnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_electric_furnace_on, machine_electric_furnace_on.getUnlocalizedName()); - GameRegistry.registerBlock(machine_arc_furnace_off, machine_arc_furnace_off.getUnlocalizedName()); - GameRegistry.registerBlock(machine_arc_furnace_on, machine_arc_furnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_microwave, machine_microwave.getUnlocalizedName()); GameRegistry.registerBlock(machine_assembler, machine_assembler.getUnlocalizedName()); register(machine_assembly_machine); diff --git a/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java deleted file mode 100644 index 7b45594c8..000000000 --- a/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class MachineArcFurnace extends BlockContainer { - - private final Random field_149933_a = new Random(); - private final boolean isActive; - private static boolean keepInventory; - - @SideOnly(Side.CLIENT) - private IIcon iconFront; - @SideOnly(Side.CLIENT) - private IIcon iconTop; - @SideOnly(Side.CLIENT) - private IIcon iconBottom; - @SideOnly(Side.CLIENT) - private IIcon iconRods; - - public MachineArcFurnace(boolean blockState) { - super(Material.iron); - isActive = blockState; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.iconFront = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_front_on" : ":machine_arc_furnace_front_off")); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_top_on" : ":machine_arc_furnace_top")); - this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_bottom"); - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_side"); - this.iconRods = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_top_rods"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int metadata) { - - if(this == ModBlocks.machine_arc_furnace_off) { - - if(side == 1 && metadata > 5) { - return iconRods; - } - } - - if(metadata > 5) - metadata -= 4; - - if(side == 0) - return this.iconBottom; - if(side == 1) - return this.iconTop; - - return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); - } - - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off); - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); - this.setDefaultDirection(world, x, y, z); - } - - private void setDefaultDirection(World world, int x, int y, int z) { - if(!world.isRemote) - { - Block block1 = world.getBlock(x, y, z - 1); - Block block2 = world.getBlock(x, y, z + 1); - Block block3 = world.getBlock(x - 1, y, z); - Block block4 = world.getBlock(x + 1, y, z); - - byte b0 = 3; - - if(block1.func_149730_j() && !block2.func_149730_j()) - { - b0 = 3; - } - if(block2.func_149730_j() && !block1.func_149730_j()) - { - b0 = 2; - } - if(block3.func_149730_j() && !block4.func_149730_j()) - { - b0 = 5; - } - if(block4.func_149730_j() && !block3.func_149730_j()) - { - b0 = 4; - } - - world.setBlockMetadataWithNotify(x, y, z, b0, 2); - } - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - - if(itemStack.hasDisplayName()) - { - ((TileEntityMachineArcFurnace)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); - } - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { - return true; - } else if(!player.isSneaking()) - { - TileEntityMachineArcFurnace entity = (TileEntityMachineArcFurnace) world.getTileEntity(x, y, z); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } - return true; - } else { - return false; - } - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineArcFurnace(); - } - - public static void updateBlockState(boolean isProcessing, World world, int x, int y, int z) { - int i = world.getBlockMetadata(x, y, z); - TileEntity entity = world.getTileEntity(x, y, z); - keepInventory = true; - - if(isProcessing) - { - world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_on); - }else{ - world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_off); - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, i, 2); - - if(entity != null) { - entity.validate(); - world.setTileEntity(x, y, z, entity); - } - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - TileEntityMachineArcFurnace tileentityfurnace = (TileEntityMachineArcFurnace)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World p_149734_1_, int x, int y, int z, Random rand) - { - if (isActive) - { - int l = p_149734_1_.getBlockMetadata(x, y, z); - float f = x + 0.5F; - float f1 = y + 0.0F + rand.nextFloat() * 6.0F / 16.0F; - float f2 = z + 0.5F; - float f3 = 0.52F; - float f4 = rand.nextFloat() * 0.6F - 0.3F; - - if (l == 4) - { - p_149734_1_.spawnParticle("smoke", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - } - else if (l == 5) - { - p_149734_1_.spawnParticle("smoke", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - } - else if (l == 2) - { - p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D); - } - else if (l == 3) - { - p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) - { - return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off); - } -} diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java new file mode 100644 index 000000000..9eb8f58dc --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java @@ -0,0 +1,42 @@ +package com.hbm.blocks.machine.rbmk; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class RBMKAutoloader extends BlockDummyable { + + public RBMKAutoloader() { + super(Material.iron); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.125, 0, -0.125, 0.125, 4, 0.125)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.5, 4, -0.5, 0.5, 9, 0.5)); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityRBMKAutoloader(); + return new TileEntityProxyCombo().inventory(); + } + + @Override + public int[] getDimensions() { + return new int[] {8, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java deleted file mode 100644 index c3dd0c537..000000000 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.hbm.inventory.container; - -import com.hbm.inventory.SlotSmelting; -import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import api.hbm.energymk2.IBatteryItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerMachineArcFurnace extends Container { - - private TileEntityMachineArcFurnace diFurnace; - - public ContainerMachineArcFurnace(InventoryPlayer invPlayer, TileEntityMachineArcFurnace tedf) { - - diFurnace = tedf; - - this.addSlotToContainer(new Slot(tedf, 0, 56, 17)); - this.addSlotToContainer(new SlotSmelting(invPlayer.player, tedf, 1, 116, 35)); - this.addSlotToContainer(new Slot(tedf, 2, 38, 53)); - this.addSlotToContainer(new Slot(tedf, 3, 56, 53)); - this.addSlotToContainer(new Slot(tedf, 4, 74, 53)); - this.addSlotToContainer(new Slot(tedf, 5, 8, 53)); - - for(int i = 0; i < 3; i++) { - for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); - } - } - - @Override - public void addCraftingToCrafters(ICrafting crafting) { - super.addCraftingToCrafters(crafting); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack rStack = null; - Slot slot = (Slot) this.inventorySlots.get(index); - - if(slot != null && slot.getHasStack()) { - ItemStack stack = slot.getStack(); - rStack = stack.copy(); - - if(index <= 5) { - if(!this.mergeItemStack(stack, 6, this.inventorySlots.size(), true)) { - return null; - } - - slot.onSlotChange(stack, rStack); - - } else { - - if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { - if(!this.mergeItemStack(stack, 5, 6, false)) - return null; - - } else if(rStack.getItem() == ModItems.arc_electrode) { - if(!this.mergeItemStack(stack, 2, 5, false)) - return null; - - } else if(!this.mergeItemStack(stack, 0, 1, false)) - return null; - } - - if(stack.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return rStack; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } -} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java b/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java index 331b69d1d..cab45d330 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java @@ -43,8 +43,8 @@ public class ContainerMachineReactorBreeding extends Container { ItemStack stack = slot.getStack(); var3 = stack.copy(); - if(index <= 1) { - if(!this.mergeItemStack(stack, 1, this.inventorySlots.size(), true)) { + if(index <= 2) { + if(!this.mergeItemStack(stack, 2, this.inventorySlots.size(), true)) { return null; } diff --git a/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java b/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java new file mode 100644 index 000000000..de34fab6b --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java @@ -0,0 +1,54 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerRBMKAutoloader extends ContainerBase { + + public TileEntityRBMKAutoloader loader; + + public ContainerRBMKAutoloader(InventoryPlayer invPlayer, TileEntityRBMKAutoloader tedf) { + super(invPlayer, tedf); + loader = tedf; + + this.addSlots(loader, 0, 17, 18, 3, 3); + this.addTakeOnlySlots(loader, 9, 107, 18, 3, 3); + this.playerInv(invPlayer, 8, 100); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 17) { + if(!this.mergeItemStack(stack, 18, this.inventorySlots.size(), true)) { + return null; + } + } else { + if(!this.mergeItemStack(stack, 0, 9, false)) return null; + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return loader.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java deleted file mode 100644 index 5f6e04fdf..000000000 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.hbm.inventory.gui; - -import org.lwjgl.opengl.GL11; - -import com.hbm.inventory.container.ContainerMachineArcFurnace; -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.ResourceLocation; - -public class GUIMachineArcFurnace extends GuiInfoContainer { - - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_arc.png"); - private TileEntityMachineArcFurnace diFurnace; - - public GUIMachineArcFurnace(InventoryPlayer invPlayer, TileEntityMachineArcFurnace tedf) { - super(new ContainerMachineArcFurnace(invPlayer, tedf)); - diFurnace = tedf; - - this.xSize = 176; - this.ySize = 166; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float f) { - super.drawScreen(mouseX, mouseY, f); - - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 51 - 34, 16, 34, diFurnace.power, diFurnace.maxPower); - } - - @Override - protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineArcFurnace) - diFurnace = (TileEntityMachineArcFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - - if(diFurnace.hasPower()) { - int i = (int)diFurnace.getPowerRemainingScaled(34); - drawTexturedModalRect(guiLeft + 8, guiTop + 51 - i, 176, 67 - i, 16, i); - } - - if(diFurnace.canProcess() && diFurnace.hasPower()) - { - drawTexturedModalRect(guiLeft + 55, guiTop + 35, 176, 0, 15, 16); - } - - int j1 = diFurnace.getDiFurnaceProgressScaled(24); - drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 16, j1 + 1, 17); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java new file mode 100644 index 000000000..2805437f6 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java @@ -0,0 +1,72 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerRBMKAutoloader; +import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public class GUIRBMKAutoloader extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_autoloader.png"); + private TileEntityRBMKAutoloader loader; + + public GUIRBMKAutoloader(InventoryPlayer invPlayer, TileEntityRBMKAutoloader tile) { + super(new ContainerRBMKAutoloader(invPlayer, tile)); + loader = tile; + + this.xSize = 176; + this.ySize = 182; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 74 <= x && guiLeft + 74 + 12 > x && guiTop + 36 < y && guiTop + 36 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("minus", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, loader.xCoord, loader.yCoord, loader.zCoord)); + } + + if(guiLeft + 90 <= x && guiLeft + 90 + 12 > x && guiTop + 36 < y && guiTop + 36 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("plus", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, loader.xCoord, loader.yCoord, loader.zCoord)); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.loader.hasCustomInventoryName() ? this.loader.getInventoryName() : I18n.format(this.loader.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0xFFFFFF); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + String percent = loader.cycle + "%"; + this.fontRendererObj.drawString(percent, this.xSize / 2 - this.fontRendererObj.getStringWidth(percent) / 2, 23, 0x00FF00); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index df5e429b2..b8bbdbde8 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4005,7 +4005,7 @@ public class ModItems { upgrade_stack = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_stack").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_stack"); upgrade_ejector = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_ejector").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_ejector"); - rebar_placer = new ItemRebarPlacer().setUnlocalizedName("rebar_placer").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":rebar_placer"); + rebar_placer = new ItemRebarPlacer().setUnlocalizedName("rebar_placer").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":rebar_placer"); wand = new ItemWand().setUnlocalizedName("wand_k").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand"); wand_s = new ItemWandS().setUnlocalizedName("wand_s").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_s"); wand_d = new ItemWandD().setUnlocalizedName("wand_d").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_d"); diff --git a/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java index 86b120769..d6d5715cd 100644 --- a/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java +++ b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java @@ -101,7 +101,10 @@ public class ItemRebarPlacer extends Item implements IGUIProvider { @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { if(world.isRemote) return true; - if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + if(!stack.hasTagCompound()) { + stack.stackTagCompound = new NBTTagCompound(); + ItemStackUtil.addStacksToNBT(stack, new ItemStack[] {new ItemStack(ModBlocks.concrete_rebar)}); + } ItemStack theConk = ItemStackUtil.readStacksFromNBT(stack, 1)[0]; boolean hasConk = theConk != null && isValidConk(theConk.getItem(), theConk.getItemDamage()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 1d934e87d..1661a221b 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -416,6 +416,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKCooler.class, new RenderRBMKLid()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKStorage.class, new RenderRBMKLid()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKHeater.class, new RenderRBMKLid()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKAutoloader.class, new RenderRBMKAutoloader()); //ITER ClientRegistry.bindTileEntitySpecialRenderer(TileEntityITER.class, new RenderITER()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePlasmaHeater.class, new RenderPlasmaHeater()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index dffae8513..b1818f018 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1721,6 +1721,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.journal_pip"); ignoreMappings.add("hbm:item.journal_bj"); ignoreMappings.add("hbm:item.journal_silver"); + ignoreMappings.add("hbm:tile.machine_arc_furnace_off"); + ignoreMappings.add("hbm:tile.machine_arc_furnace_on"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index a1fee2c2c..fb125b628 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1565,10 +1565,12 @@ public class ResourceManager { public static final IModelCustom rbmk_rods_vbo = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_rods.obj")).asVBO(); public static final IModelCustom rbmk_crane_console = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/crane_console.obj")).asVBO(); public static final IModelCustom rbmk_crane = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/crane.obj")).asVBO(); + public static final IModelCustom rbmk_autoloader = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/autoloader.obj")).asVBO(); public static final IModelCustom rbmk_console = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_console.obj")).asVBO(); public static final IModelCustom rbmk_debris = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/debris.obj")); public static final ResourceLocation rbmk_crane_console_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/crane_console.png"); public static final ResourceLocation rbmk_crane_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_crane.png"); + public static final ResourceLocation rbmk_autoloader_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_autoloader.png"); public static final ResourceLocation rbmk_console_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_control.png"); public static final IModelCustom hev_battery = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/battery.obj")); public static final IModelCustom anvil = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/anvil.obj")); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java index 3bcabc96b..d21439d5d 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java @@ -112,6 +112,13 @@ public class ItemRenderFlaregun extends ItemRenderWeaponBase { GL11.glRotated(90, 0, 1, 0); } + @Override + public void setupEntity(ItemStack stack) { + super.setupEntity(stack); + double scale = 0.5D; + GL11.glScaled(scale, scale, scale); + } + @Override public void renderOther(ItemStack stack, ItemRenderType type) { GL11.glEnable(GL11.GL_LIGHTING); diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java new file mode 100644 index 000000000..3018364a9 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java @@ -0,0 +1,62 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderRBMKAutoloader extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.rbmk_autoloader_tex); + ResourceManager.rbmk_autoloader.renderPart("Base"); + + TileEntityRBMKAutoloader press = (TileEntityRBMKAutoloader) tile; + double p = (press.lastPiston + (press.renderPiston - press.lastPiston) * interp); + GL11.glTranslated(0, p * -4D, 0); + + GL11.glTranslated(0, 4, 0); + ResourceManager.rbmk_autoloader.renderPart("Piston"); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.rbmk_autoloader); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -6, 0); + GL11.glScaled(1.75, 1.75, 1.75); + } + public void renderCommon() { + GL11.glRotated(180, 0, 1, 0); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.rbmk_autoloader_tex); + ResourceManager.rbmk_autoloader.renderPart("Base"); + ResourceManager.rbmk_autoloader.renderPart("Piston"); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glEnable(GL11.GL_CULL_FACE); + }}; + } + +} diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java index c38e5f51e..fb80aa785 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java @@ -75,8 +75,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy return this; } - /** Returns the actual tile entity that represents the core. Only for internal use. */ - protected TileEntity getTile() { + /** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */ + public TileEntity getTile() { if(tile == null || tile.isInvalid()) { tile = this.getTE(); } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 3b7676d73..7a8f9ead4 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -149,7 +149,6 @@ public class TileMappings { put(TileEntityCoreInjector.class, "tileentity_v0_injector"); put(TileEntityCoreStabilizer.class, "tileentity_v0_stabilizer"); put(TileEntityCore.class, "tileentity_v0"); - put(TileEntityMachineArcFurnace.class, "tileentity_arc_furnace"); put(TileEntityMachineAmgen.class, "tileentity_amgen"); put(TileEntityMachineHephaestus.class, "tileentity_hephaestus"); put(TileEntityGeysir.class, "tileentity_geysir"); @@ -403,6 +402,7 @@ public class TileMappings { put(TileEntityRBMKConsole.class, "tileentity_rbmk_console"); put(TileEntityRBMKInlet.class, "tileentity_rbmk_inlet"); put(TileEntityRBMKOutlet.class, "tileentity_rbmk_outlet"); + put(TileEntityRBMKAutoloader.class, "tileentity_rbmk_autoloader"); } private static void putNetwork() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index 5776fa53a..2c4999f23 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -105,7 +105,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGU for(int i = 0; i < 2; i++) { if(slots[i].stackSize <= 0) - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); else slots[i].stackSize--; if(slots[i].stackSize <= 0) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java deleted file mode 100644 index 7c6df467c..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ /dev/null @@ -1,419 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.machine.MachineArcFurnace; -import com.hbm.inventory.container.ContainerMachineArcFurnace; -import com.hbm.inventory.gui.GUIMachineArcFurnace; -import com.hbm.items.ModItems; -import com.hbm.lib.Library; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.TileEntityLoadedBase; -import com.hbm.util.CompatEnergyControl; - -import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider, IInfoProviderEC { - - private ItemStack slots[]; - - public int dualCookTime; - public long power; - public static final long maxPower = 50000; - public static final int processingSpeed = 20; - - //0: i - //1: o - //2: 1 - //3: 2 - //4: 3 - //5: b - private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5}; - - private String customName; - - public TileEntityMachineArcFurnace() { - slots = new ItemStack[6]; - } - - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.arcFurnace"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - markDirty(); - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; - } - } - - //You scrubs aren't needed for anything (right now) - @Override - public void openInventory() {} - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - - if(i == 2 || i == 3 || i == 4) - return itemStack.getItem() == ModItems.arc_electrode; - - if(i == 0) - return FurnaceRecipes.smelting().getSmeltingResult(itemStack) != null; - - return false; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.power = nbt.getLong("powerTime"); - this.dualCookTime = nbt.getInteger("cookTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - - customName = nbt.getString("name"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setLong("powerTime", power); - nbt.setInteger("cookTime", dualCookTime); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - - if (customName != null) { - nbt.setString("name", customName); - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return slots_io; - } - - @Override - public boolean canInsertItem(int i, ItemStack itemStack, int j) { - return this.isItemValidForSlot(i, itemStack); - } - - @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - - if(i == 1) - return true; - - if(i == 2 || i == 3 || i == 4) - return itemStack.getItem() == ModItems.arc_electrode_burnt; - - return false; - } - - public int getDiFurnaceProgressScaled(int i) { - return (dualCookTime * i) / processingSpeed; - } - - public long getPowerRemainingScaled(long i) { - return (power * i) / maxPower; - } - - public boolean hasPower() { - return power >= 250; - } - - public boolean isProcessing() { - return this.dualCookTime > 0; - } - - private boolean hasElectrodes() { - - if(slots[2] != null && slots[3] != null && slots[4] != null) { - if((slots[2].getItem() == ModItems.arc_electrode) && - (slots[3].getItem() == ModItems.arc_electrode) && - (slots[4].getItem() == ModItems.arc_electrode)) - return true; - } - - return false; - } - - public boolean canProcess() { - - if(!hasElectrodes()) - return false; - - if(slots[0] == null) - { - return false; - } - ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - - if(itemStack == null) - { - return false; - } - - if(slots[1] == null) - { - return true; - } - - if(!slots[1].isItemEqual(itemStack)) { - return false; - } - - if(slots[1].stackSize < getInventoryStackLimit() && slots[1].stackSize < slots[1].getMaxStackSize()) { - return true; - }else{ - return slots[1].stackSize < itemStack.getMaxStackSize(); - } - } - - private void processItem() { - if(canProcess()) { - ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - - if(slots[1] == null) - { - slots[1] = itemStack.copy(); - }else if(slots[1].isItemEqual(itemStack)) { - slots[1].stackSize += itemStack.stackSize; - } - - for(int i = 0; i < 1; i++) - { - if(slots[i].stackSize <= 0) - { - slots[i] = new ItemStack(slots[i].getItem()); - }else{ - slots[i].stackSize--; - } - if(slots[i].stackSize <= 0) - { - slots[i] = null; - } - } - } - } - - //TODO: fix this punjabi trash - @Override - public void updateEntity() { - boolean flag1 = false; - - if(!worldObj.isRemote) { - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - - if(hasPower() && canProcess()) - { - dualCookTime++; - - power -= 250; - - if(power < 0) - power = 0; - - if(this.dualCookTime == processingSpeed) - { - this.dualCookTime = 0; - this.processItem(); - flag1 = true; - } - }else{ - dualCookTime = 0; - } - - boolean trigger = true; - - if(hasPower() && canProcess() && this.dualCookTime == 0) - { - trigger = false; - } - - if(trigger) - { - flag1 = true; - MachineArcFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } - - if(worldObj.getBlock(xCoord, yCoord, zCoord) == ModBlocks.machine_arc_furnace_off) { - - int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - - if(hasElectrodes() && meta <= 5) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta + 4, 2); - } - if(!hasElectrodes() && meta > 5) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta - 4, 2); - } - } - - power = Library.chargeTEFromItems(slots, 5, power, maxPower); - - networkPackNT(50); // it makes no sense to refactor this to some, but I want to delete the AuxElectricityPacket already - } - - if(flag1) - { - this.markDirty(); - } - } - - @Override - public void serialize(ByteBuf buf) { - super.serialize(buf); - buf.writeLong(power); - buf.writeInt(dualCookTime); - } - - @Override - public void deserialize(ByteBuf buf) { - super.deserialize(buf); - power = buf.readLong(); - dualCookTime = buf.readInt(); - } - - @Override - public void setPower(long i) { - power = i; - - } - - @Override - public long getPower() { - return power; - - } - - @Override - public long getMaxPower() { - return maxPower; - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerMachineArcFurnace(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineArcFurnace(player.inventory, this); - } - - @Override - public void provideExtraInfo(NBTTagCompound data) { - data.setBoolean(CompatEnergyControl.B_ACTIVE, this.hasPower() && this.canProcess()); - data.setInteger(CompatEnergyControl.I_PROGRESS, this.dualCookTime); - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index 84c1fd378..bd76ff316 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -154,7 +154,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl for(int i = 1; i < 2; i++) { if(slots[i].stackSize <= 0) { - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); } else { slots[i].stackSize--; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java index 72882cabd..f2ac74441 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java @@ -240,7 +240,7 @@ public class TileEntityRtgFurnace extends TileEntity implements ISidedInventory, { if(slots[i].stackSize <= 0) { - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); }else{ slots[i].stackSize--; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java new file mode 100644 index 000000000..8ba45ef55 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java @@ -0,0 +1,290 @@ +package com.hbm.tileentity.machine.rbmk; + +import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; +import com.hbm.inventory.container.ContainerRBMKAutoloader; +import com.hbm.inventory.gui.GUIRBMKAutoloader; +import com.hbm.items.machine.ItemRBMKRod; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class TileEntityRBMKAutoloader extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, ICopiable { + + public double piston; + public double renderPiston; + public double lastPiston; + private double syncPiston; + private int turnProgress; + private boolean isRetracting = true; + private int delay = 0; + + public static double speed = 0.005D; + + public int cycle = 50; + + private AudioWrapper audioLift; + + public TileEntityRBMKAutoloader() { + super(18); + } + + @Override + public String getName() { + return "container.rbmkAutoloader"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(delay > 0) delay--; + + if(delay <= 0 && this.isRetracting && this.piston > 0D) { + this.piston -= this.speed; + if(this.piston <= 0) { + this.piston = 0; + this.delay = 40; + } + } + + // check for connected fuel rod and decide whether to begin working + if(isRetracting && worldObj.getTotalWorldTime() % 20 == 0 && this.hasFuel() && this.hasSpace()) { + Block below = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + if(below instanceof RBMKBase) { + int[] pos = ((RBMKBase) below).findCore(worldObj, xCoord, yCoord - 1, zCoord); + TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); + if(tile instanceof TileEntityRBMKRod) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + if(rod.slots[0] == null || (rod.slots[0] != null && rod.slots[0].getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(rod.slots[0]) * 100 < cycle)) { + this.isRetracting = false; + } + } + } + } + + if(delay <= 0 && !this.isRetracting && this.piston < 1D) { + this.piston += this.speed; + if(this.piston >= 1) { + this.piston = 1; + this.delay = 40; + } + } + + // once the piston is fully extended + if(!isRetracting && this.piston >= 1D) { + this.piston = 1D; + + Block below = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + if(below instanceof RBMKBase) { + int[] pos = ((RBMKBase) below).findCore(worldObj, xCoord, yCoord - 1, zCoord); + TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); + if(tile instanceof TileEntityRBMKRod) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + // try to take out the old fuel rod + if(rod.slots[0] != null && this.hasSpace()) { + for(int i = 9; i < 18; i++) { + if(slots[i] == null) { + slots[i] = rod.slots[0].copy(); + rod.slots[0] = null; + break; + } + } + } + // if there's space, try and insert a new fuel rod + if(rod.slots[0] == null) { + for(int i = 0; i < 9; i++) { + ItemStack stack = slots[i]; + if(stack != null && stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle) { + rod.slots[0] = stack.copy(); + slots[i] = null; + break; + } + } + } + + this.isRetracting = true; + this.delay = 40; + } + } + } + + this.networkPackNT(100); + } else { + + this.lastPiston = this.renderPiston; + + if(this.turnProgress > 0) { + this.renderPiston = this.renderPiston + ((this.syncPiston - this.renderPiston) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.renderPiston = this.syncPiston; + } + + if(this.renderPiston > 0.01 && this.renderPiston < 0.99) { + if(this.audioLift == null || !this.audioLift.isPlaying()) { + this.audioLift = MainRegistry.proxy.getLoopedSound("hbm:door.wgh_start", xCoord, yCoord, zCoord, this.getVolume(0.75F), 25F, 1.0F, 5); + this.audioLift.startSound(); + } + this.audioLift.updateVolume(this.getVolume(0.75F)); + this.audioLift.keepAlive(); + } else { + if(this.audioLift != null) { + this.audioLift.stopSound(); + this.audioLift = null; + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:door.wgh_stop", this.getVolume(2F), 1F); + } + } + + if(this.renderPiston > 0.99) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", 0F); + data.setFloat("base", 0.25F); + data.setFloat("max", 1.5F); + data.setInteger("life", 70 + worldObj.rand.nextInt(30)); + data.setDouble("posX", xCoord + 0.5 + worldObj.rand.nextGaussian() * 0.125); + data.setDouble("posZ", zCoord + 0.5 + worldObj.rand.nextGaussian() * 0.125); + data.setDouble("posY", yCoord + 0.25); + data.setBoolean("noWind", true); + data.setFloat("alphaMod", 2F); + data.setFloat("strafe", 0.05F); + for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); + } + } + } + + public boolean hasFuel() { + for(int i = 0; i < 9; i++) { + ItemStack stack = slots[i]; + if(stack != null && stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle) { + return true; + } + } + + return false; + } + + public boolean hasSpace() { + for(int i = 9; i < 18; i++) if(slots[i] == null) return true; + return false; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.piston); + buf.writeInt(this.cycle); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.syncPiston = buf.readDouble(); + this.cycle = buf.readInt(); + + this.turnProgress = 2; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle && i < 9; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return this.piston <= 0 ? new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } : new int[0]; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i >= 9; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + piston = nbt.getDouble("piston"); + isRetracting = nbt.getBoolean("ret"); + delay = nbt.getInteger("delay"); + cycle = nbt.getInteger("cycle"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("piston", piston); + nbt.setBoolean("ret", isRetracting); + nbt.setInteger("delay", delay); + nbt.setInteger("cycle", cycle); + } + + protected AxisAlignedBB aabb; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(aabb != null) return aabb; + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 9, zCoord + 1); + return aabb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("minus") && this.cycle > 5) this.cycle -= 5; + if(data.hasKey("plus") && this.cycle < 95) this.cycle += 5; + this.cycle = MathHelper.clamp_int(cycle, 5, 95); + this.markChanged(); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerRBMKAutoloader(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIRBMKAutoloader(player.inventory, this); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("cycle", cycle); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("cycle")) { + this.cycle = MathHelper.clamp_int(nbt.getInteger("cycle"), 5, 95); + } + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c3dbefea1..c569a4c24 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -437,6 +437,7 @@ container.radGen=Strahlenbetriebener Generator container.radar=Radar container.radiobox=UKW-Sender container.radiorec=UKW Radio +container.rbmkAutoloader=RBMK-Ladeautomat container.rbmkBoiler=RBMK Dampfkanal container.rbmkControl=RBMK Steuerstäbe container.rbmkControlAuto=RBMK Automatische Steuerstäbe @@ -4729,6 +4730,7 @@ tile.rail_large_switch.name=Normalspur-Weiche (15m, Links) tile.rail_large_switch_flipped.name=Normalspur-Weiche (15m, Rechts) tile.rail_wood.name=Holzschienen tile.rbmk_absorber.name=RBMK Bor-Neutronenabsorber +tile.rbmk_autoloader.name=RBMK-Ladeautomat tile.rbmk_blank.name=RBMK Strukturteil tile.rbmk_boiler.name=RBMK Dampfkanal tile.rbmk_cooler.name=RBMK Kühler diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index b02964bcc..f5702bf91 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -841,6 +841,7 @@ container.radar=Radar container.radiobox=FM Transmitter container.radiolysis=RTG and Radiolysis Chamber container.radiorec=FM Radio +container.rbmkAutoloader=RBMK Autoloader container.rbmkBoiler=RBMK Steam Channel container.rbmkControl=RBMK Control Rods container.rbmkControlAuto=RBMK Automatic Control Rods @@ -5877,6 +5878,7 @@ tile.rail_large_switch_flipped.name=Standard Gauge Switch Rail (15m, Right) tile.rail_narrow.name=Narrow Gauge Cart Rail tile.rail_wood.name=Wooden Tracks tile.rbmk_absorber.name=RBMK Boron Neutron Absorber +tile.rbmk_autoloader.name=RBMK Autoloader tile.rbmk_blank.name=RBMK Structural Column tile.rbmk_boiler.name=RBMK Steam Channel tile.rbmk_console.name=RBMK Console diff --git a/src/main/resources/assets/hbm/models/rbmk/autoloader.obj b/src/main/resources/assets/hbm/models/rbmk/autoloader.obj new file mode 100644 index 000000000..4b1dea3a7 --- /dev/null +++ b/src/main/resources/assets/hbm/models/rbmk/autoloader.obj @@ -0,0 +1,1029 @@ +# Blender v2.79 (sub 0) OBJ File: 'autoloader.blend' +# www.blender.org +o Piston +v 0.062500 0.000000 0.312500 +v 0.062500 0.000000 0.187500 +v 0.187500 0.000000 0.062500 +v 0.187500 0.000000 0.437500 +v 0.312500 0.000000 0.437500 +v 0.312500 0.000000 0.062500 +v 0.437500 0.000000 0.187500 +v 0.437500 0.000000 0.312500 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.062500 0.500000 0.312500 +v 0.062500 0.500000 0.187500 +v 0.187500 0.500000 0.062500 +v 0.187500 0.500000 0.437500 +v 0.312500 0.500000 0.437500 +v 0.312500 0.500000 0.062500 +v 0.437500 0.500000 0.187500 +v 0.437500 0.500000 0.312500 +v 0.062500 0.000000 -0.187500 +v 0.062500 0.000000 -0.312500 +v 0.187500 0.000000 -0.437500 +v 0.187500 0.000000 -0.062500 +v 0.312500 0.000000 -0.062500 +v 0.312500 0.000000 -0.437500 +v 0.437500 0.000000 -0.312500 +v 0.437500 0.000000 -0.187500 +v 0.062500 0.500000 -0.187500 +v 0.062500 0.500000 -0.312500 +v 0.187500 0.500000 -0.437500 +v 0.187500 0.500000 -0.062500 +v 0.312500 0.500000 -0.062500 +v 0.312500 0.500000 -0.437500 +v 0.437500 0.500000 -0.312500 +v 0.437500 0.500000 -0.187500 +v -0.437500 0.000000 0.312500 +v -0.437500 0.000000 0.187500 +v -0.312500 0.000000 0.062500 +v -0.312500 0.000000 0.437500 +v -0.187500 0.000000 0.437500 +v -0.187500 0.000000 0.062500 +v -0.062500 0.000000 0.187500 +v -0.062500 0.000000 0.312500 +v -0.437500 0.500000 0.312500 +v -0.437500 0.500000 0.187500 +v -0.312500 0.500000 0.062500 +v -0.312500 0.500000 0.437500 +v -0.187500 0.500000 0.437500 +v -0.187500 0.500000 0.062500 +v -0.062500 0.500000 0.187500 +v -0.062500 0.500000 0.312500 +v -0.437500 0.000000 -0.187500 +v -0.437500 0.000000 -0.312500 +v -0.312500 0.000000 -0.437500 +v -0.312500 0.000000 -0.062500 +v -0.187500 0.000000 -0.062500 +v -0.187500 0.000000 -0.437500 +v -0.062500 0.000000 -0.312500 +v -0.062500 0.000000 -0.187500 +v -0.437500 0.500000 -0.187500 +v -0.437500 0.500000 -0.312500 +v -0.312500 0.500000 -0.437500 +v -0.312500 0.500000 -0.062500 +v -0.187500 0.500000 -0.062500 +v -0.187500 0.500000 -0.437500 +v -0.062500 0.500000 -0.312500 +v -0.062500 0.500000 -0.187500 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.375000 0.750000 -0.375000 +v -0.375000 0.750000 -0.375000 +v 0.375000 0.750000 0.375000 +v -0.375000 0.750000 0.375000 +v 0.375000 4.500000 -0.375000 +v -0.375000 4.500000 -0.375000 +v 0.375000 4.500000 0.375000 +v -0.375000 4.500000 0.375000 +v 0.437500 4.500000 0.187500 +v 0.437500 4.500000 0.312500 +v 0.437500 0.500000 0.187500 +v 0.437500 0.500000 0.312500 +v 0.375000 4.500000 -0.312500 +v 0.375000 4.500000 -0.187500 +v 0.375000 0.500000 -0.312500 +v 0.375000 0.500000 -0.187500 +v 0.437500 4.500000 -0.312500 +v 0.437500 4.500000 -0.187500 +v 0.437500 0.500000 -0.312500 +v 0.437500 0.500000 -0.187500 +v 0.375000 0.500000 0.312500 +v 0.375000 0.500000 0.187500 +v 0.375000 4.500000 0.312500 +v 0.375000 4.500000 0.187500 +v -0.437500 4.500000 -0.187500 +v -0.437500 4.500000 -0.312500 +v -0.437500 0.500000 -0.187500 +v -0.437500 0.500000 -0.312500 +v -0.375000 4.500000 0.312500 +v -0.375000 4.500000 0.187500 +v -0.375000 0.500000 0.312500 +v -0.375000 0.500000 0.187500 +v -0.437500 4.500000 0.312500 +v -0.437500 4.500000 0.187500 +v -0.437500 0.500000 0.312500 +v -0.437500 0.500000 0.187500 +v -0.375000 0.500000 -0.312500 +v -0.375000 0.500000 -0.187500 +v -0.375000 4.500000 -0.312500 +v -0.375000 4.500000 -0.187500 +v 0.187500 4.500000 -0.437500 +v 0.312500 4.500000 -0.437500 +v 0.187500 0.500000 -0.437500 +v 0.312500 0.500000 -0.437500 +v -0.312500 4.500000 -0.375000 +v -0.187500 4.500000 -0.375000 +v -0.312500 0.500000 -0.375000 +v -0.187500 0.500000 -0.375000 +v -0.312500 4.500000 -0.437500 +v -0.187500 4.500000 -0.437500 +v -0.312500 0.500000 -0.437500 +v -0.187500 0.500000 -0.437500 +v 0.312500 0.500000 -0.375000 +v 0.187500 0.500000 -0.375000 +v 0.312500 4.500000 -0.375000 +v 0.187500 4.500000 -0.375000 +v -0.187500 4.500000 0.437500 +v -0.312500 4.500000 0.437500 +v -0.187500 0.500000 0.437500 +v -0.312500 0.500000 0.437500 +v 0.312500 4.500000 0.375000 +v 0.187500 4.500000 0.375000 +v 0.312500 0.500000 0.375000 +v 0.187500 0.500000 0.375000 +v 0.312500 4.500000 0.437500 +v 0.187500 4.500000 0.437500 +v 0.312500 0.500000 0.437500 +v 0.187500 0.500000 0.437500 +v -0.312500 0.500000 0.375000 +v -0.187500 0.500000 0.375000 +v -0.312500 4.500000 0.375000 +v -0.187500 4.500000 0.375000 +vt 0.736842 0.150943 +vt 0.631579 0.226415 +vt 0.631579 0.150943 +vt 0.611842 0.009434 +vt 0.631579 0.000000 +vt 0.625000 0.028302 +vt 0.559211 0.141509 +vt 0.598684 0.141509 +vt 0.546053 0.141509 +vt 0.526316 0.150943 +vt 0.532895 0.122642 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.546053 0.084906 +vt 0.559211 0.066038 +vt 0.559211 0.084906 +vt 0.572368 0.103774 +vt 0.585526 0.122642 +vt 0.572368 0.122642 +vt 0.598684 0.084906 +vt 0.611842 0.066038 +vt 0.611842 0.084906 +vt 0.572368 0.028302 +vt 0.585526 0.047170 +vt 0.572368 0.047170 +vt 0.598684 0.066038 +vt 0.585526 0.103774 +vt 0.559211 0.009434 +vt 0.585526 0.028302 +vt 0.532895 0.103774 +vt 0.546053 0.066038 +vt 0.625000 0.047170 +vt 0.625000 0.103774 +vt 0.532895 0.028302 +vt 0.526316 0.000000 +vt 0.546053 0.009434 +vt 0.625000 0.122642 +vt 0.611842 0.141509 +vt 0.532895 0.047170 +vt 0.598684 0.009434 +vt 0.842105 0.150943 +vt 0.736842 0.226415 +vt 0.526316 0.226415 +vt 0.421053 0.226415 +vt 0.421053 0.150943 +vt 0.539474 0.264151 +vt 0.434211 0.264151 +vt 0.842105 0.226415 +vt 0.750000 0.264151 +vt 0.644737 0.264151 +vt 0.723684 0.264151 +vt 0.644737 0.830189 +vt 0.513158 0.264151 +vt 0.434211 0.830189 +vt 0.828947 0.264151 +vt 0.750000 0.830189 +vt 0.618421 0.264151 +vt 0.539474 0.830189 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.723684 0.830189 +vt 0.513158 0.830189 +vt 0.828947 0.830189 +vt 0.618421 0.830189 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn -0.8944 0.4472 0.0000 +vn 0.0000 0.4472 -0.8944 +s off +f 70/1/1 12/2/1 69/3/1 +f 54/4/2 70/5/2 55/6/2 +f 7/7/2 28/8/2 69/3/2 +f 8/9/2 71/10/2 5/11/2 +f 8/12/3 19/13/3 7/14/3 +f 7/14/4 18/15/4 6/16/4 +f 15/17/5 2/18/5 3/19/5 +f 4/20/1 17/21/1 5/22/1 +f 1/23/6 16/24/6 4/25/6 +f 5/22/7 20/26/7 8/12/7 +f 6/16/8 15/17/8 3/19/8 +f 14/27/9 1/23/9 2/18/9 +f 19/28/2 17/29/2 13/30/2 +f 28/31/3 35/32/3 27/33/3 +f 27/33/4 34/34/4 26/35/4 +f 31/36/5 22/37/5 23/38/5 +f 24/39/1 33/40/1 25/41/1 +f 21/42/6 32/43/6 24/44/6 +f 25/41/7 36/45/7 28/31/7 +f 26/35/8 31/36/8 23/38/8 +f 30/46/9 21/42/9 22/37/9 +f 35/47/2 33/48/2 29/49/2 +f 44/50/3 51/51/3 43/52/3 +f 43/52/4 50/53/4 42/54/4 +f 47/55/5 38/56/5 39/57/5 +f 40/58/1 49/59/1 41/60/1 +f 37/61/6 48/62/6 40/63/6 +f 41/60/7 52/64/7 44/50/7 +f 42/54/8 47/55/8 39/57/8 +f 46/65/9 37/61/9 38/56/9 +f 51/66/2 49/67/2 45/68/2 +f 60/69/3 67/70/3 59/71/3 +f 59/71/4 66/72/4 58/73/4 +f 63/74/5 54/75/5 55/76/5 +f 56/77/1 65/78/1 57/79/1 +f 53/80/6 64/81/6 56/82/6 +f 57/79/7 68/83/7 60/69/7 +f 58/73/8 63/74/8 55/76/8 +f 62/84/9 53/80/9 54/75/9 +f 67/85/2 65/86/2 61/87/2 +f 1/88/2 43/89/2 2/90/2 +f 3/91/2 25/92/2 6/93/2 +f 21/94/2 59/95/2 22/96/2 +f 39/97/2 57/98/2 42/99/2 +f 42/99/2 60/100/2 24/101/2 +f 38/102/2 56/103/2 39/97/2 +f 4/104/2 44/105/2 1/88/2 +f 6/93/2 28/8/2 7/7/2 +f 22/96/2 58/106/2 23/107/2 +f 40/108/2 72/109/2 37/110/2 +f 26/111/2 69/3/2 27/112/2 +f 23/107/2 58/106/2 70/5/2 +f 41/113/2 4/104/2 71/10/2 +f 53/114/2 38/102/2 72/109/2 +f 72/115/3 11/116/3 70/1/3 +f 69/3/9 10/117/9 71/10/9 +f 71/10/8 9/118/8 72/119/8 +f 12/2/10 75/120/10 10/117/10 +f 10/117/11 76/121/11 9/118/11 +f 9/122/12 74/123/12 11/116/12 +f 11/116/13 73/124/13 12/2/13 +f 74/125/1 77/126/1 73/124/1 +f 75/127/8 80/128/8 76/121/8 +f 76/129/3 78/130/3 74/123/3 +f 73/131/9 79/132/9 75/120/9 +f 81/133/9 84/134/9 83/135/9 +f 91/136/1 85/137/1 89/138/1 +f 90/139/8 88/140/8 92/141/8 +f 89/138/9 92/141/9 91/136/9 +f 82/142/8 93/143/8 84/134/8 +f 83/135/1 96/144/1 81/133/1 +f 97/145/3 100/146/3 99/147/3 +f 107/148/8 101/149/8 105/150/8 +f 106/151/1 104/152/1 108/153/1 +f 105/150/3 108/153/3 107/148/3 +f 98/154/1 109/155/1 100/146/1 +f 99/147/8 112/156/8 97/145/8 +f 113/157/1 116/158/1 115/159/1 +f 123/160/3 117/161/3 121/162/3 +f 122/163/9 120/164/9 124/165/9 +f 121/162/1 124/165/1 123/160/1 +f 114/166/9 125/167/9 116/158/9 +f 115/159/3 128/168/3 113/157/3 +f 129/169/8 132/170/8 131/171/8 +f 139/172/9 133/173/9 137/174/9 +f 138/175/3 136/176/3 140/177/3 +f 137/174/8 140/177/8 139/172/8 +f 130/178/3 141/179/3 132/170/3 +f 131/171/9 144/180/9 129/169/9 +f 70/1/1 11/116/1 12/2/1 +f 28/8/2 27/112/2 69/3/2 +f 69/3/2 71/10/2 7/7/2 +f 71/10/2 8/9/2 7/7/2 +f 8/12/3 20/26/3 19/13/3 +f 7/14/4 19/13/4 18/15/4 +f 15/17/5 14/27/5 2/18/5 +f 4/20/1 16/181/1 17/21/1 +f 1/23/6 13/30/6 16/24/6 +f 5/22/7 17/21/7 20/26/7 +f 6/16/8 18/15/8 15/17/8 +f 14/27/9 13/30/9 1/23/9 +f 13/30/2 14/27/2 15/182/2 +f 15/182/2 18/183/2 19/28/2 +f 19/28/2 20/184/2 17/29/2 +f 17/29/2 16/185/2 13/30/2 +f 13/30/2 15/182/2 19/28/2 +f 28/31/3 36/45/3 35/32/3 +f 27/33/4 35/32/4 34/34/4 +f 31/36/5 30/46/5 22/37/5 +f 24/39/1 32/186/1 33/40/1 +f 21/42/6 29/49/6 32/43/6 +f 25/41/7 33/40/7 36/45/7 +f 26/35/8 34/34/8 31/36/8 +f 30/46/9 29/49/9 21/42/9 +f 29/49/2 30/46/2 31/187/2 +f 31/187/2 34/188/2 35/47/2 +f 35/47/2 36/189/2 33/48/2 +f 33/48/2 32/190/2 29/49/2 +f 29/49/2 31/187/2 35/47/2 +f 44/50/3 52/64/3 51/51/3 +f 43/52/4 51/51/4 50/53/4 +f 47/55/5 46/65/5 38/56/5 +f 40/58/1 48/191/1 49/59/1 +f 37/61/6 45/68/6 48/62/6 +f 41/60/7 49/59/7 52/64/7 +f 42/54/8 50/53/8 47/55/8 +f 46/65/9 45/68/9 37/61/9 +f 45/68/2 46/65/2 47/192/2 +f 47/192/2 50/193/2 51/66/2 +f 51/66/2 52/194/2 49/67/2 +f 49/67/2 48/195/2 45/68/2 +f 45/68/2 47/192/2 51/66/2 +f 60/69/3 68/83/3 67/70/3 +f 59/71/4 67/70/4 66/72/4 +f 63/74/5 62/84/5 54/75/5 +f 56/77/1 64/196/1 65/78/1 +f 53/80/6 61/87/6 64/81/6 +f 57/79/7 65/78/7 68/83/7 +f 58/73/8 66/72/8 63/74/8 +f 62/84/9 61/87/9 53/80/9 +f 61/87/2 62/84/2 63/197/2 +f 63/197/2 66/198/2 67/85/2 +f 67/85/2 68/199/2 65/86/2 +f 65/86/2 64/200/2 61/87/2 +f 61/87/2 63/197/2 67/85/2 +f 1/88/2 44/105/2 43/89/2 +f 3/91/2 24/101/2 25/92/2 +f 21/94/2 60/100/2 59/95/2 +f 39/97/2 56/103/2 57/98/2 +f 24/101/2 3/91/2 2/90/2 +f 2/90/2 43/89/2 42/99/2 +f 42/99/2 57/98/2 60/100/2 +f 60/100/2 21/94/2 24/101/2 +f 24/101/2 2/90/2 42/99/2 +f 38/102/2 53/114/2 56/103/2 +f 4/104/2 41/113/2 44/105/2 +f 6/93/2 25/92/2 28/8/2 +f 22/96/2 59/95/2 58/106/2 +f 58/106/2 55/6/2 70/5/2 +f 70/5/2 69/3/2 23/107/2 +f 69/3/2 26/111/2 23/107/2 +f 4/104/2 5/11/2 71/10/2 +f 71/10/2 72/109/2 41/113/2 +f 72/109/2 40/108/2 41/113/2 +f 38/102/2 37/110/2 72/109/2 +f 72/109/2 70/5/2 53/114/2 +f 70/5/2 54/4/2 53/114/2 +f 72/115/3 9/122/3 11/116/3 +f 69/3/9 12/2/9 10/117/9 +f 71/10/8 10/117/8 9/118/8 +f 12/2/10 73/131/10 75/120/10 +f 10/117/11 75/127/11 76/121/11 +f 9/122/12 76/129/12 74/123/12 +f 11/116/13 74/125/13 73/124/13 +f 74/125/1 78/201/1 77/126/1 +f 75/127/8 79/202/8 80/128/8 +f 76/129/3 80/203/3 78/130/3 +f 73/131/9 77/204/9 79/132/9 +f 81/133/9 82/142/9 84/134/9 +f 91/136/1 87/205/1 85/137/1 +f 90/139/8 86/206/8 88/140/8 +f 89/138/9 90/139/9 92/141/9 +f 82/142/8 95/207/8 93/143/8 +f 83/135/1 94/208/1 96/144/1 +f 97/145/3 98/154/3 100/146/3 +f 107/148/8 103/209/8 101/149/8 +f 106/151/1 102/210/1 104/152/1 +f 105/150/3 106/151/3 108/153/3 +f 98/154/1 111/211/1 109/155/1 +f 99/147/8 110/212/8 112/156/8 +f 113/157/1 114/166/1 116/158/1 +f 123/160/3 119/213/3 117/161/3 +f 122/163/9 118/214/9 120/164/9 +f 121/162/1 122/163/1 124/165/1 +f 114/166/9 127/215/9 125/167/9 +f 115/159/3 126/216/3 128/168/3 +f 129/169/8 130/178/8 132/170/8 +f 139/172/9 135/217/9 133/173/9 +f 138/175/3 134/218/3 136/176/3 +f 137/174/8 138/175/8 140/177/8 +f 130/178/3 143/219/3 141/179/3 +f 131/171/9 142/220/9 144/180/9 +o Base +v -0.500000 4.500000 0.500000 +v 0.500000 4.500000 0.500000 +v -0.500000 4.500000 -0.500000 +v 0.500000 4.500000 -0.500000 +v -0.437500 8.000000 0.437500 +v 0.437500 8.000000 0.437500 +v -0.437500 8.000000 -0.437500 +v 0.437500 8.000000 -0.437500 +v -0.125000 0.000000 0.125000 +v 0.125000 0.000000 0.125000 +v -0.125000 0.000000 -0.125000 +v 0.125000 0.000000 -0.125000 +v -0.125000 4.500000 -0.125000 +v -0.125000 4.500000 0.125000 +v 0.125000 4.500000 0.125000 +v 0.125000 4.500000 -0.125000 +v -0.500000 7.750000 -0.500000 +v -0.500000 7.750000 0.500000 +v 0.500000 7.750000 0.500000 +v 0.500000 7.750000 -0.500000 +v 0.437500 7.500000 -0.437500 +v -0.437500 7.500000 -0.437500 +v 0.437500 7.500000 0.437500 +v -0.437500 7.500000 0.437500 +v -0.500000 4.750000 -0.500000 +v -0.500000 4.750000 0.500000 +v 0.500000 4.750000 0.500000 +v 0.500000 4.750000 -0.500000 +v -0.437500 5.000000 -0.437500 +v -0.437500 5.000000 0.437500 +v 0.437500 5.000000 0.437500 +v 0.437500 5.000000 -0.437500 +v -0.500000 9.000000 0.500000 +v 0.500000 9.000000 0.500000 +v -0.500000 9.000000 -0.500000 +v 0.500000 9.000000 -0.500000 +v -0.437500 8.750000 -0.437500 +v -0.437500 8.750000 0.437500 +v 0.437500 8.750000 0.437500 +v 0.437500 8.750000 -0.437500 +v -0.500000 8.000000 -0.500000 +v -0.500000 8.000000 0.500000 +v 0.500000 8.000000 0.500000 +v 0.500000 8.000000 -0.500000 +v -0.500000 8.750000 -0.500000 +v -0.500000 8.750000 0.500000 +v 0.500000 8.750000 0.500000 +v 0.500000 8.750000 -0.500000 +v -0.500000 8.125000 -0.500000 +v -0.500000 8.125000 0.500000 +v 0.500000 8.125000 0.500000 +v 0.500000 8.125000 -0.500000 +v -0.500000 8.625000 -0.500000 +v -0.500000 8.625000 0.500000 +v 0.500000 8.625000 0.500000 +v 0.500000 8.625000 -0.500000 +v 0.500000 4.750000 -0.187500 +v 0.500000 4.750000 -0.312500 +v 0.500000 7.750000 -0.187500 +v 0.500000 7.750000 -0.312500 +v 0.437500 4.750000 -0.187500 +v 0.437500 4.750000 -0.312500 +v 0.437500 7.750000 -0.187500 +v 0.437500 7.750000 -0.312500 +v 0.500000 4.750000 0.312500 +v 0.500000 4.750000 0.187500 +v 0.500000 7.750000 0.312500 +v 0.500000 7.750000 0.187500 +v 0.437500 4.750000 0.312500 +v 0.437500 4.750000 0.187500 +v 0.437500 7.750000 0.312500 +v 0.437500 7.750000 0.187500 +v -0.500000 4.750000 0.187500 +v -0.500000 4.750000 0.312500 +v -0.500000 7.750000 0.187500 +v -0.500000 7.750000 0.312500 +v -0.437500 4.750000 0.187500 +v -0.437500 4.750000 0.312500 +v -0.437500 7.750000 0.187500 +v -0.437500 7.750000 0.312500 +v -0.500000 4.750000 -0.312500 +v -0.500000 4.750000 -0.187500 +v -0.500000 7.750000 -0.312500 +v -0.500000 7.750000 -0.187500 +v -0.437500 4.750000 -0.312500 +v -0.437500 4.750000 -0.187500 +v -0.437500 7.750000 -0.312500 +v -0.437500 7.750000 -0.187500 +v -0.187500 4.750000 -0.500000 +v -0.312500 4.750000 -0.500000 +v -0.187500 7.750000 -0.500000 +v -0.312500 7.750000 -0.500000 +v -0.187500 4.750000 -0.437500 +v -0.312500 4.750000 -0.437500 +v -0.187500 7.750000 -0.437500 +v -0.312500 7.750000 -0.437500 +v 0.312500 4.750000 -0.500000 +v 0.187500 4.750000 -0.500000 +v 0.312500 7.750000 -0.500000 +v 0.187500 7.750000 -0.500000 +v 0.312500 4.750000 -0.437500 +v 0.187500 4.750000 -0.437500 +v 0.312500 7.750000 -0.437500 +v 0.187500 7.750000 -0.437500 +v 0.187500 4.750000 0.500000 +v 0.312500 4.750000 0.500000 +v 0.187500 7.750000 0.500000 +v 0.312500 7.750000 0.500000 +v 0.187500 4.750000 0.437500 +v 0.312500 4.750000 0.437500 +v 0.187500 7.750000 0.437500 +v 0.312500 7.750000 0.437500 +v -0.312500 4.750000 0.500000 +v -0.187500 4.750000 0.500000 +v -0.312500 7.750000 0.500000 +v -0.187500 7.750000 0.500000 +v -0.312500 4.750000 0.437500 +v -0.187500 4.750000 0.437500 +v -0.312500 7.750000 0.437500 +v -0.187500 7.750000 0.437500 +vt 0.210526 -0.000000 +vt 0.105263 0.150943 +vt 0.105263 0.000000 +vt 0.315789 0.707547 +vt 0.217105 0.688679 +vt 0.309211 0.688679 +vt 0.105263 0.679245 +vt 0.210526 0.641509 +vt 0.210526 0.679245 +vt -0.000000 0.641509 +vt 0.098684 0.603774 +vt 0.105263 0.641509 +vt 0.315789 0.679245 +vt 0.421053 0.641509 +vt 0.421053 0.679245 +vt -0.000000 0.679245 +vt 0.894737 0.000000 +vt 0.868421 0.037736 +vt 0.868421 0.000000 +vt 0.842105 0.716981 +vt 0.842105 0.037736 +vt 0.894737 0.037736 +vt 0.868421 0.716981 +vt 0.947368 0.037736 +vt 0.921053 0.716981 +vt 0.921053 0.037736 +vt 0.894737 0.716981 +vt 0.315789 0.641509 +vt 0.309211 0.603774 +vt 0.414474 0.603774 +vt 0.203947 0.603774 +vt 0.105263 0.188679 +vt 0.006579 0.226415 +vt 0.000000 0.188679 +vt 0.315789 0.150943 +vt 0.210526 0.188679 +vt 0.210526 0.150943 +vt 0.000000 0.150943 +vt 0.421053 0.150943 +vt 0.315789 0.188679 +vt 0.111842 0.226415 +vt 0.421053 0.188679 +vt 0.322368 0.226415 +vt 0.217105 0.226415 +vt 0.322368 0.603774 +vt 0.414474 0.226415 +vt 0.217105 0.603774 +vt 0.309211 0.226415 +vt 0.111842 0.603774 +vt 0.203947 0.226415 +vt 0.006579 0.603774 +vt 0.098684 0.226415 +vt 0.105263 0.849057 +vt 0.210526 1.000000 +vt 0.105263 1.000000 +vt 0.421053 0.707547 +vt 0.322368 0.688679 +vt 0.414474 0.688679 +vt 0.210526 0.849057 +vt 0.315789 0.811321 +vt 0.315789 0.849057 +vt -0.000000 0.849057 +vt 0.105263 0.811321 +vt 0.210526 0.811321 +vt 0.421053 0.811321 +vt 0.421053 0.849057 +vt 0.006579 0.688679 +vt 0.098684 0.688679 +vt 0.111842 0.688679 +vt 0.203947 0.688679 +vt 0.414474 0.801887 +vt 0.322368 0.801887 +vt 0.098684 0.801887 +vt -0.000000 0.811321 +vt 0.006579 0.801887 +vt 0.203947 0.801887 +vt 0.111842 0.801887 +vt 0.309211 0.801887 +vt 0.217105 0.801887 +vt 0.210526 0.707547 +vt 0.105263 0.707547 +vt 0.421053 0.783019 +vt 0.105263 0.783019 +vt 0.210526 0.783019 +vt 0.315789 0.783019 +vt 0.000000 0.707547 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.947368 0.716981 +vt 0.000000 0.783019 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.2425 0.9701 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.2425 -0.9701 +vn -0.9701 -0.2425 0.0000 +vn 0.9701 -0.2425 0.0000 +vn 0.0000 0.2425 0.9701 +vn 0.9701 0.2425 0.0000 +vn -0.9701 0.2425 0.0000 +vn 0.0000 0.2425 -0.9701 +vn 0.0000 1.0000 0.0000 +vn -0.8944 -0.4472 0.0000 +vn 0.8944 -0.4472 0.0000 +vn 0.0000 -0.4472 0.8944 +vn -0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 -0.8944 +s off +f 147/221/14 146/222/14 145/223/14 +f 193/224/15 152/225/15 151/226/15 +f 187/227/16 164/228/16 188/229/16 +f 162/230/17 167/231/17 163/232/17 +f 185/233/18 162/234/18 186/235/18 +f 186/236/19 163/232/19 187/227/19 +f 155/237/14 154/238/14 153/239/14 +f 154/238/19 158/240/19 153/241/19 +f 156/242/16 159/243/16 154/238/16 +f 153/244/18 157/245/18 155/246/18 +f 155/246/20 160/247/20 156/242/20 +f 188/229/20 161/248/20 185/233/20 +f 164/228/21 166/249/21 161/248/21 +f 161/248/22 168/250/22 162/234/22 +f 163/232/23 165/251/23 164/228/23 +f 171/252/24 174/253/24 170/254/24 +f 147/255/20 172/256/20 148/257/20 +f 146/222/19 170/254/19 145/258/19 +f 148/257/16 171/252/16 146/222/16 +f 145/259/18 169/260/18 147/255/18 +f 172/256/25 175/261/25 171/252/25 +f 170/262/26 173/263/26 169/260/26 +f 169/260/27 176/264/27 172/256/27 +f 166/265/18 174/266/18 168/250/18 +f 165/267/20 173/268/20 166/249/20 +f 167/269/16 176/270/16 165/251/16 +f 168/271/19 175/272/19 167/231/19 +f 178/273/28 179/274/28 177/275/28 +f 194/276/29 151/277/29 149/278/29 +f 180/279/20 189/280/20 179/281/20 +f 177/282/19 191/283/19 178/273/19 +f 178/273/16 192/284/16 180/279/16 +f 179/281/18 190/285/18 177/286/18 +f 151/277/28 186/235/28 149/278/28 +f 149/287/28 187/227/28 150/288/28 +f 150/289/28 188/229/28 152/290/28 +f 152/225/28 185/233/28 151/226/28 +f 182/291/14 189/280/14 181/292/14 +f 183/293/14 190/294/14 182/295/14 +f 184/296/14 191/283/14 183/297/14 +f 181/298/14 192/284/14 184/299/14 +f 196/300/30 150/289/30 152/290/30 +f 195/301/31 149/287/31 150/288/31 +f 181/292/32 198/302/32 182/291/32 +f 182/295/33 199/303/33 183/293/33 +f 183/297/34 200/304/34 184/296/34 +f 184/299/35 197/305/35 181/298/35 +f 198/302/18 193/224/18 194/276/18 +f 199/303/19 194/306/19 195/301/19 +f 200/304/16 195/301/16 196/300/16 +f 197/305/20 196/300/20 193/224/20 +f 204/307/16 201/308/16 202/309/16 +f 203/310/19 205/311/19 201/308/19 +f 202/309/20 208/312/20 204/307/20 +f 212/313/16 209/314/16 210/315/16 +f 211/316/19 213/317/19 209/314/19 +f 210/315/20 216/318/20 212/313/20 +f 220/319/18 217/320/18 218/321/18 +f 219/322/20 221/323/20 217/320/20 +f 218/321/19 224/324/19 220/319/19 +f 228/325/18 225/326/18 226/327/18 +f 227/328/20 229/329/20 225/326/20 +f 226/327/19 232/330/19 228/325/19 +f 236/331/20 233/332/20 234/333/20 +f 235/334/16 237/335/16 233/332/16 +f 234/333/18 240/336/18 236/331/18 +f 244/337/20 241/338/20 242/339/20 +f 243/340/16 245/341/16 241/338/16 +f 242/339/18 248/342/18 244/337/18 +f 252/343/19 249/344/19 250/345/19 +f 251/346/18 253/347/18 249/344/18 +f 250/345/16 256/348/16 252/343/16 +f 260/349/19 257/350/19 258/351/19 +f 259/352/18 261/353/18 257/350/18 +f 258/351/16 264/354/16 260/349/16 +f 147/221/14 148/257/14 146/222/14 +f 193/224/15 196/300/15 152/225/15 +f 187/227/16 163/232/16 164/228/16 +f 162/230/17 168/271/17 167/231/17 +f 185/233/18 161/248/18 162/234/18 +f 186/236/19 162/230/19 163/232/19 +f 155/237/14 156/242/14 154/238/14 +f 154/238/19 159/243/19 158/240/19 +f 156/242/16 160/247/16 159/243/16 +f 153/244/18 158/355/18 157/245/18 +f 155/246/20 157/245/20 160/247/20 +f 188/229/20 164/228/20 161/248/20 +f 164/228/21 165/267/21 166/249/21 +f 161/248/22 166/265/22 168/250/22 +f 163/232/23 167/269/23 165/251/23 +f 171/252/24 175/272/24 174/253/24 +f 147/255/20 169/260/20 172/256/20 +f 146/222/19 171/252/19 170/254/19 +f 148/257/16 172/256/16 171/252/16 +f 145/259/18 170/262/18 169/260/18 +f 172/256/25 176/270/25 175/261/25 +f 170/262/26 174/266/26 173/263/26 +f 169/260/27 173/268/27 176/264/27 +f 166/265/18 173/263/18 174/266/18 +f 165/267/20 176/264/20 173/268/20 +f 167/269/16 175/261/16 176/270/16 +f 168/271/19 174/253/19 175/272/19 +f 178/273/28 180/279/28 179/274/28 +f 194/276/29 193/224/29 151/277/29 +f 180/279/20 192/284/20 189/280/20 +f 177/282/19 190/294/19 191/283/19 +f 178/273/16 191/283/16 192/284/16 +f 179/281/18 189/280/18 190/285/18 +f 151/277/28 185/233/28 186/235/28 +f 149/287/28 186/236/28 187/227/28 +f 150/289/28 187/227/28 188/229/28 +f 152/225/28 188/229/28 185/233/28 +f 182/291/14 190/285/14 189/280/14 +f 183/293/14 191/283/14 190/294/14 +f 184/296/14 192/284/14 191/283/14 +f 181/298/14 189/280/14 192/284/14 +f 196/300/30 195/301/30 150/289/30 +f 195/301/31 194/306/31 149/287/31 +f 181/292/32 197/305/32 198/302/32 +f 182/295/33 198/356/33 199/303/33 +f 183/297/34 199/303/34 200/304/34 +f 184/299/35 200/304/35 197/305/35 +f 198/302/18 197/305/18 193/224/18 +f 199/303/19 198/356/19 194/306/19 +f 200/304/16 199/303/16 195/301/16 +f 197/305/20 200/304/20 196/300/20 +f 204/307/16 203/310/16 201/308/16 +f 203/310/19 207/357/19 205/311/19 +f 202/309/20 206/358/20 208/312/20 +f 212/313/16 211/316/16 209/314/16 +f 211/316/19 215/359/19 213/317/19 +f 210/315/20 214/360/20 216/318/20 +f 220/319/18 219/322/18 217/320/18 +f 219/322/20 223/361/20 221/323/20 +f 218/321/19 222/362/19 224/324/19 +f 228/325/18 227/328/18 225/326/18 +f 227/328/20 231/363/20 229/329/20 +f 226/327/19 230/364/19 232/330/19 +f 236/331/20 235/334/20 233/332/20 +f 235/334/16 239/365/16 237/335/16 +f 234/333/18 238/366/18 240/336/18 +f 244/337/20 243/340/20 241/338/20 +f 243/340/16 247/367/16 245/341/16 +f 242/339/18 246/368/18 248/342/18 +f 252/343/19 251/346/19 249/344/19 +f 251/346/18 255/369/18 253/347/18 +f 250/345/16 254/370/16 256/348/16 +f 260/349/19 259/352/19 257/350/19 +f 259/352/18 263/371/18 261/353/18 +f 258/351/16 262/372/16 264/354/16 diff --git a/src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png b/src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png new file mode 100644 index 0000000000000000000000000000000000000000..84c7faeb761786a0c31b907c3e49d94e8f23c7e1 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#%`9@aupR3lsx5Dm1^`|MWVNNwP+ON%Gdhoyv7fw=gwtO!-;z{Img&{vS?3 zM`nh{7GkU_ib~647PH4zpLThx=e1LS$wOXRLr}8h`=gy53+{iP$jI=eKRrzA<=aO_ z{(|!*87lok*%4Y>+s-(|+m`)PZ%&<;6Y}f!oo#jI7tXk6v~1SO>DhWl<>B7- h(lW-^3y$q&yuYPJaNoq>2%!HMJYD@<);T3K0RWAEZ%_aL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/gui_arc.png b/src/main/resources/assets/hbm/textures/gui/gui_arc.png deleted file mode 100644 index b78524b439a4d95387f2c648710bcb3f0c1f1ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 zcmc&$do+~m8h>ZZVT`t0Qtpb}vJ+dHBqX=lF*XK~TPaF%%eV}4QM*LrHf~8#VQUy9 zMUC6El}MAqP$bGNgWL_naK6?)YwdIPT4(J)&L8Jp>s#-)*7H8U_4_@~`+L4G@fWPk z4=8yQ0N@9Vt)&wHFz6KqkiyXB8Ghd%+7K5lFgPT%;*h7W0U%b4u{?r{zBN6-4p!)u zYndB=opv<+QQ(P+E_Gzub8OnNvp-hC5y^Vy6Zf>J%(@6E79|q)u%}e`q3F=wa9B@G zj_)W+TE_aeZTjhEBei!L?9|mM3k|h{{9Oq$0b}cA%E`VepW8^1O8&usvA18{5-D-} zs+G+hw=||>Xm2-LMf|9b^boFYZW-2vI|q5A%nHw57dlS9v4Rtr&@&NX-1qTgca9I~ z+=V-tmJ4bDJv}{-o;FkCeqfaYI=IZC6%CjVrHz&|VLfPcT zv&|!snckbpGmUG(vcmv7{pR)|{#12G#LTA#OB&s^Ea{%@0aF3aQKoeUk26R&+1lo! zx-}tb_;~o?7bzv)XBP$J&5}Vq&u*di$~XxGV5gcuDX}xliKLii9ICD~M=hp8PxD)= ziz6Ubwo~r!h!y>h}0_3k zqRT+(m!gWd>)3^DHfP)nvOB;ncL{Lg*Jp=fK47}zn8nNqZcBMn;N6e!zL*71IzU|Z zGWC|m^T_W!=biFJN7SWY`zB$4-r(^(((Yb(o8#N_?FhZyn9(A$b-&Rf&D@7$c6Vr^ zqgvTj>+%#}es^WVyE)_>f?6|)Rnea zAKKi=q3Uxr&j_M<6~=EaG4B?t8vQI?R|!J`8S9dM=Z@5o=redc_OA3n&cb|Q{;Sc4 z%)8yFpSdqwR>Rz@6nAHbAf$m7qND8oyA`Xfr_4S*pZiLyItn&*dO}Ziv{Tfq!WTPv z98vf`63Z<2=74Htkmg#_l|CL5_}HVA!!6|m8YDr23w>(&(sCTN2EusMqqX%_s*PzZ z0)&SUiC&YFlibKU8qFbQDLZ;!mR23 zT4!>6aq(`iCemU2?XVHzI{HIjU*G%Md9S+2>F47pG_iII_oFP#60 zVUu?LiUh^Knx35e!()$fA$F6Gj1{UmbY*gNHO8gP<#6<@Zz)Vw3Qk|ma!*z5MX3PD zzm75!Ey)Uy+ZwzbQifacUUGh!>WN>_*~4gqmR257FxxD_jF{-mO-`4zJ((#-;j|MI zAZC_pru>Ny)d8sHU$TC-%8!~=!PfS>?6^8l^kMruht$ut61*t{79m!t84cRZ=2OS`b~1@ z*$sVagD^`x{xk+k>W^!jQF*_SS5V+4V>NFQf?g`H8a`&Y`96h-@D-cIF_55Rq5G^M zuH2OqT$^D3DY$mGz?j1$ZnBi(1GWhpl2K~`z);W%afG^@KThWaLL*eEPWVC7=REe9 z`_Otc>2sLYKV4etFbiTwL7kR}i7}X{p5b)_x!>mVm8C*v4|F zo|L>w;o}QTiKPbyoJe}FWf#9g>AW!&YP`v9e;#gI&LDC z*4YXR#T6FdkwGCL?O}>P>gwJfoH-v5V1uD)ZD~$VS$O54M7?(Oh%;ut(EGuujN{s7 zaGveB0V^_a1&THMjp)-4Ga$%G0dKH(dAUX> zE6M1?08q$>&KvKWAb2{=2)lm|mlhY0jNj_wp zizh_16(dDivP1Mye}&oc0-w z^0fT2=*jJ>S#}~U2Qxttp`ijA7C}aSRPXv|eW&U(<>DIGyeK#W1t6hf3XyfDsYAfD z<(uUL!KvLr?q!!nk1e40UB41;EfBN0z_TCLxPwmFcJ=dYO)vh9~@@m=`T7!Z%gZyyI)6nrZN|?@uSe|B%r)N0@f)6@YRQd z2RmTkI28b0YXD@`0JtvoXSm9*KvIh^7vlPV zfcO&7QrC=gE1MI|yP&7LElvrGxT)OppDO)&eB@&|}rN0lZV=Kegy4C|D|e*)-mNG|{Y diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png new file mode 100644 index 0000000000000000000000000000000000000000..05618d9481f09ec201d8cf826e54661ecd3c03f8 GIT binary patch literal 1736 zcmb_ddoqvWFD;QN3^V1CMyqJD7HM1AH5`v=W*DztMiHThH&LU; zGd5+HvC-I8(@$6orebQwv!zkOnAx#)I{T>8Kl}aTe!u5@@4es8x!=$Cb5r-?T$Poy zl>h+B?rvCb0ASJ(1{CC_&OfT+JE@b4c5&aYAT_GOw=@9c6Wy`S`^g2<+?w$92iG8; z@=Q(5@&0!zA2gKs;15;^SD(LY3V#LjXj@eOOxf&gj>m5H#d}J&czl)3Dg#naSXS%~ zNwt8gS2@aKOcp#DzVm9>^GeYTK7{!uyA+Y>UU zn!wrt$DBH<5L@7A>5|2nD{+EYKJEda>g*3npIx4}zH8 zlZ0t*A>zP9fzZ9rW$c?)amb6{s@7fGRT_;~V3%C+6;zCg-nLi&l2%OOp{$jso%{>jpm z%!lPH$k)io$Z=C_9p2nvVmaaFi6*4Kj-DRrOVxoc(K6>q7NgG<#_SeJWdK+-F*(7} z8S#g*YYp>LD{pv6>h(5fyPs4&dhcwPXexJda#F#p&)0L*8BitS_}h+HEYjh_^ofAnERIB{@a`WsYC$Mx1J9lA_ohs8UftpOZ!Noa>N z)>BFXVthOyYC|qtDd?qmdC3_eLmU8M9c_x0@>=j-`ohYm^1oO~T_S9~^67PkEZdBg O3*C3(u+=U>$NvP_-_mCQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png b/src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png new file mode 100644 index 0000000000000000000000000000000000000000..f15f922bd5ded58c99a8b6ac95367cd53f120b8f GIT binary patch literal 1576 zcmaKseK^x=7{}M4QD|K_nU_LS>{J`&Exjn2GB2Z;Hf$>WPz|xB?Ihw5LwU=Fs8&>J zCZxhhNK55ZSZG#xtJYH3CNn#~{y5k9UKcDOVl@Fs zEO7~aJkEXz`_XYrr6|CLiZqJ0dmERfUbLaSiOQS~D$GxM=*4m?a=YhSM*J8VlasFb zYIRy~)K@>PiJP_a;lZzzeW&FLjVpPhmkK%JZHd$CI~@W>m8U}*9GRYM`$n2&{niGEtW*i+Xgs zE9YjCUb|-9g=##`DQMs;ZXQoG#5mW}!%8mW;z)=w3T_f1+8=R#$Ty;Q;?7_gBzE>g z1 zQ9cpqvIjF``9Hkyw3*);PXTb%3tdEi^T;nnChM7;QKv@)L?4HDRdztCU(7d5Kj8e* zZ?L~zJHbhKtVYjLe~ON@dd^7w? zO0E@iI?RfhP@iuTGw*%qf!S5G|IZA-R=-o%gTrpyQz)EN9Gxp}#MF7q2V8^_L3u)q zxZ^osz+$odu*K%hvh8niT%GpiTY3~mE*TP8IPPnKs1k;=iAw=Fx5Sx#IcuI&vVY-o zR*#PKjf_!?xYtJFGXkT!z!|K3peO$jI~6l*r1E(VdZ|BYjI-VCQuA#7VKCeT&pZf4 z_&@vG^j|ZeY^??9{^k5{*?*gGbxsf@@-7jc;{j?P@1{_4Ln!%^C!x9=Zx!>nyZBZ> zO}?_HWmv{QK8EVF*Svzg+sj`Nl0BM4=YqNTfvF2O(4oy1hf<|m#k?7<_|Ph{T>Obl zkc_?W5*n7LiX%vW6}_#|TV6S2KGaoTH26+tFhi`Cz! zTaNQ5l?K*Nz~AO?b9Nt@(15&?DI-q)h%Y;G@PZgLi9aTb93{N+1WSu`9g_LZ|m<$ z03d~@62cf64qG-H7%Xowr(Dp5Y8+J_OeN%ledxBCx#+{rX2b#97&MC$N%_jOK_sG! oPUkvIqL#dt2b#6noBGJn&`JFM;d7eb!PO7(#Q3^byM?9v1sK8(N&o-= literal 0 HcmV?d00001 From f0679b04cc0f94b904a514c96d71cf40a323a615 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Thu, 24 Jul 2025 13:30:59 -0500 Subject: [PATCH 131/323] fix FCP oc compat --- src/main/java/com/hbm/blocks/network/FluidPump.java | 1 + .../com/hbm/tileentity/machine/TileEntityMachineTurbine.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/FluidPump.java b/src/main/java/com/hbm/blocks/network/FluidPump.java index 746622c0c..a3fcd1baa 100644 --- a/src/main/java/com/hbm/blocks/network/FluidPump.java +++ b/src/main/java/com/hbm/blocks/network/FluidPump.java @@ -306,6 +306,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo int input = args.checkInteger(0); if (input > 10000 || input < 0) return new Object[] {null, "Number outside of bounds."}; + bufferSize = input; return new Object[] {true}; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 85e982856..079a563e4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -236,7 +236,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } } nbt.setTag("items", list); - + if (customName != null) { nbt.setString("name", customName); } @@ -280,7 +280,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); tanks[0].setType(0, 1, slots); - tanks[0].loadTank(2, 3, slots); + tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); FluidType in = tanks[0].getTankType(); From 131e4fd42ddcd1ae72c2118787657ee01d490ea6 Mon Sep 17 00:00:00 2001 From: Bob Date: Fri, 25 Jul 2025 17:50:13 +0200 Subject: [PATCH 132/323] yesterday's shit buffet --- .../recipes/AssemblyMachineRecipes.java | 16 ++++++++++++++++ .../inventory/recipes/loader/GenericRecipe.java | 3 +++ src/main/java/com/hbm/items/ItemEnums.java | 4 ++++ src/main/java/com/hbm/items/ModItems.java | 3 +++ src/main/resources/assets/hbm/lang/de_DE.lang | 5 +++++ src/main/resources/assets/hbm/lang/en_US.lang | 5 +++++ .../items/item_expensive.bronze_tubes.png | Bin 0 -> 369 bytes .../items/item_expensive.bronze_tubes_alt.png | Bin 0 -> 412 bytes .../items/item_expensive.ferro_plating.png | Bin 0 -> 408 bytes .../items/item_expensive.heavy_frame.png | Bin 0 -> 420 bytes .../items/item_expensive.lead_plating.png | Bin 0 -> 268 bytes .../items/item_expensive.steel_plating.png | Bin 0 -> 411 bytes 12 files changed, 36 insertions(+) create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.ferro_plating.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.heavy_frame.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.lead_plating.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.steel_plating.png diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 1406819af..66bd4f27a 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -23,6 +23,7 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; import com.hbm.items.ItemEnums.EnumCasingType; +import com.hbm.items.ItemEnums.EnumExpensiveType; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; @@ -83,6 +84,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); + this.register(new GenericRecipe("ass.exsteelplating").setup(200, 400).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING.ordinal())) + .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(TI.plate(), 4), new OreDictStack(STEEL.bolt(), 16))); + this.register(new GenericRecipe("ass.exheavyframe").setup(600, 800).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CU.plateWelded(), 4), new OreDictStack(DESH.ingot(), 1), new OreDictStack(DURA.bolt(), 32))); + this.register(new GenericRecipe("ass.exleadplating").setup(400, 4_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.LEAD_PLATING.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.STEEL_PLATING), new OreDictStack(PB.plateCast(), 8), new OreDictStack(B.ingot(), 2), new OreDictStack(W.bolt(), 32)) + .inputFluids(new FluidStack(Fluids.LUBRICANT, 1_000))); + this.register(new GenericRecipe("ass.exferroplating").setup(1_200, 10_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.LEAD_PLATING), new OreDictStack(FERRO.plateCast(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4)) + .inputFluids(new FluidStack(Fluids.UNSATURATEDS, 1_000))); + this.register(new GenericRecipe("ass.bronzetubes").setup(3_000, 250_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.BRONZE_TUBES.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ZR.plateWelded(), 1)) + .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL_COLD, 4_000)) + .outputFluids(new FluidStack(Fluids.PERFLUOROMETHYL, 4_000))); + // cloth this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) .inputItems(new OreDictStack(PB.dust(), 4), new ComparableStack(Items.string, 8))); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 0f98be052..564938092 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import com.hbm.config.GeneralConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.recipes.loader.GenericRecipes.ChanceOutput; @@ -58,7 +59,9 @@ public class GenericRecipe { public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } + public GenericRecipe inputItemsEx(AStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } + public GenericRecipe inputFluidsEx(FluidStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } public GenericRecipe outputFluids(FluidStack... output) { this.outputFluid = output; return this; } diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 6ca3c76af..e8692cd67 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -90,4 +90,8 @@ public class ItemEnums { public static enum EnumIngotMetal { SCRAP, INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR } + + public static enum EnumExpensiveType { + STEEL_PLATING, HEAVY_FRAME, LEAD_PLATING, FERRO_PLATING, BRONZE_TUBES + } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b8bbdbde8..4019a3355 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -342,6 +342,7 @@ public class ModItems { public static Item thruster_nuclear; public static Item safety_fuse; public static Item part_generic; + public static Item item_expensive; public static Item item_secret; public static Item ingot_metal; public static Item chemical_dye; @@ -2345,6 +2346,7 @@ public class ModItems { thruster_nuclear = new Item().setUnlocalizedName("thruster_nuclear").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":thruster_nuclear"); safety_fuse = new Item().setUnlocalizedName("safety_fuse").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":safety_fuse"); part_generic = new ItemGenericPart().setUnlocalizedName("part_generic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":part_generic"); + item_expensive = new ItemEnumMulti(EnumExpensiveType.class, true, true).setUnlocalizedName("item_expensive").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":item_expensive"); item_secret = new ItemEnumMulti(EnumSecretType.class, true, true).setUnlocalizedName("item_secret").setCreativeTab(null).setTextureName(RefStrings.MODID + ":item_secret"); ingot_metal = new ItemEnumMulti(EnumIngotMetal.class, true, true).setUnlocalizedName("ingot_metal").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ingot_metal"); chemical_dye = new ItemChemicalDye().setUnlocalizedName("chemical_dye").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chemical_dye"); @@ -5505,6 +5507,7 @@ public class ModItems { GameRegistry.registerItem(chemical_dye, chemical_dye.getUnlocalizedName()); GameRegistry.registerItem(crayon, crayon.getUnlocalizedName()); GameRegistry.registerItem(part_generic, part_generic.getUnlocalizedName()); + GameRegistry.registerItem(item_expensive, item_expensive.getUnlocalizedName()); GameRegistry.registerItem(item_secret, item_secret.getUnlocalizedName()); GameRegistry.registerItem(ingot_metal, ingot_metal.getUnlocalizedName()); GameRegistry.registerItem(parts_legendary, parts_legendary.getUnlocalizedName()); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c569a4c24..deddc496a 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2351,6 +2351,11 @@ item.insert_polonium.name=Poloniumeinlage item.insert_steel.name=Schwere Stahleinlage item.insert_xsapi.name=XSAPI-Einlage item.insert_yharonite.name=Yharoniteinlage +item.item_expensive.bronze_tubes.name=Bronze-Strukturelement +item.item_expensive.ferro_plating.name=Verstärkte Ferrouraniumpanele +item.item_expensive.heavy_frame.name=Schweres Gestell +item.item_expensive.lead_plating.name=Strahlenresistente Plattierung +item.item_expensive.steel_plating.name=Gebolzte Stahlplatten item.item_secret.aberrator.name=Aberrator-Teil item.item_secret.canister.name=Komposit SB-26 item.item_secret.controller.name=Proprietäre Steuereinheit diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index f5702bf91..18e50f81d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3177,6 +3177,11 @@ item.insert_polonium.name=Polonium Insert item.insert_steel.name=Heavy Steel Insert item.insert_xsapi.name=XSAPI Insert item.insert_yharonite.name=Yharonite Insert +item.item_expensive.bronze_tubes.name=Bronze Structural Elements +item.item_expensive.ferro_plating.name=Reinforced Ferrouranium Panels +item.item_expensive.heavy_frame.name=Heavy Framework +item.item_expensive.lead_plating.name=Radiation Resistant Plating +item.item_expensive.steel_plating.name=Bolten Steel Plating item.item_secret.aberrator.name=Aberrator Part item.item_secret.canister.name=Composition SB-26 item.item_secret.controller.name=Proprietary Control Unit diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png new file mode 100644 index 0000000000000000000000000000000000000000..8c410bd9764a19bad5f72c0c4705e34244b6bc6f GIT binary patch literal 369 zcmV-%0gnEOP)Jd%ps8Ua#FkHEO7v z_veQ?AW4p0xz}!K|MX~=AW8vnO|pW_7Ar(V*A@{Z$?5t{x_*-|&h$(P5J=V&R@tgdgJti# P00000NkvXXu0mjfWVfTc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..d8eb827b63b4f3329f4ecdbd02766befe59af2ea GIT binary patch literal 412 zcmV;N0b~A&P)Vd;99%ohKB!keS&_Sh^QsST&b4`MR4+3}h-uLCbvR zZvTl37xiK>Xf7`TAf?1|eQeJYzj2yCN~y)OT%STFLmFp$o-hEqt9j-h9yP(<>pKP0 z1R-La<@)qD)&ZDPhewAy9G_eRP%urj$b+vTg>tpR<@1|vpiC}K?`baOw8&4n1uWNR z_h1`* zcQS#qvX&S*I;apk0NBrFgL1V(Z#W76oHU$jpiH94(sZBp2(Xy^&>=|x00008wsOv zBGG}#O(YJ|r6fYJlLX@6&^DwK4%+7z^+Znw9Q{doTpORTr5 z!oKbGL|sNsy6JQnTNZDxUuc@nYPA9&2z(l*3BX`5;G|O7&L)#oj9_e8OrAb4j9RRN zes_q`)Bx~3FFr!Cc)Bf@k1>oIqtP>AxB);>vZ!i~An*ZjU5kUmG)u=x0i2w@?6lj?%FfEdSI9F6>8w&( znNm<}_5s`?BBJ0z3c;+?IZ2s7Rty$eOlH{ZCR*recDT$r=iak-;E!--73=l-*Kb5A zCBE-Fxmo0PyNwXS)|66Hcj7pv*XseWm?ldpxjL$_^7MeWxx}vf!ST)pxlV^caf^Px zZ^`5F_{2$)jdQtNMoMYFri(a^aa|XHD2f;khmK>&p6C5Ia}WfyS}k5r57|Ept$@v- z(P&tA6O!q`xL2!HZY}~~)e2hyAq3|K>%d4Cw)Ht24QL|hcDn%NO9I08tbleNO&qY7 zAMc)_vNw0M1#>WA8DhR9C=}K*gmf*l2eXje1ONJ#=Jf>Q$mU%p8U6V+Y{{`Rcd8D}f)Kg;s O0000ONQ=2~XsI}HMeEj&(_Qr=FKMpLJlwq?ZLubhm{tJzoVf9NdWxDHi zz5V=DY5Pgw!_X~E*g>7w)YmTwAP?JU>{s0LU5d$`2u~_I8 zVo0HdMeuK=OA*MgFl;Vhv4tRV2ipm;$*z0c^?B9o%Ou&N#uJ=&j{pF+Eb1+A&NqxPD5a2P8LYJcfGCQl$8pMF(4vntudV~e5^8qJkPzVgHsOUAu0r6vU_vRYo9{2o1C0;2q7SZ@IGs8 zO`t+B9Q2V=g3)*aV+@Qjevl4Vmls&CmUw)AX>LJ(eEL-p5u}umQX+~X+}>RKyw2f4 zy#iYnSa0{MwT9NZqP|`&o4WnKgDtbauy9pP%I*$!k3YrdexsmIKyd&7002ovPDHLk FV1k8gstEu9 literal 0 HcmV?d00001 From 7f887a623a5ce0ae04b1c6bc32bbb1ebc4bed0dd Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 27 Jul 2025 17:10:39 +0200 Subject: [PATCH 133/323] :b:alls --- changelog | 3 + .../recipes/AssemblyMachineRecipes.java | 3 +- .../inventory/recipes/CrackingRecipes.java | 1 + .../com/hbm/itempool/ItemPoolsRedRoom.java | 1 + .../machine/TileEntityMachineMiningLaser.java | 9 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../assets/hbm/models/machines/purex.obj | 8803 +++++++++++++++++ .../hbm/textures/models/machines/purex.png | Bin 0 -> 6779 bytes 8 files changed, 8815 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/machines/purex.obj create mode 100644 src/main/resources/assets/hbm/textures/models/machines/purex.png diff --git a/changelog b/changelog index 57f21b30a..06cca47a8 100644 --- a/changelog +++ b/changelog @@ -15,6 +15,9 @@ * The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints * The chemical plant now has a recipe for making cobblestone from 25mB of lava (which can be liquefacted into even more lava, useful for cobblestone generation) * Removed the old arc furnace +* Mining lasers now build up barricades in all directions and not just horizontal ones, preventing potential deadlocks due to liquid flowing in from above +* One of the new secret parts for making a certain weapon is now obtainable again via red rooms +* Biogas can now be cracked into aromatics and petroleum gas ## Fixed * Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 66bd4f27a..e38c4cf32 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -83,7 +83,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(EUPH.ingot(), 4), new OreDictStack(AT.dust(), 3), new OreDictStack(BI.dust(), 1), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.ingot_osmiridium))); this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); - + + // expensive parts this.register(new GenericRecipe("ass.exsteelplating").setup(200, 400).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING.ordinal())) .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(TI.plate(), 4), new OreDictStack(STEEL.bolt(), 16))); this.register(new GenericRecipe("ass.exheavyframe").setup(600, 800).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME.ordinal())) diff --git a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java index b66cf903d..d7c8cd0fd 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java @@ -51,6 +51,7 @@ public class CrackingRecipes extends SerializableRecipe { cracking.put(Fluids.XYLENE, new Pair(new FluidStack(Fluids.AROMATICS, xyl_crack_aroma), new FluidStack(Fluids.PETROLEUM, xyl_crack_petro))); cracking.put(Fluids.HEATINGOIL_VACUUM, new Pair(new FluidStack(Fluids.HEATINGOIL, 80), new FluidStack(Fluids.REFORMGAS, 20))); cracking.put(Fluids.REFORMATE, new Pair(new FluidStack(Fluids.UNSATURATEDS, 40), new FluidStack(Fluids.REFORMGAS, 60))); + cracking.put(Fluids.BIOGAS, new Pair(new FluidStack(Fluids.PETROLEUM, 20), new FluidStack(Fluids.AROMATICS, 20))); } public static Pair getCracking(FluidType oil) { diff --git a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java index 44393be00..e4a85d34a 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java @@ -43,6 +43,7 @@ public class ItemPoolsRedRoom { weighted(ModItems.gun_hangman, 0, 1, 1, 1), weighted(ModItems.gun_mas36, 0, 1, 1, 1), + weighted(ModItems.item_secret, EnumSecretType.FOLLY.ordinal(), 1, 1, 1), }; }}; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 2d82a79ff..358aa12ec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -211,11 +211,10 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } private void buildDam() { - - if(worldObj.getBlock(targetX + 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + 1, targetY, targetZ, ModBlocks.barricade); - if(worldObj.getBlock(targetX - 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX - 1, targetY, targetZ, ModBlocks.barricade); - if(worldObj.getBlock(targetX, targetY, targetZ + 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ + 1, ModBlocks.barricade); - if(worldObj.getBlock(targetX, targetY, targetZ - 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ - 1, ModBlocks.barricade); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(worldObj.getBlock(targetX + dir.offsetX, targetY + dir.offsetY, targetZ + dir.offsetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + dir.offsetX, targetY + dir.offsetY, targetZ + dir.offsetZ, ModBlocks.barricade); + } } private void tryFillContainer(int x, int y, int z) { diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 18e50f81d..e17773efa 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3181,7 +3181,7 @@ item.item_expensive.bronze_tubes.name=Bronze Structural Elements item.item_expensive.ferro_plating.name=Reinforced Ferrouranium Panels item.item_expensive.heavy_frame.name=Heavy Framework item.item_expensive.lead_plating.name=Radiation Resistant Plating -item.item_expensive.steel_plating.name=Bolten Steel Plating +item.item_expensive.steel_plating.name=Bolted Steel Plating item.item_secret.aberrator.name=Aberrator Part item.item_secret.canister.name=Composition SB-26 item.item_secret.controller.name=Proprietary Control Unit diff --git a/src/main/resources/assets/hbm/models/machines/purex.obj b/src/main/resources/assets/hbm/models/machines/purex.obj new file mode 100644 index 000000000..89faf9165 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/purex.obj @@ -0,0 +1,8803 @@ +# Blender v2.79 (sub 0) OBJ File: 'purex.blend' +# www.blender.org +o Frame +v 2.375000 5.000000 -2.250000 +v 2.375000 5.000000 2.250000 +v 2.500000 5.000000 -2.250000 +v 2.500000 5.000000 2.250000 +v 2.375000 4.875000 -2.250000 +v 2.375000 4.875000 2.250000 +v 2.500000 4.875000 -2.250000 +v 2.500000 4.875000 2.250000 +v 2.500000 4.750000 2.500000 +v 2.500000 4.750000 2.250000 +v 2.250000 4.750000 2.500000 +v 2.250000 4.750000 2.250000 +v 2.500000 5.000000 2.500000 +v 2.500000 5.000000 2.250000 +v 2.250000 5.000000 2.500000 +v 2.250000 5.000000 2.250000 +v 2.500000 4.750000 -2.250000 +v 2.500000 4.750000 -2.500000 +v 2.250000 4.750000 -2.250000 +v 2.250000 4.750000 -2.500000 +v 2.500000 5.000000 -2.250000 +v 2.500000 5.000000 -2.500000 +v 2.250000 5.000000 -2.250000 +v 2.250000 5.000000 -2.500000 +v -2.250000 4.750000 2.500000 +v -2.250000 4.750000 2.250000 +v -2.500000 4.750000 2.500000 +v -2.500000 4.750000 2.250000 +v -2.250000 5.000000 2.500000 +v -2.250000 5.000000 2.250000 +v -2.500000 5.000000 2.500000 +v -2.500000 5.000000 2.250000 +v -2.250000 4.750000 -2.250000 +v -2.250000 4.750000 -2.500000 +v -2.500000 4.750000 -2.250000 +v -2.500000 4.750000 -2.500000 +v -2.250000 5.000000 -2.250000 +v -2.250000 5.000000 -2.500000 +v -2.500000 5.000000 -2.250000 +v -2.500000 5.000000 -2.500000 +v -2.500000 4.875000 -2.250000 +v -2.500000 4.875000 2.250000 +v -2.375000 4.875000 -2.250000 +v -2.375000 4.875000 2.250000 +v -2.500000 5.000000 -2.250000 +v -2.500000 5.000000 2.250000 +v -2.375000 5.000000 -2.250000 +v -2.375000 5.000000 2.250000 +v 2.250000 4.875000 -2.500000 +v -2.250000 4.875000 -2.500000 +v 2.250000 4.875000 -2.375000 +v -2.250000 4.875000 -2.375000 +v 2.250000 5.000000 -2.500000 +v -2.250000 5.000000 -2.500000 +v 2.250000 5.000000 -2.375000 +v -2.250000 5.000000 -2.375000 +v -2.250000 4.875000 2.500000 +v 2.250000 4.875000 2.500000 +v -2.250000 4.875000 2.375000 +v 2.250000 4.875000 2.375000 +v -2.250000 5.000000 2.500000 +v 2.250000 5.000000 2.500000 +v -2.250000 5.000000 2.375000 +v 2.250000 5.000000 2.375000 +v 2.375000 4.750000 2.500000 +v 2.375000 0.250000 2.500000 +v 2.500000 4.750000 2.500000 +v 2.500000 0.250000 2.500000 +v 2.375000 4.750000 2.375000 +v 2.375000 0.250000 2.375000 +v 2.500000 4.750000 2.375000 +v 2.500000 0.250000 2.375000 +v -2.500000 4.750000 2.375000 +v -2.500000 0.250000 2.375000 +v -2.375000 4.750000 2.375000 +v -2.375000 0.250000 2.375000 +v -2.500000 4.750000 2.500000 +v -2.500000 0.250000 2.500000 +v -2.375000 4.750000 2.500000 +v -2.375000 0.250000 2.500000 +v 2.375000 0.250000 -2.500000 +v 2.375000 4.750000 -2.500000 +v 2.500000 0.250000 -2.500000 +v 2.500000 4.750000 -2.500000 +v 2.375000 0.250000 -2.375000 +v 2.375000 4.750000 -2.375000 +v 2.500000 0.250000 -2.375000 +v 2.500000 4.750000 -2.375000 +v -2.500000 0.250000 -2.375000 +v -2.500000 4.750000 -2.375000 +v -2.375000 0.250000 -2.375000 +v -2.375000 4.750000 -2.375000 +v -2.500000 0.250000 -2.500000 +v -2.500000 4.750000 -2.500000 +v -2.375000 0.250000 -2.500000 +v -2.375000 4.750000 -2.500000 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.528090 +vt 0.523810 0.505618 +vt 0.309524 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.516854 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.528090 +vt 0.523810 0.505618 +vt 0.309524 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.516854 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 11/1/1 10/2/1 9/3/1 +f 14/4/2 15/5/2 13/6/2 +f 12/7/3 14/4/3 10/2/3 +f 10/2/4 13/6/4 9/3/4 +f 9/8/5 15/9/5 11/10/5 +f 11/10/6 16/11/6 12/7/6 +f 19/12/1 18/13/1 17/14/1 +f 22/15/2 23/16/2 21/17/2 +f 20/18/3 22/15/3 18/13/3 +f 18/13/4 21/17/4 17/14/4 +f 17/19/5 23/20/5 19/21/5 +f 19/21/6 24/22/6 20/18/6 +f 27/23/1 26/24/1 25/25/1 +f 30/26/2 31/27/2 29/28/2 +f 28/29/3 30/26/3 26/24/3 +f 26/24/4 29/28/4 25/25/4 +f 25/30/5 31/31/5 27/32/5 +f 27/32/6 32/33/6 28/29/6 +f 35/34/1 34/35/1 33/36/1 +f 38/37/2 39/38/2 37/39/2 +f 36/40/3 38/37/3 34/35/3 +f 34/35/4 37/39/4 33/36/4 +f 33/41/5 39/42/5 35/43/5 +f 35/43/6 40/44/6 36/40/6 +f 6/45/1 7/46/1 8/47/1 +f 2/48/6 5/49/6 6/50/6 +f 3/51/4 8/47/4 7/46/4 +f 1/52/2 4/53/2 3/51/2 +f 43/54/1 42/55/1 41/56/1 +f 47/57/4 44/58/4 43/59/4 +f 46/60/6 41/56/6 42/55/6 +f 48/61/2 45/62/2 46/60/2 +f 51/63/1 50/64/1 49/65/1 +f 55/66/5 52/67/5 51/68/5 +f 54/69/3 49/65/3 50/64/3 +f 56/70/2 53/71/2 54/69/2 +f 59/72/1 58/73/1 57/74/1 +f 63/75/3 60/76/3 59/77/3 +f 62/78/5 57/74/5 58/73/5 +f 64/79/2 61/80/2 62/78/2 +f 70/81/3 71/82/3 72/83/3 +f 66/84/6 69/85/6 70/86/6 +f 67/87/4 72/83/4 71/82/4 +f 65/88/5 68/89/5 67/87/5 +f 75/90/3 74/91/3 73/92/3 +f 79/93/4 76/94/4 75/95/4 +f 78/96/6 73/92/6 74/91/6 +f 80/97/5 77/98/5 78/96/5 +f 86/99/5 87/100/5 88/101/5 +f 82/102/6 85/103/6 86/104/6 +f 83/105/4 88/101/4 87/100/4 +f 81/106/3 84/107/3 83/105/3 +f 91/108/5 90/109/5 89/110/5 +f 95/111/4 92/112/4 91/113/4 +f 94/114/6 89/110/6 90/109/6 +f 96/115/3 93/116/3 94/114/3 +f 11/1/1 12/117/1 10/2/1 +f 14/4/2 16/118/2 15/5/2 +f 12/7/3 16/11/3 14/4/3 +f 10/2/4 14/4/4 13/6/4 +f 9/8/5 13/119/5 15/9/5 +f 11/10/6 15/9/6 16/11/6 +f 19/12/1 20/120/1 18/13/1 +f 22/15/2 24/121/2 23/16/2 +f 20/18/3 24/22/3 22/15/3 +f 18/13/4 22/15/4 21/17/4 +f 17/19/5 21/122/5 23/20/5 +f 19/21/6 23/20/6 24/22/6 +f 27/23/1 28/123/1 26/24/1 +f 30/26/2 32/124/2 31/27/2 +f 28/29/3 32/33/3 30/26/3 +f 26/24/4 30/26/4 29/28/4 +f 25/30/5 29/125/5 31/31/5 +f 27/32/6 31/31/6 32/33/6 +f 35/34/1 36/126/1 34/35/1 +f 38/37/2 40/127/2 39/38/2 +f 36/40/3 40/44/3 38/37/3 +f 34/35/4 38/37/4 37/39/4 +f 33/41/5 37/128/5 39/42/5 +f 35/43/6 39/42/6 40/44/6 +f 6/45/1 5/129/1 7/46/1 +f 2/48/6 1/52/6 5/49/6 +f 3/51/4 4/53/4 8/47/4 +f 1/52/2 2/48/2 4/53/2 +f 43/54/1 44/130/1 42/55/1 +f 47/57/4 48/61/4 44/58/4 +f 46/60/6 45/62/6 41/56/6 +f 48/61/2 47/57/2 45/62/2 +f 51/63/1 52/131/1 50/64/1 +f 55/66/5 56/70/5 52/67/5 +f 54/69/3 53/71/3 49/65/3 +f 56/70/2 55/66/2 53/71/2 +f 59/72/1 60/132/1 58/73/1 +f 63/75/3 64/79/3 60/76/3 +f 62/78/5 61/80/5 57/74/5 +f 64/79/2 63/75/2 61/80/2 +f 70/81/3 69/133/3 71/82/3 +f 66/84/6 65/88/6 69/85/6 +f 67/87/4 68/89/4 72/83/4 +f 65/88/5 66/84/5 68/89/5 +f 75/90/3 76/134/3 74/91/3 +f 79/93/4 80/97/4 76/94/4 +f 78/96/6 77/98/6 73/92/6 +f 80/97/5 79/93/5 77/98/5 +f 86/99/5 85/135/5 87/100/5 +f 82/102/6 81/106/6 85/103/6 +f 83/105/4 84/107/4 88/101/4 +f 81/106/3 82/102/3 84/107/3 +f 91/108/5 92/136/5 90/109/5 +f 95/111/4 96/115/4 92/112/4 +f 94/114/6 93/116/6 89/110/6 +f 96/115/3 95/111/3 93/116/3 +o Fan +v 1.500000 1.312500 2.250000 +v 1.445873 1.281250 2.250000 +v 1.445873 1.218750 2.250000 +v 1.500000 1.187500 2.250000 +v 1.554127 1.218750 2.250000 +v 1.554127 1.281250 2.250000 +v 1.500000 1.312500 2.374999 +v 1.445873 1.281250 2.374999 +v 1.445873 1.218750 2.374999 +v 1.500000 1.187500 2.374999 +v 1.554127 1.218750 2.374999 +v 1.554127 1.281250 2.374999 +v 1.499078 1.311968 2.305412 +v 1.446796 1.281783 2.321589 +v 1.462713 1.540972 2.283170 +v 1.266654 1.427778 2.343830 +v 1.554127 1.219815 2.305412 +v 1.554127 1.280185 2.321589 +v 1.462713 0.959028 2.343830 +v 1.266654 1.072222 2.283170 +v 1.499078 1.188032 2.321589 +v 1.446795 1.218218 2.305412 +v 1.770633 1.136806 2.283170 +v 1.770633 1.363194 2.343830 +vt 0.309524 0.910112 +vt 0.306548 0.921348 +vt 0.306548 0.910112 +vt 0.321429 0.910112 +vt 0.318452 0.921348 +vt 0.318452 0.910112 +vt 0.315476 0.910112 +vt 0.312500 0.921348 +vt 0.312500 0.910112 +vt 0.309524 0.921348 +vt 0.303571 0.921348 +vt 0.303571 0.910112 +vt 0.315476 0.921348 +vt 0.309083 0.929729 +vt 0.306548 0.932492 +vt 0.304012 0.924203 +vt 0.291667 0.915730 +vt 0.303571 0.932584 +vt 0.291667 0.926966 +vt 0.291667 0.915730 +vt 0.303571 0.932584 +vt 0.291667 0.926966 +vt 0.303571 0.910112 +vt 0.291667 0.926966 +vt 0.291667 0.915730 +vt 0.321429 0.921348 +vt 0.304012 0.929729 +vt 0.306548 0.921440 +vt 0.309083 0.924203 +vt 0.303571 0.910112 +vt 0.303571 0.910112 +vt 0.303571 0.932584 +vn 1.0000 0.0000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.2588 0.9659 +vn -0.2241 0.1294 0.9659 +vn 0.2241 0.1294 0.9659 +s off +f 102/137/7 107/138/7 101/139/7 +f 100/140/8 105/141/8 99/142/8 +f 98/143/9 103/144/9 97/145/9 +f 97/145/10 108/146/10 102/137/10 +f 101/139/11 106/147/11 100/148/11 +f 99/142/12 104/149/12 98/143/12 +f 108/150/13 103/151/13 105/152/13 +f 113/153/14 120/154/14 114/155/14 +f 118/156/15 115/157/15 117/158/15 +f 111/159/16 110/160/16 109/161/16 +f 102/137/7 108/146/7 107/138/7 +f 100/140/8 106/162/8 105/141/8 +f 98/143/9 104/149/9 103/144/9 +f 97/145/10 103/144/10 108/146/10 +f 101/139/11 107/138/11 106/147/11 +f 99/142/12 105/141/12 104/149/12 +f 103/151/13 104/163/13 105/152/13 +f 105/152/13 106/164/13 107/165/13 +f 107/165/13 108/150/13 105/152/13 +f 113/153/14 119/166/14 120/154/14 +f 118/156/15 116/167/15 115/157/15 +f 111/159/16 112/168/16 110/160/16 +o Pump +v -0.250000 1.875000 -1.500000 +v -0.250000 1.941987 -1.250000 +v -0.250000 2.125000 -1.066987 +v -0.250000 2.375000 -1.000000 +v -0.250000 2.625000 -1.066987 +v -0.250000 2.808013 -1.250000 +v -0.250000 2.875000 -1.500000 +v -0.250000 2.808013 -1.750000 +v -0.250000 2.625000 -1.933012 +v -0.250000 2.375000 -2.000000 +v -0.250000 1.941987 -1.750000 +v -0.250000 2.125000 -1.933012 +v -0.250000 1.625000 -1.500000 +v -0.250000 1.725481 -1.125000 +v -0.250000 2.000000 -0.850481 +v -0.250000 2.375000 -0.750000 +v -0.250000 2.750000 -0.850481 +v -0.250000 3.024519 -1.125000 +v -0.250000 3.125000 -1.500000 +v -0.250000 3.024519 -1.875000 +v -0.250000 2.750000 -2.149519 +v -0.250000 2.375000 -2.250000 +v -0.250000 1.725481 -1.875000 +v -0.250000 2.000000 -2.149519 +v 0.250000 2.000000 -2.149519 +v 0.250000 1.725481 -1.875000 +v 0.250000 2.375000 -2.250000 +v 0.250000 2.750000 -2.149519 +v 0.250000 3.024519 -1.875000 +v 0.250000 3.125000 -1.500000 +v 0.250000 3.024519 -1.125000 +v 0.250000 2.750000 -0.850481 +v 0.250000 2.375000 -0.750000 +v 0.250000 2.000000 -0.850481 +v 0.250000 1.725481 -1.125000 +v 0.250000 1.625000 -1.500000 +v 0.250000 2.125000 -1.933012 +v 0.250000 1.941987 -1.750000 +v 0.250000 2.375000 -2.000000 +v 0.250000 2.625000 -1.933012 +v 0.250000 2.808013 -1.750000 +v 0.250000 2.875000 -1.500000 +v 0.250000 2.808013 -1.250000 +v 0.250000 2.625000 -1.066987 +v 0.250000 2.375000 -1.000000 +v 0.250000 2.125000 -1.066987 +v 0.250000 1.941987 -1.250000 +v 0.250000 1.875000 -1.500000 +vt 0.452381 0.578652 +vt 0.440476 0.606742 +vt 0.440476 0.573034 +vt 0.452381 0.544944 +vt 0.440476 0.539326 +vt 0.452381 0.915730 +vt 0.440476 0.943820 +vt 0.440476 0.910112 +vt 0.452381 0.882023 +vt 0.440476 0.876405 +vt 0.440476 0.842697 +vt 0.452381 0.870786 +vt 0.416667 0.606742 +vt 0.404762 0.634831 +vt 0.404762 0.612360 +vt 0.416667 0.674157 +vt 0.404762 0.646067 +vt 0.416667 0.640449 +vt 0.416667 0.707865 +vt 0.404762 0.679775 +vt 0.416667 0.741573 +vt 0.404762 0.713483 +vt 0.416667 0.775281 +vt 0.404762 0.747191 +vt 0.404762 0.803371 +vt 0.404762 0.780899 +vt 0.416667 0.808989 +vt 0.404762 0.837079 +vt 0.404762 0.814607 +vt 0.416667 0.842697 +vt 0.404762 0.870786 +vt 0.404762 0.848315 +vt 0.416667 0.876405 +vt 0.404762 0.904494 +vt 0.404762 0.882023 +vt 0.416667 0.943820 +vt 0.404762 0.915730 +vt 0.416667 0.910112 +vt 0.416667 0.573034 +vt 0.404762 0.544944 +vt 0.416667 0.539326 +vt 0.404762 0.578652 +vt 0.440476 0.808989 +vt 0.452381 0.837079 +vt 0.440476 0.775281 +vt 0.452381 0.803371 +vt 0.452381 0.747191 +vt 0.440476 0.741573 +vt 0.452381 0.713483 +vt 0.440476 0.707865 +vt 0.452381 0.679775 +vt 0.440476 0.674157 +vt 0.452381 0.646067 +vt 0.440476 0.640449 +vt 0.452381 0.634831 +vt 0.452381 0.601124 +vt 0.452381 0.567416 +vt 0.452381 0.938202 +vt 0.452381 0.904494 +vt 0.452381 0.848315 +vt 0.404762 0.668539 +vt 0.404762 0.702247 +vt 0.404762 0.735955 +vt 0.404762 0.769663 +vt 0.404762 0.938202 +vt 0.404762 0.567416 +vt 0.404762 0.601124 +vt 0.452381 0.814607 +vt 0.452381 0.780899 +vt 0.452381 0.769663 +vt 0.452381 0.735955 +vt 0.452381 0.702247 +vt 0.452381 0.668539 +vt 0.452381 0.612360 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 -0.8660 -0.5000 +vn 0.0000 0.5000 0.8660 +vn 0.0000 0.8660 0.5000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 -0.8660 0.5000 +s off +f 131/169/17 144/170/17 143/171/17 +f 121/172/17 143/171/17 133/173/17 +f 122/174/17 133/175/17 134/176/17 +f 123/177/17 134/176/17 135/178/17 +f 136/179/17 123/180/17 135/178/17 +f 145/181/18 159/182/18 157/183/18 +f 148/184/18 159/185/18 147/186/18 +f 149/187/18 160/188/18 148/184/18 +f 150/189/18 161/190/18 149/187/18 +f 151/191/18 162/192/18 150/189/18 +f 151/191/18 164/193/18 163/194/18 +f 152/195/18 165/196/18 164/197/18 +f 153/198/18 166/199/18 165/200/18 +f 154/201/18 167/202/18 166/203/18 +f 156/204/18 167/205/18 155/206/18 +f 146/207/18 168/208/18 156/209/18 +f 145/181/18 158/210/18 146/207/18 +f 137/211/17 124/212/17 136/179/17 +f 138/213/17 125/214/17 137/211/17 +f 127/215/17 138/213/17 139/216/17 +f 128/217/17 139/216/17 140/218/17 +f 129/219/17 140/218/17 141/220/17 +f 130/221/17 141/220/17 142/222/17 +f 144/170/17 130/223/17 142/222/17 +f 131/169/17 132/224/17 144/170/17 +f 121/172/17 131/225/17 143/171/17 +f 122/174/17 121/226/17 133/175/17 +f 123/177/17 122/227/17 134/176/17 +f 136/179/17 124/228/17 123/180/17 +f 145/181/18 147/186/18 159/182/18 +f 148/184/18 160/229/18 159/185/18 +f 149/187/18 161/230/18 160/188/18 +f 150/189/18 162/231/18 161/190/18 +f 151/191/18 163/232/18 162/192/18 +f 151/191/18 152/195/18 164/193/18 +f 152/195/18 153/198/18 165/196/18 +f 153/198/18 154/201/18 166/199/18 +f 154/201/18 155/206/18 167/202/18 +f 156/204/18 168/233/18 167/205/18 +f 146/207/18 158/234/18 168/208/18 +f 145/181/18 157/235/18 158/210/18 +f 137/211/17 125/236/17 124/212/17 +f 138/213/17 126/237/17 125/214/17 +f 127/215/17 126/238/17 138/213/17 +f 128/217/17 127/239/17 139/216/17 +f 129/219/17 128/240/17 140/218/17 +f 130/221/17 129/241/17 141/220/17 +f 144/170/17 132/242/17 130/223/17 +s 1 +f 145/181/19 142/222/20 147/186/20 +f 153/198/21 135/178/22 154/201/22 +f 146/207/23 144/170/19 145/181/19 +f 152/195/24 136/179/21 153/198/21 +f 151/191/25 137/211/24 152/195/24 +f 150/189/26 138/213/25 151/191/25 +f 149/187/27 139/216/26 150/189/26 +f 156/209/28 143/171/23 146/207/23 +f 148/184/29 140/218/27 149/187/27 +f 155/206/30 133/175/28 156/204/28 +f 147/186/20 141/220/29 148/184/29 +f 154/201/22 134/176/30 155/206/30 +f 145/181/19 144/170/19 142/222/20 +f 153/198/21 136/179/21 135/178/22 +f 146/207/23 143/171/23 144/170/19 +f 152/195/24 137/211/24 136/179/21 +f 151/191/25 138/213/25 137/211/24 +f 150/189/26 139/216/26 138/213/25 +f 149/187/27 140/218/27 139/216/26 +f 156/209/28 133/173/28 143/171/23 +f 148/184/29 141/220/29 140/218/27 +f 155/206/30 134/176/30 133/175/28 +f 147/186/20 142/222/20 141/220/29 +f 154/201/22 135/178/22 134/176/30 +o Base +v 2.500000 0.000000 2.500000 +v 2.500000 0.000000 2.250000 +v 2.250000 0.000000 2.500000 +v 2.250000 0.000000 2.250000 +v 2.500000 0.250000 2.500000 +v 2.500000 0.250000 2.250000 +v 2.250000 0.250000 2.500000 +v 2.250000 0.250000 2.250000 +v 2.500000 0.000000 -2.250000 +v 2.500000 0.000000 -2.500000 +v 2.250000 0.000000 -2.250000 +v 2.250000 0.000000 -2.500000 +v 2.500000 0.250000 -2.250000 +v 2.500000 0.250000 -2.500000 +v 2.250000 0.250000 -2.250000 +v 2.250000 0.250000 -2.500000 +v -2.250000 0.000000 2.500000 +v -2.250000 0.000000 2.250000 +v -2.500000 0.000000 2.500000 +v -2.500000 0.000000 2.250000 +v -2.250000 0.250000 2.500000 +v -2.250000 0.250000 2.250000 +v -2.500000 0.250000 2.500000 +v -2.500000 0.250000 2.250000 +v -2.250000 0.000000 -2.250000 +v -2.250000 0.000000 -2.500000 +v -2.500000 0.000000 -2.250000 +v -2.500000 0.000000 -2.500000 +v -2.250000 0.250000 -2.250000 +v -2.250000 0.250000 -2.500000 +v -2.500000 0.250000 -2.250000 +v -2.500000 0.250000 -2.500000 +v 2.500000 0.000000 2.250000 +v 2.500000 0.000000 -2.250000 +v 2.375000 0.000000 2.250000 +v 2.375000 0.000000 -2.250000 +v 2.500000 0.125000 2.250000 +v 2.500000 0.125000 -2.250000 +v 2.375000 0.125000 2.250000 +v 2.375000 0.125000 -2.250000 +v -2.500000 0.000000 -2.250000 +v -2.500000 0.000000 2.250000 +v -2.375000 0.000000 -2.250000 +v -2.375000 0.000000 2.250000 +v -2.500000 0.125000 -2.250000 +v -2.500000 0.125000 2.250000 +v -2.375000 0.125000 -2.250000 +v -2.375000 0.125000 2.250000 +v 2.250000 0.000000 -2.500000 +v -2.250000 0.000000 -2.500000 +v 2.250000 0.000000 -2.375000 +v -2.250000 0.000000 -2.375000 +v 2.250000 0.125000 -2.500000 +v -2.250000 0.125000 -2.500000 +v 2.250000 0.125000 -2.375000 +v -2.250000 0.125000 -2.375000 +v -2.250000 0.000000 2.500000 +v 2.250000 0.000000 2.500000 +v -2.250000 0.000000 2.375000 +v 2.250000 0.000000 2.375000 +v -2.250000 0.125000 2.500000 +v 2.250000 0.125000 2.500000 +v -2.250000 0.125000 2.375000 +v 2.250000 0.125000 2.375000 +v 1.875000 0.125000 2.500000 +v 2.125000 0.125000 2.500000 +v 1.875000 0.125000 -2.500000 +v 2.125000 0.125000 -2.500000 +v 1.875000 0.250000 -2.500000 +v 1.875000 0.250000 2.500000 +v 2.125000 0.250000 2.500000 +v 2.125000 0.250000 -2.500000 +v -2.250000 0.250000 2.250000 +v 0.250000 0.250000 2.250000 +v -2.250000 0.250000 -0.250000 +v 0.250000 0.250000 -0.250000 +v -2.250000 0.750000 -0.250000 +v -2.250000 0.750000 2.250000 +v 0.250000 0.750000 2.250000 +v 0.250000 0.750000 -0.250000 +v 0.750000 0.250000 2.250000 +v 0.750000 0.250000 -0.250000 +v 0.750000 0.750000 2.250000 +v 0.750000 0.750000 -0.250000 +v 2.250000 0.250000 2.250000 +v 2.250000 0.250000 -0.250000 +v 2.250000 0.750000 2.250000 +v 2.250000 0.750000 -0.250000 +v -2.250000 0.250000 -0.750000 +v -2.000000 0.750000 -1.000000 +v 2.250000 0.250000 -0.750000 +v 2.000000 0.750000 -1.000000 +v -2.000000 0.750000 -2.000000 +v -2.250000 0.250000 -2.250000 +v 2.250000 0.250000 -2.250000 +v 2.000000 0.750000 -2.000000 +v -1.750000 0.750000 1.000000 +v -2.125000 0.750000 1.100481 +v -2.399519 0.750000 1.375000 +v -2.500000 0.750000 1.750000 +v -2.399519 0.750000 2.125000 +v -2.125000 0.750000 2.399519 +v -1.750000 0.750000 2.500000 +v -1.375000 0.750000 2.399519 +v -1.100481 0.750000 2.125000 +v -1.000000 0.750000 1.750000 +v -1.100481 0.750000 1.375000 +v -1.375000 0.750000 1.100481 +v -2.125000 3.750000 1.100481 +v -1.750000 3.750000 1.000000 +v -2.399519 3.750000 1.375000 +v -2.500000 3.750000 1.750000 +v -2.399519 3.750000 2.125000 +v -2.125000 3.750000 2.399519 +v -1.750000 3.750000 2.500000 +v -1.375000 3.750000 2.399519 +v -1.100481 3.750000 2.125000 +v -1.000000 3.750000 1.750000 +v -1.100481 3.750000 1.375000 +v -1.375000 3.750000 1.100481 +v -1.750000 0.750000 -0.500000 +v -2.125000 0.750000 -0.399519 +v -2.399519 0.750000 -0.125000 +v -2.500000 0.750000 0.250000 +v -2.399519 0.750000 0.625000 +v -2.125000 0.750000 0.899519 +v -1.750000 0.750000 1.000000 +v -1.375000 0.750000 0.899519 +v -1.100481 0.750000 0.625000 +v -1.000000 0.750000 0.250000 +v -1.100481 0.750000 -0.125000 +v -1.375000 0.750000 -0.399519 +v -2.125000 3.750000 -0.399519 +v -1.750000 3.750000 -0.500000 +v -2.399519 3.750000 -0.125000 +v -2.500000 3.750000 0.250000 +v -2.399519 3.750000 0.625000 +v -2.125000 3.750000 0.899519 +v -1.750000 3.750000 1.000000 +v -1.375000 3.750000 0.899519 +v -1.100481 3.750000 0.625000 +v -1.000000 3.750000 0.250000 +v -1.100481 3.750000 -0.125000 +v -1.375000 3.750000 -0.399519 +v -0.250000 0.750000 1.000000 +v -0.625000 0.750000 1.100481 +v -0.899519 0.750000 1.375000 +v -1.000000 0.750000 1.750000 +v -0.899519 0.750000 2.125000 +v -0.625000 0.750000 2.399519 +v -0.250000 0.750000 2.500000 +v 0.125000 0.750000 2.399519 +v 0.399519 0.750000 2.125000 +v 0.500000 0.750000 1.750000 +v 0.399519 0.750000 1.375000 +v 0.125000 0.750000 1.100481 +v -0.625000 3.750000 1.100481 +v -0.250000 3.750000 1.000000 +v -0.899519 3.750000 1.375000 +v -1.000000 3.750000 1.750000 +v -0.899519 3.750000 2.125000 +v -0.625000 3.750000 2.399519 +v -0.250000 3.750000 2.500000 +v 0.125000 3.750000 2.399519 +v 0.399519 3.750000 2.125000 +v 0.500000 3.750000 1.750000 +v 0.399519 3.750000 1.375000 +v 0.125001 3.750000 1.100481 +v -0.250000 0.750000 -0.500000 +v -0.625000 0.750000 -0.399519 +v -0.899519 0.750000 -0.125000 +v -1.000000 0.750000 0.250000 +v -0.899519 0.750000 0.625000 +v -0.625000 0.750000 0.899519 +v -0.250000 0.750000 1.000000 +v 0.125000 0.750000 0.899519 +v 0.399519 0.750000 0.625000 +v 0.500000 0.750000 0.250000 +v 0.399519 0.750000 -0.125000 +v 0.125000 0.750000 -0.399519 +v -0.625000 3.750000 -0.399519 +v -0.250000 3.750000 -0.500000 +v -0.899519 3.750000 -0.125000 +v -1.000000 3.750000 0.250000 +v -0.899519 3.750000 0.625000 +v -0.625000 3.750000 0.899519 +v -0.250000 3.750000 1.000000 +v 0.125000 3.750000 0.899519 +v 0.399519 3.750000 0.625000 +v 0.500000 3.750000 0.250000 +v 0.399519 3.750000 -0.125000 +v 0.125001 3.750000 -0.399519 +v 1.000000 0.750000 2.250000 +v 1.000000 0.750000 -0.250000 +v 2.000000 0.750000 2.250000 +v 2.000000 0.750000 -0.250000 +v 1.000000 1.750000 2.250000 +v 1.000000 1.750000 -0.250000 +v 2.000000 1.750000 2.250000 +v 2.000000 1.750000 -0.250000 +v 1.125000 0.875000 2.250000 +v 1.875000 0.875000 2.250000 +v 1.125000 1.625000 2.250000 +v 1.875000 1.625000 2.250000 +v 1.187500 0.937500 2.375000 +v 1.812500 0.937500 2.375000 +v 1.187500 1.562500 2.375000 +v 1.812500 1.562500 2.375000 +v 1.125000 0.875000 2.375000 +v 1.875000 0.875000 2.375000 +v 1.125000 1.625000 2.375000 +v 1.875000 1.625000 2.375000 +v 1.187500 0.937500 2.250000 +v 1.812500 0.937500 2.250000 +v 1.187500 1.562500 2.250000 +v 1.812500 1.562500 2.250000 +v -0.250000 3.750000 1.750000 +v -0.338388 3.750000 1.786612 +v -0.375000 3.750000 1.875000 +v -0.338388 3.750000 1.963388 +v -0.250000 3.750000 2.000000 +v -0.161611 3.750000 1.963388 +v -0.125000 3.750000 1.875000 +v -0.161611 3.750000 1.786612 +v -0.250000 4.000000 1.750000 +v -0.338388 4.000000 1.786612 +v -0.375000 4.000000 1.875000 +v -0.338388 4.000000 1.963388 +v -0.250000 4.000000 2.000000 +v -0.161611 4.000000 1.963388 +v -0.125000 4.000000 1.875000 +v -0.161611 4.000000 1.786612 +v -0.213388 4.088388 1.750000 +v -0.275888 4.150888 1.786612 +v -0.301776 4.176777 1.875000 +v -0.275888 4.150888 1.963388 +v -0.213388 4.088388 2.000000 +v -0.150888 4.025888 1.963388 +v -0.150888 4.025888 1.786612 +v -0.125000 4.125000 1.750000 +v -0.125000 4.213388 1.786612 +v -0.125000 4.250000 1.875000 +v -0.125000 4.213388 1.963388 +v -0.125000 4.125000 2.000000 +v -0.125000 4.036612 1.963388 +v -0.125000 4.036612 1.786612 +v 1.250000 1.750000 2.000000 +v 1.338388 1.750000 1.963388 +v 1.375000 1.750000 1.875000 +v 1.338388 1.750000 1.786612 +v 1.250000 1.750000 1.750000 +v 1.161612 1.750000 1.786612 +v 1.125000 1.750000 1.875000 +v 1.161612 1.750000 1.963388 +v 1.250000 4.000000 2.000000 +v 1.338388 4.000000 1.963388 +v 1.375000 4.000000 1.875000 +v 1.338388 4.000000 1.786612 +v 1.250000 4.000000 1.750000 +v 1.161612 4.000000 1.786612 +v 1.125000 4.000000 1.875000 +v 1.161612 4.000000 1.963388 +v 1.213388 4.088388 2.000000 +v 1.275888 4.150888 1.963388 +v 1.301777 4.176777 1.875000 +v 1.275888 4.150888 1.786612 +v 1.213388 4.088388 1.750000 +v 1.150888 4.025888 1.786612 +v 1.150888 4.025888 1.963388 +v 1.125000 4.125000 2.000000 +v 1.125000 4.213388 1.963388 +v 1.125000 4.250000 1.875000 +v 1.125000 4.213388 1.786612 +v 1.125000 4.125000 1.750000 +v 1.125000 4.036612 1.786612 +v 1.125000 4.036612 1.963388 +v -1.750000 3.750000 1.750000 +v -1.838388 3.750000 1.786612 +v -1.875000 3.750000 1.875000 +v -1.838388 3.750000 1.963388 +v -1.750000 3.750000 2.000000 +v -1.661611 3.750000 1.963388 +v -1.625000 3.750000 1.875000 +v -1.661611 3.750000 1.786612 +v -1.750000 4.250000 1.750000 +v -1.838388 4.250000 1.786612 +v -1.875000 4.250000 1.875000 +v -1.838388 4.250000 1.963388 +v -1.750000 4.250000 2.000000 +v -1.661611 4.250000 1.963388 +v -1.625000 4.250000 1.875000 +v -1.661611 4.250000 1.786612 +v -1.713388 4.338388 1.750000 +v -1.775888 4.400888 1.786612 +v -1.801777 4.426777 1.875000 +v -1.775888 4.400888 1.963388 +v -1.713388 4.338388 2.000000 +v -1.650888 4.275888 1.963388 +v -1.650888 4.275888 1.786612 +v -1.625000 4.375000 1.750000 +v -1.625000 4.463388 1.786612 +v -1.625000 4.500000 1.875000 +v -1.625000 4.463388 1.963388 +v -1.625000 4.375000 2.000000 +v -1.625000 4.286612 1.963388 +v -1.625000 4.286612 1.786612 +v 1.750000 1.750000 2.000000 +v 1.838388 1.750000 1.963388 +v 1.875000 1.750000 1.875000 +v 1.838388 1.750000 1.786612 +v 1.750000 1.750000 1.750000 +v 1.661612 1.750000 1.786612 +v 1.625000 1.750000 1.875000 +v 1.661612 1.750000 1.963388 +v 1.750000 4.250000 2.000000 +v 1.838388 4.250000 1.963388 +v 1.875000 4.250000 1.875000 +v 1.838388 4.250000 1.786612 +v 1.750000 4.250000 1.750000 +v 1.661612 4.250000 1.786612 +v 1.625000 4.250000 1.875000 +v 1.661612 4.250000 1.963388 +v 1.713388 4.338388 2.000000 +v 1.775888 4.400888 1.963388 +v 1.801777 4.426777 1.875000 +v 1.775888 4.400888 1.786612 +v 1.713388 4.338388 1.750000 +v 1.650888 4.275888 1.786612 +v 1.650888 4.275888 1.963388 +v 1.625000 4.375000 2.000000 +v 1.625000 4.463388 1.963388 +v 1.625000 4.500000 1.875000 +v 1.625000 4.463388 1.786612 +v 1.625000 4.375000 1.750000 +v 1.625000 4.286612 1.786612 +v 1.625000 4.286612 1.963388 +v 1.875000 2.125000 1.750000 +v 1.875000 2.213388 1.786612 +v 1.875000 2.250000 1.875000 +v 1.875000 2.213388 1.963388 +v 1.875000 2.125000 2.000000 +v 1.875000 2.036612 1.963388 +v 1.875000 2.000000 1.875000 +v 1.875000 2.036612 1.786612 +v 1.937500 2.213388 1.786612 +v 1.937500 2.125000 1.750000 +v 1.937500 2.250000 1.875000 +v 1.937500 2.213388 1.963388 +v 1.937500 2.125000 2.000000 +v 1.937500 2.036612 1.963388 +v 1.937500 2.000000 1.875000 +v 1.937500 2.036612 1.786612 +v 1.125000 2.750000 2.000000 +v 1.875000 2.750000 2.000000 +v 1.125000 2.750000 1.500000 +v 1.875000 2.750000 1.500000 +v 1.125000 3.250000 1.500000 +v 1.125000 3.250000 2.000000 +v 1.875000 3.250000 2.000000 +v 1.875000 3.250000 1.500000 +v 1.187500 1.500000 2.375000 +v 1.812500 1.500000 2.375000 +v 1.187500 1.437500 2.375000 +v 1.812500 1.437500 2.375000 +v 1.187500 1.375000 2.375000 +v 1.812500 1.375000 2.375000 +v 1.187500 1.312500 2.375000 +v 1.812500 1.312500 2.375000 +v 1.187500 1.187500 2.375000 +v 1.812500 1.187500 2.375000 +v 1.187500 1.125000 2.375000 +v 1.812500 1.125000 2.375000 +v 1.187500 1.062500 2.375000 +v 1.812500 1.062500 2.375000 +v 1.187500 1.000000 2.375000 +v 1.812500 1.000000 2.375000 +v 2.500000 0.687500 0.187500 +v 2.500000 0.312500 0.187500 +v 2.500000 0.687500 -0.187500 +v 2.500000 0.312500 -0.187500 +v 2.375000 0.625000 -0.125000 +v 2.375000 0.625000 0.125000 +v 2.375000 0.375000 0.125000 +v 2.375000 0.375000 -0.125000 +v 2.375000 0.687500 -0.187500 +v 2.375000 0.687500 0.187500 +v 2.375000 0.312500 0.187500 +v 2.375000 0.312500 -0.187500 +v 2.250000 0.625000 -0.125000 +v 2.250000 0.625000 0.125000 +v 2.250000 0.375000 0.125000 +v 2.250000 0.375000 -0.125000 +v -2.250000 0.750000 -0.750000 +v 2.250000 0.750000 -0.750000 +v -2.250000 0.750000 -2.250000 +v 2.250000 0.750000 -2.250000 +v -2.000000 0.875000 -1.000000 +v 2.000000 0.875000 -1.000000 +v -2.000000 0.875000 -2.000000 +v 2.000000 0.875000 -2.000000 +v -2.250000 0.875000 -0.750000 +v 2.250000 0.875000 -0.750000 +v -2.250000 0.875000 -2.250000 +v 2.250000 0.875000 -2.250000 +v -2.250000 1.625000 -0.750000 +v 2.250000 1.625000 -0.750000 +v -2.250000 1.625000 -2.250000 +v 2.250000 1.625000 -2.250000 +v 1.250000 2.375000 -2.250000 +v 1.250000 2.750000 -2.149519 +v 1.250000 3.024519 -1.875000 +v 1.250000 3.125000 -1.500000 +v 1.250000 3.024519 -1.125000 +v 1.250000 2.750000 -0.850481 +v 1.250000 2.375000 -0.750000 +v 1.250000 2.000000 -0.850481 +v 1.250000 1.725481 -1.125000 +v 1.250000 1.625000 -1.500000 +v 1.250000 1.725481 -1.875000 +v 1.250000 2.000000 -2.149519 +v -1.250000 2.375000 -2.250000 +v -1.250000 2.750000 -2.149519 +v -1.250000 3.024519 -1.875000 +v -1.250000 3.125000 -1.500000 +v -1.250000 3.024519 -1.125000 +v -1.250000 2.750000 -0.850481 +v -1.250000 2.375000 -0.750000 +v -1.250000 2.000000 -0.850481 +v -1.250000 1.725481 -1.125000 +v -1.250000 1.625000 -1.500000 +v -1.250000 1.725481 -1.875000 +v -1.250000 2.000000 -2.149519 +v 1.500000 2.375000 -2.250000 +v 1.500000 2.750000 -2.149519 +v 1.500000 3.024519 -1.875000 +v 1.500000 3.125000 -1.500000 +v 1.500000 3.024519 -1.125000 +v 1.500000 2.750000 -0.850481 +v 1.500000 2.375000 -0.750000 +v 1.500000 2.000000 -0.850481 +v 1.500000 1.725481 -1.125000 +v 1.500000 1.625000 -1.500000 +v 1.500000 1.725481 -1.875000 +v 1.500000 2.000000 -2.149519 +v -1.500000 2.375000 -2.250000 +v -1.500000 2.750000 -2.149519 +v -1.500000 3.024519 -1.875000 +v -1.500000 3.125000 -1.500000 +v -1.500000 3.024519 -1.125000 +v -1.500000 2.750000 -0.850481 +v -1.500000 2.375000 -0.750000 +v -1.500000 2.000000 -0.850481 +v -1.500000 1.725481 -1.125000 +v -1.500000 1.625000 -1.500000 +v -1.500000 1.725481 -1.875000 +v -1.500000 2.000000 -2.149519 +v 1.000000 2.375000 -2.000000 +v 1.000000 2.625000 -1.933013 +v 1.000000 2.808013 -1.750000 +v 1.000000 2.875000 -1.500000 +v 1.000000 2.808013 -1.250000 +v 1.000000 2.625000 -1.066987 +v 1.000000 2.375000 -1.000000 +v 1.000000 2.125000 -1.066987 +v 1.000000 1.941987 -1.250000 +v 1.000000 1.875000 -1.500000 +v 1.000000 1.941987 -1.750000 +v 1.000000 2.125000 -1.933012 +v 1.750000 2.375000 -2.000000 +v 1.750000 2.625000 -1.933013 +v 1.750000 2.808013 -1.750000 +v 1.750000 2.875000 -1.500000 +v 1.750000 2.808013 -1.250000 +v 1.750000 2.625000 -1.066987 +v 1.750000 2.375000 -1.000000 +v 1.750000 2.125000 -1.066987 +v 1.750000 1.941987 -1.250000 +v 1.750000 1.875000 -1.500000 +v 1.750000 1.941987 -1.750000 +v 1.750000 2.125000 -1.933012 +v 1.000000 2.375000 -2.250000 +v 1.000000 2.750000 -2.149519 +v 1.000000 3.024519 -1.875000 +v 1.000000 3.125000 -1.500000 +v 1.000000 3.024519 -1.125000 +v 1.000000 2.750000 -0.850481 +v 1.000000 2.375000 -0.750000 +v 1.000000 2.000000 -0.850481 +v 1.000000 1.725481 -1.125000 +v 1.000000 1.625000 -1.500000 +v 1.000000 1.725481 -1.875000 +v 1.000000 2.000000 -2.149519 +v 0.750000 2.375000 -2.250000 +v 0.750000 2.750000 -2.149519 +v 0.750000 3.024519 -1.875000 +v 0.750000 3.125000 -1.500000 +v 0.750000 3.024519 -1.125000 +v 0.750000 2.750000 -0.850481 +v 0.750000 2.375000 -0.750000 +v 0.750000 2.000000 -0.850481 +v 0.750000 1.725481 -1.125000 +v 0.750000 1.625000 -1.500000 +v 0.750000 1.725481 -1.875000 +v 0.750000 2.000000 -2.149519 +v 0.750000 2.375000 -2.000000 +v 0.750000 2.625000 -1.933013 +v 0.750000 2.808013 -1.750000 +v 0.750000 2.875000 -1.500000 +v 0.750000 2.808013 -1.250000 +v 0.750000 2.625000 -1.066987 +v 0.750000 2.375000 -1.000000 +v 0.750000 2.125000 -1.066987 +v 0.750000 1.941987 -1.250000 +v 0.750000 1.875000 -1.500000 +v 0.750000 1.941987 -1.750000 +v 0.750000 2.125000 -1.933012 +v -0.750000 2.375000 -2.000000 +v -0.750000 2.625000 -1.933013 +v -0.750000 2.808013 -1.750000 +v -0.750000 2.875000 -1.500000 +v -0.750000 2.808013 -1.250000 +v -0.750000 2.625000 -1.066987 +v -0.750000 2.375000 -1.000000 +v -0.750000 2.125000 -1.066987 +v -0.750000 1.941987 -1.250000 +v -0.750000 1.875000 -1.500000 +v -0.750000 1.941987 -1.750000 +v -0.750000 2.125000 -1.933012 +v -0.750000 2.375000 -2.250000 +v -0.750000 2.750000 -2.149519 +v -0.750000 3.024519 -1.875000 +v -0.750000 3.125000 -1.500000 +v -0.750000 3.024519 -1.125000 +v -0.750000 2.750000 -0.850481 +v -0.750000 2.375000 -0.750000 +v -0.750000 2.000000 -0.850481 +v -0.750000 1.725481 -1.125000 +v -0.750000 1.625000 -1.500000 +v -0.750000 1.725481 -1.875000 +v -0.750000 2.000000 -2.149519 +v -1.000000 2.375000 -2.250000 +v -1.000000 2.750000 -2.149519 +v -1.000000 3.024519 -1.875000 +v -1.000000 3.125000 -1.500000 +v -1.000000 3.024519 -1.125000 +v -1.000000 2.750000 -0.850481 +v -1.000000 2.375000 -0.750000 +v -1.000000 2.000000 -0.850481 +v -1.000000 1.725481 -1.125000 +v -1.000000 1.625000 -1.500000 +v -1.000000 1.725481 -1.875000 +v -1.000000 2.000000 -2.149519 +v -1.000000 2.375000 -2.000000 +v -1.000000 2.625000 -1.933013 +v -1.000000 2.808013 -1.750000 +v -1.000000 2.875000 -1.500000 +v -1.000000 2.808013 -1.250000 +v -1.000000 2.625000 -1.066987 +v -1.000000 2.375000 -1.000000 +v -1.000000 2.125000 -1.066987 +v -1.000000 1.941987 -1.250000 +v -1.000000 1.875000 -1.500000 +v -1.000000 1.941987 -1.750000 +v -1.000000 2.125000 -1.933012 +v -1.750000 2.375000 -2.000000 +v -1.750000 2.625000 -1.933013 +v -1.750000 2.808013 -1.750000 +v -1.750000 2.875000 -1.500000 +v -1.750000 2.808013 -1.250000 +v -1.750000 2.625000 -1.066987 +v -1.750000 2.375000 -1.000000 +v -1.750000 2.125000 -1.066987 +v -1.750000 1.941987 -1.250000 +v -1.750000 1.875000 -1.500000 +v -1.750000 1.941987 -1.750000 +v -1.750000 2.125000 -1.933012 +v 0.812500 2.375000 -0.750000 +v 0.937500 2.375000 -0.750000 +v 0.812500 2.375000 -2.250000 +v 0.937500 2.375000 -2.250000 +v 0.812500 1.625000 -0.750000 +v 0.937500 1.625000 -0.750000 +v 0.812500 1.625000 -2.250000 +v 0.937500 1.625000 -2.250000 +v 1.312500 2.375000 -0.750000 +v 1.437500 2.375000 -0.750000 +v 1.312500 2.375000 -2.250000 +v 1.437500 2.375000 -2.250000 +v 1.312500 1.625000 -0.750000 +v 1.437500 1.625000 -0.750000 +v 1.312500 1.625000 -2.250000 +v 1.437500 1.625000 -2.250000 +v -1.437500 2.375000 -0.750000 +v -1.312500 2.375000 -0.750000 +v -1.437500 2.375000 -2.250000 +v -1.312500 2.375000 -2.250000 +v -1.437500 1.625000 -0.750000 +v -1.312500 1.625000 -0.750000 +v -1.437500 1.625000 -2.250000 +v -1.312500 1.625000 -2.250000 +v -0.937500 2.375000 -0.750000 +v -0.812500 2.375000 -0.750000 +v -0.937500 2.375000 -2.250000 +v -0.812500 2.375000 -2.250000 +v -0.937500 1.625000 -0.750000 +v -0.812500 1.625000 -0.750000 +v -0.937500 1.625000 -2.250000 +v -0.812500 1.625000 -2.250000 +v -2.125000 3.750000 0.125000 +v -2.088388 3.750000 0.213388 +v -2.000000 3.750000 0.250000 +v -1.911612 3.750000 0.213388 +v -1.875000 3.750000 0.125000 +v -1.911612 3.750000 0.036612 +v -2.000000 3.750000 0.000000 +v -2.088388 3.750000 0.036612 +v -2.125000 4.000000 0.125000 +v -2.088388 4.000000 0.213388 +v -2.000000 4.000000 0.250000 +v -1.911612 4.000000 0.213388 +v -1.875000 4.000000 0.125000 +v -1.911612 4.000000 0.036612 +v -2.000000 4.000000 0.000000 +v -2.088388 4.000000 0.036612 +v -2.125000 4.088388 0.088388 +v -2.088388 4.150888 0.150888 +v -2.000000 4.176777 0.176777 +v -1.911612 4.150888 0.150888 +v -1.875000 4.088388 0.088388 +v -1.911612 4.025888 0.025888 +v -2.088388 4.025888 0.025888 +v -2.125000 4.125000 0.000000 +v -2.088388 4.213388 0.000000 +v -2.000000 4.250000 0.000000 +v -1.911612 4.213388 0.000000 +v -1.875000 4.125000 0.000000 +v -1.911612 4.036612 0.000000 +v -2.088388 4.036612 0.000000 +v -1.875000 2.500000 -1.250000 +v -1.911612 2.500000 -1.338388 +v -2.000000 2.500000 -1.375000 +v -2.088388 2.500000 -1.338388 +v -2.125000 2.500000 -1.250000 +v -2.088388 2.500000 -1.161612 +v -2.000000 2.500000 -1.125000 +v -1.911612 2.500000 -1.161612 +v -1.875000 4.000000 -1.250000 +v -1.911612 4.000000 -1.338388 +v -2.000000 4.000000 -1.375000 +v -2.088388 4.000000 -1.338388 +v -2.125000 4.000000 -1.250000 +v -2.088388 4.000000 -1.161612 +v -2.000000 4.000000 -1.125000 +v -1.911612 4.000000 -1.161612 +v -1.875000 4.088388 -1.213388 +v -1.911612 4.150888 -1.275888 +v -2.000000 4.176777 -1.301777 +v -2.088388 4.150888 -1.275888 +v -2.125000 4.088388 -1.213388 +v -2.088388 4.025888 -1.150888 +v -1.911612 4.025888 -1.150888 +v -1.875000 4.125000 -1.125000 +v -1.911611 4.213388 -1.125000 +v -2.000000 4.250000 -1.125000 +v -2.088388 4.213388 -1.125000 +v -2.125000 4.125000 -1.125000 +v -2.088388 4.036612 -1.125000 +v -1.911611 4.036612 -1.125000 +v -2.125000 3.750000 1.625000 +v -2.088388 3.750000 1.713388 +v -2.000000 3.750000 1.750000 +v -1.911611 3.750000 1.713388 +v -1.875000 3.750000 1.625000 +v -1.911611 3.750000 1.536612 +v -2.000000 3.750000 1.500000 +v -2.088388 3.750000 1.536612 +v -2.125000 4.250000 1.625000 +v -2.088388 4.250000 1.713388 +v -2.000000 4.250000 1.750000 +v -1.911611 4.250000 1.713388 +v -1.875000 4.250000 1.625000 +v -1.911611 4.250000 1.536612 +v -2.000000 4.250000 1.500000 +v -2.088388 4.250000 1.536612 +v -2.125000 4.338388 1.588388 +v -2.088388 4.400888 1.650888 +v -2.000000 4.426777 1.676777 +v -1.911611 4.400888 1.650888 +v -1.875000 4.338388 1.588388 +v -1.911611 4.275888 1.525888 +v -2.088388 4.275888 1.525888 +v -2.125000 4.375000 1.500000 +v -2.088388 4.463388 1.500000 +v -2.000000 4.500000 1.500000 +v -1.911611 4.463388 1.500000 +v -1.875000 4.375000 1.500000 +v -1.911611 4.286612 1.500000 +v -2.088388 4.286612 1.500000 +v -1.875000 2.500000 -1.750000 +v -1.911612 2.500000 -1.838388 +v -2.000000 2.500000 -1.875000 +v -2.088388 2.500000 -1.838388 +v -2.125000 2.500000 -1.750000 +v -2.088388 2.500000 -1.661612 +v -2.000000 2.500000 -1.625000 +v -1.911612 2.500000 -1.661612 +v -1.875000 4.250000 -1.750000 +v -1.911612 4.250000 -1.838388 +v -2.000000 4.250000 -1.875000 +v -2.088388 4.250000 -1.838388 +v -2.125000 4.250000 -1.750000 +v -2.088388 4.250000 -1.661612 +v -2.000000 4.250000 -1.625000 +v -1.911612 4.250000 -1.661612 +v -1.875000 4.338388 -1.713388 +v -1.911612 4.400888 -1.775888 +v -2.000000 4.426777 -1.801777 +v -2.088388 4.400888 -1.775888 +v -2.125000 4.338388 -1.713388 +v -2.088388 4.275888 -1.650888 +v -1.911612 4.275888 -1.650888 +v -1.875000 4.375000 -1.625000 +v -1.911611 4.463388 -1.625000 +v -2.000000 4.500000 -1.625000 +v -2.088388 4.463388 -1.625000 +v -2.125000 4.375000 -1.625000 +v -2.088388 4.286612 -1.625000 +v -1.911611 4.286612 -1.625000 +v -1.900888 2.474112 -1.338388 +v -1.963388 2.411612 -1.375000 +v -2.025888 2.349112 -1.338388 +v -2.051777 2.323223 -1.250000 +v -2.025888 2.349112 -1.161612 +v -1.963388 2.411612 -1.125000 +v -1.900888 2.474112 -1.161612 +v -1.900888 2.474112 -1.838388 +v -1.963388 2.411612 -1.875000 +v -2.025888 2.349112 -1.838388 +v -2.051777 2.323223 -1.750000 +v -2.025888 2.349112 -1.661612 +v -1.963388 2.411612 -1.625000 +v -1.900888 2.474112 -1.661612 +v -1.875000 2.463388 -1.338388 +v -1.875000 2.375000 -1.375000 +v -1.875000 2.286612 -1.338388 +v -1.875000 2.250000 -1.250000 +v -1.875000 2.286612 -1.161612 +v -1.875000 2.375000 -1.125000 +v -1.875000 2.463388 -1.161612 +v -1.875000 2.463388 -1.838388 +v -1.875000 2.375000 -1.875000 +v -1.875000 2.286612 -1.838388 +v -1.875000 2.250000 -1.750000 +v -1.875000 2.286612 -1.661612 +v -1.875000 2.375000 -1.625000 +v -1.875000 2.463388 -1.661612 +v -1.750000 2.500000 -1.250000 +v -1.750000 2.500000 -1.750000 +v -1.750000 2.463388 -1.338388 +v -1.750000 2.375000 -1.375000 +v -1.750000 2.286612 -1.338388 +v -1.750000 2.250000 -1.250000 +v -1.750000 2.286612 -1.161612 +v -1.750000 2.375000 -1.125000 +v -1.750000 2.463388 -1.161612 +v -1.750000 2.463388 -1.838388 +v -1.750000 2.375000 -1.875000 +v -1.750000 2.286612 -1.838388 +v -1.750000 2.250000 -1.750000 +v -1.750000 2.286612 -1.661612 +v -1.750000 2.375000 -1.625000 +v -1.750000 2.463388 -1.661612 +v 1.000000 2.937500 -1.562500 +v 1.000000 3.062500 -1.562500 +v 1.000000 2.937500 -1.437500 +v 1.000000 3.062500 -1.437500 +v 1.250000 2.937500 -1.562500 +v 1.250000 3.062500 -1.562500 +v 1.250000 2.937500 -1.437500 +v 1.250000 3.062500 -1.437500 +v 1.000000 1.812500 -1.437500 +v 1.000000 1.687500 -1.437500 +v 1.000000 1.812500 -1.562500 +v 1.000000 1.687500 -1.562500 +v 1.250000 1.812500 -1.437500 +v 1.250000 1.687500 -1.437500 +v 1.250000 1.812500 -1.562500 +v 1.250000 1.687500 -1.562500 +v 1.000000 2.437500 -0.937500 +v 1.000000 2.437500 -0.812500 +v 1.000000 2.312500 -0.937500 +v 1.000000 2.312500 -0.812500 +v 1.250000 2.437500 -0.937500 +v 1.250000 2.437500 -0.812500 +v 1.250000 2.312500 -0.937500 +v 1.250000 2.312500 -0.812500 +v 1.000000 2.312500 -2.062500 +v 1.000000 2.312500 -2.187500 +v 1.000000 2.437500 -2.062500 +v 1.000000 2.437500 -2.187500 +v 1.250000 2.312500 -2.062500 +v 1.250000 2.312500 -2.187500 +v 1.250000 2.437500 -2.062500 +v 1.250000 2.437500 -2.187500 +v 1.000000 2.893389 -1.272877 +v 1.000000 3.001642 -1.210377 +v 1.000000 2.830889 -1.164623 +v 1.000000 2.939142 -1.102123 +v 1.250000 2.893389 -1.272877 +v 1.250000 3.001642 -1.210377 +v 1.250000 2.830889 -1.164623 +v 1.250000 2.939142 -1.102123 +v 1.000000 1.856611 -1.727123 +v 1.000000 1.748358 -1.789623 +v 1.000000 1.919111 -1.835376 +v 1.000000 1.810858 -1.897876 +v 1.250000 1.856611 -1.727123 +v 1.250000 1.748358 -1.789623 +v 1.250000 1.919111 -1.835376 +v 1.250000 1.810858 -1.897876 +v 1.000000 2.147877 -0.981611 +v 1.000000 2.085377 -0.873358 +v 1.000000 2.039624 -1.044111 +v 1.000000 1.977124 -0.935858 +v 1.250000 2.147877 -0.981611 +v 1.250000 2.085377 -0.873358 +v 1.250000 2.039624 -1.044111 +v 1.250000 1.977124 -0.935858 +v 1.000000 2.602123 -2.018389 +v 1.000000 2.664623 -2.126642 +v 1.000000 2.710377 -1.955889 +v 1.000000 2.772877 -2.064142 +v 1.250000 2.602123 -2.018389 +v 1.250000 2.664623 -2.126642 +v 1.250000 2.710377 -1.955889 +v 1.250000 2.772877 -2.064142 +v 1.000000 2.710377 -1.044111 +v 1.000000 2.772877 -0.935858 +v 1.000000 2.602124 -0.981611 +v 1.000000 2.664623 -0.873358 +v 1.250000 2.710377 -1.044111 +v 1.250000 2.772877 -0.935858 +v 1.250000 2.602124 -0.981611 +v 1.250000 2.664623 -0.873358 +v 1.000000 2.039624 -1.955889 +v 1.000000 1.977124 -2.064142 +v 1.000000 2.147877 -2.018389 +v 1.000000 2.085377 -2.126642 +v 1.250000 2.039624 -1.955889 +v 1.250000 1.977124 -2.064142 +v 1.250000 2.147877 -2.018389 +v 1.250000 2.085377 -2.126642 +v 1.000000 1.919111 -1.164623 +v 1.000000 1.810858 -1.102123 +v 1.000000 1.856611 -1.272877 +v 1.000000 1.748358 -1.210377 +v 1.250000 1.919111 -1.164623 +v 1.250000 1.810858 -1.102123 +v 1.250000 1.856611 -1.272877 +v 1.250000 1.748358 -1.210377 +v 1.000000 2.830889 -1.835376 +v 1.000000 2.939142 -1.897876 +v 1.000000 2.893389 -1.727123 +v 1.000000 3.001642 -1.789623 +v 1.250000 2.830889 -1.835376 +v 1.250000 2.939142 -1.897876 +v 1.250000 2.893389 -1.727123 +v 1.250000 3.001642 -1.789623 +v -1.250000 2.937500 -1.562500 +v -1.250000 3.062500 -1.562500 +v -1.250000 2.937500 -1.437500 +v -1.250000 3.062500 -1.437500 +v -1.000000 2.937500 -1.562500 +v -1.000000 3.062500 -1.562500 +v -1.000000 2.937500 -1.437500 +v -1.000000 3.062500 -1.437500 +v -1.250000 1.812500 -1.437500 +v -1.250000 1.687500 -1.437500 +v -1.250000 1.812500 -1.562500 +v -1.250000 1.687500 -1.562500 +v -1.000000 1.812500 -1.437500 +v -1.000000 1.687500 -1.437500 +v -1.000000 1.812500 -1.562500 +v -1.000000 1.687500 -1.562500 +v -1.250000 2.437500 -0.937500 +v -1.250000 2.437500 -0.812500 +v -1.250000 2.312500 -0.937500 +v -1.250000 2.312500 -0.812500 +v -1.000000 2.437500 -0.937500 +v -1.000000 2.437500 -0.812500 +v -1.000000 2.312500 -0.937500 +v -1.000000 2.312500 -0.812500 +v -1.250000 2.312500 -2.062500 +v -1.250000 2.312500 -2.187500 +v -1.250000 2.437500 -2.062500 +v -1.250000 2.437500 -2.187500 +v -1.000000 2.312500 -2.062500 +v -1.000000 2.312500 -2.187500 +v -1.000000 2.437500 -2.062500 +v -1.000000 2.437500 -2.187500 +v -1.250000 2.893389 -1.272877 +v -1.250000 3.001642 -1.210377 +v -1.250000 2.830889 -1.164623 +v -1.250000 2.939142 -1.102123 +v -1.000000 2.893389 -1.272877 +v -1.000000 3.001642 -1.210377 +v -1.000000 2.830889 -1.164623 +v -1.000000 2.939142 -1.102123 +v -1.250000 1.856611 -1.727123 +v -1.250000 1.748358 -1.789623 +v -1.250000 1.919111 -1.835376 +v -1.250000 1.810858 -1.897876 +v -1.000000 1.856611 -1.727123 +v -1.000000 1.748358 -1.789623 +v -1.000000 1.919111 -1.835376 +v -1.000000 1.810858 -1.897876 +v -1.250000 2.147877 -0.981611 +v -1.250000 2.085377 -0.873358 +v -1.250000 2.039624 -1.044111 +v -1.250000 1.977124 -0.935858 +v -1.000000 2.147877 -0.981611 +v -1.000000 2.085377 -0.873358 +v -1.000000 2.039624 -1.044111 +v -1.000000 1.977124 -0.935858 +v -1.250000 2.602123 -2.018389 +v -1.250000 2.664623 -2.126642 +v -1.250000 2.710377 -1.955889 +v -1.250000 2.772877 -2.064142 +v -1.000000 2.602123 -2.018389 +v -1.000000 2.664623 -2.126642 +v -1.000000 2.710377 -1.955889 +v -1.000000 2.772877 -2.064142 +v -1.250000 2.710377 -1.044111 +v -1.250000 2.772877 -0.935858 +v -1.250000 2.602124 -0.981611 +v -1.250000 2.664623 -0.873358 +v -1.000000 2.710377 -1.044111 +v -1.000000 2.772877 -0.935858 +v -1.000000 2.602124 -0.981611 +v -1.000000 2.664623 -0.873358 +v -1.250000 2.039624 -1.955889 +v -1.250000 1.977124 -2.064142 +v -1.250000 2.147877 -2.018389 +v -1.250000 2.085377 -2.126642 +v -1.000000 2.039624 -1.955889 +v -1.000000 1.977124 -2.064142 +v -1.000000 2.147877 -2.018389 +v -1.000000 2.085377 -2.126642 +v -1.250000 1.919111 -1.164623 +v -1.250000 1.810858 -1.102123 +v -1.250000 1.856611 -1.272877 +v -1.250000 1.748358 -1.210377 +v -1.000000 1.919111 -1.164623 +v -1.000000 1.810858 -1.102123 +v -1.000000 1.856611 -1.272877 +v -1.000000 1.748358 -1.210377 +v -1.250000 2.830889 -1.835376 +v -1.250000 2.939142 -1.897876 +v -1.250000 2.893389 -1.727123 +v -1.250000 3.001642 -1.789623 +v -1.000000 2.830889 -1.835376 +v -1.000000 2.939142 -1.897876 +v -1.000000 2.893389 -1.727123 +v -1.000000 3.001642 -1.789623 +v 1.911612 2.250000 -1.661612 +v 2.000000 2.250000 -1.625000 +v 2.088388 2.250000 -1.661612 +v 2.125000 2.250000 -1.750000 +v 2.088388 2.250000 -1.838388 +v 2.000000 2.250000 -1.875000 +v 1.911612 2.250000 -1.838388 +v 1.875000 2.250000 -1.750000 +v 1.911612 2.250000 -1.161612 +v 2.000000 2.250000 -1.125000 +v 2.088388 2.250000 -1.161612 +v 2.125000 2.250000 -1.250000 +v 2.088388 2.250000 -1.338388 +v 2.000000 2.250000 -1.375000 +v 1.911612 2.250000 -1.338388 +v 1.875000 2.250000 -1.250000 +v 1.900888 2.275888 -1.338388 +v 1.963388 2.338388 -1.375000 +v 2.025888 2.400888 -1.338388 +v 2.051777 2.426777 -1.250000 +v 2.025888 2.400888 -1.161612 +v 1.963388 2.338388 -1.125000 +v 1.900888 2.275888 -1.161612 +v 1.900888 2.275888 -1.838388 +v 1.963388 2.338388 -1.875000 +v 2.025888 2.400888 -1.838388 +v 2.051777 2.426777 -1.750000 +v 2.025888 2.400888 -1.661612 +v 1.963388 2.338388 -1.625000 +v 1.900888 2.275888 -1.661612 +v 1.875000 2.286612 -1.338388 +v 1.875000 2.375000 -1.375000 +v 1.875000 2.463388 -1.338388 +v 1.875000 2.500000 -1.250000 +v 1.875000 2.463388 -1.161612 +v 1.875000 2.375000 -1.125000 +v 1.875000 2.286612 -1.161612 +v 1.875000 2.286612 -1.838388 +v 1.875000 2.375000 -1.875000 +v 1.875000 2.463388 -1.838388 +v 1.875000 2.500000 -1.750000 +v 1.875000 2.463388 -1.661612 +v 1.875000 2.375000 -1.625000 +v 1.875000 2.286612 -1.661612 +v 1.750000 2.250000 -1.250000 +v 1.750000 2.250000 -1.750000 +v 1.750000 2.286612 -1.338388 +v 1.750000 2.375000 -1.375000 +v 1.750000 2.463388 -1.338388 +v 1.750000 2.500000 -1.250000 +v 1.750000 2.463388 -1.161612 +v 1.750000 2.375000 -1.125000 +v 1.750000 2.286612 -1.161612 +v 1.750000 2.286612 -1.838388 +v 1.750000 2.375000 -1.875000 +v 1.750000 2.463388 -1.838388 +v 1.750000 2.500000 -1.750000 +v 1.750000 2.463388 -1.661612 +v 1.750000 2.375000 -1.625000 +v 1.750000 2.286612 -1.661612 +v 1.911612 1.625000 -1.661612 +v 2.000000 1.625000 -1.625000 +v 2.088388 1.625000 -1.661612 +v 2.125000 1.625000 -1.750000 +v 2.088388 1.625000 -1.838388 +v 2.000000 1.625000 -1.875000 +v 1.911612 1.625000 -1.838388 +v 1.875000 1.625000 -1.750000 +v 1.911612 1.625000 -1.161612 +v 2.000000 1.625000 -1.125000 +v 2.088388 1.625000 -1.161612 +v 2.125000 1.625000 -1.250000 +v 2.088388 1.625000 -1.338388 +v 2.000000 1.625000 -1.375000 +v 1.911612 1.625000 -1.338388 +v 1.875000 1.625000 -1.250000 +v 1.750000 1.562500 -0.250000 +v 1.661612 1.525888 -0.250000 +v 1.625000 1.437500 -0.250000 +v 1.661612 1.349112 -0.250000 +v 1.750000 1.312500 -0.250000 +v 1.838388 1.349112 -0.250000 +v 1.875000 1.437500 -0.250000 +v 1.838388 1.525888 -0.250000 +v 1.750000 1.562500 -0.750000 +v 1.661612 1.525888 -0.750000 +v 1.625000 1.437500 -0.750000 +v 1.661612 1.349112 -0.750000 +v 1.750000 1.312500 -0.750000 +v 1.838388 1.349112 -0.750000 +v 1.875000 1.437500 -0.750000 +v 1.838388 1.525888 -0.750000 +v 1.750000 1.187500 -0.250000 +v 1.661612 1.150888 -0.250000 +v 1.625000 1.062500 -0.250000 +v 1.661612 0.974112 -0.250000 +v 1.750000 0.937500 -0.250000 +v 1.838388 0.974112 -0.250000 +v 1.875000 1.062500 -0.250000 +v 1.838388 1.150888 -0.250000 +v 1.750000 1.187500 -0.750000 +v 1.661612 1.150888 -0.750000 +v 1.625000 1.062500 -0.750000 +v 1.661612 0.974112 -0.750000 +v 1.750000 0.937500 -0.750000 +v 1.838388 0.974112 -0.750000 +v 1.875000 1.062500 -0.750000 +v 1.838388 1.150888 -0.750000 +v 1.250000 1.562500 -0.250000 +v 1.161612 1.525888 -0.250000 +v 1.125000 1.437500 -0.250000 +v 1.161612 1.349112 -0.250000 +v 1.250000 1.312500 -0.250000 +v 1.338388 1.349112 -0.250000 +v 1.375000 1.437500 -0.250000 +v 1.338388 1.525888 -0.250000 +v 1.250000 1.562500 -0.750000 +v 1.161612 1.525888 -0.750000 +v 1.125000 1.437500 -0.750000 +v 1.161612 1.349112 -0.750000 +v 1.250000 1.312500 -0.750000 +v 1.338388 1.349112 -0.750000 +v 1.375000 1.437500 -0.750000 +v 1.338388 1.525888 -0.750000 +v 1.250000 1.187500 -0.250000 +v 1.161612 1.150888 -0.250000 +v 1.125000 1.062500 -0.250000 +v 1.161612 0.974112 -0.250000 +v 1.250000 0.937500 -0.250000 +v 1.338388 0.974112 -0.250000 +v 1.375000 1.062500 -0.250000 +v 1.338388 1.150888 -0.250000 +v 1.250000 1.187500 -0.750000 +v 1.161612 1.150888 -0.750000 +v 1.125000 1.062500 -0.750000 +v 1.161612 0.974112 -0.750000 +v 1.250000 0.937500 -0.750000 +v 1.338388 0.974112 -0.750000 +v 1.375000 1.062500 -0.750000 +v 1.338388 1.150888 -0.750000 +v -0.750000 2.937500 -1.562500 +v -0.750000 3.062500 -1.562500 +v -0.750000 2.937500 -1.437500 +v -0.750000 3.062500 -1.437500 +v -0.750000 1.812500 -1.437500 +v -0.750000 1.687500 -1.437500 +v -0.750000 1.812500 -1.562500 +v -0.750000 1.687500 -1.562500 +v -0.750000 2.437500 -0.937500 +v -0.750000 2.437500 -0.812500 +v -0.750000 2.312500 -0.937500 +v -0.750000 2.312500 -0.812500 +v -0.750000 2.312500 -2.062500 +v -0.750000 2.312500 -2.187500 +v -0.750000 2.437500 -2.062500 +v -0.750000 2.437500 -2.187500 +v -0.750000 2.893389 -1.272877 +v -0.750000 3.001642 -1.210377 +v -0.750000 2.830889 -1.164623 +v -0.750000 2.939142 -1.102123 +v -0.750000 1.856611 -1.727123 +v -0.750000 1.748358 -1.789623 +v -0.750000 1.919111 -1.835376 +v -0.750000 1.810858 -1.897876 +v -0.750000 2.147877 -0.981611 +v -0.750000 2.085377 -0.873358 +v -0.750000 2.039624 -1.044111 +v -0.750000 1.977124 -0.935858 +v -0.750000 2.602123 -2.018389 +v -0.750000 2.664623 -2.126642 +v -0.750000 2.710377 -1.955889 +v -0.750000 2.772877 -2.064142 +v -0.750000 2.710377 -1.044111 +v -0.750000 2.772877 -0.935858 +v -0.750000 2.602124 -0.981611 +v -0.750000 2.664623 -0.873358 +v -0.750000 2.039624 -1.955889 +v -0.750000 1.977124 -2.064142 +v -0.750000 2.147877 -2.018389 +v -0.750000 2.085377 -2.126642 +v -0.750000 1.919111 -1.164623 +v -0.750000 1.810858 -1.102123 +v -0.750000 1.856611 -1.272877 +v -0.750000 1.748358 -1.210377 +v -0.750000 2.830889 -1.835376 +v -0.750000 2.939142 -1.897876 +v -0.750000 2.893389 -1.727123 +v -0.750000 3.001642 -1.789623 +v 0.750000 2.937500 -1.562500 +v 0.750000 3.062500 -1.562500 +v 0.750000 2.937500 -1.437500 +v 0.750000 3.062500 -1.437500 +v 0.750000 1.812500 -1.437500 +v 0.750000 1.687500 -1.437500 +v 0.750000 1.812500 -1.562500 +v 0.750000 1.687500 -1.562500 +v 0.750000 2.437500 -0.937500 +v 0.750000 2.437500 -0.812500 +v 0.750000 2.312500 -0.937500 +v 0.750000 2.312500 -0.812500 +v 0.750000 2.312500 -2.062500 +v 0.750000 2.312500 -2.187500 +v 0.750000 2.437500 -2.062500 +v 0.750000 2.437500 -2.187500 +v 0.750000 2.893389 -1.272877 +v 0.750000 3.001642 -1.210377 +v 0.750000 2.830889 -1.164623 +v 0.750000 2.939142 -1.102123 +v 0.750000 1.856611 -1.727123 +v 0.750000 1.748358 -1.789623 +v 0.750000 1.919111 -1.835376 +v 0.750000 1.810858 -1.897876 +v 0.750000 2.147877 -0.981611 +v 0.750000 2.085377 -0.873358 +v 0.750000 2.039624 -1.044111 +v 0.750000 1.977124 -0.935858 +v 0.750000 2.602123 -2.018389 +v 0.750000 2.664623 -2.126642 +v 0.750000 2.710377 -1.955889 +v 0.750000 2.772877 -2.064142 +v 0.750000 2.710377 -1.044111 +v 0.750000 2.772877 -0.935858 +v 0.750000 2.602124 -0.981611 +v 0.750000 2.664623 -0.873358 +v 0.750000 2.039624 -1.955889 +v 0.750000 1.977124 -2.064142 +v 0.750000 2.147877 -2.018389 +v 0.750000 2.085377 -2.126642 +v 0.750000 1.919111 -1.164623 +v 0.750000 1.810858 -1.102123 +v 0.750000 1.856611 -1.272877 +v 0.750000 1.748358 -1.210377 +v 0.750000 2.830889 -1.835376 +v 0.750000 2.939142 -1.897876 +v 0.750000 2.893389 -1.727123 +v 0.750000 3.001642 -1.789623 +v 0.875000 0.125000 2.500000 +v 1.125000 0.125000 2.500000 +v 0.875000 0.125000 -2.500000 +v 1.125000 0.125000 -2.500000 +v 0.875000 0.250000 -2.500000 +v 0.875000 0.250000 2.500000 +v 1.125000 0.250000 2.500000 +v 1.125000 0.250000 -2.500000 +v -0.125000 0.125000 2.500000 +v 0.125000 0.125000 2.500000 +v -0.125000 0.125000 -2.500000 +v 0.125000 0.125000 -2.500000 +v -0.125000 0.250000 -2.500000 +v -0.125000 0.250000 2.500000 +v 0.125000 0.250000 2.500000 +v 0.125000 0.250000 -2.500000 +v -1.125000 0.125000 2.500000 +v -0.875000 0.125000 2.500000 +v -1.125000 0.125000 -2.500000 +v -0.875000 0.125000 -2.500000 +v -1.125000 0.250000 -2.500000 +v -1.125000 0.250000 2.500000 +v -0.875000 0.250000 2.500000 +v -0.875000 0.250000 -2.500000 +v -2.125000 0.125000 2.500000 +v -1.875000 0.125000 2.500000 +v -2.125000 0.125000 -2.500000 +v -1.875000 0.125000 -2.500000 +v -2.125000 0.250000 -2.500000 +v -2.125000 0.250000 2.500000 +v -1.875000 0.250000 2.500000 +v -1.875000 0.250000 -2.500000 +v 2.500000 0.687500 -0.812500 +v 2.500000 0.312500 -0.812500 +v 2.500000 0.687500 -1.187500 +v 2.500000 0.312500 -1.187500 +v 2.375000 0.625000 -1.125000 +v 2.375000 0.625000 -0.875000 +v 2.375000 0.375000 -0.875000 +v 2.375000 0.375000 -1.125000 +v 2.375000 0.687500 -1.187500 +v 2.375000 0.687500 -0.812500 +v 2.375000 0.312500 -0.812500 +v 2.375000 0.312500 -1.187500 +v 2.250000 0.625000 -1.125000 +v 2.250000 0.625000 -0.875000 +v 2.250000 0.375000 -0.875000 +v 2.250000 0.375000 -1.125000 +v 2.500000 0.687500 -1.812500 +v 2.500000 0.312500 -1.812500 +v 2.500000 0.687500 -2.187500 +v 2.500000 0.312500 -2.187500 +v 2.375000 0.625000 -2.125000 +v 2.375000 0.625000 -1.875000 +v 2.375000 0.375000 -1.875000 +v 2.375000 0.375000 -2.125000 +v 2.375000 0.687500 -2.187500 +v 2.375000 0.687500 -1.812500 +v 2.375000 0.312500 -1.812500 +v 2.375000 0.312500 -2.187500 +v 2.250000 0.625000 -2.125000 +v 2.250000 0.625000 -1.875000 +v 2.250000 0.375000 -1.875000 +v 2.250000 0.375000 -2.125000 +v 2.500000 0.687500 2.187500 +v 2.500000 0.312500 2.187500 +v 2.500000 0.687500 1.812500 +v 2.500000 0.312500 1.812500 +v 2.375000 0.625000 1.875000 +v 2.375000 0.625000 2.125000 +v 2.375000 0.375000 2.125000 +v 2.375000 0.375000 1.875000 +v 2.375000 0.687500 1.812500 +v 2.375000 0.687500 2.187500 +v 2.375000 0.312500 2.187500 +v 2.375000 0.312500 1.812500 +v 2.250000 0.625000 1.875000 +v 2.250000 0.625000 2.125000 +v 2.250000 0.375000 2.125000 +v 2.250000 0.375000 1.875000 +v 2.500000 0.687500 1.187500 +v 2.500000 0.312500 1.187500 +v 2.500000 0.687500 0.812500 +v 2.500000 0.312500 0.812500 +v 2.375000 0.625000 0.875000 +v 2.375000 0.625000 1.125000 +v 2.375000 0.375000 1.125000 +v 2.375000 0.375000 0.875000 +v 2.375000 0.687500 0.812500 +v 2.375000 0.687500 1.187500 +v 2.375000 0.312500 1.187500 +v 2.375000 0.312500 0.812500 +v 2.250000 0.625000 0.875000 +v 2.250000 0.625000 1.125000 +v 2.250000 0.375000 1.125000 +v 2.250000 0.375000 0.875000 +v -2.500000 0.687500 -0.187500 +v -2.500000 0.312500 -0.187500 +v -2.500000 0.687500 0.187500 +v -2.500000 0.312500 0.187500 +v -2.375000 0.625000 0.125000 +v -2.375000 0.625000 -0.125000 +v -2.375000 0.375000 -0.125000 +v -2.375000 0.375000 0.125000 +v -2.375000 0.687500 0.187500 +v -2.375000 0.687500 -0.187500 +v -2.375000 0.312500 -0.187500 +v -2.375000 0.312500 0.187500 +v -2.250000 0.625000 0.125000 +v -2.250000 0.625000 -0.125000 +v -2.250000 0.375000 -0.125000 +v -2.250000 0.375000 0.125000 +v -2.500000 0.687500 0.812500 +v -2.500000 0.312500 0.812500 +v -2.500000 0.687500 1.187500 +v -2.500000 0.312500 1.187500 +v -2.375000 0.625000 1.125000 +v -2.375000 0.625000 0.875000 +v -2.375000 0.375000 0.875000 +v -2.375000 0.375000 1.125000 +v -2.375000 0.687500 1.187500 +v -2.375000 0.687500 0.812500 +v -2.375000 0.312500 0.812500 +v -2.375000 0.312500 1.187500 +v -2.250000 0.625000 1.125000 +v -2.250000 0.625000 0.875000 +v -2.250000 0.375000 0.875000 +v -2.250000 0.375000 1.125000 +v -2.500000 0.687500 1.812500 +v -2.500000 0.312500 1.812500 +v -2.500000 0.687500 2.187500 +v -2.500000 0.312500 2.187500 +v -2.375000 0.625000 2.125000 +v -2.375000 0.625000 1.875000 +v -2.375000 0.375000 1.875000 +v -2.375000 0.375000 2.125000 +v -2.375000 0.687500 2.187500 +v -2.375000 0.687500 1.812500 +v -2.375000 0.312500 1.812500 +v -2.375000 0.312500 2.187500 +v -2.250000 0.625000 2.125000 +v -2.250000 0.625000 1.875000 +v -2.250000 0.375000 1.875000 +v -2.250000 0.375000 2.125000 +v -2.500000 0.687500 -2.187500 +v -2.500000 0.312500 -2.187500 +v -2.500000 0.687500 -1.812500 +v -2.500000 0.312500 -1.812500 +v -2.375000 0.625000 -1.875000 +v -2.375000 0.625000 -2.125000 +v -2.375000 0.375000 -2.125000 +v -2.375000 0.375000 -1.875000 +v -2.375000 0.687500 -1.812500 +v -2.375000 0.687500 -2.187500 +v -2.375000 0.312500 -2.187500 +v -2.375000 0.312500 -1.812500 +v -2.250000 0.625000 -1.875000 +v -2.250000 0.625000 -2.125000 +v -2.250000 0.375000 -2.125000 +v -2.250000 0.375000 -1.875000 +v -2.500000 0.687500 -1.187500 +v -2.500000 0.312500 -1.187500 +v -2.500000 0.687500 -0.812500 +v -2.500000 0.312500 -0.812500 +v -2.375000 0.625000 -0.875000 +v -2.375000 0.625000 -1.125000 +v -2.375000 0.375000 -1.125000 +v -2.375000 0.375000 -0.875000 +v -2.375000 0.687500 -0.812500 +v -2.375000 0.687500 -1.187500 +v -2.375000 0.312500 -1.187500 +v -2.375000 0.312500 -0.812500 +v -2.250000 0.625000 -0.875000 +v -2.250000 0.625000 -1.125000 +v -2.250000 0.375000 -1.125000 +v -2.250000 0.375000 -0.875000 +v 0.187500 0.687500 -2.500000 +v 0.187500 0.312500 -2.500000 +v -0.187500 0.687500 -2.500000 +v -0.187500 0.312500 -2.500000 +v -0.125000 0.625000 -2.375000 +v 0.125000 0.625000 -2.375000 +v 0.125000 0.375000 -2.375000 +v -0.125000 0.375000 -2.375000 +v -0.187500 0.687500 -2.375000 +v 0.187500 0.687500 -2.375000 +v 0.187500 0.312500 -2.375000 +v -0.187500 0.312500 -2.375000 +v -0.125000 0.625000 -2.250000 +v 0.125000 0.625000 -2.250000 +v 0.125000 0.375000 -2.250000 +v -0.125000 0.375000 -2.250000 +v -0.812500 0.687500 -2.500000 +v -0.812500 0.312500 -2.500000 +v -1.187500 0.687500 -2.500000 +v -1.187500 0.312500 -2.500000 +v -1.125000 0.625000 -2.375000 +v -0.875000 0.625000 -2.375000 +v -0.875000 0.375000 -2.375000 +v -1.125000 0.375000 -2.375000 +v -1.187500 0.687500 -2.375000 +v -0.812500 0.687500 -2.375000 +v -0.812500 0.312500 -2.375000 +v -1.187500 0.312500 -2.375000 +v -1.125000 0.625000 -2.250000 +v -0.875000 0.625000 -2.250000 +v -0.875000 0.375000 -2.250000 +v -1.125000 0.375000 -2.250000 +v -1.812500 0.687500 -2.500000 +v -1.812500 0.312500 -2.500000 +v -2.187500 0.687500 -2.500000 +v -2.187500 0.312500 -2.500000 +v -2.125000 0.625000 -2.375000 +v -1.875000 0.625000 -2.375000 +v -1.875000 0.375000 -2.375000 +v -2.125000 0.375000 -2.375000 +v -2.187500 0.687500 -2.375000 +v -1.812500 0.687500 -2.375000 +v -1.812500 0.312500 -2.375000 +v -2.187500 0.312500 -2.375000 +v -2.125000 0.625000 -2.250000 +v -1.875000 0.625000 -2.250000 +v -1.875000 0.375000 -2.250000 +v -2.125000 0.375000 -2.250000 +v 2.187500 0.687500 -2.500000 +v 2.187500 0.312500 -2.500000 +v 1.812500 0.687500 -2.500000 +v 1.812500 0.312500 -2.500000 +v 1.875000 0.625000 -2.375000 +v 2.125000 0.625000 -2.375000 +v 2.125000 0.375000 -2.375000 +v 1.875000 0.375000 -2.375000 +v 1.812500 0.687500 -2.375000 +v 2.187500 0.687500 -2.375000 +v 2.187500 0.312500 -2.375000 +v 1.812500 0.312500 -2.375000 +v 1.875000 0.625000 -2.250000 +v 2.125000 0.625000 -2.250000 +v 2.125000 0.375000 -2.250000 +v 1.875000 0.375000 -2.250000 +v 1.187500 0.687500 -2.500000 +v 1.187500 0.312500 -2.500000 +v 0.812500 0.687500 -2.500000 +v 0.812500 0.312500 -2.500000 +v 0.875000 0.625000 -2.375000 +v 1.125000 0.625000 -2.375000 +v 1.125000 0.375000 -2.375000 +v 0.875000 0.375000 -2.375000 +v 0.812500 0.687500 -2.375000 +v 1.187500 0.687500 -2.375000 +v 1.187500 0.312500 -2.375000 +v 0.812500 0.312500 -2.375000 +v 0.875000 0.625000 -2.250000 +v 1.125000 0.625000 -2.250000 +v 1.125000 0.375000 -2.250000 +v 0.875000 0.375000 -2.250000 +v -0.187500 0.687500 2.500000 +v -0.187500 0.312500 2.500000 +v 0.187500 0.687500 2.500000 +v 0.187500 0.312500 2.500000 +v 0.125000 0.625000 2.375000 +v -0.125000 0.625000 2.375000 +v -0.125000 0.375000 2.375000 +v 0.125000 0.375000 2.375000 +v 0.187500 0.687500 2.375000 +v -0.187500 0.687500 2.375000 +v -0.187500 0.312500 2.375000 +v 0.187500 0.312500 2.375000 +v 0.125000 0.625000 2.250000 +v -0.125000 0.625000 2.250000 +v -0.125000 0.375000 2.250000 +v 0.125000 0.375000 2.250000 +v 0.812500 0.687500 2.500000 +v 0.812500 0.312500 2.500000 +v 1.187500 0.687500 2.500000 +v 1.187500 0.312500 2.500000 +v 1.125000 0.625000 2.375000 +v 0.875000 0.625000 2.375000 +v 0.875000 0.375000 2.375000 +v 1.125000 0.375000 2.375000 +v 1.187500 0.687500 2.375000 +v 0.812500 0.687500 2.375000 +v 0.812500 0.312500 2.375000 +v 1.187500 0.312500 2.375000 +v 1.125000 0.625000 2.250000 +v 0.875000 0.625000 2.250000 +v 0.875000 0.375000 2.250000 +v 1.125000 0.375000 2.250000 +v 1.812500 0.687500 2.500000 +v 1.812500 0.312500 2.500000 +v 2.187500 0.687500 2.500000 +v 2.187500 0.312500 2.500000 +v 2.125000 0.625000 2.375000 +v 1.875000 0.625000 2.375000 +v 1.875000 0.375000 2.375000 +v 2.125000 0.375000 2.375000 +v 2.187500 0.687500 2.375000 +v 1.812500 0.687500 2.375000 +v 1.812500 0.312500 2.375000 +v 2.187500 0.312500 2.375000 +v 2.125000 0.625000 2.250000 +v 1.875000 0.625000 2.250000 +v 1.875000 0.375000 2.250000 +v 2.125000 0.375000 2.250000 +v -2.187500 0.687500 2.500000 +v -2.187500 0.312500 2.500000 +v -1.812500 0.687500 2.500000 +v -1.812500 0.312500 2.500000 +v -1.875000 0.625000 2.375000 +v -2.125000 0.625000 2.375000 +v -2.125000 0.375000 2.375000 +v -1.875000 0.375000 2.375000 +v -1.812500 0.687500 2.375000 +v -2.187500 0.687500 2.375000 +v -2.187500 0.312500 2.375000 +v -1.812500 0.312500 2.375000 +v -1.875000 0.625000 2.250000 +v -2.125000 0.625000 2.250000 +v -2.125000 0.375000 2.250000 +v -1.875000 0.375000 2.250000 +v -1.187500 0.687500 2.500000 +v -1.187500 0.312500 2.500000 +v -0.812500 0.687500 2.500000 +v -0.812500 0.312500 2.500000 +v -0.875000 0.625000 2.375000 +v -1.125000 0.625000 2.375000 +v -1.125000 0.375000 2.375000 +v -0.875000 0.375000 2.375000 +v -0.812500 0.687500 2.375000 +v -1.187500 0.687500 2.375000 +v -1.187500 0.312500 2.375000 +v -0.812500 0.312500 2.375000 +v -0.875000 0.625000 2.250000 +v -1.125000 0.625000 2.250000 +v -1.125000 0.375000 2.250000 +v -0.875000 0.375000 2.250000 +v -0.250000 3.750000 1.500000 +v -0.338388 3.750000 1.536612 +v -0.375000 3.750000 1.625000 +v -0.338388 3.750000 1.713388 +v -0.250000 3.750000 1.750000 +v -0.161611 3.750000 1.713388 +v -0.125000 3.750000 1.625000 +v -0.161611 3.750000 1.536612 +v -0.250000 4.000000 1.500000 +v -0.338388 4.000000 1.536612 +v -0.375000 4.000000 1.625000 +v -0.338388 4.000000 1.713388 +v -0.250000 4.000000 1.750000 +v -0.161611 4.000000 1.713388 +v -0.125000 4.000000 1.625000 +v -0.161611 4.000000 1.536612 +v -0.213388 4.088388 1.500000 +v -0.275888 4.150888 1.536612 +v -0.301776 4.176777 1.625000 +v -0.275888 4.150888 1.713388 +v -0.213388 4.088388 1.750000 +v -0.150888 4.025888 1.713388 +v -0.150888 4.025888 1.536612 +v -0.125000 4.125000 1.500000 +v -0.125000 4.213388 1.536612 +v -0.125000 4.250000 1.625000 +v -0.125000 4.213388 1.713388 +v -0.125000 4.125000 1.750000 +v -0.125000 4.036612 1.713388 +v -0.125000 4.036612 1.536612 +v 1.250000 1.750000 1.750000 +v 1.338388 1.750000 1.713388 +v 1.375000 1.750000 1.625000 +v 1.338388 1.750000 1.536612 +v 1.250000 1.750000 1.500000 +v 1.161612 1.750000 1.536612 +v 1.125000 1.750000 1.625000 +v 1.161612 1.750000 1.713388 +v 1.250000 4.000000 1.750000 +v 1.338388 4.000000 1.713388 +v 1.375000 4.000000 1.625000 +v 1.338388 4.000000 1.536612 +v 1.250000 4.000000 1.500000 +v 1.161612 4.000000 1.536612 +v 1.125000 4.000000 1.625000 +v 1.161612 4.000000 1.713388 +v 1.213388 4.088388 1.750000 +v 1.275888 4.150888 1.713388 +v 1.301777 4.176777 1.625000 +v 1.275888 4.150888 1.536612 +v 1.213388 4.088388 1.500000 +v 1.150888 4.025888 1.536612 +v 1.150888 4.025888 1.713388 +v 1.125000 4.125000 1.750000 +v 1.125000 4.213388 1.713388 +v 1.125000 4.250000 1.625000 +v 1.125000 4.213388 1.536612 +v 1.125000 4.125000 1.500000 +v 1.125000 4.036612 1.536612 +v 1.125000 4.036612 1.713388 +v -1.750000 3.750000 1.500000 +v -1.838388 3.750000 1.536612 +v -1.875000 3.750000 1.625000 +v -1.838388 3.750000 1.713388 +v -1.750000 3.750000 1.750000 +v -1.661611 3.750000 1.713388 +v -1.625000 3.750000 1.625000 +v -1.661611 3.750000 1.536612 +v -1.750000 4.250000 1.500000 +v -1.838388 4.250000 1.536612 +v -1.875000 4.250000 1.625000 +v -1.838388 4.250000 1.713388 +v -1.750000 4.250000 1.750000 +v -1.661611 4.250000 1.713388 +v -1.625000 4.250000 1.625000 +v -1.661611 4.250000 1.536612 +v -1.713388 4.338388 1.500000 +v -1.775888 4.400888 1.536612 +v -1.801777 4.426777 1.625000 +v -1.775888 4.400888 1.713388 +v -1.713388 4.338388 1.750000 +v -1.650888 4.275888 1.713388 +v -1.650888 4.275888 1.536612 +v -1.625000 4.375000 1.500000 +v -1.625000 4.463388 1.536612 +v -1.625000 4.500000 1.625000 +v -1.625000 4.463388 1.713388 +v -1.625000 4.375000 1.750000 +v -1.625000 4.286612 1.713388 +v -1.625000 4.286612 1.536612 +v 1.750000 1.750000 1.750000 +v 1.838388 1.750000 1.713388 +v 1.875000 1.750000 1.625000 +v 1.838388 1.750000 1.536612 +v 1.750000 1.750000 1.500000 +v 1.661612 1.750000 1.536612 +v 1.625000 1.750000 1.625000 +v 1.661612 1.750000 1.713388 +v 1.750000 4.250000 1.750000 +v 1.838388 4.250000 1.713388 +v 1.875000 4.250000 1.625000 +v 1.838388 4.250000 1.536612 +v 1.750000 4.250000 1.500000 +v 1.661612 4.250000 1.536612 +v 1.625000 4.250000 1.625000 +v 1.661612 4.250000 1.713388 +v 1.713388 4.338388 1.750000 +v 1.775888 4.400888 1.713388 +v 1.801777 4.426777 1.625000 +v 1.775888 4.400888 1.536612 +v 1.713388 4.338388 1.500000 +v 1.650888 4.275888 1.536612 +v 1.650888 4.275888 1.713388 +v 1.625000 4.375000 1.750000 +v 1.625000 4.463388 1.713388 +v 1.625000 4.500000 1.625000 +v 1.625000 4.463388 1.536612 +v 1.625000 4.375000 1.500000 +v 1.625000 4.286612 1.536612 +v 1.625000 4.286612 1.713388 +v -0.250000 3.750000 0.250000 +v -0.338388 3.750000 0.286612 +v -0.375000 3.750000 0.375000 +v -0.338388 3.750000 0.463388 +v -0.250000 3.750000 0.500000 +v -0.161611 3.750000 0.463388 +v -0.125000 3.750000 0.375000 +v -0.161611 3.750000 0.286612 +v -0.250000 4.000000 0.250000 +v -0.338388 4.000000 0.286612 +v -0.375000 4.000000 0.375000 +v -0.338388 4.000000 0.463388 +v -0.250000 4.000000 0.500000 +v -0.161611 4.000000 0.463388 +v -0.125000 4.000000 0.375000 +v -0.161611 4.000000 0.286612 +v -0.213388 4.088388 0.250000 +v -0.275888 4.150888 0.286612 +v -0.301776 4.176777 0.375000 +v -0.275888 4.150888 0.463388 +v -0.213388 4.088388 0.500000 +v -0.150888 4.025888 0.463388 +v -0.150888 4.025888 0.286612 +v -0.125000 4.125000 0.250000 +v -0.125000 4.213388 0.286612 +v -0.125000 4.250000 0.375000 +v -0.125000 4.213388 0.463388 +v -0.125000 4.125000 0.500000 +v -0.125000 4.036612 0.463388 +v -0.125000 4.036612 0.286612 +v 1.250000 1.750000 0.500000 +v 1.338388 1.750000 0.463388 +v 1.375000 1.750000 0.375000 +v 1.338388 1.750000 0.286612 +v 1.250000 1.750000 0.250000 +v 1.161612 1.750000 0.286612 +v 1.125000 1.750000 0.375000 +v 1.161612 1.750000 0.463388 +v 1.250000 4.000000 0.500000 +v 1.338388 4.000000 0.463388 +v 1.375000 4.000000 0.375000 +v 1.338388 4.000000 0.286612 +v 1.250000 4.000000 0.250000 +v 1.161612 4.000000 0.286612 +v 1.125000 4.000000 0.375000 +v 1.161612 4.000000 0.463388 +v 1.213388 4.088388 0.500000 +v 1.275888 4.150888 0.463388 +v 1.301777 4.176777 0.375000 +v 1.275888 4.150888 0.286612 +v 1.213388 4.088388 0.250000 +v 1.150888 4.025888 0.286612 +v 1.150888 4.025888 0.463388 +v 1.125000 4.125000 0.500000 +v 1.125000 4.213388 0.463388 +v 1.125000 4.250000 0.375000 +v 1.125000 4.213388 0.286612 +v 1.125000 4.125000 0.250000 +v 1.125000 4.036612 0.286612 +v 1.125000 4.036612 0.463388 +v -1.750000 3.750000 0.250000 +v -1.838388 3.750000 0.286612 +v -1.875000 3.750000 0.375000 +v -1.838388 3.750000 0.463388 +v -1.750000 3.750000 0.500000 +v -1.661611 3.750000 0.463388 +v -1.625000 3.750000 0.375000 +v -1.661611 3.750000 0.286612 +v -1.750000 4.250000 0.250000 +v -1.838388 4.250000 0.286612 +v -1.875000 4.250000 0.375000 +v -1.838388 4.250000 0.463388 +v -1.750000 4.250000 0.500000 +v -1.661611 4.250000 0.463388 +v -1.625000 4.250000 0.375000 +v -1.661611 4.250000 0.286612 +v -1.713388 4.338388 0.250000 +v -1.775888 4.400888 0.286612 +v -1.801777 4.426777 0.375000 +v -1.775888 4.400888 0.463388 +v -1.713388 4.338388 0.500000 +v -1.650888 4.275888 0.463388 +v -1.650888 4.275888 0.286612 +v -1.625000 4.375000 0.250000 +v -1.625000 4.463388 0.286612 +v -1.625000 4.500000 0.375000 +v -1.625000 4.463388 0.463388 +v -1.625000 4.375000 0.500000 +v -1.625000 4.286612 0.463388 +v -1.625000 4.286612 0.286612 +v 1.750000 1.750000 0.500000 +v 1.838388 1.750000 0.463388 +v 1.875000 1.750000 0.375000 +v 1.838388 1.750000 0.286612 +v 1.750000 1.750000 0.250000 +v 1.661612 1.750000 0.286612 +v 1.625000 1.750000 0.375000 +v 1.661612 1.750000 0.463388 +v 1.750000 4.250000 0.500000 +v 1.838388 4.250000 0.463388 +v 1.875000 4.250000 0.375000 +v 1.838388 4.250000 0.286612 +v 1.750000 4.250000 0.250000 +v 1.661612 4.250000 0.286612 +v 1.625000 4.250000 0.375000 +v 1.661612 4.250000 0.463388 +v 1.713388 4.338388 0.500000 +v 1.775888 4.400888 0.463388 +v 1.801777 4.426777 0.375000 +v 1.775888 4.400888 0.286612 +v 1.713388 4.338388 0.250000 +v 1.650888 4.275888 0.286612 +v 1.650888 4.275888 0.463388 +v 1.625000 4.375000 0.500000 +v 1.625000 4.463388 0.463388 +v 1.625000 4.500000 0.375000 +v 1.625000 4.463388 0.286612 +v 1.625000 4.375000 0.250000 +v 1.625000 4.286612 0.286612 +v 1.625000 4.286612 0.463388 +v 1.125000 2.750000 0.500000 +v 1.875000 2.750000 0.500000 +v 1.125000 2.750000 0.000000 +v 1.875000 2.750000 0.000000 +v 1.125000 3.250000 0.000000 +v 1.125000 3.250000 0.500000 +v 1.875000 3.250000 0.500000 +v 1.875000 3.250000 0.000000 +v -0.250000 3.750000 0.000000 +v -0.338388 3.750000 0.036612 +v -0.375000 3.750000 0.125000 +v -0.338388 3.750000 0.213388 +v -0.250000 3.750000 0.250000 +v -0.161611 3.750000 0.213388 +v -0.125000 3.750000 0.125000 +v -0.161611 3.750000 0.036612 +v -0.250000 4.000000 0.000000 +v -0.338388 4.000000 0.036612 +v -0.375000 4.000000 0.125000 +v -0.338388 4.000000 0.213388 +v -0.250000 4.000000 0.250000 +v -0.161611 4.000000 0.213388 +v -0.125000 4.000000 0.125000 +v -0.161611 4.000000 0.036612 +v -0.213388 4.088388 0.000000 +v -0.275888 4.150888 0.036612 +v -0.301776 4.176777 0.125000 +v -0.275888 4.150888 0.213388 +v -0.213388 4.088388 0.250000 +v -0.150888 4.025888 0.213388 +v -0.150888 4.025888 0.036612 +v -0.125000 4.125000 0.000000 +v -0.125000 4.213388 0.036612 +v -0.125000 4.250000 0.125000 +v -0.125000 4.213388 0.213388 +v -0.125000 4.125000 0.250000 +v -0.125000 4.036612 0.213388 +v -0.125000 4.036612 0.036612 +v 1.250000 1.750000 0.250000 +v 1.338388 1.750000 0.213388 +v 1.375000 1.750000 0.125000 +v 1.338388 1.750000 0.036612 +v 1.250000 1.750000 0.000000 +v 1.161612 1.750000 0.036612 +v 1.125000 1.750000 0.125000 +v 1.161612 1.750000 0.213388 +v 1.250000 4.000000 0.250000 +v 1.338388 4.000000 0.213388 +v 1.375000 4.000000 0.125000 +v 1.338388 4.000000 0.036612 +v 1.250000 4.000000 0.000000 +v 1.161612 4.000000 0.036612 +v 1.125000 4.000000 0.125000 +v 1.161612 4.000000 0.213388 +v 1.213388 4.088388 0.250000 +v 1.275888 4.150888 0.213388 +v 1.301777 4.176777 0.125000 +v 1.275888 4.150888 0.036612 +v 1.213388 4.088388 0.000000 +v 1.150888 4.025888 0.036612 +v 1.150888 4.025888 0.213388 +v 1.125000 4.125000 0.250000 +v 1.125000 4.213388 0.213388 +v 1.125000 4.250000 0.125000 +v 1.125000 4.213388 0.036612 +v 1.125000 4.125000 0.000000 +v 1.125000 4.036612 0.036612 +v 1.125000 4.036612 0.213388 +v -1.750000 3.750000 0.000000 +v -1.838388 3.750000 0.036612 +v -1.875000 3.750000 0.125000 +v -1.838388 3.750000 0.213388 +v -1.750000 3.750000 0.250000 +v -1.661611 3.750000 0.213388 +v -1.625000 3.750000 0.125000 +v -1.661611 3.750000 0.036612 +v -1.750000 4.250000 0.000000 +v -1.838388 4.250000 0.036612 +v -1.875000 4.250000 0.125000 +v -1.838388 4.250000 0.213388 +v -1.750000 4.250000 0.250000 +v -1.661611 4.250000 0.213388 +v -1.625000 4.250000 0.125000 +v -1.661611 4.250000 0.036612 +v -1.713388 4.338388 0.000000 +v -1.775888 4.400888 0.036612 +v -1.801777 4.426777 0.125000 +v -1.775888 4.400888 0.213388 +v -1.713388 4.338388 0.250000 +v -1.650888 4.275888 0.213388 +v -1.650888 4.275888 0.036612 +v -1.625000 4.375000 0.000000 +v -1.625000 4.463388 0.036612 +v -1.625000 4.500000 0.125000 +v -1.625000 4.463388 0.213388 +v -1.625000 4.375000 0.250000 +v -1.625000 4.286612 0.213388 +v -1.625000 4.286612 0.036612 +v 1.750000 1.750000 0.250000 +v 1.838388 1.750000 0.213388 +v 1.875000 1.750000 0.125000 +v 1.838388 1.750000 0.036612 +v 1.750000 1.750000 0.000000 +v 1.661612 1.750000 0.036612 +v 1.625000 1.750000 0.125000 +v 1.661612 1.750000 0.213388 +v 1.750000 4.250000 0.250000 +v 1.838388 4.250000 0.213388 +v 1.875000 4.250000 0.125000 +v 1.838388 4.250000 0.036612 +v 1.750000 4.250000 0.000000 +v 1.661612 4.250000 0.036612 +v 1.625000 4.250000 0.125000 +v 1.661612 4.250000 0.213388 +v 1.713388 4.338388 0.250000 +v 1.775888 4.400888 0.213388 +v 1.801777 4.426777 0.125000 +v 1.775888 4.400888 0.036612 +v 1.713388 4.338388 0.000000 +v 1.650888 4.275888 0.036612 +v 1.650888 4.275888 0.213388 +v 1.625000 4.375000 0.250000 +v 1.625000 4.463388 0.213388 +v 1.625000 4.500000 0.125000 +v 1.625000 4.463388 0.036612 +v 1.625000 4.375000 0.000000 +v 1.625000 4.286612 0.036612 +v 1.625000 4.286612 0.213388 +v 1.875000 2.125000 0.000000 +v 1.875000 2.213388 0.036612 +v 1.875000 2.250000 0.125000 +v 1.875000 2.213388 0.213388 +v 1.875000 2.125000 0.250000 +v 1.875000 2.036612 0.213388 +v 1.875000 2.000000 0.125000 +v 1.875000 2.036612 0.036612 +v 1.937500 2.213388 0.036612 +v 1.937500 2.125000 0.000000 +v 1.937500 2.250000 0.125000 +v 1.937500 2.213388 0.213388 +v 1.937500 2.125000 0.250000 +v 1.937500 2.036612 0.213388 +v 1.937500 2.000000 0.125000 +v 1.937500 2.036612 0.036612 +v 1.875000 2.375000 1.500000 +v 1.875000 2.463388 1.536612 +v 1.875000 2.500000 1.625000 +v 1.875000 2.463388 1.713388 +v 1.875000 2.375000 1.750000 +v 1.875000 2.286612 1.713388 +v 1.875000 2.250000 1.625000 +v 1.875000 2.286612 1.536612 +v 1.937500 2.463388 1.536612 +v 1.937500 2.375000 1.500000 +v 1.937500 2.500000 1.625000 +v 1.937500 2.463388 1.713388 +v 1.937500 2.375000 1.750000 +v 1.937500 2.286612 1.713388 +v 1.937500 2.250000 1.625000 +v 1.937500 2.286612 1.536612 +v 1.125000 2.750000 2.000000 +v 1.875000 2.750000 2.000000 +v 1.125000 2.750000 1.500000 +v 1.875000 2.750000 1.500000 +v 1.125000 3.250000 1.500000 +v 1.125000 3.250000 2.000000 +v 1.875000 3.250000 2.000000 +v 1.875000 3.250000 1.500000 +v 1.125000 2.750000 0.500000 +v 1.875000 2.750000 0.500000 +v 1.125000 2.750000 0.000000 +v 1.875000 2.750000 0.000000 +v 1.125000 3.250000 0.000000 +v 1.125000 3.250000 0.500000 +v 1.875000 3.250000 0.500000 +v 1.875000 3.250000 0.000000 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.309524 0.314607 +vt 0.190476 0.539326 +vt 0.190476 0.314607 +vt 0.190476 0.044944 +vt 0.309524 0.269663 +vt 0.190476 0.269663 +vt 0.309524 0.000000 +vt 0.190476 0.000000 +vt 0.333333 0.269663 +vt 0.309524 0.044944 +vt 0.333333 0.044944 +vt 0.166667 0.044944 +vt 0.166667 0.269663 +vt 0.023810 0.179775 +vt 0.142857 0.224719 +vt 0.023810 0.224719 +vt 0.142857 -0.000000 +vt 0.023810 0.044944 +vt 0.023810 -0.000000 +vt -0.000000 0.179775 +vt 0.142857 0.044944 +vt 0.142857 0.179775 +vt 0.166667 0.044944 +vt 0.166667 0.179775 +vt 0.023810 0.359551 +vt 0.333333 0.044944 +vt 0.357143 0.449438 +vt 0.333333 0.449438 +vt 0.428571 0.449438 +vt 0.452381 0.044944 +vt 0.452381 0.449438 +vt 0.238095 0.955056 +vt 0.190476 0.943820 +vt 0.238095 0.943820 +vt 0.428571 0.494382 +vt 0.357143 0.494382 +vt 0.523810 0.449438 +vt 0.523810 0.044944 +vt 0.357143 0.000000 +vt 0.428571 0.044944 +vt 0.357143 0.044944 +vt 0.773862 0.606741 +vt 0.791693 0.548444 +vt 0.827355 0.548444 +vt 0.791693 0.683275 +vt 0.827355 0.683275 +vt 0.845186 0.741573 +vt 0.845291 0.606741 +vt 0.863122 0.548444 +vt 0.898783 0.548444 +vt 0.863122 0.683275 +vt 0.898783 0.683275 +vt 0.916614 0.741573 +vt 0.702434 0.606741 +vt 0.720264 0.548444 +vt 0.755926 0.548444 +vt 0.720265 0.799871 +vt 0.720264 0.683275 +vt 0.773757 0.741573 +vt 0.916719 0.606741 +vt 0.934550 0.548444 +vt 0.970212 0.548444 +vt 0.934550 0.799871 +vt 0.934550 0.683275 +vt 0.988043 0.741573 +vt 0.535714 0.719101 +vt 0.654762 0.629214 +vt 0.654762 0.719101 +vt 0.702381 0.719101 +vt 0.702381 0.629214 +vt 0.535714 0.808989 +vt 0.654762 0.808989 +vt 0.488095 0.629214 +vt 0.488095 0.719101 +vt 0.654762 0.539326 +vt 0.535714 0.629214 +vt 0.535714 0.539326 +vt 0.151786 0.971910 +vt 0.122024 0.983146 +vt 0.122024 0.971910 +vt 0.226190 0.955056 +vt 0.190476 0.966292 +vt 0.190476 0.955056 +vt 0.261905 0.955056 +vt 0.226190 0.966292 +vt 0.154762 0.955056 +vt 0.119048 0.966292 +vt 0.119048 0.955056 +vt 0.154762 0.966292 +vt 0.193452 0.971910 +vt 0.223214 0.971910 +vt 0.229167 0.971910 +vt 0.261905 0.966292 +vt 0.258929 0.971910 +vt 0.157738 0.971910 +vt 0.187500 0.971910 +vt 0.157738 0.983146 +vt 0.193452 0.983146 +vt 0.229167 0.983146 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.410715 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.095238 0.955056 +vt 0.059524 1.000000 +vt 0.059524 0.955056 +vt 0.035714 0.955056 +vt 0.000000 1.000000 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.119048 0.955056 +vt 0.095238 1.000000 +vt 0.261905 0.932584 +vt 0.291667 0.926966 +vt 0.291667 0.932584 +vt 0.261905 0.926966 +vt 0.291667 0.921348 +vt 0.291667 0.926966 +vt 0.261905 0.921348 +vt 0.291667 0.915730 +vt 0.291667 0.921348 +vt 0.261905 0.915730 +vt 0.291667 0.910112 +vt 0.291667 0.915730 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.190476 0.955056 +vt 0.000000 0.943820 +vt 0.190476 0.943820 +vt 0.238095 0.955056 +vt 0.238095 0.943820 +vt 0.000000 0.955056 +vt 0.000000 0.943820 +vt 0.107143 0.786517 +vt 0.035714 0.382022 +vt 0.107143 0.382022 +vt 0.035714 0.853933 +vt 0.107143 0.786517 +vt 0.107143 0.853933 +vt 0.000000 0.382022 +vt 0.035714 0.786517 +vt -0.000000 0.786517 +vt 0.035714 0.853933 +vt 0.107143 0.786517 +vt 0.107143 0.853933 +vt 0.000000 0.382022 +vt 0.035714 0.786517 +vt 0.000000 0.786517 +vt 0.107143 0.382022 +vt 0.035714 0.382022 +vt 0.226190 0.679775 +vt 0.238095 0.707865 +vt 0.226190 0.702247 +vt 0.238095 0.640449 +vt 0.226190 0.668539 +vt 0.226190 0.646067 +vt 0.226190 0.612360 +vt 0.226190 0.634831 +vt 0.226190 0.578652 +vt 0.238095 0.606742 +vt 0.226190 0.601124 +vt 0.226190 0.544944 +vt 0.238095 0.573034 +vt 0.226190 0.567416 +vt 0.226190 0.915730 +vt 0.238095 0.943820 +vt 0.226190 0.938202 +vt 0.226190 0.882023 +vt 0.238095 0.910112 +vt 0.226190 0.904494 +vt 0.238095 0.842697 +vt 0.226190 0.870786 +vt 0.226190 0.848315 +vt 0.226190 0.814607 +vt 0.226190 0.837079 +vt 0.238095 0.775281 +vt 0.226190 0.803371 +vt 0.226190 0.780899 +vt 0.238095 0.741573 +vt 0.226190 0.769663 +vt 0.226190 0.747191 +vt 0.226190 0.735955 +vt 0.226190 0.713483 +vt 0.261905 0.679775 +vt 0.250000 0.707865 +vt 0.250000 0.674157 +vt 0.261905 0.713483 +vt 0.250000 0.741573 +vt 0.261905 0.747191 +vt 0.250000 0.775281 +vt 0.261905 0.803371 +vt 0.250000 0.808989 +vt 0.261905 0.814607 +vt 0.250000 0.842697 +vt 0.261905 0.870786 +vt 0.250000 0.876405 +vt 0.261905 0.882023 +vt 0.250000 0.910112 +vt 0.261905 0.915730 +vt 0.250000 0.943820 +vt 0.261905 0.544944 +vt 0.250000 0.573034 +vt 0.250000 0.539326 +vt 0.261905 0.578652 +vt 0.250000 0.606742 +vt 0.261905 0.612360 +vt 0.250000 0.640449 +vt 0.261905 0.668539 +vt 0.333333 0.679775 +vt 0.345238 0.707865 +vt 0.333333 0.702247 +vt 0.345238 0.640449 +vt 0.333333 0.668539 +vt 0.333333 0.646067 +vt 0.333333 0.612360 +vt 0.333333 0.634831 +vt 0.333333 0.578652 +vt 0.345238 0.606742 +vt 0.333333 0.601124 +vt 0.333333 0.544944 +vt 0.345238 0.573034 +vt 0.333333 0.567416 +vt 0.333333 0.915730 +vt 0.345238 0.943820 +vt 0.333333 0.938202 +vt 0.333333 0.882023 +vt 0.345238 0.910112 +vt 0.333333 0.904494 +vt 0.345238 0.842697 +vt 0.333333 0.870786 +vt 0.333333 0.848315 +vt 0.333333 0.814607 +vt 0.333333 0.837079 +vt 0.345238 0.775281 +vt 0.333333 0.803371 +vt 0.333333 0.780899 +vt 0.345238 0.741573 +vt 0.333333 0.769663 +vt 0.333333 0.747191 +vt 0.333333 0.735955 +vt 0.333333 0.713483 +vt 0.369048 0.679775 +vt 0.357143 0.707865 +vt 0.357143 0.674157 +vt 0.369048 0.713483 +vt 0.357143 0.741573 +vt 0.369048 0.747191 +vt 0.357143 0.775281 +vt 0.369048 0.803371 +vt 0.357143 0.808989 +vt 0.369048 0.814607 +vt 0.357143 0.842697 +vt 0.369048 0.870786 +vt 0.357143 0.876405 +vt 0.369048 0.882023 +vt 0.357143 0.910112 +vt 0.369048 0.915730 +vt 0.357143 0.943820 +vt 0.369048 0.544944 +vt 0.357143 0.573034 +vt 0.357143 0.539326 +vt 0.369048 0.578652 +vt 0.357143 0.606742 +vt 0.369048 0.612360 +vt 0.357143 0.640449 +vt 0.369048 0.668539 +vt 0.154774 0.623152 +vt 0.154774 0.545387 +vt 0.190452 0.584270 +vt 0.178559 0.635275 +vt 0.190452 0.674157 +vt 0.154774 0.713040 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.511905 0.460674 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.511905 0.471910 +vt 0.511905 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.511905 0.471910 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.494382 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.175595 0.365169 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.175595 0.365169 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.172619 0.382022 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.095238 0.955056 +vt 0.059524 1.000000 +vt 0.059524 0.955056 +vt 0.035714 0.955056 +vt 0.000000 1.000000 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.119048 0.955056 +vt 0.095238 1.000000 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.410715 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.416660 0.960674 +vt 0.059524 1.000000 +vt 0.095238 0.955056 +vt 0.059524 0.955056 +vt 0.000000 1.000000 +vt 0.035714 0.955056 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.095238 1.000000 +vt 0.119048 0.955056 +vt 0.059524 1.000000 +vt 0.095238 0.955056 +vt 0.059524 0.955056 +vt 0.000000 1.000000 +vt 0.035714 0.955056 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.095238 1.000000 +vt 0.119048 0.955056 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.309524 0.539326 +vt -0.000000 0.044944 +vt 0.142857 0.359551 +vt 0.190476 0.955056 +vt 0.428571 0.000000 +vt 0.840408 0.573083 +vt 0.827355 0.665039 +vt 0.845186 0.606742 +vt 0.840408 0.640400 +vt 0.809524 0.674058 +vt 0.791693 0.665039 +vt 0.778640 0.640400 +vt 0.778640 0.573083 +vt 0.809524 0.539425 +vt 0.840408 0.775231 +vt 0.827355 0.799871 +vt 0.809524 0.808889 +vt 0.791693 0.799871 +vt 0.778640 0.775231 +vt 0.773862 0.741573 +vt 0.778640 0.707915 +vt 0.809524 0.674256 +vt 0.840408 0.707915 +vt 0.911837 0.573083 +vt 0.898783 0.665039 +vt 0.916614 0.606742 +vt 0.911837 0.640400 +vt 0.880953 0.674058 +vt 0.863122 0.665039 +vt 0.850069 0.640400 +vt 0.850069 0.573083 +vt 0.880953 0.539425 +vt 0.911836 0.775231 +vt 0.898783 0.799871 +vt 0.880953 0.808889 +vt 0.863122 0.799871 +vt 0.850069 0.775231 +vt 0.845291 0.741573 +vt 0.850069 0.707915 +vt 0.880953 0.674256 +vt 0.911836 0.707915 +vt 0.768979 0.573083 +vt 0.755926 0.665039 +vt 0.773757 0.606742 +vt 0.768979 0.640400 +vt 0.738095 0.674058 +vt 0.720265 0.665039 +vt 0.707211 0.640400 +vt 0.707211 0.573083 +vt 0.738096 0.539425 +vt 0.768979 0.775231 +vt 0.755926 0.799871 +vt 0.738095 0.808889 +vt 0.707211 0.775231 +vt 0.702434 0.741573 +vt 0.707211 0.707915 +vt 0.738095 0.674256 +vt 0.755926 0.683275 +vt 0.768979 0.707915 +vt 0.983265 0.573083 +vt 0.970212 0.665039 +vt 0.988043 0.606742 +vt 0.983265 0.640400 +vt 0.952381 0.674058 +vt 0.934550 0.665039 +vt 0.921497 0.640400 +vt 0.921497 0.573083 +vt 0.952381 0.539425 +vt 0.983265 0.775231 +vt 0.970212 0.799871 +vt 0.952381 0.808889 +vt 0.921497 0.775231 +vt 0.916719 0.741573 +vt 0.921497 0.707915 +vt 0.952381 0.674256 +vt 0.970212 0.683275 +vt 0.983265 0.707915 +vt 0.151786 0.983146 +vt 0.187500 0.983146 +vt 0.223214 0.983146 +vt 0.258929 0.983146 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.416660 0.960674 +vt 0.414919 0.968610 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.119048 1.000000 +vt 0.261905 0.926966 +vt 0.261905 0.921348 +vt 0.261905 0.915730 +vt 0.261905 0.910112 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.000000 0.955056 +vt 0.035714 0.786517 +vt 0.035714 0.382022 +vt 0.238095 0.674157 +vt 0.238095 0.539326 +vt 0.238095 0.876405 +vt 0.238095 0.808989 +vt 0.261905 0.702247 +vt 0.261905 0.735955 +vt 0.261905 0.769663 +vt 0.261905 0.780899 +vt 0.261905 0.837079 +vt 0.261905 0.848315 +vt 0.261905 0.904494 +vt 0.261905 0.938202 +vt 0.261905 0.567416 +vt 0.261905 0.601124 +vt 0.261905 0.634831 +vt 0.261905 0.646067 +vt 0.345238 0.674157 +vt 0.345238 0.539326 +vt 0.345238 0.876405 +vt 0.345238 0.808989 +vt 0.369048 0.702247 +vt 0.369048 0.735955 +vt 0.369048 0.769663 +vt 0.369048 0.780899 +vt 0.369048 0.837079 +vt 0.369048 0.848315 +vt 0.369048 0.904494 +vt 0.369048 0.938202 +vt 0.369048 0.567416 +vt 0.369048 0.601124 +vt 0.369048 0.634831 +vt 0.369048 0.646067 +vt 0.187265 0.606718 +vt 0.178559 0.623152 +vt 0.166667 0.629167 +vt 0.146068 0.606719 +vt 0.142882 0.584270 +vt 0.146068 0.561821 +vt 0.166667 0.539372 +vt 0.178559 0.545387 +vt 0.187265 0.561821 +vt 0.146068 0.696606 +vt 0.142882 0.674157 +vt 0.146068 0.651709 +vt 0.154774 0.635275 +vt 0.166667 0.629260 +vt 0.187265 0.651709 +vt 0.187265 0.696606 +vt 0.178559 0.713040 +vt 0.166667 0.719055 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.119048 1.000000 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.416660 0.960674 +vt 0.414919 0.968610 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.414919 0.968610 +vt 0.410715 0.971897 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.119048 1.000000 +vt 0.119048 1.000000 +vt 0.577381 0.269663 +vt 0.559524 0.539326 +vt 0.559524 0.269663 +vt 0.702381 0.269663 +vt 0.684524 0.539326 +vt 0.684524 0.269663 +vt 0.738095 0.269663 +vt 0.720238 0.539326 +vt 0.720238 0.269663 +vt 0.648810 0.269663 +vt 0.630952 0.539326 +vt 0.630952 0.269663 +vt 0.595238 0.269663 +vt 0.577381 0.539326 +vt 0.702381 0.539326 +vt 0.755952 0.269663 +vt 0.738095 0.539326 +vt 0.666667 0.269663 +vt 0.648810 0.539326 +vt 0.613095 0.269663 +vt 0.595238 0.539326 +vt 0.773810 0.269663 +vt 0.755952 0.539326 +vt 0.666667 0.539326 +vt 0.613095 0.539326 +vt 0.773810 0.269663 +vt 0.791667 0.539326 +vt 0.773810 0.539326 +vt 0.916667 0.269663 +vt 0.898810 0.539326 +vt 0.898810 0.269663 +vt 0.952381 0.269663 +vt 0.934524 0.539326 +vt 0.934524 0.269663 +vt 0.863095 0.269663 +vt 0.845238 0.539326 +vt 0.845238 0.269663 +vt 0.791667 0.269663 +vt 0.809524 0.539326 +vt 0.916667 0.539326 +vt 0.970238 0.269663 +vt 0.952381 0.539326 +vt 0.880952 0.269663 +vt 0.863095 0.539326 +vt 0.827381 0.269663 +vt 0.809524 0.269663 +vt 0.988095 0.269663 +vt 0.970238 0.539326 +vt 0.880952 0.539326 +vt 0.827381 0.539326 +vt 0.577381 0.000000 +vt 0.559524 0.269663 +vt 0.559524 0.000000 +vt 0.702381 0.000000 +vt 0.684524 0.269663 +vt 0.684524 0.000000 +vt 0.738095 0.000000 +vt 0.720238 0.269663 +vt 0.720238 0.000000 +vt 0.648810 0.000000 +vt 0.630952 0.269663 +vt 0.630952 0.000000 +vt 0.595238 0.000000 +vt 0.577381 0.269663 +vt 0.702381 0.269663 +vt 0.755952 0.000000 +vt 0.738095 0.269663 +vt 0.666667 0.000000 +vt 0.648810 0.269663 +vt 0.613095 0.000000 +vt 0.595238 0.269663 +vt 0.773810 0.000000 +vt 0.755952 0.269663 +vt 0.666667 0.269663 +vt 0.613095 0.269663 +vt 0.791667 0.000000 +vt 0.773810 0.269663 +vt 0.773810 0.000000 +vt 0.916667 0.000000 +vt 0.898810 0.269663 +vt 0.898810 0.000000 +vt 0.952381 0.000000 +vt 0.934524 0.269663 +vt 0.934524 0.000000 +vt 0.863095 0.000000 +vt 0.845238 0.269663 +vt 0.845238 0.000000 +vt 0.809524 0.000000 +vt 0.791667 0.269663 +vt 0.916667 0.269663 +vt 0.970238 0.269663 +vt 0.952381 0.269663 +vt 0.880952 0.000000 +vt 0.863095 0.269663 +vt 0.827381 0.000000 +vt 0.809524 0.269663 +vt 0.988095 0.000000 +vt 0.970238 0.000000 +vt 0.880952 0.269663 +vt 0.827381 0.269663 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.800595 0.831461 +vt 0.806548 0.842697 +vt 0.803571 0.820225 +vt 0.806548 0.831461 +vt 0.806548 0.853933 +vt 0.806548 0.820225 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.883929 0.876405 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.842697 +vt 0.886905 0.887640 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.479167 0.876405 +vt 0.485119 0.865169 +vt 0.485119 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.853933 +vt 0.479167 0.831461 +vt 0.485119 0.820225 +vt 0.491071 0.831461 +vt 0.494048 0.853933 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.494048 0.842697 +vt 0.494048 0.865169 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.663690 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.657738 0.887640 +vt 0.657738 0.876405 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.898876 +vt 0.648810 0.887640 +vt 0.648810 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.887640 +vt 0.494048 0.876405 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.214286 0.741573 +vt 0.202381 0.707865 +vt 0.214286 0.707865 +vt 0.214286 0.573034 +vt 0.202381 0.539326 +vt 0.214286 0.539326 +vt 0.214286 0.876405 +vt 0.202381 0.842697 +vt 0.214286 0.842697 +vt 0.214286 0.775281 +vt 0.202381 0.741573 +vt 0.214286 0.606742 +vt 0.202381 0.573034 +vt 0.214286 0.674157 +vt 0.202381 0.640449 +vt 0.214286 0.640449 +vt 0.214286 0.910112 +vt 0.202381 0.876405 +vt 0.214286 0.808989 +vt 0.202381 0.775281 +vt 0.202381 0.606742 +vt 0.202381 0.674157 +vt 0.214286 0.943820 +vt 0.202381 0.910112 +vt 0.202381 0.808989 +vt 0.392857 0.640449 +vt 0.380952 0.674157 +vt 0.380952 0.640449 +vt 0.392857 0.876405 +vt 0.380952 0.910112 +vt 0.380952 0.876405 +vt 0.392857 0.775281 +vt 0.380952 0.808989 +vt 0.380952 0.775281 +vt 0.392857 0.606742 +vt 0.380952 0.606742 +vt 0.392857 0.674157 +vt 0.380952 0.707865 +vt 0.392857 0.910112 +vt 0.380952 0.943820 +vt 0.392857 0.808989 +vt 0.380952 0.842697 +vt 0.392857 0.707865 +vt 0.380952 0.741573 +vt 0.392857 0.539326 +vt 0.380952 0.573034 +vt 0.380952 0.539326 +vt 0.392857 0.842697 +vt 0.392857 0.741573 +vt 0.392857 0.573034 +vt 0.190476 0.668539 +vt 0.190476 0.646067 +vt 0.190476 0.679775 +vt 0.190476 0.713483 +vt 0.190476 0.769663 +vt 0.190476 0.747191 +vt 0.190476 0.780899 +vt 0.190476 0.814607 +vt 0.190476 0.870786 +vt 0.190476 0.848315 +vt 0.190476 0.882023 +vt 0.202381 0.943820 +vt 0.190476 0.915730 +vt 0.190476 0.544944 +vt 0.190476 0.578652 +vt 0.190476 0.612360 +vt 0.333333 0.629214 +vt 0.261905 0.651685 +vt 0.261905 0.629214 +vt 0.333333 0.651685 +vt 0.261905 0.674157 +vt 0.333333 0.674157 +vt 0.261905 0.696629 +vt 0.333333 0.696629 +vt 0.261905 0.719101 +vt 0.333333 0.719101 +vt 0.261905 0.741573 +vt 0.333333 0.741573 +vt 0.261905 0.764045 +vt 0.333333 0.764045 +vt 0.261905 0.786517 +vt 0.333333 0.786517 +vt 0.261905 0.808989 +vt 0.333333 0.539326 +vt 0.261905 0.561798 +vt 0.261905 0.539326 +vt 0.333333 0.561798 +vt 0.261905 0.584270 +vt 0.333333 0.584270 +vt 0.261905 0.606742 +vt 0.333333 0.606742 +vt 0.404762 0.702247 +vt 0.404762 0.713483 +vt 0.404762 0.769663 +vt 0.404762 0.780899 +vt 0.404762 0.814607 +vt 0.404762 0.870786 +vt 0.404762 0.882023 +vt 0.404762 0.915730 +vt 0.392857 0.943820 +vt 0.404762 0.544944 +vt 0.404762 0.578652 +vt 0.404762 0.612360 +vt 0.404762 0.668539 +vt 0.767857 0.977528 +vt 0.779762 0.988764 +vt 0.767857 0.988764 +vt 0.767857 0.910112 +vt 0.779762 0.921348 +vt 0.767857 0.921348 +vt 0.767857 0.932584 +vt 0.779762 0.943820 +vt 0.767857 0.943820 +vt 0.767857 0.955056 +vt 0.779762 0.966292 +vt 0.767857 0.966292 +vt 0.779762 0.977528 +vt 0.767857 0.898876 +vt 0.779762 0.910112 +vt 0.779762 0.932584 +vt 0.779762 0.955056 +vt 0.788690 0.966292 +vt 0.782738 0.966292 +vt 0.788690 0.977528 +vt 0.785714 0.977528 +vt 0.788690 0.921348 +vt 0.788690 0.932584 +vt 0.788690 0.955056 +vt 0.782738 0.921348 +vt 0.788690 0.910112 +vt 0.788690 0.943820 +vt 0.794643 0.921348 +vt 0.797619 0.932584 +vt 0.797619 0.943820 +vt 0.797619 0.955056 +vt 0.794643 0.966292 +vt 0.791667 0.977528 +vt 0.785714 0.910112 +vt 0.788690 0.898876 +vt 0.791667 0.910112 +vt 0.788690 0.988764 +vt 0.940476 0.910112 +vt 0.869048 0.898876 +vt 0.940476 0.898876 +vt 0.940476 0.977528 +vt 0.869048 0.966292 +vt 0.940476 0.966292 +vt 0.940476 0.955056 +vt 0.869048 0.943820 +vt 0.940476 0.943820 +vt 0.940476 0.932584 +vt 0.869048 0.921348 +vt 0.940476 0.921348 +vt 0.869048 0.910112 +vt 0.940476 0.988764 +vt 0.869048 0.977528 +vt 0.869048 0.955056 +vt 0.869048 0.932584 +vt 0.866071 0.921348 +vt 0.860119 0.932584 +vt 0.860119 0.921348 +vt 0.860119 0.910112 +vt 0.863095 0.910112 +vt 0.866071 0.966292 +vt 0.860119 0.955056 +vt 0.860119 0.977528 +vt 0.860119 0.966292 +vt 0.860119 0.943820 +vt 0.854167 0.966292 +vt 0.851190 0.955056 +vt 0.851190 0.943820 +vt 0.851190 0.932584 +vt 0.854167 0.921348 +vt 0.857143 0.910112 +vt 0.863095 0.977528 +vt 0.860119 0.988764 +vt 0.857143 0.977528 +vt 0.860119 0.898876 +vt 0.851190 0.921348 +vt 0.797619 0.921348 +vt 0.851190 0.910112 +vt 0.797619 0.910112 +vt 0.851190 0.898876 +vt 0.797619 0.898876 +vt 0.797619 0.977528 +vt 0.851190 0.988764 +vt 0.797619 0.988764 +vt 0.851190 0.966292 +vt 0.797619 0.966292 +vt 0.452381 0.977528 +vt 0.476190 0.988764 +vt 0.452381 0.988764 +vt 0.452381 0.910112 +vt 0.476190 0.921348 +vt 0.452381 0.921348 +vt 0.452381 0.932584 +vt 0.476190 0.943820 +vt 0.452381 0.943820 +vt 0.452381 0.955056 +vt 0.476190 0.966292 +vt 0.452381 0.966292 +vt 0.476190 0.977528 +vt 0.452381 0.898876 +vt 0.476190 0.910112 +vt 0.476190 0.932584 +vt 0.476190 0.955056 +vt 0.485119 0.966292 +vt 0.479167 0.966292 +vt 0.485119 0.977528 +vt 0.482143 0.977528 +vt 0.479167 0.921348 +vt 0.485119 0.932584 +vt 0.485119 0.955056 +vt 0.485119 0.910112 +vt 0.485119 0.921348 +vt 0.485119 0.943820 +vt 0.491071 0.921348 +vt 0.494048 0.943820 +vt 0.494048 0.955056 +vt 0.491071 0.966292 +vt 0.488095 0.977528 +vt 0.494048 0.932584 +vt 0.482143 0.910112 +vt 0.485119 0.898876 +vt 0.488095 0.910112 +vt 0.485119 0.988764 +vt 0.744048 0.910112 +vt 0.660714 0.898876 +vt 0.744048 0.898876 +vt 0.744048 0.977528 +vt 0.660714 0.966292 +vt 0.744048 0.966292 +vt 0.744048 0.955056 +vt 0.660714 0.943820 +vt 0.744048 0.943820 +vt 0.744048 0.932584 +vt 0.660714 0.921348 +vt 0.744048 0.921348 +vt 0.660714 0.910112 +vt 0.744048 0.988764 +vt 0.660714 0.977528 +vt 0.660714 0.955056 +vt 0.660714 0.932584 +vt 0.651786 0.921348 +vt 0.657738 0.921348 +vt 0.651786 0.910112 +vt 0.654762 0.910112 +vt 0.657738 0.966292 +vt 0.651786 0.955056 +vt 0.651786 0.932584 +vt 0.651786 0.977528 +vt 0.651786 0.966292 +vt 0.651786 0.943820 +vt 0.645833 0.966292 +vt 0.642857 0.943820 +vt 0.642857 0.932584 +vt 0.645833 0.921348 +vt 0.648810 0.910112 +vt 0.642857 0.955056 +vt 0.654762 0.977528 +vt 0.651786 0.988764 +vt 0.648810 0.977528 +vt 0.651786 0.898876 +vt 0.642857 0.921348 +vt 0.494048 0.921348 +vt 0.642857 0.910112 +vt 0.494048 0.910112 +vt 0.642857 0.898876 +vt 0.494048 0.898876 +vt 0.494048 0.977528 +vt 0.642857 0.988764 +vt 0.494048 0.988764 +vt 0.642857 0.966292 +vt 0.494048 0.966292 +vt 0.943452 0.898876 +vt 0.949405 0.910112 +vt 0.946429 0.910112 +vt 0.747024 0.898876 +vt 0.752976 0.910112 +vt 0.750000 0.910112 +vt 0.949405 0.966292 +vt 0.752976 0.955056 +vt 0.752976 0.966292 +vt 0.949405 0.977528 +vt 0.752976 0.977528 +vt 0.943452 0.943820 +vt 0.949405 0.932584 +vt 0.949405 0.943820 +vt 0.750000 0.932584 +vt 0.752976 0.943820 +vt 0.747024 0.943820 +vt 0.949405 0.988764 +vt 0.943452 0.988764 +vt 0.752976 0.988764 +vt 0.747024 0.988764 +vt 0.949405 0.955056 +vt 0.949405 0.898876 +vt 0.952381 0.910112 +vt 0.958333 0.966292 +vt 0.761905 0.977528 +vt 0.755952 0.932584 +vt 0.758929 0.943820 +vt 0.958333 0.977528 +vt 0.758929 0.988764 +vt 0.952381 0.932584 +vt 0.955357 0.943820 +vt 0.761905 0.955056 +vt 0.955357 0.988764 +vt 0.752976 0.898876 +vt 0.755952 0.910112 +vt 0.958333 0.955056 +vt 0.761905 0.966292 +vt 0.752976 0.921348 +vt 0.752976 0.932584 +vt 0.949405 0.921348 +vt 0.946429 0.932584 +vt 0.767857 0.966292 +vt 0.958333 0.943820 +vt 0.964286 0.955056 +vt 0.958333 0.921348 +vt 0.964286 0.932584 +vt 0.958333 0.932584 +vt 0.767857 0.977528 +vt 0.964286 0.966292 +vt 0.761905 0.988764 +vt 0.767857 0.988764 +vt 0.964286 0.977528 +vt 0.964286 0.910112 +vt 0.964286 0.921348 +vt 0.761905 0.898876 +vt 0.767857 0.910112 +vt 0.761905 0.910112 +vt 0.958333 0.988764 +vt 0.964286 0.988764 +vt 0.761905 0.921348 +vt 0.767857 0.932584 +vt 0.761905 0.932584 +vt 0.958333 0.898876 +vt 0.958333 0.910112 +vt 0.761905 0.943820 +vt 0.767857 0.943820 +vt 0.767857 0.921348 +vt 0.767857 0.955056 +vt 0.964286 0.943820 +vt 0.297619 0.870786 +vt 0.303571 0.882023 +vt 0.297619 0.882023 +vt 0.297619 0.870786 +vt 0.303571 0.882023 +vt 0.297619 0.882023 +vt 0.285714 0.865169 +vt 0.279762 0.882023 +vt 0.279762 0.865169 +vt 0.285714 0.865169 +vt 0.279762 0.882023 +vt 0.279762 0.865169 +vt 0.291667 0.865169 +vt 0.285714 0.882023 +vt 0.291667 0.865169 +vt 0.285714 0.882023 +vt 0.273810 0.870786 +vt 0.267857 0.882023 +vt 0.267857 0.876405 +vt 0.273810 0.870786 +vt 0.267857 0.882023 +vt 0.267857 0.876405 +vt 0.273810 0.882023 +vt 0.273810 0.882023 +vt 0.291667 0.882023 +vt 0.291667 0.882023 +vt 0.273810 0.893258 +vt 0.267857 0.887640 +vt 0.285714 0.898876 +vt 0.279762 0.898876 +vt 0.297619 0.893258 +vt 0.279762 0.898876 +vt 0.273810 0.893258 +vt 0.297619 0.893258 +vt 0.291667 0.898876 +vt 0.267857 0.887640 +vt 0.291667 0.898876 +vt 0.285714 0.898876 +vt 0.309524 0.882023 +vt 0.303571 0.876405 +vt 0.303571 0.887640 +vt 0.261905 0.882023 +vt 0.309524 0.882023 +vt 0.303571 0.876405 +vt 0.303571 0.887640 +vt 0.261905 0.882023 +vt 0.285714 0.910112 +vt 0.297619 0.898876 +vt 0.291667 0.910112 +vt 0.309524 0.898876 +vt 0.303571 0.910112 +vt 0.303571 0.898876 +vt 0.279762 0.910112 +vt 0.285714 0.910112 +vt 0.273810 0.910112 +vt 0.273810 0.898876 +vt 0.279762 0.910112 +vt 0.267857 0.898876 +vt 0.261905 0.910112 +vt 0.261905 0.898876 +vt 0.267857 0.910112 +vt 0.267857 0.898876 +vt 0.273810 0.910112 +vt 0.273810 0.898876 +vt 0.309524 0.898876 +vt 0.303571 0.910112 +vt 0.303571 0.898876 +vt 0.267857 0.910112 +vt 0.297619 0.910112 +vt 0.297619 0.898876 +vt 0.261905 0.910112 +vt 0.261905 0.898876 +vt 0.291667 0.910112 +vt 0.297619 0.910112 +vt 0.297619 0.808989 +vt 0.297619 0.865169 +vt 0.297619 0.865169 +vt 0.303571 0.808989 +vt 0.303571 0.865169 +vt 0.303571 0.808989 +vt 0.303571 0.865169 +vt 0.309524 0.808989 +vt 0.309524 0.865169 +vt 0.261905 0.865169 +vt 0.267857 0.808989 +vt 0.267857 0.865169 +vt 0.309524 0.808989 +vt 0.309524 0.865169 +vt 0.261905 0.865169 +vt 0.267857 0.808989 +vt 0.267857 0.865169 +vt 0.273810 0.808989 +vt 0.273810 0.865169 +vt 0.273810 0.808989 +vt 0.273810 0.865169 +vt 0.279762 0.808989 +vt 0.279762 0.808989 +vt 0.285714 0.808989 +vt 0.285714 0.808989 +vt 0.291667 0.808989 +vt 0.291667 0.808989 +vt 0.297619 0.808989 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.803571 0.820225 +vt 0.800595 0.831461 +vt 0.806548 0.853933 +vt 0.806548 0.820225 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.883929 0.876405 +vt 0.883929 0.865169 +vt 0.886905 0.887640 +vt 0.889881 0.876405 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.877976 0.876405 +vt 0.875000 0.853933 +vt 0.875000 0.842697 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.865169 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.479167 0.876405 +vt 0.485119 0.865169 +vt 0.485119 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.482143 0.820225 +vt 0.479167 0.831461 +vt 0.485119 0.853933 +vt 0.485119 0.820225 +vt 0.491071 0.831461 +vt 0.494048 0.842697 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.657738 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.663690 0.876405 +vt 0.657738 0.887640 +vt 0.651786 0.876405 +vt 0.648810 0.865169 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.800595 0.831461 +vt 0.806548 0.820225 +vt 0.806548 0.853933 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.803571 0.820225 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.886905 0.887640 +vt 0.883929 0.876405 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.842697 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.485119 0.876405 +vt 0.479167 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.479167 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.865169 +vt 0.485119 0.820225 +vt 0.485119 0.831461 +vt 0.485119 0.853933 +vt 0.491071 0.831461 +vt 0.494048 0.842697 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.660714 0.820225 +vt 0.657738 0.820225 +vt 0.663690 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.887640 +vt 0.657738 0.876405 +vt 0.657738 0.853933 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.800595 0.831461 +vt 0.806548 0.820225 +vt 0.806548 0.853933 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.803571 0.820225 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.883929 0.876405 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.875000 0.842697 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.886905 0.887640 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.485119 0.876405 +vt 0.479167 0.876405 +vt 0.482143 0.887640 +vt 0.485119 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.865169 +vt 0.479167 0.831461 +vt 0.485119 0.820225 +vt 0.485119 0.853933 +vt 0.491071 0.831461 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.494048 0.842697 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.657738 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.663690 0.876405 +vt 0.657738 0.887640 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.773810 0.539326 +vt 0.988095 0.539326 +vt 0.773810 0.269663 +vt 0.988095 0.269663 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.404762 0.943820 +vt 0.190476 0.702247 +vt 0.190476 0.735955 +vt 0.190476 0.803371 +vt 0.190476 0.837079 +vt 0.190476 0.904494 +vt 0.190476 0.938202 +vt 0.190476 0.567416 +vt 0.190476 0.601124 +vt 0.190476 0.634831 +vt 0.333333 0.808989 +vt 0.404762 0.679775 +vt 0.404762 0.735955 +vt 0.404762 0.747191 +vt 0.404762 0.803371 +vt 0.404762 0.837079 +vt 0.404762 0.848315 +vt 0.404762 0.904494 +vt 0.404762 0.938202 +vt 0.404762 0.567416 +vt 0.404762 0.601124 +vt 0.404762 0.634831 +vt 0.404762 0.646067 +vt 0.779762 0.898876 +vt 0.869048 0.988764 +vt 0.851190 0.977528 +vt 0.476190 0.898876 +vt 0.660714 0.988764 +vt 0.642857 0.977528 +vt 0.955357 0.898876 +vt 0.758929 0.898876 +vt 0.767857 0.898876 +vt 0.964286 0.898876 +vt 0.309524 0.910112 +vt 0.309524 0.910112 +vt 0.261905 0.808989 +vt 0.261905 0.808989 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.404762 0.943820 +vt 0.404762 0.943820 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 0.8660 0.5000 +vn 0.0000 -0.8660 -0.5000 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 0.5000 0.8660 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 -0.8660 0.5000 +vn -0.8660 0.0000 0.5000 +vn 0.5000 -0.0000 -0.8660 +vn 0.8660 -0.0000 -0.5000 +vn -0.5000 0.0000 -0.8660 +vn 0.8660 0.0000 0.5000 +vn 0.5000 0.0000 0.8660 +vn -0.5000 0.0000 0.8660 +vn -0.8660 0.0000 -0.5000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 -0.7071 -0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.0473 0.0196 0.9987 +vn -0.7071 0.0000 0.7071 +vn -0.9824 0.1866 -0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.0473 0.0196 -0.9987 +vn 0.6737 -0.1363 -0.7263 +vn 0.6737 -0.1363 0.7263 +vn -0.7194 0.1448 0.6794 +vn -0.7194 0.1448 -0.6794 +vn -0.5294 0.5294 -0.6630 +vn -0.0671 0.0671 -0.9955 +vn 0.4617 -0.4617 -0.7574 +vn -0.5294 0.5294 0.6630 +vn -0.0671 0.0671 0.9955 +vn -0.7071 0.7071 -0.0000 +vn 0.4617 -0.4617 0.7574 +vn -0.0196 0.0473 0.9987 +vn -0.1448 0.7194 0.6794 +vn -0.1866 0.9824 -0.0000 +vn -0.1448 0.7194 -0.6794 +vn -0.0196 0.0473 -0.9987 +vn 0.1363 -0.6737 -0.7263 +vn 0.1363 -0.6737 0.7263 +vn -0.7071 -0.7071 -0.0000 +vn 0.0473 0.0196 -0.9987 +vn 0.9824 0.1866 0.0000 +vn 0.0473 0.0196 0.9987 +vn -0.6737 -0.1363 0.7263 +vn -0.6737 -0.1363 -0.7263 +vn 0.7194 0.1448 -0.6794 +vn 0.7194 0.1448 0.6794 +vn 0.5294 0.5294 0.6630 +vn 0.0671 0.0671 0.9955 +vn -0.4617 -0.4617 0.7574 +vn 0.5294 0.5293 -0.6630 +vn 0.7071 0.7071 -0.0000 +vn -0.4617 -0.4617 -0.7574 +vn 0.0671 0.0671 -0.9955 +vn 0.0196 0.0473 -0.9987 +vn 0.1448 0.7194 -0.6794 +vn 0.1866 0.9824 0.0000 +vn 0.0196 0.0473 0.9987 +vn -0.1363 -0.6737 0.7263 +vn 0.1448 0.7194 0.6794 +vn -0.1363 -0.6737 -0.7263 +vn 0.5294 0.5294 -0.6630 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.3536 -0.6124 +vn -0.7071 0.6124 -0.3536 +vn -0.7071 0.6124 0.3536 +vn -0.7071 0.3536 0.6124 +vn -0.7071 -0.3536 0.6124 +vn -0.7071 -0.6124 0.3536 +vn -0.7071 -0.6124 -0.3536 +vn -0.7071 -0.3536 -0.6124 +vn 0.7071 0.3536 -0.6124 +vn 0.7071 0.6124 -0.3536 +vn 0.7071 0.6124 0.3536 +vn 0.7071 0.3536 0.6124 +vn 0.7071 -0.3536 0.6124 +vn 0.7071 -0.6124 0.3536 +vn 0.7071 -0.6124 -0.3536 +vn 0.7071 -0.3536 -0.6124 +vn 0.9987 0.0196 0.0473 +vn -0.0000 0.1866 0.9824 +vn -0.9987 0.0196 0.0473 +vn -0.7263 -0.1363 -0.6737 +vn 0.7263 -0.1363 -0.6737 +vn 0.6794 0.1448 0.7194 +vn -0.6794 0.1448 0.7194 +vn -0.9955 0.0671 0.0671 +vn -0.7574 -0.4617 -0.4617 +vn 0.9955 0.0671 0.0671 +vn 0.6630 0.5294 0.5294 +vn -0.6630 0.5293 0.5294 +vn 0.7574 -0.4617 -0.4617 +vn 0.9987 0.0473 0.0196 +vn 0.6794 0.7194 0.1448 +vn -0.0000 0.9824 0.1866 +vn -0.6794 0.7194 0.1448 +vn -0.9987 0.0473 0.0196 +vn -0.7263 -0.6737 -0.1363 +vn 0.7263 -0.6737 -0.1363 +vn 0.6737 0.1363 0.7263 +vn -0.0473 -0.0196 0.9987 +vn -0.7194 -0.1448 0.6794 +vn -0.9987 0.0196 -0.0473 +vn -0.9824 -0.1866 0.0000 +vn -0.7194 -0.1448 -0.6794 +vn 0.0000 0.1866 -0.9824 +vn -0.0473 -0.0196 -0.9987 +vn 0.6737 0.1363 -0.7263 +vn 0.9987 0.0196 -0.0473 +vn 0.7263 -0.1363 0.6737 +vn -0.7263 -0.1363 0.6737 +vn -0.6794 0.1448 -0.7194 +vn 0.6794 0.1448 -0.7194 +vn 0.6630 0.5293 -0.5294 +vn 0.9955 0.0671 -0.0671 +vn 0.7574 -0.4617 0.4617 +vn -0.6630 0.5294 -0.5294 +vn -0.7574 -0.4617 0.4617 +vn -0.9955 0.0671 -0.0671 +vn -0.9987 0.0473 -0.0196 +vn -0.6794 0.7194 -0.1448 +vn 0.0000 0.9824 -0.1866 +vn 0.6794 0.7194 -0.1448 +vn 0.9987 0.0473 -0.0196 +vn 0.7263 -0.6737 0.1363 +vn -0.7263 -0.6737 0.1363 +vn -0.6630 0.5294 0.5294 +vn 0.6630 0.5294 -0.5294 +vn 0.4617 0.4617 0.7574 +vn -0.5294 -0.5294 -0.6630 +vn -0.5294 -0.5294 0.6630 +vn 0.4617 0.4617 -0.7574 +vn -0.0671 -0.0671 -0.9955 +vn -0.0671 -0.0671 0.9955 +vn 0.1363 0.6737 0.7263 +vn -0.1866 -0.9824 0.0000 +vn -0.1448 -0.7194 0.6794 +vn 0.1363 0.6737 -0.7263 +vn -0.0196 -0.0473 -0.9987 +vn -0.0196 -0.0473 0.9987 +vn -0.1448 -0.7194 -0.6794 +vn 0.5293 0.5293 -0.6630 +s off +f 171/243/31 170/244/31 169/245/31 +f 174/246/32 175/247/32 173/248/32 +f 172/249/33 174/246/33 170/244/33 +f 170/244/34 173/248/34 169/245/34 +f 169/250/35 175/251/35 171/252/35 +f 171/252/36 176/253/36 172/249/36 +f 179/254/31 178/255/31 177/256/31 +f 182/257/32 183/258/32 181/259/32 +f 180/260/33 182/257/33 178/255/33 +f 178/255/34 181/259/34 177/256/34 +f 177/261/35 183/262/35 179/263/35 +f 179/263/36 184/264/36 180/260/36 +f 187/265/31 186/266/31 185/267/31 +f 190/268/32 191/269/32 189/270/32 +f 188/271/33 190/268/33 186/266/33 +f 186/266/34 189/270/34 185/267/34 +f 185/272/35 191/273/35 187/274/35 +f 187/274/36 192/275/36 188/271/36 +f 195/276/31 194/277/31 193/278/31 +f 198/279/32 199/280/32 197/281/32 +f 196/282/33 198/279/33 194/277/33 +f 194/277/34 197/281/34 193/278/34 +f 193/283/35 199/284/35 195/285/35 +f 195/285/36 200/286/36 196/282/36 +f 203/287/31 202/288/31 201/289/31 +f 207/290/36 204/291/36 203/287/36 +f 206/292/34 201/289/34 202/288/34 +f 208/293/32 205/294/32 206/292/32 +f 211/295/31 210/296/31 209/297/31 +f 215/298/34 212/299/34 211/295/34 +f 214/300/36 209/297/36 210/296/36 +f 216/301/32 213/302/32 214/300/32 +f 219/303/31 218/304/31 217/305/31 +f 223/306/35 220/307/35 219/303/35 +f 222/308/33 217/305/33 218/304/33 +f 224/309/32 221/310/32 222/308/32 +f 227/311/31 226/312/31 225/313/31 +f 231/314/33 228/315/33 227/311/33 +f 230/316/35 225/313/35 226/312/35 +f 232/317/32 229/318/32 230/316/32 +f 235/319/31 234/320/31 233/321/31 +f 239/322/32 237/323/32 238/324/32 +f 233/325/36 237/323/36 235/326/36 +f 235/327/33 240/328/33 236/329/33 +f 234/330/35 238/324/35 233/331/35 +f 236/332/34 239/322/34 234/320/34 +f 243/333/31 242/334/31 241/335/31 +f 247/336/32 245/337/32 246/338/32 +f 244/339/34 247/336/34 242/340/34 +f 241/335/36 245/337/36 243/333/36 +f 243/341/33 248/342/33 244/343/33 +f 242/344/35 246/338/35 241/345/35 +f 251/346/36 250/347/36 249/348/36 +f 254/349/34 255/350/34 253/351/34 +f 249/352/35 255/350/35 251/346/35 +f 251/346/32 256/353/32 252/354/32 +f 252/354/33 254/355/33 250/356/33 +f 250/347/31 253/357/31 249/348/31 +f 259/358/35 561/359/35 257/360/35 +f 563/361/33 263/362/33 262/363/33 +f 565/364/36 261/365/36 258/366/36 +f 561/359/36 262/367/36 257/368/36 +f 257/369/31 263/362/31 259/370/31 +f 259/371/34 564/372/34 562/373/34 +f 271/374/31 269/375/31 267/376/31 +f 285/377/32 287/378/32 278/379/32 +f 295/380/31 293/381/31 291/382/31 +f 309/383/32 311/384/32 302/385/32 +f 319/386/31 317/387/31 315/388/31 +f 329/389/32 333/390/32 326/391/32 +f 343/392/31 341/393/31 339/394/31 +f 353/395/32 357/396/32 350/397/32 +f 365/398/32 368/399/32 366/400/32 +f 362/401/33 368/399/33 364/402/33 +f 361/403/36 366/400/36 362/404/36 +f 363/405/35 365/398/35 361/406/35 +f 364/407/34 367/408/34 363/409/34 +f 374/410/32 381/411/32 373/412/32 +f 371/413/32 380/414/32 372/415/32 +f 369/416/36 379/417/36 371/413/36 +f 370/418/31 377/419/31 369/420/31 +f 372/415/34 378/421/34 370/418/34 +f 373/412/35 378/421/35 374/410/35 +f 376/422/35 379/417/35 375/423/35 +f 375/424/35 377/425/35 373/426/35 +f 374/427/35 380/414/35 376/428/35 +f 376/428/36 382/429/36 374/427/36 +f 375/423/31 384/430/31 376/422/31 +f 373/426/34 383/431/34 375/424/34 +f 511/432/36 509/433/36 507/434/36 +f 515/435/34 517/436/34 519/437/34 +f 523/438/33 528/439/33 524/440/33 +f 522/441/35 526/442/35 521/443/35 +f 524/440/34 527/444/34 522/441/34 +f 521/445/36 525/446/36 523/438/36 +f 529/447/35 532/448/35 530/449/35 +f 533/450/35 536/451/35 534/452/35 +f 537/453/35 540/454/35 538/455/35 +f 541/456/35 544/457/35 542/458/35 +f 546/459/34 547/460/34 545/461/34 +f 551/462/31 560/463/31 552/464/31 +f 548/465/33 553/466/33 547/460/33 +f 545/461/35 555/467/35 546/459/35 +f 546/459/31 556/468/31 548/465/31 +f 547/460/32 554/469/32 545/461/32 +f 550/470/36 553/471/36 549/472/36 +f 551/473/36 554/474/36 550/475/36 +f 552/464/36 555/476/36 551/462/36 +f 549/477/36 556/478/36 552/479/36 +f 549/472/32 558/480/32 550/470/32 +f 552/479/33 557/481/33 549/477/33 +f 550/475/35 559/482/35 551/473/35 +f 566/483/35 258/484/35 260/485/35 +f 568/486/34 260/485/34 264/487/34 +f 261/365/33 568/488/33 264/489/33 +f 564/372/32 561/359/32 562/373/32 +f 569/490/31 572/491/31 570/492/31 +f 572/493/34 574/494/34 570/495/34 +f 570/496/35 573/497/35 569/498/35 +f 569/499/36 575/500/36 571/501/36 +f 571/502/33 576/503/33 572/504/33 +f 576/505/32 573/497/32 574/506/32 +f 626/507/34 651/508/34 627/509/34 +f 649/510/34 626/511/34 625/512/34 +f 636/513/34 649/510/34 625/514/34 +f 635/515/34 660/516/34 636/517/34 +f 634/518/34 659/519/34 635/520/34 +f 633/521/34 658/522/34 634/523/34 +f 632/524/34 657/525/34 633/526/34 +f 655/527/34 632/528/34 631/529/34 +f 630/530/34 655/527/34 631/531/34 +f 653/532/34 630/533/34 629/534/34 +f 652/535/34 629/536/34 628/537/34 +f 651/508/34 628/538/34 627/539/34 +f 674/540/36 663/541/36 662/542/36 +f 675/543/36 664/544/36 663/541/36 +f 676/545/36 665/546/36 664/544/36 +f 665/546/36 678/547/36 666/548/36 +f 678/549/36 667/550/36 666/548/36 +f 667/550/36 680/551/36 668/552/36 +f 680/553/36 669/554/36 668/552/36 +f 681/555/36 670/556/36 669/554/36 +f 682/557/36 671/558/36 670/559/36 +f 683/560/36 672/561/36 671/558/36 +f 684/562/36 661/563/36 672/561/36 +f 661/563/36 674/564/36 662/542/36 +f 686/565/34 699/566/34 687/567/34 +f 697/568/34 686/569/34 685/570/34 +f 696/571/34 697/568/34 685/572/34 +f 695/573/34 708/574/34 696/575/34 +f 694/576/34 707/577/34 695/578/34 +f 693/579/34 706/580/34 694/581/34 +f 692/582/34 705/583/34 693/584/34 +f 703/585/34 692/586/34 691/587/34 +f 690/588/34 703/585/34 691/589/34 +f 701/590/34 690/591/34 689/592/34 +f 700/593/34 689/594/34 688/595/34 +f 699/566/34 688/596/34 687/597/34 +f 722/598/36 711/599/36 710/600/36 +f 723/601/36 712/602/36 711/599/36 +f 724/603/36 713/604/36 712/602/36 +f 713/604/36 726/605/36 714/606/36 +f 726/607/36 715/608/36 714/606/36 +f 715/608/36 728/609/36 716/610/36 +f 728/611/36 717/612/36 716/610/36 +f 729/613/36 718/614/36 717/612/36 +f 730/615/36 719/616/36 718/617/36 +f 731/618/36 720/619/36 719/616/36 +f 732/620/36 709/621/36 720/619/36 +f 709/621/36 722/622/36 710/600/36 +f 641/623/34 645/624/34 637/625/34 +f 741/626/36 739/627/36 735/628/36 +f 746/629/34 752/630/34 748/631/34 +f 747/632/36 749/633/36 745/634/36 +f 748/631/33 751/635/33 747/632/33 +f 745/636/35 750/637/35 746/629/35 +f 754/638/34 760/639/34 756/640/34 +f 755/641/36 757/642/36 753/643/36 +f 756/640/33 759/644/33 755/641/33 +f 753/645/35 758/646/35 754/638/35 +f 762/647/34 768/648/34 764/649/34 +f 763/650/36 765/651/36 761/652/36 +f 764/649/33 767/653/33 763/650/33 +f 761/654/35 766/655/35 762/647/35 +f 770/656/34 776/657/34 772/658/34 +f 771/659/36 773/660/36 769/661/36 +f 772/658/33 775/662/33 771/659/33 +f 769/663/35 774/664/35 770/656/35 +f 946/665/33 941/666/33 942/667/33 +f 948/668/32 942/667/32 944/669/32 +f 945/670/31 943/671/31 941/666/31 +f 947/672/35 944/669/35 943/673/35 +f 954/674/35 949/675/35 950/676/35 +f 956/677/31 950/676/31 952/678/31 +f 953/679/32 951/680/32 949/675/32 +f 955/681/33 952/678/33 951/682/33 +f 962/683/32 957/684/32 958/685/32 +f 964/686/35 958/685/35 960/687/35 +f 961/688/33 959/689/33 957/684/33 +f 963/690/31 960/687/31 959/691/31 +f 970/692/31 965/693/31 966/694/31 +f 972/695/33 966/694/33 968/696/33 +f 969/697/35 967/698/35 965/693/35 +f 971/699/32 968/696/32 967/700/32 +f 978/701/37 973/702/37 974/703/37 +f 980/704/38 974/703/38 976/705/38 +f 977/706/39 975/707/39 973/702/39 +f 979/708/40 976/705/40 975/709/40 +f 986/710/40 981/711/40 982/712/40 +f 988/713/39 982/712/39 984/714/39 +f 985/715/38 983/716/38 981/711/38 +f 987/717/37 984/714/37 983/718/37 +f 994/719/38 989/720/38 990/721/38 +f 996/722/40 990/721/40 992/723/40 +f 993/724/37 991/725/37 989/720/37 +f 995/726/39 992/723/39 991/727/39 +f 1002/728/39 997/729/39 998/730/39 +f 1004/731/37 998/730/37 1000/732/37 +f 1001/733/40 999/734/40 997/729/40 +f 1003/735/38 1000/732/38 999/736/38 +f 1010/737/41 1005/738/41 1006/739/41 +f 1012/740/42 1006/739/42 1008/741/42 +f 1009/742/43 1007/743/43 1005/738/43 +f 1011/744/44 1008/741/44 1007/745/44 +f 1018/746/44 1013/747/44 1014/748/44 +f 1020/749/43 1014/748/43 1016/750/43 +f 1017/751/42 1015/752/42 1013/747/42 +f 1019/753/41 1016/750/41 1015/754/41 +f 1026/755/42 1021/756/42 1022/757/42 +f 1028/758/44 1022/757/44 1024/759/44 +f 1025/760/41 1023/761/41 1021/756/41 +f 1027/762/43 1024/759/43 1023/763/43 +f 1034/764/43 1029/765/43 1030/766/43 +f 1036/767/41 1030/766/41 1032/768/41 +f 1033/769/44 1031/770/44 1029/765/44 +f 1035/771/42 1032/768/42 1031/772/42 +f 1042/773/33 1037/774/33 1038/775/33 +f 1044/776/32 1038/775/32 1040/777/32 +f 1041/778/31 1039/779/31 1037/774/31 +f 1043/780/35 1040/777/35 1039/781/35 +f 1050/782/35 1045/783/35 1046/784/35 +f 1052/785/31 1046/784/31 1048/786/31 +f 1049/787/32 1047/788/32 1045/783/32 +f 1051/789/33 1048/786/33 1047/790/33 +f 1058/791/32 1053/792/32 1054/793/32 +f 1060/794/35 1054/793/35 1056/795/35 +f 1057/796/33 1055/797/33 1053/792/33 +f 1059/798/31 1056/795/31 1055/799/31 +f 1066/800/31 1061/801/31 1062/802/31 +f 1068/803/33 1062/802/33 1064/804/33 +f 1065/805/35 1063/806/35 1061/801/35 +f 1067/807/32 1064/804/32 1063/808/32 +f 1074/809/37 1069/810/37 1070/811/37 +f 1076/812/38 1070/811/38 1072/813/38 +f 1073/814/39 1071/815/39 1069/810/39 +f 1075/816/40 1072/813/40 1071/817/40 +f 1082/818/40 1077/819/40 1078/820/40 +f 1084/821/39 1078/820/39 1080/822/39 +f 1081/823/38 1079/824/38 1077/819/38 +f 1083/825/37 1080/822/37 1079/826/37 +f 1090/827/38 1085/828/38 1086/829/38 +f 1092/830/40 1086/829/40 1088/831/40 +f 1089/832/37 1087/833/37 1085/828/37 +f 1091/834/39 1088/831/39 1087/835/39 +f 1098/836/39 1093/837/39 1094/838/39 +f 1100/839/37 1094/838/37 1096/840/37 +f 1097/841/40 1095/842/40 1093/837/40 +f 1099/843/38 1096/840/38 1095/844/38 +f 1106/845/41 1101/846/41 1102/847/41 +f 1108/848/42 1102/847/42 1104/849/42 +f 1105/850/43 1103/851/43 1101/846/43 +f 1107/852/44 1104/849/44 1103/853/44 +f 1114/854/44 1109/855/44 1110/856/44 +f 1116/857/43 1110/856/43 1112/858/43 +f 1113/859/42 1111/860/42 1109/855/42 +f 1115/861/41 1112/858/41 1111/862/41 +f 1122/863/42 1117/864/42 1118/865/42 +f 1124/866/44 1118/865/44 1120/867/44 +f 1121/868/41 1119/869/41 1117/864/41 +f 1123/870/43 1120/867/43 1119/871/43 +f 1130/872/43 1125/873/43 1126/874/43 +f 1132/875/41 1126/874/41 1128/876/41 +f 1129/877/44 1127/878/44 1125/873/44 +f 1131/879/42 1128/876/42 1127/880/42 +f 1341/881/38 1295/882/38 1293/883/38 +f 1330/884/32 1281/885/32 1282/886/32 +f 1356/887/42 1306/888/42 1308/889/42 +f 1343/890/37 1296/891/37 1295/892/37 +f 1329/893/33 1283/894/33 1281/885/33 +f 1358/895/44 1309/896/44 1310/897/44 +f 1344/898/39 1294/899/39 1296/891/39 +f 1331/900/31 1284/901/31 1283/902/31 +f 1357/903/42 1311/904/42 1309/896/42 +f 1346/905/38 1297/906/38 1298/907/38 +f 1332/908/35 1282/886/35 1284/901/35 +f 1359/909/41 1312/910/41 1311/911/41 +f 1345/912/37 1299/913/37 1297/906/37 +f 1334/914/31 1285/915/31 1286/916/31 +f 1360/917/43 1310/897/43 1312/910/43 +f 1347/918/39 1300/919/39 1299/920/39 +f 1333/921/35 1287/922/35 1285/915/35 +f 1362/923/42 1313/924/42 1314/925/42 +f 1322/926/33 1273/927/33 1274/928/33 +f 1348/929/40 1298/907/40 1300/919/40 +f 1335/930/32 1288/931/32 1287/932/32 +f 1361/933/41 1315/934/41 1313/924/41 +f 1321/935/31 1275/936/31 1273/927/31 +f 1350/937/39 1301/938/39 1302/939/39 +f 1336/940/33 1286/916/33 1288/931/33 +f 1363/941/43 1316/942/43 1315/943/43 +f 1323/944/35 1276/945/35 1275/946/35 +f 1349/947/40 1303/948/40 1301/938/40 +f 1338/949/37 1289/950/37 1290/951/37 +f 1364/952/44 1314/925/44 1316/942/44 +f 1324/953/32 1274/928/32 1276/945/32 +f 1351/954/38 1304/955/38 1303/956/38 +f 1337/957/39 1291/958/39 1289/950/39 +f 1366/959/43 1317/960/43 1318/961/43 +f 1326/962/35 1277/963/35 1278/964/35 +f 1352/965/37 1302/939/37 1304/955/37 +f 1339/966/40 1292/967/40 1291/968/40 +f 1365/969/44 1319/970/44 1317/960/44 +f 1325/971/32 1279/972/32 1277/963/32 +f 1354/973/41 1305/974/41 1306/888/41 +f 1340/975/38 1290/951/38 1292/967/38 +f 1367/976/42 1320/977/42 1319/978/42 +f 1327/979/33 1280/980/33 1279/981/33 +f 1353/982/43 1307/983/43 1305/974/43 +f 1342/984/40 1293/883/40 1294/899/40 +f 1368/985/41 1318/961/41 1320/977/41 +f 1328/986/31 1278/964/31 1280/980/31 +f 1355/987/44 1308/889/44 1307/988/44 +f 1371/989/31 1370/990/31 1369/991/31 +f 1375/992/32 1373/993/32 1374/994/32 +f 1369/995/36 1373/993/36 1371/996/36 +f 1371/997/33 1376/998/33 1372/999/33 +f 1370/1000/35 1374/994/35 1369/1001/35 +f 1372/1002/34 1375/992/34 1370/990/34 +f 1379/1003/31 1378/1004/31 1377/1005/31 +f 1383/1006/32 1381/1007/32 1382/1008/32 +f 1377/1009/36 1381/1007/36 1379/1010/36 +f 1379/1011/33 1384/1012/33 1380/1013/33 +f 1378/1014/35 1382/1008/35 1377/1015/35 +f 1380/1016/34 1383/1006/34 1378/1004/34 +f 1387/1017/31 1386/1018/31 1385/1019/31 +f 1391/1020/32 1389/1021/32 1390/1022/32 +f 1385/1023/36 1389/1021/36 1387/1024/36 +f 1387/1025/33 1392/1026/33 1388/1027/33 +f 1386/1028/35 1390/1022/35 1385/1029/35 +f 1388/1030/34 1391/1020/34 1386/1018/34 +f 1395/1031/31 1394/1032/31 1393/1033/31 +f 1399/1034/32 1397/1035/32 1398/1036/32 +f 1393/1037/36 1397/1035/36 1395/1038/36 +f 1395/1039/33 1400/1040/33 1396/1041/33 +f 1394/1042/35 1398/1036/35 1393/1043/35 +f 1396/1044/34 1399/1034/34 1394/1032/34 +f 1402/1045/34 1403/1046/34 1401/1047/34 +f 1407/1048/31 1416/1049/31 1408/1050/31 +f 1404/1051/33 1409/1052/33 1403/1046/33 +f 1401/1047/35 1411/1053/35 1402/1045/35 +f 1402/1045/31 1412/1054/31 1404/1051/31 +f 1403/1046/32 1410/1055/32 1401/1047/32 +f 1406/1056/36 1409/1057/36 1405/1058/36 +f 1407/1059/36 1410/1060/36 1406/1061/36 +f 1408/1050/36 1411/1062/36 1407/1048/36 +f 1405/1063/36 1412/1064/36 1408/1065/36 +f 1405/1058/32 1414/1066/32 1406/1056/32 +f 1408/1065/33 1413/1067/33 1405/1063/33 +f 1406/1061/35 1415/1068/35 1407/1059/35 +f 1418/1069/34 1419/1070/34 1417/1071/34 +f 1423/1072/31 1432/1073/31 1424/1074/31 +f 1420/1075/33 1425/1076/33 1419/1070/33 +f 1417/1071/35 1427/1077/35 1418/1069/35 +f 1418/1069/31 1428/1078/31 1420/1075/31 +f 1419/1070/32 1426/1079/32 1417/1071/32 +f 1422/1080/36 1425/1081/36 1421/1082/36 +f 1423/1083/36 1426/1084/36 1422/1085/36 +f 1424/1074/36 1427/1086/36 1423/1072/36 +f 1421/1087/36 1428/1088/36 1424/1089/36 +f 1421/1082/32 1430/1090/32 1422/1080/32 +f 1424/1089/33 1429/1091/33 1421/1087/33 +f 1422/1085/35 1431/1092/35 1423/1083/35 +f 1434/1093/34 1435/1094/34 1433/1095/34 +f 1439/1096/31 1448/1097/31 1440/1098/31 +f 1436/1099/33 1441/1100/33 1435/1094/33 +f 1433/1095/35 1443/1101/35 1434/1093/35 +f 1434/1093/31 1444/1102/31 1436/1099/31 +f 1435/1094/32 1442/1103/32 1433/1095/32 +f 1438/1104/36 1441/1105/36 1437/1106/36 +f 1439/1107/36 1442/1108/36 1438/1109/36 +f 1440/1098/36 1443/1110/36 1439/1096/36 +f 1437/1111/36 1444/1112/36 1440/1113/36 +f 1437/1106/32 1446/1114/32 1438/1104/32 +f 1440/1113/33 1445/1115/33 1437/1111/33 +f 1438/1109/35 1447/1116/35 1439/1107/35 +f 1450/1117/34 1451/1118/34 1449/1119/34 +f 1455/1120/31 1464/1121/31 1456/1122/31 +f 1452/1123/33 1457/1124/33 1451/1118/33 +f 1449/1119/35 1459/1125/35 1450/1117/35 +f 1450/1117/31 1460/1126/31 1452/1123/31 +f 1451/1118/32 1458/1127/32 1449/1119/32 +f 1454/1128/36 1457/1129/36 1453/1130/36 +f 1455/1131/36 1458/1132/36 1454/1133/36 +f 1456/1122/36 1459/1134/36 1455/1120/36 +f 1453/1135/36 1460/1136/36 1456/1137/36 +f 1453/1130/32 1462/1138/32 1454/1128/32 +f 1456/1137/33 1461/1139/33 1453/1135/33 +f 1454/1133/35 1463/1140/35 1455/1131/35 +f 1466/1141/36 1467/1142/36 1465/1143/36 +f 1471/1144/31 1480/1145/31 1472/1146/31 +f 1468/1147/35 1473/1148/35 1467/1142/35 +f 1465/1143/33 1475/1149/33 1466/1141/33 +f 1466/1141/31 1476/1150/31 1468/1147/31 +f 1465/1143/32 1473/1151/32 1474/1152/32 +f 1470/1153/34 1473/1151/34 1469/1154/34 +f 1471/1155/34 1474/1156/34 1470/1157/34 +f 1472/1146/34 1475/1158/34 1471/1144/34 +f 1469/1159/34 1476/1160/34 1472/1161/34 +f 1469/1154/32 1478/1162/32 1470/1153/32 +f 1472/1161/35 1477/1163/35 1469/1159/35 +f 1470/1157/33 1479/1164/33 1471/1155/33 +f 1482/1165/36 1483/1166/36 1481/1167/36 +f 1487/1168/31 1496/1169/31 1488/1170/31 +f 1484/1171/35 1489/1172/35 1483/1166/35 +f 1481/1167/33 1491/1173/33 1482/1165/33 +f 1482/1165/31 1492/1174/31 1484/1171/31 +f 1483/1166/32 1490/1175/32 1481/1167/32 +f 1486/1176/34 1489/1177/34 1485/1178/34 +f 1487/1179/34 1490/1180/34 1486/1181/34 +f 1488/1170/34 1491/1182/34 1487/1168/34 +f 1485/1183/34 1492/1184/34 1488/1185/34 +f 1485/1178/32 1494/1186/32 1486/1176/32 +f 1488/1185/35 1493/1187/35 1485/1183/35 +f 1486/1181/33 1495/1188/33 1487/1179/33 +f 1498/1189/36 1499/1190/36 1497/1191/36 +f 1503/1192/31 1512/1193/31 1504/1194/31 +f 1500/1195/35 1505/1196/35 1499/1190/35 +f 1497/1191/33 1507/1197/33 1498/1189/33 +f 1498/1189/31 1508/1198/31 1500/1195/31 +f 1499/1190/32 1506/1199/32 1497/1191/32 +f 1502/1200/34 1505/1201/34 1501/1202/34 +f 1503/1203/34 1506/1204/34 1502/1205/34 +f 1504/1194/34 1507/1206/34 1503/1192/34 +f 1501/1207/34 1508/1208/34 1504/1209/34 +f 1501/1202/32 1510/1210/32 1502/1200/32 +f 1504/1209/35 1509/1211/35 1501/1207/35 +f 1502/1205/33 1511/1212/33 1503/1203/33 +f 1514/1213/36 1515/1214/36 1513/1215/36 +f 1519/1216/31 1528/1217/31 1520/1218/31 +f 1516/1219/35 1521/1220/35 1515/1214/35 +f 1513/1215/33 1523/1221/33 1514/1213/33 +f 1514/1213/31 1524/1222/31 1516/1219/31 +f 1515/1214/32 1522/1223/32 1513/1215/32 +f 1518/1224/34 1521/1225/34 1517/1226/34 +f 1519/1227/34 1522/1228/34 1518/1229/34 +f 1520/1218/34 1523/1230/34 1519/1216/34 +f 1517/1231/34 1524/1232/34 1520/1233/34 +f 1517/1226/32 1526/1234/32 1518/1224/32 +f 1520/1233/35 1525/1235/35 1517/1231/35 +f 1518/1229/33 1527/1236/33 1519/1227/33 +f 1530/1237/36 1531/1238/36 1529/1239/36 +f 1535/1240/31 1544/1241/31 1536/1242/31 +f 1532/1243/35 1537/1244/35 1531/1238/35 +f 1529/1239/33 1539/1245/33 1530/1237/33 +f 1530/1237/31 1540/1246/31 1532/1243/31 +f 1531/1238/32 1538/1247/32 1529/1239/32 +f 1534/1248/34 1537/1249/34 1533/1250/34 +f 1535/1251/34 1538/1252/34 1534/1253/34 +f 1536/1242/34 1539/1254/34 1535/1240/34 +f 1533/1255/34 1540/1256/34 1536/1257/34 +f 1533/1250/32 1542/1258/32 1534/1248/32 +f 1536/1257/35 1541/1259/35 1533/1255/35 +f 1534/1253/33 1543/1260/33 1535/1251/33 +f 1546/1261/33 1547/1262/33 1545/1263/33 +f 1551/1264/31 1560/1265/31 1552/1266/31 +f 1548/1267/36 1553/1268/36 1547/1262/36 +f 1545/1263/34 1555/1269/34 1546/1261/34 +f 1546/1261/31 1556/1270/31 1548/1267/31 +f 1547/1262/32 1554/1271/32 1545/1263/32 +f 1550/1272/35 1553/1273/35 1549/1274/35 +f 1551/1275/35 1554/1276/35 1550/1277/35 +f 1552/1266/35 1555/1278/35 1551/1264/35 +f 1549/1279/35 1556/1280/35 1552/1281/35 +f 1549/1274/32 1558/1282/32 1550/1272/32 +f 1552/1281/36 1557/1283/36 1549/1279/36 +f 1550/1277/34 1559/1284/34 1551/1275/34 +f 1562/1285/33 1563/1286/33 1561/1287/33 +f 1567/1288/31 1576/1289/31 1568/1290/31 +f 1564/1291/36 1569/1292/36 1563/1286/36 +f 1561/1287/34 1571/1293/34 1562/1285/34 +f 1562/1285/31 1572/1294/31 1564/1291/31 +f 1563/1286/32 1570/1295/32 1561/1287/32 +f 1566/1296/35 1569/1297/35 1565/1298/35 +f 1567/1299/35 1570/1300/35 1566/1301/35 +f 1568/1290/35 1571/1302/35 1567/1288/35 +f 1565/1303/35 1572/1304/35 1568/1305/35 +f 1565/1298/32 1574/1306/32 1566/1296/32 +f 1568/1305/36 1573/1307/36 1565/1303/36 +f 1566/1301/34 1575/1308/34 1567/1299/34 +f 1578/1309/33 1579/1310/33 1577/1311/33 +f 1583/1312/31 1592/1313/31 1584/1314/31 +f 1580/1315/36 1585/1316/36 1579/1310/36 +f 1577/1311/34 1587/1317/34 1578/1309/34 +f 1578/1309/31 1588/1318/31 1580/1315/31 +f 1579/1310/32 1586/1319/32 1577/1311/32 +f 1582/1320/35 1585/1321/35 1581/1322/35 +f 1583/1323/35 1586/1324/35 1582/1325/35 +f 1584/1314/35 1587/1326/35 1583/1312/35 +f 1581/1327/35 1588/1328/35 1584/1329/35 +f 1581/1322/32 1590/1330/32 1582/1320/32 +f 1584/1329/36 1589/1331/36 1581/1327/36 +f 1582/1325/34 1591/1332/34 1583/1323/34 +f 1594/1333/33 1595/1334/33 1593/1335/33 +f 1599/1336/31 1608/1337/31 1600/1338/31 +f 1596/1339/36 1601/1340/36 1595/1334/36 +f 1593/1335/34 1603/1341/34 1594/1333/34 +f 1594/1333/31 1604/1342/31 1596/1339/31 +f 1595/1334/32 1602/1343/32 1593/1335/32 +f 1598/1344/35 1601/1345/35 1597/1346/35 +f 1599/1347/35 1602/1348/35 1598/1349/35 +f 1600/1338/35 1603/1350/35 1599/1336/35 +f 1597/1351/35 1604/1352/35 1600/1353/35 +f 1597/1346/32 1606/1354/32 1598/1344/32 +f 1600/1353/36 1605/1355/36 1597/1351/36 +f 1598/1349/34 1607/1356/34 1599/1347/34 +f 1610/1357/33 1611/1358/33 1609/1359/33 +f 1615/1360/31 1624/1361/31 1616/1362/31 +f 1612/1363/36 1617/1364/36 1611/1358/36 +f 1609/1359/34 1619/1365/34 1610/1357/34 +f 1610/1357/31 1620/1366/31 1612/1363/31 +f 1611/1358/32 1618/1367/32 1609/1359/32 +f 1614/1368/35 1617/1369/35 1613/1370/35 +f 1615/1371/35 1618/1372/35 1614/1373/35 +f 1616/1362/35 1619/1374/35 1615/1360/35 +f 1613/1375/35 1620/1376/35 1616/1377/35 +f 1613/1370/32 1622/1378/32 1614/1368/32 +f 1616/1377/36 1621/1379/36 1613/1375/36 +f 1614/1373/34 1623/1380/34 1615/1371/34 +f 1626/1381/35 1627/1382/35 1625/1383/35 +f 1631/1384/31 1640/1385/31 1632/1386/31 +f 1628/1387/34 1633/1388/34 1627/1382/34 +f 1625/1383/36 1635/1389/36 1626/1381/36 +f 1626/1381/31 1636/1390/31 1628/1387/31 +f 1627/1382/32 1634/1391/32 1625/1383/32 +f 1630/1392/33 1633/1393/33 1629/1394/33 +f 1631/1395/33 1634/1396/33 1630/1397/33 +f 1632/1386/33 1635/1398/33 1631/1384/33 +f 1629/1399/33 1636/1400/33 1632/1401/33 +f 1629/1394/32 1638/1402/32 1630/1392/32 +f 1632/1401/34 1637/1403/34 1629/1399/34 +f 1630/1397/36 1639/1404/36 1631/1395/36 +f 1642/1405/35 1643/1406/35 1641/1407/35 +f 1647/1408/31 1656/1409/31 1648/1410/31 +f 1644/1411/34 1649/1412/34 1643/1406/34 +f 1641/1407/36 1651/1413/36 1642/1405/36 +f 1642/1405/31 1652/1414/31 1644/1411/31 +f 1643/1406/32 1650/1415/32 1641/1407/32 +f 1646/1416/33 1649/1417/33 1645/1418/33 +f 1647/1419/33 1650/1420/33 1646/1421/33 +f 1648/1410/33 1651/1422/33 1647/1408/33 +f 1645/1423/33 1652/1424/33 1648/1425/33 +f 1645/1418/32 1654/1426/32 1646/1416/32 +f 1648/1425/34 1653/1427/34 1645/1423/34 +f 1646/1421/36 1655/1428/36 1647/1419/36 +f 1658/1429/35 1659/1430/35 1657/1431/35 +f 1663/1432/31 1672/1433/31 1664/1434/31 +f 1660/1435/34 1665/1436/34 1659/1430/34 +f 1657/1431/36 1667/1437/36 1658/1429/36 +f 1658/1429/31 1668/1438/31 1660/1435/31 +f 1659/1430/32 1666/1439/32 1657/1431/32 +f 1662/1440/33 1665/1441/33 1661/1442/33 +f 1663/1443/33 1666/1444/33 1662/1445/33 +f 1664/1434/33 1667/1446/33 1663/1432/33 +f 1661/1447/33 1668/1448/33 1664/1449/33 +f 1661/1442/32 1670/1450/32 1662/1440/32 +f 1664/1449/34 1669/1451/34 1661/1447/34 +f 1662/1445/36 1671/1452/36 1663/1443/36 +f 1674/1453/35 1675/1454/35 1673/1455/35 +f 1679/1456/31 1688/1457/31 1680/1458/31 +f 1676/1459/34 1681/1460/34 1675/1454/34 +f 1673/1455/36 1683/1461/36 1674/1453/36 +f 1674/1453/31 1684/1462/31 1676/1459/31 +f 1673/1455/32 1681/1463/32 1682/1464/32 +f 1678/1465/33 1681/1463/33 1677/1466/33 +f 1679/1467/33 1682/1468/33 1678/1469/33 +f 1680/1458/33 1683/1470/33 1679/1456/33 +f 1677/1471/33 1684/1472/33 1680/1473/33 +f 1678/1465/32 1685/1474/32 1686/1475/32 +f 1680/1473/34 1685/1476/34 1677/1471/34 +f 1678/1469/36 1687/1477/36 1679/1467/36 +f 1690/1478/35 1691/1479/35 1689/1480/35 +f 1695/1481/31 1704/1482/31 1696/1483/31 +f 1692/1484/34 1697/1485/34 1691/1479/34 +f 1689/1480/36 1699/1486/36 1690/1478/36 +f 1690/1478/31 1700/1487/31 1692/1484/31 +f 1691/1479/32 1698/1488/32 1689/1480/32 +f 1694/1489/33 1697/1490/33 1693/1491/33 +f 1695/1492/33 1698/1493/33 1694/1494/33 +f 1696/1483/33 1699/1495/33 1695/1481/33 +f 1693/1496/33 1700/1497/33 1696/1498/33 +f 1693/1491/32 1702/1499/32 1694/1489/32 +f 1696/1498/34 1701/1500/34 1693/1496/34 +f 1694/1494/36 1703/1501/36 1695/1492/36 +f 1947/1502/33 1952/1503/33 1948/1504/33 +f 1946/1505/35 1950/1506/35 1945/1507/35 +f 1948/1504/34 1951/1508/34 1946/1505/34 +f 1945/1509/36 1949/1510/36 1947/1502/36 +f 2079/1511/36 2077/1512/36 2075/1513/36 +f 2083/1514/34 2085/1515/34 2087/1516/34 +f 2095/1517/36 2093/1518/36 2091/1519/36 +f 2101/1520/34 2103/1521/34 2098/1522/34 +f 2112/1523/35 2107/1524/35 2108/1525/35 +f 2110/1526/33 2106/1527/33 2105/1528/33 +f 2111/1529/36 2108/1525/36 2106/1527/36 +f 2109/1530/34 2105/1531/34 2107/1524/34 +f 2120/1532/35 2115/1533/35 2116/1534/35 +f 2118/1535/33 2114/1536/33 2113/1537/33 +f 2119/1538/36 2116/1534/36 2114/1536/36 +f 2117/1539/34 2113/1540/34 2115/1533/34 +f 171/243/31 172/1541/31 170/244/31 +f 174/246/32 176/1542/32 175/247/32 +f 172/249/33 176/253/33 174/246/33 +f 170/244/34 174/246/34 173/248/34 +f 169/250/35 173/1543/35 175/251/35 +f 171/252/36 175/251/36 176/253/36 +f 179/254/31 180/1544/31 178/255/31 +f 182/257/32 184/1545/32 183/258/32 +f 180/260/33 184/264/33 182/257/33 +f 178/255/34 182/257/34 181/259/34 +f 177/261/35 181/1546/35 183/262/35 +f 179/263/36 183/262/36 184/264/36 +f 187/265/31 188/1547/31 186/266/31 +f 190/268/32 192/1548/32 191/269/32 +f 188/271/33 192/275/33 190/268/33 +f 186/266/34 190/268/34 189/270/34 +f 185/272/35 189/1549/35 191/273/35 +f 187/274/36 191/273/36 192/275/36 +f 195/276/31 196/1550/31 194/277/31 +f 198/279/32 200/1551/32 199/280/32 +f 196/282/33 200/286/33 198/279/33 +f 194/277/34 198/279/34 197/281/34 +f 193/283/35 197/1552/35 199/284/35 +f 195/285/36 199/284/36 200/286/36 +f 203/287/31 204/291/31 202/288/31 +f 207/290/36 208/1553/36 204/291/36 +f 206/292/34 205/294/34 201/289/34 +f 208/293/32 207/1554/32 205/294/32 +f 211/295/31 212/299/31 210/296/31 +f 215/298/34 216/1555/34 212/299/34 +f 214/300/36 213/302/36 209/297/36 +f 216/301/32 215/1556/32 213/302/32 +f 219/303/31 220/307/31 218/304/31 +f 223/306/35 224/1557/35 220/307/35 +f 222/308/33 221/310/33 217/305/33 +f 224/309/32 223/1558/32 221/310/32 +f 227/311/31 228/315/31 226/312/31 +f 231/314/33 232/1559/33 228/315/33 +f 230/316/35 229/318/35 225/313/35 +f 232/317/32 231/1560/32 229/318/32 +f 235/319/31 236/332/31 234/320/31 +f 239/322/32 240/328/32 237/323/32 +f 233/325/36 238/324/36 237/323/36 +f 235/327/33 237/323/33 240/328/33 +f 234/330/35 239/322/35 238/324/35 +f 236/332/34 240/328/34 239/322/34 +f 243/333/31 244/1561/31 242/334/31 +f 247/336/32 248/342/32 245/337/32 +f 244/339/34 248/342/34 247/336/34 +f 241/335/36 246/338/36 245/337/36 +f 243/341/33 245/337/33 248/342/33 +f 242/344/35 247/336/35 246/338/35 +f 251/346/36 252/354/36 250/347/36 +f 254/349/34 256/353/34 255/350/34 +f 249/352/35 253/1562/35 255/350/35 +f 251/346/32 255/350/32 256/353/32 +f 252/354/33 256/353/33 254/355/33 +f 250/347/31 254/1563/31 253/357/31 +f 259/358/35 562/373/35 561/359/35 +f 563/361/33 564/372/33 263/362/33 +f 565/364/36 567/1564/36 261/365/36 +f 561/359/36 563/361/36 262/367/36 +f 257/369/31 262/363/31 263/362/31 +f 259/371/34 263/1565/34 564/372/34 +f 267/376/31 266/1566/31 275/1567/31 +f 266/1566/31 265/1568/31 275/1567/31 +f 265/1568/31 276/1569/31 275/1567/31 +f 275/1567/31 274/1570/31 273/1571/31 +f 273/1571/31 272/1572/31 271/374/31 +f 271/374/31 270/1573/31 269/375/31 +f 269/375/31 268/1574/31 267/376/31 +f 275/1567/31 273/1571/31 267/376/31 +f 273/1571/31 271/374/31 267/376/31 +f 278/379/32 277/1575/32 279/1576/32 +f 279/1576/32 280/1577/32 281/1578/32 +f 281/1578/32 282/1579/32 283/1580/32 +f 283/1580/32 284/1581/32 281/1578/32 +f 284/1581/32 285/377/32 281/1578/32 +f 285/377/32 286/1582/32 287/378/32 +f 287/378/32 288/1583/32 278/379/32 +f 278/379/32 279/1576/32 285/377/32 +f 279/1576/32 281/1578/32 285/377/32 +f 291/382/31 290/1584/31 299/1585/31 +f 290/1584/31 289/1586/31 299/1585/31 +f 289/1586/31 300/1587/31 299/1585/31 +f 299/1585/31 298/1588/31 297/1589/31 +f 297/1589/31 296/1590/31 295/380/31 +f 295/380/31 294/1591/31 293/381/31 +f 293/381/31 292/1592/31 291/382/31 +f 299/1585/31 297/1589/31 291/382/31 +f 297/1589/31 295/380/31 291/382/31 +f 302/385/32 301/1593/32 303/1594/32 +f 303/1594/32 304/1595/32 305/1596/32 +f 305/1596/32 306/1597/32 307/1598/32 +f 307/1598/32 308/1599/32 305/1596/32 +f 308/1599/32 309/383/32 305/1596/32 +f 309/383/32 310/1600/32 311/384/32 +f 311/384/32 312/1601/32 302/385/32 +f 302/385/32 303/1594/32 309/383/32 +f 303/1594/32 305/1596/32 309/383/32 +f 315/388/31 314/1602/31 323/1603/31 +f 314/1602/31 313/1604/31 323/1603/31 +f 313/1604/31 324/1605/31 323/1603/31 +f 323/1603/31 322/1606/31 321/1607/31 +f 321/1607/31 320/1608/31 319/386/31 +f 319/386/31 318/1609/31 317/387/31 +f 317/387/31 316/1610/31 315/388/31 +f 323/1603/31 321/1607/31 315/388/31 +f 321/1607/31 319/386/31 315/388/31 +f 326/391/32 325/1611/32 327/1612/32 +f 327/1612/32 328/1613/32 329/389/32 +f 329/389/32 330/1614/32 331/1615/32 +f 331/1615/32 332/1616/32 329/389/32 +f 332/1616/32 333/390/32 329/389/32 +f 333/390/32 334/1617/32 326/391/32 +f 334/1617/32 335/1618/32 326/391/32 +f 335/1618/32 336/1619/32 326/391/32 +f 326/391/32 327/1612/32 329/389/32 +f 339/394/31 338/1620/31 347/1621/31 +f 338/1620/31 337/1622/31 347/1621/31 +f 337/1622/31 348/1623/31 347/1621/31 +f 347/1621/31 346/1624/31 345/1625/31 +f 345/1625/31 344/1626/31 343/392/31 +f 343/392/31 342/1627/31 341/393/31 +f 341/393/31 340/1628/31 339/394/31 +f 347/1621/31 345/1625/31 339/394/31 +f 345/1625/31 343/392/31 339/394/31 +f 350/397/32 349/1629/32 351/1630/32 +f 351/1630/32 352/1631/32 353/395/32 +f 353/395/32 354/1632/32 355/1633/32 +f 355/1633/32 356/1634/32 353/395/32 +f 356/1634/32 357/396/32 353/395/32 +f 357/396/32 358/1635/32 350/397/32 +f 358/1635/32 359/1636/32 350/397/32 +f 359/1636/32 360/1637/32 350/397/32 +f 350/397/32 351/1630/32 353/395/32 +f 365/398/32 367/408/32 368/399/32 +f 362/401/33 366/400/33 368/399/33 +f 361/403/36 365/398/36 366/400/36 +f 363/405/35 367/408/35 365/398/35 +f 364/407/34 368/399/34 367/408/34 +f 374/410/32 382/1638/32 381/411/32 +f 371/413/32 379/417/32 380/414/32 +f 369/416/36 377/425/36 379/417/36 +f 370/418/31 378/421/31 377/419/31 +f 372/415/34 380/414/34 378/421/34 +f 373/412/35 377/419/35 378/421/35 +f 376/422/35 380/414/35 379/417/35 +f 375/424/35 379/417/35 377/425/35 +f 374/427/35 378/421/35 380/414/35 +f 376/428/36 384/1639/36 382/429/36 +f 375/423/31 383/1640/31 384/430/31 +f 373/426/34 381/1641/34 383/431/34 +f 507/434/36 506/1642/36 505/1643/36 +f 505/1643/36 512/1644/36 511/432/36 +f 511/432/36 510/1645/36 509/433/36 +f 509/433/36 508/1646/36 507/434/36 +f 507/434/36 505/1643/36 511/432/36 +f 514/1647/34 513/1648/34 515/435/34 +f 515/435/34 516/1649/34 517/436/34 +f 517/436/34 518/1650/34 519/437/34 +f 519/437/34 520/1651/34 514/1647/34 +f 514/1647/34 515/435/34 519/437/34 +f 523/438/33 525/446/33 528/439/33 +f 522/441/35 527/444/35 526/442/35 +f 524/440/34 528/439/34 527/444/34 +f 521/445/36 526/1652/36 525/446/36 +f 529/447/35 531/1653/35 532/448/35 +f 533/450/35 535/1654/35 536/451/35 +f 537/453/35 539/1655/35 540/454/35 +f 541/456/35 543/1656/35 544/457/35 +f 546/459/34 548/465/34 547/460/34 +f 551/462/31 559/1657/31 560/463/31 +f 548/465/33 556/478/33 553/466/33 +f 545/461/35 554/474/35 555/467/35 +f 546/459/31 555/476/31 556/468/31 +f 547/460/32 553/471/32 554/469/32 +f 550/470/36 554/469/36 553/471/36 +f 551/473/36 555/467/36 554/474/36 +f 552/464/36 556/468/36 555/476/36 +f 549/477/36 553/466/36 556/478/36 +f 549/472/32 557/1658/32 558/480/32 +f 552/479/33 560/1659/33 557/481/33 +f 550/475/35 558/1660/35 559/482/35 +f 566/483/35 565/1661/35 258/484/35 +f 568/486/34 566/483/34 260/485/34 +f 261/365/33 567/1564/33 568/488/33 +f 564/372/32 563/361/32 561/359/32 +f 569/490/31 571/1662/31 572/491/31 +f 572/493/34 576/503/34 574/494/34 +f 570/496/35 574/506/35 573/497/35 +f 569/499/36 573/497/36 575/500/36 +f 571/502/33 575/1663/33 576/503/33 +f 576/505/32 575/500/32 573/497/32 +f 626/507/34 650/1664/34 651/508/34 +f 649/510/34 650/1664/34 626/511/34 +f 636/513/34 660/516/34 649/510/34 +f 635/515/34 659/519/34 660/516/34 +f 634/518/34 658/1665/34 659/519/34 +f 633/521/34 657/525/34 658/522/34 +f 632/524/34 656/1666/34 657/525/34 +f 655/527/34 656/1666/34 632/528/34 +f 630/530/34 654/1667/34 655/527/34 +f 653/532/34 654/1667/34 630/533/34 +f 652/535/34 653/532/34 629/536/34 +f 651/508/34 652/535/34 628/538/34 +f 674/540/36 675/1668/36 663/541/36 +f 675/543/36 676/1669/36 664/544/36 +f 676/545/36 677/1670/36 665/546/36 +f 665/546/36 677/1671/36 678/547/36 +f 678/549/36 679/1672/36 667/550/36 +f 667/550/36 679/1673/36 680/551/36 +f 680/553/36 681/1674/36 669/554/36 +f 681/555/36 682/1675/36 670/556/36 +f 682/557/36 683/1676/36 671/558/36 +f 683/560/36 684/1677/36 672/561/36 +f 684/562/36 673/1678/36 661/563/36 +f 661/563/36 673/1679/36 674/564/36 +f 686/565/34 698/1680/34 699/566/34 +f 697/568/34 698/1680/34 686/569/34 +f 696/571/34 708/574/34 697/568/34 +f 695/573/34 707/577/34 708/574/34 +f 694/576/34 706/1681/34 707/577/34 +f 693/579/34 705/583/34 706/580/34 +f 692/582/34 704/1682/34 705/583/34 +f 703/585/34 704/1682/34 692/586/34 +f 690/588/34 702/1683/34 703/585/34 +f 701/590/34 702/1683/34 690/591/34 +f 700/593/34 701/590/34 689/594/34 +f 699/566/34 700/593/34 688/596/34 +f 722/598/36 723/1684/36 711/599/36 +f 723/601/36 724/1685/36 712/602/36 +f 724/603/36 725/1686/36 713/604/36 +f 713/604/36 725/1687/36 726/605/36 +f 726/607/36 727/1688/36 715/608/36 +f 715/608/36 727/1689/36 728/609/36 +f 728/611/36 729/1690/36 717/612/36 +f 729/613/36 730/1691/36 718/614/36 +f 730/615/36 731/1692/36 719/616/36 +f 731/618/36 732/1693/36 720/619/36 +f 732/620/36 721/1694/36 709/621/36 +f 709/621/36 721/1695/36 722/622/36 +f 637/625/34 638/1696/34 639/1697/34 +f 639/1697/34 640/1698/34 637/625/34 +f 640/1698/34 641/623/34 637/625/34 +f 641/623/34 642/1699/34 643/1700/34 +f 643/1700/34 644/1701/34 645/624/34 +f 645/624/34 646/1702/34 637/625/34 +f 646/1702/34 647/1703/34 637/625/34 +f 647/1703/34 648/1704/34 637/625/34 +f 641/623/34 643/1700/34 645/624/34 +f 735/628/36 734/1705/36 733/1706/36 +f 733/1706/36 744/1707/36 735/628/36 +f 744/1707/36 743/1708/36 735/628/36 +f 743/1708/36 742/1709/36 741/626/36 +f 741/626/36 740/1710/36 739/627/36 +f 739/627/36 738/1711/36 737/1712/36 +f 737/1712/36 736/1713/36 739/627/36 +f 736/1713/36 735/628/36 739/627/36 +f 743/1708/36 741/626/36 735/628/36 +f 746/629/34 750/637/34 752/630/34 +f 747/632/36 751/635/36 749/633/36 +f 748/631/33 752/630/33 751/635/33 +f 745/636/35 749/1714/35 750/637/35 +f 754/638/34 758/646/34 760/639/34 +f 755/641/36 759/644/36 757/642/36 +f 756/640/33 760/639/33 759/644/33 +f 753/645/35 757/1715/35 758/646/35 +f 762/647/34 766/655/34 768/648/34 +f 763/650/36 767/653/36 765/651/36 +f 764/649/33 768/648/33 767/653/33 +f 761/654/35 765/1716/35 766/655/35 +f 770/656/34 774/664/34 776/657/34 +f 771/659/36 775/662/36 773/660/36 +f 772/658/33 776/657/33 775/662/33 +f 769/663/35 773/1717/35 774/664/35 +f 946/665/33 945/670/33 941/666/33 +f 948/668/32 946/665/32 942/667/32 +f 945/670/31 947/1718/31 943/671/31 +f 947/672/35 948/668/35 944/669/35 +f 954/674/35 953/679/35 949/675/35 +f 956/677/31 954/674/31 950/676/31 +f 953/679/32 955/1719/32 951/680/32 +f 955/681/33 956/677/33 952/678/33 +f 962/683/32 961/688/32 957/684/32 +f 964/686/35 962/683/35 958/685/35 +f 961/688/33 963/1720/33 959/689/33 +f 963/690/31 964/686/31 960/687/31 +f 970/692/31 969/697/31 965/693/31 +f 972/695/33 970/692/33 966/694/33 +f 969/697/35 971/1721/35 967/698/35 +f 971/699/32 972/695/32 968/696/32 +f 978/701/37 977/706/37 973/702/37 +f 980/704/38 978/701/38 974/703/38 +f 977/706/39 979/1722/39 975/707/39 +f 979/708/40 980/704/40 976/705/40 +f 986/710/40 985/715/40 981/711/40 +f 988/713/39 986/710/39 982/712/39 +f 985/715/38 987/1723/38 983/716/38 +f 987/717/37 988/713/37 984/714/37 +f 994/719/38 993/724/38 989/720/38 +f 996/722/40 994/719/40 990/721/40 +f 993/724/37 995/1724/37 991/725/37 +f 995/726/39 996/722/39 992/723/39 +f 1002/728/39 1001/733/39 997/729/39 +f 1004/731/37 1002/728/37 998/730/37 +f 1001/733/40 1003/1725/40 999/734/40 +f 1003/735/38 1004/731/38 1000/732/38 +f 1010/737/41 1009/742/41 1005/738/41 +f 1012/740/42 1010/737/42 1006/739/42 +f 1009/742/43 1011/1726/43 1007/743/43 +f 1011/744/44 1012/740/44 1008/741/44 +f 1018/746/44 1017/751/44 1013/747/44 +f 1020/749/43 1018/746/43 1014/748/43 +f 1017/751/42 1019/1727/42 1015/752/42 +f 1019/753/41 1020/749/41 1016/750/41 +f 1026/755/42 1025/760/42 1021/756/42 +f 1028/758/44 1026/755/44 1022/757/44 +f 1025/760/41 1027/1728/41 1023/761/41 +f 1027/762/43 1028/758/43 1024/759/43 +f 1034/764/43 1033/769/43 1029/765/43 +f 1036/767/41 1034/764/41 1030/766/41 +f 1033/769/44 1035/1729/44 1031/770/44 +f 1035/771/42 1036/767/42 1032/768/42 +f 1042/773/33 1041/778/33 1037/774/33 +f 1044/776/32 1042/773/32 1038/775/32 +f 1041/778/31 1043/1730/31 1039/779/31 +f 1043/780/35 1044/776/35 1040/777/35 +f 1050/782/35 1049/787/35 1045/783/35 +f 1052/785/31 1050/782/31 1046/784/31 +f 1049/787/32 1051/1731/32 1047/788/32 +f 1051/789/33 1052/785/33 1048/786/33 +f 1058/791/32 1057/796/32 1053/792/32 +f 1060/794/35 1058/791/35 1054/793/35 +f 1057/796/33 1059/1732/33 1055/797/33 +f 1059/798/31 1060/794/31 1056/795/31 +f 1066/800/31 1065/805/31 1061/801/31 +f 1068/803/33 1066/800/33 1062/802/33 +f 1065/805/35 1067/1733/35 1063/806/35 +f 1067/807/32 1068/803/32 1064/804/32 +f 1074/809/37 1073/814/37 1069/810/37 +f 1076/812/38 1074/809/38 1070/811/38 +f 1073/814/39 1075/1734/39 1071/815/39 +f 1075/816/40 1076/812/40 1072/813/40 +f 1082/818/40 1081/823/40 1077/819/40 +f 1084/821/39 1082/818/39 1078/820/39 +f 1081/823/38 1083/1735/38 1079/824/38 +f 1083/825/37 1084/821/37 1080/822/37 +f 1090/827/38 1089/832/38 1085/828/38 +f 1092/830/40 1090/827/40 1086/829/40 +f 1089/832/37 1091/1736/37 1087/833/37 +f 1091/834/39 1092/830/39 1088/831/39 +f 1098/836/39 1097/841/39 1093/837/39 +f 1100/839/37 1098/836/37 1094/838/37 +f 1097/841/40 1099/1737/40 1095/842/40 +f 1099/843/38 1100/839/38 1096/840/38 +f 1106/845/41 1105/850/41 1101/846/41 +f 1108/848/42 1106/845/42 1102/847/42 +f 1105/850/43 1107/1738/43 1103/851/43 +f 1107/852/44 1108/848/44 1104/849/44 +f 1114/854/44 1113/859/44 1109/855/44 +f 1116/857/43 1114/854/43 1110/856/43 +f 1113/859/42 1115/1739/42 1111/860/42 +f 1115/861/41 1116/857/41 1112/858/41 +f 1122/863/42 1121/868/42 1117/864/42 +f 1124/866/44 1122/863/44 1118/865/44 +f 1121/868/41 1123/1740/41 1119/869/41 +f 1123/870/43 1124/866/43 1120/867/43 +f 1130/872/43 1129/877/43 1125/873/43 +f 1132/875/41 1130/872/41 1126/874/41 +f 1129/877/44 1131/1741/44 1127/878/44 +f 1131/879/42 1132/875/42 1128/876/42 +f 1341/881/38 1343/1742/38 1295/882/38 +f 1330/884/32 1329/893/32 1281/885/32 +f 1356/887/42 1354/973/42 1306/888/42 +f 1343/890/37 1344/898/37 1296/891/37 +f 1329/893/33 1331/1743/33 1283/894/33 +f 1358/895/44 1357/903/44 1309/896/44 +f 1344/898/39 1342/984/39 1294/899/39 +f 1331/900/31 1332/908/31 1284/901/31 +f 1357/903/42 1359/1744/42 1311/904/42 +f 1346/905/38 1345/912/38 1297/906/38 +f 1332/908/35 1330/884/35 1282/886/35 +f 1359/909/41 1360/917/41 1312/910/41 +f 1345/912/37 1347/1745/37 1299/913/37 +f 1334/914/31 1333/921/31 1285/915/31 +f 1360/917/43 1358/895/43 1310/897/43 +f 1347/918/39 1348/929/39 1300/919/39 +f 1333/921/35 1335/1746/35 1287/922/35 +f 1362/923/42 1361/933/42 1313/924/42 +f 1322/926/33 1321/935/33 1273/927/33 +f 1348/929/40 1346/905/40 1298/907/40 +f 1335/930/32 1336/940/32 1288/931/32 +f 1361/933/41 1363/1747/41 1315/934/41 +f 1321/935/31 1323/1748/31 1275/936/31 +f 1350/937/39 1349/947/39 1301/938/39 +f 1336/940/33 1334/914/33 1286/916/33 +f 1363/941/43 1364/952/43 1316/942/43 +f 1323/944/35 1324/953/35 1276/945/35 +f 1349/947/40 1351/1749/40 1303/948/40 +f 1338/949/37 1337/957/37 1289/950/37 +f 1364/952/44 1362/923/44 1314/925/44 +f 1324/953/32 1322/926/32 1274/928/32 +f 1351/954/38 1352/965/38 1304/955/38 +f 1337/957/39 1339/1750/39 1291/958/39 +f 1366/959/43 1365/969/43 1317/960/43 +f 1326/962/35 1325/971/35 1277/963/35 +f 1352/965/37 1350/937/37 1302/939/37 +f 1339/966/40 1340/975/40 1292/967/40 +f 1365/969/44 1367/1751/44 1319/970/44 +f 1325/971/32 1327/1752/32 1279/972/32 +f 1354/973/41 1353/982/41 1305/974/41 +f 1340/975/38 1338/949/38 1290/951/38 +f 1367/976/42 1368/985/42 1320/977/42 +f 1327/979/33 1328/986/33 1280/980/33 +f 1353/982/43 1355/1753/43 1307/983/43 +f 1342/984/40 1341/881/40 1293/883/40 +f 1368/985/41 1366/959/41 1318/961/41 +f 1328/986/31 1326/962/31 1278/964/31 +f 1355/987/44 1356/887/44 1308/889/44 +f 1371/989/31 1372/1002/31 1370/990/31 +f 1375/992/32 1376/998/32 1373/993/32 +f 1369/995/36 1374/994/36 1373/993/36 +f 1371/997/33 1373/993/33 1376/998/33 +f 1370/1000/35 1375/992/35 1374/994/35 +f 1372/1002/34 1376/998/34 1375/992/34 +f 1379/1003/31 1380/1016/31 1378/1004/31 +f 1383/1006/32 1384/1012/32 1381/1007/32 +f 1377/1009/36 1382/1008/36 1381/1007/36 +f 1379/1011/33 1381/1007/33 1384/1012/33 +f 1378/1014/35 1383/1006/35 1382/1008/35 +f 1380/1016/34 1384/1012/34 1383/1006/34 +f 1387/1017/31 1388/1030/31 1386/1018/31 +f 1391/1020/32 1392/1026/32 1389/1021/32 +f 1385/1023/36 1390/1022/36 1389/1021/36 +f 1387/1025/33 1389/1021/33 1392/1026/33 +f 1386/1028/35 1391/1020/35 1390/1022/35 +f 1388/1030/34 1392/1026/34 1391/1020/34 +f 1395/1031/31 1396/1044/31 1394/1032/31 +f 1399/1034/32 1400/1040/32 1397/1035/32 +f 1393/1037/36 1398/1036/36 1397/1035/36 +f 1395/1039/33 1397/1035/33 1400/1040/33 +f 1394/1042/35 1399/1034/35 1398/1036/35 +f 1396/1044/34 1400/1040/34 1399/1034/34 +f 1402/1045/34 1404/1051/34 1403/1046/34 +f 1407/1048/31 1415/1754/31 1416/1049/31 +f 1404/1051/33 1412/1064/33 1409/1052/33 +f 1401/1047/35 1410/1060/35 1411/1053/35 +f 1402/1045/31 1411/1062/31 1412/1054/31 +f 1403/1046/32 1409/1057/32 1410/1055/32 +f 1406/1056/36 1410/1055/36 1409/1057/36 +f 1407/1059/36 1411/1053/36 1410/1060/36 +f 1408/1050/36 1412/1054/36 1411/1062/36 +f 1405/1063/36 1409/1052/36 1412/1064/36 +f 1405/1058/32 1413/1755/32 1414/1066/32 +f 1408/1065/33 1416/1756/33 1413/1067/33 +f 1406/1061/35 1414/1757/35 1415/1068/35 +f 1418/1069/34 1420/1075/34 1419/1070/34 +f 1423/1072/31 1431/1758/31 1432/1073/31 +f 1420/1075/33 1428/1088/33 1425/1076/33 +f 1417/1071/35 1426/1084/35 1427/1077/35 +f 1418/1069/31 1427/1086/31 1428/1078/31 +f 1419/1070/32 1425/1081/32 1426/1079/32 +f 1422/1080/36 1426/1079/36 1425/1081/36 +f 1423/1083/36 1427/1077/36 1426/1084/36 +f 1424/1074/36 1428/1078/36 1427/1086/36 +f 1421/1087/36 1425/1076/36 1428/1088/36 +f 1421/1082/32 1429/1759/32 1430/1090/32 +f 1424/1089/33 1432/1760/33 1429/1091/33 +f 1422/1085/35 1430/1761/35 1431/1092/35 +f 1434/1093/34 1436/1099/34 1435/1094/34 +f 1439/1096/31 1447/1762/31 1448/1097/31 +f 1436/1099/33 1444/1112/33 1441/1100/33 +f 1433/1095/35 1442/1108/35 1443/1101/35 +f 1434/1093/31 1443/1110/31 1444/1102/31 +f 1435/1094/32 1441/1105/32 1442/1103/32 +f 1438/1104/36 1442/1103/36 1441/1105/36 +f 1439/1107/36 1443/1101/36 1442/1108/36 +f 1440/1098/36 1444/1102/36 1443/1110/36 +f 1437/1111/36 1441/1100/36 1444/1112/36 +f 1437/1106/32 1445/1763/32 1446/1114/32 +f 1440/1113/33 1448/1764/33 1445/1115/33 +f 1438/1109/35 1446/1765/35 1447/1116/35 +f 1450/1117/34 1452/1123/34 1451/1118/34 +f 1455/1120/31 1463/1766/31 1464/1121/31 +f 1452/1123/33 1460/1136/33 1457/1124/33 +f 1449/1119/35 1458/1132/35 1459/1125/35 +f 1450/1117/31 1459/1134/31 1460/1126/31 +f 1451/1118/32 1457/1129/32 1458/1127/32 +f 1454/1128/36 1458/1127/36 1457/1129/36 +f 1455/1131/36 1459/1125/36 1458/1132/36 +f 1456/1122/36 1460/1126/36 1459/1134/36 +f 1453/1135/36 1457/1124/36 1460/1136/36 +f 1453/1130/32 1461/1767/32 1462/1138/32 +f 1456/1137/33 1464/1768/33 1461/1139/33 +f 1454/1133/35 1462/1769/35 1463/1140/35 +f 1466/1141/36 1468/1147/36 1467/1142/36 +f 1471/1144/31 1479/1770/31 1480/1145/31 +f 1468/1147/35 1476/1160/35 1473/1148/35 +f 1465/1143/33 1474/1156/33 1475/1149/33 +f 1466/1141/31 1475/1158/31 1476/1150/31 +f 1465/1143/32 1467/1142/32 1473/1151/32 +f 1470/1153/34 1474/1152/34 1473/1151/34 +f 1471/1155/34 1475/1149/34 1474/1156/34 +f 1472/1146/34 1476/1150/34 1475/1158/34 +f 1469/1159/34 1473/1148/34 1476/1160/34 +f 1469/1154/32 1477/1771/32 1478/1162/32 +f 1472/1161/35 1480/1772/35 1477/1163/35 +f 1470/1157/33 1478/1773/33 1479/1164/33 +f 1482/1165/36 1484/1171/36 1483/1166/36 +f 1487/1168/31 1495/1774/31 1496/1169/31 +f 1484/1171/35 1492/1184/35 1489/1172/35 +f 1481/1167/33 1490/1180/33 1491/1173/33 +f 1482/1165/31 1491/1182/31 1492/1174/31 +f 1483/1166/32 1489/1177/32 1490/1175/32 +f 1486/1176/34 1490/1175/34 1489/1177/34 +f 1487/1179/34 1491/1173/34 1490/1180/34 +f 1488/1170/34 1492/1174/34 1491/1182/34 +f 1485/1183/34 1489/1172/34 1492/1184/34 +f 1485/1178/32 1493/1775/32 1494/1186/32 +f 1488/1185/35 1496/1776/35 1493/1187/35 +f 1486/1181/33 1494/1777/33 1495/1188/33 +f 1498/1189/36 1500/1195/36 1499/1190/36 +f 1503/1192/31 1511/1778/31 1512/1193/31 +f 1500/1195/35 1508/1208/35 1505/1196/35 +f 1497/1191/33 1506/1204/33 1507/1197/33 +f 1498/1189/31 1507/1206/31 1508/1198/31 +f 1499/1190/32 1505/1201/32 1506/1199/32 +f 1502/1200/34 1506/1199/34 1505/1201/34 +f 1503/1203/34 1507/1197/34 1506/1204/34 +f 1504/1194/34 1508/1198/34 1507/1206/34 +f 1501/1207/34 1505/1196/34 1508/1208/34 +f 1501/1202/32 1509/1779/32 1510/1210/32 +f 1504/1209/35 1512/1780/35 1509/1211/35 +f 1502/1205/33 1510/1781/33 1511/1212/33 +f 1514/1213/36 1516/1219/36 1515/1214/36 +f 1519/1216/31 1527/1782/31 1528/1217/31 +f 1516/1219/35 1524/1232/35 1521/1220/35 +f 1513/1215/33 1522/1228/33 1523/1221/33 +f 1514/1213/31 1523/1230/31 1524/1222/31 +f 1515/1214/32 1521/1225/32 1522/1223/32 +f 1518/1224/34 1522/1223/34 1521/1225/34 +f 1519/1227/34 1523/1221/34 1522/1228/34 +f 1520/1218/34 1524/1222/34 1523/1230/34 +f 1517/1231/34 1521/1220/34 1524/1232/34 +f 1517/1226/32 1525/1783/32 1526/1234/32 +f 1520/1233/35 1528/1784/35 1525/1235/35 +f 1518/1229/33 1526/1785/33 1527/1236/33 +f 1530/1237/36 1532/1243/36 1531/1238/36 +f 1535/1240/31 1543/1786/31 1544/1241/31 +f 1532/1243/35 1540/1256/35 1537/1244/35 +f 1529/1239/33 1538/1252/33 1539/1245/33 +f 1530/1237/31 1539/1254/31 1540/1246/31 +f 1531/1238/32 1537/1249/32 1538/1247/32 +f 1534/1248/34 1538/1247/34 1537/1249/34 +f 1535/1251/34 1539/1245/34 1538/1252/34 +f 1536/1242/34 1540/1246/34 1539/1254/34 +f 1533/1255/34 1537/1244/34 1540/1256/34 +f 1533/1250/32 1541/1787/32 1542/1258/32 +f 1536/1257/35 1544/1788/35 1541/1259/35 +f 1534/1253/33 1542/1789/33 1543/1260/33 +f 1546/1261/33 1548/1267/33 1547/1262/33 +f 1551/1264/31 1559/1790/31 1560/1265/31 +f 1548/1267/36 1556/1280/36 1553/1268/36 +f 1545/1263/34 1554/1276/34 1555/1269/34 +f 1546/1261/31 1555/1278/31 1556/1270/31 +f 1547/1262/32 1553/1273/32 1554/1271/32 +f 1550/1272/35 1554/1271/35 1553/1273/35 +f 1551/1275/35 1555/1269/35 1554/1276/35 +f 1552/1266/35 1556/1270/35 1555/1278/35 +f 1549/1279/35 1553/1268/35 1556/1280/35 +f 1549/1274/32 1557/1791/32 1558/1282/32 +f 1552/1281/36 1560/1792/36 1557/1283/36 +f 1550/1277/34 1558/1793/34 1559/1284/34 +f 1562/1285/33 1564/1291/33 1563/1286/33 +f 1567/1288/31 1575/1794/31 1576/1289/31 +f 1564/1291/36 1572/1304/36 1569/1292/36 +f 1561/1287/34 1570/1300/34 1571/1293/34 +f 1562/1285/31 1571/1302/31 1572/1294/31 +f 1563/1286/32 1569/1297/32 1570/1295/32 +f 1566/1296/35 1570/1295/35 1569/1297/35 +f 1567/1299/35 1571/1293/35 1570/1300/35 +f 1568/1290/35 1572/1294/35 1571/1302/35 +f 1565/1303/35 1569/1292/35 1572/1304/35 +f 1565/1298/32 1573/1795/32 1574/1306/32 +f 1568/1305/36 1576/1796/36 1573/1307/36 +f 1566/1301/34 1574/1797/34 1575/1308/34 +f 1578/1309/33 1580/1315/33 1579/1310/33 +f 1583/1312/31 1591/1798/31 1592/1313/31 +f 1580/1315/36 1588/1328/36 1585/1316/36 +f 1577/1311/34 1586/1324/34 1587/1317/34 +f 1578/1309/31 1587/1326/31 1588/1318/31 +f 1579/1310/32 1585/1321/32 1586/1319/32 +f 1582/1320/35 1586/1319/35 1585/1321/35 +f 1583/1323/35 1587/1317/35 1586/1324/35 +f 1584/1314/35 1588/1318/35 1587/1326/35 +f 1581/1327/35 1585/1316/35 1588/1328/35 +f 1581/1322/32 1589/1799/32 1590/1330/32 +f 1584/1329/36 1592/1800/36 1589/1331/36 +f 1582/1325/34 1590/1801/34 1591/1332/34 +f 1594/1333/33 1596/1339/33 1595/1334/33 +f 1599/1336/31 1607/1802/31 1608/1337/31 +f 1596/1339/36 1604/1352/36 1601/1340/36 +f 1593/1335/34 1602/1348/34 1603/1341/34 +f 1594/1333/31 1603/1350/31 1604/1342/31 +f 1595/1334/32 1601/1345/32 1602/1343/32 +f 1598/1344/35 1602/1343/35 1601/1345/35 +f 1599/1347/35 1603/1341/35 1602/1348/35 +f 1600/1338/35 1604/1342/35 1603/1350/35 +f 1597/1351/35 1601/1340/35 1604/1352/35 +f 1597/1346/32 1605/1803/32 1606/1354/32 +f 1600/1353/36 1608/1804/36 1605/1355/36 +f 1598/1349/34 1606/1805/34 1607/1356/34 +f 1610/1357/33 1612/1363/33 1611/1358/33 +f 1615/1360/31 1623/1806/31 1624/1361/31 +f 1612/1363/36 1620/1376/36 1617/1364/36 +f 1609/1359/34 1618/1372/34 1619/1365/34 +f 1610/1357/31 1619/1374/31 1620/1366/31 +f 1611/1358/32 1617/1369/32 1618/1367/32 +f 1614/1368/35 1618/1367/35 1617/1369/35 +f 1615/1371/35 1619/1365/35 1618/1372/35 +f 1616/1362/35 1620/1366/35 1619/1374/35 +f 1613/1375/35 1617/1364/35 1620/1376/35 +f 1613/1370/32 1621/1807/32 1622/1378/32 +f 1616/1377/36 1624/1808/36 1621/1379/36 +f 1614/1373/34 1622/1809/34 1623/1380/34 +f 1626/1381/35 1628/1387/35 1627/1382/35 +f 1631/1384/31 1639/1810/31 1640/1385/31 +f 1628/1387/34 1636/1400/34 1633/1388/34 +f 1625/1383/36 1634/1396/36 1635/1389/36 +f 1626/1381/31 1635/1398/31 1636/1390/31 +f 1627/1382/32 1633/1393/32 1634/1391/32 +f 1630/1392/33 1634/1391/33 1633/1393/33 +f 1631/1395/33 1635/1389/33 1634/1396/33 +f 1632/1386/33 1636/1390/33 1635/1398/33 +f 1629/1399/33 1633/1388/33 1636/1400/33 +f 1629/1394/32 1637/1811/32 1638/1402/32 +f 1632/1401/34 1640/1812/34 1637/1403/34 +f 1630/1397/36 1638/1813/36 1639/1404/36 +f 1642/1405/35 1644/1411/35 1643/1406/35 +f 1647/1408/31 1655/1814/31 1656/1409/31 +f 1644/1411/34 1652/1424/34 1649/1412/34 +f 1641/1407/36 1650/1420/36 1651/1413/36 +f 1642/1405/31 1651/1422/31 1652/1414/31 +f 1643/1406/32 1649/1417/32 1650/1415/32 +f 1646/1416/33 1650/1415/33 1649/1417/33 +f 1647/1419/33 1651/1413/33 1650/1420/33 +f 1648/1410/33 1652/1414/33 1651/1422/33 +f 1645/1423/33 1649/1412/33 1652/1424/33 +f 1645/1418/32 1653/1815/32 1654/1426/32 +f 1648/1425/34 1656/1816/34 1653/1427/34 +f 1646/1421/36 1654/1817/36 1655/1428/36 +f 1658/1429/35 1660/1435/35 1659/1430/35 +f 1663/1432/31 1671/1818/31 1672/1433/31 +f 1660/1435/34 1668/1448/34 1665/1436/34 +f 1657/1431/36 1666/1444/36 1667/1437/36 +f 1658/1429/31 1667/1446/31 1668/1438/31 +f 1659/1430/32 1665/1441/32 1666/1439/32 +f 1662/1440/33 1666/1439/33 1665/1441/33 +f 1663/1443/33 1667/1437/33 1666/1444/33 +f 1664/1434/33 1668/1438/33 1667/1446/33 +f 1661/1447/33 1665/1436/33 1668/1448/33 +f 1661/1442/32 1669/1819/32 1670/1450/32 +f 1664/1449/34 1672/1820/34 1669/1451/34 +f 1662/1445/36 1670/1821/36 1671/1452/36 +f 1674/1453/35 1676/1459/35 1675/1454/35 +f 1679/1456/31 1687/1822/31 1688/1457/31 +f 1676/1459/34 1684/1472/34 1681/1460/34 +f 1673/1455/36 1682/1468/36 1683/1461/36 +f 1674/1453/31 1683/1470/31 1684/1462/31 +f 1673/1455/32 1675/1454/32 1681/1463/32 +f 1678/1465/33 1682/1464/33 1681/1463/33 +f 1679/1467/33 1683/1461/33 1682/1468/33 +f 1680/1458/33 1684/1462/33 1683/1470/33 +f 1677/1471/33 1681/1460/33 1684/1472/33 +f 1678/1465/32 1677/1466/32 1685/1474/32 +f 1680/1473/34 1688/1823/34 1685/1476/34 +f 1678/1469/36 1686/1824/36 1687/1477/36 +f 1690/1478/35 1692/1484/35 1691/1479/35 +f 1695/1481/31 1703/1825/31 1704/1482/31 +f 1692/1484/34 1700/1497/34 1697/1485/34 +f 1689/1480/36 1698/1493/36 1699/1486/36 +f 1690/1478/31 1699/1495/31 1700/1487/31 +f 1691/1479/32 1697/1490/32 1698/1488/32 +f 1694/1489/33 1698/1488/33 1697/1490/33 +f 1695/1492/33 1699/1486/33 1698/1493/33 +f 1696/1483/33 1700/1487/33 1699/1495/33 +f 1693/1496/33 1697/1485/33 1700/1497/33 +f 1693/1491/32 1701/1826/32 1702/1499/32 +f 1696/1498/34 1704/1827/34 1701/1500/34 +f 1694/1494/36 1702/1828/36 1703/1501/36 +f 1947/1502/33 1949/1510/33 1952/1503/33 +f 1946/1505/35 1951/1508/35 1950/1506/35 +f 1948/1504/34 1952/1503/34 1951/1508/34 +f 1945/1509/36 1950/1829/36 1949/1510/36 +f 2075/1513/36 2074/1830/36 2073/1831/36 +f 2073/1831/36 2080/1832/36 2079/1511/36 +f 2079/1511/36 2078/1833/36 2077/1512/36 +f 2077/1512/36 2076/1834/36 2075/1513/36 +f 2075/1513/36 2073/1831/36 2079/1511/36 +f 2082/1835/34 2081/1836/34 2083/1514/34 +f 2083/1514/34 2084/1837/34 2085/1515/34 +f 2085/1515/34 2086/1838/34 2087/1516/34 +f 2087/1516/34 2088/1839/34 2082/1835/34 +f 2082/1835/34 2083/1514/34 2087/1516/34 +f 2091/1519/36 2090/1840/36 2089/1841/36 +f 2089/1841/36 2096/1842/36 2095/1517/36 +f 2095/1517/36 2094/1843/36 2093/1518/36 +f 2093/1518/36 2092/1844/36 2091/1519/36 +f 2091/1519/36 2089/1841/36 2095/1517/36 +f 2098/1522/34 2097/1845/34 2099/1846/34 +f 2099/1846/34 2100/1847/34 2101/1520/34 +f 2101/1520/34 2102/1848/34 2103/1521/34 +f 2103/1521/34 2104/1849/34 2098/1522/34 +f 2098/1522/34 2099/1846/34 2101/1520/34 +f 2112/1523/35 2109/1530/35 2107/1524/35 +f 2110/1526/33 2111/1529/33 2106/1527/33 +f 2111/1529/36 2112/1523/36 2108/1525/36 +f 2109/1530/34 2110/1850/34 2105/1531/34 +f 2120/1532/35 2117/1539/35 2115/1533/35 +f 2118/1535/33 2119/1538/33 2114/1536/33 +f 2119/1538/36 2120/1532/36 2116/1534/36 +f 2117/1539/34 2118/1851/34 2113/1540/34 +s 1 +f 269/1852/45 280/1853/36 268/1854/36 +f 276/1855/46 287/1856/47 275/1857/47 +f 266/1858/48 278/1859/33 265/1860/33 +f 273/1861/49 284/1862/50 272/1863/50 +f 270/1864/51 281/1865/45 269/1852/45 +f 265/1860/33 288/1866/46 276/1855/46 +f 267/1867/52 277/1868/48 266/1858/48 +f 274/1869/34 285/1870/49 273/1861/49 +f 271/1871/35 282/1872/51 270/1864/51 +f 268/1873/36 279/1874/52 267/1867/52 +f 275/1857/47 286/1875/34 274/1869/34 +f 272/1863/50 283/1876/35 271/1871/35 +f 292/1877/36 305/1878/45 304/1879/36 +f 300/1880/46 311/1881/47 299/1882/47 +f 290/1883/48 302/1884/33 289/1885/33 +f 297/1886/49 308/1887/50 296/1888/50 +f 293/1889/45 306/1890/51 305/1878/45 +f 289/1885/33 312/1891/46 300/1880/46 +f 291/1892/52 301/1893/48 290/1883/48 +f 298/1894/34 309/1895/49 297/1886/49 +f 295/1896/35 306/1890/51 294/1897/51 +f 292/1898/36 303/1899/52 291/1892/52 +f 298/1894/34 311/1881/47 310/1900/34 +f 296/1888/50 307/1901/35 295/1896/35 +f 317/1902/45 328/1903/36 316/1904/36 +f 324/1905/46 335/1906/47 323/1907/47 +f 314/1908/48 326/1909/33 313/1910/33 +f 321/1911/49 332/1912/50 320/1913/50 +f 318/1914/51 329/1915/45 317/1902/45 +f 313/1910/33 336/1916/46 324/1905/46 +f 315/1917/52 325/1918/48 314/1908/48 +f 322/1919/34 333/1920/49 321/1911/49 +f 319/1921/35 330/1922/51 318/1914/51 +f 316/1923/36 327/1924/52 315/1917/52 +f 323/1907/47 334/1925/34 322/1919/34 +f 320/1913/50 331/1926/35 319/1921/35 +f 341/1927/45 352/1928/36 340/1929/36 +f 348/1930/46 359/1931/47 347/1932/47 +f 338/1933/48 350/1934/33 337/1935/33 +f 345/1936/49 356/1937/50 344/1938/50 +f 342/1939/51 353/1940/45 341/1927/45 +f 337/1935/33 360/1941/46 348/1930/46 +f 338/1933/48 351/1942/52 349/1943/48 +f 346/1944/34 357/1945/49 345/1936/49 +f 343/1946/35 354/1947/51 342/1939/51 +f 340/1948/36 351/1942/52 339/1949/52 +f 346/1944/34 359/1931/47 358/1950/34 +f 344/1938/50 355/1951/35 343/1946/35 +f 392/1952/53 399/1953/54 391/1954/34 +f 390/1955/55 397/1956/56 389/1957/35 +f 388/1958/57 395/1959/58 387/1960/36 +f 386/1961/59 393/1962/60 385/1963/33 +f 385/1963/33 400/1964/61 392/1952/53 +f 391/1965/34 398/1966/62 390/1955/55 +f 389/1957/35 396/1967/63 388/1958/57 +f 387/1960/36 394/1968/64 386/1961/59 +f 393/1969/60 402/1970/65 401/1971/66 +f 393/1969/60 407/1972/67 400/1973/61 +f 397/1974/56 404/1975/68 396/1967/63 +f 395/1959/58 402/1970/65 394/1968/64 +f 398/1976/62 405/1977/69 397/1974/56 +f 396/1967/63 403/1978/70 395/1959/58 +f 406/1979/71 412/1980/72 405/1977/69 +f 403/1978/70 411/1981/73 410/1982/74 +f 401/1971/66 409/1983/75 408/1984/76 +f 407/1972/67 408/1984/76 414/1985/77 +f 405/1977/69 411/1981/73 404/1975/68 +f 403/1978/70 409/1983/75 402/1970/65 +f 398/1976/62 399/1986/54 406/1979/71 +f 406/1979/71 399/1986/54 413/1987/78 +f 400/1973/61 407/1972/67 399/1988/54 +f 407/1972/67 414/1985/77 399/1988/54 +f 422/1989/57 429/1990/79 421/1991/36 +f 420/1992/59 427/1993/80 419/1994/33 +f 418/1995/53 425/1996/81 417/1997/34 +f 416/1998/55 423/1999/82 415/2000/35 +f 415/2000/35 430/2001/83 422/1989/57 +f 421/2002/36 428/2003/84 420/1992/59 +f 419/1994/33 426/2004/85 418/1995/53 +f 417/1997/34 424/2005/86 416/1998/55 +f 423/2006/82 432/2007/87 431/2008/88 +f 423/2006/82 437/2009/89 430/2010/83 +f 427/2011/80 434/2012/90 426/2004/85 +f 424/2005/86 433/2013/91 432/2007/87 +f 427/2011/80 436/2014/92 435/2015/93 +f 426/2004/85 433/2013/91 425/1996/81 +f 436/2014/92 442/2016/94 435/2015/93 +f 433/2013/91 441/2017/95 440/2018/96 +f 432/2007/87 438/2019/97 431/2008/88 +f 431/2008/88 444/2020/98 437/2009/89 +f 435/2015/93 441/2017/95 434/2012/90 +f 433/2013/91 439/2021/99 432/2007/87 +f 428/2022/84 429/2023/79 436/2014/92 +f 436/2014/92 429/2023/79 443/2024/100 +f 430/2010/83 437/2009/89 429/2025/79 +f 437/2009/89 444/2020/98 429/2025/79 +f 440/2018/96 409/1983/75 410/1982/74 +f 439/2021/99 410/1982/74 411/1981/73 +f 438/2026/97 411/1981/73 412/2027/72 +f 444/2028/98 412/2027/72 413/2029/78 +f 429/2030/79 413/2029/78 399/2031/54 +f 399/2032/54 443/2033/100 429/2034/79 +f 442/2035/94 414/2036/77 408/2037/76 +f 441/2017/95 408/2037/76 409/1983/75 +f 452/2038/53 459/2039/54 451/2040/34 +f 450/2041/55 457/2042/56 449/2043/35 +f 448/2044/57 455/2045/58 447/2046/36 +f 446/2047/59 453/2048/60 445/2049/33 +f 445/2049/33 460/2050/61 452/2038/53 +f 451/2051/34 458/2052/62 450/2041/55 +f 449/2043/35 456/2053/63 448/2044/57 +f 447/2046/36 454/2054/64 446/2047/59 +f 453/2055/60 462/2056/65 461/2057/66 +f 453/2055/60 467/2058/67 460/2059/61 +f 456/2053/63 465/2060/69 464/2061/68 +f 454/2054/64 463/2062/70 462/2056/65 +f 457/2063/56 466/2064/71 465/2060/69 +f 455/2045/58 464/2061/68 463/2062/70 +f 466/2064/71 472/2065/72 465/2060/69 +f 464/2061/68 470/2066/74 463/2062/70 +f 462/2056/65 468/2067/76 461/2057/66 +f 467/2058/67 468/2067/76 474/2068/77 +f 465/2060/69 471/2069/73 464/2061/68 +f 463/2062/70 469/2070/75 462/2056/65 +f 458/2071/62 459/2072/54 466/2064/71 +f 466/2064/71 459/2072/54 473/2073/78 +f 460/2059/61 467/2058/67 459/2074/54 +f 467/2058/67 474/2068/77 459/2074/54 +f 482/2075/57 489/2076/79 481/2077/36 +f 480/2078/59 487/2079/80 479/2080/33 +f 478/2081/53 485/2082/81 477/2083/34 +f 476/2084/55 483/2085/82 475/2086/35 +f 475/2086/35 490/2087/83 482/2075/57 +f 481/2088/36 488/2089/84 480/2078/59 +f 479/2080/33 486/2090/85 478/2081/53 +f 477/2083/34 484/2091/86 476/2084/55 +f 483/2092/82 492/2093/87 491/2094/88 +f 483/2092/82 497/2095/89 490/2096/83 +f 487/2097/80 494/2098/101 486/2090/85 +f 484/2091/86 493/2099/91 492/2093/87 +f 487/2097/80 496/2100/92 495/2101/93 +f 486/2090/85 493/2099/91 485/2082/81 +f 496/2100/92 502/2102/94 495/2101/93 +f 494/2098/101 500/2103/96 493/2099/91 +f 491/2094/88 499/2104/99 498/2105/97 +f 497/2095/89 498/2105/97 504/2106/98 +f 494/2098/101 502/2102/94 501/2107/95 +f 493/2099/91 499/2104/99 492/2093/87 +f 488/2108/84 489/2109/79 496/2100/92 +f 496/2100/92 489/2109/79 503/2110/100 +f 490/2096/83 497/2095/89 489/2111/79 +f 497/2095/89 504/2106/98 489/2111/79 +f 500/2103/96 469/2070/75 470/2066/74 +f 471/2069/73 500/2103/96 470/2066/74 +f 498/2112/97 471/2069/73 472/2113/72 +f 504/2114/98 472/2113/72 473/2115/78 +f 489/2116/79 473/2115/78 459/2117/54 +f 459/2118/54 503/2119/100 489/2120/79 +f 502/2121/94 474/2122/77 468/2123/76 +f 501/2107/95 468/2123/76 469/2070/75 +f 511/2124/31 518/2125/102 510/2126/102 +f 509/2127/35 516/2128/103 508/2129/103 +f 507/2130/32 513/2131/104 506/2132/104 +f 512/2133/105 519/2134/31 511/2135/31 +f 510/2126/102 517/2136/35 509/2127/35 +f 508/2129/103 515/2137/32 507/2130/32 +f 506/2132/104 514/2138/33 505/2139/33 +f 505/2139/33 520/2140/105 512/2133/105 +f 580/2141/32 603/2142/41 579/2143/41 +f 587/2144/39 610/2145/31 586/2146/31 +f 584/2147/40 607/2148/35 583/2149/35 +f 581/2150/38 604/2151/32 580/2141/32 +f 588/2152/43 611/2153/39 587/2144/39 +f 578/2154/37 601/2155/33 577/2156/33 +f 585/2157/44 608/2158/40 584/2147/40 +f 582/2159/42 605/2160/38 581/2150/38 +f 577/2156/33 612/2161/43 588/2152/43 +f 579/2143/41 602/2162/37 578/2154/37 +f 586/2163/31 609/2164/44 585/2157/44 +f 583/2149/35 606/2165/42 582/2159/42 +f 613/2166/33 590/2167/37 589/2168/33 +f 620/2169/40 597/2170/44 596/2171/40 +f 617/2172/38 594/2173/42 593/2174/38 +f 624/2175/43 589/2168/33 600/2176/43 +f 614/2177/37 591/2178/41 590/2167/37 +f 621/2179/44 598/2180/31 597/2170/44 +f 618/2181/42 595/2182/35 594/2173/42 +f 615/2183/41 592/2184/32 591/2178/41 +f 622/2185/31 599/2186/39 598/2187/31 +f 619/2188/35 596/2171/40 595/2182/35 +f 616/2189/32 593/2174/38 592/2184/32 +f 623/2190/39 600/2176/43 599/2186/39 +f 626/507/106 579/2143/107 578/2154/106 +f 627/539/107 580/2141/70 579/2143/107 +f 580/2141/70 629/536/108 581/2150/108 +f 629/534/108 582/2159/109 581/2150/108 +f 630/530/109 583/2149/57 582/2159/109 +f 583/2149/57 632/528/110 584/2147/110 +f 632/524/110 585/2157/111 584/2147/110 +f 633/521/111 586/2163/79 585/2157/111 +f 634/518/79 587/2144/112 586/2146/79 +f 635/515/112 588/2152/113 587/2144/112 +f 588/2152/113 625/514/59 577/2156/59 +f 577/2156/59 626/511/106 578/2154/106 +f 601/2155/53 638/2191/114 637/2192/53 +f 603/2142/115 638/2193/114 602/2162/114 +f 604/2151/91 639/2194/115 603/2142/115 +f 604/2151/91 641/2195/116 640/2196/91 +f 606/2165/117 641/2197/116 605/2160/116 +f 607/2148/55 642/2198/117 606/2165/117 +f 607/2148/55 644/2199/118 643/2200/55 +f 609/2164/119 644/2201/118 608/2158/118 +f 610/2202/54 645/2203/119 609/2164/119 +f 611/2153/120 646/2204/54 610/2145/54 +f 612/2161/121 647/2205/120 611/2153/120 +f 601/2155/53 648/2206/121 612/2161/121 +f 658/1665/31 671/558/39 659/519/39 +f 655/527/35 668/552/40 656/1666/40 +f 652/535/32 665/546/38 653/532/38 +f 659/519/39 672/561/43 660/516/43 +f 649/510/33 662/542/37 650/1664/37 +f 656/1666/40 669/554/44 657/525/44 +f 653/532/38 666/548/42 654/1667/42 +f 660/516/43 661/563/33 649/510/33 +f 650/1664/37 663/541/41 651/508/41 +f 657/525/44 670/556/31 658/522/31 +f 654/1667/42 667/550/35 655/527/35 +f 651/508/41 664/544/32 652/535/32 +f 706/1681/31 719/616/39 707/577/39 +f 703/585/35 716/610/40 704/1682/40 +f 700/593/32 713/604/38 701/590/38 +f 707/577/39 720/619/43 708/574/43 +f 697/568/33 710/600/37 698/1680/37 +f 704/1682/40 717/612/44 705/583/44 +f 701/590/38 714/606/42 702/1683/42 +f 708/574/43 709/621/33 697/568/33 +f 698/1680/37 711/599/41 699/566/41 +f 705/583/44 718/614/31 706/580/31 +f 702/1683/42 715/608/35 703/585/35 +f 699/566/41 712/602/32 700/593/32 +f 591/2178/115 722/598/114 590/2167/114 +f 592/2184/91 723/601/115 591/2178/115 +f 592/2184/91 725/1686/116 724/603/91 +f 594/2173/117 725/1687/116 593/2174/116 +f 595/2182/55 726/607/117 594/2173/117 +f 595/2182/55 728/609/118 727/1689/55 +f 597/2170/119 728/611/118 596/2171/118 +f 598/2180/54 729/613/119 597/2170/119 +f 599/2186/120 730/615/54 598/2187/54 +f 600/2176/121 731/618/120 599/2186/120 +f 600/2176/121 721/1694/53 732/620/121 +f 589/2168/53 722/622/114 721/1695/53 +f 686/2207/37 675/2208/41 674/2209/37 +f 687/2210/41 676/2211/32 675/2208/41 +f 688/2212/32 677/2213/38 676/2211/32 +f 689/2214/38 678/2215/42 677/2213/38 +f 690/2216/42 679/2217/35 678/2215/42 +f 691/2218/35 680/2219/40 679/2217/35 +f 692/2220/40 681/2221/44 680/2219/40 +f 693/2222/44 682/2223/31 681/2221/44 +f 694/2224/31 683/2225/39 682/2226/31 +f 695/2227/39 684/2228/43 683/2225/39 +f 696/2229/43 673/2230/33 684/2228/43 +f 685/2231/33 674/2209/37 673/2230/33 +f 614/2177/106 735/2232/107 615/2183/107 +f 735/2233/107 616/2189/70 615/2183/107 +f 616/2189/70 737/2234/108 617/2172/108 +f 737/2235/108 618/2181/109 617/2172/108 +f 738/2236/109 619/2188/57 618/2181/109 +f 619/2188/57 740/2237/110 620/2169/110 +f 740/2238/110 621/2179/111 620/2169/110 +f 741/2239/111 622/2240/79 621/2179/111 +f 742/2241/79 623/2190/112 622/2185/79 +f 743/2242/112 624/2175/113 623/2190/112 +f 744/2243/113 613/2166/59 624/2175/113 +f 613/2166/59 734/2244/106 614/2177/106 +f 784/2245/59 791/2246/105 783/2247/33 +f 782/2248/53 789/2249/122 781/2250/34 +f 780/2251/55 787/2252/123 779/2253/35 +f 778/2254/57 785/2255/124 777/2256/36 +f 777/2256/36 792/2257/125 784/2245/59 +f 783/2258/33 790/2259/126 782/2248/53 +f 781/2250/34 788/2260/127 780/2251/55 +f 779/2253/35 786/2261/128 778/2254/57 +f 786/2261/128 793/2262/129 785/2263/124 +f 785/2263/124 799/2264/130 792/2265/125 +f 788/2260/127 797/2266/131 796/2267/132 +f 787/2252/123 794/2268/133 786/2261/128 +f 789/2269/122 798/2270/134 797/2266/131 +f 787/2252/123 796/2267/132 795/2271/103 +f 798/2270/134 804/2272/135 797/2266/131 +f 795/2271/103 803/2273/136 802/2274/137 +f 793/2262/129 801/2275/138 800/2276/139 +f 799/2264/130 800/2276/139 806/2277/140 +f 797/2266/131 803/2273/136 796/2267/132 +f 795/2271/103 801/2275/138 794/2268/133 +f 790/2278/126 791/2279/105 798/2270/134 +f 798/2270/134 791/2279/105 805/2280/141 +f 792/2265/125 799/2264/130 791/2281/105 +f 799/2264/130 806/2277/140 791/2281/105 +f 814/2282/142 821/2283/102 813/2284/143 +f 812/2285/144 819/2286/145 811/2287/146 +f 810/2288/147 817/2289/148 809/2290/149 +f 808/2291/150 815/2292/151 807/2293/91 +f 807/2293/91 822/2294/152 814/2282/142 +f 813/2295/143 820/2296/153 812/2285/144 +f 811/2287/146 818/2297/154 810/2288/147 +f 809/2290/149 816/2298/155 808/2291/150 +f 815/2299/151 824/2300/156 823/2301/157 +f 815/2299/151 829/2302/158 822/2303/152 +f 819/2304/145 826/2305/159 818/2297/154 +f 817/2289/148 824/2300/156 816/2298/155 +f 819/2304/145 828/2306/160 827/2307/161 +f 818/2297/154 825/2308/104 817/2289/148 +f 828/2306/160 834/2309/162 827/2307/161 +f 825/2308/104 833/2310/163 832/2311/164 +f 823/2301/157 831/2312/165 830/2313/166 +f 829/2302/158 830/2313/166 836/2314/167 +f 827/2307/161 833/2310/163 826/2305/159 +f 825/2308/104 831/2312/165 824/2300/156 +f 820/2315/153 821/2316/102 828/2306/160 +f 828/2306/160 821/2316/102 835/2317/168 +f 822/2303/152 829/2302/158 821/2318/102 +f 829/2302/158 836/2314/167 821/2318/102 +f 832/2311/164 801/2275/138 802/2274/137 +f 831/2312/165 802/2274/137 803/2273/136 +f 830/2319/166 803/2273/136 804/2320/135 +f 836/2321/167 804/2320/135 805/2322/141 +f 821/2323/102 805/2322/141 791/2324/105 +f 806/2325/140 821/2326/102 791/2327/105 +f 834/2328/162 806/2325/140 800/2329/139 +f 833/2310/163 800/2329/139 801/2275/138 +f 844/2330/59 851/2331/105 843/2332/33 +f 842/2333/53 849/2334/122 841/2335/34 +f 840/2336/55 847/2337/123 839/2338/35 +f 838/2339/57 845/2340/124 837/2341/36 +f 837/2341/36 852/2342/125 844/2330/59 +f 843/2343/33 850/2344/126 842/2333/53 +f 841/2335/34 848/2345/127 840/2336/55 +f 839/2338/35 846/2346/128 838/2339/57 +f 846/2346/128 853/2347/129 845/2348/124 +f 845/2348/124 859/2349/130 852/2350/125 +f 849/2351/122 856/2352/132 848/2345/127 +f 847/2337/123 854/2353/169 846/2346/128 +f 849/2351/122 858/2354/134 857/2355/131 +f 848/2345/127 855/2356/103 847/2337/123 +f 858/2354/134 864/2357/135 857/2355/131 +f 856/2352/132 862/2358/137 855/2356/103 +f 853/2347/129 861/2359/138 860/2360/139 +f 859/2349/130 860/2360/139 866/2361/140 +f 857/2355/131 863/2362/136 856/2352/132 +f 855/2356/103 861/2359/138 854/2353/169 +f 850/2363/126 851/2364/105 858/2354/134 +f 858/2354/134 851/2364/105 865/2365/141 +f 852/2350/125 859/2349/130 851/2366/105 +f 859/2349/130 866/2361/140 851/2366/105 +f 874/2367/142 881/2368/102 873/2369/143 +f 872/2370/144 879/2371/145 871/2372/146 +f 870/2373/147 877/2374/148 869/2375/149 +f 868/2376/150 875/2377/151 867/2378/91 +f 867/2378/91 882/2379/152 874/2367/142 +f 873/2380/143 880/2381/153 872/2370/144 +f 871/2372/146 878/2382/154 870/2373/147 +f 869/2375/149 876/2383/155 868/2376/150 +f 876/2383/155 883/2384/157 875/2385/151 +f 875/2385/151 889/2386/158 882/2387/152 +f 879/2388/145 886/2389/159 878/2382/154 +f 877/2374/148 884/2390/170 876/2383/155 +f 879/2388/145 888/2391/160 887/2392/161 +f 877/2374/148 886/2389/159 885/2393/104 +f 888/2391/160 894/2394/162 887/2392/161 +f 886/2389/159 892/2395/164 885/2393/104 +f 883/2384/157 891/2396/165 890/2397/166 +f 889/2386/158 890/2397/166 896/2398/167 +f 887/2392/161 893/2399/163 886/2389/159 +f 884/2390/170 892/2395/164 891/2396/165 +f 880/2400/153 881/2401/102 888/2391/160 +f 888/2391/160 881/2401/102 895/2402/168 +f 882/2387/152 889/2386/158 881/2403/102 +f 889/2386/158 896/2398/167 881/2403/102 +f 892/2395/164 861/2359/138 862/2358/137 +f 891/2396/165 862/2358/137 863/2362/136 +f 890/2404/166 863/2362/136 864/2405/135 +f 896/2406/167 864/2405/135 865/2407/141 +f 881/2408/102 865/2407/141 851/2409/105 +f 866/2410/140 881/2411/102 851/2412/105 +f 894/2413/162 866/2410/140 860/2414/139 +f 893/2399/163 860/2414/139 861/2359/138 +f 813/2415/143 903/2416/171 814/2417/142 +f 873/2418/143 910/2419/171 874/2420/142 +f 810/2288/147 900/2421/79 811/2287/146 +f 871/2372/146 906/2422/172 907/2423/79 +f 811/2287/146 901/2424/173 812/2285/144 +f 871/2372/146 908/2425/173 872/2370/144 +f 809/2426/149 897/2427/174 898/2428/175 +f 868/2429/150 905/2430/175 869/2431/149 +f 812/2285/144 902/2432/176 813/2433/143 +f 872/2370/144 909/2434/176 873/2435/143 +f 809/2426/149 899/2436/172 810/2288/147 +f 869/2431/149 906/2422/172 870/2373/147 +f 902/2437/176 917/2438/177 903/2416/171 +f 899/2436/172 914/2439/178 900/2421/79 +f 907/2423/79 922/2440/179 908/2425/173 +f 905/2430/175 918/2441/180 919/2442/181 +f 900/2421/79 915/2443/179 901/2424/173 +f 909/2434/176 922/2440/179 923/2444/182 +f 898/2428/175 911/2445/180 912/2446/181 +f 905/2430/175 920/2447/183 906/2422/172 +f 902/2432/176 915/2443/179 916/2448/182 +f 909/2449/176 924/2450/177 910/2419/171 +f 898/2428/175 913/2451/183 899/2436/172 +f 907/2423/79 920/2447/183 921/2452/178 +f 867/2453/91 904/2454/174 868/2429/150 +f 904/2454/174 867/2453/91 918/2441/180 +f 874/2420/142 910/2419/171 867/2453/91 +f 910/2419/171 924/2450/177 867/2453/91 +f 807/2455/91 897/2427/174 808/2456/150 +f 897/2427/174 807/2455/91 911/2445/180 +f 814/2417/142 903/2416/171 807/2455/91 +f 903/2416/171 917/2438/177 807/2455/91 +f 920/2447/183 937/2457/31 921/2452/178 +f 912/2458/181 929/2459/105 913/2451/183 +f 807/2460/91 927/2461/104 911/2462/180 +f 921/2452/178 938/2463/102 922/2440/179 +f 913/2451/183 930/2464/31 914/2439/178 +f 923/2465/182 938/2463/102 939/2466/35 +f 914/2439/178 931/2467/102 915/2443/179 +f 807/2460/91 933/2468/103 925/2469/32 +f 923/2470/182 940/2471/103 924/2472/177 +f 916/2473/182 931/2467/102 932/2474/35 +f 867/2475/91 934/2476/104 918/2477/180 +f 916/2478/182 933/2468/103 917/2479/177 +f 919/2480/181 934/2476/104 935/2481/33 +f 867/2475/91 940/2471/103 926/2482/32 +f 919/2480/181 936/2483/105 920/2447/183 +f 912/2458/181 927/2461/104 928/2484/33 +f 1138/2485/80 1156/2486/92 1157/2487/93 +f 1146/2488/80 1149/2489/92 1150/2490/93 +f 1136/2491/81 1160/2492/87 1135/2493/86 +f 1144/2494/81 1153/2495/87 1143/2496/86 +f 1137/2497/85 1159/2498/91 1136/2491/81 +f 1145/2499/85 1152/2500/91 1144/2494/81 +f 1134/2501/82 1162/2502/89 1133/2503/83 +f 1142/2504/82 1155/2505/89 1141/2506/83 +f 1142/2504/82 1153/2495/87 1154/2507/88 +f 1135/2493/86 1161/2508/88 1134/2501/82 +f 1145/2499/85 1150/2490/93 1151/2509/101 +f 1137/2497/85 1157/2487/93 1158/2510/101 +f 1155/2505/89 1168/2511/97 1169/2512/98 +f 1151/2509/101 1166/2513/96 1152/2500/91 +f 1159/2498/91 1174/2514/99 1160/2492/87 +f 1156/2486/92 1171/2515/94 1157/2487/93 +f 1152/2500/91 1167/2516/99 1153/2495/87 +f 1161/2508/88 1174/2514/99 1175/2517/97 +f 1149/2489/92 1164/2518/94 1150/2490/93 +f 1158/2510/101 1171/2515/94 1172/2519/95 +f 1154/2507/88 1167/2516/99 1168/2511/97 +f 1162/2502/89 1175/2517/97 1176/2520/98 +f 1151/2509/101 1164/2518/94 1165/2521/95 +f 1158/2510/101 1173/2522/96 1159/2498/91 +f 1140/2523/79 1156/2486/92 1139/2524/84 +f 1156/2486/92 1140/2523/79 1170/2525/100 +f 1133/2503/83 1162/2502/89 1140/2526/79 +f 1162/2502/89 1176/2520/98 1140/2526/79 +f 1148/2527/79 1149/2489/92 1147/2528/84 +f 1149/2489/92 1148/2527/79 1163/2529/100 +f 1141/2506/83 1155/2505/89 1148/2530/79 +f 1155/2505/89 1169/2512/98 1148/2530/79 +f 1172/2519/95 1189/2531/32 1173/2522/96 +f 1164/2532/94 1181/2533/104 1165/2521/95 +f 1148/2534/79 1179/2535/105 1163/2536/100 +f 1173/2522/96 1190/2537/103 1174/2514/99 +f 1165/2521/95 1182/2538/32 1166/2513/96 +f 1174/2514/99 1191/2539/35 1175/2540/97 +f 1166/2513/96 1183/2541/103 1167/2516/99 +f 1169/2542/98 1177/2543/31 1148/2544/79 +f 1175/2540/97 1192/2545/102 1176/2546/98 +f 1167/2516/99 1184/2547/35 1168/2548/97 +f 1140/2549/79 1186/2550/105 1170/2551/100 +f 1168/2548/97 1185/2552/102 1169/2542/98 +f 1170/2551/100 1187/2553/33 1171/2554/94 +f 1176/2546/98 1178/2555/31 1140/2556/79 +f 1171/2554/94 1188/2557/104 1172/2519/95 +f 1163/2536/100 1180/2558/33 1164/2532/94 +f 1145/2499/85 1206/2559/33 1146/2560/80 +f 1138/2561/80 1199/2562/59 1139/2563/84 +f 1146/2560/80 1207/2564/59 1147/2565/84 +f 1139/2563/84 1200/2566/36 1140/2567/79 +f 1140/2568/79 1193/2569/57 1133/2570/83 +f 1147/2565/84 1208/2571/36 1148/2572/79 +f 1148/2573/79 1201/2574/57 1141/2575/83 +f 1133/2570/83 1194/2576/35 1134/2577/82 +f 1141/2575/83 1202/2578/35 1142/2579/82 +f 1134/2577/82 1195/2580/55 1135/2493/86 +f 1142/2579/82 1203/2581/55 1143/2496/86 +f 1135/2493/86 1196/2582/34 1136/2491/81 +f 1143/2496/86 1204/2583/34 1144/2494/81 +f 1136/2491/81 1197/2584/53 1137/2497/85 +f 1144/2494/81 1205/2585/53 1145/2499/85 +f 1137/2497/85 1198/2586/33 1138/2561/80 +f 1219/2587/36 1212/2588/79 1211/2589/36 +f 1217/2590/32 1210/2591/70 1209/2592/32 +f 1224/2593/91 1209/2592/32 1216/2594/91 +f 1222/2595/54 1215/2596/34 1214/2597/54 +f 1220/2598/79 1213/2599/31 1212/2588/79 +f 1218/2600/70 1211/2589/36 1210/2591/70 +f 1223/2601/34 1216/2594/91 1215/2596/34 +f 1221/2602/31 1214/2597/54 1213/2603/31 +f 1235/2604/36 1228/2605/79 1227/2606/36 +f 1233/2607/32 1226/2608/70 1225/2609/32 +f 1240/2610/91 1225/2609/32 1232/2611/91 +f 1238/2612/54 1231/2613/34 1230/2614/54 +f 1236/2615/79 1229/2616/31 1228/2605/79 +f 1234/2617/70 1227/2606/36 1226/2608/70 +f 1239/2618/34 1232/2611/91 1231/2613/34 +f 1237/2619/31 1230/2614/54 1229/2620/31 +f 1251/2621/36 1244/2622/79 1243/2623/36 +f 1249/2624/32 1242/2625/70 1241/2626/32 +f 1256/2627/91 1241/2626/32 1248/2628/91 +f 1254/2629/54 1247/2630/34 1246/2631/54 +f 1252/2632/79 1245/2633/31 1244/2622/79 +f 1250/2634/70 1243/2623/36 1242/2625/70 +f 1255/2635/34 1248/2628/91 1247/2630/34 +f 1253/2636/31 1246/2631/54 1245/2637/31 +f 1267/2638/36 1260/2639/79 1259/2640/36 +f 1265/2641/32 1258/2642/70 1257/2643/32 +f 1272/2644/91 1257/2643/32 1264/2645/91 +f 1270/2646/54 1263/2647/34 1262/2648/54 +f 1268/2649/79 1261/2650/31 1260/2639/79 +f 1266/2651/70 1259/2640/36 1258/2642/70 +f 1271/2652/34 1264/2645/91 1263/2647/34 +f 1269/2653/31 1262/2648/54 1261/2654/31 +f 1712/2655/53 1719/2656/54 1711/2657/34 +f 1710/2658/55 1717/2659/56 1709/2660/35 +f 1708/2661/57 1715/2662/58 1707/2663/36 +f 1706/2664/59 1713/2665/60 1705/2666/33 +f 1705/2666/33 1720/2667/61 1712/2655/53 +f 1711/2668/34 1718/2669/62 1710/2658/55 +f 1709/2660/35 1716/2670/63 1708/2661/57 +f 1707/2663/36 1714/2671/64 1706/2664/59 +f 1713/2672/60 1722/2673/65 1721/2674/66 +f 1713/2672/60 1727/2675/67 1720/2676/61 +f 1716/2670/63 1725/2677/69 1724/2678/68 +f 1715/2662/58 1722/2673/65 1714/2671/64 +f 1718/2679/62 1725/2677/69 1717/2680/56 +f 1715/2662/58 1724/2678/68 1723/2681/70 +f 1726/2682/71 1732/2683/72 1725/2677/69 +f 1723/2681/70 1731/2684/73 1730/2685/74 +f 1721/2674/66 1729/2686/75 1728/2687/76 +f 1727/2675/67 1728/2687/76 1734/2688/77 +f 1725/2677/69 1731/2684/73 1724/2678/68 +f 1723/2681/70 1729/2686/75 1722/2673/65 +f 1718/2679/62 1719/2689/54 1726/2682/71 +f 1726/2682/71 1719/2689/54 1733/2690/78 +f 1720/2676/61 1727/2675/67 1719/2691/54 +f 1727/2675/67 1734/2688/77 1719/2691/54 +f 1742/2692/57 1749/2693/79 1741/2694/36 +f 1740/2695/59 1747/2696/80 1739/2697/33 +f 1738/2698/53 1745/2699/81 1737/2700/34 +f 1736/2701/55 1743/2702/82 1735/2703/35 +f 1735/2703/35 1750/2704/83 1742/2692/57 +f 1741/2705/36 1748/2706/84 1740/2695/59 +f 1739/2697/33 1746/2707/85 1738/2698/53 +f 1737/2700/34 1744/2708/86 1736/2701/55 +f 1743/2709/82 1752/2710/87 1751/2711/88 +f 1743/2709/82 1757/2712/89 1750/2713/83 +f 1746/2707/85 1755/2714/93 1754/2715/101 +f 1745/2699/81 1752/2710/87 1744/2708/86 +f 1748/2716/84 1755/2714/93 1747/2717/80 +f 1745/2699/81 1754/2715/101 1753/2718/91 +f 1756/2719/92 1762/2720/94 1755/2714/93 +f 1754/2715/101 1760/2721/96 1753/2718/91 +f 1751/2711/88 1759/2722/99 1758/2723/97 +f 1757/2712/89 1758/2723/97 1764/2724/98 +f 1755/2714/93 1761/2725/95 1754/2715/101 +f 1753/2718/91 1759/2722/99 1752/2710/87 +f 1748/2716/84 1749/2726/79 1756/2719/92 +f 1756/2719/92 1749/2726/79 1763/2727/100 +f 1750/2713/83 1757/2712/89 1749/2728/79 +f 1757/2712/89 1764/2724/98 1749/2728/79 +f 1760/2721/96 1729/2686/75 1730/2685/74 +f 1759/2722/99 1730/2685/74 1731/2684/73 +f 1758/2729/97 1731/2684/73 1732/2730/72 +f 1764/2731/98 1732/2730/72 1733/2732/78 +f 1749/2733/79 1733/2732/78 1719/2734/54 +f 1719/2735/54 1763/2736/100 1749/2737/79 +f 1762/2738/94 1734/2739/77 1728/2740/76 +f 1761/2725/95 1728/2740/76 1729/2686/75 +f 1772/2741/53 1779/2742/54 1771/2743/34 +f 1770/2744/55 1777/2745/56 1769/2746/35 +f 1768/2747/57 1775/2748/58 1767/2749/36 +f 1766/2750/59 1773/2751/60 1765/2752/33 +f 1765/2752/33 1780/2753/61 1772/2741/53 +f 1771/2754/34 1778/2755/62 1770/2744/55 +f 1769/2746/35 1776/2756/63 1768/2747/57 +f 1767/2749/36 1774/2757/64 1766/2750/59 +f 1773/2758/60 1782/2759/65 1781/2760/66 +f 1773/2758/60 1787/2761/67 1780/2762/61 +f 1776/2756/63 1785/2763/69 1784/2764/68 +f 1775/2748/58 1782/2759/65 1774/2757/64 +f 1778/2765/62 1785/2763/69 1777/2766/56 +f 1775/2748/58 1784/2764/68 1783/2767/70 +f 1786/2768/71 1792/2769/72 1785/2763/69 +f 1783/2767/70 1791/2770/73 1790/2771/74 +f 1781/2760/66 1789/2772/75 1788/2773/76 +f 1787/2761/67 1788/2773/76 1794/2774/77 +f 1785/2763/69 1791/2770/73 1784/2764/68 +f 1783/2767/70 1789/2772/75 1782/2759/65 +f 1778/2765/62 1779/2775/54 1786/2768/71 +f 1786/2768/71 1779/2775/54 1793/2776/78 +f 1780/2762/61 1787/2761/67 1779/2777/54 +f 1787/2761/67 1794/2774/77 1779/2777/54 +f 1802/2778/57 1809/2779/79 1801/2780/36 +f 1800/2781/59 1807/2782/80 1799/2783/33 +f 1798/2784/53 1805/2785/81 1797/2786/34 +f 1796/2787/55 1803/2788/82 1795/2789/35 +f 1795/2789/35 1810/2790/83 1802/2778/57 +f 1801/2791/36 1808/2792/84 1800/2781/59 +f 1799/2783/33 1806/2793/85 1798/2784/53 +f 1797/2786/34 1804/2794/86 1796/2787/55 +f 1803/2795/82 1812/2796/87 1811/2797/88 +f 1803/2795/82 1817/2798/89 1810/2799/83 +f 1806/2793/85 1815/2800/93 1814/2801/101 +f 1804/2794/86 1813/2802/91 1812/2796/87 +f 1807/2803/80 1816/2804/92 1815/2800/93 +f 1806/2793/85 1813/2802/91 1805/2785/81 +f 1816/2804/92 1822/2805/94 1815/2800/93 +f 1813/2802/91 1821/2806/95 1820/2807/96 +f 1811/2797/88 1819/2808/99 1818/2809/97 +f 1817/2798/89 1818/2809/97 1824/2810/98 +f 1815/2800/93 1821/2806/95 1814/2801/101 +f 1813/2802/91 1819/2808/99 1812/2796/87 +f 1808/2811/84 1809/2812/79 1816/2804/92 +f 1816/2804/92 1809/2812/79 1823/2813/100 +f 1810/2799/83 1817/2798/89 1809/2814/79 +f 1817/2798/89 1824/2810/98 1809/2814/79 +f 1820/2807/96 1789/2772/75 1790/2771/74 +f 1791/2770/73 1820/2807/96 1790/2771/74 +f 1818/2815/97 1791/2770/73 1792/2816/72 +f 1824/2817/98 1792/2816/72 1793/2818/78 +f 1809/2819/79 1793/2818/78 1779/2820/54 +f 1794/2821/77 1809/2822/79 1779/2823/54 +f 1822/2824/94 1794/2821/77 1788/2825/76 +f 1821/2806/95 1788/2825/76 1789/2772/75 +f 1832/2826/53 1839/2827/54 1831/2828/34 +f 1830/2829/55 1837/2830/56 1829/2831/35 +f 1828/2832/57 1835/2833/58 1827/2834/36 +f 1826/2835/59 1833/2836/60 1825/2837/33 +f 1825/2837/33 1840/2838/61 1832/2826/53 +f 1831/2839/34 1838/2840/62 1830/2829/55 +f 1829/2831/35 1836/2841/63 1828/2832/57 +f 1827/2834/36 1834/2842/64 1826/2835/59 +f 1833/2843/60 1842/2844/65 1841/2845/66 +f 1833/2843/60 1847/2846/67 1840/2847/61 +f 1836/2841/63 1845/2848/69 1844/2849/68 +f 1835/2833/58 1842/2844/65 1834/2842/64 +f 1837/2850/56 1846/2851/71 1845/2848/69 +f 1836/2841/63 1843/2852/70 1835/2833/58 +f 1846/2851/71 1852/2853/72 1845/2848/69 +f 1843/2852/70 1851/2854/73 1850/2855/74 +f 1841/2845/66 1849/2856/75 1848/2857/76 +f 1847/2846/67 1848/2857/76 1854/2858/77 +f 1845/2848/69 1851/2854/73 1844/2849/68 +f 1843/2852/70 1849/2856/75 1842/2844/65 +f 1838/2859/62 1839/2860/54 1846/2851/71 +f 1846/2851/71 1839/2860/54 1853/2861/78 +f 1840/2847/61 1847/2846/67 1839/2862/54 +f 1847/2846/67 1854/2858/77 1839/2862/54 +f 1862/2863/57 1869/2864/79 1861/2865/36 +f 1860/2866/59 1867/2867/80 1859/2868/33 +f 1858/2869/53 1865/2870/81 1857/2871/34 +f 1856/2872/55 1863/2873/82 1855/2874/35 +f 1855/2874/35 1870/2875/83 1862/2863/57 +f 1861/2876/36 1868/2877/84 1860/2866/59 +f 1859/2868/33 1866/2878/85 1858/2869/53 +f 1857/2871/34 1864/2879/86 1856/2872/55 +f 1863/2880/82 1872/2881/87 1871/2882/88 +f 1863/2880/82 1877/2883/89 1870/2884/83 +f 1867/2885/80 1874/2886/184 1866/2878/85 +f 1865/2870/81 1872/2881/87 1864/2879/86 +f 1868/2887/84 1875/2888/93 1867/2885/80 +f 1865/2870/81 1874/2886/184 1873/2889/91 +f 1876/2890/92 1882/2891/94 1875/2888/93 +f 1873/2889/91 1881/2892/95 1880/2893/96 +f 1872/2881/87 1878/2894/97 1871/2882/88 +f 1877/2883/89 1878/2894/97 1884/2895/98 +f 1875/2888/93 1881/2892/95 1874/2886/184 +f 1873/2889/91 1879/2896/99 1872/2881/87 +f 1868/2887/84 1869/2897/79 1876/2890/92 +f 1876/2890/92 1869/2897/79 1883/2898/100 +f 1870/2884/83 1877/2883/89 1869/2899/79 +f 1877/2883/89 1884/2895/98 1869/2899/79 +f 1880/2893/96 1849/2856/75 1850/2855/74 +f 1879/2896/99 1850/2855/74 1851/2854/73 +f 1878/2900/97 1851/2854/73 1852/2901/72 +f 1884/2902/98 1852/2901/72 1853/2903/78 +f 1869/2904/79 1853/2903/78 1839/2905/54 +f 1839/2906/54 1883/2907/100 1869/2908/79 +f 1882/2909/94 1854/2910/77 1848/2911/76 +f 1881/2892/95 1848/2911/76 1849/2856/75 +f 1892/2912/53 1899/2913/54 1891/2914/34 +f 1890/2915/55 1897/2916/56 1889/2917/35 +f 1888/2918/57 1895/2919/58 1887/2920/36 +f 1886/2921/59 1893/2922/60 1885/2923/33 +f 1885/2923/33 1900/2924/61 1892/2912/53 +f 1891/2925/34 1898/2926/62 1890/2915/55 +f 1889/2917/35 1896/2927/63 1888/2918/57 +f 1887/2920/36 1894/2928/64 1886/2921/59 +f 1894/2928/64 1901/2929/66 1893/2930/60 +f 1893/2930/60 1907/2931/67 1900/2932/61 +f 1897/2933/56 1904/2934/68 1896/2927/63 +f 1895/2919/58 1902/2935/65 1894/2928/64 +f 1897/2933/56 1906/2936/71 1905/2937/69 +f 1895/2919/58 1904/2934/68 1903/2938/70 +f 1906/2936/71 1912/2939/72 1905/2937/69 +f 1903/2938/70 1911/2940/73 1910/2941/74 +f 1901/2929/66 1909/2942/75 1908/2943/76 +f 1907/2931/67 1908/2943/76 1914/2944/77 +f 1905/2937/69 1911/2940/73 1904/2934/68 +f 1903/2938/70 1909/2942/75 1902/2935/65 +f 1898/2945/62 1899/2946/54 1906/2936/71 +f 1906/2936/71 1899/2946/54 1913/2947/78 +f 1900/2932/61 1907/2931/67 1899/2948/54 +f 1907/2931/67 1914/2944/77 1899/2948/54 +f 1922/2949/57 1929/2950/79 1921/2951/36 +f 1920/2952/59 1927/2953/80 1919/2954/33 +f 1918/2955/53 1925/2956/81 1917/2957/34 +f 1916/2958/55 1923/2959/82 1915/2960/35 +f 1915/2960/35 1930/2961/83 1922/2949/57 +f 1921/2962/36 1928/2963/84 1920/2952/59 +f 1919/2954/33 1926/2964/85 1918/2955/53 +f 1917/2957/34 1924/2965/86 1916/2958/55 +f 1923/2966/82 1932/2967/87 1931/2968/88 +f 1930/2969/83 1931/2968/88 1937/2970/89 +f 1927/2971/80 1934/2972/101 1926/2964/85 +f 1925/2956/81 1932/2967/87 1924/2965/86 +f 1927/2971/80 1936/2973/92 1935/2974/93 +f 1926/2964/85 1933/2975/91 1925/2956/81 +f 1936/2973/92 1942/2976/94 1935/2974/93 +f 1934/2972/101 1940/2977/96 1933/2975/91 +f 1931/2968/88 1939/2978/99 1938/2979/97 +f 1937/2970/89 1938/2979/97 1944/2980/98 +f 1935/2974/93 1941/2981/95 1934/2972/101 +f 1932/2967/87 1940/2977/96 1939/2978/99 +f 1928/2982/84 1929/2983/79 1936/2973/92 +f 1936/2973/92 1929/2983/79 1943/2984/100 +f 1930/2969/83 1937/2970/89 1929/2985/79 +f 1937/2970/89 1944/2980/98 1929/2985/79 +f 1940/2977/96 1909/2942/75 1910/2941/74 +f 1939/2978/99 1910/2941/74 1911/2940/73 +f 1938/2986/97 1911/2940/73 1912/2987/72 +f 1944/2988/98 1912/2987/72 1913/2989/78 +f 1929/2990/79 1913/2989/78 1899/2991/54 +f 1914/2992/77 1929/2993/79 1899/2994/54 +f 1942/2995/94 1914/2992/77 1908/2996/76 +f 1941/2981/95 1908/2996/76 1909/2942/75 +f 1960/2997/53 1967/2998/54 1959/2999/34 +f 1958/3000/55 1965/3001/56 1957/3002/35 +f 1956/3003/57 1963/3004/58 1955/3005/36 +f 1954/3006/59 1961/3007/60 1953/3008/33 +f 1953/3008/33 1968/3009/61 1960/2997/53 +f 1959/3010/34 1966/3011/62 1958/3000/55 +f 1957/3002/35 1964/3012/63 1956/3003/57 +f 1955/3005/36 1962/3013/64 1954/3006/59 +f 1961/3014/60 1970/3015/65 1969/3016/66 +f 1961/3014/60 1975/3017/67 1968/3018/61 +f 1964/3012/63 1973/3019/69 1972/3020/68 +f 1963/3004/58 1970/3015/65 1962/3013/64 +f 1965/3021/56 1974/3022/71 1973/3019/69 +f 1964/3012/63 1971/3023/70 1963/3004/58 +f 1974/3022/71 1980/3024/72 1973/3019/69 +f 1971/3023/70 1979/3025/73 1978/3026/74 +f 1969/3016/66 1977/3027/75 1976/3028/76 +f 1975/3017/67 1976/3028/76 1982/3029/77 +f 1973/3019/69 1979/3025/73 1972/3020/68 +f 1971/3023/70 1977/3027/75 1970/3015/65 +f 1966/3030/62 1967/3031/54 1974/3022/71 +f 1974/3022/71 1967/3031/54 1981/3032/78 +f 1968/3018/61 1975/3017/67 1967/3033/54 +f 1975/3017/67 1982/3029/77 1967/3033/54 +f 1990/3034/57 1997/3035/79 1989/3036/36 +f 1988/3037/59 1995/3038/80 1987/3039/33 +f 1986/3040/53 1993/3041/81 1985/3042/34 +f 1984/3043/55 1991/3044/82 1983/3045/35 +f 1983/3045/35 1998/3046/83 1990/3034/57 +f 1989/3047/36 1996/3048/84 1988/3037/59 +f 1987/3039/33 1994/3049/85 1986/3040/53 +f 1985/3042/34 1992/3050/86 1984/3043/55 +f 1991/3051/82 2000/3052/87 1999/3053/88 +f 1991/3051/82 2005/3054/89 1998/3055/83 +f 1995/3056/80 2002/3057/90 1994/3049/85 +f 1992/3050/86 2001/3058/91 2000/3052/87 +f 1995/3056/80 2004/3059/92 2003/3060/93 +f 1994/3049/85 2001/3058/91 1993/3041/81 +f 2004/3059/92 2010/3061/94 2003/3060/93 +f 2001/3058/91 2009/3062/95 2008/3063/96 +f 1999/3053/88 2007/3064/99 2006/3065/97 +f 2005/3054/89 2006/3065/97 2012/3066/98 +f 2003/3060/93 2009/3062/95 2002/3057/90 +f 2001/3058/91 2007/3064/99 2000/3052/87 +f 1996/3067/84 1997/3068/79 2004/3059/92 +f 2004/3059/92 1997/3068/79 2011/3069/100 +f 1998/3055/83 2005/3054/89 1997/3070/79 +f 2005/3054/89 2012/3066/98 1997/3070/79 +f 2008/3063/96 1977/3027/75 1978/3026/74 +f 2007/3064/99 1978/3026/74 1979/3025/73 +f 2006/3071/97 1979/3025/73 1980/3072/72 +f 2012/3073/98 1980/3072/72 1981/3074/78 +f 1997/3075/79 1981/3074/78 1967/3076/54 +f 1967/3077/54 2011/3078/100 1997/3079/79 +f 2010/3080/94 1982/3081/77 1976/3082/76 +f 2009/3062/95 1976/3082/76 1977/3027/75 +f 2020/3083/53 2027/3084/54 2019/3085/34 +f 2018/3086/55 2025/3087/56 2017/3088/35 +f 2016/3089/57 2023/3090/58 2015/3091/36 +f 2014/3092/59 2021/3093/60 2013/3094/33 +f 2013/3094/33 2028/3095/61 2020/3083/53 +f 2019/3096/34 2026/3097/62 2018/3086/55 +f 2017/3088/35 2024/3098/63 2016/3089/57 +f 2015/3091/36 2022/3099/64 2014/3092/59 +f 2022/3099/64 2029/3100/66 2021/3101/60 +f 2028/3102/61 2029/3100/66 2035/3103/67 +f 2024/3098/63 2033/3104/69 2032/3105/68 +f 2023/3090/58 2030/3106/65 2022/3099/64 +f 2025/3107/56 2034/3108/71 2033/3104/69 +f 2024/3098/63 2031/3109/70 2023/3090/58 +f 2034/3108/71 2040/3110/72 2033/3104/69 +f 2032/3105/68 2038/3111/74 2031/3109/70 +f 2029/3100/66 2037/3112/75 2036/3113/76 +f 2035/3103/67 2036/3113/76 2042/3114/77 +f 2033/3104/69 2039/3115/73 2032/3105/68 +f 2031/3109/70 2037/3112/75 2030/3106/65 +f 2026/3116/62 2027/3117/54 2034/3108/71 +f 2034/3108/71 2027/3117/54 2041/3118/78 +f 2028/3102/61 2035/3103/67 2027/3119/54 +f 2035/3103/67 2042/3114/77 2027/3119/54 +f 2050/3120/57 2057/3121/79 2049/3122/36 +f 2048/3123/59 2055/3124/80 2047/3125/33 +f 2046/3126/53 2053/3127/81 2045/3128/34 +f 2044/3129/55 2051/3130/82 2043/3131/35 +f 2043/3131/35 2058/3132/83 2050/3120/57 +f 2049/3133/36 2056/3134/84 2048/3123/59 +f 2047/3125/33 2054/3135/85 2046/3126/53 +f 2045/3128/34 2052/3136/86 2044/3129/55 +f 2051/3137/82 2060/3138/87 2059/3139/88 +f 2051/3137/82 2065/3140/89 2058/3141/83 +f 2054/3135/85 2063/3142/93 2062/3143/101 +f 2052/3136/86 2061/3144/91 2060/3138/87 +f 2055/3145/80 2064/3146/92 2063/3142/93 +f 2053/3127/81 2062/3143/101 2061/3144/91 +f 2064/3146/92 2070/3147/94 2063/3142/93 +f 2062/3143/101 2068/3148/96 2061/3144/91 +f 2059/3139/88 2067/3149/99 2066/3150/97 +f 2059/3139/88 2072/3151/98 2065/3140/89 +f 2063/3142/93 2069/3152/95 2062/3143/101 +f 2061/3144/91 2067/3149/99 2060/3138/87 +f 2056/3153/84 2057/3154/79 2064/3146/92 +f 2064/3146/92 2057/3154/79 2071/3155/100 +f 2058/3141/83 2065/3140/89 2057/3156/79 +f 2065/3140/89 2072/3151/98 2057/3156/79 +f 2068/3148/96 2037/3112/75 2038/3111/74 +f 2067/3149/99 2038/3111/74 2039/3115/73 +f 2066/3157/97 2039/3115/73 2040/3158/72 +f 2072/3159/98 2040/3158/72 2041/3160/78 +f 2057/3161/79 2041/3160/78 2027/3162/54 +f 2042/3163/77 2057/3164/79 2027/3165/54 +f 2070/3166/94 2042/3163/77 2036/3167/76 +f 2069/3152/95 2036/3167/76 2037/3112/75 +f 2079/3168/31 2086/3169/102 2078/3170/102 +f 2077/3171/35 2084/3172/103 2076/3173/103 +f 2075/3174/32 2081/3175/104 2074/3176/104 +f 2080/3177/105 2087/3178/31 2079/3179/31 +f 2078/3170/102 2085/3180/35 2077/3171/35 +f 2076/3173/103 2083/3181/32 2075/3174/32 +f 2074/3176/104 2082/3182/33 2073/3183/33 +f 2073/3183/33 2088/3184/105 2080/3177/105 +f 2095/3185/31 2102/3186/102 2094/3187/102 +f 2093/3188/35 2100/3189/103 2092/3190/103 +f 2091/3191/32 2097/3192/104 2090/3193/104 +f 2096/3194/105 2103/3195/31 2095/3196/31 +f 2094/3187/102 2101/3197/35 2093/3188/35 +f 2092/3190/103 2099/3198/32 2091/3191/32 +f 2090/3193/104 2098/3199/33 2089/3200/33 +f 2089/3200/33 2104/3201/105 2096/3194/105 +f 269/1852/45 281/1865/45 280/1853/36 +f 276/1855/46 288/1866/46 287/1856/47 +f 266/1858/48 277/1868/48 278/1859/33 +f 273/1861/49 285/1870/49 284/1862/50 +f 270/1864/51 282/1872/51 281/1865/45 +f 265/1860/33 278/1859/33 288/1866/46 +f 267/1867/52 279/1874/52 277/1868/48 +f 274/1869/34 286/1875/34 285/1870/49 +f 271/1871/35 283/1876/35 282/1872/51 +f 268/1873/36 280/3202/36 279/1874/52 +f 275/1857/47 287/1856/47 286/1875/34 +f 272/1863/50 284/1862/50 283/1876/35 +f 292/1877/36 293/1889/45 305/1878/45 +f 300/1880/46 312/1891/46 311/1881/47 +f 290/1883/48 301/1893/48 302/1884/33 +f 297/1886/49 309/1895/49 308/1887/50 +f 293/1889/45 294/1897/51 306/1890/51 +f 289/1885/33 302/1884/33 312/1891/46 +f 291/1892/52 303/1899/52 301/1893/48 +f 298/1894/34 310/1900/34 309/1895/49 +f 295/1896/35 307/1901/35 306/1890/51 +f 292/1898/36 304/3203/36 303/1899/52 +f 298/1894/34 299/1882/47 311/1881/47 +f 296/1888/50 308/1887/50 307/1901/35 +f 317/1902/45 329/1915/45 328/1903/36 +f 324/1905/46 336/1916/46 335/1906/47 +f 314/1908/48 325/1918/48 326/1909/33 +f 321/1911/49 333/1920/49 332/1912/50 +f 318/1914/51 330/1922/51 329/1915/45 +f 313/1910/33 326/1909/33 336/1916/46 +f 315/1917/52 327/1924/52 325/1918/48 +f 322/1919/34 334/1925/34 333/1920/49 +f 319/1921/35 331/1926/35 330/1922/51 +f 316/1923/36 328/3204/36 327/1924/52 +f 323/1907/47 335/1906/47 334/1925/34 +f 320/1913/50 332/1912/50 331/1926/35 +f 341/1927/45 353/1940/45 352/1928/36 +f 348/1930/46 360/1941/46 359/1931/47 +f 338/1933/48 349/1943/48 350/1934/33 +f 345/1936/49 357/1945/49 356/1937/50 +f 342/1939/51 354/1947/51 353/1940/45 +f 337/1935/33 350/1934/33 360/1941/46 +f 338/1933/48 339/1949/52 351/1942/52 +f 346/1944/34 358/1950/34 357/1945/49 +f 343/1946/35 355/1951/35 354/1947/51 +f 340/1948/36 352/3205/36 351/1942/52 +f 346/1944/34 347/1932/47 359/1931/47 +f 344/1938/50 356/1937/50 355/1951/35 +f 392/1952/53 400/1964/61 399/1953/54 +f 390/1955/55 398/1966/62 397/1956/56 +f 388/1958/57 396/1967/63 395/1959/58 +f 386/1961/59 394/1968/64 393/1962/60 +f 385/1963/33 393/1962/60 400/1964/61 +f 391/1965/34 399/3206/54 398/1966/62 +f 389/1957/35 397/1956/56 396/1967/63 +f 387/1960/36 395/1959/58 394/1968/64 +f 393/1969/60 394/1968/64 402/1970/65 +f 393/1969/60 401/1971/66 407/1972/67 +f 397/1974/56 405/1977/69 404/1975/68 +f 395/1959/58 403/1978/70 402/1970/65 +f 398/1976/62 406/1979/71 405/1977/69 +f 396/1967/63 404/1975/68 403/1978/70 +f 406/1979/71 413/1987/78 412/1980/72 +f 403/1978/70 404/1975/68 411/1981/73 +f 401/1971/66 402/1970/65 409/1983/75 +f 407/1972/67 401/1971/66 408/1984/76 +f 405/1977/69 412/1980/72 411/1981/73 +f 403/1978/70 410/1982/74 409/1983/75 +f 422/1989/57 430/2001/83 429/1990/79 +f 420/1992/59 428/2003/84 427/1993/80 +f 418/1995/53 426/2004/85 425/1996/81 +f 416/1998/55 424/2005/86 423/1999/82 +f 415/2000/35 423/1999/82 430/2001/83 +f 421/2002/36 429/3207/79 428/2003/84 +f 419/1994/33 427/1993/80 426/2004/85 +f 417/1997/34 425/1996/81 424/2005/86 +f 423/2006/82 424/2005/86 432/2007/87 +f 423/2006/82 431/2008/88 437/2009/89 +f 427/2011/80 435/2015/93 434/2012/90 +f 424/2005/86 425/1996/81 433/2013/91 +f 427/2011/80 428/2022/84 436/2014/92 +f 426/2004/85 434/2012/90 433/2013/91 +f 436/2014/92 443/2024/100 442/2016/94 +f 433/2013/91 434/2012/90 441/2017/95 +f 432/2007/87 439/2021/99 438/2019/97 +f 431/2008/88 438/2019/97 444/2020/98 +f 435/2015/93 442/2016/94 441/2017/95 +f 433/2013/91 440/2018/96 439/2021/99 +f 440/2018/96 441/2017/95 409/1983/75 +f 439/2021/99 440/2018/96 410/1982/74 +f 438/2026/97 439/2021/99 411/1981/73 +f 444/2028/98 438/2026/97 412/2027/72 +f 429/2030/79 444/2028/98 413/2029/78 +f 399/2032/54 414/2036/77 443/2033/100 +f 442/2035/94 443/2033/100 414/2036/77 +f 441/2017/95 442/2035/94 408/2037/76 +f 452/2038/53 460/2050/61 459/2039/54 +f 450/2041/55 458/2052/62 457/2042/56 +f 448/2044/57 456/2053/63 455/2045/58 +f 446/2047/59 454/2054/64 453/2048/60 +f 445/2049/33 453/2048/60 460/2050/61 +f 451/2051/34 459/3208/54 458/2052/62 +f 449/2043/35 457/2042/56 456/2053/63 +f 447/2046/36 455/2045/58 454/2054/64 +f 453/2055/60 454/2054/64 462/2056/65 +f 453/2055/60 461/2057/66 467/2058/67 +f 456/2053/63 457/2063/56 465/2060/69 +f 454/2054/64 455/2045/58 463/2062/70 +f 457/2063/56 458/2071/62 466/2064/71 +f 455/2045/58 456/2053/63 464/2061/68 +f 466/2064/71 473/2073/78 472/2065/72 +f 464/2061/68 471/2069/73 470/2066/74 +f 462/2056/65 469/2070/75 468/2067/76 +f 467/2058/67 461/2057/66 468/2067/76 +f 465/2060/69 472/2065/72 471/2069/73 +f 463/2062/70 470/2066/74 469/2070/75 +f 482/2075/57 490/2087/83 489/2076/79 +f 480/2078/59 488/2089/84 487/2079/80 +f 478/2081/53 486/2090/85 485/2082/81 +f 476/2084/55 484/2091/86 483/2085/82 +f 475/2086/35 483/2085/82 490/2087/83 +f 481/2088/36 489/3209/79 488/2089/84 +f 479/2080/33 487/2079/80 486/2090/85 +f 477/2083/34 485/2082/81 484/2091/86 +f 483/2092/82 484/2091/86 492/2093/87 +f 483/2092/82 491/2094/88 497/2095/89 +f 487/2097/80 495/2101/93 494/2098/101 +f 484/2091/86 485/2082/81 493/2099/91 +f 487/2097/80 488/2108/84 496/2100/92 +f 486/2090/85 494/2098/101 493/2099/91 +f 496/2100/92 503/2110/100 502/2102/94 +f 494/2098/101 501/2107/95 500/2103/96 +f 491/2094/88 492/2093/87 499/2104/99 +f 497/2095/89 491/2094/88 498/2105/97 +f 494/2098/101 495/2101/93 502/2102/94 +f 493/2099/91 500/2103/96 499/2104/99 +f 500/2103/96 501/2107/95 469/2070/75 +f 471/2069/73 499/2104/99 500/2103/96 +f 498/2112/97 499/2104/99 471/2069/73 +f 504/2114/98 498/2112/97 472/2113/72 +f 489/2116/79 504/2114/98 473/2115/78 +f 459/2118/54 474/2122/77 503/2119/100 +f 502/2121/94 503/2119/100 474/2122/77 +f 501/2107/95 502/2121/94 468/2123/76 +f 511/2124/31 519/3210/31 518/2125/102 +f 509/2127/35 517/2136/35 516/2128/103 +f 507/2130/32 515/2137/32 513/2131/104 +f 512/2133/105 520/2140/105 519/2134/31 +f 510/2126/102 518/2125/102 517/2136/35 +f 508/2129/103 516/2128/103 515/2137/32 +f 506/2132/104 513/2131/104 514/2138/33 +f 505/2139/33 514/2138/33 520/2140/105 +f 580/2141/32 604/2151/32 603/2142/41 +f 587/2144/39 611/2153/39 610/2145/31 +f 584/2147/40 608/2158/40 607/2148/35 +f 581/2150/38 605/2160/38 604/2151/32 +f 588/2152/43 612/2161/43 611/2153/39 +f 578/2154/37 602/2162/37 601/2155/33 +f 585/2157/44 609/2164/44 608/2158/40 +f 582/2159/42 606/2165/42 605/2160/38 +f 577/2156/33 601/2155/33 612/2161/43 +f 579/2143/41 603/2142/41 602/2162/37 +f 586/2163/31 610/2202/31 609/2164/44 +f 583/2149/35 607/2148/35 606/2165/42 +f 613/2166/33 614/2177/37 590/2167/37 +f 620/2169/40 621/2179/44 597/2170/44 +f 617/2172/38 618/2181/42 594/2173/42 +f 624/2175/43 613/2166/33 589/2168/33 +f 614/2177/37 615/2183/41 591/2178/41 +f 621/2179/44 622/2240/31 598/2180/31 +f 618/2181/42 619/2188/35 595/2182/35 +f 615/2183/41 616/2189/32 592/2184/32 +f 622/2185/31 623/2190/39 599/2186/39 +f 619/2188/35 620/2169/40 596/2171/40 +f 616/2189/32 617/2172/38 593/2174/38 +f 623/2190/39 624/2175/43 600/2176/43 +f 626/507/106 627/509/107 579/2143/107 +f 627/539/107 628/538/70 580/2141/70 +f 580/2141/70 628/537/70 629/536/108 +f 629/534/108 630/533/109 582/2159/109 +f 630/530/109 631/531/57 583/2149/57 +f 583/2149/57 631/529/57 632/528/110 +f 632/524/110 633/526/111 585/2157/111 +f 633/521/111 634/523/79 586/2163/79 +f 634/518/79 635/520/112 587/2144/112 +f 635/515/112 636/517/113 588/2152/113 +f 588/2152/113 636/513/113 625/514/59 +f 577/2156/59 625/512/59 626/511/106 +f 601/2155/53 602/2162/114 638/2191/114 +f 603/2142/115 639/3211/115 638/2193/114 +f 604/2151/91 640/3212/91 639/2194/115 +f 604/2151/91 605/2160/116 641/2195/116 +f 606/2165/117 642/3213/117 641/2197/116 +f 607/2148/55 643/3214/55 642/2198/117 +f 607/2148/55 608/2158/118 644/2199/118 +f 609/2164/119 645/3215/119 644/2201/118 +f 610/2202/54 646/3216/54 645/2203/119 +f 611/2153/120 647/3217/120 646/2204/54 +f 612/2161/121 648/3218/121 647/2205/120 +f 601/2155/53 637/3219/53 648/2206/121 +f 658/1665/31 670/559/31 671/558/39 +f 655/527/35 667/550/35 668/552/40 +f 652/535/32 664/544/32 665/546/38 +f 659/519/39 671/558/39 672/561/43 +f 649/510/33 661/563/33 662/542/37 +f 656/1666/40 668/552/40 669/554/44 +f 653/532/38 665/546/38 666/548/42 +f 660/516/43 672/561/43 661/563/33 +f 650/1664/37 662/542/37 663/541/41 +f 657/525/44 669/554/44 670/556/31 +f 654/1667/42 666/548/42 667/550/35 +f 651/508/41 663/541/41 664/544/32 +f 706/1681/31 718/617/31 719/616/39 +f 703/585/35 715/608/35 716/610/40 +f 700/593/32 712/602/32 713/604/38 +f 707/577/39 719/616/39 720/619/43 +f 697/568/33 709/621/33 710/600/37 +f 704/1682/40 716/610/40 717/612/44 +f 701/590/38 713/604/38 714/606/42 +f 708/574/43 720/619/43 709/621/33 +f 698/1680/37 710/600/37 711/599/41 +f 705/583/44 717/612/44 718/614/31 +f 702/1683/42 714/606/42 715/608/35 +f 699/566/41 711/599/41 712/602/32 +f 591/2178/115 723/1684/115 722/598/114 +f 592/2184/91 724/1685/91 723/601/115 +f 592/2184/91 593/2174/116 725/1686/116 +f 594/2173/117 726/605/117 725/1687/116 +f 595/2182/55 727/1688/55 726/607/117 +f 595/2182/55 596/2171/118 728/609/118 +f 597/2170/119 729/1690/119 728/611/118 +f 598/2180/54 730/1691/54 729/613/119 +f 599/2186/120 731/1692/120 730/615/54 +f 600/2176/121 732/1693/121 731/618/120 +f 600/2176/121 589/2168/53 721/1694/53 +f 589/2168/53 590/2167/114 722/622/114 +f 686/2207/37 687/2210/41 675/2208/41 +f 687/2210/41 688/2212/32 676/2211/32 +f 688/2212/32 689/2214/38 677/2213/38 +f 689/2214/38 690/2216/42 678/2215/42 +f 690/2216/42 691/2218/35 679/2217/35 +f 691/2218/35 692/2220/40 680/2219/40 +f 692/2220/40 693/2222/44 681/2221/44 +f 693/2222/44 694/3220/31 682/2223/31 +f 694/2224/31 695/2227/39 683/2225/39 +f 695/2227/39 696/2229/43 684/2228/43 +f 696/2229/43 685/2231/33 673/2230/33 +f 685/2231/33 686/2207/37 674/2209/37 +f 614/2177/106 734/3221/106 735/2232/107 +f 735/2233/107 736/3222/70 616/2189/70 +f 616/2189/70 736/3223/70 737/2234/108 +f 737/2235/108 738/3224/109 618/2181/109 +f 738/2236/109 739/3225/57 619/2188/57 +f 619/2188/57 739/3226/57 740/2237/110 +f 740/2238/110 741/3227/111 621/2179/111 +f 741/2239/111 742/3228/79 622/2240/79 +f 742/2241/79 743/3229/112 623/2190/112 +f 743/2242/112 744/3230/113 624/2175/113 +f 744/2243/113 733/3231/59 613/2166/59 +f 613/2166/59 733/3232/59 734/2244/106 +f 784/2245/59 792/2257/125 791/2246/105 +f 782/2248/53 790/2259/126 789/2249/122 +f 780/2251/55 788/2260/127 787/2252/123 +f 778/2254/57 786/2261/128 785/2255/124 +f 777/2256/36 785/2255/124 792/2257/125 +f 783/2258/33 791/3233/105 790/2259/126 +f 781/2250/34 789/2249/122 788/2260/127 +f 779/2253/35 787/2252/123 786/2261/128 +f 786/2261/128 794/2268/133 793/2262/129 +f 785/2263/124 793/2262/129 799/2264/130 +f 788/2260/127 789/2269/122 797/2266/131 +f 787/2252/123 795/2271/103 794/2268/133 +f 789/2269/122 790/2278/126 798/2270/134 +f 787/2252/123 788/2260/127 796/2267/132 +f 798/2270/134 805/2280/141 804/2272/135 +f 795/2271/103 796/2267/132 803/2273/136 +f 793/2262/129 794/2268/133 801/2275/138 +f 799/2264/130 793/2262/129 800/2276/139 +f 797/2266/131 804/2272/135 803/2273/136 +f 795/2271/103 802/2274/137 801/2275/138 +f 814/2282/142 822/2294/152 821/2283/102 +f 812/2285/144 820/2296/153 819/2286/145 +f 810/2288/147 818/2297/154 817/2289/148 +f 808/2291/150 816/2298/155 815/2292/151 +f 807/2293/91 815/2292/151 822/2294/152 +f 813/2295/143 821/3234/102 820/2296/153 +f 811/2287/146 819/2286/145 818/2297/154 +f 809/2290/149 817/2289/148 816/2298/155 +f 815/2299/151 816/2298/155 824/2300/156 +f 815/2299/151 823/2301/157 829/2302/158 +f 819/2304/145 827/2307/161 826/2305/159 +f 817/2289/148 825/2308/104 824/2300/156 +f 819/2304/145 820/2315/153 828/2306/160 +f 818/2297/154 826/2305/159 825/2308/104 +f 828/2306/160 835/2317/168 834/2309/162 +f 825/2308/104 826/2305/159 833/2310/163 +f 823/2301/157 824/2300/156 831/2312/165 +f 829/2302/158 823/2301/157 830/2313/166 +f 827/2307/161 834/2309/162 833/2310/163 +f 825/2308/104 832/2311/164 831/2312/165 +f 832/2311/164 833/2310/163 801/2275/138 +f 831/2312/165 832/2311/164 802/2274/137 +f 830/2319/166 831/2312/165 803/2273/136 +f 836/2321/167 830/2319/166 804/2320/135 +f 821/2323/102 836/2321/167 805/2322/141 +f 806/2325/140 835/3235/168 821/2326/102 +f 834/2328/162 835/3235/168 806/2325/140 +f 833/2310/163 834/2328/162 800/2329/139 +f 844/2330/59 852/2342/125 851/2331/105 +f 842/2333/53 850/2344/126 849/2334/122 +f 840/2336/55 848/2345/127 847/2337/123 +f 838/2339/57 846/2346/128 845/2340/124 +f 837/2341/36 845/2340/124 852/2342/125 +f 843/2343/33 851/3236/105 850/2344/126 +f 841/2335/34 849/2334/122 848/2345/127 +f 839/2338/35 847/2337/123 846/2346/128 +f 846/2346/128 854/2353/169 853/2347/129 +f 845/2348/124 853/2347/129 859/2349/130 +f 849/2351/122 857/2355/131 856/2352/132 +f 847/2337/123 855/2356/103 854/2353/169 +f 849/2351/122 850/2363/126 858/2354/134 +f 848/2345/127 856/2352/132 855/2356/103 +f 858/2354/134 865/2365/141 864/2357/135 +f 856/2352/132 863/2362/136 862/2358/137 +f 853/2347/129 854/2353/169 861/2359/138 +f 859/2349/130 853/2347/129 860/2360/139 +f 857/2355/131 864/2357/135 863/2362/136 +f 855/2356/103 862/2358/137 861/2359/138 +f 874/2367/142 882/2379/152 881/2368/102 +f 872/2370/144 880/2381/153 879/2371/145 +f 870/2373/147 878/2382/154 877/2374/148 +f 868/2376/150 876/2383/155 875/2377/151 +f 867/2378/91 875/2377/151 882/2379/152 +f 873/2380/143 881/3237/102 880/2381/153 +f 871/2372/146 879/2371/145 878/2382/154 +f 869/2375/149 877/2374/148 876/2383/155 +f 876/2383/155 884/2390/170 883/2384/157 +f 875/2385/151 883/2384/157 889/2386/158 +f 879/2388/145 887/2392/161 886/2389/159 +f 877/2374/148 885/2393/104 884/2390/170 +f 879/2388/145 880/2400/153 888/2391/160 +f 877/2374/148 878/2382/154 886/2389/159 +f 888/2391/160 895/2402/168 894/2394/162 +f 886/2389/159 893/2399/163 892/2395/164 +f 883/2384/157 884/2390/170 891/2396/165 +f 889/2386/158 883/2384/157 890/2397/166 +f 887/2392/161 894/2394/162 893/2399/163 +f 884/2390/170 885/2393/104 892/2395/164 +f 892/2395/164 893/2399/163 861/2359/138 +f 891/2396/165 892/2395/164 862/2358/137 +f 890/2404/166 891/2396/165 863/2362/136 +f 896/2406/167 890/2404/166 864/2405/135 +f 881/2408/102 896/2406/167 865/2407/141 +f 866/2410/140 895/3238/168 881/2411/102 +f 894/2413/162 895/3238/168 866/2410/140 +f 893/2399/163 894/2413/162 860/2414/139 +f 813/2415/143 902/2437/176 903/2416/171 +f 873/2418/143 909/2449/176 910/2419/171 +f 810/2288/147 899/2436/172 900/2421/79 +f 871/2372/146 870/2373/147 906/2422/172 +f 811/2287/146 900/2421/79 901/2424/173 +f 871/2372/146 907/2423/79 908/2425/173 +f 809/2426/149 808/2456/150 897/2427/174 +f 868/2429/150 904/2454/174 905/2430/175 +f 812/2285/144 901/2424/173 902/2432/176 +f 872/2370/144 908/2425/173 909/2434/176 +f 809/2426/149 898/2428/175 899/2436/172 +f 869/2431/149 905/2430/175 906/2422/172 +f 902/2437/176 916/3239/182 917/2438/177 +f 899/2436/172 913/2451/183 914/2439/178 +f 907/2423/79 921/2452/178 922/2440/179 +f 905/2430/175 904/2454/174 918/2441/180 +f 900/2421/79 914/2439/178 915/2443/179 +f 909/2434/176 908/2425/173 922/2440/179 +f 898/2428/175 897/2427/174 911/2445/180 +f 905/2430/175 919/2442/181 920/2447/183 +f 902/2432/176 901/2424/173 915/2443/179 +f 909/2449/176 923/3240/182 924/2450/177 +f 898/2428/175 912/2446/181 913/2451/183 +f 907/2423/79 906/2422/172 920/2447/183 +f 920/2447/183 936/2483/105 937/2457/31 +f 912/2458/181 928/2484/33 929/2459/105 +f 807/2460/91 925/2469/32 927/2461/104 +f 921/2452/178 937/2457/31 938/2463/102 +f 913/2451/183 929/2459/105 930/2464/31 +f 923/2465/182 922/2440/179 938/2463/102 +f 914/2439/178 930/2464/31 931/2467/102 +f 807/2460/91 917/2479/177 933/2468/103 +f 923/2470/182 939/3241/35 940/2471/103 +f 916/2473/182 915/2443/179 931/2467/102 +f 867/2475/91 926/2482/32 934/2476/104 +f 916/2478/182 932/3242/35 933/2468/103 +f 919/2480/181 918/2477/180 934/2476/104 +f 867/2475/91 924/2472/177 940/2471/103 +f 919/2480/181 935/2481/33 936/2483/105 +f 912/2458/181 911/2462/180 927/2461/104 +f 1138/2485/80 1139/2524/84 1156/2486/92 +f 1146/2488/80 1147/2528/84 1149/2489/92 +f 1136/2491/81 1159/2498/91 1160/2492/87 +f 1144/2494/81 1152/2500/91 1153/2495/87 +f 1137/2497/85 1158/2510/101 1159/2498/91 +f 1145/2499/85 1151/2509/101 1152/2500/91 +f 1134/2501/82 1161/2508/88 1162/2502/89 +f 1142/2504/82 1154/2507/88 1155/2505/89 +f 1142/2504/82 1143/2496/86 1153/2495/87 +f 1135/2493/86 1160/2492/87 1161/2508/88 +f 1145/2499/85 1146/2488/80 1150/2490/93 +f 1137/2497/85 1138/2485/80 1157/2487/93 +f 1155/2505/89 1154/2507/88 1168/2511/97 +f 1151/2509/101 1165/2521/95 1166/2513/96 +f 1159/2498/91 1173/2522/96 1174/2514/99 +f 1156/2486/92 1170/2525/100 1171/2515/94 +f 1152/2500/91 1166/2513/96 1167/2516/99 +f 1161/2508/88 1160/2492/87 1174/2514/99 +f 1149/2489/92 1163/2529/100 1164/2518/94 +f 1158/2510/101 1157/2487/93 1171/2515/94 +f 1154/2507/88 1153/2495/87 1167/2516/99 +f 1162/2502/89 1161/2508/88 1175/2517/97 +f 1151/2509/101 1150/2490/93 1164/2518/94 +f 1158/2510/101 1172/2519/95 1173/2522/96 +f 1172/2519/95 1188/2557/104 1189/2531/32 +f 1164/2532/94 1180/2558/33 1181/2533/104 +f 1148/2534/79 1177/3243/31 1179/2535/105 +f 1173/2522/96 1189/2531/32 1190/2537/103 +f 1165/2521/95 1181/2533/104 1182/2538/32 +f 1174/2514/99 1190/2537/103 1191/2539/35 +f 1166/2513/96 1182/2538/32 1183/2541/103 +f 1169/2542/98 1185/2552/102 1177/2543/31 +f 1175/2540/97 1191/2539/35 1192/2545/102 +f 1167/2516/99 1183/2541/103 1184/2547/35 +f 1140/2549/79 1178/3244/31 1186/2550/105 +f 1168/2548/97 1184/2547/35 1185/2552/102 +f 1170/2551/100 1186/2550/105 1187/2553/33 +f 1176/2546/98 1192/2545/102 1178/2555/31 +f 1171/2554/94 1187/2553/33 1188/2557/104 +f 1163/2536/100 1179/2535/105 1180/2558/33 +f 1145/2499/85 1205/2585/53 1206/2559/33 +f 1138/2561/80 1198/2586/33 1199/2562/59 +f 1146/2560/80 1206/2559/33 1207/2564/59 +f 1139/2563/84 1199/2562/59 1200/2566/36 +f 1140/2568/79 1200/3245/36 1193/2569/57 +f 1147/2565/84 1207/2564/59 1208/2571/36 +f 1148/2573/79 1208/3246/36 1201/2574/57 +f 1133/2570/83 1193/2569/57 1194/2576/35 +f 1141/2575/83 1201/2574/57 1202/2578/35 +f 1134/2577/82 1194/2576/35 1195/2580/55 +f 1142/2579/82 1202/2578/35 1203/2581/55 +f 1135/2493/86 1195/2580/55 1196/2582/34 +f 1143/2496/86 1203/2581/55 1204/2583/34 +f 1136/2491/81 1196/2582/34 1197/2584/53 +f 1144/2494/81 1204/2583/34 1205/2585/53 +f 1137/2497/85 1197/2584/53 1198/2586/33 +f 1219/2587/36 1220/2598/79 1212/2588/79 +f 1217/2590/32 1218/2600/70 1210/2591/70 +f 1224/2593/91 1217/2590/32 1209/2592/32 +f 1222/2595/54 1223/2601/34 1215/2596/34 +f 1220/2598/79 1221/3247/31 1213/2599/31 +f 1218/2600/70 1219/2587/36 1211/2589/36 +f 1223/2601/34 1224/2593/91 1216/2594/91 +f 1221/2602/31 1222/2595/54 1214/2597/54 +f 1235/2604/36 1236/2615/79 1228/2605/79 +f 1233/2607/32 1234/2617/70 1226/2608/70 +f 1240/2610/91 1233/2607/32 1225/2609/32 +f 1238/2612/54 1239/2618/34 1231/2613/34 +f 1236/2615/79 1237/3248/31 1229/2616/31 +f 1234/2617/70 1235/2604/36 1227/2606/36 +f 1239/2618/34 1240/2610/91 1232/2611/91 +f 1237/2619/31 1238/2612/54 1230/2614/54 +f 1251/2621/36 1252/2632/79 1244/2622/79 +f 1249/2624/32 1250/2634/70 1242/2625/70 +f 1256/2627/91 1249/2624/32 1241/2626/32 +f 1254/2629/54 1255/2635/34 1247/2630/34 +f 1252/2632/79 1253/3249/31 1245/2633/31 +f 1250/2634/70 1251/2621/36 1243/2623/36 +f 1255/2635/34 1256/2627/91 1248/2628/91 +f 1253/2636/31 1254/2629/54 1246/2631/54 +f 1267/2638/36 1268/2649/79 1260/2639/79 +f 1265/2641/32 1266/2651/70 1258/2642/70 +f 1272/2644/91 1265/2641/32 1257/2643/32 +f 1270/2646/54 1271/2652/34 1263/2647/34 +f 1268/2649/79 1269/3250/31 1261/2650/31 +f 1266/2651/70 1267/2638/36 1259/2640/36 +f 1271/2652/34 1272/2644/91 1264/2645/91 +f 1269/2653/31 1270/2646/54 1262/2648/54 +f 1712/2655/53 1720/2667/61 1719/2656/54 +f 1710/2658/55 1718/2669/62 1717/2659/56 +f 1708/2661/57 1716/2670/63 1715/2662/58 +f 1706/2664/59 1714/2671/64 1713/2665/60 +f 1705/2666/33 1713/2665/60 1720/2667/61 +f 1711/2668/34 1719/3251/54 1718/2669/62 +f 1709/2660/35 1717/2659/56 1716/2670/63 +f 1707/2663/36 1715/2662/58 1714/2671/64 +f 1713/2672/60 1714/2671/64 1722/2673/65 +f 1713/2672/60 1721/2674/66 1727/2675/67 +f 1716/2670/63 1717/2680/56 1725/2677/69 +f 1715/2662/58 1723/2681/70 1722/2673/65 +f 1718/2679/62 1726/2682/71 1725/2677/69 +f 1715/2662/58 1716/2670/63 1724/2678/68 +f 1726/2682/71 1733/2690/78 1732/2683/72 +f 1723/2681/70 1724/2678/68 1731/2684/73 +f 1721/2674/66 1722/2673/65 1729/2686/75 +f 1727/2675/67 1721/2674/66 1728/2687/76 +f 1725/2677/69 1732/2683/72 1731/2684/73 +f 1723/2681/70 1730/2685/74 1729/2686/75 +f 1742/2692/57 1750/2704/83 1749/2693/79 +f 1740/2695/59 1748/2706/84 1747/2696/80 +f 1738/2698/53 1746/2707/85 1745/2699/81 +f 1736/2701/55 1744/2708/86 1743/2702/82 +f 1735/2703/35 1743/2702/82 1750/2704/83 +f 1741/2705/36 1749/3252/79 1748/2706/84 +f 1739/2697/33 1747/2696/80 1746/2707/85 +f 1737/2700/34 1745/2699/81 1744/2708/86 +f 1743/2709/82 1744/2708/86 1752/2710/87 +f 1743/2709/82 1751/2711/88 1757/2712/89 +f 1746/2707/85 1747/2717/80 1755/2714/93 +f 1745/2699/81 1753/2718/91 1752/2710/87 +f 1748/2716/84 1756/2719/92 1755/2714/93 +f 1745/2699/81 1746/2707/85 1754/2715/101 +f 1756/2719/92 1763/2727/100 1762/2720/94 +f 1754/2715/101 1761/2725/95 1760/2721/96 +f 1751/2711/88 1752/2710/87 1759/2722/99 +f 1757/2712/89 1751/2711/88 1758/2723/97 +f 1755/2714/93 1762/2720/94 1761/2725/95 +f 1753/2718/91 1760/2721/96 1759/2722/99 +f 1760/2721/96 1761/2725/95 1729/2686/75 +f 1759/2722/99 1760/2721/96 1730/2685/74 +f 1758/2729/97 1759/2722/99 1731/2684/73 +f 1764/2731/98 1758/2729/97 1732/2730/72 +f 1749/2733/79 1764/2731/98 1733/2732/78 +f 1719/2735/54 1734/2739/77 1763/2736/100 +f 1762/2738/94 1763/2736/100 1734/2739/77 +f 1761/2725/95 1762/2738/94 1728/2740/76 +f 1772/2741/53 1780/2753/61 1779/2742/54 +f 1770/2744/55 1778/2755/62 1777/2745/56 +f 1768/2747/57 1776/2756/63 1775/2748/58 +f 1766/2750/59 1774/2757/64 1773/2751/60 +f 1765/2752/33 1773/2751/60 1780/2753/61 +f 1771/2754/34 1779/3253/54 1778/2755/62 +f 1769/2746/35 1777/2745/56 1776/2756/63 +f 1767/2749/36 1775/2748/58 1774/2757/64 +f 1773/2758/60 1774/2757/64 1782/2759/65 +f 1773/2758/60 1781/2760/66 1787/2761/67 +f 1776/2756/63 1777/2766/56 1785/2763/69 +f 1775/2748/58 1783/2767/70 1782/2759/65 +f 1778/2765/62 1786/2768/71 1785/2763/69 +f 1775/2748/58 1776/2756/63 1784/2764/68 +f 1786/2768/71 1793/2776/78 1792/2769/72 +f 1783/2767/70 1784/2764/68 1791/2770/73 +f 1781/2760/66 1782/2759/65 1789/2772/75 +f 1787/2761/67 1781/2760/66 1788/2773/76 +f 1785/2763/69 1792/2769/72 1791/2770/73 +f 1783/2767/70 1790/2771/74 1789/2772/75 +f 1802/2778/57 1810/2790/83 1809/2779/79 +f 1800/2781/59 1808/2792/84 1807/2782/80 +f 1798/2784/53 1806/2793/85 1805/2785/81 +f 1796/2787/55 1804/2794/86 1803/2788/82 +f 1795/2789/35 1803/2788/82 1810/2790/83 +f 1801/2791/36 1809/3254/79 1808/2792/84 +f 1799/2783/33 1807/2782/80 1806/2793/85 +f 1797/2786/34 1805/2785/81 1804/2794/86 +f 1803/2795/82 1804/2794/86 1812/2796/87 +f 1803/2795/82 1811/2797/88 1817/2798/89 +f 1806/2793/85 1807/2803/80 1815/2800/93 +f 1804/2794/86 1805/2785/81 1813/2802/91 +f 1807/2803/80 1808/2811/84 1816/2804/92 +f 1806/2793/85 1814/2801/101 1813/2802/91 +f 1816/2804/92 1823/2813/100 1822/2805/94 +f 1813/2802/91 1814/2801/101 1821/2806/95 +f 1811/2797/88 1812/2796/87 1819/2808/99 +f 1817/2798/89 1811/2797/88 1818/2809/97 +f 1815/2800/93 1822/2805/94 1821/2806/95 +f 1813/2802/91 1820/2807/96 1819/2808/99 +f 1820/2807/96 1821/2806/95 1789/2772/75 +f 1791/2770/73 1819/2808/99 1820/2807/96 +f 1818/2815/97 1819/2808/99 1791/2770/73 +f 1824/2817/98 1818/2815/97 1792/2816/72 +f 1809/2819/79 1824/2817/98 1793/2818/78 +f 1794/2821/77 1823/3255/100 1809/2822/79 +f 1822/2824/94 1823/3255/100 1794/2821/77 +f 1821/2806/95 1822/2824/94 1788/2825/76 +f 1832/2826/53 1840/2838/61 1839/2827/54 +f 1830/2829/55 1838/2840/62 1837/2830/56 +f 1828/2832/57 1836/2841/63 1835/2833/58 +f 1826/2835/59 1834/2842/64 1833/2836/60 +f 1825/2837/33 1833/2836/60 1840/2838/61 +f 1831/2839/34 1839/3256/54 1838/2840/62 +f 1829/2831/35 1837/2830/56 1836/2841/63 +f 1827/2834/36 1835/2833/58 1834/2842/64 +f 1833/2843/60 1834/2842/64 1842/2844/65 +f 1833/2843/60 1841/2845/66 1847/2846/67 +f 1836/2841/63 1837/2850/56 1845/2848/69 +f 1835/2833/58 1843/2852/70 1842/2844/65 +f 1837/2850/56 1838/2859/62 1846/2851/71 +f 1836/2841/63 1844/2849/68 1843/2852/70 +f 1846/2851/71 1853/2861/78 1852/2853/72 +f 1843/2852/70 1844/2849/68 1851/2854/73 +f 1841/2845/66 1842/2844/65 1849/2856/75 +f 1847/2846/67 1841/2845/66 1848/2857/76 +f 1845/2848/69 1852/2853/72 1851/2854/73 +f 1843/2852/70 1850/2855/74 1849/2856/75 +f 1862/2863/57 1870/2875/83 1869/2864/79 +f 1860/2866/59 1868/2877/84 1867/2867/80 +f 1858/2869/53 1866/2878/85 1865/2870/81 +f 1856/2872/55 1864/2879/86 1863/2873/82 +f 1855/2874/35 1863/2873/82 1870/2875/83 +f 1861/2876/36 1869/3257/79 1868/2877/84 +f 1859/2868/33 1867/2867/80 1866/2878/85 +f 1857/2871/34 1865/2870/81 1864/2879/86 +f 1863/2880/82 1864/2879/86 1872/2881/87 +f 1863/2880/82 1871/2882/88 1877/2883/89 +f 1867/2885/80 1875/2888/93 1874/2886/184 +f 1865/2870/81 1873/2889/91 1872/2881/87 +f 1868/2887/84 1876/2890/92 1875/2888/93 +f 1865/2870/81 1866/2878/85 1874/2886/184 +f 1876/2890/92 1883/2898/100 1882/2891/94 +f 1873/2889/91 1874/2886/184 1881/2892/95 +f 1872/2881/87 1879/2896/99 1878/2894/97 +f 1877/2883/89 1871/2882/88 1878/2894/97 +f 1875/2888/93 1882/2891/94 1881/2892/95 +f 1873/2889/91 1880/2893/96 1879/2896/99 +f 1880/2893/96 1881/2892/95 1849/2856/75 +f 1879/2896/99 1880/2893/96 1850/2855/74 +f 1878/2900/97 1879/2896/99 1851/2854/73 +f 1884/2902/98 1878/2900/97 1852/2901/72 +f 1869/2904/79 1884/2902/98 1853/2903/78 +f 1839/2906/54 1854/2910/77 1883/2907/100 +f 1882/2909/94 1883/2907/100 1854/2910/77 +f 1881/2892/95 1882/2909/94 1848/2911/76 +f 1892/2912/53 1900/2924/61 1899/2913/54 +f 1890/2915/55 1898/2926/62 1897/2916/56 +f 1888/2918/57 1896/2927/63 1895/2919/58 +f 1886/2921/59 1894/2928/64 1893/2922/60 +f 1885/2923/33 1893/2922/60 1900/2924/61 +f 1891/2925/34 1899/3258/54 1898/2926/62 +f 1889/2917/35 1897/2916/56 1896/2927/63 +f 1887/2920/36 1895/2919/58 1894/2928/64 +f 1894/2928/64 1902/2935/65 1901/2929/66 +f 1893/2930/60 1901/2929/66 1907/2931/67 +f 1897/2933/56 1905/2937/69 1904/2934/68 +f 1895/2919/58 1903/2938/70 1902/2935/65 +f 1897/2933/56 1898/2945/62 1906/2936/71 +f 1895/2919/58 1896/2927/63 1904/2934/68 +f 1906/2936/71 1913/2947/78 1912/2939/72 +f 1903/2938/70 1904/2934/68 1911/2940/73 +f 1901/2929/66 1902/2935/65 1909/2942/75 +f 1907/2931/67 1901/2929/66 1908/2943/76 +f 1905/2937/69 1912/2939/72 1911/2940/73 +f 1903/2938/70 1910/2941/74 1909/2942/75 +f 1922/2949/57 1930/2961/83 1929/2950/79 +f 1920/2952/59 1928/2963/84 1927/2953/80 +f 1918/2955/53 1926/2964/85 1925/2956/81 +f 1916/2958/55 1924/2965/86 1923/2959/82 +f 1915/2960/35 1923/2959/82 1930/2961/83 +f 1921/2962/36 1929/3259/79 1928/2963/84 +f 1919/2954/33 1927/2953/80 1926/2964/85 +f 1917/2957/34 1925/2956/81 1924/2965/86 +f 1923/2966/82 1924/2965/86 1932/2967/87 +f 1930/2969/83 1923/2966/82 1931/2968/88 +f 1927/2971/80 1935/2974/93 1934/2972/101 +f 1925/2956/81 1933/2975/91 1932/2967/87 +f 1927/2971/80 1928/2982/84 1936/2973/92 +f 1926/2964/85 1934/2972/101 1933/2975/91 +f 1936/2973/92 1943/2984/100 1942/2976/94 +f 1934/2972/101 1941/2981/95 1940/2977/96 +f 1931/2968/88 1932/2967/87 1939/2978/99 +f 1937/2970/89 1931/2968/88 1938/2979/97 +f 1935/2974/93 1942/2976/94 1941/2981/95 +f 1932/2967/87 1933/2975/91 1940/2977/96 +f 1940/2977/96 1941/2981/95 1909/2942/75 +f 1939/2978/99 1940/2977/96 1910/2941/74 +f 1938/2986/97 1939/2978/99 1911/2940/73 +f 1944/2988/98 1938/2986/97 1912/2987/72 +f 1929/2990/79 1944/2988/98 1913/2989/78 +f 1914/2992/77 1943/3260/100 1929/2993/79 +f 1942/2995/94 1943/3260/100 1914/2992/77 +f 1941/2981/95 1942/2995/94 1908/2996/76 +f 1960/2997/53 1968/3009/61 1967/2998/54 +f 1958/3000/55 1966/3011/62 1965/3001/56 +f 1956/3003/57 1964/3012/63 1963/3004/58 +f 1954/3006/59 1962/3013/64 1961/3007/60 +f 1953/3008/33 1961/3007/60 1968/3009/61 +f 1959/3010/34 1967/3261/54 1966/3011/62 +f 1957/3002/35 1965/3001/56 1964/3012/63 +f 1955/3005/36 1963/3004/58 1962/3013/64 +f 1961/3014/60 1962/3013/64 1970/3015/65 +f 1961/3014/60 1969/3016/66 1975/3017/67 +f 1964/3012/63 1965/3021/56 1973/3019/69 +f 1963/3004/58 1971/3023/70 1970/3015/65 +f 1965/3021/56 1966/3030/62 1974/3022/71 +f 1964/3012/63 1972/3020/68 1971/3023/70 +f 1974/3022/71 1981/3032/78 1980/3024/72 +f 1971/3023/70 1972/3020/68 1979/3025/73 +f 1969/3016/66 1970/3015/65 1977/3027/75 +f 1975/3017/67 1969/3016/66 1976/3028/76 +f 1973/3019/69 1980/3024/72 1979/3025/73 +f 1971/3023/70 1978/3026/74 1977/3027/75 +f 1990/3034/57 1998/3046/83 1997/3035/79 +f 1988/3037/59 1996/3048/84 1995/3038/80 +f 1986/3040/53 1994/3049/85 1993/3041/81 +f 1984/3043/55 1992/3050/86 1991/3044/82 +f 1983/3045/35 1991/3044/82 1998/3046/83 +f 1989/3047/36 1997/3262/79 1996/3048/84 +f 1987/3039/33 1995/3038/80 1994/3049/85 +f 1985/3042/34 1993/3041/81 1992/3050/86 +f 1991/3051/82 1992/3050/86 2000/3052/87 +f 1991/3051/82 1999/3053/88 2005/3054/89 +f 1995/3056/80 2003/3060/93 2002/3057/90 +f 1992/3050/86 1993/3041/81 2001/3058/91 +f 1995/3056/80 1996/3067/84 2004/3059/92 +f 1994/3049/85 2002/3057/90 2001/3058/91 +f 2004/3059/92 2011/3069/100 2010/3061/94 +f 2001/3058/91 2002/3057/90 2009/3062/95 +f 1999/3053/88 2000/3052/87 2007/3064/99 +f 2005/3054/89 1999/3053/88 2006/3065/97 +f 2003/3060/93 2010/3061/94 2009/3062/95 +f 2001/3058/91 2008/3063/96 2007/3064/99 +f 2008/3063/96 2009/3062/95 1977/3027/75 +f 2007/3064/99 2008/3063/96 1978/3026/74 +f 2006/3071/97 2007/3064/99 1979/3025/73 +f 2012/3073/98 2006/3071/97 1980/3072/72 +f 1997/3075/79 2012/3073/98 1981/3074/78 +f 1967/3077/54 1982/3081/77 2011/3078/100 +f 2010/3080/94 2011/3078/100 1982/3081/77 +f 2009/3062/95 2010/3080/94 1976/3082/76 +f 2020/3083/53 2028/3095/61 2027/3084/54 +f 2018/3086/55 2026/3097/62 2025/3087/56 +f 2016/3089/57 2024/3098/63 2023/3090/58 +f 2014/3092/59 2022/3099/64 2021/3093/60 +f 2013/3094/33 2021/3093/60 2028/3095/61 +f 2019/3096/34 2027/3263/54 2026/3097/62 +f 2017/3088/35 2025/3087/56 2024/3098/63 +f 2015/3091/36 2023/3090/58 2022/3099/64 +f 2022/3099/64 2030/3106/65 2029/3100/66 +f 2028/3102/61 2021/3101/60 2029/3100/66 +f 2024/3098/63 2025/3107/56 2033/3104/69 +f 2023/3090/58 2031/3109/70 2030/3106/65 +f 2025/3107/56 2026/3116/62 2034/3108/71 +f 2024/3098/63 2032/3105/68 2031/3109/70 +f 2034/3108/71 2041/3118/78 2040/3110/72 +f 2032/3105/68 2039/3115/73 2038/3111/74 +f 2029/3100/66 2030/3106/65 2037/3112/75 +f 2035/3103/67 2029/3100/66 2036/3113/76 +f 2033/3104/69 2040/3110/72 2039/3115/73 +f 2031/3109/70 2038/3111/74 2037/3112/75 +f 2050/3120/57 2058/3132/83 2057/3121/79 +f 2048/3123/59 2056/3134/84 2055/3124/80 +f 2046/3126/53 2054/3135/85 2053/3127/81 +f 2044/3129/55 2052/3136/86 2051/3130/82 +f 2043/3131/35 2051/3130/82 2058/3132/83 +f 2049/3133/36 2057/3264/79 2056/3134/84 +f 2047/3125/33 2055/3124/80 2054/3135/85 +f 2045/3128/34 2053/3127/81 2052/3136/86 +f 2051/3137/82 2052/3136/86 2060/3138/87 +f 2051/3137/82 2059/3139/88 2065/3140/89 +f 2054/3135/85 2055/3145/80 2063/3142/93 +f 2052/3136/86 2053/3127/81 2061/3144/91 +f 2055/3145/80 2056/3153/84 2064/3146/92 +f 2053/3127/81 2054/3135/85 2062/3143/101 +f 2064/3146/92 2071/3155/100 2070/3147/94 +f 2062/3143/101 2069/3152/95 2068/3148/96 +f 2059/3139/88 2060/3138/87 2067/3149/99 +f 2059/3139/88 2066/3150/97 2072/3151/98 +f 2063/3142/93 2070/3147/94 2069/3152/95 +f 2061/3144/91 2068/3148/96 2067/3149/99 +f 2068/3148/96 2069/3152/95 2037/3112/75 +f 2067/3149/99 2068/3148/96 2038/3111/74 +f 2066/3157/97 2067/3149/99 2039/3115/73 +f 2072/3159/98 2066/3157/97 2040/3158/72 +f 2057/3161/79 2072/3159/98 2041/3160/78 +f 2042/3163/77 2071/3265/100 2057/3164/79 +f 2070/3166/94 2071/3265/100 2042/3163/77 +f 2069/3152/95 2070/3166/94 2036/3167/76 +f 2079/3168/31 2087/3266/31 2086/3169/102 +f 2077/3171/35 2085/3180/35 2084/3172/103 +f 2075/3174/32 2083/3181/32 2081/3175/104 +f 2080/3177/105 2088/3184/105 2087/3178/31 +f 2078/3170/102 2086/3169/102 2085/3180/35 +f 2076/3173/103 2084/3172/103 2083/3181/32 +f 2074/3176/104 2081/3175/104 2082/3182/33 +f 2073/3183/33 2082/3182/33 2088/3184/105 +f 2095/3185/31 2103/3267/31 2102/3186/102 +f 2093/3188/35 2101/3197/35 2100/3189/103 +f 2091/3191/32 2099/3198/32 2097/3192/104 +f 2096/3194/105 2104/3201/105 2103/3195/31 +f 2094/3187/102 2102/3186/102 2101/3197/35 +f 2092/3190/103 2100/3189/103 2099/3198/32 +f 2090/3193/104 2097/3192/104 2098/3199/33 +f 2089/3200/33 2098/3199/33 2104/3201/105 diff --git a/src/main/resources/assets/hbm/textures/models/machines/purex.png b/src/main/resources/assets/hbm/textures/models/machines/purex.png new file mode 100644 index 0000000000000000000000000000000000000000..655e5e4a8ce11db868280314409d2929be75362c GIT binary patch literal 6779 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 Qn?#|eqN!Y}Xz}v@0EoeDSpWb4 literal 0 HcmV?d00001 From 18855018c42c3c297806d835eabc552ea0c05049 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:41:09 -0600 Subject: [PATCH 134/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 154 ++++++++++++------ 1 file changed, 106 insertions(+), 48 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 8e468434f..9e4f26bae 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -16,7 +16,7 @@ achievement.bossMaskman.desc=Врезать большому мальчику. achievement.bossMeltdown.desc=Скорее ужасно, чем отлично, но я приму то, что могу получить. achievement.bossMaskman=6 месяцев срочной службы, и все что я получил это паршивая футболка achievement.bossMeltdown=3.6 рентген -achievement.bossWorm.desc=Фабстафф. Моя задница. А ты считай. +achievement.bossWorm.desc=Просто маленький металический червь. achievement.bossWorm=Разборка Баллс-О-Трон achievement.bossUFO.desc=Эй, что у нас тут? Огромный космический корабль, приближающийся к блок-кораблю? achievement.bossUFO=Ayy Lmao @@ -566,6 +566,21 @@ cannery.schottky.7=Если какие-либо виртуальные част cannery.schottky.8=Обратите внимание, что виртуальные частицы никогда не будут использовать один и тот же выход диода дважды. Бесконечные циклы будут неудачными, но повторный вход в диод в остальном будет нормальным cannery.schottky.9=Ваш диод Шоттки для частиц должен быть правильно заключен, со свободными путями для каждого выхода пересечения +chem.hydrogen=Водород +chem.hydrogencoke=Водород из кокса +chem.oxygen=Кислород +chem.xenon=Ксенон +chem.xenonoxy=Ксенон (Охлаждённый) +chem.helium3=Гелий-3 +chem.ethanol=Этанол +chem.biogas=Биогаз +chem.biofuel=Переэтерификация биотоплива +chem.reoil=Регенерированное масло +chem.gasoline=Бензин +chem.tarsand=Битум из битумозного песка +chem.meatprocessing=Переработка мяса глифидов +chem.birkeland=Азотная кислота из воздуха + chem.ARSENIC=Экстракция мышьяка chem.ASPHALT=Производство асфальта chem.BAKELITE=Производство бакелита @@ -682,7 +697,9 @@ commands.satellite.satellite_descended=Спутник успешно удалё commands.satellite.satellite_orbited=Спутник запущен. commands.satellite.should_be_run_as_player=Команда должна быть выполнена игроком! -container.ammoBag=Сумка для патрон + +container.ammoBag=Ammo Bag +container.ammoBag=Сумка для боеприпасов container.amsBase=Основание АМС [Декор] container.amsEmitter=Излучатель АМС [Декор] container.amsLimiter=Стабилизатор АМС [Декор] @@ -756,7 +773,10 @@ container.launchPadRusted=Пусковая площадка container.launchTable=Большая пусковая площадка container.leadBox=Защитная коробка container.machineAmmoPress=Пресс для патронов +container.machineAssemblyMachine=Сборочная машина container.machineArcWelder=Дуговой сварщик +container.machineChemicalFactory=Химический завод +container.machineChemicalPlant=Химическая установка container.machineArcFurnaceLarge=Дуговая печь container.machineBoiler=Нагреватель нефти container.machineCMB=Печь для стали Альянса @@ -836,8 +856,10 @@ container.reactorControl=Блок удалённого доступа к реа container.reactorLarge=Большой ядерный реактор container.reactorResearch=Исследовательский реактор container.reix=Мэйнфрейм Rei-X +container.rttyController=Контроллер редстоун-радио container.rtg=РИТЭГ-генератор container.rtgFurnace=РИТЭГ-печь +container.rttyReader=Редстоун-радио ридер container.rttyCounter=Редстоун-радио счётчик предметов container.rttyLogic=Редстоун-радио логический приёмник container.rttyReceiver=Редстоун-радио приёмник @@ -903,9 +925,10 @@ crucible.tcalloy=Производство технециевой стали damage.inset=Сопротивления к при полном наборе: damage.item=Сопротивления к: +damage.category.EN=Энергетическому damage.category.EXPL=Взрывам damage.category.FIRE=Огню -damage.category.PROJ=Снарядам +damage.category.PHYS=Физическому damage.exact.drown=Утоплению damage.exact.fall=Падению damage.exact.LASER=Лазерам @@ -1013,7 +1036,7 @@ desc.gui.rtg.pellets=Принимаемые пеллеты: desc.gui.rtg.pelletHeat=%s (%s тепла) desc.gui.rtg.pelletPower=%s (%s HE/тик) desc.gui.template=§9Шаблоны§r$Шаблоны могут быть сделаны$в Папке шаблонов машин. -desc.gui.turbinegas.automode=§2Автоматический режим турбины§r$Нажав кнопку "AUTO", турбина автоматически$отрегулирует выработку электроэнергии$в зависимости от мощности, требуемой от сети +desc.gui.turbinegas.automode=§2Автоматический режим турбины§r$Нажав кнопку "AUTO", турбина автоматически$отрегулирует позицию регулятора$в зависимости от требуемой мощности сети$и количества оставшегося топлива desc.gui.turbinegas.fuels=§6Принимаемое топливо: desc.gui.turbinegas.warning=§cНизкий уровень топлива или смазки!§r desc.gui.zirnox.coolant=§3Охлаждение§r$CO2 перемещает тепло из активной зоны в воду.$Вода будет нагреваться до перегретого пара.$Эффективность охлаждения и производства пара$зависит от давления. @@ -1394,7 +1417,9 @@ hazard.particleCoarse=Частиц, находящихся в воздухе hazard.particleFine=Твердых частиц hazard.sand=Раздражителей глаз -hbm.key=NTM Hotkeys +hbm.key.ability=Переключение абилки инструмента +hbm.key.abilityAlt=Изменить абилки инструмента +hbm.key=NTM Хоткеи hbm.key.calculator=Калькулятор hbm.key.copyToolAlt=Устройство настройки: Переключить вставку hbm.key.copyToolCtrl=Устройство настройки: Применить к трубам @@ -1407,6 +1432,7 @@ hbm.key.dash=Рывок hbm.key.gunPrimary=Основной огонь hbm.key.gunSecondary=Альтернативный огонь hbm.key.gunTertitary=Переключить прицел +hbm.key.toggleMagnet=Вкл/выкл магнит hbm.key.toggleBack=Включить ранец hbm.key.toggleHUD=Включить HUD hbm.key.trainInv=Открыть инвентарь поезда @@ -1446,8 +1472,8 @@ hbmfluid.death=Осмиридовый раствор hbmfluid.deuterium=Дейтерий hbmfluid.diesel=Дизель hbmfluid.diesel_crack=Крекированный дизель -hbmfluid.diesel_crack_reform=Высокооктановый крекированный дизель -hbmfluid.diesel_reform=Высокооктановый дизель +hbmfluid.diesel_crack_reform=Высокоцетановый крекированный дизель +hbmfluid.diesel_reform=Высокоцетановый дизель hbmfluid.egg=Растворенное яйцо hbmfluid.estradiol=Раствор эстрадиола hbmfluid.ethanol=Этанол @@ -1543,7 +1569,7 @@ hbmfluid.solvent=Растворитель hbmfluid.sourgas=Кислый газ hbmfluid.spentsteam=Пар низкого давления hbmfluid.steam=Пар -hbmfluid.stellar_flux=Звёздный флюс +hbmfluid.stellar_flux=Звёздный поток hbmfluid.sulfuric_acid=Серная кислота hbmfluid.sunfloweroil=Подсолнечное масло hbmfluid.superhotsteam=Перегретый пар @@ -1796,18 +1822,19 @@ item.ammo_50ae_ap.name=Патрон калибра .50 AE (Бронебойны item.ammo_50ae_chlorophyte.name=Патрон калибра .50 AE (Хлорофит) item.ammo_50ae_du.name=Патрон калибра .50 AE (ДУ) item.ammo_50ae_star.name=Патрон калибра .50 AE (Звёздный металл) -item.ammo_50bmg.name=Крупнокалиберный патрон .50 BMG -item.ammo_50bmg_ap.name=Крупнокалиберный патрон .50 BMG (Бронебойный) -item.ammo_50bmg_chlorophyte.name=Крупнокалиберный патрон .50 BMG (Хлорофит) -item.ammo_50bmg_du.name=Крупнокалиберный патрон .50 BMG (ДУ) -item.ammo_50bmg_explosive.name=Крупнокалиберный патрон .50 BMG (Взрывной) -item.ammo_50bmg_flechette.name=Игольчатый .50 BMG патрон -item.ammo_50bmg_flechette_am.name=Игольчатый .50 BMG патрон (Америций) -item.ammo_50bmg_flechette_po.name=Игольчатый .50 BMG патрон (Полоний) -item.ammo_50bmg_incendiary.name=Крупнокалиберный патрон .50 BMG (Зажигательный) -item.ammo_50bmg_phosphorus.name=Крупнокалиберный патрон .50 BMG (БФ) -item.ammo_50bmg_sleek.name=Крупнокалиберный патрон .50 BMG (IF-R&D) -item.ammo_50bmg_star.name=Крупнокалиберный патрон .50 BMG (Звёздный металл) +item.ammo_50bmg.name=Патрон калибра .50 BMG +item.ammo_50bmg_ap.name=Патрон калибра .50 BMG (Бронебойный) +item.ammo_50bmg_chlorophyte.name=Патрон калибра .50 BMG (Хлорофит) +item.ammo_50bmg_du.name=Патрон калибра .50 BMG (ДУ) +item.ammo_50bmg_explosive.name=Патрон калибра .50 BMG (Взрывной) +item.ammo_50bmg_flechette.name=Игольчатый патрон калибра .50 BMG +item.ammo_50bmg_flechette_am.name=Игольчатый патрон калибра .50 BMG (Америций) +item.ammo_50bmg_flechette_po.name=Игольчатый патрон калибра .50 BMG (Полоний) +item.ammo_50bmg_incendiary.name=Патрон калибра .50 BMG (Зажигательный) +item.ammo_50bmg_phosphorus.name=Патрон калибра .50 BMG (БФ) +item.ammo_50bmg_sleek.name=Патрон калибра .50 BMG (IF-R&D) +item.ammo_50bmg_star.name=Патрон калибра .50 BMG (Звёздный металл) +item.ammo_secret.bmg50_black.name=Патрон калибра .50 BMG (Простреливающий) item.ammo_556.name=5.56мм патрон item.ammo_556_ap.name=5.56мм патрон (Бронебойный) item.ammo_556_chlorophyte.name=5.56мм патрон (Хлорофит) @@ -1929,12 +1956,13 @@ item.ammo_shell_apfsds_du.name=240мм APFSTS-DU item.ammo_shell_apfsds_t.name=240мм APFSTS-T item.ammo_shell_explosive.name=240мм Фугасный снаряд item.ammo_shell_w9.name=240мм Ядерный снаряд W9 -item.ammo_secret.bmg50_equestrian.name=.50 BMG патрон Разрушитель +item.ammo_secret.bmg50_equestrian.name=Патрон калибра .50 BMG (Разрушитель) item.ammo_secret.folly_nuke.name=Серебрянная пуля, ядерная item.ammo_secret.folly_sm.name=Серебрянная пуля item.ammo_secret.g12_equestrian.name=12-й калибр Railway Spike Shot item.ammo_secret.m44_equestrian.name=.44 магнум Разрыватель голов item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Чёрная Молния) item.ammo_standard.b75.name=.75 болт item.ammo_standard.b75_exp.name=.75 болт (Взрывной) item.ammo_standard.b75_inc.name=.75 болт (Зажигательный) @@ -1944,11 +1972,14 @@ item.ammo_standard.bmg50_du.name=.50 BMG патрон (Обеднённый ур item.ammo_standard.bmg50_fmj.name=.50 BMG патрон (Цельнометаллическая оболочка) item.ammo_standard.bmg50_jhp.name=.50 BMG патрон (Экспансивный+) item.ammo_standard.bmg50_sp.name=.50 BMG патрон (Экспансивный) -item.ammo_standard.capacitor.name=Конденсатор +item.ammo_standard.capacitor.name=Конденсатор (Стандартный) item.ammo_standard.capacitor_ir.name=Конденсатор (Низкая длина волны) item.ammo_standard.capacitor_overcharge.name=Конденсатор (Перезаряженный) item.ammo_standard.coil_ferrouranium.name=Ферроураниевый шарик гаусс-пушки item.ammo_standard.coil_tungsten.name=Вольфрамовый шарик гаусс-пушки +item.ammo_standard.ct_hook.name=Крюк-кошка +item.ammo_standard.ct_mortar.name=Разрывной снаряд +item.ammo_standard.ct_mortar_charge.name=Тяжёлый разрывной снаряд item.ammo_standard.flame_balefire.name=Топливо огнемёта (Жар-пламя) item.ammo_standard.flame_diesel.name=Топливо огнемёта (Дизель) item.ammo_standard.flame_gas.name=Топливо огнемёта (Газ) @@ -1988,6 +2019,7 @@ item.ammo_standard.m44_express.name=.44 magnum (Высокомощная цел item.ammo_standard.m44_fmj.name=.44 magnum (Цельнометаллическая оболочка) item.ammo_standard.m44_jhp.name=.44 magnum (Экспансивный+) item.ammo_standard.m44_sp.name=.44 magnum (Экспансивный) +item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Разрушающий) item.ammo_standard.nuke_high.name=Ядерный минизаряд (Высокомощный) item.ammo_standard.nuke_hive.name=Rocket Hive @@ -2289,6 +2321,7 @@ item.blades_desh.name=Деш-лезвия измельчителя item.blades_steel.name=Стальные лезвия измельчителя item.blades_titanium.name=Титановые лезвия измельчителя item.blowtorch.name=Паяльная лампа +item.blueprints.name=Чертежи item.board_copper.name=Медная панель item.boat_rubber.name=Резиновая лодка item.bobmazon.name=Bobmazon @@ -2426,8 +2459,6 @@ item.canned_tuna.name=Консервированный тунец item.canned_tuna.desc=Я не могу сказать, действительно ли это тунец или высушенный цемент. item.canned_yogurt.name=Консервированный йогурт item.canned_yogurt.desc=Возможно просрочен, но не важно. -item.canteen_13.name=Фляжка Убежища 13 -item.canteen_fab.name=Потрясающая водка item.canteen_vodka.name=Стильная фляга item.cap_fritz.name=Крышка от Фрицз-Колы item.cap_korl.name=Крышка от Бутылки Корла @@ -2521,6 +2552,7 @@ item.chopper_torso.name=Корпус Вертолёта-охотника item.chopper_wing.name=Крыло Вертолета-охотника item.chunk_ore.malachite.name=Кусок малахита item.chunk_ore.rare.name=Кусок редкоземельной руды +item.chunk_ore.moonstone.name=Лунный камень item.chunk_ore.cryolite.name=Кусок криолита item.cigarette.name=Сигарета марки "FFI" item.cinnebar.name=Киноварь @@ -2871,7 +2903,6 @@ item.euphemium_plate.name=Эвфемиевый нагрудник item.euphemium_stopper.name=Ограничитель item.explosive_lenses.name=Набор взрывоопасных линз item.explosive_lenses.desc=Сборка из 8 линз из пластичной взрывчатки с тонким$алюминиевым толкателем, дюралюминиевым корпусом и$миниатюрными мостовыми детонаторами. -item.fabsols_vodka.name=Водка Fabsol'а item.factory_core_advanced.name=Энергетический кластер усовершенствованной фабрики item.factory_core_titanium.name=Энергетический кластер базовой фабрики item.fallout.name=Куча радиоактивных осадков @@ -2901,7 +2932,7 @@ item.fleija_igniter.name=Импульсный воспламенитель item.fleija_kit.name=Комплект Ф.Л.Е.Я item.fleija_propellant.name=Шрабидиевая взрывчатка item.fluid_barrel_empty.name=Пустая бочка для жидкости -item.fluid_barrel_full.name=Жидкостная бочка: +item.fluid_barrel_full.name=Жидкостная бочка: %s item.fluid_barrel_infinite.name=Бесконечная жидкостная бочка item.fluid_duct.name=Жидкостная труба: item.fluid_identifier.name=Идентификатор жидкости @@ -2912,10 +2943,12 @@ item.fluid_identifier.usage2=в радиусе 64 блоков. item.fluid_identifier_multi.name=Мульти-жидкостный идентификатор item.fluid_identifier_multi.info=Жидкостный идентификатор для: item.fluid_identifier_multi.info2=Второй тип: +item.fluid_pack_empty.name=Большой жидкостный контейнер +item.fluid_pack_full.name=%s - упакованно item.fluid_tank_empty.name=Пустой универсальный резервуар для жидкости -item.fluid_tank_full.name=Универсальный резервуар для жидкости: +item.fluid_tank_full.name=Универсальный резервуар для жидкости: %s item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов -item.fluid_tank_lead_full.name=Резервуар с опасными материалами: +item.fluid_tank_lead_full.name=Резервуар с опасными материалами: %s item.fluorite.name=Флюорит item.flywheel_beryllium.name=Бериллевый маховик item.fmn.name=Таблетка флунитразепама @@ -3032,8 +3065,11 @@ item.gun_aberrator.name=Аберратор item.gun_aberrator_eott.name=Глаза бури item.gun_am180.name=Пистолет-пулемёт .22 LR item.gun_am180_silenced.name=Пистолет-пулемёт .22 LR с глушителем +item.gun_amat.name=Крупнокалиберная снайперская винтовка +item.gun_amat_penance.name="Покаяние" +item.gun_amat_subtlety.name="Тонкость" item.gun_ar15.name="Джош" -item.gun_autoshotgun.name=Барабанный дробовик +item.gun_autoshotgun.name=Автоматический дробовик item.gun_autoshotgun_sexy.name=Секси item.gun_autoshotgun_shredder.name=Шреддер item.gun_avenger.name=CZ57 “Авенджер” @@ -3054,6 +3090,7 @@ item.gun_calamity.name=Каламити item.gun_calamity_ammo.name=Кал. 50 (LEGACY) item.gun_calamity_dual.name=Боевое седло item.gun_carbine.name=Карабин +item.gun_charge_thrower.name=Метатель снарядов item.gun_chemthrower.name=Химомёт item.gun_coilgun.name=Гаусс-пушка item.gun_congolake.name=Congo Lake @@ -3083,7 +3120,7 @@ item.gun_flechette.name=Игольчатая винтовка item.gun_folly.name=Прототип Дигамма "Причуда" item.gun_g3.name=Штурмовая винтовка item.gun_g3_a3.name=G3A3 -item.gun_g3_infiltrator.name=Infiltrator +item.gun_g3_infiltrator.name=Инфильтратор item.gun_g3_zebra.name=Зебринская винтовка item.gun_glass_cannon.name=Стеклянная пушка item.gun_greasegun.name=Пистолет-пулемёт "Маслёнка" @@ -3111,11 +3148,11 @@ item.gun_lacunae_ammo.name=5-мм патрон (LEGACY) item.gun_lag.name=Комически длинный пистолет item.gun_laser_pistol.name=Лазерный пистолет item.gun_laser_pistol_morning_glory.name=Морнин Глори -item.gun_laser_pistol_pew_pew.name=Пью-Пью +item.gun_laser_pistol_pew_pew.name=Пиу-пиу item.gun_lasrifle.name=Лазерная винтовка item.gun_lever_action.name=«Нога кобылы» (Оригинал) item.gun_lever_action_ammo.name=Дробь 12x74 калибра (LEGACY) -item.gun_lever_action_dark.name=«Нога кобылы» (Тёмный) +item.gun_lever_action_dark.name="Нога кобылы" (Тёмный) item.gun_lever_action_sonata.name=Перевёрнутая «Нога кобылы» item.gun_lever_action_sonata_2.name=§cSonata's Microphone§r item.gun_liberator.name=Либератор @@ -3129,7 +3166,8 @@ item.gun_maresleg_akimbo.name=Дробовики рычажного действ item.gun_maresleg_broken.name=Broken item.gun_maresleg_short.name=Нога кобылы item.gun_mas36.name=Южная Звезда -item.gun_minigun.name=Персональный миниган CZ53 +item.gun_minigun.name=Персональный миниган +item.gun_minigun_dual.name=Двойные миниганы item.gun_minigun_lacunae.name=Лакунай item.gun_mirv.name=M42 Ядерная катапульта "Экспериментальный МИРВ" item.gun_mirv_ammo.name=Восьмиричный МИРВ (LEGACY) @@ -3227,7 +3265,7 @@ item.hazmat_plate_red.name=Улучшенный защитный нагрудн item.hazmat_red_kit.name=Расширенный комплект химической и радиационной защиты item.heart_booster.name=Усилитель сердца item.heart_container.name=Контейнер для сердца -item.heart_fab.name=Фаб-сердце +item.heart_fab.name=Сердце Тьмы item.heart_piece.name=Частичка сердца item.heavy_component.name=Тяжёлый компонент (%s) item.hev_battery.name=Батарея костюма @@ -3314,7 +3352,7 @@ item.ingot_les.name=Слиток низкообогащенного шрабид item.ingot_magnetized_tungsten.name=Слиток намагниченного вольфрама item.ingot_metal.name=Металлический слиток item.ingot_metal.bar.name=Металлический кусок -item.ingot_metal.beacon.name=Radio Homing Beacon +item.ingot_metal.beacon.name=Радиомаяк item.ingot_metal.casing.name=Металлическая оболочка item.ingot_metal.clockwork.name=Заводной механизм item.ingot_metal.counter.name=Счётчик @@ -3875,6 +3913,7 @@ item.part_barrel_light.name=Лёгкий ствол (%s) item.part_beryllium.name=Коробка бериллиевой пыли item.part_carbon.name=Коробка угольной пыли item.part_copper.name=Коробка медной пыли +item.part_generic.glass_polarized.name=Поляризованная линза item.part_generic.hde.name=Элемент повышенной прочности item.part_generic.lde.name=Элемент малой плотности item.part_generic.piston_electric.name=Электрический поршень @@ -4021,7 +4060,7 @@ item.plate_fuel_u235.name=Высокообогащенная уран-235 топ item.plate_gold.name=Золотая пластина item.plate_gunmetal.name=Пластина пушечной бронзы item.plate_iron.name=Железная пластина -item.plate_kevlar.name=Кевларо-керамический состав +item.plate_kevlar.name=Лист кевлара item.plate_lead.name=Свинцовая пластина item.plate_mixed.name=Смешанная пластина item.plate_paa.name=Пластина сплава PaA @@ -4226,6 +4265,7 @@ item.radx.desc=Increases radiation resistance by 0.2 (37%) for 3 minutes item.rag.name=Тряпка item.rag_damp.name=Влажная тряпка item.rag_piss.name=Пропитанная мочой тряпка +item.rangefinder.name=Дальнометр item.rbmk_fuel_balefire.name=Жар-топливный стержень РБМК item.rbmk_fuel_balefire_gold.name=Флэшголд-топливный стержень РБМК item.rbmk_fuel_drx.name=§cДигамма топливный стержень РБМК§r @@ -4684,10 +4724,10 @@ item.t45_kit.name=Комплект силовой брони T45 item.t45_legs.name=Поножи силовой брони T45 item.t45_plate.name=Нагрудник силовой брони T45 item.tank_steel.name=Стальной бак -item.taurun_boots.name=Taurun Boots -item.taurun_helmet.name=Taurun Helmet -item.taurun_legs.name=Taurun Leggings -item.taurun_plate.name=Taurun Chestplate +item.taurun_boots.name=Taurun ботинки +item.taurun_helmet.name=Taurun шлем +item.taurun_legs.name=Taurun поножи +item.taurun_plate.name=Taurun нагрудник item.tank_waste_0.name=Контейнер с отходами item.tank_waste_1.name=Контейнер с отходами item.tank_waste_2.name=Контейнер с отходами @@ -5417,7 +5457,7 @@ tile.crane_partitioner.desc=Принимает и сохраняет до дев tile.crane_router.name=Конвейерный сортировщик tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как черный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит tile.crane_splitter.name=Конвейерный разделитель -tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в инсертер или сортировщик +tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в вставщик или сортировщик$Соотношение можно настроить с помощью отвертки tile.crane_unboxer.name=Конвейерный распаковщик tile.crane_unboxer.desc=Прием коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны tile.crashed_bomb.name=Неразорвавшаяся бомба @@ -5518,6 +5558,7 @@ tile.ducrete_smooth_stairs.name=Ступеньки из дюкрета tile.dummy_block.name=Блок-пустышка tile.dummy_port.name=Блок-пустышка (Розетка) tile.dungeon_chain.name=Металлическая цепь +tile.logic_block.name=Блок действия подземелья tile.dynamite.name=Динамит tile.emp_bomb.name=ЭМИ-бомба tile.factory_advanced_conductor.name=Порт электричества усовершенствованной фабрики @@ -5557,6 +5598,7 @@ tile.fluid_duct_gauge.desc=Труба которая показывает ско tile.fluid_duct_neo.name=Универсальная жидкостная труба tile.fluid_duct_paintable.name=Окрашиваемая покрытая универсальная жидкостная труба tile.fluid_duct_solid.name=Покрытая универсальная жидкостная труба (Устаревшее) +tile.fluid_pump.name=Помпа контроля потока tile.fluid_switch.name=Редстоун-Жидкостный клапан tile.fluid_valve.name=Жидкостный клапан tile.foam_layer.name=Слой пены @@ -5609,6 +5651,7 @@ tile.geiger.name=Счетчик Гейгера tile.glass_ash.name=Пепельное стекло tile.glass_boron.name=Борное стекло tile.glass_lead.name=Свинцовое стекло +tile.glass_polarized.name=Поляризованное стекло tile.glass_polonium.name=Полониевое стекло tile.glass_quartz.name=Кварцевое стекло tile.glass_trinitite.name=Тринититовое стекло @@ -5632,10 +5675,6 @@ tile.hadron_coil_neodymium.name=Плотная неодимовая катушк tile.hadron_coil_schrabidate.name=Плотная шрабидатавая катушка tile.hadron_coil_schrabidium.name=Плотная шрабидиевая катушка tile.hadron_coil_starmetal.name=Плотная звёзднометаллическая катушка -tile.hadron_cooler.name=Кулер ускорителя частиц -tile.hadron_cooler.desc=Мощность охлаждения: 10$Порог переохлаждения: 10$Бонус: +10%%$Штраф переохлаждения: -25%% -tile.hadron_cooler_mk2.name=Кулер ускорителя частиц - The Palindrome Special -tile.hadron_cooler_mk2.desc=Мощность охлаждения: 5$Функция эффективности: 2-(охлад-15)²/225$Макс. штраф: -90%% tile.hadron_core.name=Ядро ускорителя частиц tile.hadron_diode.name=Диод частиц Шоттки tile.hadron_plating.name=Обшивка ускорителя частиц @@ -5719,8 +5758,9 @@ tile.machine_arc_welder.name=Дуговой сварщик tile.machine_armor_table.name=Стол модификации брони tile.machine_ashpit.name=Зольник tile.machine_ashpit.desc=Собирает золу из топок и нагревательных печей -tile.machine_assembler.name=Сборочная машина +tile.machine_assembler.name=Сборочная машина (Legacy) tile.machine_assemfac.name=Сборочный завод +tile.machine_assembly_machine.name=Сборочная машина tile.machine_autocrafter.name=Автоматический верстак tile.machine_autosaw.name=Автоматическая пила tile.machine_autosaw.desc=Срубает ближайшие растения, пересаживает деревья$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжелую нефть @@ -5736,8 +5776,11 @@ tile.machine_boiler_off.name=Нагревательнефти tile.machine_catalytic_cracker.name=Башня каталитического крекинга tile.machine_catalytic_reformer.name=Каталитический реформер tile.machine_centrifuge.name=Центрифуга -tile.machine_chemfac.name=Химический завод -tile.machine_chemplant.name=Химическая установка +tile.machine_chemfac.name=Химический завод (Legacy) +tile.machine_chemical_factory.name=Химический завод +tile.machine_chemical_factory.desc=Четырехкратный химический завод.$Рецепты обрабатываются в два раза быстрее,$но требуют в два раза больше энергии.$Требует охлаждения водой,$производит пар низкого давления. +tile.machine_chemical_plant.name=Химическая установка +tile.machine_chemplant.name=Химическая установка (Legacy) tile.machine_chungus.name=Паровая турбина "Левиафан" tile.machine_chungus.desc=Эффективность: 85%% tile.machine_coal_off.name=Генератор внутреннего сгорания @@ -6040,6 +6083,7 @@ tile.plasma_heater.name=Нагреватель плазмы tile.plushie.name=Плюшевая игрушка %s tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ отвёрткой, чтобы задать вход.$ПКМ отвёрткой в присяде, чтобы задать выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. +tile.pneumatic_tube_paintable.name=Окрашиваемая пневматическая труба tile.pole_satellite_receiver.name=Спутниковая тарелка tile.pole_top.name=Антенна tile.press_preheater.name=Внешний нагреватель пресса @@ -6075,10 +6119,14 @@ tile.pwr_reflector.desc=Отражает нейтроны обратно к то tile.rad_lava_block.name=Вулканическая лава tile.radar_screen.name=Экран радара tile.radio_telex.name=Телекс +tile.radio_torch_controller.name=Контроллер редстоун-радио +tile.radio_torch_controller.desc=Может принимать сигналы команд и передавать$их на подключенное устройство tile.radio_torch_counter.name=Редстоун-радио счётчик предметов tile.radio_torch_counter.desc=Ставится на плоские поверхности или совместимые компараторные блоки$Сигнал зависит от количества нужных предметов tile.radio_torch_logic.name=Редстоун-радио логический приёмник tile.radio_torch_logic.desc=Размещается на плоских поверхностях или совместимых с компаратором блоках$Сопоставляет сигналы красного камня с условиями, оцениваемыми в заданном порядке$Числовые или строковые входы сравниваются с константой +tile.radio_torch_reader.name=Редстоун-радио ридер +tile.radio_torch_reader.desc=Считывает значения из подключенных блоков,$а затем отправляет их с указанной частотой tile.radio_torch_receiver.name=Редстоун-радио приёмник tile.radio_torch_receiver.desc=Ставится на плоские поверхности или совместимые компараторные блоки tile.radio_torch_sender.name=Редстоун-радио передатчик @@ -6171,6 +6219,7 @@ tile.sand_lead.name=Свинцовый песок tile.sand_polonium.name=Полониевый песок tile.sand_quartz.name=Кварцевый песок tile.sand_uranium.name=Урановый песок +tile.sandbags.name=Мешки с песком tile.sat_dock.name=Станция посадки груза tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декор) tile.sat_laser.name=Орбитальный Луч Смерти (Декор) @@ -6284,6 +6333,7 @@ tile.vent_chlorine.name=Хлорный клапан tile.vent_chlorine_seal.name=Хлорный уплотнитель tile.vent_cloud.name=Воздушный клапан с облаком tile.vent_pink_cloud.name=Воздушный клапан с розовым облаком +tile.vine_phosphor.large.name=Фосфорные лианы tile.vinyl_tile.large.name=Большая виниловая плитка tile.vinyl_tile.small.name=Маленькие виниловые плитки tile.vitrified_barrel.name=Бочка с остеклованными ядерными отходами @@ -6293,6 +6343,7 @@ tile.volcano_rad_core.name=Радиоактивное вулканическое tile.wand_air.name=Блок для структурной палочки (Air) tile.wand_loot.name=Блок для структурной палочки (Lootable) tile.wand_jigsaw.name=Блок для структурной палочки (Jigsaw) +tile.wand_logic.name=Блок для структурной палочки (Logic) tile.waste_earth.name=Мертвая трава tile.waste_leaves.name=Мёртвые листья tile.waste_log.name=Обугленное бревно @@ -6310,6 +6361,10 @@ tile.watz_end.name=Стабилизатор реактора Ватцза tile.watz_end_bolted.name=Стабилизатор реактора Ватцза (Заклепанный) tile.watz_hatch.name=Люк доступа к реактору Ватцза tile.watz_pump.name=Нагнетающая помпа Ватцза +tile.wood_barrier.name=Деревянный барьер +tile.wood_structure.ceiling.name=Деревянный пол +tile.wood_structure.roof.name=Деревянная крыша +tile.wood_structure.scaffold.name=Деревянные подмостки tile.yellow_barrel.name=Радиоктивная бочка tile.zirnox_destroyed.name=Разрушенный Цирнокс @@ -6409,6 +6464,7 @@ upgrade.fortune=Удача %s upgrade.overheatChance=Шанс перегрева %s upgrade.productivity=Продуктивность %s upgrade.range=Радиус %s +upgrade.speed=Скорость процесса %s upgrade.gui.title=§lПринимаемые улучшения:§r upgrade.gui.afterburner= * §dФорсаж§r: Стакается до %s уровней @@ -6452,3 +6508,5 @@ desc.gui.upgrade.effectiveness= * §aЭффективность§r: Стакае desc.gui.upgrade.overdrive= * §7Перегруз§r: Стакается до 3-х уровней desc.gui.upgrade.power= * §1Энергосбережение§r: Стакается до 3-х уровней desc.gui.upgrade.speed= * §4Скорость§r: Стакается до 3-х уровней + +tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель From b656e1d22e8196b2d4fd675c0924abb4ea6267b2 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:44:03 -0600 Subject: [PATCH 135/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9e4f26bae..49c69b856 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -698,7 +698,6 @@ commands.satellite.satellite_orbited=Спутник запущен. commands.satellite.should_be_run_as_player=Команда должна быть выполнена игроком! -container.ammoBag=Ammo Bag container.ammoBag=Сумка для боеприпасов container.amsBase=Основание АМС [Декор] container.amsEmitter=Излучатель АМС [Декор] From c82e371ec8efc7a5aef752555a4352dd2ef5d887 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:45:26 -0600 Subject: [PATCH 136/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 49c69b856..f88846738 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1416,8 +1416,8 @@ hazard.particleCoarse=Частиц, находящихся в воздухе hazard.particleFine=Твердых частиц hazard.sand=Раздражителей глаз -hbm.key.ability=Переключение абилки инструмента -hbm.key.abilityAlt=Изменить абилки инструмента +hbm.key.ability=Переключение способностей инструмента +hbm.key.abilityAlt=Изменить способности инструмента hbm.key=NTM Хоткеи hbm.key.calculator=Калькулятор hbm.key.copyToolAlt=Устройство настройки: Переключить вставку From 77df7e6cdee44834149c0c77b7d8124ead3a173b Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:28:14 -0600 Subject: [PATCH 137/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index f88846738..5f1f06ffc 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -842,6 +842,7 @@ container.radar=Радар container.radiobox=FM передатчик container.radiolysis=РИТЭГ и Камера Радиолиза container.radiorec=FM радио +container.rbmkAutoloader=Автозагрузчик стержней РБМК container.rbmkBoiler=Паровой канал РБМК container.rbmkControl=Регулирующие стержни РБМК container.rbmkControlAuto=Автоматические регулирующие стержни РБМК From e85ae838c6fd629675b4abc6fd2801111ac73d98 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:31:33 -0600 Subject: [PATCH 138/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 5f1f06ffc..b39db8163 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6147,6 +6147,7 @@ tile.rail_large_switch_flipped.name=Переключатель стандарт tile.rail_narrow.name=Узкоколейные вагонеточные рельсы tile.rail_wood.name=Деревянные рельсы tile.rbmk_absorber.name=Борный поглотитель нейтронов РБМК +tile.rbmk_autoloader.name=Автозагрузчик стержней РБМК tile.rbmk_blank.name=Структурная колонна РБМК tile.rbmk_boiler.name=Паровой канал РБМК tile.rbmk_console.name=Консоль РБМК From 82b02c29ea9cf0cecbc1b6cc73c0e3eebb8af128 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:18:25 -0600 Subject: [PATCH 139/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index b39db8163..dcbca0d67 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2022,7 +2022,7 @@ item.ammo_standard.m44_sp.name=.44 magnum (Экспансивный) item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Разрушающий) item.ammo_standard.nuke_high.name=Ядерный минизаряд (Высокомощный) -item.ammo_standard.nuke_hive.name=Rocket Hive +item.ammo_standard.nuke_hive.name=Ракетный рой item.ammo_standard.nuke_standard.name=Ядерный минизаряд item.ammo_standard.nuke_tots.name=Ядерный минизаряд (Карапузы) item.ammo_standard.p22_ap.name=.22 LR патрон (Бронебойный) @@ -6363,8 +6363,8 @@ tile.watz_end_bolted.name=Стабилизатор реактора Ватцза tile.watz_hatch.name=Люк доступа к реактору Ватцза tile.watz_pump.name=Нагнетающая помпа Ватцза tile.wood_barrier.name=Деревянный барьер -tile.wood_structure.ceiling.name=Деревянный пол -tile.wood_structure.roof.name=Деревянная крыша +tile.wood_structure.ceiling.name=Деревянный настил +tile.wood_structure.roof.name=Деревянное перекрытие tile.wood_structure.scaffold.name=Деревянные подмостки tile.yellow_barrel.name=Радиоктивная бочка tile.zirnox_destroyed.name=Разрушенный Цирнокс From 55bfe1b8d202cbb9c2fd77d8c5f04432cb21af10 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:40:16 -0600 Subject: [PATCH 140/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 292 +++++++++--------- 1 file changed, 146 insertions(+), 146 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index dcbca0d67..36f2179b9 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -14,7 +14,7 @@ achievement.bossCreeper.desc='Здесь есть ядерные криперы? achievement.bossCreeper=Бомба на четырёх ногах achievement.bossMaskman.desc=Врезать большому мальчику. achievement.bossMeltdown.desc=Скорее ужасно, чем отлично, но я приму то, что могу получить. -achievement.bossMaskman=6 месяцев срочной службы, и все что я получил это паршивая футболка +achievement.bossMaskman=6 месяцев срочной службы, и всё что я получил это паршивая футболка achievement.bossMeltdown=3.6 рентген achievement.bossWorm.desc=Просто маленький металический червь. achievement.bossWorm=Разборка Баллс-О-Трон @@ -38,29 +38,29 @@ achievement.desh.desc="Тогда давайте, вы все. Места, ку achievement.desh=Леверье achievement.digammaFeel.desc=Мои глаза кровоточат achievement.digammaFeel=Мусорный мир наполненный канализациями -achievement.digammaKauaiMoho.desc=Все ужасно, вот тебе горячий шоколад. +achievement.digammaKauaiMoho.desc=Всё ужасно, вот тебе горячий шоколад. achievement.digammaKauaiMoho=Пой, пой мне песню Кауаи Мохо -achievement.digammaKnow.desc=о чем вообще этот мир. +achievement.digammaKnow.desc=о чём вообще этот мир. achievement.digammaKnow=СТРАХ ПОЗНАНИЯ achievement.digammaSee.desc=Темновато, принеси фонарик. achievement.digammaSee=СПУСТИСЬ В БЕЗДНУ achievement.digammaUpOnTop.desc=Восхищайся сыном моим, он мой клон. achievement.digammaUpOnTop=ВОСХИЩАЙСЯ МНОЮ, ВОСХИЩАЙСЯ ДОМОМ МОИМ achievement.fiend.desc=Будь жестоким. -achievement.fiend2.desc=Будь еще жёстче. +achievement.fiend2.desc=Будь ещё жёстче. achievement.fiend2=Нарушитель-2: перенарушение. achievement.fiend=Нарушитель -achievement.freytag.desc=Стражи жизни Герольда. +achievement.freytag.desc=Стражи жизни Геральда. achievement.freytag=Фрейтаг achievement.fusion.desc=Танец дейтронов, тритонов и энергии. achievement.fusion=Синтез -achievement.gasCent.desc=Необогащенный уран ненавидит его! +achievement.gasCent.desc=Необогащённый уран ненавидит его! achievement.gasCent=Стиль Молнии achievement.goFish.desc=Морское распятие achievement.goFish=Иди порыбачь achievement.hidden.desc=Убейте зараженного крипера падающим товарным вагоном achievement.hidden=Скрытый Каталог -achievement.horizonsBonus.desc=честное слово что черт возьми с тобой не так +achievement.horizonsBonus.desc=честное слово что чёрт возьми с тобой не так achievement.horizonsBonus=Слэм-данк диарея achievement.horizonsEnd.desc=Отправьте Тома домой. achievement.horizonsEnd=Горизонты @@ -68,11 +68,11 @@ achievement.horizonsStart.desc=Отправьте Геральда на луну achievement.horizonsStart=Апогей achievement.impossible.desc=Ты не можешь получить это достижение. achievement.impossible=Буквально невозможно -achievement.inferno.desc="Превратите его в пепел! Этого недостаточно! Сбросьте еще бомбы!" +achievement.inferno.desc="Превратите его в пепел! Этого недостаточно! Сбросьте ещё бомбы!" achievement.inferno=Операция "Каннибал" achievement.manhattan.desc=8:15; 6 августа, 1945 год achievement.manhattan=Проект Манхэттен -achievement.meltdown.desc=Ты зашел так далеко, как ты мог все испортить? +achievement.meltdown.desc=Ты зашел так далеко, как ты мог всё испортить? achievement.meltdown=Быстрая внеплановая разборка achievement.no9.desc="Я надеюсь, что свинец, который я добываю, будет использован в вашей краске" achievement.no9=Старый номер Девять @@ -149,7 +149,7 @@ armor.fasterReload=Быстрая перезарядка armor.fastFall=Быстрое падение armor.fireproof=Огнеупорность armor.fullSetBonus=Бонусы Полного Набора брони: -armor.geigerHUD=Встроенный HUD счетчика Гейгера +armor.geigerHUD=Встроенный HUD счётчика Гейгера armor.geigerSound=Звуковой Счётчик Гейгера armor.glider=Присесть, чтобы спланировать armor.gravity=Модификатор гравитации %s @@ -210,7 +210,7 @@ book.test.page1=Test Page 1 book.error.cover=Адронный Коллайдер:$Диагностирование проблем book.error.title1=Ошибка 0x01 [NC] -book.error.page1=§lНазвание:§r "ERROR_NO_CHARGE" §lОписание:§r Частица достигла сегмента, у которого недостаточно заряда. §lПотенциальное решение:§r Либо замените один из портов питания, через который частица успешно проходит, на более мощный порт питания, либо добавьте еще один порт питания немного раньше сегмента, где исчезает частица. +book.error.page1=§lНазвание:§r "ERROR_NO_CHARGE" §lОписание:§r Частица достигла сегмента, у которого недостаточно заряда. §lПотенциальное решение:§r Либо замените один из портов питания, через который частица успешно проходит, на более мощный порт питания, либо добавьте ещё один порт питания немного раньше сегмента, где исчезает частица. book.error.title2=Ошибка 0x02 [NA] book.error.page2=§lНазвание:§r "ERROR_NO_ANALYSIS" §lОписание:§r Частица достигла ядра, несмотря на то, что она не прошла камеру анализа. §lПотенциальное решение:§r Проверьте что ваш ускоритель имеет камеру анализа и также проверьте режим работы (линейный/циклический). book.error.title3=Ошибка 0x03 [OC] @@ -218,13 +218,13 @@ book.error.page3=§lНазвание:§r "ERROR_OBSTRUCTED_CHANNEL" §lОпис book.error.title4=Ошибка 0x04 [EC] book.error.page4=§lНазвание:§r "ERROR_EXPECTED_COIL" §lОписание:§r Частица пересекла сегмент, у которого не хватает одной или нескольких катушек. §lПотенциальное решение:§r Снимите обшивку с коллайдера в предполагаемой области и проверьте наличие всех катушек. Эта ошибка также возникает при T-образных пересечениях которые были построены без диодов. book.error.title5=Ошибка 0x05 [MS] -book.error.page5=§lНазвание:§r "ERROR_MALFORMED_SEGMENT" §lОписание:§r Частица пересекла сегмент, который был неправильно построен (но не заблокирован или не имеет катушек). §lПотенциальное решение:§r Проверьте, что предполагаемый сегмент имеет обшивку во все требуемых местах, не оставляя открытых катушек. +book.error.page5=§lНазвание:§r "ERROR_MALFORMED_SEGMENT" §lОписание:§r Частица пересекла сегмент, который был неправильно построен (но не заблокирован или не имеет катушек). §lПотенциальное решение:§r Проверьте, что предполагаемый сегмент имеет обшивку во всех требуемых местах, не оставляя открытых катушек. book.error.title6=Ошибка 0x06 [ATL] -book.error.page6=§lНазвание:§r "ERROR_ANALYSIS_TOO_LONG" §lОписание:§r Частица прошла более трех требуемых допустимых сегментов камеры анализа. §lПотенциальное решение:§r Проверьте, что камера анализа точно 3 блока в длину для циклического ускорителя и хотя бы 2 блока в длину для линейного. Также проверьте, не проходит ли частица через несколько камер анализа в разветвленном и/или закольцованном ускорителе. +book.error.page6=§lНазвание:§r "ERROR_ANALYSIS_TOO_LONG" §lОписание:§r Частица прошла более трёх требуемых допустимых сегментов камеры анализа. §lПотенциальное решение:§r Проверьте, что камера анализа точно 3 блока в длину для циклического ускорителя и хотя бы 2 блока в длину для линейного. Также проверьте, не проходит ли частица через несколько камер анализа в разветвленном и/или закольцованном ускорителе. book.error.title7=Ошибка 0x07 [ATS] book.error.page7=§lНазвание:§r "ERROR_ANALYSIS_TOO_SHORT" §lОписание:§r Частица покинула камеру анализа, несмотря на несоответствие требованиям по длине. §lПотенциальное решение:§r Убедитесь, что камера анализа ускорителя имеет длину ровно 3 блока. Допустимые сегменты камеры не имеют катушек, а покрытие полностью состоит из стенок/окон камеры анализа. Камеры анализа с катушками в них считаются правильными сегментами. book.error.title8=Ошибка 0x08 [DC] -book.error.page8=§lНазвание:§r "ERROR_DIODE_COLLISION" §lОписание:§r Частица столкнулась с не входящей стороной диода частиц Шоттки. §lПотенциальное решение:§r Проверьте что ваши диоды настроены правильно. Частицы могут входить только со сторон с зелеными стрелками, направленными внутрь. +book.error.page8=§lНазвание:§r "ERROR_DIODE_COLLISION" §lОписание:§r Частица столкнулась с не входящей стороной диода частиц Шоттки. §lПотенциальное решение:§r Проверьте что ваши диоды настроены правильно. Частицы могут входить только со сторон с зелёными стрелками, направленными внутрь. book.error.title9=Ошибка 0x09 [BT] book.error.page9=§lНазвание:§r "ERROR_BRANCHING_TURN" §lОписание:§r Частица достигла поворота с несколькими выходами. §lПотенциальное решение:§r Если ваш поворот нормальный, проверьте есть ли там все катушки (то есть нет дыр в слоях). Если поворот предназначен для разветвления, для этого требуется правильно сконфигурированный диод частиц Шоттки. @@ -256,9 +256,9 @@ book.rbmk.title12=Консоль book.rbmk.page12=§lКонсоль РБМК§r позволяет управлять реактором издалека. Использование §lУстройства для соединения консоли§r §lРБМК§r на части РБМК и затем на консоли соединит реактор и консоль. Консоль может управлять только частями 15x15, для больших реакторов вы можете использовать несколько консолей. book.rbmk.title13=Использование консоли book.rbmk.page13=Щелчок по частям приведет к их выбору и отмене выбора. С помощью цветных кнопок вы можете быстро выбрать все стержни управления этой цветовой группы. Кнопка "A" выберет все стержни управления, "X" отменит выбор всех. -book.rbmk.page14=Ввод числа от 0 до 100 в зеленое поле, а затем нажатие кнопки рядом с ним приведет к установке всех выбранных стержней управления в это положение. Кнопка "АЗ-5" приведет к полной вставке всех стержней управления. +book.rbmk.page14=Ввод числа от 0 до 100 в зелёное поле, а затем нажатие кнопки рядом с ним приведет к установке всех выбранных стержней управления в это положение. Кнопка "АЗ-5" приведет к полной вставке всех стержней управления. book.rbmk.title15=Топливо -book.rbmk.page15=Реакция §lтоплива§r зависит от множества факторов. Основными из них являются §lобогащение§r, §lксеноновое отравление§r и количество поступающих §lнейтронов§r. Ксенон накапливается, когда топливо получает мало нейтронов, и сгорает во время нормальной работы. Эффективность нейтронов зависит от типа, большинство видов топлива §lлучше всего расщепляются медленными нейтронами§r. +book.rbmk.page15=Реакция §lтоплива§r зависит от множества факторов. Основными из них являются §lобогащёние§r, §lксеноновое отравление§r и количество поступающих §lнейтронов§r. Ксенон накапливается, когда топливо получает мало нейтронов, и сгорает во время нормальной работы. Эффективность нейтронов зависит от типа, большинство видов топлива §lлучше всего расщепляются медленными нейтронами§r. book.rbmk.title16=Расплавление book.rbmk.page16=§4§lИЗБЕГАЙТЕ. @@ -266,7 +266,7 @@ book.starter.cover=Руководство промышленника$по вос book.starter.title1=Вступление book.starter.page1=Если вы читаете это, то весьма вероятно, что общество, так или иначе, полностью рухнуло. Правительства, страны и власть - это концепция прошлого, вместе со всеми удобствами цивилизованной жизни. Таким образом, это руководство расскажет вам,как изменить это, воссоздав индустрию и технологии прошлого для улучшения вашей собственной жизни. book.starter.title2=Уголь и горчичный газ -book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в ее нынешнем виде, возможно, еще не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. +book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в ее нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. book.starter.title3=Наковальни и прессы book.starter.page3=Квинтэссенцией для начала вашего промышленного возрождения являются §lнаковальня§r и §lпресс§r. Наковальня позволит вам вручную создавать ранние механизмы, такие как сборочная машина, в то время как пресс позволит вам изготавливать пластины, провода и схемы, которые вы не можете сделать с помощью наковальни. book.starter.title4=Шаблоны @@ -290,8 +290,8 @@ book.starter.page11=Под землей, по которой вы ходите, book.starter.title12=Радиация book.starter.page12a=§oОстальная часть этой книги будет посвящена вопросам, связанным с §oрадиацией. Для вашей безопасности и безопасности других людей я дам вам §oсоветы о том, как смягчить воздействие и справиться с ней. book.starter.page12b=Достаточное воздействие радиации может привести и приведет к телесным повреждениям. Первый шаг - это внешняя защита; обязательно ограничьте свое воздействие и наденьте защитное снаряжение, например §lЗащитный костюм§r, или прикрепить §lОбшивку§r к вашей одежде или броне; вы также можете принять §lРад-X§r чтобы ограничить получаемую дозу. Спасибо современной медицине, вторым шагом может быть удаление, если это необходимо; например, §l"Обеззараживатель §lигрока"§r будет медленно уменьшать излучение, поглощённое вашим телом. §lАнтирадин§r может быть использован как профилактика при облучении, быстро и эффективно устраняя повреждения, причиненные вашему организму ионизирующим излучением. -book.starter.title13=Обогащение урана -book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. +book.starter.title13=Обогащёние урана +book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащёния из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. book.starter.title14=Чикагская поленница book.starter.page14=В качестве альтернативы вы можете получить §lРеакторный плутоний§r, более мощное топливо, из природного урана, используя §lЧикагскую поленницу§r. Укладывая графитовые блоки и сверля их, вы можете вставить топливные стержни для размножения в плутоний и стержни источников нейтронов, такие как §lРадий-Бериллий§r, чтобы начать реакцию. Обязательно протестируйте свои конструкции; для предотвращения перегрева может потребоваться разделение или ограничение количества блоков. book.starter.title15=ЦИРНОКС РГО @@ -345,7 +345,7 @@ book_lore.test.page.4=5 book_lore.book_iodine.name=Заметка book_lore.book_iodine.author=Дейв -book_lore.book_iodine.page.0=Лады, вы не поверите, но старик Везэрвэйн наконец объявился через две недели после своего ухода и, что еще более впечатляюще, он раскололся на тему своих занятий в каньоне: +book_lore.book_iodine.page.0=Лады, вы не поверите, но старик Везэрвэйн наконец объявился через две недели после своего ухода и, что ещё более впечатляюще, он раскололся на тему своих занятий в каньоне: book_lore.book_iodine.page.1=Похоже, дебилы из НИОКР обнаружили соединение, в основном неорганическое, очень схожее с токсином, но вникните: умирающие клетки воспроизводят и выделяют его во внешнюю среду, создавая чрезвычайно заразный аэрозоль. book_lore.book_iodine.page.2=Оно как вирус, но не вирус. Состав странный, его можно замешать в любой бутылке, но лишь в нужном порядке. Док сказал, что первый реактив это просто измельченные кристаллы иода, идущие в ячейку %d. @@ -377,7 +377,7 @@ book_lore.book_syringe.page.1=шприц идёт в ячейку %d. book_lore.resignation_note.name=Заявление об отставке book_lore.resignation_note.author=Косма -book_lore.resignation_note.page.0=Управление вновь сократило наш отдел. Эти идиоты могут обвинить в произошедшем только себя, я не знаю, чего они ожидали после такого фиаско. Кто, черт его дери, сливает информацию? Мы теряем миллионы, а +book_lore.resignation_note.page.0=Управление вновь сократило наш отдел. Эти идиоты могут обвинить в произошедшем только себя, я не знаю, чего они ожидали после такого фиаско. Кто, чёрт его дери, сливает информацию? Мы теряем миллионы, а book_lore.resignation_note.page.1=работы лишили МЕНЯ. МЕНЯ попросили уволиться. Я надеюсь вы, кретины, наконец извлечете урок из громады своих ошибок и возьмёте себя в руки. book_lore.resignation_note.page.2=Я не приду в пятницу. Просто пришлите мне зарплату. @@ -436,19 +436,19 @@ book_lore.bf_bomb_4.page.4=Все они придают большое знач book_lore.bf_bomb_5.name=Личные заметки book_lore.bf_bomb_5.author=М. Портер book_lore.bf_bomb_5.page.0=Я просто... не могу с этим справиться, даже спустя несколько дней. На самом деле, это было предрешено, учитывая, насколько легкомысленно научная группа относилась к безопасности. $ $ Доктор Мелфин, старший научный сотрудник, сгинул. Вероятно, мёртв. Я видел, как это произошло, собственными глазами, в испытательной камере. -book_lore.bf_bomb_5.page.1=Мы только что получили еще одну порцию чистого жар-огня, а он нашел необходимое электрооборудование и источник энергии, чтобы проверить свое предположение. Я не знаю, что стало причиной (было ли запущено оборудование? Он начал слишком рано?), но оно свершилось мучительно медленно, -book_lore.bf_bomb_5.page.2=когда зеленый свет поглотил стол, батарею и доктора Мелфина, стоящего всего в метре от него. Даже когда стол превратился в лужу кипящего металла на полу, он не загорелся. Я не знаю, что я увидел в его глазах... $$ Ужас или трепет, +book_lore.bf_bomb_5.page.1=Мы только что получили ещё одну порцию чистого жар-огня, а он нашел необходимое электрооборудование и источник энергии, чтобы проверить свое предположение. Я не знаю, что стало причиной (было ли запущено оборудование? Он начал слишком рано?), но оно свершилось мучительно медленно, +book_lore.bf_bomb_5.page.2=когда зелёный свет поглотил стол, батарею и доктора Мелфина, стоящего всего в метре от него. Даже когда стол превратился в лужу кипящего металла на полу, он не загорелся. Я не знаю, что я увидел в его глазах... $$ Ужас или трепет, book_lore.bf_bomb_5.page.3=может из-за того, что он ещё жив? Чем бы ни был наш "чудо" материал, его это не волновало. В следующий момент он исчез в яркой вспышке света. Он испарился? сгорел? аннигилирован? Отошлите меня хоть в грёбаный ад, я больше ничего не знаю! book_lore.bf_bomb_5.page.4=Меня тошнит от главного исследователя. Он звиздел, что мы могли бы быть более осторожными, продолжать просто кружить вокруг, какую-то ещё подымающую мораль чепуху. Этот тупой урод никогда не поймет, что играя с огнем, можно обжечься. $ Я не стал заморачиваться с book_lore.bf_bomb_5.page.5=увольнением, просто забрал свои шмотки и побежал к холмам. В любом случае, неважно; учитывая отсутствие звонков и грибовидное облако, поднявшееся над моим (теперь уже бывшим) местом работы, они взорвали всё либо перешли в полное распоряжение военных. book_lore.bf_bomb_5.page.6=Есть важное различие между диссекцией и ВИВИСЕКЦИЕЙ, что они явно упустили из виду. Они могут рассекать металлы или атомы сколько угодно, но вторгаться внутрь, вивисекцировать саму реальность – это значит лишь порождать новых докторов Мелфинов. Кто знает! book_lore.bf_bomb_5.page.7=В конце-концов, правительство стремится превратить эту херню в бомбы, может, мы увидим ещё пару войн, ещё пару миллионов людей, встретивших судьбу хуже смерти. Они не могут прятать это вечно. $ $ Меня это не волнует. Теперь не волнует. Боже, пожалуйста, позволь мне вернуться -book_lore.bf_bomb_5.page.8=к настоящей науке. $ $ Черт возьми, Мэй, возьми себя в руки... +book_lore.bf_bomb_5.page.8=к настоящей науке. $ $ Чёрт возьми, Мэй, возьми себя в руки... book_lore.beacon.name=Инструкция по эксплуатированию сигнального маяка book_lore.beacon.author=ФлимФлэм Индастриз book_lore.beacon.page.0=Благодарим вас за покупку светового сигнального маяка мод.2 (версия 1.3)! Этот небольшой буклет содержит краткое введение в работу маяка и его внутреннюю работу. -book_lore.beacon.page.1=Глава 1: Архитектура $ Каждый блок состоит из четырех основных частей: управляющей микросхемы, фонаря, противотуманной сирены и корпуса, в котором расположены остальные части. Для подробного объяснения, пожалуйста, +book_lore.beacon.page.1=Глава 1: Архитектура $ Каждый блок состоит из четырёх основных частей: управляющей микросхемы, фонаря, противотуманной сирены и корпуса, в котором расположены остальные части. Для подробного объяснения, пожалуйста, book_lore.beacon.page.2=обратитесь к принципиальной схеме, расположенной на внутренней стороне крышки для обслуживания корпуса. Фонарь состоит из поликарбонатного корпуса, содержащего двуцветную галогеновую лампу мощностью 250Вт со стандартным 200мм разъёмом, запасные части book_lore.beacon.page.3=для лампы могут быть заказаны из наших магазинов. Не рекомендуется использовать лампы сторонних производителей, поскольку мы не можем гарантировать безопасную работу. Корпус изготовлен из специальной оцинкованной нержавеющей стали и устойчив к атмосферным воздействиям. book_lore.beacon.page.4=Глава 2: Фонарь $ Основное назначение фонаря — освещение для облегчения обслуживания в суровых погодных условиях, а также информирование о состоянии устройства. Если Power-On Self-Test (POST) не пройден, фонарь будет светиться @@ -457,7 +457,7 @@ book_lore.beacon.page.6=Глава 3: Туманный звуковой сигн book_lore.beacon.page.7=Глава 4: Peer-to-peer $ Подробную информацию о связи см. в руководстве по связи. Ниже приводится краткое описание установки P2P-соединения: во-первых, маяк должен подать сигнал «НАЧАТЬ СОЕДИНЕНИЕ», book_lore.beacon.page.8=являющийся одним длинным звуком. Все доступные узлы также должны ответить одним длинным однотонным сигналом (порядок определяется близостью, а также правилами связи, изложенными в руководстве, раздел «Ответ на соединение») book_lore.beacon.page.9=Как только желаемый партнер ответил, подайте сигнал «ПРИНЯТЬ СОЕДИНЕНИЕ» в виде двух длинных тонов, затем партнер также ответит двумя длинными тонами. Вся последующая коммуникация должна происходить с использованием заранее согласованных сигналов, чаще всего -book_lore.beacon.page.10=по стандарту ФАР-5М. Связь прекратится немедленно, если не будет согласован ни один стандарт, что будет служить «пингом». Если связь продолжается, соединение можно завершить, используя еще один длинный тональный сигнал «ЗАВЕРШИТЬ СОЕДИНЕНИЕ». +book_lore.beacon.page.10=по стандарту ФАР-5М. Связь прекратится немедленно, если не будет согласован ни один стандарт, что будет служить «пингом». Если связь продолжается, соединение можно завершить, используя ещё один длинный тональный сигнал «ЗАВЕРШИТЬ СОЕДИНЕНИЕ». book_lore.beacon.page.11=Глава 5: Гарантия $ [страница намеренно оставлена ​​пустой] cannery.f1=[ Нажмите f1 для справки ] @@ -533,7 +533,7 @@ cannery.willow.8=Вскоре растение снова начнет раст cannery.willow.9=Сбор ивовых листьев можно автоматизировать с помощью автоматической бензопилы, она будет ломать только те растения, которые готовы к сбору урожая. cannery.hadron=Ускоритель частиц -cannery.hadron.0=Ускоритель частиц состоит из трех основных частей: Ядро, Камера анализа и набор сверхпроводящих катушек. +cannery.hadron.0=Ускоритель частиц состоит из трёх основных частей: Ядро, Камера анализа и набор сверхпроводящих катушек. cannery.hadron.1=Это компонент ядра ускорителя частиц, который выстреливает частицы с релятивистскими скоростями по катушкам в сторону аналитической камеры cannery.hadron.2=Частицы выбрасываются отсюда cannery.hadron.3=И в круговых ускорителяхвозвращаются сюда @@ -681,7 +681,7 @@ chem.SULFURIC_ACID=Производство серной кислоты chem.TATB=Синтез TATB chem.TEL=Смешивание тетраэтилсвинца chem.TEST=Тест -chem.THORIUM_SALT=Обогащение ториевой соли +chem.THORIUM_SALT=Обогащёние ториевой соли chem.TNT=Синтез ТНТ chem.UF6=Производство гексафторида урана chem.VIT_GAS=Остекловывание газообразных ядерных отходов @@ -1012,7 +1012,7 @@ death.sedna.physical.attacker=%1$s был пристрелен %2$s. desc.gui.assembler.warning=§cОшибка:§r Требуется шаблон сборочной машины! desc.gui.chemplant.warning=§cОшибка:§r Требуется шаблон химической машины! -desc.gui.gasCent.enrichment=§2Обогащение§r$Для обогащения урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. +desc.gui.gasCent.enrichment=§2Обогащёние§r$Для обогащёния урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. desc.gui.gasCent.output=§6Перемещение жидкости§r$Жидкость может быть перемещена$через выходной порт для дальнейшей обработки. desc.gui.nukeBoy.desc=§1Требует:§r$ * Нейтронный щит$ * Снаряд U235$ * Субкритическая цель U235$ * Взрывчатка$ * Воспламенитель desc.gui.nukeGadget.desc=§1Требует:§r$ * 4 Набора взрывоопасных линз$ Первого поколения$ * Плутониевое ядро$ * Провода @@ -1592,9 +1592,9 @@ hbmfluid.xpjuice=Жидкий опыт hbmfluid.xylene=Бензол-толуол-ксилол (BTX) hbmpseudofluid.none=Пусто -hbmpseudofluid.heuf6=Высокообогащенный UF6 -hbmpseudofluid.meuf6=Среднеобогащенный UF6 -hbmpseudofluid.leuf6=Низкообогащенный UF6 +hbmpseudofluid.heuf6=Высокообогащённый UF6 +hbmpseudofluid.meuf6=Среднеобогащённый UF6 +hbmpseudofluid.leuf6=Низкообогащённый UF6 hbmpseudofluid.nuf6=Природный UF6 hbmpseudofluid.pf6=Гексафторид плутония hbmpseudofluid.mud_heavy=Тяжёлая осадочная фракция @@ -2258,8 +2258,8 @@ item.billet_flashlead.name=Заготовка флэшлида item.billet_flashlead.desc=Решетка распадается, вызывая реакции аннигиляции антивещества и материи, вызывая высвобождение$пионов, распадающихся на мюоны, катализирующих слияние$ядер, создавая новый элемент.$Пожалуйста, постарайся не отставать. item.billet_gh336.name=Заготовка гиорсия-336 item.billet_gh336.desc=Коллега Сиборгиума. -item.billet_hes.name=Заготовка высокообогащенного шрабидиевого топлива -item.billet_les.name=Заготовка низкообогащенного шрабидиевого топлива +item.billet_hes.name=Заготовка высокообогащённого шрабидиевого топлива +item.billet_les.name=Заготовка низкообогащённого шрабидиевого топлива item.billet_mox_fuel.name=Заготовка МОКС-топлива item.billet_mox_fuel.desc=Карманный Мокси! item.billet_neptunium.name=Заготовка нептуния @@ -2448,7 +2448,7 @@ item.canned_pizza.desc=Преступление против человечес item.canned_recursion.name=Консервированная рекурсия item.canned_recursion.desc=Консервированная рекурсия item.canned_spam.name=Консервы “Спам” -item.canned_spam.desc=Действие трехминутного скетча разворачивается в вымышленном кафе$"Зеленый Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать ее спам и заказывает блюдо с большим$количеством спама и запеченной фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь еще громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он все чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. +item.canned_spam.desc=Действие трехминутного скетча разворачивается в вымышленном кафе$"зелёный Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать ее спам и заказывает блюдо с большим$количеством спама и запеченной фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь ещё громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он все чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. item.canned_stew.name=Консервы "Тушеные грибы" item.canned_stew.desc=... item.canned_tomato.name=Консервированный томатный суп @@ -3000,7 +3000,7 @@ item.gas_petroleum.name=Баллон с попутным газом item.gas_tester.name=Газовый датчик item.gear_large.name=Большая шестерня item.gear_large_steel.name=Большая стальная шестерня -item.geiger_counter.name=Ручной счетчик Гейгера +item.geiger_counter.name=Ручной счётчик Гейгера item.gem_alexandrite.name=Александрит item.gem_rad.name=Радиоактивный самоцвет item.gem_sodalite.name=Содалит @@ -3138,7 +3138,7 @@ item.gun_hp_ammo.name=Чернильный картридж item.gun_immolator.name=Иммолятор item.gun_immolator_ammo.name=Топливо Иммолатора item.gun_jack.name=Джекхаммер -item.gun_jack_ammo.name=Снаряд для четырехствольного дробовика +item.gun_jack_ammo.name=Снаряд для четырёхствольного дробовика item.gun_karl.name=Карл item.gun_kit_1.name=Ружейное масло item.gun_kit_2.name=Комплект для ремонта оружия @@ -3286,7 +3286,7 @@ item.icf_pellet.name=Топливная пеллета ICF item.icf_pellet_depleted.name=Обедненная топливная пеллета ICF item.icf_pellet_empty.name=Пустая топливная пеллета ICF item.igniter.name=Зажигатель -item.igniter.desc=(Щёлкните правой кнопкой мыши по Прототипу)$Это зеленая металлическая ручка с $ярко-красной кнопкой и маленькой крышкой.$Внизу выгравированы инициалы N.E.$. Кем бы ни был N.E., у него был отличный вкус в оттенках зеленого. +item.igniter.desc=(Щёлкните правой кнопкой мыши по Прототипу)$Это зелёная металлическая ручка с $ярко-красной кнопкой и маленькой крышкой.$Внизу выгравированы инициалы N.E.$. Кем бы ни был N.E., у него был отличный вкус в оттенках зелёного. item.industrial_magnet.name=Промышленный магнит item.inf_antimatter.name=Infinite Antimatter Tank item.inf_antischrabidium.name=Infinite Antischrabidium Tank @@ -3343,12 +3343,12 @@ item.ingot_gh336.name=Слиток гиорсия-336 item.ingot_gh336.desc=Коллега Сиборгиума. item.ingot_graphite.name=Графитовый слиток item.ingot_gunmetal.name=Слиток пушечной бронзы -item.ingot_hes.name=Высокообогащенный слиток шрабидиевого топлива +item.ingot_hes.name=Высокообогащённый слиток шрабидиевого топлива item.ingot_lanthanium.name=Полустабильный слиток лантана item.ingot_lanthanium.desc='Лантанум' item.ingot_lanthanium.desc.P11=Вообще лантанум, но ладно. item.ingot_lead.name=Свинцовый слиток -item.ingot_les.name=Слиток низкообогащенного шрабидиевого топлива +item.ingot_les.name=Слиток низкообогащённого шрабидиевого топлива item.ingot_magnetized_tungsten.name=Слиток намагниченного вольфрама item.ingot_metal.name=Металлический слиток item.ingot_metal.bar.name=Металлический кусок @@ -3775,9 +3775,9 @@ item.nugget_euphemium.name=Эвфемиевый самородок item.nugget_euphemium.desc=Маленький кусочек розового металла.$Его свойства до сих пор неизвестны,$ОБРАЩАЙТЕСЬ С НИМ осторожно. item.nugget_gh336.name=Самородок гиорсия-336 item.nugget_gh336.desc=Коллега Сиборгиума. -item.nugget_hes.name=Высокообогащенный самородок шрабидиевого топлива +item.nugget_hes.name=Высокообогащённый самородок шрабидиевого топлива item.nugget_lead.name=Свинцовый самородок -item.nugget_les.name=Низкообогащенный самородок шрабидиевого топлива +item.nugget_les.name=Низкообогащённый самородок шрабидиевого топлива item.nugget_mercury_tiny.name=Маленькая капля ртути item.nugget_mercury.name=Капля ртути item.nugget_mox_fuel.name=Самородок МОКС топлива @@ -3960,11 +3960,11 @@ item.pellet_coolant.name=Охлаждающий кластер item.pellet_flechette.name=Флешетты item.pellet_gas.name=Ядовитый газовый баллон item.pellet_gas.desc=Используется в многоцелевых бомбах:$*кхе-кхе* Астанавитесь пжлст! -item.pellet_hes.name=Высокообогащенная шрабидиевая Ватцз-пеллета +item.pellet_hes.name=Высокообогащённая шрабидиевая Ватцз-пеллета item.pellet_lead.name=Свинцовая пеллета -item.pellet_les.name=Низкообогащенная шрабидиевая Ватцз-пеллета +item.pellet_les.name=Низкообогащённая шрабидиевая Ватцз-пеллета item.pellet_mercury.name=Ртутные гранулы -item.pellet_mes.name=Среднеобогащенная шрабидиевая Ватцз-пеллета +item.pellet_mes.name=Среднеобогащённая шрабидиевая Ватцз-пеллета item.pellet_meteorite.name=Метеоритные гранулы item.pellet_neptunium.name=Нептуниевая Ватцз-пеллета item.pellet_rtg.name=РИТЭГ-пеллета из плутония-238 @@ -4052,11 +4052,11 @@ item.plate_dura_steel.name=Пластина высокоскоростной с item.plate_euphemium.name=Составная пластина из эвфемия item.plate_fuel_mox.name=МОКС-топливная пластина item.plate_fuel_pu238be.name=Плутоний-238-Бериллевая топливная пластина -item.plate_fuel_pu239.name=Высокообогащенная плутониевая-239 топливная пластина +item.plate_fuel_pu239.name=Высокообогащённая плутониевая-239 топливная пластина item.plate_fuel_ra226be.name=Радий-226-Бериллевая топливная пластина -item.plate_fuel_sa326.name=Высокообогащенная шрабидий-326 топливная пластина -item.plate_fuel_u233.name=Высокообогащенная уран-233 топливная пластина -item.plate_fuel_u235.name=Высокообогащенная уран-235 топливная пластина +item.plate_fuel_sa326.name=Высокообогащённая шрабидий-326 топливная пластина +item.plate_fuel_u233.name=Высокообогащённая уран-233 топливная пластина +item.plate_fuel_u235.name=Высокообогащённая уран-235 топливная пластина item.plate_gold.name=Золотая пластина item.plate_gunmetal.name=Пластина пушечной бронзы item.plate_iron.name=Железная пластина @@ -4212,48 +4212,48 @@ item.prototype_kit.name=Комплект Прототипа item.pudding.name=Пудинг item.pwr_fuel.bfb_am_mix.name=Стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel.bfb_pu241.name=Стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel.hen237.name=Топливный стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel.hep239.name=Топливный стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel.hep241.name=Топливный стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel.hes326.name=Топливный стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel.hes327.name=Топливный стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel.heu233.name=Топливный стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel.heu235.name=Топливный стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel.mea.name=Топливный стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel.men.name=Топливный стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel.mep.name=Топливный стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel.meu.name=Топливный стержень ВВЭР со среднеобогащенным ураном +item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel.hen237.name=Топливный стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel.hep239.name=Топливный стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel.hep241.name=Топливный стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel.hes326.name=Топливный стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel.hes327.name=Топливный стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel.heu233.name=Топливный стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel.heu235.name=Топливный стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel.mea.name=Топливный стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel.men.name=Топливный стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel.mep.name=Топливный стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel.meu.name=Топливный стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel.mox.name=Топливный стержень ВВЭР с МОКС-топливом item.pwr_fuel_depleted.bfb_am_mix.name=Обедненный стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel_depleted.bfb_pu241.name=Обедненный стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel_depleted.hea242.name=Обедненный топливный стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel_depleted.hen237.name=Обедненный топливный стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel_depleted.hep239.name=Обедненный топливный стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel_depleted.hep241.name=Обедненный топливный стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel_depleted.hes326.name=Обедненный топливный стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel_depleted.hes327.name=Обедненный топливный стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel_depleted.heu233.name=Обедненный топливный стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel_depleted.heu235.name=Обедненный топливный стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel_depleted.mea.name=Обедненный топливный стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel_depleted.men.name=Обедненный топливный стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel_depleted.mep.name=Обедненный топливный стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel_depleted.meu.name=Обедненный топливный стержень ВВЭР со среднеобогащенным ураном +item.pwr_fuel_depleted.hea242.name=Обедненный топливный стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel_depleted.hen237.name=Обедненный топливный стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel_depleted.hep239.name=Обедненный топливный стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel_depleted.hep241.name=Обедненный топливный стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel_depleted.hes326.name=Обедненный топливный стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel_depleted.hes327.name=Обедненный топливный стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel_depleted.heu233.name=Обедненный топливный стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel_depleted.heu235.name=Обедненный топливный стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel_depleted.mea.name=Обедненный топливный стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel_depleted.men.name=Обедненный топливный стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel_depleted.mep.name=Обедненный топливный стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel_depleted.meu.name=Обедненный топливный стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel_depleted.mox.name=Обедненный топливный стержень ВВЭР с МОКС-топливом item.pwr_fuel_hot.bfb_am_mix.name=Горячий стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel_hot.bfb_pu241.name=Горячий стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel_hot.hea242.name=Горячий стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel_hot.hen237.name=Горячий стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel_hot.hep239.name=Горячий стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel_hot.hep241.name=Горячий стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel_hot.hes326.name=Горячий стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel_hot.hes327.name=Горячий стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel_hot.heu233.name=Горячий стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel_hot.heu235.name=Горячий стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel_hot.mea.name=Горячий стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel_hot.men.name=Горячий стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel_hot.mep.name=Горячий стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel_hot.meu.name=Горячий стержень ВВЭР со среднеобогащенным ураном +item.pwr_fuel_hot.hea242.name=Горячий стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel_hot.hen237.name=Горячий стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel_hot.hep239.name=Горячий стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel_hot.hep241.name=Горячий стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel_hot.hes326.name=Горячий стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel_hot.hes327.name=Горячий стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel_hot.heu233.name=Горячий стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel_hot.heu235.name=Горячий стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel_hot.mea.name=Горячий стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel_hot.men.name=Горячий стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel_hot.mep.name=Горячий стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel_hot.meu.name=Горячий стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel_hot.mox.name=Горячий стержень ВВЭР с МОКС-топливом item.quartz_plutonium.name=Плутонический кварц item.radar_linker.name=Радарный соединитель @@ -4271,30 +4271,30 @@ item.rbmk_fuel_balefire_gold.name=Флэшголд-топливный стерж item.rbmk_fuel_drx.name=§cДигамма топливный стержень РБМК§r item.rbmk_fuel_empty.name=Пустой топливный стержень РБМК item.rbmk_fuel_flashlead.name=Флэшлид-топливный стержень РБМК -item.rbmk_fuel_hea241.name=Высокообогащенный америциевый-241 топливный стержень РБМК -item.rbmk_fuel_hea242.name=Высокообогащенный америциевый-242 топливный стержень РБМК -item.rbmk_fuel_heaus.name=Высокообогащенный австралиевый топливный стержень РБМК -item.rbmk_fuel_hen.name=Высокообогащенный нептуниевый топливный стержень РБМК -item.rbmk_fuel_hes.name=Высокообогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_hep.name=Высокообогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_hep241.name=Высокообогащенный плутониевый-241 топливный стержень РБМК -item.rbmk_fuel_heu233.name=Высокообогащенный урановый-233 топливный стержень РБМК -item.rbmk_fuel_heu235.name=Высокообогащенный урановый-235 топливный стержень РБМК -item.rbmk_fuel_lea.name=Низкообогащенный америциевый топливный стержень РБМК -item.rbmk_fuel_leaus.name=Низкообогащенный австралиевый топливный стержень РБМК -item.rbmk_fuel_lep.name=Низкообогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_les.name=Низкообогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_mea.name=Среднеобогащенный америциевый топливный стержень РБМК -item.rbmk_fuel_men.name=Среднеобогащенный нептуниевый топливный стержень РБМК -item.rbmk_fuel_mep.name=Среднеобогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_mes.name=Среднеобогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_meu.name=Среднеобогащенный урановый топливный стержень РБМК +item.rbmk_fuel_hea241.name=Высокообогащённый америциевый-241 топливный стержень РБМК +item.rbmk_fuel_hea242.name=Высокообогащённый америциевый-242 топливный стержень РБМК +item.rbmk_fuel_heaus.name=Высокообогащённый австралиевый топливный стержень РБМК +item.rbmk_fuel_hen.name=Высокообогащённый нептуниевый топливный стержень РБМК +item.rbmk_fuel_hes.name=Высокообогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_hep.name=Высокообогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_hep241.name=Высокообогащённый плутониевый-241 топливный стержень РБМК +item.rbmk_fuel_heu233.name=Высокообогащённый урановый-233 топливный стержень РБМК +item.rbmk_fuel_heu235.name=Высокообогащённый урановый-235 топливный стержень РБМК +item.rbmk_fuel_lea.name=Низкообогащённый америциевый топливный стержень РБМК +item.rbmk_fuel_leaus.name=Низкообогащённый австралиевый топливный стержень РБМК +item.rbmk_fuel_lep.name=Низкообогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_les.name=Низкообогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_mea.name=Среднеобогащённый америциевый топливный стержень РБМК +item.rbmk_fuel_men.name=Среднеобогащённый нептуниевый топливный стержень РБМК +item.rbmk_fuel_mep.name=Среднеобогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_mes.name=Среднеобогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_meu.name=Среднеобогащённый урановый топливный стержень РБМК item.rbmk_fuel_mox.name=МОКС-топливный стержень РБМК item.rbmk_fuel_po210be.name=Полоний-210-Бериллевый источник нейтронов РБМК item.rbmk_fuel_pu238be.name=Плутоний-238-Бериллевый источник нейтронов РБМК item.rbmk_fuel_ra226be.name=Радий-226-Бериллевый источник нейтронов РБМК item.rbmk_fuel_thmeu.name=Ториево-урановый среднеобогащённый топливный стержень РБМК -item.rbmk_fuel_ueu.name=Необогащенный урановый топливный стержень РБМК +item.rbmk_fuel_ueu.name=Необогащённый урановый топливный стержень РБМК item.rbmk_fuel_zfb_am_mix.name=Америций реакторного качества ЦТС стержень РБМК item.rbmk_fuel_zfb_bismuth.name=Висмутовый ЦТС стержень РБМК item.rbmk_fuel_zfb_pu241.name=Плутоний-241 ЦТС стержень РБМК @@ -4304,30 +4304,30 @@ item.rbmk_pellet_balefire.name=Жар-топливная пеллета item.rbmk_pellet_balefire_gold.name=Флэшголд-топливная пеллета item.rbmk_pellet_drx.name=§cДигамма топливная пеллета§r item.rbmk_pellet_flashlead.name=Флэшлид-топливная пеллета -item.rbmk_pellet_hea241.name=Высокообогащенная америциевая-241 топливная пеллета -item.rbmk_pellet_hea242.name=Высокообогащенная америциевая-242 топливная пеллета -item.rbmk_pellet_heaus.name=Высокообогащенная австралиевая топливная пеллета -item.rbmk_pellet_hen.name=Высокообогащенная нептуниевая топливная пеллета -item.rbmk_pellet_hep239.name=Высокообогащенная плутониевая-239 топливная пеллета -item.rbmk_pellet_hep241.name=Высокообогащенная плутониевая-241 топливная пеллета -item.rbmk_pellet_heu233.name=Высокообогащенная урановая-233 топливная пеллета -item.rbmk_pellet_heu235.name=Высокообогащенная урановая-235 топливная пеллета -item.rbmk_pellet_hes.name=Высокообогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_lea.name=Низкообогащенная америциевая топливная пеллета -item.rbmk_pellet_leaus.name=Низкообогащенная австралиевая топливная пеллета -item.rbmk_pellet_lep.name=Низкообогащенная плутониевая топливная пеллета -item.rbmk_pellet_les.name=Низкообогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_mea.name=Среднеобогащенная америциевая топливная пеллета -item.rbmk_pellet_men.name=Среднеобогащенная нептуниевая топливная пеллета -item.rbmk_pellet_mep.name=Среднеобогащенная плутониевая топливная пеллета -item.rbmk_pellet_mes.name=Среднеобогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_meu.name=Среднеобогащенная урановая топливная пеллета +item.rbmk_pellet_hea241.name=Высокообогащённая америциевая-241 топливная пеллета +item.rbmk_pellet_hea242.name=Высокообогащённая америциевая-242 топливная пеллета +item.rbmk_pellet_heaus.name=Высокообогащённая австралиевая топливная пеллета +item.rbmk_pellet_hen.name=Высокообогащённая нептуниевая топливная пеллета +item.rbmk_pellet_hep239.name=Высокообогащённая плутониевая-239 топливная пеллета +item.rbmk_pellet_hep241.name=Высокообогащённая плутониевая-241 топливная пеллета +item.rbmk_pellet_heu233.name=Высокообогащённая урановая-233 топливная пеллета +item.rbmk_pellet_heu235.name=Высокообогащённая урановая-235 топливная пеллета +item.rbmk_pellet_hes.name=Высокообогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_lea.name=Низкообогащённая америциевая топливная пеллета +item.rbmk_pellet_leaus.name=Низкообогащённая австралиевая топливная пеллета +item.rbmk_pellet_lep.name=Низкообогащённая плутониевая топливная пеллета +item.rbmk_pellet_les.name=Низкообогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_mea.name=Среднеобогащённая америциевая топливная пеллета +item.rbmk_pellet_men.name=Среднеобогащённая нептуниевая топливная пеллета +item.rbmk_pellet_mep.name=Среднеобогащённая плутониевая топливная пеллета +item.rbmk_pellet_mes.name=Среднеобогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_meu.name=Среднеобогащённая урановая топливная пеллета item.rbmk_pellet_mox.name=МОКС топливная пеллета item.rbmk_pellet_po210be.name=Полоний-210-Бериллиевая пеллета item.rbmk_pellet_pu238be.name=Плутоний-238-Бериллиевая пеллета item.rbmk_pellet_ra226be.name=Радий-226-Бериллевая пеллета item.rbmk_pellet_thmeu.name=Торий-урановая топливная пеллета -item.rbmk_pellet_ueu.name=Необогащенная урановая топливная пеллета +item.rbmk_pellet_ueu.name=Необогащённая урановая топливная пеллета item.rbmk_pellet_zfb_am_mix.name=ЦТС пеллета америция реакторного качества item.rbmk_pellet_zfb_bismuth.name=Висмутовая ЦТС пеллета item.rbmk_pellet_zfb_pu241.name=Плутоний-241 ЦТС пеллета @@ -4511,7 +4511,7 @@ item.rod_waste.name=Стержень с ядерными отходами item.rod_water.name=Стержень с водой item.rod_weidanium.name=Weidanium Rod item.rod_zirnox_empty.name=Пустой стержень Цирнокс -item.rod_zirnox_natural_uranium_fuel.name=Необогащенный урановый топливный стержень Цирнокс +item.rod_zirnox_natural_uranium_fuel.name=Необогащённый урановый топливный стержень Цирнокс item.rod_zirnox_uranium_fuel.name=Урановый топливный стержень Цирнокс item.rod_zirnox_th232.name=Торий-232 стержень Цирнокс item.rod_zirnox_thorium_fuel.name=Ториевый топливный стержень Цирнокс @@ -4519,7 +4519,7 @@ item.rod_zirnox_mox_fuel.name=МОКС-топливный стержень Ци item.rod_zirnox_plutonium_fuel.name=Плутониевый топливный стержень Цирнокс item.rod_zirnox_u233_fuel.name=Уран-233 топливный стержень Цирнокс item.rod_zirnox_u235_fuel.name=Уран-235 топливный стержень Цирнокс -item.rod_zirnox_les_fuel.name=Низкообогащенный шрабидиевый топливный стержень Цирнокс +item.rod_zirnox_les_fuel.name=Низкообогащённый шрабидиевый топливный стержень Цирнокс item.rod_zirnox_lithium.name=Литиевый стержень Цирнокс item.rod_zirnox_tritium.name=Тритиевый стержень Цирнокс item.rod_zirnox_zfb_mox.name=ЦТС МОКС-топливный стержень Цирнокс @@ -4530,7 +4530,7 @@ item.rod_zirnox_mox_fuel_depleted.name=Обеднённый МОКС-топли item.rod_zirnox_plutonium_fuel_depleted.name=Обеднённый плутониевый топливный стержень Цирнокс item.rod_zirnox_u233_fuel_depleted.name=Обеднённый уран-233 топливный стержень Цирнокс item.rod_zirnox_u235_fuel_depleted.name=Обеднённый уран-235 топливный стержень Цирнокс -item.rod_zirnox_les_fuel_depleted.name=Обеднённый низкообогащенный шрабидиевый топливный стержень Цирнокс +item.rod_zirnox_les_fuel_depleted.name=Обеднённый низкообогащённый шрабидиевый топливный стержень Цирнокс item.rod_zirnox_zfb_mox_depleted.name=Обеднённый ЦТС МОКС-топливный стержень Цирнокс item.rotor_steel.name=Большой стальной ротор item.rpa_boots.name=Ботинки силовой брони Оставшихся @@ -4858,11 +4858,11 @@ item.waste_mox.name=Обедненное МОКС-топливо item.waste_natural_uranium.name=Обедненное природное урановое топливо item.waste_plate_mox.name=Обеднённая МОКС-топливная пластина item.waste_plate_pu238be.name=Обеднённая плутоний-238-бериллевая топливная пластина -item.waste_plate_pu239.name=Обеднённая высокообогащенная плутониевая-239 топливная пластина +item.waste_plate_pu239.name=Обеднённая высокообогащённая плутониевая-239 топливная пластина item.waste_plate_ra226be.name=Обеднённая радий-226-бериллевая топливная пластина -item.waste_plate_sa326.name=Обеднённая высокообогащенная шрабидий-326 топливная пластина -item.waste_plate_u233.name=Обеднённая высокообогащенная уран-233 топливная пластина -item.waste_plate_u235.name=Обеднённая высокообогащенная уран-235 топливная пластина +item.waste_plate_sa326.name=Обеднённая высокообогащённая шрабидий-326 топливная пластина +item.waste_plate_u233.name=Обеднённая высокообогащённая уран-233 топливная пластина +item.waste_plate_u235.name=Обеднённая высокообогащённая уран-235 топливная пластина item.waste_plutonium.name=Обедненное плутониевое топливо item.waste_schrabidium.name=Обедненное шрабидиевое топливо item.waste_thorium.name=Обедненное ториевое топливо @@ -4874,27 +4874,27 @@ item.watch.name=Сломанные карманные часы item.watch.desc=Маленькие синие карманные часы.$На стекле есть несколько трещин,$и несколько осколков отсутствуют.$Перестали тикать в 2:34. item.watz_pellet.boron.name=Поглощающая Ватцз-пеллета из бора item.watz_pellet.du.name=Поглощающая Ватцз-пеллета из обедненного урана -item.watz_pellet.hes.name=Ватцз-пеллета из высокообогащенного шрабидия +item.watz_pellet.hes.name=Ватцз-пеллета из высокообогащённого шрабидия item.watz_pellet.lead.name=Поглощающая Ватцз-пеллета из свинца -item.watz_pellet.les.name=Ватцз-пеллета из низкообогащенного шрабидия -item.watz_pellet.mes.name=Ватцз-пеллета из среднеобогащенного шрабидия -item.watz_pellet.mep.name=Ватцз-пеллета из среднеобогащенного плутония -item.watz_pellet.meu.name=Ватцз-пеллета из среднеобогащенного урана -item.watz_pellet.nqd.name=Ватцз-пеллета из обогащенного наквадаха +item.watz_pellet.les.name=Ватцз-пеллета из низкообогащённого шрабидия +item.watz_pellet.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия +item.watz_pellet.mep.name=Ватцз-пеллета из среднеобогащённого плутония +item.watz_pellet.meu.name=Ватцз-пеллета из среднеобогащённого урана +item.watz_pellet.nqd.name=Ватцз-пеллета из обогащённого наквадаха item.watz_pellet.nqr.name=Ватцз-пеллета из наквадрии -item.watz_pellet.hen.name=Ватцз-пеллета из высокообогащенного нептуния +item.watz_pellet.hen.name=Ватцз-пеллета из высокообогащённого нептуния item.watz_pellet.schrabidium.name=Ватцз-пеллета из чистого шрабидия item.watz_pellet_depleted.boron.name=Поглощающая Ватцз-пеллета из бора (Обедненная) item.watz_pellet_depleted.du.name=Поглощающая Ватцз-пеллета из обедненного урана (Обедненная) -item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащенного шрабидия (Обедненная) +item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащённого шрабидия (Обедненная) item.watz_pellet_depleted.lead.name=Поглощающая Ватцз-пеллета из свинца (Обедненная) -item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащенного шрабидия (Обедненная) -item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащенного шрабидия (Обедненная) -item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащенного плутония (Обедненная) -item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащенного урана (Обедненная) -item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащенного наквадаха (Обедненная) +item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащённого шрабидия (Обедненная) +item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия (Обедненная) +item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащённого плутония (Обедненная) +item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащённого урана (Обедненная) +item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащённого наквадаха (Обедненная) item.watz_pellet_depleted.nqr.name=Ватцз-пеллета из наквадрии (Обедненная) -item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащенного нептуния (Обедненная) +item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащённого нептуния (Обедненная) item.watz_pellet_depleted.schrabidium.name=Ватцз-пеллета из чистого шрабидия (Обедненная) item.weapon_bat.name=Любимица Ричарда item.weapon_bat_nail.name=Клише @@ -5647,7 +5647,7 @@ tile.gas_monoxide.name=Угарный газ tile.gas_radon.name=Радон tile.gas_radon_dense.name=Плотный радон tile.gas_radon_tomb.name=Могильный газ -tile.geiger.name=Счетчик Гейгера +tile.geiger.name=Счётчик Гейгера tile.glass_ash.name=Пепельное стекло tile.glass_boron.name=Борное стекло tile.glass_lead.name=Свинцовое стекло @@ -5778,7 +5778,7 @@ tile.machine_catalytic_reformer.name=Каталитический реформе tile.machine_centrifuge.name=Центрифуга tile.machine_chemfac.name=Химический завод (Legacy) tile.machine_chemical_factory.name=Химический завод -tile.machine_chemical_factory.desc=Четырехкратный химический завод.$Рецепты обрабатываются в два раза быстрее,$но требуют в два раза больше энергии.$Требует охлаждения водой,$производит пар низкого давления. +tile.machine_chemical_factory.desc=Четырёхкратный химический завод.$Рецепты обрабатываются в два раза быстрее,$но требуют в два раза больше энергии.$Требует охлаждения водой,$производит пар низкого давления. tile.machine_chemical_plant.name=Химическая установка tile.machine_chemplant.name=Химическая установка (Legacy) tile.machine_chungus.name=Паровая турбина "Левиафан" From 4d25b5dc8b10605e3cdd9da80a1f0c31549e7e56 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:42:13 -0600 Subject: [PATCH 141/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 36f2179b9..e55dbacf2 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -258,7 +258,7 @@ book.rbmk.title13=Использование консоли book.rbmk.page13=Щелчок по частям приведет к их выбору и отмене выбора. С помощью цветных кнопок вы можете быстро выбрать все стержни управления этой цветовой группы. Кнопка "A" выберет все стержни управления, "X" отменит выбор всех. book.rbmk.page14=Ввод числа от 0 до 100 в зелёное поле, а затем нажатие кнопки рядом с ним приведет к установке всех выбранных стержней управления в это положение. Кнопка "АЗ-5" приведет к полной вставке всех стержней управления. book.rbmk.title15=Топливо -book.rbmk.page15=Реакция §lтоплива§r зависит от множества факторов. Основными из них являются §lобогащёние§r, §lксеноновое отравление§r и количество поступающих §lнейтронов§r. Ксенон накапливается, когда топливо получает мало нейтронов, и сгорает во время нормальной работы. Эффективность нейтронов зависит от типа, большинство видов топлива §lлучше всего расщепляются медленными нейтронами§r. +book.rbmk.page15=Реакция §lтоплива§r зависит от множества факторов. Основными из них являются §lобогащение§r, §lксеноновое отравление§r и количество поступающих §lнейтронов§r. Ксенон накапливается, когда топливо получает мало нейтронов, и сгорает во время нормальной работы. Эффективность нейтронов зависит от типа, большинство видов топлива §lлучше всего расщепляются медленными нейтронами§r. book.rbmk.title16=Расплавление book.rbmk.page16=§4§lИЗБЕГАЙТЕ. From b9332f2e81a7c18a553b55b064e0bf7c1e7e6d09 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:42:46 -0600 Subject: [PATCH 142/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index e55dbacf2..e07ef9172 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -290,7 +290,7 @@ book.starter.page11=Под землей, по которой вы ходите, book.starter.title12=Радиация book.starter.page12a=§oОстальная часть этой книги будет посвящена вопросам, связанным с §oрадиацией. Для вашей безопасности и безопасности других людей я дам вам §oсоветы о том, как смягчить воздействие и справиться с ней. book.starter.page12b=Достаточное воздействие радиации может привести и приведет к телесным повреждениям. Первый шаг - это внешняя защита; обязательно ограничьте свое воздействие и наденьте защитное снаряжение, например §lЗащитный костюм§r, или прикрепить §lОбшивку§r к вашей одежде или броне; вы также можете принять §lРад-X§r чтобы ограничить получаемую дозу. Спасибо современной медицине, вторым шагом может быть удаление, если это необходимо; например, §l"Обеззараживатель §lигрока"§r будет медленно уменьшать излучение, поглощённое вашим телом. §lАнтирадин§r может быть использован как профилактика при облучении, быстро и эффективно устраняя повреждения, причиненные вашему организму ионизирующим излучением. -book.starter.title13=Обогащёние урана +book.starter.title13=Обогащение урана book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащёния из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. book.starter.title14=Чикагская поленница book.starter.page14=В качестве альтернативы вы можете получить §lРеакторный плутоний§r, более мощное топливо, из природного урана, используя §lЧикагскую поленницу§r. Укладывая графитовые блоки и сверля их, вы можете вставить топливные стержни для размножения в плутоний и стержни источников нейтронов, такие как §lРадий-Бериллий§r, чтобы начать реакцию. Обязательно протестируйте свои конструкции; для предотвращения перегрева может потребоваться разделение или ограничение количества блоков. @@ -681,7 +681,7 @@ chem.SULFURIC_ACID=Производство серной кислоты chem.TATB=Синтез TATB chem.TEL=Смешивание тетраэтилсвинца chem.TEST=Тест -chem.THORIUM_SALT=Обогащёние ториевой соли +chem.THORIUM_SALT=Обогащение ториевой соли chem.TNT=Синтез ТНТ chem.UF6=Производство гексафторида урана chem.VIT_GAS=Остекловывание газообразных ядерных отходов @@ -1012,7 +1012,7 @@ death.sedna.physical.attacker=%1$s был пристрелен %2$s. desc.gui.assembler.warning=§cОшибка:§r Требуется шаблон сборочной машины! desc.gui.chemplant.warning=§cОшибка:§r Требуется шаблон химической машины! -desc.gui.gasCent.enrichment=§2Обогащёние§r$Для обогащёния урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. +desc.gui.gasCent.enrichment=§2Обогащение§r$Для обогащёния урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. desc.gui.gasCent.output=§6Перемещение жидкости§r$Жидкость может быть перемещена$через выходной порт для дальнейшей обработки. desc.gui.nukeBoy.desc=§1Требует:§r$ * Нейтронный щит$ * Снаряд U235$ * Субкритическая цель U235$ * Взрывчатка$ * Воспламенитель desc.gui.nukeGadget.desc=§1Требует:§r$ * 4 Набора взрывоопасных линз$ Первого поколения$ * Плутониевое ядро$ * Провода From e6c059041eaded03fc1d4442703a73acb1d5c0fb Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:45:48 -0600 Subject: [PATCH 143/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index e07ef9172..b9ea4d953 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -291,7 +291,7 @@ book.starter.title12=Радиация book.starter.page12a=§oОстальная часть этой книги будет посвящена вопросам, связанным с §oрадиацией. Для вашей безопасности и безопасности других людей я дам вам §oсоветы о том, как смягчить воздействие и справиться с ней. book.starter.page12b=Достаточное воздействие радиации может привести и приведет к телесным повреждениям. Первый шаг - это внешняя защита; обязательно ограничьте свое воздействие и наденьте защитное снаряжение, например §lЗащитный костюм§r, или прикрепить §lОбшивку§r к вашей одежде или броне; вы также можете принять §lРад-X§r чтобы ограничить получаемую дозу. Спасибо современной медицине, вторым шагом может быть удаление, если это необходимо; например, §l"Обеззараживатель §lигрока"§r будет медленно уменьшать излучение, поглощённое вашим телом. §lАнтирадин§r может быть использован как профилактика при облучении, быстро и эффективно устраняя повреждения, причиненные вашему организму ионизирующим излучением. book.starter.title13=Обогащение урана -book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащёния из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. +book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. book.starter.title14=Чикагская поленница book.starter.page14=В качестве альтернативы вы можете получить §lРеакторный плутоний§r, более мощное топливо, из природного урана, используя §lЧикагскую поленницу§r. Укладывая графитовые блоки и сверля их, вы можете вставить топливные стержни для размножения в плутоний и стержни источников нейтронов, такие как §lРадий-Бериллий§r, чтобы начать реакцию. Обязательно протестируйте свои конструкции; для предотвращения перегрева может потребоваться разделение или ограничение количества блоков. book.starter.title15=ЦИРНОКС РГО @@ -1012,7 +1012,7 @@ death.sedna.physical.attacker=%1$s был пристрелен %2$s. desc.gui.assembler.warning=§cОшибка:§r Требуется шаблон сборочной машины! desc.gui.chemplant.warning=§cОшибка:§r Требуется шаблон химической машины! -desc.gui.gasCent.enrichment=§2Обогащение§r$Для обогащёния урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. +desc.gui.gasCent.enrichment=§2Обогащение§r$Для обогащения урана требуются каскады.$Каскады с двумя центрифугами дадут$урановое топливо, каскады с четырьмя центрифугами$обеспечат полное разделение. desc.gui.gasCent.output=§6Перемещение жидкости§r$Жидкость может быть перемещена$через выходной порт для дальнейшей обработки. desc.gui.nukeBoy.desc=§1Требует:§r$ * Нейтронный щит$ * Снаряд U235$ * Субкритическая цель U235$ * Взрывчатка$ * Воспламенитель desc.gui.nukeGadget.desc=§1Требует:§r$ * 4 Набора взрывоопасных линз$ Первого поколения$ * Плутониевое ядро$ * Провода From 5b22da19c49ce414cede00c1e142407685bca8e2 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:49:47 -0600 Subject: [PATCH 144/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index b9ea4d953..7a4c66d7e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -266,7 +266,7 @@ book.starter.cover=Руководство промышленника$по вос book.starter.title1=Вступление book.starter.page1=Если вы читаете это, то весьма вероятно, что общество, так или иначе, полностью рухнуло. Правительства, страны и власть - это концепция прошлого, вместе со всеми удобствами цивилизованной жизни. Таким образом, это руководство расскажет вам,как изменить это, воссоздав индустрию и технологии прошлого для улучшения вашей собственной жизни. book.starter.title2=Уголь и горчичный газ -book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в ее нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. +book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в её нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. book.starter.title3=Наковальни и прессы book.starter.page3=Квинтэссенцией для начала вашего промышленного возрождения являются §lнаковальня§r и §lпресс§r. Наковальня позволит вам вручную создавать ранние механизмы, такие как сборочная машина, в то время как пресс позволит вам изготавливать пластины, провода и схемы, которые вы не можете сделать с помощью наковальни. book.starter.title4=Шаблоны @@ -420,7 +420,7 @@ book_lore.bf_bomb_3.name=Личные заметки book_lore.bf_bomb_3.author=М. Портер book_lore.bf_bomb_3.page.0=Мы с командой добились некоторых успехов. Особенно в плане работы с персоналом – игнорирование особо верующих людей сделало работу гораздо пристойней. Мы до сих пор не имеем ни малейшего представления о реальных свойствах жар-огня (сложно анализировать book_lore.bf_bomb_3.page.1=образец, тупо сжигающий твоё оборудование), но его взаимодействие с другими материалами дало нам пищу для размышлений. Примечательно, что они синтезировали "газообразную" форму: из всего персонала, именно Эндрю сообщил мне, что это был коллоид из микроскопических частиц жар-огня, взвешенных в некоем -book_lore.bf_bomb_3.page.2=инертном газе. Каждая частица окружена положительно заряженным 'пузырём' ионизированного газа, препятствующим ее осаждению. Кто бы мог подумать, что смертельное гамма-излучение может приносить пользу? Точно не я. $ Я предпочитаю не думать о том, что они превратили образец в +book_lore.bf_bomb_3.page.2=инертном газе. Каждая частица окружена положительно заряженным 'пузырём' ионизированного газа, препятствующим её осаждению. Кто бы мог подумать, что смертельное гамма-излучение может приносить пользу? Точно не я. $ Я предпочитаю не думать о том, что они превратили образец в book_lore.bf_bomb_3.page.3=дисперсную смесь, но я не могу недооценить удобство этого газообразного жар-пламени – экспериментировать с ним стало гораздо безопаснее. $ Говоря о безопасности, главный исследователь (в приступе бездумного пренебрежения) сделал открытие, которое чуть не стоило ему жизни. book_lore.bf_bomb_3.page.4=Он решил получить "грязнушку", позволив ячейке нашего нового коллоида напрямую взаимодействовать с какой-то очень дорогой антиматерией: в результате взрыва стол, на котором она стояла, превратился в кусок отбеленного радиацией шлака, прорезанный почти идеальной полусферой сквозь book_lore.bf_bomb_3.page.5=столешницу, также главный исследователь получил острую лучевую болезнь. Думаю, теперь мы знаем, как его взорвать, но, боже, некоторые люди... @@ -2448,7 +2448,7 @@ item.canned_pizza.desc=Преступление против человечес item.canned_recursion.name=Консервированная рекурсия item.canned_recursion.desc=Консервированная рекурсия item.canned_spam.name=Консервы “Спам” -item.canned_spam.desc=Действие трехминутного скетча разворачивается в вымышленном кафе$"зелёный Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать ее спам и заказывает блюдо с большим$количеством спама и запеченной фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь ещё громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он все чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. +item.canned_spam.desc=Действие трёхминутного скетча разворачивается в вымышленном кафе$"Зелёный Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать её спам и заказывает блюдо с большим$количеством спама и запечённой фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь ещё громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он всё чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. item.canned_stew.name=Консервы "Тушеные грибы" item.canned_stew.desc=... item.canned_tomato.name=Консервированный томатный суп From daae2a5e32dcd6e951fd9420ba484500352e9b37 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 30 Jul 2025 22:40:28 +0200 Subject: [PATCH 145/323] exponsiv --- changelog | 5 +- .../java/com/hbm/crafting/WeaponRecipes.java | 2 +- .../java/com/hbm/inventory/RecipesCommon.java | 2 +- .../recipes/AssemblyMachineRecipes.java | 332 ++++++++++++++---- .../inventory/recipes/ShredderRecipes.java | 2 - .../inventory/recipes/anvil/AnvilRecipes.java | 48 +-- .../recipes/loader/GenericRecipe.java | 2 +- src/main/java/com/hbm/items/ItemEnums.java | 2 +- .../java/com/hbm/util/AchievementHandler.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../textures/items/item_expensive.circuit.png | Bin 0 -> 422 bytes .../items/item_expensive.computer.png | Bin 0 -> 289 bytes 13 files changed, 280 insertions(+), 121 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_expensive.computer.png diff --git a/changelog b/changelog index 06cca47a8..a2b6a0de9 100644 --- a/changelog +++ b/changelog @@ -18,9 +18,12 @@ * Mining lasers now build up barricades in all directions and not just horizontal ones, preventing potential deadlocks due to liquid flowing in from above * One of the new secret parts for making a certain weapon is now obtainable again via red rooms * Biogas can now be cracked into aromatics and petroleum gas +* Custom missile part recipes have been added to the new assembler +* Mini nukes are now made from weapon steel instead of regular steel ## Fixed * Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit * As an extra safeguard, the recipe loader now throws an exception if that happens * Fixed dupe caused by the breeding reactor -* Fixed a potential crash caused by a change done to tile entity proxies in relation to EnergyControl \ No newline at end of file +* Fixed a potential crash caused by a change done to tile entity proxies in relation to EnergyControl +* Fixed the assembler achievement still using the old one \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 238de0e25..8696b2599 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -207,7 +207,7 @@ public class WeaponRecipes { //Ammo assemblies - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nuke, 1), new Object[] { " WP", "SEP", " WP", 'W', GOLD.wireFine(), 'P', STEEL.plate(), 'S', STEEL.shell(), 'E', ModItems.ball_tatb }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nuke, 1), new Object[] { " WP", "SEP", " WP", 'W', GOLD.wireFine(), 'P', WEAPONSTEEL.plate(), 'S', WEAPONSTEEL.shell(), 'E', ModItems.ball_tatb }); //240mm Shells CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_shell, 4), new Object[] { " T ", "GHG", "CCC", 'T', ModBlocks.tnt, 'G', Items.gunpowder, 'H', STEEL.shell(), 'C', CU.ingot() }); diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index c2b9116a5..fd7ed9d36 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -98,9 +98,9 @@ public class RecipesCommon { public ItemStack extractForCyclingDisplay(int cycle) { List list = extractForNEI(); - cycle *= 50; + if(list.isEmpty()) return new ItemStack(ModItems.nothing); return list.get((int)(System.currentTimeMillis() % (cycle * list.size()) / cycle)); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index e38c4cf32..a99236b60 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -89,12 +89,18 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(TI.plate(), 4), new OreDictStack(STEEL.bolt(), 16))); this.register(new GenericRecipe("ass.exheavyframe").setup(600, 800).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME.ordinal())) .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CU.plateWelded(), 4), new OreDictStack(DESH.ingot(), 1), new OreDictStack(DURA.bolt(), 32))); + this.register(new GenericRecipe("ass.excircuit").setup(400, 4_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT.ordinal())) + .inputItems(new ComparableStack(ModItems.circuit, 12, EnumCircuitType.BASIC), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CAPACITOR), new OreDictStack(GOLD.wireFine(), 32)) + .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 1_000))); this.register(new GenericRecipe("ass.exleadplating").setup(400, 4_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.LEAD_PLATING.ordinal())) .inputItems(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.STEEL_PLATING), new OreDictStack(PB.plateCast(), 8), new OreDictStack(B.ingot(), 2), new OreDictStack(W.bolt(), 32)) .inputFluids(new FluidStack(Fluids.LUBRICANT, 1_000))); this.register(new GenericRecipe("ass.exferroplating").setup(1_200, 10_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING.ordinal())) .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.LEAD_PLATING), new OreDictStack(FERRO.plateCast(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4)) .inputFluids(new FluidStack(Fluids.UNSATURATEDS, 1_000))); + this.register(new GenericRecipe("ass.excomputer").setup(1_200, 16_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CAPACITOR_BOARD), new ComparableStack(ModBlocks.glass_quartz, 8)) + .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL, 2_000))); this.register(new GenericRecipe("ass.bronzetubes").setup(3_000, 250_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.BRONZE_TUBES.ordinal())) .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ZR.plateWelded(), 1)) .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL_COLD, 4_000)) @@ -201,59 +207,85 @@ public class AssemblyMachineRecipes extends GenericRecipes { // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) - .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plateCast(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.arcfurnace").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_arc_furnace, 1)) - .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal()))); + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal())) + .inputItemsEx(new OreDictStack(ANY_CONCRETE.any(), 12), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG.ordinal()))); this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(TI.shell(), 3), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.electrolyzer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_electrolyser, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) - .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1))); + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.drill_titanium, 1))); this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) - .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1))); + .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.drill_titanium, 1))); this.register(new GenericRecipe("ass.fracker").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_fracking_tower, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 24), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); + .inputItems(new OreDictStack(STEEL.shell(), 24), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) - .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3))); + .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate528(), 4), new ComparableStack(ModItems.thermo_element, 3))); this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.crackingtower").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_cracker, 1)) - .inputItems(new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(STEEL.shell(), 6), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(NB.ingot(), 2), new ComparableStack(ModItems.catalyst_clay, 12))); + .inputItems(new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(STEEL.shell(), 6), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(NB.ingot(), 2), new ComparableStack(ModItems.catalyst_clay, 12)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new OreDictStack(NB.ingot(), 4))); this.register(new GenericRecipe("ass.radiolysis").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_radiolysis, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.thermo_element, 8))); + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.thermo_element, 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 16), new ComparableStack(ModItems.thermo_element, 8))); this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(NB.ingot(), 4))); this.register(new GenericRecipe("ass.vaccumrefinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_vacuum_distill, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CHIP_BISMOID))); + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CHIP_BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CHIP_BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.reformer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_reformer, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 3), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 3), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.hydrotreater").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hydrotreater, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(CU.plateCast(), 4), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 2), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(CU.plateCast(), 4), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 2), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor_desh, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.pyrooven").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_pyrooven, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 4), new OreDictStack(CU.pipe(), 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 4), new OreDictStack(CU.pipe(), 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.ingot_cft, 4), new ComparableStack(ModItems.motor_bismuth, 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.liquefactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_liquefactor, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 12), new OreDictStack(ANY_TAR.any(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_tungsten, 8))); + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 12), new OreDictStack(ANY_TAR.any(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_tungsten, 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_TAR.any(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); this.register(new GenericRecipe("ass.solidifier").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_solidifier, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(AL.plate528(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_copper, 4))); + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(AL.plate528(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_copper, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); this.register(new GenericRecipe("ass.compressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.compactcompressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor_compact, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(TI.shell(), 4), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(TI.shell(), 4), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) - .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.part_generic, 4, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.fel").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_fel, 1)) - .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.silex").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_silex, 1)) - .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8))); + .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(RUBBER.ingot(), 16))); this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) @@ -279,29 +311,37 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.slopper").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_ore_slopper, 1)) .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(TI.plate(), 8), new OreDictStack(CU.pipe(), 3), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(TI.shell(), 4), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(TI.shell(), 4), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.motor_desh, 3))); this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); this.register(new GenericRecipe("ass.radar").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_radar, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(ANY_RUBBER.ingot(), 12), new ComparableStack(ModItems.magnetron, 5), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.crt_display, 4))); + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(ANY_RUBBER.ingot(), 12), new ComparableStack(ModItems.magnetron, 5), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.crt_display, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.crt_display, 4))); this.register(new GenericRecipe("ass.radarlarge").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radar_large, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.crt_display, 4))); this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) .inputItems(new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); this.register(new GenericRecipe("ass.difurnacertg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_difurnace_rtg_off, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(DESH.ingot(), 4), new OreDictStack(PB.plate528(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(CU.plate(), 12))); this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) - .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))); + .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_CONCRETE.any(), 8))); this.register(new GenericRecipe("ass.assemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_assemfac, 1)) - .inputItems(new OreDictStack(STEEL.ingot(), 48), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor, 18), new OreDictStack(W.bolt(), 16), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.ingot(), 48), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor, 18), new OreDictStack(W.bolt(), 16), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.coil_copper, 4))); this.register(new GenericRecipe("ass.combustiongen").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_combustion_engine, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(GOLD.wireDense(), 16), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.pistonsetsteel").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STEEL.ordinal())) .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 4), new OreDictStack(W.ingot(), 8), new OreDictStack(W.bolt(), 16))); this.register(new GenericRecipe("ass.pistonsetdura").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DURA.ordinal())) @@ -311,21 +351,28 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.pistonsetstar").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STARMETAL.ordinal())) .inputItems(new OreDictStack(STAR.ingot(), 24), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(NB.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) - .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 3), new OreDictStack(GOLD.wireDense(), 16), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.turbine_tungsten, 2), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.hephaestus").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hephaestus, 1)) - .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16))); + .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(NB.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new ComparableStack(ModBlocks.glass_quartz, 16))); this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16))); + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 12), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 64))); this.register(new GenericRecipe("ass.radgen").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radgen, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "radgen") - .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1))); + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack(KEY_RED, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.coil_magnetized_tungsten, 16), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack(KEY_RED, 1), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); // condensers this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 5), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 16))); // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) @@ -348,59 +395,90 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.plate_dineutronium, 24), new ComparableStack(ModItems.ingot_u238m2), new ComparableStack(ModItems.ingot_cft, 64), + new ComparableStack(ModItems.ingot_cft, 64)) + .inputItemsEx(new ComparableStack(ModItems.ingot_electronium, 64), + new ComparableStack(ModBlocks.machine_dineutronium_battery, 16), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.BRONZE_TUBES), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.FERRO_PLATING), + new OreDictStack(STAR.block(), 64), + new ComparableStack(ModBlocks.machine_transformer_dnt, 8), + new ComparableStack(ModItems.coil_magnetized_tungsten, 24), + new ComparableStack(ModItems.powder_magic, 64), + new ComparableStack(ModItems.plate_dineutronium, 24), + new ComparableStack(ModItems.ingot_u238m2), + new ComparableStack(ModItems.ingot_cft, 64), new ComparableStack(ModItems.ingot_cft, 64))); // fluid tanks this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4))); + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_TAR.any(), 4))); this.register(new GenericRecipe("ass.bat9k").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_bat9000, 1)) - .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16))); this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) - .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1))); + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(BIGMT.plateCast(), 16), new ComparableStack(ModItems.coil_advanced_alloy, 24), new ComparableStack(ModItems.battery_sc_polonium, 1))); // accelerators this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) - .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ND.wireDense(), 32), new OreDictStack(AL.plateWelded(), 16), new OreDictStack(RUBBER.ingot(), 32), new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.beamline").setup(200, 100).outputItems(new ItemStack(ModBlocks.pa_beamline, 1)) - .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4))); + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4))); this.register(new GenericRecipe("ass.rfc").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_rfc, 1)) - .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16))); + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16))); this.register(new GenericRecipe("ass.quadrupole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_quadrupole, 1)) - .inputItems(new ComparableStack(ModBlocks.pa_beamline, 1), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 1), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 1), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.dipole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_dipole, 1)) - .inputItems(new ComparableStack(ModBlocks.pa_beamline, 2), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 2), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 2), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.source").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_source, 1)) - .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM))); + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.detector").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_detector, 1)) - .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM))); + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 32, EnumExpensiveType.LEAD_PLATING), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(GOLD.wireDense(), 64))); this.register(new GenericRecipe("ass.panbti").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.NIOBIUM.ordinal())).inputItems(new OreDictStack(NB.wireDense(), 64), new OreDictStack(TI.wireDense(), 64))); this.register(new GenericRecipe("ass.pabscco").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.BSCCO.ordinal())).inputItems(new OreDictStack(BSCCO.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64))); this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 64), new OreDictStack(CU.wireDense(), 64), new ComparableStack(ModItems.powder_chlorophyte, 16))); this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) - .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16))); + .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItems(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); // reactors this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) - .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1))); + .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(ASBESTOS.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1))); this.register(new GenericRecipe("ass.researchreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.reactor_research, 1)) - .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.rbmk").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_blank, 1)) - .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4))); + .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4)) + .inputItemsEx(new ComparableStack(ModBlocks.concrete_asbestos, 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(CU.plate(), 16))); // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) - .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(W.plateWelded(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) - .inputItems(new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 6), new OreDictStack(ALLOY.wireFine(), 24))); + .inputItems(new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 6), new OreDictStack(ALLOY.wireFine(), 24)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(ALLOY.wireFine(), 24))); this.register(new GenericRecipe("ass.fusionmotor").setup(400, 100).outputItems(new ItemStack(ModBlocks.fusion_motor, 1)) - .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4))); + .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new ComparableStack(ModItems.motor, 4))); this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) - .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); + .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(W.plateWelded(), 4), new ComparableStack(ModItems.magnetron, 2))); this.register(new GenericRecipe("ass.blankettungsten").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_tungsten, 1)) .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 64))); this.register(new GenericRecipe("ass.blanketdesh").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_desh, 1)) @@ -410,36 +488,49 @@ public class AssemblyMachineRecipes extends GenericRecipes { // watz this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) - .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(BIGMT.ingot(), 6), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.watzcooler").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_cooler, 3)) - .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2))); + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2)) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(RUBBER.ingot(), 8))); this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) - .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2)) + .inputItems(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_RESISTANTALLOY.plateWelded()))); // ICF this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) - .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16))); + .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModBlocks.glass_quartz, 16))); this.register(new GenericRecipe("ass.icfemitter").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.EMITTER.ordinal())) .inputItems(new OreDictStack(W.plateWelded(), 4), new OreDictStack(MAGTUNG.wireDense(), 16)) + .inputItemsEx(new OreDictStack(W.plateWelded(), 8), new OreDictStack(MAGTUNG.wireDense(), 16)) .inputFluids(new FluidStack(Fluids.XENON, 16_000))); this.register(new GenericRecipe("ass.icfcapacitor").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CAPACITOR.ordinal())) - .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 1), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.ingot(), 2))); + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 1), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.wireDense(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.wireDense(), 2))); this.register(new GenericRecipe("ass.icfturbo").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.TURBO.ordinal())) - .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new OreDictStack(DNT.wireDense(), 4), new OreDictStack(SBD.ingot(), 4))); + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new OreDictStack(DNT.wireDense(), 4), new OreDictStack(SBD.wireDense(), 4)) + .inputItemsEx(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(DNT.wireDense(), 8), new OreDictStack(SBD.wireDense(), 4))); this.register(new GenericRecipe("ass.icfcasing").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CASING.ordinal())) - .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16))); + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16))); this.register(new GenericRecipe("ass.icfport").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.PORT.ordinal())) - .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 4))); + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 16))); this.register(new GenericRecipe("ass.icfcontroller").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_controller, 1)) - .inputItems(new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); + .inputItems(new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.icfscaffold").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 0)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(TI.plateWelded(), 2))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(TI.plateWelded(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING))); this.register(new GenericRecipe("ass.icfvessel").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 1)) .inputItems(new ComparableStack(ModItems.ingot_cft, 1), new OreDictStack(CMB.plateCast(), 1), new OreDictStack(W.plateWelded(), 2))); this.register(new GenericRecipe("ass.icfstructural").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 3)) - .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 1))); + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(STEEL.plateWelded(), 8))); this.register(new GenericRecipe("ass.icfcore").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.struct_icf_core, 1)) - .inputItems(new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.QUANTUM))); + .inputItems(new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.icfpress").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_icf_press, 1)) .inputItems(new OreDictStack(GOLD.plateCast(), 8), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); @@ -660,6 +751,103 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(ANY_CONCRETE.any(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModBlocks.steel_scaffold, 24), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED))); this.register(new GenericRecipe("ass.launchpadsilo").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_CONCRETE.any(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED))); + + // custom missile thrusters + this.register(new GenericRecipe("ass.mpt10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.pipe(), 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.mpt10solid").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(DURA.pipe(), 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.mpt10xenon").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_xenon, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.arc_electrode, 1))); + this.register(new GenericRecipe("ass.mpt15kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15kerodual").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15kerotriple").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene_triple, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15solid16").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_solid_hexdecuple, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(DESH.ingot(), 4))); + this.register(new GenericRecipe("ass.mpt15hydrodual").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_hydrogen_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(DESH.ingot(), 4))); + this.register(new GenericRecipe("ass.mpt15bfshort").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_short, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 5), new OreDictStack(W.plateCast(), 8), new OreDictStack(BIGMT.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15bf").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_short, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 5), new OreDictStack(W.plateCast(), 16), new OreDictStack(BIGMT.plate(), 16))); + this.register(new GenericRecipe("ass.mpt15bflarge").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_large, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 10), new OreDictStack(W.plateCast(), 16), new OreDictStack(BIGMT.plate(), 24))); + this.register(new GenericRecipe("ass.mpt20kero").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20kerodual").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20kerotriple").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene_triple, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solid").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solidmulti").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid_multi, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solidmultier").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid_multier, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + + // custom missile fuselages + this.register(new GenericRecipe("ass.mpf10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(AL.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf10kerolong").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(AL.plate(), 16), new OreDictStack(STEEL.plate(), 6))); + this.register(new GenericRecipe("ass.mpf10solid").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf10solidlong").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(TI.plate(), 16), new OreDictStack(STEEL.plate(), 6))); + this.register(new GenericRecipe("ass.mpf10xenon").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_xenon, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(CU.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf1015kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(AL.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(CU.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015bf").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_balefire, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf15kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(AL.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf15solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(TI.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf15hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(CU.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf1520kero").setup(400, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_20_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(AL.plate(), 48), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpf1520solid").setup(400, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_20_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(TI.plate(), 48), new OreDictStack(STEEL.plate(), 16))); + + // custom missile warheads + this.register(new GenericRecipe("ass.mpw10he").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_he, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10inc").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_incendiary, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 2), new OreDictStack(P_RED.dust(), 6), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10bus").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_buster, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 6), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10nukesmall").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_nuclear, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 16), new OreDictStack(PU239.billet(), 2), new OreDictStack(OreDictManager.getReflector(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw10nukelarge").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_nuclear_large, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 16), new OreDictStack(PU239.billet(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 12), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw10taint").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_taint, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new OreDictStack(Fluids.WATZ.getDict(1_000), 1))); + this.register(new GenericRecipe("ass.mpw10cloud").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_cloud, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2))); + this.register(new GenericRecipe("ass.mpw15he").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_he, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 12), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw15inc").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_incendiary, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 12), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new OreDictStack(P_RED.dust(), 16), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw15nuke").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_nuclear, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new OreDictStack(PU239.billet(), 12), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.ball_tatb, 24), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw15n2").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_n2, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new ComparableStack(ModItems.ball_tatb, 32), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.mpw15bf").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_balefire, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 16), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER))); + /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) .inputItems()); diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index af47669a1..967fa3ace 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -205,7 +205,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(Items.apple, new ItemStack(Items.sugar, 1)); ShredderRecipes.setRecipe(Items.carrot, new ItemStack(Items.sugar, 1)); ShredderRecipes.setRecipe(ModItems.can_empty, new ItemStack(ModItems.powder_aluminium, 2)); - ShredderRecipes.setRecipe(ModBlocks.machine_well, new ItemStack(ModItems.powder_steel, 32)); ShredderRecipes.setRecipe(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE), new ItemStack(ModItems.powder_desh_mix)); ShredderRecipes.setRecipe(Blocks.sand, new ItemStack(ModItems.dust, 2)); ShredderRecipes.setRecipe(ModBlocks.block_slag, new ItemStack(ModItems.powder_cement, 4)); @@ -285,7 +284,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModBlocks.chain, new ItemStack(ModItems.powder_steel_tiny, 1)); ShredderRecipes.setRecipe(ModBlocks.steel_grate, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.pipes_steel, new ItemStack(ModItems.powder_steel, 27)); - ShredderRecipes.setRecipe(ModBlocks.machine_fluidtank, new ItemStack(ModItems.powder_steel, 16)); ShredderRecipes.setRecipe(new ItemStack(ModItems.bedrock_ore, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(Blocks.gravel)); /* Sellafite scrapping */ diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index a98931abb..291cc2341 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -215,9 +215,6 @@ public class AnvilRecipes extends SerializableRecipe { new AStack[] {new ComparableStack(ModItems.motor), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(DESH.ingot(), 2), new ComparableStack(ModItems.coil_gold_torus)}, new AnvilOutput(new ItemStack(ModItems.motor_desh, 1))).setTier(3)); - pullFromAssembler(new ComparableStack(ModItems.filter_coal), 2); - pullFromAssembler(new ComparableStack(ModItems.thermo_element), 2); - constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(Blocks.stonebrick, 4), @@ -226,13 +223,14 @@ public class AnvilRecipes extends SerializableRecipe { }, new AnvilOutput(new ItemStack(ModBlocks.machine_difurnace_off))).setTier(1)); - int ukModifier = 1; + boolean exp = GeneralConfig.enableExpensiveMode; + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { - new OreDictStack(STEEL.ingot(), 8 * ukModifier), - new OreDictStack(CU.plate(), 4 * ukModifier), - new ComparableStack(ModItems.motor, 2 * ukModifier), - new ComparableStack(ModItems.circuit, 4 * ukModifier, EnumCircuitType.VACUUM_TUBE.ordinal()) + new OreDictStack(STEEL.ingot(), 8), + new OreDictStack(CU.plate(), 4), + new ComparableStack(ModItems.motor, 2), + exp ? new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ANALOG) : new ComparableStack(ModItems.circuit, 4, EnumCircuitType.VACUUM_TUBE) }, new AnvilOutput(new ItemStack(ModBlocks.machine_assembly_machine))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( @@ -405,8 +403,6 @@ public class AnvilRecipes extends SerializableRecipe { new ComparableStack(ModItems.sawblade) }, new AnvilOutput(new ItemStack(ModBlocks.machine_autosaw))).setTier(2)); - pullFromAssembler(new ComparableStack(ModBlocks.machine_diesel), 2); - /*constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), @@ -546,8 +542,6 @@ public class AnvilRecipes extends SerializableRecipe { new AStack[] {new ComparableStack(ModItems.plate_dineutronium, 4), new ComparableStack(ModItems.particle_sparkticle, 1), new ComparableStack(ModItems.plate_armor_fau, 6)}, new AnvilOutput(new ItemStack(ModItems.plate_armor_dnt))).setTier(7)); - pullFromAssembler(new ComparableStack(ModItems.plate_mixed, 4), 3); - constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(ModItems.missile_doomsday_rusted, 1), @@ -594,37 +588,9 @@ public class AnvilRecipes extends SerializableRecipe { constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 26))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 27))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 28))).setTier(2)); - - pullFromAssembler(new ComparableStack(ModItems.pellet_buckshot), 1); } - public static void registerConstructionUpgrades() { - pullFromAssembler(new ComparableStack(ModItems.upgrade_template), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_3), 4); - - pullFromAssembler(new ComparableStack(ModItems.upgrade_radius), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_health), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_smelter), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_shredder), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_centrifuge), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_crystallizer), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_nullifier), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_screm), 4); - } + public static void registerConstructionUpgrades() { } public static void registerConstructionRecycling() { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 564938092..0b41f634a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -59,7 +59,7 @@ public class GenericRecipe { public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } - public GenericRecipe inputItemsEx(AStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } + public GenericRecipe inputItemsEx(AStack... input) { if(GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } public GenericRecipe inputFluidsEx(FluidStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index e8692cd67..560823508 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -92,6 +92,6 @@ public class ItemEnums { } public static enum EnumExpensiveType { - STEEL_PLATING, HEAVY_FRAME, LEAD_PLATING, FERRO_PLATING, BRONZE_TUBES + STEEL_PLATING, HEAVY_FRAME, CIRCUIT, LEAD_PLATING, FERRO_PLATING, COMPUTER, BRONZE_TUBES } } diff --git a/src/main/java/com/hbm/util/AchievementHandler.java b/src/main/java/com/hbm/util/AchievementHandler.java index 4ad24e8f4..8ffbb48e8 100644 --- a/src/main/java/com/hbm/util/AchievementHandler.java +++ b/src/main/java/com/hbm/util/AchievementHandler.java @@ -47,7 +47,7 @@ public class AchievementHandler { craftingAchievements.put(new ComparableStack(ModItems.mp_warhead_15_boxcar), MainRegistry.achRedBalloons); craftingAchievements.put(new ComparableStack(ModBlocks.struct_iter_core), MainRegistry.achFusion); craftingAchievements.put(new ComparableStack(ModBlocks.machine_difurnace_off), MainRegistry.achBlastFurnace); - craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembler), MainRegistry.achAssembly); + craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembly_machine), MainRegistry.achAssembly); craftingAchievements.put(new ComparableStack(ModItems.billet_pu_mix), MainRegistry.achChicagoPile); } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index deddc496a..7db6f3284 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2352,6 +2352,8 @@ item.insert_steel.name=Schwere Stahleinlage item.insert_xsapi.name=XSAPI-Einlage item.insert_yharonite.name=Yharoniteinlage item.item_expensive.bronze_tubes.name=Bronze-Strukturelement +item.item_expensive.circuit.name=Umfangreiche Platine +item.item_expensive.computer.name=Großrechner item.item_expensive.ferro_plating.name=Verstärkte Ferrouraniumpanele item.item_expensive.heavy_frame.name=Schweres Gestell item.item_expensive.lead_plating.name=Strahlenresistente Plattierung diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e17773efa..d5875f121 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3178,6 +3178,8 @@ item.insert_steel.name=Heavy Steel Insert item.insert_xsapi.name=XSAPI Insert item.insert_yharonite.name=Yharonite Insert item.item_expensive.bronze_tubes.name=Bronze Structural Elements +item.item_expensive.circuit.name=Extensive Circuit Board +item.item_expensive.computer.name=Mainframe item.item_expensive.ferro_plating.name=Reinforced Ferrouranium Panels item.item_expensive.heavy_frame.name=Heavy Framework item.item_expensive.lead_plating.name=Radiation Resistant Plating diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png b/src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..9620c75357d94e17c03da2770fe550a948535ac4 GIT binary patch literal 422 zcmV;X0a^ZuP)}t>AbH1s7bX#em!2ou!WQzq-mPcFbt__+REB63@JOv zVG9|}rU075GODAplMt;d`hvaMw2I?6=!5VI(4PxD7W)+P&|ohfXiJL*W?Xl2UAPU; z_5_Nn9DIyMc%Fyv`_vVkaiXqGt8{YRB?n5B!M6defIWfYaX7o+z$*3PO?5@5Ev+z% zi)~!jMF_#>6+dKfY2v#s6`}EZV^KNNNT(GtnfZ3B)LTCTAtrd9hY%v}|9J*#Nj QCIA2c07*qoM6N<$g0e=t?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.computer.png b/src/main/resources/assets/hbm/textures/items/item_expensive.computer.png new file mode 100644 index 0000000000000000000000000000000000000000..7c14b82edde3b45a066168e18e22eb0cfe9796dd GIT binary patch literal 289 zcmV++0p9+JP)hnD>?FzsJw n@O^`12G4%s4!>le!XK$CVXKyo9SBlC00000NkvXXu0mjfjN5Xl literal 0 HcmV?d00001 From ef3397ddb11122524874fe6e36728195f978f197 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:55:18 -0600 Subject: [PATCH 146/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 7a4c66d7e..9beb5c345 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2007,47 +2007,47 @@ item.ammo_standard.g40_he.name=40мм граната (Фугасная) item.ammo_standard.g40_heat.name=40мм граната (Кумулятивная) item.ammo_standard.g40_inc.name=40мм граната (Зажигательная) item.ammo_standard.g40_phosphorus.name=40мм граната (Белый фосфор) -item.ammo_standard.m357_ap.name=.357 magnum (Бронебойный) -item.ammo_standard.m357_bp.name=.357 magnum (Чёрный порох) -item.ammo_standard.m357_express.name=.357 magnum (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m357_fmj.name=.357 magnum (Цельнометаллическая оболочка) -item.ammo_standard.m357_jhp.name=.357 magnum (Экспансивный+) -item.ammo_standard.m357_sp.name=.357 magnum (Экспансивный) -item.ammo_standard.m44_ap.name=.44 magnum (Бронебойный) -item.ammo_standard.m44_bp.name=.44 magnum (Чёрный порох) -item.ammo_standard.m44_express.name=.44 magnum (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m44_fmj.name=.44 magnum (Цельнометаллическая оболочка) -item.ammo_standard.m44_jhp.name=.44 magnum (Экспансивный+) -item.ammo_standard.m44_sp.name=.44 magnum (Экспансивный) +item.ammo_standard.m357_ap.name=Патрон .357 магнум (Бронебойный) +item.ammo_standard.m357_bp.name=Патрон .357 магнум (Чёрный порох) +item.ammo_standard.m357_express.name=Патрон .357 магнум (Высокомощная цельнометаллическая оболочка) +item.ammo_standard.m357_fmj.name=Патрон .357 магнум (Цельнометаллическая оболочка) +item.ammo_standard.m357_jhp.name=Патрон .357 магнум (Экспансивный+) +item.ammo_standard.m357_sp.name=Патрон .357 магнум (Экспансивный) +item.ammo_standard.m44_ap.name=Патрон .44 магнум (Бронебойный) +item.ammo_standard.m44_bp.name=Патрон .44 магнум (Чёрный порох) +item.ammo_standard.m44_express.name=Патрон .44 магнум (Высокомощная цельнометаллическая оболочка) +item.ammo_standard.m44_fmj.name=Патрон .44 магнум (Цельнометаллическая оболочка) +item.ammo_standard.m44_jhp.name=Патрон .44 магнум (Экспансивный+) +item.ammo_standard.m44_sp.name=Патрон .44 магнум (Экспансивный) item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Разрушающий) item.ammo_standard.nuke_high.name=Ядерный минизаряд (Высокомощный) item.ammo_standard.nuke_hive.name=Ракетный рой item.ammo_standard.nuke_standard.name=Ядерный минизаряд item.ammo_standard.nuke_tots.name=Ядерный минизаряд (Карапузы) -item.ammo_standard.p22_ap.name=.22 LR патрон (Бронебойный) -item.ammo_standard.p22_fmj.name=.22 LR патрон (Цельнометаллическая оболочка) -item.ammo_standard.p22_jhp.name=.22 LR патрон (Экспансивный+) -item.ammo_standard.p22_sp.name=.22 LR патрон (Экспансивный) -item.ammo_standard.p45_ap.name=.45 патрон (Бронебойный) -item.ammo_standard.p45_du.name=.45 патрон (Depleted Uranium) -item.ammo_standard.p45_fmj.name=.45 патрон (Цельнометаллическая оболочка) -item.ammo_standard.p45_jhp.name=.45 патрон (Экспансивный+) -item.ammo_standard.p45_sp.name=.45 патрон (Экспансивный) -item.ammo_standard.p9_ap.name=9мм патрон (Бронебойный) -item.ammo_standard.p9_fmj.name=9мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.p9_jhp.name=9мм патрон (Экспансивный+) -item.ammo_standard.p9_sp.name=9мм патрон (Экспансивный) -item.ammo_standard.r556_ap.name=5.56мм патрон (Бронебойный) -item.ammo_standard.r556_fmj.name=5.56мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.r556_jhp.name=5.56мм патрон (Экспансивный+) -item.ammo_standard.r556_sp.name=5.56мм патрон (Экспансивный) -item.ammo_standard.r762_ap.name=7.62мм патрон (Бронебойный) -item.ammo_standard.r762_du.name=7.62мм патрон (Обеднённый уран) -item.ammo_standard.r762_fmj.name=7.62мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.r762_he.name=7.62mm патрон (Разрывной) -item.ammo_standard.r762_jhp.name=7.62мм патрон (Экспансивный+) -item.ammo_standard.r762_sp.name=7.62мм патрон (Экспансивный) +item.ammo_standard.p22_ap.name=Патрон .22 LR (Бронебойный) +item.ammo_standard.p22_fmj.name=Патрон .22 LR (Цельнометаллическая оболочка) +item.ammo_standard.p22_jhp.name=Патрон .22 LR (Экспансивный+) +item.ammo_standard.p22_sp.name=Патрон .22 LR (Экспансивный) +item.ammo_standard.p45_ap.name=Патрон .45 (Бронебойный) +item.ammo_standard.p45_du.name=Патрон .45 (Depleted Uranium) +item.ammo_standard.p45_fmj.name=Патрон .45 (Цельнометаллическая оболочка) +item.ammo_standard.p45_jhp.name=Патрон .45 (Экспансивный+) +item.ammo_standard.p45_sp.name=Патрон .45 (Экспансивный) +item.ammo_standard.p9_ap.name=9мм-ый патрон (Бронебойный) +item.ammo_standard.p9_fmj.name=9мм-ый патрон (Цельнометаллическая оболочка) +item.ammo_standard.p9_jhp.name=9мм-ый патрон (Экспансивный+) +item.ammo_standard.p9_sp.name=9мм-ый патрон (Экспансивный) +item.ammo_standard.r556_ap.name=Патрон 5.56мм (Бронебойный) +item.ammo_standard.r556_fmj.name=Патрон 5.56мм (Цельнометаллическая оболочка) +item.ammo_standard.r556_jhp.name=Патрон 5.56мм (Экспансивный+) +item.ammo_standard.r556_sp.name=Патрон 5.56мм (Экспансивный) +item.ammo_standard.r762_ap.name=Патрон 7.62мм (Бронебойный) +item.ammo_standard.r762_du.name=Патрон 7.62мм (Обеднённый уран) +item.ammo_standard.r762_fmj.name=Патрон 7.62мм (Цельнометаллическая оболочка) +item.ammo_standard.r762_he.name=Патрон 7.62мм (Разрывной) +item.ammo_standard.r762_jhp.name=Патрон 7.62мм (Экспансивный+) +item.ammo_standard.r762_sp.name=Патрон 7.62мм (Экспансивный) item.ammo_standard.rocket_demo.name=Ракета (Разрушающая) item.ammo_standard.rocket_he.name=Ракета (Фугасная) item.ammo_standard.rocket_heat.name=Ракета (Кумулятивная) From 423cbbcf79db714299ad072676cfc60183229ef5 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:06:04 -0600 Subject: [PATCH 147/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 9beb5c345..aa9e0f27e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2030,7 +2030,7 @@ item.ammo_standard.p22_fmj.name=Патрон .22 LR (Цельнометалли item.ammo_standard.p22_jhp.name=Патрон .22 LR (Экспансивный+) item.ammo_standard.p22_sp.name=Патрон .22 LR (Экспансивный) item.ammo_standard.p45_ap.name=Патрон .45 (Бронебойный) -item.ammo_standard.p45_du.name=Патрон .45 (Depleted Uranium) +item.ammo_standard.p45_du.name=Патрон .45 (Обеднённый уран) item.ammo_standard.p45_fmj.name=Патрон .45 (Цельнометаллическая оболочка) item.ammo_standard.p45_jhp.name=Патрон .45 (Экспансивный+) item.ammo_standard.p45_sp.name=Патрон .45 (Экспансивный) From ddc6e42f556ca45cff4b8730f9258b5e76f89ef5 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Thu, 31 Jul 2025 09:24:06 -0600 Subject: [PATCH 148/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index aa9e0f27e..1fbcb897b 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -3436,6 +3436,13 @@ item.insert_polonium.name=Полониевая пластина item.insert_steel.name=Тяжёлостальные пластины item.insert_xsapi.name=XSAPI пластины item.insert_yharonite.name=Яронитовая пластина +item.item_expensive.bronze_tubes.name=Бронзовые конструкционные элементы +item.item_expensive.circuit.name=Обширная печатная плата +item.item_expensive.computer.name=Мейнфрейм +item.item_expensive.ferro_plating.name=Армированные ферроураниевые панели +item.item_expensive.heavy_frame.name=Тяжелый каркас +item.item_expensive.lead_plating.name=Радиационно-стойкое покрытие +item.item_expensive.steel_plating.name=Стальная обшивка с болтовым соединением item.item_secret.aberrator.name=Часть Аберратора item.item_secret.canister.name=Композит SB-26 item.item_secret.controller.name=Проприетарный блок управления From 737c56ed07e63fa0e4b4cb689c5ab5c7d7687f1f Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 31 Jul 2025 21:49:31 +0200 Subject: [PATCH 149/323] PUREX --- changelog | 5 + src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../com/hbm/blocks/machine/MachinePUREX.java | 54 +++ .../hbm/handler/nei/PUREXRecipeHandler.java | 13 + .../container/ContainerMachinePUREX.java | 74 +++ .../hbm/inventory/gui/GUIMachinePUREX.java | 126 +++++ .../inventory/recipes/CentrifugeRecipes.java | 224 --------- .../recipes/ChemicalPlantRecipes.java | 23 - .../hbm/inventory/recipes/PUREXRecipes.java | 436 ++++++++++++++++++ .../recipes/loader/GenericRecipe.java | 21 +- .../recipes/loader/GenericRecipes.java | 4 +- .../recipes/loader/SerializableRecipe.java | 1 + src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/NEIRegistry.java | 1 + .../java/com/hbm/main/ResourceManager.java | 14 +- .../module/machine/ModuleMachinePUREX.java | 29 ++ .../hbm/render/tileentity/RenderPUREX.java | 82 ++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityMachinePUREX.java | 278 +++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/gui/processing/gui_purex.png | Bin 0 -> 3235 bytes 22 files changed, 1136 insertions(+), 258 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachinePUREX.java create mode 100644 src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java create mode 100644 src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java create mode 100644 src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderPUREX.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png diff --git a/changelog b/changelog index a2b6a0de9..8e403af29 100644 --- a/changelog +++ b/changelog @@ -10,6 +10,11 @@ * Rebar placer * Can be configured with different types of concrete, reinforced or not, or even colored * Rebar created with the rebar placer will remember its type and assume it when being filled with liquid concrete +* PUREX + * Chemplant-like nuclear fuel reprocessing machine + * Handles all the nuclear fuel reprocessing that was previously done by the standard centrifuge + * All reprocessing recipes now require both kerosene and nitric acid + * Also handles the vitrification recipes and the thorium salt reprocessing from the chemical plant ## Changed * The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f9d312fa8..8e08eac42 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1015,6 +1015,7 @@ public class ModBlocks { public static Block machine_chemical_plant; public static Block machine_chemfac; public static Block machine_chemical_factory; + public static Block machine_purex; public static Block machine_mixer; public static Block machine_fluidtank; @@ -2245,6 +2246,7 @@ public class ModBlocks { machine_chemical_plant = new MachineChemicalPlant(Material.iron).setBlockName("machine_chemical_plant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemfac = new MachineChemfac(Material.iron).setBlockName("machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemical_factory = new MachineChemicalFactory(Material.iron).setBlockName("machine_chemical_factory").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_purex = new MachinePUREX(Material.iron).setBlockName("machine_purex").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_mixer = new MachineMixer(Material.iron).setBlockName("machine_mixer").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_fluidtank = new MachineFluidTank(Material.iron).setBlockName("machine_fluidtank").setHardness(5.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_fluidtank"); machine_bat9000 = new MachineBigAssTank9000(Material.iron).setBlockName("machine_bat9000").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3299,6 +3301,7 @@ public class ModBlocks { register(machine_chemical_plant); register(machine_chemfac); register(machine_chemical_factory); + register(machine_purex); register(machine_arc_welder); register(machine_soldering_station); register(machine_arc_furnace); diff --git a/src/main/java/com/hbm/blocks/machine/MachinePUREX.java b/src/main/java/com/hbm/blocks/machine/MachinePUREX.java new file mode 100644 index 000000000..461509da8 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachinePUREX.java @@ -0,0 +1,54 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityMachinePUREX; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachinePUREX extends BlockDummyable implements ITooltipProvider { + + public MachinePUREX(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachinePUREX(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } + + @Override public int[] getDimensions() { return new int[] {4, 0, 2, 2, 2, 2}; } + @Override public int getOffset() { return 2; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x += dir.offsetX * o; + z += dir.offsetZ * o; + + for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) { + if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java new file mode 100644 index 000000000..c5405fbf0 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java @@ -0,0 +1,13 @@ +package com.hbm.handler.nei; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.PUREXRecipes; + +public class PUREXRecipeHandler extends NEIGenericRecipeHandler { + + public PUREXRecipeHandler() { + super(ModBlocks.machine_purex.getLocalizedName(), PUREXRecipes.INSTANCE, ModBlocks.machine_purex); + } + + @Override public String getRecipeID() { return "ntmPUREX"; } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java b/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java new file mode 100644 index 000000000..4b28d9da9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java @@ -0,0 +1,74 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.util.InventoryUtil; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachinePUREX extends ContainerBase { + + public ContainerMachinePUREX(InventoryPlayer invPlayer, IInventory chemicalPlant) { + super(invPlayer, chemicalPlant); + + // Battery + this.addSlotToContainer(new SlotNonRetarded(chemicalPlant, 0, 152, 81)); + // Schematic + this.addSlotToContainer(new SlotNonRetarded(chemicalPlant, 1, 35, 126)); + // Upgrades + this.addSlots(chemicalPlant, 2, 152, 108, 2, 1); + // Solid Input + this.addSlots(chemicalPlant, 4, 8, 90, 1, 3); + // Solid Output + this.addOutputSlots(invPlayer.player, chemicalPlant, 7, 80, 36, 3, 2); + + this.playerInv(invPlayer, 8, 174); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack slotOriginal = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + slotOriginal = slotStack.copy(); + + if(index <= tile.getSizeInventory() - 1) { + SlotCraftingOutput.checkAchievements(player, slotStack); + if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { + if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 7, false)) return null; + } + } + + if(slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + slot.onPickupFromSlot(player, slotStack); + } + + return slotOriginal; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java new file mode 100644 index 000000000..3cb1b0108 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java @@ -0,0 +1,126 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachinePUREX; +import com.hbm.inventory.recipes.PUREXRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityMachinePUREX; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIMachinePUREX extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_purex.png"); + private TileEntityMachinePUREX purex; + + public GUIMachinePUREX(InventoryPlayer invPlayer, TileEntityMachinePUREX tedf) { + super(new ContainerMachinePUREX(invPlayer, tedf)); + purex = tedf; + + this.xSize = 176; + this.ySize = 256; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + for(int i = 0; i < 3; i++) { + purex.inputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 8 + i * 18, guiTop + 18, 16, 52); + } + purex.outputTanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 36, 16, 52); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, purex.power, purex.maxPower); + + if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { + if(this.purex.purexModule.recipe != null && PUREXRecipes.INSTANCE.recipeNameMap.containsKey(this.purex.purexModule.recipe)) { + GenericRecipe recipe = (GenericRecipe) PUREXRecipes.INSTANCE.recipeNameMap.get(this.purex.purexModule.recipe); + this.func_146283_a(recipe.print(), mouseX, mouseY); + } else { + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + } + } + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PUREXRecipes.INSTANCE, purex, purex.purexModule.recipe, 0, ItemBlueprints.grabPool(purex.slots[1]), this); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.purex.hasCustomInventoryName() ? this.purex.getInventoryName() : I18n.format(this.purex.getInventoryName()); + + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int p = (int) (purex.power * 61 / purex.maxPower); + drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); + + if(purex.purexModule.progress > 0) { + int j = (int) Math.ceil(70 * purex.purexModule.progress); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + } + + GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purex.purexModule.recipe); + + /// LEFT LED + if(purex.didProcess) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); + } + + /// RIGHT LED + if(purex.didProcess) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null && purex.power >= recipe.power) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); + } + + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); + + if(recipe != null && recipe.inputItem != null) { + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(purex.purexModule.inputSlots[i]); + if(!slot.getHasStack()) this.renderItem(recipe.inputItem[i].extractForCyclingDisplay(20), slot.xDisplayPosition, slot.yDisplayPosition, 10F); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + this.zLevel = 300F; + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(purex.purexModule.inputSlots[i]); + if(!slot.getHasStack()) drawTexturedModalRect(guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, slot.xDisplayPosition, slot.yDisplayPosition, 16, 16); + } + this.zLevel = 0F; + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } + + for(int i = 0; i < 3; i++) { + purex.inputTanks[i].renderTank(guiLeft + 8 + i * 18, guiTop + 70, this.zLevel, 16, 52); + } + purex.outputTanks[0].renderTank(guiLeft + 116, guiTop + 88, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 027efb67d..c3927a396 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -26,7 +26,6 @@ import com.hbm.items.ItemEnums; import com.hbm.items.ItemEnums.EnumAshType; import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import com.hbm.items.special.ItemBedrockOreNew; import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; @@ -50,229 +49,6 @@ public class CentrifugeRecipes extends SerializableRecipe { boolean lbs = GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCentrifuge; - recipes.put(new ComparableStack(ModItems.waste_natural_uranium), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_pu239, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_uranium), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_plutonium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_thorium), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nugget_th232, 1), - new ItemStack(ModItems.nugget_u233, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_mox), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_plutonium), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_u233), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 1), - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_u235), new ItemStack[] { - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_schrabidium), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 2), - new ItemStack(ModItems.nugget_pu239, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_zfb_mox), new ItemStack[] { - new ItemStack(ModItems.nugget_zirconium, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_mox), new ItemStack[] { - new ItemStack(ModItems.powder_sr90_tiny, 1), - new ItemStack(ModItems.nugget_pu_mix, 3), - new ItemStack(ModItems.powder_cs137_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 4) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_pu238be), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 1), - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.powder_coal_tiny, 2), - new ItemStack(ModItems.nugget_lead, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_pu239), new ItemStack[] { - new ItemStack(ModItems.nugget_pu240, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.powder_cs137_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_ra226be), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 2), - new ItemStack(ModItems.nugget_polonium, 2), - new ItemStack(ModItems.powder_coal_tiny, 1), - new ItemStack(ModItems.nugget_lead, 1) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_sa326), new ItemStack[] { - new ItemStack(ModItems.nugget_solinium, 1), - new ItemStack(ModItems.powder_neodymium_tiny, 1), - new ItemStack(ModItems.nugget_tantalium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_u233), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 1), - new ItemStack(ModItems.powder_i131_tiny, 1), - new ItemStack(ModItems.powder_sr90_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_u235), new ItemStack[] { - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.SCHRABIDIUM)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 15), - new ItemStack(ModItems.nugget_euphemium, 3), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.HES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 17), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 12), - new ItemStack(ModItems.nugget_tantalium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.LES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 9), - new ItemStack(ModItems.nugget_tantalium, 9), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.HEN)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu239, 12), - new ItemStack(ModItems.nugget_technetium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MEU)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu239, 12), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MEP)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu241, 12), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.LEAD)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_lead, 6), - new ItemStack(ModItems.nugget_bismuth, 12), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.BORON)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.powder_coal_tiny, 12), - new ItemStack(ModItems.nugget_co60, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.DU)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_polonium, 12), - new ItemStack(ModItems.nugget_pu238, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEU)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_plutonium, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEU233)), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 3), - new ItemStack(ModItems.nugget_pu238, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEU235)), new ItemStack[] { - new ItemStack(ModItems.nugget_neptunium, 3), - new ItemStack(ModItems.nugget_pu238, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEN)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_pu239, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEN237)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu238, 2), - new ItemStack(ModItems.nugget_pu239, 4), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MOX)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_pu240, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEP)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 2), - new ItemStack(ModItems.nugget_pu_mix, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEP239)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_pu240, 4), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEP241)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEA)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEA242)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HES326)), new ItemStack[] { - new ItemStack(ModItems.nugget_solinium, 3), - new ItemStack(ModItems.nugget_lead, 2), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HES327)), new ItemStack[] { - new ItemStack(ModItems.nugget_australium, 4), - new ItemStack(ModItems.nugget_lead, 1), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.BFB_AM_MIX)), new ItemStack[] { - new ItemStack(ModItems.nugget_am_mix, 9), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.BFB_PU241)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu241, 9), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - recipes.put(new ComparableStack(ModItems.icf_pellet_depleted), new ItemStack[] { new ItemStack(ModItems.icf_pellet_empty, 1), new ItemStack(ModItems.pellet_charged, 1), diff --git a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java index f3b759658..a5f5736b0 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java @@ -317,29 +317,6 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.KEROSENE, 6_000)) .outputItems(new ItemStack(ModItems.powder_balefire)) .outputFluids(new FluidStack(Fluids.BALEFIRE, 8_000))); - - this.register(new GenericRecipe("chem.thoriumsalt").setup(100, 10_000).setIcon(ModItems.fluid_icon, Fluids.THORIUM_SALT.getID()) - .inputFluids(new FluidStack(Fluids.THORIUM_SALT_DEPLETED, 16_000)) - .inputItems(new OreDictStack(TH232.nugget(), 2)) - .outputFluids(new FluidStack(Fluids.THORIUM_SALT, 16_000)) - .outputItems( - new ChanceOutput(new ItemStack(ModItems.nugget_u233, 1), 0.5F), - new ChanceOutput(new ItemStack(ModItems.nuclear_waste_tiny, 1), 0.25F))); - - /// VITRIFICATION /// - this.register(new GenericRecipe("chem.vitliquid").setup(100, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead)) - .inputFluids(new FluidStack(Fluids.WASTEFLUID, 1_000)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); - - this.register(new GenericRecipe("chem.vitgaseous").setup(100, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead)) - .inputFluids(new FluidStack(Fluids.WASTEGAS, 1_000)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); - - this.register(new GenericRecipe("chem.vitsolid").setup(300, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead), new ComparableStack(ModItems.nuclear_waste, 4)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified, 4))); /// OSMIRIDIUM /// this.register(new GenericRecipe("chem.osmiridiumdeath").setup(240, 1_000) diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java new file mode 100644 index 000000000..65dd62fe8 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -0,0 +1,436 @@ +package com.hbm.inventory.recipes; + +import static com.hbm.inventory.OreDictManager.*; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; + +import net.minecraft.item.ItemStack; + +public class PUREXRecipes extends GenericRecipes { + + public static final PUREXRecipes INSTANCE = new PUREXRecipes(); + + @Override public int inputItemLimit() { return 3; } + @Override public int inputFluidLimit() { return 3; } + @Override public int outputItemLimit() { return 6; } + @Override public int outputFluidLimit() { return 1; } + + @Override public String getFileName() { return "hbmPUREX.json"; } + @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } + + @Override + public void registerDefaults() { + + long zirnoxPower = 1_000; + long platePower = 1_500; + long pwrPower = 2_500; + long watzPower = 10_000; + long vitrification = 1_000; + + // ZIRNOX + this.register(new GenericRecipe("purex.zirnoxnu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_natural_uranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_natural_uranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxthmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_thorium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_th232, 1), + new ItemStack(ModItems.nugget_u233, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plutonium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxheu233").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_u233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 1), + new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxheu235").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_u235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxles").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_schrabidium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxzfbmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_zfb_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_zirconium, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + // Plate Fuel + this.register(new GenericRecipe("purex.platemox").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.powder_sr90_tiny, 1), + new ItemStack(ModItems.nugget_pu_mix, 3), + new ItemStack(ModItems.powder_cs137_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platepu238be").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_pu238be)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 1), + new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.powder_coal_tiny, 2), + new ItemStack(ModItems.nugget_lead, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platepu239").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_pu239)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu240, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.powder_cs137_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platera226be").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_ra226be)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), + new ItemStack(ModItems.nugget_polonium, 2), + new ItemStack(ModItems.powder_coal_tiny, 1), + new ItemStack(ModItems.nugget_lead, 1)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platesa326").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_sa326)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 1), + new ItemStack(ModItems.powder_neodymium_tiny, 1), + new ItemStack(ModItems.nugget_tantalium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.plateu233").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_u233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 1), + new ItemStack(ModItems.powder_i131_tiny, 1), + new ItemStack(ModItems.powder_sr90_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.plateu235").setup(100, platePower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.waste_plate_u235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + // PWR + this.register(new GenericRecipe("purex.pwrmeu").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_plutonium, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrheu233").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 3), + new ItemStack(ModItems.nugget_pu238, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrheu235").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_neptunium, 3), + new ItemStack(ModItems.nugget_pu238, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmen").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEN)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_pu239, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhen237").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEN237)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu238, 2), + new ItemStack(ModItems.nugget_pu239, 4), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmox").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MOX)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_pu240, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmep").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEP)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 2), + new ItemStack(ModItems.nugget_pu_mix, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhep239").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP239)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu240, 4), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhep241").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP241)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmea").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEA)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhea242").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEA242)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhes326").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES326)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 3), + new ItemStack(ModItems.nugget_lead, 2), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhes327").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES327)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_australium, 4), + new ItemStack(ModItems.nugget_lead, 1), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrbfbam").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_AM_MIX)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_am_mix, 9), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrbfpu241").setup(100, pwrPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_PU241)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu241, 9), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + // Molten Salt + this.register(new GenericRecipe("purex.thoriumsalt").setup(100, 10_000).setIcon(ModItems.fluid_icon, Fluids.THORIUM_SALT.getID()) + .inputFluids(new FluidStack(Fluids.THORIUM_SALT_DEPLETED, 16_000)) + .inputItems(new OreDictStack(TH232.nugget(), 2)) + .outputFluids(new FluidStack(Fluids.THORIUM_SALT, 16_000)) + .outputItems( + new ChanceOutput(new ItemStack(ModItems.nugget_u233, 1), 0.5F), + new ChanceOutput(new ItemStack(ModItems.nuclear_waste_tiny, 1), 0.25F))); + + // Watz + this.register(new GenericRecipe("purex.watzschrab").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.SCHRABIDIUM)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 15), + new ItemStack(ModItems.nugget_euphemium, 3), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzhes").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 17), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmes").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 12), + new ItemStack(ModItems.nugget_tantalium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzles").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 9), + new ItemStack(ModItems.nugget_tantalium, 9), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzhen").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HEN)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu239, 12), + new ItemStack(ModItems.nugget_technetium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmeu").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu239, 12), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmep").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEP)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu241, 12), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzlead").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LEAD)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 6), + new ItemStack(ModItems.nugget_bismuth, 12), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzboron").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.BORON)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.powder_coal_tiny, 12), + new ItemStack(ModItems.nugget_co60, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.DU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_polonium, 12), + new ItemStack(ModItems.nugget_pu238, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + /// Vitrification + this.register(new GenericRecipe("purex.vitliquid").setup(100, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead)) + .inputFluids(new FluidStack(Fluids.WASTEFLUID, 1_000)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); + + this.register(new GenericRecipe("purex.vitgaseous").setup(100, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead)) + .inputFluids(new FluidStack(Fluids.WASTEGAS, 1_000)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); + + this.register(new GenericRecipe("purex.vitsolid").setup(300, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead), new ComparableStack(ModItems.nuclear_waste, 4)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified, 4))); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 0b41f634a..91a8d99a4 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -21,8 +21,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class GenericRecipe { - + protected final String name; + public String nameWrapper; public AStack[] inputItem; public FluidStack[] inputFluid; public IOutput[] outputItem; @@ -51,6 +52,7 @@ public class GenericRecipe { public GenericRecipe setPower(long power) { this.power = power; return this; } public GenericRecipe setup(int duration, long power) { return this.setDuration(duration).setPower(power); } public GenericRecipe setupNamed(int duration, long power) { return this.setDuration(duration).setPower(power).setNamed(); } + public GenericRecipe setNameWrapper(String wrapper) { this.nameWrapper = wrapper; return this; } public GenericRecipe setIcon(ItemStack icon) { this.icon = icon; this.writeIcon = true; return this; } public GenericRecipe setIcon(Item item, int meta) { return this.setIcon(new ItemStack(item, 1, meta)); } public GenericRecipe setIcon(Item item) { return this.setIcon(new ItemStack(item)); } @@ -59,7 +61,7 @@ public class GenericRecipe { public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } - public GenericRecipe inputItemsEx(AStack... input) { if(GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } + public GenericRecipe inputItemsEx(AStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } public GenericRecipe inputFluidsEx(FluidStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } @@ -71,6 +73,14 @@ public class GenericRecipe { return this; } + public GenericRecipe setIconToFirstIngredient() { + if(this.inputItem != null) { + List stacks = this.inputItem[0].extractForNEI(); + if(!stacks.isEmpty()) this.icon = stacks.get(0); + } + return this; + } + public ItemStack getIcon() { if(icon == null) { @@ -93,8 +103,11 @@ public class GenericRecipe { } public String getLocalizedName() { - if(customLocalization) return I18nUtil.resolveKey(name); - return this.getIcon().getDisplayName(); + String name = null; + if(customLocalization) name = I18nUtil.resolveKey(this.name); + if(name == null) name = this.getIcon().getDisplayName(); + if(this.nameWrapper != null) name = I18nUtil.resolveKey(this.nameWrapper, name); + return name; } public List print() { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 1cb5cadb2..2e92b67f6 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -103,6 +103,7 @@ public abstract class GenericRecipes extends Serializab if(obj.has("icon")) recipe.setIcon(this.readItemStack(obj.get("icon").getAsJsonArray())); if(obj.has("named") && obj.get("named").getAsBoolean()) recipe.setNamed(); if(obj.has("blueprintpool")) recipe.setPools(obj.get("blueprintpool").getAsString().split(":")); + if(obj.has("nameWrapper")) recipe.setNameWrapper(obj.get("nameWrapper").getAsString()); readExtraData(element, recipe); @@ -149,8 +150,9 @@ public abstract class GenericRecipes extends Serializab writer.name("icon"); this.writeItemStack(recipe.icon, writer); } - + if(recipe.customLocalization) writer.name("named").value(true); + if(recipe.nameWrapper != null) writer.name("nameWrapper").value(recipe.nameWrapper); if(recipe.blueprintPools != null && recipe.blueprintPools.length > 0) writer.name("blueprintpool").value(String.join(":", recipe.blueprintPools)); writeExtraData(recipe, writer); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 8fa127907..80567014d 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -85,6 +85,7 @@ public abstract class SerializableRecipe { //GENERIC recipeHandlers.add(AssemblyMachineRecipes.INSTANCE); recipeHandlers.add(ChemicalPlantRecipes.INSTANCE); + recipeHandlers.add(PUREXRecipes.INSTANCE); recipeHandlers.add(new MatDistribution()); recipeHandlers.add(new CustomMachineRecipes()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 1661a221b..370772b1d 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -273,6 +273,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalPlant.class, new RenderChemicalPlant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemfac.class, new RenderChemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalFactory.class, new RenderChemicalFactory()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePUREX.class, new RenderPUREX()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineFluidTank.class, new RenderFluidTank()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineBAT9000.class, new RenderBAT9000()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineOrbus.class, new RenderOrbus()); diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 4f0b96595..efc36e201 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -32,6 +32,7 @@ public class NEIRegistry { handlers.add(new ReformingHandler()); handlers.add(new HydrotreatingHandler()); handlers.add(new ChemicalPlantRecipeHandler()); + handlers.add(new PUREXRecipeHandler()); handlers.add(new OreSlopperHandler()); //before acidizing handlers.add(new CrystallizerRecipeHandler()); handlers.add(new BookRecipeHandler()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index fb125b628..5d0002948 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -140,18 +140,19 @@ public class ResourceManager { public static final IModelCustom assembler_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_cog.obj")); public static final IModelCustom assembler_slider = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_slider.obj")); public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj")); - public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")); - public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")); + public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")).asVBO(); + public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")).asVBO(); //Chemplant - public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")); + public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")).asVBO(); public static final IModelCustom chemplant_spinner = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_spinner.obj")); public static final IModelCustom chemplant_piston = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_piston.obj")); public static final IModelCustom chemplant_fluid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluid.hmf")); public static final IModelCustom chemplant_fluidcap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluidcap.hmf")); - public static final IModelCustom chemical_plant = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_plant.obj")); - public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")); - public static final IModelCustom chemical_factory = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_factory.obj")); + public static final IModelCustom chemical_plant = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_plant.obj")).asVBO(); + public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")).asVBO(); + public static final IModelCustom chemical_factory = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_factory.obj")).asVBO(); + public static final IModelCustom purex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/purex.obj")).asVBO(); //Mixer public static final IModelCustom mixer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mixer.obj")); @@ -587,6 +588,7 @@ public class ResourceManager { public static final ResourceLocation chemical_plant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_plant_fluid.png"); public static final ResourceLocation chemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemfac.png"); public static final ResourceLocation chemical_factory_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_factory.png"); + public static final ResourceLocation purex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/purex.png"); //Mixer public static final ResourceLocation mixer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mixer.png"); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java new file mode 100644 index 000000000..afb8186d2 --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java @@ -0,0 +1,29 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.PUREXRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +public class ModuleMachinePUREX extends ModuleMachineBase { + + public ModuleMachinePUREX(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[3]; + this.outputSlots = new int[6]; + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[1]; + } + + @Override + public GenericRecipe getRecipe() { + return PUREXRecipes.INSTANCE.recipeNameMap.get(this.recipe); + } + + public ModuleMachinePUREX itemInput(int start) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = start + i; return this; } + public ModuleMachinePUREX itemOutput(int start) { for(int i = 0; i < outputSlots.length; i++) outputSlots[i] = start + i; return this; } + public ModuleMachinePUREX fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } + public ModuleMachinePUREX fluidOutput(FluidTank a) { outputTanks[0] = a; return this; } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPUREX.java b/src/main/java/com/hbm/render/tileentity/RenderPUREX.java new file mode 100644 index 000000000..5116e53e7 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPUREX.java @@ -0,0 +1,82 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityMachinePUREX; +import com.hbm.util.BobMathUtil; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderPUREX extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glRotated(90, 0, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntityMachinePUREX purex = (TileEntityMachinePUREX) tileEntity; + float anim = purex.prevAnim + (purex.anim - purex.prevAnim) * interp; + + bindTexture(ResourceManager.purex_tex); + ResourceManager.purex.renderPart("Base"); + if(purex.frame)ResourceManager.purex.renderPart("Frame"); + + GL11.glPushMatrix(); + GL11.glTranslated(1.5, 1.25, 0); + GL11.glRotated(anim * 45, 0, 0, 1); + GL11.glTranslated(-1.5, -1.25, 0); + ResourceManager.purex.renderPart("Fan"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(BobMathUtil.sps(anim * 0.25) * 0.5, 0, 0); + ResourceManager.purex.renderPart("Pump"); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_purex); + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + + public void renderInventory() { + GL11.glTranslated(0, -2.5, 0); + GL11.glScaled(2.5, 2.5, 2.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.purex_tex); + ResourceManager.purex.renderPart("Base"); + ResourceManager.purex.renderPart("Frame"); + ResourceManager.purex.renderPart("Fan"); + ResourceManager.purex.renderPart("Pump"); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 7a8f9ead4..bae45ddca 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -353,6 +353,7 @@ public class TileMappings { put(TileEntityMachineChemicalPlant.class, "tileentity_chemicalplant"); put(TileEntityMachineChemfac.class, "tileentity_chemfac"); put(TileEntityMachineChemicalFactory.class, "tileentity_chemicalfactory"); + put(TileEntityMachinePUREX.class, "tileentity_purex"); put(TileEntityMachineOilWell.class, "tileentity_derrick"); put(TileEntityMachinePumpjack.class, "tileentity_machine_pumpjack"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java new file mode 100644 index 000000000..dd28d969c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java @@ -0,0 +1,278 @@ +package com.hbm.tileentity.machine; + +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManagerNT; +import com.hbm.inventory.container.ContainerMachinePUREX; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachinePUREX; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.module.machine.ModuleMachinePUREX; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; +import com.hbm.util.i18n.I18nUtil; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { + + public FluidTank[] inputTanks; + public FluidTank[] outputTanks; + + public long power; + public long maxPower = 1_000_000; + public boolean didProcess = false; + + public boolean frame = false; + public int anim; + public int prevAnim; + + public ModuleMachinePUREX purexModule; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); + + public TileEntityMachinePUREX() { + super(13); + + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[1]; + for(int i = 0; i < 3; i++) { + this.inputTanks[i] = new FluidTank(Fluids.NONE, 16_000); + } + this.outputTanks[0] = new FluidTank(Fluids.NONE, 16_000); + + this.purexModule = new ModuleMachinePUREX(0, this, slots) + .itemInput(4).itemOutput(7) + .fluidInput(inputTanks[0], inputTanks[1], inputTanks[2]).fluidOutput(outputTanks[0]); + } + + @Override + public String getName() { + return "container.machinePUREX"; + } + + @Override + public void updateEntity() { + + if(maxPower <= 0) this.maxPower = 1_000_000; + + if(!worldObj.isRemote) { + + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(purexModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000); + + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + upgradeManager.checkSlots(slots, 2, 3); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos); + for(FluidTank tank : inputTanks) if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos); + for(FluidTank tank : outputTanks) if(tank.getFill() > 0) this.tryProvide(tank, worldObj, pos); + } + + double speed = 1D; + double pow = 1D; + + speed += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) / 3D; + speed += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); + + pow -= Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3) * 0.25D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; + + this.purexModule.update(speed, pow, true, slots[1]); + this.didProcess = this.purexModule.didProcess; + if(this.purexModule.markDirty) this.markDirty(); + + this.networkPackNT(100); + + } else { + + this.prevAnim = this.anim; + if(this.didProcess) this.anim++; + + if(worldObj.getTotalWorldTime() % 20 == 0) { + frame = !worldObj.getBlock(xCoord, yCoord + 5, zCoord).isAir(worldObj, xCoord, yCoord + 5, zCoord); + } + } + } + + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 0, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 0, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 0, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 0, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z), + }; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + for(FluidTank tank : inputTanks) tank.serialize(buf); + for(FluidTank tank : outputTanks) tank.serialize(buf); + buf.writeLong(power); + buf.writeLong(maxPower); + buf.writeBoolean(didProcess); + this.purexModule.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for(FluidTank tank : inputTanks) tank.deserialize(buf); + for(FluidTank tank : outputTanks) tank.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.didProcess = buf.readBoolean(); + this.purexModule.deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + for(int i = 0; i < 3; i++) { + this.inputTanks[i].readFromNBT(nbt, "i" + i); + } + this.outputTanks[0].readFromNBT(nbt, "o" + 0); + + this.power = nbt.getLong("power"); + this.maxPower = nbt.getLong("maxPower"); + this.purexModule.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + for(int i = 0; i < 3; i++) { + this.inputTanks[i].writeToNBT(nbt, "i" + i); + } + this.outputTanks[0].writeToNBT(nbt, "o" + 0); + + nbt.setLong("power", power); + nbt.setLong("maxPower", maxPower); + this.purexModule.writeToNBT(nbt); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; + if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades + if(this.purexModule.isItemValid(slot, stack)) return true; // recipe input crap + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i >= 7 && i <= 12; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {4, 5, 6, 7, 8, 9, 10, 11, 12}; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getReceivingTanks() { return inputTanks; } + @Override public FluidTank[] getSendingTanks() { return outputTanks; } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {inputTanks[0], inputTanks[1], inputTanks[2], outputTanks[0]}; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachinePUREX(player.inventory, this); } + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachinePUREX(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("index") && data.hasKey("selection")) { + int index = data.getInteger("index"); + String selection = data.getString("selection"); + if(index == 0) { + this.purexModule.recipe = selection; + this.markChanged(); + } + } + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord, zCoord - 2, xCoord + 3, yCoord + 5, zCoord + 3); + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_purex)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_CONSUMPTION, "-" + (level * 25) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7db6f3284..d909adf39 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3709,6 +3709,8 @@ potion.hbm_stability=Stabilität potion.hbm_taint=Verdorben potion.hbm_telekinesis=! ! ! +purex.recycle=Wiederanreicherung von %s + radar.clearMap=Karte zurücksetzen radar.detectMissiles=Raketen erkennen radar.detectPlayers=Spieler erkennen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d5875f121..1ddb53855 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4767,6 +4767,8 @@ potion.hbm_stability=Stability potion.hbm_taint=Tainted potion.hbm_telekinesis=! ! ! +purex.recycle=Re-enrichment of %s + radar.clearMap=Clear Map radar.detectMissiles=Detect Missiles radar.detectPlayers=Detect Players diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png new file mode 100644 index 0000000000000000000000000000000000000000..1326e8690a6a024c9514ccfc831d1e24d0841de0 GIT binary patch literal 3235 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 literal 0 HcmV?d00001 From 5f999100d1770b18b44618515f071535bef5ac74 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:10:23 -0400 Subject: [PATCH 150/323] Update BlockWandLogic.java --- src/main/java/com/hbm/blocks/generic/BlockWandLogic.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java index 01d8df298..dd796646d 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -273,7 +273,8 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo super.writeToNBT(nbt); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); - nbt.setString("interactionID", interactionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); @@ -286,7 +287,8 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo super.readFromNBT(nbt); actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); - interactionID = nbt.getString("interactionID"); + if(nbt.hasKey("interactionID")) + interactionID = nbt.getString("interactionID"); placedRotation = nbt.getInteger("rotation"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); From bafa8d6dba10748f83648b6a4f8fee4f1d5472c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=81=93=E7=A5=9E=20=E9=A6=B4=E5=AD=90?= Date: Fri, 1 Aug 2025 13:46:45 +0800 Subject: [PATCH 151/323] Beyond the time --- src/main/resources/assets/hbm/lang/zh_CN.lang | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index b3a7c29c9..450f29276 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6115,3 +6115,13 @@ item.blueprint_folder.name=蓝图册 item.rebar_placer.name=钢筋铺设器 tile.concrete_rebar.name=钢筋混凝土 tile.rebar.name=钢筋 +container.rbmkAutoloader=RBMK燃料自动装填机 +item.item_expensive.bronze_tubes.name=青铜结构件 +item.item_expensive.circuit.name=大型电路板 +item.item_expensive.computer.name=处理器主机 +item.item_expensive.ferro_plating.name=强化铀铁合金板 +item.item_expensive.heavy_frame.name=重型框架 +item.item_expensive.lead_plating.name=防辐射镀层 +item.item_expensive.steel_plating.name=铆接固定钢板 +purex.recycle=再富集 %s +tile.rbmk_autoloader.name=RBMK燃料自动装填机 From 69b9ea9a7d8cf482c383e30f61a251313896fb89 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 4 Aug 2025 19:18:41 +0200 Subject: [PATCH 152/323] consumed by the sludge --- changelog | 21 ++- gradle.properties | 2 +- src/main/java/com/hbm/blocks/ModBlocks.java | 12 +- .../com/hbm/inventory/OreDictManager.java | 7 +- .../gui/GUIScreenRecipeSelector.java | 4 +- .../inventory/material/MaterialShapes.java | 1 - .../java/com/hbm/inventory/material/Mats.java | 20 +-- .../inventory/recipes/AssemblerRecipes.java | 4 +- .../recipes/AssemblyMachineRecipes.java | 43 ++--- .../recipes/BlastFurnaceRecipes.java | 6 +- .../inventory/recipes/CentrifugeRecipes.java | 27 --- .../hbm/inventory/recipes/PUREXRecipes.java | 157 +++++++++++++----- .../recipes/loader/GenericRecipe.java | 6 + .../recipes/loader/GenericRecipes.java | 15 ++ src/main/java/com/hbm/items/ModItems.java | 7 +- .../java/com/hbm/items/special/ItemDrop.java | 2 +- .../com/hbm/items/special/ItemExpensive.java | 22 +++ .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 3 + .../sedna/factory/GunFactoryClient.java | 4 +- .../weapon/sedna/factory/XFactory10ga.java | 11 ++ .../weapon/sedna/mods/WeaponModManager.java | 2 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 3 +- src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/main/ModEventHandler.java | 6 + .../java/com/hbm/main/ResourceManager.java | 1 + .../machine/ModuleMachineAssembler.java | 5 +- .../hbm/module/machine/ModuleMachineBase.java | 35 +++- .../machine/ModuleMachineChemplant.java | 6 +- .../module/machine/ModuleMachinePUREX.java | 6 +- .../java/com/hbm/packet/PacketDispatcher.java | 2 + .../packet/toclient/HeldItemNBTPacket.java | 68 ++++++++ .../item/weapon/sedna/ItemRenderSexy.java | 11 +- .../machine/TileEntityMachinePUREX.java | 40 +++-- .../rbmk/TileEntityRBMKControlAuto.java | 2 + src/main/resources/assets/hbm/lang/de_DE.lang | 12 ++ src/main/resources/assets/hbm/lang/en_US.lang | 12 ++ .../textures/models/weapons/sexy_heretic.png | Bin 0 -> 5675 bytes .../models/weapons/whiskey (Kopie).png | Bin 37269 -> 0 bytes .../hbm/textures/models/weapons/whiskey.xcf | Bin 267625 -> 0 bytes 40 files changed, 430 insertions(+), 158 deletions(-) create mode 100644 src/main/java/com/hbm/items/special/ItemExpensive.java create mode 100644 src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png delete mode 100644 src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png delete mode 100644 src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf diff --git a/changelog b/changelog index 8e403af29..b819e17ab 100644 --- a/changelog +++ b/changelog @@ -7,6 +7,7 @@ * Rebar * When hooked up to liquid concrete using pipes, will fill to create reinforced concrete * Fills bottom to top, so connect the pipes to the top + * The rendering on this is still experimental, so don't overdo it with how large of an area you're casting * Rebar placer * Can be configured with different types of concrete, reinforced or not, or even colored * Rebar created with the rebar placer will remember its type and assume it when being filled with liquid concrete @@ -15,6 +16,7 @@ * Handles all the nuclear fuel reprocessing that was previously done by the standard centrifuge * All reprocessing recipes now require both kerosene and nitric acid * Also handles the vitrification recipes and the thorium salt reprocessing from the chemical plant + * Comes with new schrabidium extraction recipes from MEP/MEN fuels using schrabidic acid (yield is twice the schrabidium cost for acid used) ## Changed * The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints @@ -25,10 +27,27 @@ * Biogas can now be cracked into aromatics and petroleum gas * Custom missile part recipes have been added to the new assembler * Mini nukes are now made from weapon steel instead of regular steel +* Meteorite ingots are now made from meteorite powder, not blocks +* Starmetal now requires meteorite ingots instead of blocks +* Added auto switch groups + * The new standardized processing machines (assembler, chemplant, purex) can now have recipes that are grouped + * Recipes in groups will accept non-recipe items, if the item is used in another recipe from that same group + * When this happens, the recipe switches automatically, if possible + * This means that many PUREX recycling recipes and the ingot to plate recipes don't need dedicated machines for every single recipe, rather only one for that auto switch group +* The tooltip of the chosen recipe on the recipe selector now renders in the bottom left corner instead of following the mouse, preventing an issue where the tooltip is cut off on larger GUI scales +* Expensive mode has been changed + * Instead of using heavy components for most things, there's now "expensive" items that are used by many assembler recipes + * "Expensive" items replace some of the microcrafting that's part of the recipe, meaning that expensive mode recipes are generally simpler (but require way more materials) + * All heavy components have been annihilated and any recipes that may still use them (e.g. from old configs) default to using cast plates instead +* Removed the assembly factory's recipe, as it still uses the deprecated recipe set + * A new assembly factory will be added soon +* All recently deprecated machines have been removed from the creative tabs ## Fixed * Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit * As an extra safeguard, the recipe loader now throws an exception if that happens * Fixed dupe caused by the breeding reactor * Fixed a potential crash caused by a change done to tile entity proxies in relation to EnergyControl -* Fixed the assembler achievement still using the old one \ No newline at end of file +* Fixed the assembler achievement still using the old one +* Fixed the RBMK auto control rod's function not syncing to the client properly +* Fixed crash caused by new standardized machine recipes with chance-based output when they output nothing diff --git a/gradle.properties b/gradle.properties index 70b2eaeea..ca80c122b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5397 +mod_build_number=5412 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8e08eac42..99824c4d8 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1006,14 +1006,14 @@ public class ModBlocks { @Deprecated public static Block machine_assembler; public static Block machine_assembly_machine; - public static Block machine_assemfac; + @Deprecated public static Block machine_assemfac; public static Block machine_arc_welder; public static Block machine_soldering_station; public static Block machine_arc_furnace; @Deprecated public static Block machine_chemplant; public static Block machine_chemical_plant; - public static Block machine_chemfac; + @Deprecated public static Block machine_chemfac; public static Block machine_chemical_factory; public static Block machine_purex; public static Block machine_mixer; @@ -2237,14 +2237,14 @@ public class ModBlocks { machine_ore_slopper = new MachineOreSlopper().setBlockName("machine_ore_slopper").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_mining_laser = new MachineMiningLaser(Material.iron).setBlockName("machine_mining_laser").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_mining_laser"); barricade = new BlockNoDrop(Material.sand).setBlockName("barricade").setHardness(1.0F).setResistance(2.5F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":barricade"); - machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); + machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); machine_assembly_machine = new MachineAssemblyMachine(Material.iron).setBlockName("machine_assembly_machine").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_arc_welder = new MachineArcWelder(Material.iron).setBlockName("machine_arc_welder").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_soldering_station = new MachineSolderingStation(Material.iron).setBlockName("machine_soldering_station").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemical_plant = new MachineChemicalPlant(Material.iron).setBlockName("machine_chemical_plant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_chemfac = new MachineChemfac(Material.iron).setBlockName("machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_chemfac = new MachineChemfac(Material.iron).setBlockName("machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemical_factory = new MachineChemicalFactory(Material.iron).setBlockName("machine_chemical_factory").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_purex = new MachinePUREX(Material.iron).setBlockName("machine_purex").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_mixer = new MachineMixer(Material.iron).setBlockName("machine_mixer").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 7d4a9e0d2..3e85fdfb4 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -552,7 +552,6 @@ public class OreDictManager { if(mat.smeltable == SmeltingBehavior.SMELTABLE) { if(mat.autogen.contains(MaterialShapes.CASTPLATE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.CASTPLATE.name() + name, new ItemStack(ModItems.plate_cast, 1, mat.id)); if(mat.autogen.contains(MaterialShapes.WELDEDPLATE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.WELDEDPLATE.name() + name, new ItemStack(ModItems.plate_welded, 1, mat.id)); - if(mat.autogen.contains(MaterialShapes.HEAVY_COMPONENT)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.HEAVY_COMPONENT.name() + name, new ItemStack(ModItems.heavy_component, 1, mat.id)); if(mat.autogen.contains(MaterialShapes.DENSEWIRE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.DENSEWIRE.name() + name, new ItemStack(ModItems.wire_dense, 1, mat.id)); } if(mat.autogen.contains(MaterialShapes.BOLT)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.BOLT.name() + name, new ItemStack(ModItems.bolt, 1, mat.id)); @@ -680,7 +679,7 @@ public class OreDictManager { ANY_RUBBER.addPrefix(INGOT, true); ANY_PLASTIC.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(BLOCK, true).addPrefix(GRIP, true).addPrefix(STOCK, true); ANY_HARDPLASTIC.addPrefix(INGOT, true).addPrefix(STOCK, true).addPrefix(GRIP, true); - ANY_RESISTANTALLOY.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(CASTPLATE, true).addPrefix(WELDEDPLATE, true).addPrefix(HEAVY_COMPONENT, true).addPrefix(BLOCK, true) + ANY_RESISTANTALLOY.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(CASTPLATE, true).addPrefix(WELDEDPLATE, true).addPrefix(BLOCK, true) .addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_BISMOIDBRONZE.addPrefix(INGOT, true).addPrefix(CASTPLATE, true).addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_TAR.addPrefix(ANY, false); @@ -759,7 +758,7 @@ public class OreDictManager { public String plate() { return PLATE.name() + mats[0]; } public String plateCast() { return CASTPLATE.name() + mats[0]; } public String plateWelded() { return WELDEDPLATE.name() + mats[0]; } - public String heavyComp() { return HEAVY_COMPONENT.name() + mats[0]; } + @Deprecated public String heavyComp() { return WELDEDPLATE.name() + mats[0]; } public String wireFine() { return WIRE.name() + mats[0]; } public String wireDense() { return DENSEWIRE.name() + mats[0]; } public String shell() { return SHELL.name() + mats[0]; } @@ -1013,7 +1012,7 @@ public class OreDictManager { public String plate() { return PLATE.name() + groupName; } public String plateCast() { return CASTPLATE.name() + groupName; } public String plateWelded() { return WELDEDPLATE.name() + groupName; } - public String heavyComp() { return HEAVY_COMPONENT.name() + groupName; } + @Deprecated public String heavyComp() { return WELDEDPLATE.name() + groupName; } public String wireFine() { return WIRE.name() + groupName; } public String wireDense() { return DENSEWIRE.name() + groupName; } public String billet() { return BILLET.name() + groupName; } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java index 4a5e3bb83..244a2549b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java @@ -135,7 +135,7 @@ public class GUIScreenRecipeSelector extends GuiScreen { if(guiLeft + ix <= mouseX && guiLeft + ix + 18 > mouseX && guiTop + iy < mouseY && guiTop + iy + 18 >= mouseY) { GenericRecipe recipe = recipes.get(i); - this.func_146283_a(recipe.print(), mouseX, mouseY); + this.func_146283_a(recipe.print(), 0, 900); } } } @@ -143,7 +143,7 @@ public class GUIScreenRecipeSelector extends GuiScreen { if(guiLeft + 151 <= mouseX && guiLeft + 151 + 18 > mouseX && guiTop + 71 < mouseY && guiTop + 71 + 18 >= mouseY) { if(this.selection != null && this.recipeSet.recipeNameMap.containsKey(selection)) { GenericRecipe recipe = (GenericRecipe) this.recipeSet.recipeNameMap.get(selection); - this.func_146283_a(recipe.print(), mouseX, mouseY); + this.func_146283_a(recipe.print(), 0, 900); } } diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 2f7de0461..ef44dd613 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -34,7 +34,6 @@ public class MaterialShapes { public static final MaterialShapes PIPE = new MaterialShapes(INGOT.quantity * 3, "ntmpipe"); public static final MaterialShapes QUART = new MaterialShapes(162); public static final MaterialShapes BLOCK = new MaterialShapes(INGOT.quantity * 9, "block"); - public static final MaterialShapes HEAVY_COMPONENT = new MaterialShapes(CASTPLATE.quantity * 256, "componentHeavy"); public static final MaterialShapes LIGHTBARREL = new MaterialShapes(INGOT.quantity * 3, "barrelLight"); public static final MaterialShapes HEAVYBARREL = new MaterialShapes(INGOT.quantity * 6, "barrelHeavy"); diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 5a03bf288..3d923dd47 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -100,11 +100,11 @@ public class Mats { public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(12836, GH336, 0xF4EFE1, 0x2A3306, 0xC6C6A1).setAutogen(NUGGET, BILLET, BLOCK).m(); //Base metals - public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setAutogen(FRAGMENT, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setAutogen(FRAGMENT, WIRE, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setAutogen(FRAGMENT, WIRE, BOLT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setAutogen(FRAGMENT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setAutogen(FRAGMENT, NUGGET, WIRE, BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, HEAVY_COMPONENT).m(); + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setAutogen(FRAGMENT, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, BLOCK).m(); + public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setAutogen(FRAGMENT, WIRE, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK).m(); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setAutogen(FRAGMENT, WIRE, BOLT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK).m(); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setAutogen(FRAGMENT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK).m(); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setAutogen(FRAGMENT, NUGGET, WIRE, BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK).m(); public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, BI, 0xB200FF, 0xB200FF, 0xB200FF).setAutogen(FRAGMENT, NUGGET, BILLET, DUST, BLOCK).m(); public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x6CBABA, 0x242525, 0x558080).setAutogen(NUGGET).m(); public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0xFFFFFF, 0x1D1D36, 0xA89B74).setAutogen(NUGGET, DUST, BLOCK).m(); @@ -135,15 +135,15 @@ public class Mats { public static final NTMMaterial MAT_OSMIRIDIUM = makeSmeltable(7699, OSMIRIDIUM, 0xDBE3EF, 0x7891BE, 0xACBDD9).setAutogen(NUGGET, CASTPLATE, WELDEDPLATE).m(); //Alloys - public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); + public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, DENSEWIRE, BLOCK).m(); - public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT).m(); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK).m(); public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x82A59C, 0x06281E, 0x42665C).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); - public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); + public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xCCCCEA, 0x11111A, 0xA5A5D3).setAutogen(DUST, DENSEWIRE, BLOCK).m(); public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(CASTPLATE, HEAVYBARREL, HEAVYRECEIVER).m(); - public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); - public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BBRONZE = makeSmeltable(_AS + 16, BBRONZE, 0xE19A69, 0x485353, 0x987D65).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_ABRONZE = makeSmeltable(_AS + 17, ABRONZE, 0xDB9462, 0x203331, 0x77644D).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BSCCO = makeSmeltable(_AS + 18, BSCCO, 0x767BF1, 0x000000, 0x5E62C0).setAutogen(DENSEWIRE).m(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 476cb5e31..f3a8f3f2e 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -43,7 +43,7 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class AssemblerRecipes extends SerializableRecipe { +@Deprecated public class AssemblerRecipes extends SerializableRecipe { public static HashMap recipes = new HashMap(); public static List recipeList = new ArrayList(); @@ -54,7 +54,7 @@ public class AssemblerRecipes extends SerializableRecipe { @Override public void registerDefaults() { - boolean exp = GeneralConfig.enableExpensiveMode; + boolean exp = false;//GeneralConfig.enableExpensiveMode; makeRecipe(new ComparableStack(ModItems.plate_iron, 2), new AStack[] {new OreDictStack(IRON.ingot(), 3), },30); makeRecipe(new ComparableStack(ModItems.plate_gold, 2), new AStack[] {new OreDictStack(GOLD.ingot(), 3), },30); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index a99236b60..b0efb41f8 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -57,20 +57,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { public void registerDefaults() { // plates and ingots - this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.plategold").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gold, 1)).inputItems(new OreDictStack(GOLD.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platetitanium").setup(60, 100).outputItems(new ItemStack(ModItems.plate_titanium, 1)).inputItems(new OreDictStack(TI.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platealu").setup(60, 100).outputItems(new ItemStack(ModItems.plate_aluminium, 1)).inputItems(new OreDictStack(AL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platesteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_steel, 1)).inputItems(new OreDictStack(STEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platelead").setup(60, 100).outputItems(new ItemStack(ModItems.plate_lead, 1)).inputItems(new OreDictStack(PB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platecopper").setup(60, 100).outputItems(new ItemStack(ModItems.plate_copper, 1)).inputItems(new OreDictStack(CU.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platealloy").setup(60, 100).outputItems(new ItemStack(ModItems.plate_advanced_alloy, 1)).inputItems(new OreDictStack(ALLOY.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.plateschrab").setup(60, 100).outputItems(new ItemStack(ModItems.plate_schrabidium, 1)).inputItems(new OreDictStack(SA326.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platecmb").setup(60, 100).outputItems(new ItemStack(ModItems.plate_combine_steel, 1)).inputItems(new OreDictStack(CMB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.plategunmetal").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gunmetal, 1)).inputItems(new OreDictStack(GUNMETAL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); - this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + String autoPlate = "autoswitch.plates"; + this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plategold").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gold, 1)).inputItems(new OreDictStack(GOLD.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platetitanium").setup(60, 100).outputItems(new ItemStack(ModItems.plate_titanium, 1)).inputItems(new OreDictStack(TI.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platealu").setup(60, 100).outputItems(new ItemStack(ModItems.plate_aluminium, 1)).inputItems(new OreDictStack(AL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platesteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_steel, 1)).inputItems(new OreDictStack(STEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platelead").setup(60, 100).outputItems(new ItemStack(ModItems.plate_lead, 1)).inputItems(new OreDictStack(PB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platecopper").setup(60, 100).outputItems(new ItemStack(ModItems.plate_copper, 1)).inputItems(new OreDictStack(CU.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platealloy").setup(60, 100).outputItems(new ItemStack(ModItems.plate_advanced_alloy, 1)).inputItems(new OreDictStack(ALLOY.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plateschrab").setup(60, 100).outputItems(new ItemStack(ModItems.plate_schrabidium, 1)).inputItems(new OreDictStack(SA326.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platecmb").setup(60, 100).outputItems(new ItemStack(ModItems.plate_combine_steel, 1)).inputItems(new OreDictStack(CMB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plategunmetal").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gunmetal, 1)).inputItems(new OreDictStack(GUNMETAL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) @@ -211,7 +212,10 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) - .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.purex").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_purex, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 8), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.LEAD_PLATING), new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) .inputItemsEx(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plateCast(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); @@ -328,9 +332,6 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_CONCRETE.any(), 8))); - this.register(new GenericRecipe("ass.assemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_assemfac, 1)) - .inputItems(new OreDictStack(STEEL.ingot(), 48), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor, 18), new OreDictStack(W.bolt(), 16), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) - .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); @@ -448,7 +449,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 64), new OreDictStack(CU.wireDense(), 64), new ComparableStack(ModItems.powder_chlorophyte, 16))); this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16)) - .inputItems(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); // reactors this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) @@ -492,10 +493,10 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(BIGMT.ingot(), 6), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.watzcooler").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_cooler, 3)) .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2)) - .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(RUBBER.ingot(), 8))); + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(RUBBER.ingot(), 8))); this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2)) - .inputItems(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_RESISTANTALLOY.plateWelded()))); + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_RESISTANTALLOY.plateWelded()))); // ICF this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index 1a7599b5d..455456499 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -16,7 +16,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; -import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.inventory.RecipesCommon.AStack; @@ -59,10 +58,9 @@ public class BlastFurnaceRecipes extends SerializableRecipe { addRecipe(W, SA326.nugget(), new ItemStack(ModItems.ingot_magnetized_tungsten)); addRecipe(STEEL, TC99.nugget(), new ItemStack(ModItems.ingot_tcalloy)); addRecipe(GOLD.plate(), ModItems.plate_mixed, new ItemStack(ModItems.plate_paa, 2)); - addRecipe(BIGMT, ModItems.powder_meteorite, new ItemStack(ModItems.ingot_starmetal, 2)); - addRecipe(CO, ModBlocks.block_meteor, new ItemStack(ModItems.ingot_meteorite)); + addRecipe(BIGMT, ModItems.ingot_meteorite, new ItemStack(ModItems.ingot_starmetal, 2)); + addRecipe(CO, ModItems.powder_meteorite, new ItemStack(ModItems.ingot_meteorite)); addRecipe(ModItems.meteorite_sword_hardened, CO, new ItemStack(ModItems.meteorite_sword_alloyed)); - addRecipe(ModBlocks.block_meteor, CO, new ItemStack(ModItems.ingot_meteorite)); if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleChemsitry) { addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID())); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index c3927a396..2a48a04f7 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,7 +1,6 @@ package com.hbm.inventory.recipes; import java.io.IOException; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -26,7 +25,6 @@ import com.hbm.items.ItemEnums; import com.hbm.items.ItemEnums.EnumAshType; import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import com.hbm.items.special.ItemBedrockOreNew; import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.items.special.ItemBedrockOreNew.BedrockOreGrade; @@ -49,35 +47,12 @@ public class CentrifugeRecipes extends SerializableRecipe { boolean lbs = GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCentrifuge; - recipes.put(new ComparableStack(ModItems.icf_pellet_depleted), new ItemStack[] { - new ItemStack(ModItems.icf_pellet_empty, 1), - new ItemStack(ModItems.pellet_charged, 1), - new ItemStack(ModItems.pellet_charged, 1), - new ItemStack(ModItems.powder_iron, 1) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE)), new ItemStack[] { new ItemStack(ModItems.powder_cobalt_tiny, 2), new ItemStack(ModItems.powder_boron_tiny, 2), new ItemStack(ModItems.powder_niobium_tiny, 2), new ItemStack(ModItems.nugget_zirconium, 3) }); - ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); - if(naquadriaNuggets.size() != 0) { - ItemStack nuggetNQR = naquadriaNuggets.get(0); - ItemStack copy = nuggetNQR.copy(); - copy.stackSize = 12; - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQD)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - copy, - new ItemStack(ModItems.nugget_euphemium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQR)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_co60, 12), - new ItemStack(ModItems.nugget_euphemium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - } - recipes.put(new OreDictStack(COAL.ore()), new ItemStack[] { new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), @@ -329,8 +304,6 @@ public class CentrifugeRecipes extends SerializableRecipe { recipes.put(new ComparableStack(Items.blaze_rod), new ItemStack[] {new ItemStack(Items.blaze_powder, 1), new ItemStack(Items.blaze_powder, 1), new ItemStack(ModItems.powder_fire, 1), new ItemStack(ModItems.powder_fire, 1) }); - recipes.put(new ComparableStack(ModItems.ingot_schraranium), new ItemStack[] { new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_schrabidium, 1), new ItemStack(ModItems.nugget_uranium, 3), new ItemStack(ModItems.nugget_neptunium, 2) }); - recipes.put(new ComparableStack(ModItems.crystal_coal), new ItemStack[] { new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_iron), new ItemStack[] { new ItemStack(ModItems.powder_iron, 2), new ItemStack(ModItems.powder_iron, 2), new ItemStack(ModItems.powder_titanium, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_gold), new ItemStack[] { new ItemStack(ModItems.powder_gold, 2), new ItemStack(ModItems.powder_gold, 2), new ItemStack(ModItems.ingot_mercury, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 65dd62fe8..3849b1759 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -2,6 +2,8 @@ package com.hbm.inventory.recipes; import static com.hbm.inventory.OreDictManager.*; +import java.util.ArrayList; + import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.ComparableStack; @@ -14,6 +16,7 @@ import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; public class PUREXRecipes extends GenericRecipes { @@ -37,7 +40,8 @@ public class PUREXRecipes extends GenericRecipes { long vitrification = 1_000; // ZIRNOX - this.register(new GenericRecipe("purex.zirnoxnu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + String autoZirnox = "autoswitch.zirnox"; + this.register(new GenericRecipe("purex.zirnoxnu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_natural_uranium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 1), @@ -46,8 +50,8 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 2)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") - .inputItems(new ComparableStack(ModItems.waste_natural_uranium)) + this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_uranium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 1), new ItemStack(ModItems.nugget_pu_mix, 2), @@ -55,7 +59,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 2)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxthmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxthmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_thorium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 1), @@ -64,7 +68,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 2)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_mox)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), @@ -73,7 +77,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_plutonium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), @@ -82,7 +86,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxheu233").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxheu233").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_u233)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u235, 1), @@ -91,7 +95,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxheu235").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxheu235").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_u235)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu238, 1), @@ -100,7 +104,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxles").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxles").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_schrabidium)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), @@ -109,7 +113,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 2)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.zirnoxzfbmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.zirnoxzfbmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) .inputItems(new ComparableStack(ModItems.waste_zfb_mox)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_zirconium, 3), @@ -119,7 +123,8 @@ public class PUREXRecipes extends GenericRecipes { .setIconToFirstIngredient()); // Plate Fuel - this.register(new GenericRecipe("purex.platemox").setup(100, platePower).setNameWrapper("purex.recycle") + String autoPlate = "autoswitch.plate"; + this.register(new GenericRecipe("purex.platemox").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_mox)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.powder_sr90_tiny, 1), @@ -128,7 +133,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 4)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.platepu238be").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.platepu238be").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_pu238be)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_beryllium, 1), @@ -137,7 +142,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nugget_lead, 2)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.platepu239").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.platepu239").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_pu239)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu240, 2), @@ -146,7 +151,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 5)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.platera226be").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.platera226be").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_ra226be)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), @@ -155,7 +160,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nugget_lead, 1)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.platesa326").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.platesa326").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_sa326)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 1), @@ -164,7 +169,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.plateu233").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.plateu233").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_u233)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u235, 1), @@ -173,7 +178,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.plateu235").setup(100, platePower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.plateu235").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) .inputItems(new ComparableStack(ModItems.waste_plate_u235)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_neptunium, 1), @@ -183,7 +188,8 @@ public class PUREXRecipes extends GenericRecipes { .setIconToFirstIngredient()); // PWR - this.register(new GenericRecipe("purex.pwrmeu").setup(100, pwrPower).setNameWrapper("purex.recycle") + String autoPWR = "autoswitch.pwr"; + this.register(new GenericRecipe("purex.pwrmeu").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEU)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 3), @@ -192,7 +198,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrheu233").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrheu233").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU233)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u235, 3), @@ -201,7 +207,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 5)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrheu235").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrheu235").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU235)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_neptunium, 3), @@ -210,7 +216,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 5)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrmen").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrmen").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEN)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 3), @@ -219,7 +225,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhen237").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhen237").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEN237)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu238, 2), @@ -228,7 +234,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 5)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrmox").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrmox").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MOX)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_u238, 3), @@ -237,7 +243,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrmep").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrmep").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEP)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_lead, 2), @@ -246,7 +252,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 3)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhep239").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhep239").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP239)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu_mix, 2), @@ -255,7 +261,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 5)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhep241").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhep241").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP241)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_lead, 3), @@ -264,7 +270,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrmea").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrmea").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEA)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_lead, 3), @@ -273,7 +279,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhea242").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhea242").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEA242)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_lead, 3), @@ -282,7 +288,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhes326").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhes326").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES326)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 3), @@ -291,7 +297,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrhes327").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrhes327").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES327)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_australium, 4), @@ -300,7 +306,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 6)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrbfbam").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrbfbam").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_AM_MIX)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_am_mix, 9), @@ -309,7 +315,7 @@ public class PUREXRecipes extends GenericRecipes { new ItemStack(ModItems.nuclear_waste_tiny, 1)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.pwrbfpu241").setup(100, pwrPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.pwrbfpu241").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_PU241)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu241, 9), @@ -328,7 +334,8 @@ public class PUREXRecipes extends GenericRecipes { new ChanceOutput(new ItemStack(ModItems.nuclear_waste_tiny, 1), 0.25F))); // Watz - this.register(new GenericRecipe("purex.watzschrab").setup(60, watzPower).setNameWrapper("purex.recycle") + String autoWatz = "autoswitch.watz"; + this.register(new GenericRecipe("purex.watzschrab").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.SCHRABIDIUM)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 15), @@ -337,7 +344,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzhes").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzhes").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HES)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 17), @@ -346,7 +353,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzmes").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzmes").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MES)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 12), @@ -355,7 +362,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzles").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzles").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LES)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_solinium, 9), @@ -364,7 +371,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzhen").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzhen").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HEN)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu239, 12), @@ -373,7 +380,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzmeu").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzmeu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEU)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu239, 12), @@ -382,7 +389,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzmep").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzmep").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEP)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_pu241, 12), @@ -391,7 +398,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzlead").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzlead").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LEAD)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_lead, 6), @@ -400,7 +407,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzboron").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzboron").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.BORON)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.powder_coal_tiny, 12), @@ -409,7 +416,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle") + this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.DU)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_polonium, 12), @@ -418,6 +425,40 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); + ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); + if(naquadriaNuggets.size() != 0) { + ItemStack nuggetNQR = naquadriaNuggets.get(0); + ItemStack copy = nuggetNQR.copy(); + copy.stackSize = 12; + + this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQD)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(copy, + new ItemStack(ModItems.nugget_euphemium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQR)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_co60, 12), + new ItemStack(ModItems.nugget_euphemium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + } + + //ICF + this.register(new GenericRecipe("purex.icf").setup(300, 10_000).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.icf_pellet_depleted)) + .outputItems(new ItemStack(ModItems.icf_pellet_empty, 1), + new ItemStack(ModItems.pellet_charged, 1), + new ItemStack(ModItems.pellet_charged, 1), + new ItemStack(ModItems.powder_iron, 1)) + .setIconToFirstIngredient()); + /// Vitrification this.register(new GenericRecipe("purex.vitliquid").setup(100, vitrification) .inputItems(new ComparableStack(ModBlocks.sand_lead)) @@ -432,5 +473,37 @@ public class PUREXRecipes extends GenericRecipes { this.register(new GenericRecipe("purex.vitsolid").setup(300, vitrification) .inputItems(new ComparableStack(ModBlocks.sand_lead), new ComparableStack(ModItems.nuclear_waste, 4)) .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified, 4))); + + // Schrabidium + this.register(new GenericRecipe("purex.schraranium").setup(200, 1_000).setNameWrapper("purex.schrab") + .inputItems(new ComparableStack(ModItems.ingot_schraranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 2_000), new FluidStack(Fluids.NITRIC_ACID, 1_000)) + .outputItems(new ItemStack(ModItems.nugget_schrabidium, 3), + new ItemStack(ModItems.nugget_uranium, 3), + new ItemStack(ModItems.nugget_neptunium, 2)) + .setIconToFirstIngredient()); + + String autoSchrab = "autoswitch.schrab"; + this.register(new GenericRecipe("purex.schrabzirnox").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.waste_plutonium)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + this.register(new GenericRecipe("purex.schrabpwr").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEP)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + this.register(new GenericRecipe("purex.schrabmen").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEN)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); } } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 91a8d99a4..99c37e984 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -34,6 +34,7 @@ public class GenericRecipe { public boolean writeIcon = false; public boolean customLocalization = false; protected String[] blueprintPools = null; + public String autoSwitchGroup = null; public GenericRecipe(String name) { this.name = name; @@ -59,6 +60,7 @@ public class GenericRecipe { public GenericRecipe setIcon(Block block) { return this.setIcon(new ItemStack(block)); } public GenericRecipe setNamed() { this.customLocalization = true; return this; } public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } + public GenericRecipe setGroup(String autoSwitch, GenericRecipes set) { this.autoSwitchGroup = autoSwitch; set.addToGroup(autoSwitch, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputItemsEx(AStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } @@ -113,6 +115,10 @@ public class GenericRecipe { public List print() { List list = new ArrayList(); list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + if(this.autoSwitchGroup != null) { + String[] lines = I18nUtil.resolveKeyArray("autoswitch", I18nUtil.resolveKey(this.autoSwitchGroup)); + for(String line : lines) list.add(EnumChatFormatting.GOLD + line); + } if(duration > 0) list.add(EnumChatFormatting.RED + "Duration: " + this.duration / 20D + "s"); if(power > 0) list.add(EnumChatFormatting.RED + "Consumption: " + BobMathUtil.getShortNumber(power) + "HE/t"); list.add(EnumChatFormatting.BOLD + "Input:"); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 2e92b67f6..0bee0728a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -46,6 +46,9 @@ public abstract class GenericRecipes extends Serializab public static HashMap> blueprintPools = new HashMap(); /** Name to recipe map for all recipes that are part of pools for lookup */ public static HashMap pooledBlueprints = new HashMap(); + + /** Groups for auto switch functionality (changes recipe automatically based on first solid input) */ + public HashMap> autoSwitchGroups = new HashMap(); public abstract int inputItemLimit(); public abstract int inputFluidLimit(); @@ -54,6 +57,7 @@ public abstract class GenericRecipes extends Serializab public boolean hasDuration() { return true; } public boolean hasPower() { return true; } + /** Adds a recipe to a blueprint pool (i.e. a blueprint item's recipe list) */ public static void addToPool(String pool, GenericRecipe recipe) { List list = blueprintPools.get(pool); if(list == null) { @@ -64,6 +68,14 @@ public abstract class GenericRecipes extends Serializab pooledBlueprints.put(recipe.name, recipe); } + /** Adds a recipe to an auto switch group (recipe can switch based on first solid input) */ + public void addToGroup(String group, GenericRecipe recipe) { + List list = autoSwitchGroups.get(group); + if(list == null) list = new ArrayList(); + list.add(recipe); + autoSwitchGroups.put(group, list); + } + public static void clearPools() { blueprintPools.clear(); pooledBlueprints.clear(); @@ -78,6 +90,7 @@ public abstract class GenericRecipes extends Serializab public void deleteRecipes() { this.recipeOrderedList.clear(); this.recipeNameMap.clear(); + this.autoSwitchGroups.clear(); } public void register(T recipe) { @@ -104,6 +117,7 @@ public abstract class GenericRecipes extends Serializab if(obj.has("named") && obj.get("named").getAsBoolean()) recipe.setNamed(); if(obj.has("blueprintpool")) recipe.setPools(obj.get("blueprintpool").getAsString().split(":")); if(obj.has("nameWrapper")) recipe.setNameWrapper(obj.get("nameWrapper").getAsString()); + if(obj.has("autoSwitchGroup")) recipe.setGroup(obj.get("autoSwitchGroup").getAsString(), this); readExtraData(element, recipe); @@ -154,6 +168,7 @@ public abstract class GenericRecipes extends Serializab if(recipe.customLocalization) writer.name("named").value(true); if(recipe.nameWrapper != null) writer.name("nameWrapper").value(recipe.nameWrapper); if(recipe.blueprintPools != null && recipe.blueprintPools.length > 0) writer.name("blueprintpool").value(String.join(":", recipe.blueprintPools)); + if(recipe.autoSwitchGroup != null) writer.name("autoSwitchGroup").value(recipe.autoSwitchGroup); writeExtraData(recipe, writer); } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 4019a3355..24af636e0 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -702,7 +702,6 @@ public class ModItems { public static Item ingot_raw; public static Item plate_cast; public static Item plate_welded; - public static Item heavy_component; public static Item wire_fine; public static Item wire_dense; public static Item part_barrel_light; @@ -1458,6 +1457,7 @@ public class ModItems { public static Item gun_autoshotgun; public static Item gun_autoshotgun_shredder; public static Item gun_autoshotgun_sexy; + public static Item gun_autoshotgun_heretic; public static Item gun_quadro; public static Item gun_lag; public static Item gun_minigun; @@ -2346,7 +2346,7 @@ public class ModItems { thruster_nuclear = new Item().setUnlocalizedName("thruster_nuclear").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":thruster_nuclear"); safety_fuse = new Item().setUnlocalizedName("safety_fuse").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":safety_fuse"); part_generic = new ItemGenericPart().setUnlocalizedName("part_generic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":part_generic"); - item_expensive = new ItemEnumMulti(EnumExpensiveType.class, true, true).setUnlocalizedName("item_expensive").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":item_expensive"); + item_expensive = new ItemExpensive().setUnlocalizedName("item_expensive").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":item_expensive"); item_secret = new ItemEnumMulti(EnumSecretType.class, true, true).setUnlocalizedName("item_secret").setCreativeTab(null).setTextureName(RefStrings.MODID + ":item_secret"); ingot_metal = new ItemEnumMulti(EnumIngotMetal.class, true, true).setUnlocalizedName("ingot_metal").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ingot_metal"); chemical_dye = new ItemChemicalDye().setUnlocalizedName("chemical_dye").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chemical_dye"); @@ -2931,7 +2931,6 @@ public class ModItems { ingot_raw = new ItemAutogen(MaterialShapes.INGOT).setUnlocalizedName("ingot_raw").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_raw"); plate_cast = new ItemAutogen(MaterialShapes.CASTPLATE).aot(Mats.MAT_BISMUTH, "plate_cast_bismuth").setUnlocalizedName("plate_cast").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_cast"); plate_welded = new ItemAutogen(MaterialShapes.WELDEDPLATE).setUnlocalizedName("plate_welded").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_welded"); - heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(null).setTextureName(RefStrings.MODID + ":heavy_component"); wire_fine = new ItemAutogen(MaterialShapes.WIRE) .aot(Mats.MAT_ALUMINIUM, "wire_aluminium").aot(Mats.MAT_COPPER, "wire_copper") .aot(Mats.MAT_MINGRADE, "wire_red_copper").aot(Mats.MAT_GOLD, "wire_gold") @@ -5461,7 +5460,6 @@ public class ModItems { GameRegistry.registerItem(plate_welded, plate_welded.getUnlocalizedName()); GameRegistry.registerItem(shell, shell.getUnlocalizedName()); GameRegistry.registerItem(pipe, pipe.getUnlocalizedName()); - GameRegistry.registerItem(heavy_component, heavy_component.getUnlocalizedName()); //Bolts GameRegistry.registerItem(bolt, bolt.getUnlocalizedName()); @@ -6391,6 +6389,7 @@ public class ModItems { GameRegistry.registerItem(gun_autoshotgun, gun_autoshotgun.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun_shredder, gun_autoshotgun_shredder.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun_sexy, gun_autoshotgun_sexy.getUnlocalizedName()); + GameRegistry.registerItem(gun_autoshotgun_heretic, gun_autoshotgun_heretic.getUnlocalizedName()); GameRegistry.registerItem(gun_quadro, gun_quadro.getUnlocalizedName()); GameRegistry.registerItem(gun_lag, gun_lag.getUnlocalizedName()); GameRegistry.registerItem(gun_minigun, gun_minigun.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemDrop.java b/src/main/java/com/hbm/items/special/ItemDrop.java index 154785cf5..e1db9ab9e 100644 --- a/src/main/java/com/hbm/items/special/ItemDrop.java +++ b/src/main/java/com/hbm/items/special/ItemDrop.java @@ -202,7 +202,7 @@ public class ItemDrop extends Item { list.add("Continuously heats up matter by"); list.add("resonating every planck second."); list.add("Tends to catch fire or to create"); - list.add("small plamsa arcs. Not edible."); + list.add("small plasma arcs. Not edible."); } if (this == ModItems.black_hole) { list.add("Contains a regular singularity"); diff --git a/src/main/java/com/hbm/items/special/ItemExpensive.java b/src/main/java/com/hbm/items/special/ItemExpensive.java new file mode 100644 index 000000000..cde77e340 --- /dev/null +++ b/src/main/java/com/hbm/items/special/ItemExpensive.java @@ -0,0 +1,22 @@ +package com.hbm.items.special; + +import java.util.List; + +import com.hbm.items.ItemEnumMulti; +import com.hbm.items.ItemEnums.EnumExpensiveType; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class ItemExpensive extends ItemEnumMulti { + + public ItemExpensive() { + super(EnumExpensiveType.class, true, true); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Expensive mode item"); + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index 66cb14695..f77640e05 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -450,6 +450,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } + @Override + public boolean getShareTag() { return false; } + public static class SmokeNode { public double forward = 0D; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index 753de9167..dfa406299 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -76,7 +76,8 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_m2, new ItemRenderM2()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun, new ItemRenderShredder(ResourceManager.shredder_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_shredder, new ItemRenderShredder(ResourceManager.shredder_orig_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderSexy()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderSexy(ResourceManager.sexy_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_heretic, new ItemRenderSexy(ResourceManager.heretic_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_quadro, new ItemRenderQuadro()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun, new ItemRenderMinigun(ResourceManager.minigun_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun_lacunae, new ItemRenderMinigun(ResourceManager.minigun_lacunae_tex)); @@ -267,6 +268,7 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_autoshotgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun_shredder) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun_sexy) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun_heretic) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_quadro) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_lag) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_minigun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index 93c0e6913..cefcc4aad 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -67,6 +67,17 @@ public class XFactory10ga { .setupStandardConfiguration() .anim(LAMBDA_DOUBLE_BARREL_ANIMS).orchestra(Orchestras.ORCHESTRA_DOUBLE_BARREL) ).setUnlocalizedName("gun_double_barrel_sacred_dragon"); + + ModItems.gun_autoshotgun_heretic = new ItemGunBaseNT(WeaponQuality.DEBUG, new GunConfig() + .draw(20).inspect(65).reloadSequential(true).inspectCancel(false).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(100F).delay(3).auto(true).dryfireAfterAuto(true).reload(110).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 250).addConfigs(g10, g10_shrapnel, g10_du, g10_slug, g10_explosive)) + .offset(0.75, -0.125, -0.25) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(XFactory12ga.LAMBDA_RECOIL_SEXY)) + .setupStandardConfiguration() + .anim(XFactory12ga.LAMBDA_SEXY_ANIMS).orchestra(Orchestras.ORCHESTRA_SHREDDER_SEXY) + ).setUnlocalizedName("gun_autoshotgun_heretic"); } public static BiConsumer LAMBDA_RECOIL_DOUBLE_BARREL = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index 128341947..fbee99b2b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -138,7 +138,7 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.SPEEDUP) .addMod(new Item[] {ModItems.gun_minigun, ModItems.gun_minigun_dual}, new WeaponModMinigunSpeedup(ID_MINIGUN_SPEED)) .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); - new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12, ModItems.gun_autoshotgun_sexy}, new WeaponModChoke(210)); + new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12, ModItems.gun_autoshotgun_sexy, ModItems.gun_autoshotgun_heretic}, new WeaponModChoke(210)); new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); new WeaponModDefinition(EnumModSpecial.BAYONET) diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 57e7c9744..4f891c49e 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5397)"; + public static final String VERSION = "1.0.27 BETA (5412)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d170e553b..2a51edc27 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -22,6 +22,7 @@ import com.hbm.inventory.material.NTMMaterial; import static com.hbm.inventory.OreDictManager.*; import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumExpensiveType; import com.hbm.items.ItemEnums.EnumLegendaryType; import com.hbm.items.ItemEnums.EnumPages; import com.hbm.items.ItemEnums.EnumPlantType; @@ -865,7 +866,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.pwr_heatsink, 4), new Object[] { "SCS", "CRC", "SCS", 'S', BIGMT.plateCast(), 'C', CU.plate(), 'R', RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pwr_reflector, 4), new Object[] { "RLR", "LSL", "RLR", 'R', OreDictManager.getReflector(), 'L', PB.plate528(), 'S', STEEL.plateCast() }); addRecipeAuto(new ItemStack(ModBlocks.pwr_casing, 4), new Object[] { "LCL", "CSC", "LCL", 'L', PB.plate528(), 'C', ANY_CONCRETE.any(), 'S', STEEL.plateCast() }); - addRecipeAuto(new ItemStack(ModBlocks.pwr_controller, 1), new Object[] { "CPC", "PSP", "CPC", 'C', ModBlocks.pwr_casing, 'P', ANY_PLASTIC.ingot(), 'S', !GeneralConfig.enableExpensiveMode ? DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) : STEEL.heavyComp() }); + addRecipeAuto(new ItemStack(ModBlocks.pwr_controller, 1), new Object[] { "CPC", "PSP", "CPC", 'C', ModBlocks.pwr_casing, 'P', ANY_PLASTIC.ingot(), 'S', !GeneralConfig.enableExpensiveMode ? DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) : DictFrame.fromOne(ModItems.item_expensive, EnumExpensiveType.CIRCUIT) }); addRecipeAuto(new ItemStack(ModBlocks.pwr_port, 1), new Object[] { "S", "C", "S", 'S', STEEL.plate(), 'C', ModBlocks.pwr_casing }); addRecipeAuto(new ItemStack(ModBlocks.pwr_neutron_source, 1), new Object[] { "LRL", "ZRZ", "LRL", 'L', PB.plate528(), 'R', ModItems.billet_ra226be, 'Z', ZR.plateCast() }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index b1818f018..0a9fe875e 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1723,6 +1723,7 @@ public class MainRegistry { ignoreMappings.add("hbm:item.journal_silver"); ignoreMappings.add("hbm:tile.machine_arc_furnace_off"); ignoreMappings.add("hbm:tile.machine_arc_furnace_on"); + ignoreMappings.add("hbm:item.heavy_component"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 1f0be79bf..4a3ded4e7 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -40,6 +40,7 @@ import com.hbm.items.weapon.sedna.factory.XFactory12ga; import com.hbm.lib.ModDamageSource; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.HeldItemNBTPacket; import com.hbm.packet.toclient.PermaSyncPacket; import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.packet.toclient.SerializableRecipePacket; @@ -988,6 +989,11 @@ public class ModEventHandler { player.worldObj.spawnParticle("townaura", player.posX + vec.xCoord, player.posY + 1 + vec.yCoord, player.posZ + vec.zCoord, 0.0, 0.0, 0.0); } } + + if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) { + HeldItemNBTPacket packet = new HeldItemNBTPacket(player.getHeldItem()); + PacketDispatcher.wrapper.sendTo(packet, (EntityPlayerMP) player); + } } @SubscribeEvent diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 5d0002948..a3651233d 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1014,6 +1014,7 @@ public class ResourceManager { public static final ResourceLocation shredder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder.png"); public static final ResourceLocation shredder_orig_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder_orig.png"); public static final ResourceLocation sexy_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy_real_no_fake.png"); + public static final ResourceLocation heretic_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy_heretic.png"); public static final ResourceLocation whiskey_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/whiskey.png"); public static final ResourceLocation quadro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro.png"); public static final ResourceLocation quadro_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro_rocket.png"); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java index 2316ad787..8b52114ee 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -3,6 +3,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.util.BobMathUtil; import api.hbm.energymk2.IEnergyHandlerMK2; @@ -19,8 +20,8 @@ public class ModuleMachineAssembler extends ModuleMachineBase { } @Override - public GenericRecipe getRecipe() { - return AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.recipe); + public GenericRecipes getRecipeSet() { + return AssemblyMachineRecipes.INSTANCE; } @Override diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 9815c0803..f5f4827e5 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -1,7 +1,10 @@ package com.hbm.module.machine; +import java.util.List; + import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; import com.hbm.items.machine.ItemBlueprints; @@ -44,6 +47,20 @@ public abstract class ModuleMachineBase { /** Expects the tanks to be set up correctly beforehand */ public boolean canProcess(GenericRecipe recipe, double speed, double power) { if(recipe == null) return false; + + // auto switch functionality + if(recipe.autoSwitchGroup != null && slots[inputSlots[0]] != null) { + ItemStack itemToSwitchBy = slots[inputSlots[0]]; + List recipes = (List) this.getRecipeSet().autoSwitchGroups.get(recipe.autoSwitchGroup); + if(recipes != null) for(GenericRecipe nextRec : recipes) { + if(nextRec.inputItem == null) continue; + if(nextRec.inputItem[0].matchesRecipe(itemToSwitchBy, true)) { // perform the switch + this.recipe = nextRec.getInternalName(); + return false; // cancel the recipe this tick since we need to do the previous checking all over again + } + } + } + if(power != 1 && battery.getPower() < recipe.power * power) return false; // only check with floating point numbers if mult is not 1 if(power == 1 && battery.getPower() < recipe.power) return false; @@ -109,7 +126,7 @@ public abstract class ModuleMachineBase { if(slots[outputSlots[i]] == null) { slots[outputSlots[i]] = collapse; } else { - slots[outputSlots[i]].stackSize += collapse.stackSize; // we can do this because we've already established that the result slot is not null if it's a single output + if(collapse != null) slots[outputSlots[i]].stackSize += collapse.stackSize; // we can do this because we've already established that the result slot is not null if it's a single output } } } @@ -128,8 +145,12 @@ public abstract class ModuleMachineBase { this.progress = 0D; } } + + public GenericRecipe getRecipe() { + return (GenericRecipe) getRecipeSet().recipeNameMap.get(this.recipe); + } - public abstract GenericRecipe getRecipe(); + public abstract GenericRecipes getRecipeSet(); public void update(double speed, double power, boolean extraCondition, ItemStack blueprint) { GenericRecipe recipe = getRecipe(); @@ -164,6 +185,16 @@ public abstract class ModuleMachineBase { if(inputSlots[i] == slot && recipe.inputItem[i].matchesRecipe(stack, true)) return true; } + if(recipe.autoSwitchGroup != null) { + List recipes = (List) this.getRecipeSet().autoSwitchGroups.get(recipe.autoSwitchGroup); // why the FUCK does this need a cast + if(recipes != null) for(GenericRecipe newRec : recipes) { + if(newRec.inputItem == null) continue; + if(inputSlots[0] == slot && newRec.inputItem[0].matchesRecipe(stack, true)) { + return true; + } + } + } + return false; } diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java index c6268e2cd..facd2bfde 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java @@ -2,7 +2,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.ChemicalPlantRecipes; -import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import api.hbm.energymk2.IEnergyHandlerMK2; import net.minecraft.item.ItemStack; @@ -24,8 +24,8 @@ public class ModuleMachineChemplant extends ModuleMachineBase { } @Override - public GenericRecipe getRecipe() { - return ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + public GenericRecipes getRecipeSet() { + return ChemicalPlantRecipes.INSTANCE; } public ModuleMachineChemplant itemInput(int a, int b, int c) { inputSlots[0] = a; inputSlots[1] = b; inputSlots[2] = c; return this; } diff --git a/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java index afb8186d2..107a6d05e 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java @@ -2,7 +2,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.PUREXRecipes; -import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import api.hbm.energymk2.IEnergyHandlerMK2; import net.minecraft.item.ItemStack; @@ -18,8 +18,8 @@ public class ModuleMachinePUREX extends ModuleMachineBase { } @Override - public GenericRecipe getRecipe() { - return PUREXRecipes.INSTANCE.recipeNameMap.get(this.recipe); + public GenericRecipes getRecipeSet() { + return PUREXRecipes.INSTANCE; } public ModuleMachinePUREX itemInput(int start) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = start + i; return this; } diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 165664236..524319f01 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -67,6 +67,8 @@ public class PacketDispatcher { wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //Syncs server recipe configs to the client wrapper.registerMessage(SerializableRecipePacket.Handler.class, SerializableRecipePacket.class, i++, Side.CLIENT); + //Syncing of NBT for guns + wrapper.registerMessage(HeldItemNBTPacket.Handler.class, HeldItemNBTPacket.class, i++, Side.CLIENT); } } diff --git a/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java b/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java new file mode 100644 index 000000000..45bf21e45 --- /dev/null +++ b/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java @@ -0,0 +1,68 @@ +package com.hbm.packet.toclient; + +import com.hbm.util.BufferUtil; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class HeldItemNBTPacket implements IMessage { + + private ItemStack stack; + + public HeldItemNBTPacket() { } + + public HeldItemNBTPacket(ItemStack stack) { + this.stack = stack; + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeShort(Item.getIdFromItem(stack.getItem())); + buf.writeByte(stack.stackSize); + buf.writeShort(stack.getItemDamage()); + NBTTagCompound nbtTagCompound = null; + nbtTagCompound = stack.stackTagCompound; + BufferUtil.writeNBT(buf, nbtTagCompound); + } + + @Override + public void fromBytes(ByteBuf buf) { + short id = buf.readShort(); + if(id >= 0) { + byte quantity = buf.readByte(); + short meta = buf.readShort(); + stack = new ItemStack(Item.getItemById(id), quantity, meta); + stack.stackTagCompound = BufferUtil.readNBT(buf); + } + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(HeldItemNBTPacket m, MessageContext ctx) { + try { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(m.stack == null) return null; + + ItemStack held = player.getHeldItem(); + if(held == null) return null; + if(held.getItem() != m.stack.getItem()) return null; + if(held.getItemDamage() != m.stack.getItemDamage()) return null; + + held.stackTagCompound = m.stack.stackTagCompound; + + } catch(Exception x) { } finally { } + return null; + } + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java index 895c2357e..7c961b43c 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java @@ -11,9 +11,16 @@ import com.hbm.util.Vec3NT; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; @NotableComments public class ItemRenderSexy extends ItemRenderWeaponBase { + + protected ResourceLocation texture; + + public ItemRenderSexy(ResourceLocation texture) { + this.texture = texture; + } @Override protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } @@ -76,7 +83,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glPopMatrix(); } - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.sexy_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); GL11.glTranslated(0, -1, -8); GL11.glRotated(equip[0], 1, 0, 0); @@ -209,7 +216,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.sexy_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); ResourceManager.sexy.renderPart("Gun"); ResourceManager.sexy.renderPart("Barrel"); ResourceManager.sexy.renderPart("RecoilSpring"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java index dd28d969c..45a476b35 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java @@ -10,7 +10,7 @@ import com.hbm.inventory.container.ContainerMachinePUREX; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachinePUREX; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.PUREXRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -59,9 +59,9 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn this.inputTanks = new FluidTank[3]; this.outputTanks = new FluidTank[1]; for(int i = 0; i < 3; i++) { - this.inputTanks[i] = new FluidTank(Fluids.NONE, 16_000); + this.inputTanks[i] = new FluidTank(Fluids.NONE, 24_000); } - this.outputTanks[0] = new FluidTank(Fluids.NONE, 16_000); + this.outputTanks[0] = new FluidTank(Fluids.NONE, 24_000); this.purexModule = new ModuleMachinePUREX(0, this, slots) .itemInput(4).itemOutput(7) @@ -80,7 +80,7 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn if(!worldObj.isRemote) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(purexModule.recipe); + GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purexModule.recipe); if(recipe != null) { this.maxPower = recipe.power * 100; } @@ -124,18 +124,26 @@ public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEn public DirPos[] getConPos() { return new DirPos[] { - new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), - new DirPos(xCoord + 2, yCoord, zCoord + 0, Library.POS_X), - new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), - new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), - new DirPos(xCoord - 2, yCoord, zCoord + 0, Library.NEG_X), - new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), - new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), - new DirPos(xCoord + 0, yCoord, zCoord + 2, Library.POS_Z), - new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), - new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), - new DirPos(xCoord + 0, yCoord, zCoord - 2, Library.NEG_Z), - new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 3, yCoord, zCoord - 2, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 0, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 2, Library.POS_X), + new DirPos(xCoord - 3, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord - 2, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 0, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 2, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 0, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 2, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord - 2, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 0, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 2, yCoord, zCoord - 3, Library.NEG_Z), }; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java index 3da017e91..5c1837c71 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java @@ -112,6 +112,7 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements buf.writeDouble(this.levelUpper); buf.writeDouble(this.heatLower); buf.writeDouble(this.heatUpper); + if(function != null) buf.writeInt(function.ordinal()); } @Override @@ -121,6 +122,7 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements this.levelUpper = buf.readDouble(); this.heatLower = buf.readDouble(); this.heatUpper = buf.readDouble(); + this.function = RBMKFunction.values()[buf.readInt()]; } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index d909adf39..26b2baf6f 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -129,6 +129,14 @@ armorMod.type.leggings=Beinschienen armorMod.type.servo=Servos armorMod.type.special=Spezial +autoswitch=Teil der Rezeptgruppe "%s"$Rezept ändert sich basierend auf das erste Item +autoswitch.plate=Wiederanreicherung Plattenbrennstoff +autoswitch.plates=Metallplatten +autoswitch.pwr=Wiederanreicherung PWR-Brennstoff +autoswitch.schrab=Schrabidium-Extraktion +autoswitch.watz=Wiederanreicherung Watzpellet +autoswitch.zirnox=Wiederanreicherung ZIRNOX-Brennstoff + bomb.detonated=Erfolgreich gezündet! bomb.incompatible=Gerät kann nicht ausgelöst werden! bomb.launched=Erfolgreich gestartet! @@ -392,6 +400,7 @@ container.machineLargeTurbine=Industrielle Dampfturbine container.machineLiquefactor=Verflüssiger container.machineMixer=Industrieller Mixer container.machineOreSlopper=B.E.M. +container.machinePUREX=PUREX container.machinePyroOven=Pyrolyseofen container.machineRefinery=Ölraffinerie container.machineRotaryFurnace=Rotationshochofen @@ -2102,6 +2111,7 @@ item.gun_amat.name=Panzerbüchse item.gun_amat_penance.name=Penance item.gun_amat_subtlety.name=Subtlety item.gun_autoshotgun.name=Auto-Flinte +item.gun_autoshotgun_heretic.name=The Heretic item.gun_autoshotgun_sexy.name=Sexy item.gun_autoshotgun_shredder.name=Shredder item.gun_b92.name=§9B92 Energiepistole§r @@ -3710,6 +3720,7 @@ potion.hbm_taint=Verdorben potion.hbm_telekinesis=! ! ! purex.recycle=Wiederanreicherung von %s +purex.schrab=Schrabidium extrahieren aus %s radar.clearMap=Karte zurücksetzen radar.detectMissiles=Raketen erkennen @@ -4460,6 +4471,7 @@ tile.machine_powerrtg.name=PT-Isotopenzelle tile.machine_press.name=Befeuerte Presse tile.machine_puf6_tank.name=Plutoniumhexafluorid-Tank tile.machine_pumpjack.name=Pferdekopfpumpe +tile.machine_purex.name=PUREX tile.machine_pyrooven.name=Pyrolyseofen tile.machine_radar.name=Radar tile.machine_radar_large.name=Großes Radar diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1ddb53855..d1c47cebc 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -184,6 +184,14 @@ armorMod.type.leggings=Leggings armorMod.type.servo=Servos armorMod.type.special=Special +autoswitch=Part of auto switch group "%s"$Recipe changes based on first ingredient +autoswitch.plate=Re-Enrichment Plate Fuel +autoswitch.plates=Metal Plates +autoswitch.pwr=Re-Enrichment PWR Fuel +autoswitch.schrab=Schrabidium Extraction +autoswitch.watz=Re-Enrichment Watz Pellet +autoswitch.zirnox=Re-Enrichment ZIRNOX Fuel + battery.mode.buffer=Input/Output Mode battery.mode.input=Input Mode battery.mode.off=OffW @@ -794,6 +802,7 @@ container.machineLargeTurbine=Industrial Steam Turbine container.machineLiquefactor=Liquefactor container.machineMixer=Industrial Mixer container.machineOreSlopper=B.O.P. +container.machinePUREX=PUREX container.machinePyroOven=Pyrolysis Oven container.machineRefinery=Oil Refinery container.machineRotaryFurnace=Rotary Furnace @@ -2913,6 +2922,7 @@ item.gun_amat.name=Anti-Materiel Rifle item.gun_amat_penance.name=Penance item.gun_amat_subtlety.name=Subtlety item.gun_autoshotgun.name=Auto Shotgun +item.gun_autoshotgun_heretic.name=The Heretic item.gun_autoshotgun_sexy.name=Sexy item.gun_autoshotgun_shredder.name=Shredder item.gun_b92.name=§9B92 Energy Pistol§r @@ -4768,6 +4778,7 @@ potion.hbm_taint=Tainted potion.hbm_telekinesis=! ! ! purex.recycle=Re-enrichment of %s +purex.schrab=Schrabidium extraction from %s radar.clearMap=Clear Map radar.detectMissiles=Detect Missiles @@ -5597,6 +5608,7 @@ tile.machine_powerrtg.name=PT Isotope Cell tile.machine_press.name=Burner Press tile.machine_puf6_tank.name=Plutonium Hexafluoride Tank tile.machine_pumpjack.name=Pumpjack +tile.machine_purex.name=PUREX tile.machine_pyrooven.name=Pyrolysis Oven tile.machine_radar.name=Radar tile.machine_radar_large.name=Large Radar diff --git a/src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png b/src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png new file mode 100644 index 0000000000000000000000000000000000000000..4dab907d0d4320b2b7014ece5e4265051a877a51 GIT binary patch literal 5675 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 N#$a=U20d8p{{d1I+>-zR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png b/src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png deleted file mode 100644 index 959b94011dd9e1bf6a37e1adc7d0ac47df9c2fb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37269 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 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf b/src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf deleted file mode 100644 index 2376c64d51e153dc45b6dd1b928d8a9cf8a7d0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267625 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 From a5bdfa87d91b5bd6dc149605a04313a5b3e95587 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 4 Aug 2025 20:16:50 +0200 Subject: [PATCH 153/323] it just works --- changelog | 60 ++++--------------- gradle.properties | 2 +- .../recipes/AssemblyMachineRecipes.java | 3 + src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 2 +- .../hbm/module/machine/ModuleMachineBase.java | 1 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 11 ++-- 8 files changed, 25 insertions(+), 57 deletions(-) diff --git a/changelog b/changelog index b819e17ab..bc517c4ea 100644 --- a/changelog +++ b/changelog @@ -1,53 +1,15 @@ -## Added -* Blueprint booklets - * Can be found in worldgen - * Using it will create one random blueprint of the same type as the booklet -* Liquid concrete - * It's conk but liquid -* Rebar - * When hooked up to liquid concrete using pipes, will fill to create reinforced concrete - * Fills bottom to top, so connect the pipes to the top - * The rendering on this is still experimental, so don't overdo it with how large of an area you're casting -* Rebar placer - * Can be configured with different types of concrete, reinforced or not, or even colored - * Rebar created with the rebar placer will remember its type and assume it when being filled with liquid concrete -* PUREX - * Chemplant-like nuclear fuel reprocessing machine - * Handles all the nuclear fuel reprocessing that was previously done by the standard centrifuge - * All reprocessing recipes now require both kerosene and nitric acid - * Also handles the vitrification recipes and the thorium salt reprocessing from the chemical plant - * Comes with new schrabidium extraction recipes from MEP/MEN fuels using schrabidic acid (yield is twice the schrabidium cost for acid used) +## Added (last time, i forgor) +* RBMK autoloader + * Can be placed on top of RBMK fuel rods + * Can be configured to switch fuel rods in 5% depletion increments + * Usable with all forms of item transport like conveyors and pneumatic tubes ## Changed -* The alternate recipes for nitric acid and xenon gas in the chemical plant now require blueprints -* The chemical plant now has a recipe for making cobblestone from 25mB of lava (which can be liquefacted into even more lava, useful for cobblestone generation) -* Removed the old arc furnace -* Mining lasers now build up barricades in all directions and not just horizontal ones, preventing potential deadlocks due to liquid flowing in from above -* One of the new secret parts for making a certain weapon is now obtainable again via red rooms -* Biogas can now be cracked into aromatics and petroleum gas -* Custom missile part recipes have been added to the new assembler -* Mini nukes are now made from weapon steel instead of regular steel -* Meteorite ingots are now made from meteorite powder, not blocks -* Starmetal now requires meteorite ingots instead of blocks -* Added auto switch groups - * The new standardized processing machines (assembler, chemplant, purex) can now have recipes that are grouped - * Recipes in groups will accept non-recipe items, if the item is used in another recipe from that same group - * When this happens, the recipe switches automatically, if possible - * This means that many PUREX recycling recipes and the ingot to plate recipes don't need dedicated machines for every single recipe, rather only one for that auto switch group -* The tooltip of the chosen recipe on the recipe selector now renders in the bottom left corner instead of following the mouse, preventing an issue where the tooltip is cut off on larger GUI scales -* Expensive mode has been changed - * Instead of using heavy components for most things, there's now "expensive" items that are used by many assembler recipes - * "Expensive" items replace some of the microcrafting that's part of the recipe, meaning that expensive mode recipes are generally simpler (but require way more materials) - * All heavy components have been annihilated and any recipes that may still use them (e.g. from old configs) default to using cast plates instead -* Removed the assembly factory's recipe, as it still uses the deprecated recipe set - * A new assembly factory will be added soon -* All recently deprecated machines have been removed from the creative tabs +* Replaced "re-enrichment" in the PUREX recipes with "reprocessing" ## Fixed -* Fixed a few assembler recipes using the old crafting numbers which sometimes exceed the stack limit - * As an extra safeguard, the recipe loader now throws an exception if that happens -* Fixed dupe caused by the breeding reactor -* Fixed a potential crash caused by a change done to tile entity proxies in relation to EnergyControl -* Fixed the assembler achievement still using the old one -* Fixed the RBMK auto control rod's function not syncing to the client properly -* Fixed crash caused by new standardized machine recipes with chance-based output when they output nothing +* Fixed many of the PUREX' recipe categories simply not processing + * It worked last time I swear +* Fixed life-ending issue where the assembler achievement's icon was incorrect +* Fixed RBMK autoloader not having a recipe + * Ow \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ca80c122b..e40665d77 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5412 +mod_build_number=5412H1 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index b0efb41f8..b3014e716 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -464,6 +464,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.rbmk").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_blank, 1)) .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4)) .inputItemsEx(new ComparableStack(ModBlocks.concrete_asbestos, 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(CU.plate(), 16))); + this.register(new GenericRecipe("ass.rbmkautoloader").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_autoloader, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(PB.plateCast(), 4), new OreDictStack(B.ingot(), 4), new ComparableStack(ModItems.motor, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 3))); // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 4f891c49e..543f77ad9 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5412)"; + public static final String VERSION = "1.0.27 BETA (5412H1)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0a9fe875e..f797b0de3 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -718,7 +718,7 @@ public class MainRegistry { //progression achieves achBurnerPress = new Achievement("achievement.burnerPress", "burnerPress", 0, 0, new ItemStack(ModBlocks.machine_press), null).initIndependentStat().registerStat(); achBlastFurnace = new Achievement("achievement.blastFurnace", "blastFurnace", 1, 3, new ItemStack(ModBlocks.machine_difurnace_off), achBurnerPress).initIndependentStat().registerStat(); - achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembler), achBurnerPress).initIndependentStat().registerStat(); + achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembly_machine), achBurnerPress).initIndependentStat().registerStat(); achSelenium = new Achievement("achievement.selenium", "selenium", 3, 2, ModItems.ingot_starmetal, achBurnerPress).initIndependentStat().setSpecial().registerStat(); achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemical_plant), achAssembly).initIndependentStat().registerStat(); achConcrete = new Achievement("achievement.concrete", "concrete", 6, -4, new ItemStack(ModBlocks.concrete), achChemplant).initIndependentStat().registerStat(); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java index f5f4827e5..0a27c56d6 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -53,6 +53,7 @@ public abstract class ModuleMachineBase { ItemStack itemToSwitchBy = slots[inputSlots[0]]; List recipes = (List) this.getRecipeSet().autoSwitchGroups.get(recipe.autoSwitchGroup); if(recipes != null) for(GenericRecipe nextRec : recipes) { + if(nextRec.getInternalName().equals(this.recipe)) continue; if(nextRec.inputItem == null) continue; if(nextRec.inputItem[0].matchesRecipe(itemToSwitchBy, true)) { // perform the switch this.recipe = nextRec.getInternalName(); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 26b2baf6f..444cc8a7c 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4472,6 +4472,7 @@ tile.machine_press.name=Befeuerte Presse tile.machine_puf6_tank.name=Plutoniumhexafluorid-Tank tile.machine_pumpjack.name=Pferdekopfpumpe tile.machine_purex.name=PUREX +tile.machine_purex.desc=Wiederaufbereitungsmaschine für Kernbrennstoff.$Die meisten Rezepte benötigen Kerosin und Salpetersäure. tile.machine_pyrooven.name=Pyrolyseofen tile.machine_radar.name=Radar tile.machine_radar_large.name=Großes Radar diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d1c47cebc..32d100935 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -185,12 +185,12 @@ armorMod.type.servo=Servos armorMod.type.special=Special autoswitch=Part of auto switch group "%s"$Recipe changes based on first ingredient -autoswitch.plate=Re-Enrichment Plate Fuel +autoswitch.plate=Reprocessing Plate Fuel autoswitch.plates=Metal Plates -autoswitch.pwr=Re-Enrichment PWR Fuel +autoswitch.pwr=Reprocessing PWR Fuel autoswitch.schrab=Schrabidium Extraction -autoswitch.watz=Re-Enrichment Watz Pellet -autoswitch.zirnox=Re-Enrichment ZIRNOX Fuel +autoswitch.watz=Reprocessing Watz Pellet +autoswitch.zirnox=Reprocessing ZIRNOX Fuel battery.mode.buffer=Input/Output Mode battery.mode.input=Input Mode @@ -4777,7 +4777,7 @@ potion.hbm_stability=Stability potion.hbm_taint=Tainted potion.hbm_telekinesis=! ! ! -purex.recycle=Re-enrichment of %s +purex.recycle=Reprocessing of %s purex.schrab=Schrabidium extraction from %s radar.clearMap=Clear Map @@ -5609,6 +5609,7 @@ tile.machine_press.name=Burner Press tile.machine_puf6_tank.name=Plutonium Hexafluoride Tank tile.machine_pumpjack.name=Pumpjack tile.machine_purex.name=PUREX +tile.machine_purex.desc=Reprocessing machine for many nuclear fuels.$Most recipes require kerosene and nitric acid. tile.machine_pyrooven.name=Pyrolysis Oven tile.machine_radar.name=Radar tile.machine_radar_large.name=Large Radar From 30a20e34e0d5d8375b3cf8a86a5e2223b862dbc4 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Mon, 4 Aug 2025 20:11:12 -0600 Subject: [PATCH 154/323] Update ru_RU.lang --- src/main/resources/assets/hbm/lang/ru_RU.lang | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 1fbcb897b..b670d6a98 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -184,6 +184,14 @@ armorMod.type.leggings=Поножи armorMod.type.servo=Сервоприводы armorMod.type.special=Особое +autoswitch=Часть группы автоматического переключения "%s"$Рецепта изменяется в зависимости от первого ингредиента +autoswitch.plate=Переработка топливных пластин +autoswitch.plates=Металические пластины +autoswitch.pwr=Переработка стержней ВВЭР +autoswitch.schrab=Экстракция Шрабидия +autoswitch.watz=Переработка Ватцз-пеллет +autoswitch.zirnox=Переработка стержней Цирнокс + battery.mode.buffer=Буферный режим battery.mode.input=Зарядка battery.mode.off=Отключено @@ -794,6 +802,7 @@ container.machineITER=Термоядерный реактор container.machineLargeTurbine=Промышленная паровая турбина container.machineLiquefactor=Разжижитель container.machineMixer=Промышленный смеситель +container.machinePUREX=PUREX container.machineOreSlopper=П.Б.Р. container.machinePyroOven=Пиролизная печь container.machineRefinery=Нефтеперерабатывающий завод @@ -3070,6 +3079,7 @@ item.gun_amat_penance.name="Покаяние" item.gun_amat_subtlety.name="Тонкость" item.gun_ar15.name="Джош" item.gun_autoshotgun.name=Автоматический дробовик +item.gun_autoshotgun_heretic.name=Еретик item.gun_autoshotgun_sexy.name=Секси item.gun_autoshotgun_shredder.name=Шреддер item.gun_avenger.name=CZ57 “Авенджер” @@ -5037,6 +5047,9 @@ potion.hbm_stability=Стабильность potion.hbm_taint=Порча potion.hbm_telekinesis=! ! ! +purex.recycle=Переработка %s +purex.schrab=Извлечение шрабидия из %s + radar.clearMap=Очистить карту radar.detectMissiles=Обнаружение ракет radar.detectPlayers=Обнаружение игроков @@ -5864,6 +5877,8 @@ tile.machine_powerrtg.name=ПТ-изотопная ячейка tile.machine_press.name=Пресс tile.machine_puf6_tank.name=Бочка гексафторида плутония tile.machine_pumpjack.name=Станок-качалка +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Машина для переработки многих видов ядерного топлива.$Для большинства рецептов требуются керосин и азотная кислота. tile.machine_pyrooven.name=Пиролизная печь tile.machine_radar.name=Радар tile.machine_radar_large.name=Большой радар From 852e89b21d073dce06d2b323f88b6991f6b4defc Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:30:32 -0600 Subject: [PATCH 155/323] typo fix --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index b670d6a98..6072fa3d9 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6388,7 +6388,7 @@ tile.wood_barrier.name=Деревянный барьер tile.wood_structure.ceiling.name=Деревянный настил tile.wood_structure.roof.name=Деревянное перекрытие tile.wood_structure.scaffold.name=Деревянные подмостки -tile.yellow_barrel.name=Радиоктивная бочка +tile.yellow_barrel.name=Радиоактивная бочка tile.zirnox_destroyed.name=Разрушенный Цирнокс tile.large_vehicle_door.name=Дверь для крупногабаритных автомобилей From 96f02c6a1645ba0e7b0b7ec4ea66746370a5d765 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Tue, 5 Aug 2025 14:40:46 -0500 Subject: [PATCH 156/323] add yellow waste barrel and vitrified waste barrel recipes to assembly machine. --- .../recipes/AssemblyMachineRecipes.java | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index b3014e716..73890a546 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -42,7 +42,7 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; public class AssemblyMachineRecipes extends GenericRecipes { - + public static final AssemblyMachineRecipes INSTANCE = new AssemblyMachineRecipes(); @Override public int inputItemLimit() { return 12; } @@ -55,7 +55,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public void registerDefaults() { - + // plates and ingots String autoPlate = "autoswitch.plates"; this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); @@ -84,7 +84,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(EUPH.ingot(), 4), new OreDictStack(AT.dust(), 3), new OreDictStack(BI.dust(), 1), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.ingot_osmiridium))); this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); - + // expensive parts this.register(new GenericRecipe("ass.exsteelplating").setup(200, 400).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING.ordinal())) .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(TI.plate(), 4), new OreDictStack(STEEL.bolt(), 16))); @@ -106,7 +106,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ZR.plateWelded(), 1)) .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL_COLD, 4_000)) .outputFluids(new FluidStack(Fluids.PERFLUOROMETHYL, 4_000))); - + // cloth this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) .inputItems(new OreDictStack(PB.dust(), 4), new ComparableStack(Items.string, 8))); @@ -147,7 +147,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(CU.dust(), 1))); this.register(new GenericRecipe("ass.partplut").setup(40, 100).outputItems(new ItemStack(ModItems.part_plutonium, 8)) .inputItems(new OreDictStack(PU.dust(), 1))); - + // bunker blocks this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); @@ -158,6 +158,12 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + // blocks + this.register(new GenericRecipe("ass.yellowbarrel").setup(400, 400).outputItems(new ItemStack(ModBlocks.yellow_barrel, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 1), new OreDictStack(PB.plate(), 2), new ComparableStack(ModItems.nuclear_waste, 10))); + this.register(new GenericRecipe("ass.vitrifiedbarrel").setup(400, 400).outputItems(new ItemStack(ModBlocks.vitrified_barrel, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 1), new OreDictStack(PB.plate(), 2), new ComparableStack(ModItems.nuclear_waste_vitrified, 10))); + // nuclear door mod this.register(new GenericRecipe("ass.vaultdoor").setup(600, 100).outputItems(new ItemStack(ModBlocks.vault_door, 1)) .inputItems(new OreDictStack(STEEL.ingot(), 32), new OreDictStack(DURA.ingot(), 32), new OreDictStack(PB.plateCast(), 8), new OreDictStack(ANY_RUBBER.ingot(), 12), new OreDictStack(DURA.bolt(), 32), new ComparableStack(ModItems.motor, 3))); @@ -187,7 +193,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); this.register(new GenericRecipe("ass.silohatchlarge").setup(300, 100).outputItems(new ItemStack(ModBlocks.silo_hatch_large, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8))); - + // decoration this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) .inputItems(new ComparableStack(ModItems.cap_nuka, 64), new ComparableStack(ModItems.cap_nuka, 64))); @@ -205,7 +211,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); */ - + // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)) @@ -335,7 +341,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); - + // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4)) @@ -374,7 +380,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 5), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 16))); - + // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); @@ -409,7 +415,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.ingot_u238m2), new ComparableStack(ModItems.ingot_cft, 64), new ComparableStack(ModItems.ingot_cft, 64))); - + // fluid tanks this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4)) @@ -450,7 +456,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); - + // reactors this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)) @@ -467,7 +473,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.rbmkautoloader").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_autoloader, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(PB.plateCast(), 4), new OreDictStack(B.ingot(), 4), new ComparableStack(ModItems.motor, 3)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 3))); - + // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) @@ -489,7 +495,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 64))); this.register(new GenericRecipe("ass.blanketchlorophyte").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_chlorophyte, 1)) .inputItems(new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48))); - + // watz this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4)) @@ -500,7 +506,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2)) .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_RESISTANTALLOY.plateWelded()))); - + // ICF this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16)) @@ -537,7 +543,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItemsEx(new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.COMPUTER))); this.register(new GenericRecipe("ass.icfpress").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_icf_press, 1)) .inputItems(new OreDictStack(GOLD.plateCast(), 8), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); - + // upgrades this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); @@ -549,19 +555,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); */ - + // rancid shit mob spawners this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); this.register(new GenericRecipe("ass.ballsotron").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_worm, 1)) .inputItems(new OreDictStack(TI.plateWelded(), 32), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.motor, 64), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(U238.block(), 10), new ComparableStack(ModItems.mech_key, 1))); - + // weapon parts this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) .inputItems(new OreDictStack(PB.nugget(), 6))); - + // bombs this.register(new GenericRecipe("ass.minenaval").setup(300, 100).outputItems(new ItemStack(ModBlocks.mine_naval, 1)) .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 24))); @@ -598,7 +604,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) .inputItems()); */ - + // bomb parts this.register(new GenericRecipe("ass.explosivelenses1").setup(400, 100).outputItems(new ItemStack(ModItems.early_explosive_lenses, 1)) .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(GOLD.wireFine(), 16), new ComparableStack(ModBlocks.det_cord, 8), new OreDictStack(CU.plate(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 20), new OreDictStack(ANY_PLASTIC.ingot(), 4))); @@ -641,7 +647,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1))); this.register(new GenericRecipe("ass.soliniumcharge").setup(300, 100).outputItems(new ItemStack(ModItems.solinium_propellant, 1)) .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4))); - + // grenades this.register(new GenericRecipe("ass.incgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_fire, 1)) .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2))); @@ -672,7 +678,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); */ - + // turrets this.register(new GenericRecipe("ass.turretchekhov").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_chekhov, 1)) .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); @@ -755,7 +761,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(ANY_CONCRETE.any(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModBlocks.steel_scaffold, 24), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED))); this.register(new GenericRecipe("ass.launchpadsilo").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_CONCRETE.any(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED))); - + // custom missile thrusters this.register(new GenericRecipe("ass.mpt10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_kerosene, 1)) .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.pipe(), 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4))); @@ -795,7 +801,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); this.register(new GenericRecipe("ass.mpt20solidmultier").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid_multier, 1)) .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); - + // custom missile fuselages this.register(new GenericRecipe("ass.mpf10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_kerosene, 1)) .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(AL.plate(), 12), new OreDictStack(STEEL.plate(), 3))); @@ -825,7 +831,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(AL.plate(), 48), new OreDictStack(STEEL.plate(), 16))); this.register(new GenericRecipe("ass.mpf1520solid").setup(400, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_20_solid, 1)) .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(TI.plate(), 48), new OreDictStack(STEEL.plate(), 16))); - + // custom missile warheads this.register(new GenericRecipe("ass.mpw10he").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_he, 1)) .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); @@ -851,12 +857,12 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new ComparableStack(ModItems.ball_tatb, 32), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED))); this.register(new GenericRecipe("ass.mpw15bf").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_balefire, 1)) .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 16), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER))); - + /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) .inputItems()); */ - + // weapons this.register(new GenericRecipe("ass.schrabhammer").setup(6_000, 100).outputItems(new ItemStack(ModItems.schrabidium_hammer, 1)) .inputItems( @@ -872,7 +878,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.fragment_meteorite, 64), new ComparableStack(ModItems.fragment_meteorite, 64), new ComparableStack(ModItems.fragment_meteorite, 64))); - + // ammo this.register(new GenericRecipe("ass.50bmgsm").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM.ordinal())) .inputItems(new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 6), new OreDictStack(STAR.ingot(), 3)) @@ -889,11 +895,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.shellmustard").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 11)) .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) .inputFluids(new FluidStack(Fluids.MUSTARDGAS, 4_000))); - + // tools this.register(new GenericRecipe("ass.multitool").setup(100, 100).outputItems(new ItemStack(ModItems.multitool_hit, 1)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.plate(), 4), new OreDictStack(GOLD.wireFine(), 12), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); - + // space this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) .inputItems(new OreDictStack(TI.shell(), 32), @@ -1006,11 +1012,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.unpackage" + type.getUnlocalizedName()).setup(40, 100).setIcon(ItemFluidIcon.make(type, 32_000)).outputItems(new ItemStack(ModItems.fluid_pack_empty)) .inputItems(new ComparableStack(ModItems.fluid_pack_full, 1, type.getID())).outputFluids(new FluidStack(type, 32_000))); } - + if(GeneralConfig.enableMekanismChanges && Loader.isModLoaded("Mekanism")) { Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); if(mb != null) { - + this.register(new GenericRecipe("ass.digimemer").setup(1_200, 100).outputItems(new ItemStack(mb, 1, 4)) .inputItems(new OreDictStack(BIGMT.plateCast(), 16), new OreDictStack(CU.plateWelded(), 12), @@ -1021,12 +1027,12 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.motor_bismuth, 3))); } } - + } - + public static HashMap getRecipes() { HashMap recipes = new HashMap(); - + for(GenericRecipe recipe : INSTANCE.recipeOrderedList) { List input = new ArrayList(); if(recipe.inputItem != null) for(AStack stack : recipe.inputItem) input.add(stack); @@ -1036,7 +1042,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { if(recipe.outputFluid != null) for(FluidStack stack : recipe.outputFluid) output.add(ItemFluidIcon.make(stack)); recipes.put(input.toArray(), output.toArray()); } - + return recipes; } } From 7bfb6ac7c6c24fcc2524b7f5e68dbaca89476219 Mon Sep 17 00:00:00 2001 From: LegendaryDoge30 Date: Wed, 6 Aug 2025 02:13:36 +0200 Subject: [PATCH 157/323] open computer open computers capacitor --- .../hbm/blocks/machine/MachineCapacitor.java | 78 ++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index 22a60d7b1..5bb2c3933 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -3,6 +3,12 @@ package com.hbm.blocks.machine; import java.util.ArrayList; import java.util.List; +import com.hbm.handler.CompatHandler; +import cpw.mods.fml.common.Optional; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; import org.lwjgl.input.Keyboard; import com.hbm.blocks.ILookOverlay; @@ -149,13 +155,15 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } - - public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider { + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) + public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider, SimpleComponent, CompatHandler.OCComponent { public long power; protected long maxPower; public long powerReceived; public long powerSent; + public long lastPowerReceived; + public long lastPowerSent; public TileEntityCapacitor() { } @@ -198,6 +206,8 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP networkPackNT(15); + this.lastPowerSent = powerSent; + this.lastPowerReceived = powerReceived; this.powerSent = 0; this.powerReceived = 0; } @@ -315,5 +325,69 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP if((PREFIX_VALUE + "fillpercent").equals(name)) return "" + this.power * 100 / this.maxPower; return null; } + + // opencomputer + @Override + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "capacitor"; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergy(Context context, Arguments args) { + return new Object[] {power}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getMaxEnergy(Context context, Arguments args) { + return new Object[] {maxPower}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergySent(Context context, Arguments args) { + return new Object[] {lastPowerReceived}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergyReceived(Context context, Arguments args) { return new Object[] {lastPowerSent}; } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getInfo(Context context, Arguments args) { + return new Object[] {power, maxPower, lastPowerReceived, lastPowerSent}; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public String[] methods() { + return new String[] { + "getEnergy", + "getMaxEnergy", + "getEnergySent", + "getEnergyReceived", + "getInfo" + }; + } + @Override + @Optional.Method(modid = "OpenComputers") + public Object[] invoke(String method, Context context, Arguments args) throws Exception { + switch(method) { + case ("getEnergy"): + return getEnergy(context, args); + case ("getMaxEnergy"): + return getMaxEnergy(context, args); + case ("getEnergySent"): + return getEnergySent(context, args); + case ("getEnergyReceived"): + return getEnergyReceived(context, args); + case ("getInfo"): + return getEnergyReceived(context, args); + } + throw new NoSuchMethodException(); + } } } From d70464b3d12457f35120c998cf3b9f188580853b Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 6 Aug 2025 20:13:44 +0200 Subject: [PATCH 158/323] QMAW the second (third?) --- changelog | 16 +--- .../inventory/recipes/ArcFurnaceRecipes.java | 4 + .../hbm/inventory/recipes/PUREXRecipes.java | 4 +- src/main/java/com/hbm/items/ModItems.java | 14 ---- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 5 ++ .../java/com/hbm/main/ModEventHandler.java | 5 +- .../com/hbm/main/ModEventHandlerClient.java | 26 ++++++ .../java/com/hbm/main/ResourceManager.java | 4 - src/main/java/com/hbm/qmaw/GuiQMAW.java | 60 +++++++++++++- src/main/java/com/hbm/qmaw/QMAWLoader.java | 54 ++++++++++++- .../java/com/hbm/qmaw/QuickManualAndWiki.java | 28 +++++++ .../hbm/qmaw/components/QComponentLink.java | 81 +++++++++++++++++++ .../java/com/hbm/render/util/MissilePart.java | 8 -- .../resources/assets/hbm/manual/demo.json | 4 + 15 files changed, 268 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/hbm/qmaw/components/QComponentLink.java diff --git a/changelog b/changelog index bc517c4ea..fa5fe2270 100644 --- a/changelog +++ b/changelog @@ -1,15 +1,7 @@ -## Added (last time, i forgor) -* RBMK autoloader - * Can be placed on top of RBMK fuel rods - * Can be configured to switch fuel rods in 5% depletion increments - * Usable with all forms of item transport like conveyors and pneumatic tubes - ## Changed -* Replaced "re-enrichment" in the PUREX recipes with "reprocessing" +* All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed +* The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too ## Fixed -* Fixed many of the PUREX' recipe categories simply not processing - * It worked last time I swear -* Fixed life-ending issue where the assembler achievement's icon was incorrect -* Fixed RBMK autoloader not having a recipe - * Ow \ No newline at end of file +* Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes +* Removed failed attempt at fixing the gun desync dupe which made things worse \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java index 35b202158..fae8f617f 100644 --- a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java @@ -111,6 +111,10 @@ public class ArcFurnaceRecipes extends SerializableRecipe { } // Autogen for furnace recipes + registerFurnaceSmeltables(); + } + + public static void registerFurnaceSmeltables() { for(Object o : FurnaceRecipes.smelting().getSmeltingList().entrySet()) { Entry entry = (Entry) o; ItemStack input = (ItemStack) entry.getKey(); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 3849b1759..76cdc088c 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -431,7 +431,7 @@ public class PUREXRecipes extends GenericRecipes { ItemStack copy = nuggetNQR.copy(); copy.stackSize = 12; - this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + this.register(new GenericRecipe("purex.watznaqadah").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQD)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(copy, @@ -440,7 +440,7 @@ public class PUREXRecipes extends GenericRecipes { .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) .setIconToFirstIngredient()); - this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + this.register(new GenericRecipe("purex.watznaqadria").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQR)) .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) .outputItems(new ItemStack(ModItems.nugget_co60, 12), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 24af636e0..f04a7218f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1236,11 +1236,9 @@ public class ModItems { public static Item missile_test; public static Item mp_thruster_10_kerosene; - public static Item mp_thruster_10_kerosene_tec; public static Item mp_thruster_10_solid; public static Item mp_thruster_10_xenon; public static Item mp_thruster_15_kerosene; - public static Item mp_thruster_15_kerosene_tec; public static Item mp_thruster_15_kerosene_dual; public static Item mp_thruster_15_kerosene_triple; public static Item mp_thruster_15_solid; @@ -1351,8 +1349,6 @@ public class ModItems { public static Item mp_fuselage_15_20_kerosene_magnusson; public static Item mp_fuselage_15_20_solid; - public static Item mp_fuselage_20_kerosene; - public static Item mp_warhead_10_he; public static Item mp_warhead_10_incendiary; public static Item mp_warhead_10_buster; @@ -1369,7 +1365,6 @@ public class ModItems { public static Item mp_warhead_15_n2; public static Item mp_warhead_15_balefire; public static Item mp_warhead_15_turbine; - public static Item mp_warhead_20_he; public static Item mp_chip_1; public static Item mp_chip_2; @@ -3592,11 +3587,9 @@ public class ModItems { sat_relay = new ItemSatChip().setUnlocalizedName("sat_relay").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_relay"); mp_thruster_10_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(10F) .setUnlocalizedName("mp_thruster_10_kerosene"); - mp_thruster_10_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_10_kerosene_tec"); mp_thruster_10_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F) .setUnlocalizedName("mp_thruster_10_solid"); mp_thruster_10_xenon = new ItemCustomMissilePart().makeThruster(FuelType.XENON, 1F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_thruster_10_xenon"); mp_thruster_15_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene"); - mp_thruster_15_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(20F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_15_kerosene_tec"); mp_thruster_15_kerosene_dual = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 2.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_dual"); mp_thruster_15_kerosene_triple = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_triple"); mp_thruster_15_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 5F, PartSize.SIZE_15).setHealth(20F) .setUnlocalizedName("mp_thruster_15_solid"); @@ -3707,8 +3700,6 @@ public class ModItems { mp_fuselage_15_20_kerosene_magnusson = ((ItemCustomMissilePart)mp_fuselage_15_20_kerosene).copy().setRarity(Rarity.RARE).setAuthor("VT-6/24").setTitle("White Forest Rocket").setWittyText("And get your cranio-conjugal parasite away from my nose cone!").setUnlocalizedName("mp_fuselage_15_20_kerosene_magnusson"); mp_fuselage_15_20_solid = new ItemCustomMissilePart().makeFuselage(FuelType.SOLID, 20000, PartSize.SIZE_15, PartSize.SIZE_20).setHealth(70F).setUnlocalizedName("mp_fuselage_15_20_solid").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage"); - mp_fuselage_20_kerosene = new ItemCustomMissilePart().makeFuselage(FuelType.KEROSENE, 1000F, PartSize.SIZE_20, PartSize.SIZE_20) .setUnlocalizedName("mp_f_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage"); - mp_warhead_10_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_he").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_10_incendiary = new ItemCustomMissilePart().makeWarhead(WarheadType.INC, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_incendiary").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_10_buster = new ItemCustomMissilePart().makeWarhead(WarheadType.BUSTER, 5F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_buster").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); @@ -3725,7 +3716,6 @@ public class ModItems { mp_warhead_15_n2 = new ItemCustomMissilePart().makeWarhead(WarheadType.N2, 100F, 5F, PartSize.SIZE_15).setWittyText("[screams geometrically]").setHealth(20F).setRarity(Rarity.RARE).setUnlocalizedName("mp_warhead_15_n2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_15_balefire = new ItemCustomMissilePart().makeWarhead(WarheadType.BALEFIRE, 100F, 7.5F, PartSize.SIZE_15).setRarity(Rarity.LEGENDARY).setAuthor("VT-6/24").setHealth(15F).setWittyText("Hightower, never forgetti.").setUnlocalizedName("mp_warhead_15_balefire").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_15_turbine = new ItemCustomMissilePart().makeWarhead(WarheadType.TURBINE, 200F, 5F, PartSize.SIZE_15).setRarity(Rarity.SEWS_CLOTHES_AND_SUCKS_HORSE_COCK).setHealth(250F).setUnlocalizedName("mp_warhead_15_turbine").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); - mp_warhead_20_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1F, PartSize.SIZE_20) .setUnlocalizedName("mp_w_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_chip_1 = new ItemCustomMissilePart().makeChip(0.1F) .setUnlocalizedName("mp_c_1").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_1"); mp_chip_2 = new ItemCustomMissilePart().makeChip(0.05F) .setUnlocalizedName("mp_c_2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_2"); @@ -6204,11 +6194,9 @@ public class ModItems { //Missile Parts GameRegistry.registerItem(mp_thruster_10_kerosene, mp_thruster_10_kerosene.getUnlocalizedName()); - GameRegistry.registerItem(mp_thruster_10_kerosene_tec, mp_thruster_10_kerosene_tec.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_10_solid, mp_thruster_10_solid.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_10_xenon, mp_thruster_10_xenon.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene, mp_thruster_15_kerosene.getUnlocalizedName()); - GameRegistry.registerItem(mp_thruster_15_kerosene_tec, mp_thruster_15_kerosene_tec.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene_dual, mp_thruster_15_kerosene_dual.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene_triple, mp_thruster_15_kerosene_triple.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_solid, mp_thruster_15_solid.getUnlocalizedName()); @@ -6306,7 +6294,6 @@ public class ModItems { GameRegistry.registerItem(mp_fuselage_15_20_kerosene, mp_fuselage_15_20_kerosene.getUnlocalizedName()); GameRegistry.registerItem(mp_fuselage_15_20_kerosene_magnusson, mp_fuselage_15_20_kerosene_magnusson.getUnlocalizedName()); GameRegistry.registerItem(mp_fuselage_15_20_solid, mp_fuselage_15_20_solid.getUnlocalizedName()); - GameRegistry.registerItem(mp_fuselage_20_kerosene, mp_fuselage_20_kerosene.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_he, mp_warhead_10_he.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_incendiary, mp_warhead_10_incendiary.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_buster, mp_warhead_10_buster.getUnlocalizedName()); @@ -6323,7 +6310,6 @@ public class ModItems { GameRegistry.registerItem(mp_warhead_15_n2, mp_warhead_15_n2.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_15_balefire, mp_warhead_15_balefire.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_15_turbine, mp_warhead_15_turbine.getUnlocalizedName()); - GameRegistry.registerItem(mp_warhead_20_he, mp_warhead_20_he.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_1, mp_chip_1.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_2, mp_chip_2.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_3, mp_chip_3.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index f77640e05..704eb09a6 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -450,8 +450,8 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - @Override - public boolean getShareTag() { return false; } + /*@Override + public boolean getShareTag() { return false; }*/ // nbt sync dupe fix, didn't work public static class SmokeNode { diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index f797b0de3..d6cd9eea2 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -967,6 +967,7 @@ public class MainRegistry { event.registerServerCommand(new CommandRadiation()); event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); + ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes } @EventHandler @@ -1724,6 +1725,10 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.machine_arc_furnace_off"); ignoreMappings.add("hbm:tile.machine_arc_furnace_on"); ignoreMappings.add("hbm:item.heavy_component"); + ignoreMappings.add("hbm:item.mp_w_20"); + ignoreMappings.add("hbm:item.mp_f_20"); + ignoreMappings.add("hbm:item.mp_thruster_10_kerosene_tec"); + ignoreMappings.add("hbm:item.mp_thruster_15_kerosene_tec"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 4a3ded4e7..7632100df 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -40,7 +40,6 @@ import com.hbm.items.weapon.sedna.factory.XFactory12ga; import com.hbm.lib.ModDamageSource; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.HeldItemNBTPacket; import com.hbm.packet.toclient.PermaSyncPacket; import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.packet.toclient.SerializableRecipePacket; @@ -990,10 +989,10 @@ public class ModEventHandler { } } - if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) { + /*if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) { HeldItemNBTPacket packet = new HeldItemNBTPacket(player.getHeldItem()); PacketDispatcher.wrapper.sendTo(packet, (EntityPlayerMP) player); - } + }*/ } @SubscribeEvent diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ed62ac103..823e38433 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -36,6 +36,9 @@ import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.AuxButtonPacket; +import com.hbm.qmaw.GuiQMAW; +import com.hbm.qmaw.QMAWLoader; +import com.hbm.qmaw.QuickManualAndWiki; import com.hbm.render.anim.HbmAnimations; import com.hbm.render.anim.HbmAnimations.Animation; import com.hbm.render.block.ct.CTStitchReceiver; @@ -747,6 +750,17 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); } + try { + QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp); + if(qmaw != null) { + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("qmaw.tab")); + lastQMAW = qmaw; + qmawTimestamp = Clock.get_ms(); + } + } catch(Exception ex) { + list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); + } + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); @@ -759,6 +773,8 @@ public class ModEventHandlerClient { private static long canneryTimestamp; private static ComparableStack lastCannery = null; + private static long qmawTimestamp; + private static QuickManualAndWiki lastQMAW = null; private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); @@ -891,6 +907,16 @@ public class ModEventHandlerClient { } } + if(Keyboard.isKeyDown(Keyboard.KEY_TAB) && Minecraft.getMinecraft().currentScreen != null) { + + QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null; + + if(qmaw != null) { + Minecraft.getMinecraft().thePlayer.closeScreen(); + FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + } + } + if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { ItemStack stack = getMouseOverStack(); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index a3651233d..bc109ad26 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1193,11 +1193,9 @@ public class ResourceManager { public static final IModelCustom launch_table_small_scaffold_empty = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/launch_table/launch_table_small_scaffold_empty.obj")); public static final IModelCustom mp_t_10_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene.obj")); - public static final IModelCustom mp_t_10_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene_tec.obj")); public static final IModelCustom mp_t_10_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_solid.obj")); public static final IModelCustom mp_t_10_xenon = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_xenon.obj")); public static final IModelCustom mp_t_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene.obj")); - public static final IModelCustom mp_t_15_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_tec.obj")); public static final IModelCustom mp_t_15_kerosene_dual = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_dual.obj")); public static final IModelCustom mp_t_15_kerosene_triple = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_triple.obj")); public static final IModelCustom mp_t_15_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_solid.obj")); @@ -1225,7 +1223,6 @@ public class ResourceManager { public static final IModelCustom mp_f_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_kerosene.obj")); public static final IModelCustom mp_f_15_hydrogen = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_hydrogen.obj")); public static final IModelCustom mp_f_15_20_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_20_kerosene.obj")); - public static final IModelCustom mp_f_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_20.obj")); public static final IModelCustom mp_w_10_he = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_he.obj")); public static final IModelCustom mp_w_10_incendiary = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_incendiary.obj")); @@ -1240,7 +1237,6 @@ public class ResourceManager { public static final IModelCustom mp_w_15_n2 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_n2.obj")); public static final IModelCustom mp_w_15_balefire = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_balefire.obj")); public static final IModelCustom mp_w_15_turbine = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_turbine.obj")); - public static final IModelCustom mp_w_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_20.obj")); //Carts public static final IModelCustom cart = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart.obj")); diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index b579a846e..9e3b37595 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -1,5 +1,63 @@ package com.hbm.qmaw; -public class GuiQMAW { +import java.util.ArrayList; +import java.util.List; +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.ResourceLocation; + +public class GuiQMAW extends GuiScreen { + + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png"); + + public String title; + public List lines = new ArrayList(); + + protected int xSize = 192; + protected int ySize = 256; + protected int guiLeft; + protected int guiTop; + + public GuiQMAW(QuickManualAndWiki qmaw) { + parseQMAW(qmaw); + } + + protected void parseQMAW(QuickManualAndWiki qmaw) { + + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + int x = 0; + int y = 0; + + this.fontRendererObj.drawString(title, guiLeft + x, guiTop + y, 0xFFFFFF); + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 710511a4b..c5bdf391e 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -7,13 +7,19 @@ import java.io.InputStreamReader; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; +import java.util.Map.Entry; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.hbm.interfaces.NotableComments; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import net.minecraft.client.Minecraft; @@ -23,6 +29,7 @@ import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.ResourcePackRepository; +import net.minecraft.item.ItemStack; @NotableComments public class QMAWLoader implements IResourceManagerReloadListener { @@ -31,6 +38,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { public static final Gson gson = new Gson(); public static final JsonParser parser = new JsonParser(); public static HashMap qmaw = new HashMap(); + public static HashMap triggers = new HashMap(); @Override public void onResourceManagerReload(IResourceManager resMan) { @@ -50,13 +58,22 @@ public class QMAWLoader implements IResourceManagerReloadListener { //the mod's file, assuming the mod is a file (not the case in a dev env, fuck!) //no fucking null check, if this fails then the entire game will sink along with the ship - registerModFileURL(new File(QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath())); // i am going to shit myself + String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + // exclude .class in the case of a dev env + if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself qmaw.clear(); + triggers.clear(); agonyEngine(); } - /** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it */ + /** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it

+ * This affront to god can load QMAW definition files from four different sources:
+ * * Any mod's jar that has registered itself to include QMAW files
+ * * The dev environment, because "the mod file" would in this case be this very class file, and that's incorrect
+ * * ZIP-based resource packs
+ * * Folder-based resource packs + * */ public static void agonyEngine() { for(File modFile : registeredModFiles) dissectZip(modFile); @@ -154,7 +171,38 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } + /** Extracts all the info from a json file's main object to add a QMAW to the system. Very barebones, only handles name, icon and the localized text. */ public static void registerJson(String name, JsonObject json) { - //TBI + QuickManualAndWiki qmaw = new QuickManualAndWiki(name); + + if(json.has("icon")) { + qmaw.setIcon(SerializableRecipe.readItemStack(json.get("icon").getAsJsonArray())); + } + + JsonObject title = json.get("title").getAsJsonObject(); + for(Entry part : title.entrySet()) { + qmaw.addTitle(part.getKey(), part.getValue().getAsString()); + } + + JsonObject content = json.get("content").getAsJsonObject(); + for(Entry part : content.entrySet()) { + qmaw.addLang(part.getKey(), part.getValue().getAsString()); + } + + JsonArray triggers = json.get("trigger").getAsJsonArray(); + + for(JsonElement element : triggers) { + ItemStack trigger = SerializableRecipe.readItemStack(element.getAsJsonArray()); + // items get renamed and removed all the time, so we add some more debug goodness for those cases + if(trigger == null || trigger.getItem() == ModItems.nothing) { + MainRegistry.logger.info("[QMAW] Manual " + name + " references nonexistant trigger " + element.toString()); + } else { + QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); + } + } + + if(!qmaw.contents.isEmpty()) { + QMAWLoader.qmaw.put(name, qmaw); + } } } diff --git a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java index 7f206bad6..f961cd2fe 100644 --- a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java +++ b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java @@ -1,5 +1,33 @@ package com.hbm.qmaw; +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + public class QuickManualAndWiki { + public String name; + public ItemStack icon; + + public HashMap title = new HashMap(); + public HashMap contents = new HashMap(); + + public QuickManualAndWiki(String name) { + this.name = name; + } + + public QuickManualAndWiki setIcon(ItemStack stack) { + this.icon = stack; + return this; + } + + public QuickManualAndWiki addTitle(String lang, String title) { + this.title.put(lang, title); + return this; + } + + public QuickManualAndWiki addLang(String lang, String contents) { + this.contents.put(lang, contents); + return this; + } } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java new file mode 100644 index 000000000..6024deb6f --- /dev/null +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -0,0 +1,81 @@ +package com.hbm.qmaw.components; + +import org.lwjgl.opengl.GL11; + +import com.hbm.qmaw.GuiQMAW; +import com.hbm.qmaw.ManualElement; +import com.hbm.qmaw.QMAWLoader; +import com.hbm.qmaw.QuickManualAndWiki; + +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; + +public class QComponentLink extends ManualElement { + + protected String link; + protected ItemStack icon; + protected String text; + protected FontRenderer font; + protected int color = 0x0094FF; + protected int hoverColor = 0xFFD800; + + protected static RenderItem itemRender = new RenderItem(); + + public QComponentLink(String link, String text) { + this.text = text; + this.link = link; + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); + if(qmaw == null) { + this.color = this.hoverColor = 0xFF7F7F; + } else { + this.icon = qmaw.icon; + } + } + + public QComponentLink setColor(int color, int hoverColor) { + this.color = color; + this.hoverColor = hoverColor; + return this; + } + + @Override + public int getWidth() { + return font.getStringWidth(text) + (icon != null ? 20 : 0); + } + + @Override + public int getHeight() { + return Math.max(font.FONT_HEIGHT, icon != null ? 18 : 0); + } + + @Override + public void render(boolean isMouseOver, int mouseX, int mouseY) { + int x = this.x; + int y = this.y; + + if(this.icon != null) { + + GL11.glEnable(GL11.GL_DEPTH_TEST); + Minecraft mc = Minecraft.getMinecraft(); + itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y); + itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + x += 20; + y += (18 - font.FONT_HEIGHT) / 2; + } + + font.drawString(text, x, y, isMouseOver ? hoverColor : color); + } + + @Override public void onClick() { + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); + if(qmaw != null) FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + } +} diff --git a/src/main/java/com/hbm/render/util/MissilePart.java b/src/main/java/com/hbm/render/util/MissilePart.java index dbec574c4..1f33a4b6a 100644 --- a/src/main/java/com/hbm/render/util/MissilePart.java +++ b/src/main/java/com/hbm/render/util/MissilePart.java @@ -34,13 +34,10 @@ public class MissilePart { parts.clear(); MissilePart.registerPart(ModItems.mp_thruster_10_kerosene, PartType.THRUSTER, 1, 1, ResourceManager.mp_t_10_kerosene, ResourceManager.mp_t_10_kerosene_tex); - MissilePart.registerPart(ModItems.mp_thruster_10_kerosene_tec, PartType.THRUSTER, 1.25, 1.25, ResourceManager.mp_t_10_kerosene_tec, ResourceManager.universal); MissilePart.registerPart(ModItems.mp_thruster_10_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_solid, ResourceManager.mp_t_10_solid_tex); MissilePart.registerPart(ModItems.mp_thruster_10_xenon, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_xenon, ResourceManager.mp_t_10_xenon_tex); // MissilePart.registerPart(ModItems.mp_thruster_15_kerosene, PartType.THRUSTER, 1.5, 1.5, ResourceManager.mp_t_15_kerosene, ResourceManager.mp_t_15_kerosene_tex); - MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_tec, PartType.THRUSTER, 1.5, 3.25, ResourceManager.mp_t_15_kerosene_tec, ResourceManager.universal); - MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_dual, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_dual, ResourceManager.mp_t_15_kerosene_dual_tex); MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_triple, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_triple, ResourceManager.mp_t_15_kerosene_dual_tex); MissilePart.registerPart(ModItems.mp_thruster_15_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid, ResourceManager.mp_t_15_solid_tex); MissilePart.registerPart(ModItems.mp_thruster_15_solid_hexdecuple, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid_hexdecuple, ResourceManager.mp_t_15_solid_hexdecuple_tex); @@ -149,8 +146,6 @@ public class MissilePart { MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_tex); MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene_magnusson, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_magnusson_tex); MissilePart.registerPart(ModItems.mp_fuselage_15_20_solid, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_solid_tex); - // - MissilePart.registerPart(ModItems.mp_fuselage_20_kerosene, PartType.FUSELAGE, 10, 8, ResourceManager.mp_f_20, ResourceManager.universal); ////// @@ -171,9 +166,6 @@ public class MissilePart { MissilePart.registerPart(ModItems.mp_warhead_15_n2, PartType.WARHEAD, 3, 2, ResourceManager.mp_w_15_n2, ResourceManager.mp_w_15_n2_tex); MissilePart.registerPart(ModItems.mp_warhead_15_balefire, PartType.WARHEAD, 2.75, 2, ResourceManager.mp_w_15_balefire, ResourceManager.mp_w_15_balefire_tex); MissilePart.registerPart(ModItems.mp_warhead_15_turbine, PartType.WARHEAD, 2.25, 2, ResourceManager.mp_w_15_turbine, ResourceManager.mp_w_15_turbine_tex); - // - MissilePart.registerPart(ModItems.mp_warhead_20_he, PartType.WARHEAD, 3, 2.25, ResourceManager.mp_w_20, ResourceManager.universal); - } public static void registerPart(Item item, PartType type, double height, double guiheight, IModelCustom model, ResourceLocation texture) { diff --git a/src/main/resources/assets/hbm/manual/demo.json b/src/main/resources/assets/hbm/manual/demo.json index f21a54d12..d64a6de99 100644 --- a/src/main/resources/assets/hbm/manual/demo.json +++ b/src/main/resources/assets/hbm/manual/demo.json @@ -1,6 +1,10 @@ { "name": "DEMO", "icon": ["hbm:item.gun_light_revolver", 1, 0], + "trigger": [["hbm:item.plate_iron"], ["hbm:item.plate_gold"], ["hbm:item.plate_sludge"]], + "title": { + "en_US": "TEST PAGE" + } "content": { "en_US": "This is a test page that links to [[Demo|DEMO]].\n\nFormat line break" } From e450bbc49d114d3dfcc3956abebb39b24c522a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=81=93=E7=A5=9E=20=E9=A6=B4=E5=AD=90?= Date: Thu, 7 Aug 2025 17:17:27 +0800 Subject: [PATCH 159/323] only thing i love --- src/main/resources/assets/hbm/lang/zh_CN.lang | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 450f29276..902096a3f 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6123,5 +6123,17 @@ item.item_expensive.ferro_plating.name=强化铀铁合金板 item.item_expensive.heavy_frame.name=重型框架 item.item_expensive.lead_plating.name=防辐射镀层 item.item_expensive.steel_plating.name=铆接固定钢板 -purex.recycle=再富集 %s +purex.recycle=再处理 %s tile.rbmk_autoloader.name=RBMK燃料自动装填机 +autoswitch=自动切换组"%s"的一部分。$配方根据第一次输入而变化。 +autoswitch.plate=板状燃料再处理 +autoswitch.plates=金属板 +autoswitch.pwr=PWR燃料再处理 +autoswitch.schrab=Sa326萃取 +autoswitch.watz=Watz燃料靶丸再处理 +autoswitch.zirnox=锆诺克斯燃料再处理 +container.machinePUREX=PUREX +item.gun_autoshotgun_heretic.name=异教徒 +purex.schrab=从 %s 中萃取Sa326 +tile.machine_purex.name=钚铀还原提取设备(PUREX) +tile.machine_purex.desc=可用于多种核燃料的再处理机器。$大多数配方需要用到硝酸和煤油。 From e8b7504fff17fbe0180311b4cc2b44058dd36aae Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 7 Aug 2025 17:45:16 +0200 Subject: [PATCH 160/323] and that's QMAW --- src/main/java/com/hbm/qmaw/GuiQMAW.java | 243 +++++++++++++++++- src/main/java/com/hbm/qmaw/ManualElement.java | 5 +- src/main/java/com/hbm/qmaw/QMAWLoader.java | 6 +- .../hbm/qmaw/components/QComponentLink.java | 28 +- .../hbm/qmaw/components/QComponentText.java | 2 +- .../resources/assets/hbm/manual/demo.json | 6 +- .../assets/hbm/textures/gui/gui_wiki.png | Bin 1081 -> 1017 bytes 7 files changed, 264 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index 9e3b37595..1cca980fb 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -3,12 +3,20 @@ package com.hbm.qmaw; import java.util.ArrayList; import java.util.List; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; +import com.hbm.qmaw.components.*; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.LanguageManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GuiQMAW extends GuiScreen { @@ -16,19 +24,128 @@ public class GuiQMAW extends GuiScreen { protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png"); public String title; - public List lines = new ArrayList(); + public ItemStack icon; + public List> lines = new ArrayList(); - protected int xSize = 192; - protected int ySize = 256; + protected int xSize = 340; + protected int ySize = 224; protected int guiLeft; protected int guiTop; + protected boolean isDragging = false; + protected int scrollProgress = 0; + protected int lastClickX = 0; + protected int lastClickY = 0; + + public static final String EN_US = "en_US"; + public GuiQMAW(QuickManualAndWiki qmaw) { parseQMAW(qmaw); } protected void parseQMAW(QuickManualAndWiki qmaw) { + LanguageManager lang = Minecraft.getMinecraft().getLanguageManager(); + this.title = qmaw.title.get(lang.getCurrentLanguage()); + if(title == null) this.title = qmaw.title.get(EN_US); + if(title == null) this.title = "Missing Localization!"; + + this.icon = qmaw.icon; + + String toParse = qmaw.contents.get(lang.getCurrentLanguage()); + if(toParse == null) toParse = qmaw.contents.get(EN_US); + if(toParse == null) toParse = "Missing Localization!"; + toParse = "" + toParse; // strings are reference types, no? + + int maxLineLength = xSize - 29; + String prevToParse = "" + toParse; + int maxIterations = 1000; + int currentLineWidth = 0; + + while(!toParse.isEmpty() && maxIterations > 0) { + if(this.lines.isEmpty()) this.lines.add(new ArrayList()); + List currentLine = this.lines.get(this.lines.size() - 1); + + toParse = toParse.trim(); + + maxIterations--; + + if(toParse.startsWith("
")) { + toParse = toParse.substring(4); + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLineWidth = 0; + continue; + } + + // handle links + if(toParse.startsWith("[[")) { + int end = toParse.indexOf("]]"); + if(end != -1) { + String link = toParse.substring(2, end); + toParse = toParse.substring(end + 2); + + int pipe = link.indexOf("|"); + QComponentLink linkComponent; + + if(pipe == -1) { + linkComponent = new QComponentLink(link, link); + } else { + linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe)); + } + + // append to current line + int width = linkComponent.getWidth(); + if(width + currentLineWidth <= maxLineLength) { + currentLine.add(linkComponent); + currentLineWidth += width; + // new line + } else { + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLine.add(linkComponent); + currentLineWidth = width; + } + + prevToParse = "" + toParse; + continue; + } + } + + // handle standard text + int delimit = toParse.length(); + + int spaceIndex = toParse.indexOf(" "); + if(spaceIndex != -1) delimit = Math.min(delimit, spaceIndex); + int linkIndex = toParse.indexOf("[["); + if(linkIndex != -1) delimit = Math.min(delimit, linkIndex); + int brIndex = toParse.indexOf("
"); + if(brIndex != -1) delimit = Math.min(delimit, brIndex); + + if(delimit > 0) { + QComponentText textComponent = new QComponentText(toParse.substring(0, delimit) + (spaceIndex == delimit ? " " : "")); + toParse = toParse.substring(delimit); + + // append to current line + int width = textComponent.getWidth(); + if(width + currentLineWidth <= maxLineLength) { + currentLine.add(textComponent); + currentLineWidth += width; + // new line + } else { + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLine.add(textComponent); + currentLineWidth = width; + } + + prevToParse = "" + toParse; + continue; + } + + if(toParse.equals(prevToParse)) break; + prevToParse = "" + toParse; + } } @Override @@ -38,19 +155,85 @@ public class GuiQMAW extends GuiScreen { this.guiTop = (this.height - this.ySize) / 2; } + @Override + protected void mouseClicked(int x, int y, int key) { + super.mouseClicked(x, y, key); + + if(key == 0) { + this.lastClickX = x; + this.lastClickY = y; + } + } + + public int getSliderPosition() { + double progress = (double) scrollProgress / (double) (lines.size() - 1); + return 25 + (int) (progress * 180); + } + @Override public void drawScreen(int mouseX, int mouseY, float f) { - this.drawDefaultBackground(); + + if(Mouse.isButtonDown(0) && guiLeft + xSize - 15 <= mouseX && guiLeft + xSize - 15 + 12 > mouseX && guiTop + 25 < mouseY && guiTop + 25 + 191 >= mouseY) { + isDragging = true; + } + + if(!Mouse.isButtonDown(0)) isDragging = false; + + if(isDragging) { + int min = guiTop + 25 + 8; + int max = guiTop + 25 + 191 - 8; + int span = max - min; + + double progress = MathHelper.clamp_double((double) (mouseY - min) / span, 0D, 1D); + this.scrollProgress = MathHelper.clamp_int((int) Math.round((lines.size() - 1) * progress), 0, lines.size() - 1); + } + + handleScroll(); + + //this.drawRect(0, 0, this.width, this.height, 0x80919191); + this.drawRect(0, 0, this.width, this.height, 0xe0000000); + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(mouseX, mouseY); GL11.glEnable(GL11.GL_LIGHTING); + + this.lastClickX = 0; + this.lastClickY = 0; + } + + protected void handleScroll() { + + if(!Mouse.isButtonDown(0) && !Mouse.isButtonDown(1) && Mouse.next()) { + int scroll = Mouse.getEventDWheel(); + if(scroll > 0 && this.scrollProgress > 0) this.scrollProgress--; + if(scroll < 0 && this.scrollProgress < this.lines.size() - 1) this.scrollProgress++; + } } private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - int x = 0; - int y = 0; + int x = 4; + int y = 4; + + if(this.icon != null) { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + Minecraft mc = Minecraft.getMinecraft(); + GL11.glRotated(180, 1, 0, 0); + RenderHelper.enableStandardItemLighting(); + GL11.glRotated(-180, 1, 0, 0); + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + + x += 20; + y += (16 - this.fontRendererObj.FONT_HEIGHT) / 2; + } + + y += 1; this.fontRendererObj.drawString(title, guiLeft + x, guiTop + y, 0xFFFFFF); } @@ -58,6 +241,52 @@ public class GuiQMAW extends GuiScreen { private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, 170, ySize); + drawTexturedModalRect(guiLeft + 170, guiTop, 22, 0, 170, ySize); + + // scroll bar + drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16); + + int x = guiLeft + 7; + int y = guiTop + 30; + int lineNum = 0; + + for(List line : lines) { + lineNum++; + + if(lineNum <= this.scrollProgress) continue; + + int maxHeight = 0; + int inset = 0; + + for(ManualElement element : line) { + maxHeight = Math.max(maxHeight, element.getHeight()); + } + + if(y + maxHeight > guiTop + 219) break; + + if(line.isEmpty()) y += this.fontRendererObj.FONT_HEIGHT; + + for(ManualElement element : line) { + int elementX = x + inset; + int elementY = y + (maxHeight - element.getHeight()) / 2; + boolean mouseOver = (elementX <= mouseX && elementX + element.getWidth() > mouseX && elementY < mouseY && elementY + element.getHeight() >= mouseY); + element.render(mouseOver, elementX, elementY, mouseX, mouseY); + if(elementX <= lastClickX && elementX + element.getWidth() > lastClickX && elementY < lastClickY && elementY + element.getHeight() >= lastClickY) + element.onClick(); + inset += element.getWidth(); + } + + y += maxHeight + 2; + } + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + + if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } } } diff --git a/src/main/java/com/hbm/qmaw/ManualElement.java b/src/main/java/com/hbm/qmaw/ManualElement.java index f878bf8ae..7d5c640d5 100644 --- a/src/main/java/com/hbm/qmaw/ManualElement.java +++ b/src/main/java/com/hbm/qmaw/ManualElement.java @@ -1,12 +1,9 @@ package com.hbm.qmaw; public abstract class ManualElement { - - public int x; - public int y; public abstract int getWidth(); public abstract int getHeight(); - public abstract void render(boolean isMouseOver, int mouseX, int mouseY); + public abstract void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY); public abstract void onClick(); } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index c5bdf391e..55a44851a 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -172,7 +172,9 @@ public class QMAWLoader implements IResourceManagerReloadListener { } /** Extracts all the info from a json file's main object to add a QMAW to the system. Very barebones, only handles name, icon and the localized text. */ - public static void registerJson(String name, JsonObject json) { + public static void registerJson(String file, JsonObject json) { + + String name = json.get("name").getAsString(); QuickManualAndWiki qmaw = new QuickManualAndWiki(name); if(json.has("icon")) { @@ -195,7 +197,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { ItemStack trigger = SerializableRecipe.readItemStack(element.getAsJsonArray()); // items get renamed and removed all the time, so we add some more debug goodness for those cases if(trigger == null || trigger.getItem() == ModItems.nothing) { - MainRegistry.logger.info("[QMAW] Manual " + name + " references nonexistant trigger " + element.toString()); + MainRegistry.logger.info("[QMAW] Manual " + file + " references nonexistant trigger " + element.toString()); } else { QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java index 6024deb6f..97402d9fb 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentLink.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -9,10 +9,12 @@ import com.hbm.qmaw.QuickManualAndWiki; import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; public class QComponentLink extends ManualElement { @@ -35,6 +37,8 @@ public class QComponentLink extends ManualElement { } else { this.icon = qmaw.icon; } + + this.font = Minecraft.getMinecraft().fontRenderer; } public QComponentLink setColor(int color, int hoverColor) { @@ -45,30 +49,33 @@ public class QComponentLink extends ManualElement { @Override public int getWidth() { - return font.getStringWidth(text) + (icon != null ? 20 : 0); + return font.getStringWidth(text) + (icon != null ? 18 : 0); } @Override public int getHeight() { - return Math.max(font.FONT_HEIGHT, icon != null ? 18 : 0); + return Math.max(font.FONT_HEIGHT, icon != null ? 16 : 0); } @Override - public void render(boolean isMouseOver, int mouseX, int mouseY) { - int x = this.x; - int y = this.y; + public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) { if(this.icon != null) { - + + GL11.glPushMatrix(); GL11.glEnable(GL11.GL_DEPTH_TEST); Minecraft mc = Minecraft.getMinecraft(); + GL11.glRotated(180, 1, 0, 0); + RenderHelper.enableStandardItemLighting(); + GL11.glRotated(-180, 1, 0, 0); itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y); itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y, null); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); - x += 20; - y += (18 - font.FONT_HEIGHT) / 2; + x += 18; + y += (16 - font.FONT_HEIGHT) / 2; } font.drawString(text, x, y, isMouseOver ? hoverColor : color); @@ -76,6 +83,9 @@ public class QComponentLink extends ManualElement { @Override public void onClick() { QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); - if(qmaw != null) FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + } } } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentText.java b/src/main/java/com/hbm/qmaw/components/QComponentText.java index fd06d1150..30fd266b5 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentText.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentText.java @@ -36,7 +36,7 @@ public class QComponentText extends ManualElement { } @Override - public void render(boolean isMouseOver, int mouseX, int mouseY) { + public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) { font.drawString(text, x, y, color); } diff --git a/src/main/resources/assets/hbm/manual/demo.json b/src/main/resources/assets/hbm/manual/demo.json index d64a6de99..96cdeeadd 100644 --- a/src/main/resources/assets/hbm/manual/demo.json +++ b/src/main/resources/assets/hbm/manual/demo.json @@ -3,9 +3,9 @@ "icon": ["hbm:item.gun_light_revolver", 1, 0], "trigger": [["hbm:item.plate_iron"], ["hbm:item.plate_gold"], ["hbm:item.plate_sludge"]], "title": { - "en_US": "TEST PAGE" - } + "en_US": "Demo" + }, "content": { - "en_US": "This is a test page that links to [[Demo|DEMO]].\n\nFormat line break" + "en_US": "Referred to as a collective as \"flux\" in NTM, neutrons are the sole driver of fission and therefore the driver of heat production in an RBMK. Fuel assemblies in fuel rod columns will create neutrons according to a mathematically defined flux function which is described in more detail in Category:RBMK Fuel. Some will spontaneously output neutrons whereas others will only emit them when they receive input neutrons with most fuels requiring some form of input to get started. Neutrons are emitted in every horizontal direction away from the fuel rod and will interact with various types of columns during their travel before eventually being absorbed by something. Neutrons are either emitted as fast moving or slow moving and react best with fuels in either state depending on the properties of the fuel. To convert fast neutrons to slow neutrons, they must pass through a moderator such as graphite which can come in the form of moderated rods or moderator columns. There is no way to make slow neutrons become fast after being moderated. If not properly sealed, neutrons can leak out of the RBMK and cause immense environmental radiation. To prevent this, cover every column in the RBMK that neutrons pass through with an RBMK cover panel and seal off all paths that neutrons take with either solid blocks or a column that absorbs the neutrons fully." } } diff --git a/src/main/resources/assets/hbm/textures/gui/gui_wiki.png b/src/main/resources/assets/hbm/textures/gui/gui_wiki.png index 25d913919570aefc1fcb2646e1da7e8a558ae273..48c92d1c46ca12cf5d22954dbccfe040f2e43d86 100644 GIT binary patch delta 176 zcmdnV@soXm3FC%|rV1Rry}q-9eA6T*#>%_Z3D@o^l&IThxZ>uv+!@b*?%)1D_x8Q= z1RZ#+J54p z5T5m}2Qp`s?dM^fb2@*s5@RvbgTe~DWM4f D;fq7T delta 148 zcmV;F0BisG2e}B4Gy(9DH6RER8=E$zn#@p Date: Thu, 7 Aug 2025 20:23:28 +0200 Subject: [PATCH 161/323] scat --- src/main/java/com/hbm/handler/HbmKeybinds.java | 4 ++++ .../java/com/hbm/main/ModEventHandlerClient.java | 5 +++-- src/main/java/com/hbm/qmaw/GuiQMAW.java | 12 ++++++------ src/main/java/com/hbm/qmaw/QMAWLoader.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 ++ src/main/resources/assets/hbm/lang/en_US.lang | 2 ++ src/main/resources/assets/hbm/manual/alloy.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/bakelite.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/demo.json | 11 ----------- src/main/resources/assets/hbm/manual/mingrade.json | 11 +++++++++++ .../resources/assets/hbm/manual/plutonium-238.json | 11 +++++++++++ .../resources/assets/hbm/manual/plutonium-239.json | 11 +++++++++++ .../resources/assets/hbm/manual/plutonium-240.json | 11 +++++++++++ .../resources/assets/hbm/manual/plutonium-241.json | 11 +++++++++++ .../resources/assets/hbm/manual/plutonium-rg.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/plutonium.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/polonium.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/polymer.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/radium.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/silicon.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/steel.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/technetium.json | 11 +++++++++++ .../assets/hbm/manual/technetium_steel.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/thorium.json | 11 +++++++++++ .../resources/assets/hbm/manual/uranium-233.json | 11 +++++++++++ .../resources/assets/hbm/manual/uranium-235.json | 11 +++++++++++ .../resources/assets/hbm/manual/uranium-238.json | 11 +++++++++++ src/main/resources/assets/hbm/manual/uranium.json | 11 +++++++++++ 28 files changed, 249 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/assets/hbm/manual/alloy.json create mode 100644 src/main/resources/assets/hbm/manual/bakelite.json delete mode 100644 src/main/resources/assets/hbm/manual/demo.json create mode 100644 src/main/resources/assets/hbm/manual/mingrade.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium-238.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium-239.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium-240.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium-241.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium-rg.json create mode 100644 src/main/resources/assets/hbm/manual/plutonium.json create mode 100644 src/main/resources/assets/hbm/manual/polonium.json create mode 100644 src/main/resources/assets/hbm/manual/polymer.json create mode 100644 src/main/resources/assets/hbm/manual/radium.json create mode 100644 src/main/resources/assets/hbm/manual/silicon.json create mode 100644 src/main/resources/assets/hbm/manual/steel.json create mode 100644 src/main/resources/assets/hbm/manual/technetium.json create mode 100644 src/main/resources/assets/hbm/manual/technetium_steel.json create mode 100644 src/main/resources/assets/hbm/manual/thorium.json create mode 100644 src/main/resources/assets/hbm/manual/uranium-233.json create mode 100644 src/main/resources/assets/hbm/manual/uranium-235.json create mode 100644 src/main/resources/assets/hbm/manual/uranium-238.json create mode 100644 src/main/resources/assets/hbm/manual/uranium.json diff --git a/src/main/java/com/hbm/handler/HbmKeybinds.java b/src/main/java/com/hbm/handler/HbmKeybinds.java index 06a9c90a1..886f388b9 100644 --- a/src/main/java/com/hbm/handler/HbmKeybinds.java +++ b/src/main/java/com/hbm/handler/HbmKeybinds.java @@ -37,6 +37,8 @@ public class HbmKeybinds { public static KeyBinding hudKey = new KeyBinding(category + ".toggleHUD", Keyboard.KEY_V, category); public static KeyBinding dashKey = new KeyBinding(category + ".dash", Keyboard.KEY_LSHIFT, category); public static KeyBinding trainKey = new KeyBinding(category + ".trainInv", Keyboard.KEY_R, category); + + public static KeyBinding qmaw = new KeyBinding(category + ".qmaw", Keyboard.KEY_F1, category); public static KeyBinding abilityCycle = new KeyBinding(category + ".ability", -99, category); public static KeyBinding abilityAlt = new KeyBinding(category + ".abilityAlt", Keyboard.KEY_LMENU, category); @@ -61,6 +63,8 @@ public class HbmKeybinds { ClientRegistry.registerKeyBinding(hudKey); ClientRegistry.registerKeyBinding(dashKey); ClientRegistry.registerKeyBinding(trainKey); + + ClientRegistry.registerKeyBinding(qmaw); ClientRegistry.registerKeyBinding(reloadKey); ClientRegistry.registerKeyBinding(gunPrimaryKey); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 823e38433..c82f7b1b2 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -14,6 +14,7 @@ import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.ArmorModHandler; import com.hbm.handler.HTTPHandler; import com.hbm.handler.HazmatRegistry; +import com.hbm.handler.HbmKeybinds; import com.hbm.handler.ImpactWorldHandler; import com.hbm.hazard.HazardSystem; import com.hbm.interfaces.IHoldableWeapon; @@ -753,7 +754,7 @@ public class ModEventHandlerClient { try { QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp); if(qmaw != null) { - list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("qmaw.tab")); + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("qmaw.tab", Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode()))); lastQMAW = qmaw; qmawTimestamp = Clock.get_ms(); } @@ -907,7 +908,7 @@ public class ModEventHandlerClient { } } - if(Keyboard.isKeyDown(Keyboard.KEY_TAB) && Minecraft.getMinecraft().currentScreen != null) { + if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && Minecraft.getMinecraft().currentScreen != null) { QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null; diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index 1cca980fb..b4d60c42b 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -3,14 +3,12 @@ package com.hbm.qmaw; import java.util.ArrayList; import java.util.List; -import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; import com.hbm.qmaw.components.*; -import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.RenderHelper; @@ -88,10 +86,12 @@ public class GuiQMAW extends GuiScreen { int pipe = link.indexOf("|"); QComponentLink linkComponent; + String suffix = toParse.startsWith(" ") ? " " : ""; + if(pipe == -1) { - linkComponent = new QComponentLink(link, link); + linkComponent = new QComponentLink(link, link + suffix); } else { - linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe)); + linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe) + suffix); } // append to current line @@ -213,7 +213,7 @@ public class GuiQMAW extends GuiScreen { private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - int x = 4; + int x = 7; int y = 4; if(this.icon != null) { @@ -229,7 +229,7 @@ public class GuiQMAW extends GuiScreen { GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glPopMatrix(); - x += 20; + x += 18; y += (16 - this.fontRendererObj.FONT_HEIGHT) / 2; } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 55a44851a..f085aeba4 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -78,7 +78,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { for(File modFile : registeredModFiles) dissectZip(modFile); - File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.", "") + "/src/main/resources/assets/hbm/manual"); + File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar)); if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) { MainRegistry.logger.info("[QMAW] Exploring " + devEnvManualFolder.getAbsolutePath()); dissectManualFolder(devEnvManualFolder); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 444cc8a7c..037898b56 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3722,6 +3722,8 @@ potion.hbm_telekinesis=! ! ! purex.recycle=Wiederanreicherung von %s purex.schrab=Schrabidium extrahieren aus %s +qmaw.tab=[ Drücke %s für Hilfe ] + radar.clearMap=Karte zurücksetzen radar.detectMissiles=Raketen erkennen radar.detectPlayers=Spieler erkennen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 32d100935..cd951f6c2 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4780,6 +4780,8 @@ potion.hbm_telekinesis=! ! ! purex.recycle=Reprocessing of %s purex.schrab=Schrabidium extraction from %s +qmaw.tab=[ Press %s for help ] + radar.clearMap=Clear Map radar.detectMissiles=Detect Missiles radar.detectPlayers=Detect Players diff --git a/src/main/resources/assets/hbm/manual/alloy.json b/src/main/resources/assets/hbm/manual/alloy.json new file mode 100644 index 000000000..0c583e585 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/alloy.json @@ -0,0 +1,11 @@ +{ + "name": "Advanced Alloy", + "icon": ["hbm:item.ingot_advanced_alloy", 1, 0], + "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], + "title": { + "en_US": "Advanced Alloy" + }, + "content": { + "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/bakelite.json b/src/main/resources/assets/hbm/manual/bakelite.json new file mode 100644 index 000000000..38d2a9dd1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/bakelite.json @@ -0,0 +1,11 @@ +{ + "name": "Bakelite", + "icon": ["hbm:item.ingot_bakelite", 1, 0], + "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], + "title": { + "en_US": "Bakelite" + }, + "content": { + "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes." + } +} diff --git a/src/main/resources/assets/hbm/manual/demo.json b/src/main/resources/assets/hbm/manual/demo.json deleted file mode 100644 index 96cdeeadd..000000000 --- a/src/main/resources/assets/hbm/manual/demo.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "DEMO", - "icon": ["hbm:item.gun_light_revolver", 1, 0], - "trigger": [["hbm:item.plate_iron"], ["hbm:item.plate_gold"], ["hbm:item.plate_sludge"]], - "title": { - "en_US": "Demo" - }, - "content": { - "en_US": "Referred to as a collective as \"flux\" in NTM, neutrons are the sole driver of fission and therefore the driver of heat production in an RBMK. Fuel assemblies in fuel rod columns will create neutrons according to a mathematically defined flux function which is described in more detail in Category:RBMK Fuel. Some will spontaneously output neutrons whereas others will only emit them when they receive input neutrons with most fuels requiring some form of input to get started. Neutrons are emitted in every horizontal direction away from the fuel rod and will interact with various types of columns during their travel before eventually being absorbed by something. Neutrons are either emitted as fast moving or slow moving and react best with fuels in either state depending on the properties of the fuel. To convert fast neutrons to slow neutrons, they must pass through a moderator such as graphite which can come in the form of moderated rods or moderator columns. There is no way to make slow neutrons become fast after being moderated. If not properly sealed, neutrons can leak out of the RBMK and cause immense environmental radiation. To prevent this, cover every column in the RBMK that neutrons pass through with an RBMK cover panel and seal off all paths that neutrons take with either solid blocks or a column that absorbs the neutrons fully." - } -} diff --git a/src/main/resources/assets/hbm/manual/mingrade.json b/src/main/resources/assets/hbm/manual/mingrade.json new file mode 100644 index 000000000..73e1a6827 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/mingrade.json @@ -0,0 +1,11 @@ +{ + "name": "Minecraft Grade Copper", + "icon": ["hbm:item.ingot_red_copper", 1, 0], + "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], + "title": { + "en_US": "Minecraft Grade Copper (Red Copper)" + }, + "content": { + "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-238.json b/src/main/resources/assets/hbm/manual/plutonium-238.json new file mode 100644 index 000000000..74e61a1de --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium-238.json @@ -0,0 +1,11 @@ +{ + "name": "Plutonium-238", + "icon": ["hbm:item.billet_pu238", 1, 0], + "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], + "title": { + "en_US": "Plutonium-238" + }, + "content": { + "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-239.json b/src/main/resources/assets/hbm/manual/plutonium-239.json new file mode 100644 index 000000000..307242d98 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium-239.json @@ -0,0 +1,11 @@ +{ + "name": "Plutonium-239", + "icon": ["hbm:item.billet_pu239", 1, 0], + "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], + "title": { + "en_US": "Plutonium-239" + }, + "content": { + "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-240.json b/src/main/resources/assets/hbm/manual/plutonium-240.json new file mode 100644 index 000000000..3a024fec6 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium-240.json @@ -0,0 +1,11 @@ +{ + "name": "Plutonium-240", + "icon": ["hbm:item.billet_pu240", 1, 0], + "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], + "title": { + "en_US": "Plutonium-240" + }, + "content": { + "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-241.json b/src/main/resources/assets/hbm/manual/plutonium-241.json new file mode 100644 index 000000000..8edf8eddc --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium-241.json @@ -0,0 +1,11 @@ +{ + "name": "Plutonium-241", + "icon": ["hbm:item.billet_pu241", 1, 0], + "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], + "title": { + "en_US": "Plutonium-241" + }, + "content": { + "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-rg.json b/src/main/resources/assets/hbm/manual/plutonium-rg.json new file mode 100644 index 000000000..9164df069 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium-rg.json @@ -0,0 +1,11 @@ +{ + "name": "Reactor-Grade Plutonium", + "icon": ["hbm:item.billet_pu_mix", 1, 0], + "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], + "title": { + "en_US": "Reactor-Grade Plutonium" + }, + "content": { + "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium.json b/src/main/resources/assets/hbm/manual/plutonium.json new file mode 100644 index 000000000..7952e22e5 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/plutonium.json @@ -0,0 +1,11 @@ +{ + "name": "Plutonium", + "icon": ["hbm:item.ingot_plutonium", 1, 0], + "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], + "title": { + "en_US": "Plutonium" + }, + "content": { + "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]" + } +} diff --git a/src/main/resources/assets/hbm/manual/polonium.json b/src/main/resources/assets/hbm/manual/polonium.json new file mode 100644 index 000000000..00fac7d84 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/polonium.json @@ -0,0 +1,11 @@ +{ + "name": "Polonium-210", + "icon": ["hbm:item.billet_polonium", 1, 0], + "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], + "title": { + "en_US": "Polonium-210" + }, + "content": { + "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot." + } +} diff --git a/src/main/resources/assets/hbm/manual/polymer.json b/src/main/resources/assets/hbm/manual/polymer.json new file mode 100644 index 000000000..1fbd464c2 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/polymer.json @@ -0,0 +1,11 @@ +{ + "name": "Polymer", + "icon": ["hbm:item.ingot_polymer", 1, 0], + "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], + "title": { + "en_US": "Polymer" + }, + "content": { + "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/radium.json b/src/main/resources/assets/hbm/manual/radium.json new file mode 100644 index 000000000..6ec2dcd92 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/radium.json @@ -0,0 +1,11 @@ +{ + "name": "Radium-226", + "icon": ["hbm:item.billet_ra226", 1, 0], + "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], + "title": { + "en_US": "Radium-226" + }, + "content": { + "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/silicon.json b/src/main/resources/assets/hbm/manual/silicon.json new file mode 100644 index 000000000..97cec4e51 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/silicon.json @@ -0,0 +1,11 @@ +{ + "name": "Silicon", + "icon": ["hbm:item.billet_silicon", 1, 0], + "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], + "title": { + "en_US": "Silicon" + }, + "content": { + "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polmyer]], requiring [[oil|Crude Oil]] processing." + } +} diff --git a/src/main/resources/assets/hbm/manual/steel.json b/src/main/resources/assets/hbm/manual/steel.json new file mode 100644 index 000000000..113d25af1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/steel.json @@ -0,0 +1,11 @@ +{ + "name": "Steel", + "icon": ["hbm:item.ingot_steel", 1, 0], + "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], + "title": { + "en_US": "Steel" + }, + "content": { + "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/technetium.json b/src/main/resources/assets/hbm/manual/technetium.json new file mode 100644 index 000000000..97748ea2b --- /dev/null +++ b/src/main/resources/assets/hbm/manual/technetium.json @@ -0,0 +1,11 @@ +{ + "name": "Technetium", + "icon": ["hbm:item.ingot_technetium", 1, 0], + "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], + "title": { + "en_US": "Technetium" + }, + "content": { + "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/technetium_steel.json b/src/main/resources/assets/hbm/manual/technetium_steel.json new file mode 100644 index 000000000..5f33be6c7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/technetium_steel.json @@ -0,0 +1,11 @@ +{ + "name": "Technetium Steel", + "icon": ["hbm:item.ingot_tcalloy", 1, 0], + "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], + "title": { + "en_US": "Technetium Steel" + }, + "content": { + "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangable with [[cadmium steel|Cadmium Steel]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/thorium.json b/src/main/resources/assets/hbm/manual/thorium.json new file mode 100644 index 000000000..1812f13e7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/thorium.json @@ -0,0 +1,11 @@ +{ + "name": "Thorium-232", + "icon": ["hbm:item.billet_th232", 1, 0], + "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], + "title": { + "en_US": "Thorium-232" + }, + "content": { + "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/uranium-233.json b/src/main/resources/assets/hbm/manual/uranium-233.json new file mode 100644 index 000000000..1852de4c2 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/uranium-233.json @@ -0,0 +1,11 @@ +{ + "name": "Uranium-233", + "icon": ["hbm:item.billet_u233", 1, 0], + "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], + "title": { + "en_US": "Uranium-233" + }, + "content": { + "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/uranium-235.json b/src/main/resources/assets/hbm/manual/uranium-235.json new file mode 100644 index 000000000..361c97c72 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/uranium-235.json @@ -0,0 +1,11 @@ +{ + "name": "Uranium-235", + "icon": ["hbm:item.billet_u235", 1, 0], + "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], + "title": { + "en_US": "Uranium-235" + }, + "content": { + "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/uranium-238.json b/src/main/resources/assets/hbm/manual/uranium-238.json new file mode 100644 index 000000000..bef789d01 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/uranium-238.json @@ -0,0 +1,11 @@ +{ + "name": "Uranium-238", + "icon": ["hbm:item.billet_u238", 1, 0], + "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], + "title": { + "en_US": "Uranium-238" + }, + "content": { + "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive." + } +} diff --git a/src/main/resources/assets/hbm/manual/uranium.json b/src/main/resources/assets/hbm/manual/uranium.json new file mode 100644 index 000000000..3c34cc07e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/uranium.json @@ -0,0 +1,11 @@ +{ + "name": "Uranium", + "icon": ["hbm:item.ingot_uranium", 1, 0], + "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], + "title": { + "en_US": "Uranium" + }, + "content": { + "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]" + } +} From 84601f685fea0a92d11f1a28e0b1e0a1742a27c2 Mon Sep 17 00:00:00 2001 From: George Paton Date: Fri, 8 Aug 2025 14:51:45 +1000 Subject: [PATCH 162/323] NBTStructureLib features brought back to NTM, including: * `/locate` command * custom spawning rules (eg. make something always spawn at 0,0) * code structure reorg * extra logging for misconfigured structures --- .../java/com/hbm/blocks/BlockDummyable.java | 6 +- .../com/hbm/blocks/generic/BlockBobble.java | 6 +- .../com/hbm/blocks/generic/BlockDecoCRT.java | 6 +- .../hbm/blocks/generic/BlockDecoModel.java | 4 +- .../hbm/blocks/generic/BlockDecoToaster.java | 6 +- .../com/hbm/blocks/generic/BlockModDoor.java | 6 +- .../com/hbm/blocks/generic/BlockPipe.java | 6 +- .../com/hbm/blocks/generic/BlockPlushie.java | 6 +- .../hbm/blocks/generic/BlockWandJigsaw.java | 6 +- .../hbm/blocks/generic/BlockWandLogic.java | 2 +- .../com/hbm/blocks/generic/BlockWandLoot.java | 2 +- .../com/hbm/blocks/generic/DecoBlock.java | 6 +- .../generic/DecoPoleSatelliteReceiver.java | 6 +- .../hbm/blocks/generic/DecoTapeRecorder.java | 6 +- .../hbm/blocks/machine/BlockMachineBase.java | 6 +- .../com/hbm/blocks/machine/Floodlight.java | 4 +- .../com/hbm/blocks/machine/Spotlight.java | 6 +- .../com/hbm/blocks/network/FluidPump.java | 6 +- .../java/com/hbm/commands/CommandLocate.java | 118 ++++++++ .../java/com/hbm/items/tool/ItemWandS.java | 2 +- src/main/java/com/hbm/lib/HbmWorld.java | 3 +- src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/main/StructureManager.java | 2 +- .../com/hbm/world/gen/NTMWorldGenerator.java | 44 +-- .../INBTBlockTransformable.java} | 28 +- .../INBTTileEntityTransformable.java | 2 +- .../com/hbm/world/gen/nbt/JigsawPiece.java | 35 +++ .../com/hbm/world/gen/nbt/JigsawPool.java | 58 ++++ .../hbm/world/gen/{ => nbt}/NBTStructure.java | 274 +++++++----------- .../com/hbm/world/gen/nbt/SpawnCondition.java | 115 ++++++++ src/main/resources/assets/hbm/lang/en_US.lang | 4 + 31 files changed, 537 insertions(+), 245 deletions(-) create mode 100644 src/main/java/com/hbm/commands/CommandLocate.java rename src/main/java/com/hbm/world/gen/{INBTTransformable.java => nbt/INBTBlockTransformable.java} (89%) rename src/main/java/com/hbm/world/gen/{ => nbt}/INBTTileEntityTransformable.java (90%) create mode 100644 src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java create mode 100644 src/main/java/com/hbm/world/gen/nbt/JigsawPool.java rename src/main/java/com/hbm/world/gen/{ => nbt}/NBTStructure.java (84%) create mode 100644 src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 19c33db65..fe9a001ca 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -5,7 +5,7 @@ import com.hbm.handler.ThreeInts; import com.hbm.interfaces.ICopiable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -37,7 +37,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTTransformable { +public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTBlockTransformable { public BlockDummyable(Material mat) { super(mat); @@ -590,7 +590,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl meta -= extra; } - meta = INBTTransformable.transformMetaDeco(meta, coordBaseMode); + meta = INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); if(isOffset) { meta += offset; diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index ea53feb69..3ba895977 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -4,8 +4,8 @@ import com.hbm.inventory.gui.GUIScreenBobble; import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -34,7 +34,7 @@ import net.minecraft.world.World; import java.util.List; import java.util.Random; -public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTransformable { +public class BlockBobble extends BlockContainer implements IGUIProvider, INBTBlockTransformable { public BlockBobble() { super(Material.iron); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java index b1ede562a..bee8f863e 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java @@ -2,7 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -15,7 +15,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockDecoCRT extends BlockMulti implements INBTTransformable { +public class BlockDecoCRT extends BlockMulti implements INBTBlockTransformable { protected String[] variants = new String[] {"crt_clean", "crt_broken", "crt_blinking", "crt_bsod"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -77,7 +77,7 @@ public class BlockDecoCRT extends BlockMulti implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java index 2e2febe67..fcf9fbc7e 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java @@ -1,7 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockEnumMulti; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.material.Material; @@ -12,7 +12,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoModel extends BlockEnumMulti implements INBTTransformable { +public class BlockDecoModel extends BlockEnumMulti implements INBTBlockTransformable { public BlockDecoModel(Material mat, Class theEnum, boolean multiName, boolean multiTexture) { super(mat, theEnum, multiName, multiTexture); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java index c35dd1d3b..149cdf7f4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java @@ -2,7 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -17,7 +17,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoToaster extends BlockMulti implements INBTTransformable { +public class BlockDecoToaster extends BlockMulti implements INBTBlockTransformable { protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -94,7 +94,7 @@ public class BlockDecoToaster extends BlockMulti implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java index 233f8da71..0093135d5 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java @@ -4,7 +4,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,7 +21,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockModDoor extends Block implements INBTTransformable { +public class BlockModDoor extends Block implements INBTBlockTransformable { @SideOnly(Side.CLIENT) private IIcon[] field_150017_a; @SideOnly(Side.CLIENT) @@ -400,6 +400,6 @@ public class BlockModDoor extends Block implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDoor(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDoor(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPipe.java b/src/main/java/com/hbm/blocks/generic/BlockPipe.java index 27eaf3b27..824fc5aae 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPipe.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPipe.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockPipe extends Block implements ITooltipProvider, INBTTransformable { +public class BlockPipe extends Block implements ITooltipProvider, INBTBlockTransformable { @SideOnly(Side.CLIENT) private IIcon sideIcon; @@ -96,7 +96,7 @@ public class BlockPipe extends Block implements ITooltipProvider, INBTTransforma @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaPillar(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaPillar(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java index 848065a84..877d784e7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java @@ -5,8 +5,8 @@ import java.util.Random; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ITooltipProvider; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTTransformable { +public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTBlockTransformable { public BlockPlushie() { super(Material.cloth); diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java index 63076df31..d64470934 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java @@ -18,7 +18,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.common.registry.GameRegistry; @@ -47,7 +47,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTTransformable, IGUIProvider, ILookOverlay { +public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay { private IIcon iconTop; private IIcon iconSide; @@ -123,7 +123,7 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } @Override diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java index 01d8df298..f7c3b2aa2 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -13,8 +13,8 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; import com.hbm.world.gen.util.LogicBlockActions; -import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.LogicBlockConditions; import com.hbm.world.gen.util.LogicBlockInteractions; import cpw.mods.fml.common.registry.GameRegistry; diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java index bf457843d..cf5cebce0 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -17,7 +17,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.LootGenerator; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; import com.mojang.authlib.GameProfile; import api.hbm.block.IToolable; diff --git a/src/main/java/com/hbm/blocks/generic/DecoBlock.java b/src/main/java/com/hbm/blocks/generic/DecoBlock.java index bf25850eb..05642281a 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoBlock.java +++ b/src/main/java/com/hbm/blocks/generic/DecoBlock.java @@ -6,7 +6,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.deco.TileEntityDecoBlock; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.block.IToolable; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -25,7 +25,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class DecoBlock extends BlockContainer implements IToolable, INBTTransformable { +public class DecoBlock extends BlockContainer implements IToolable, INBTBlockTransformable { Random rand = new Random(); @@ -185,6 +185,6 @@ public class DecoBlock extends BlockContainer implements IToolable, INBTTransfor @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java index 109cabbc5..a55592ae9 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java +++ b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java @@ -1,7 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.tileentity.deco.TileEntityDecoPoleSatelliteReceiver; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTransformable { +public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTBlockTransformable { public DecoPoleSatelliteReceiver(Material p_i45386_1_) { super(p_i45386_1_); @@ -61,7 +61,7 @@ public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTra @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java index e7143aae6..ca8e32474 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java +++ b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java @@ -1,6 +1,6 @@ package com.hbm.blocks.generic; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.BlockContainer; @@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoTapeRecorder extends BlockContainer implements INBTTransformable { +public class DecoTapeRecorder extends BlockContainer implements INBTBlockTransformable { public DecoTapeRecorder(Material p_i45386_1_) { super(p_i45386_1_); @@ -63,7 +63,7 @@ public class DecoTapeRecorder extends BlockContainer implements INBTTransformabl @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java index b5d111c13..41e0c6a03 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java +++ b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java @@ -1,7 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.main.MainRegistry; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -17,7 +17,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public abstract class BlockMachineBase extends BlockContainer implements INBTTransformable { +public abstract class BlockMachineBase extends BlockContainer implements INBTBlockTransformable { int guiID = -1; protected boolean rotatable = false; @@ -115,6 +115,6 @@ public abstract class BlockMachineBase extends BlockContainer implements INBTTra @Override public int transformMeta(int meta, int coordBaseMode) { if(!rotatable) return meta; - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/Floodlight.java b/src/main/java/com/hbm/blocks/machine/Floodlight.java index 25e70cac2..4dcdf6fa0 100644 --- a/src/main/java/com/hbm/blocks/machine/Floodlight.java +++ b/src/main/java/com/hbm/blocks/machine/Floodlight.java @@ -4,10 +4,10 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.FloodlightBeam.TileEntityFloodlightBeam; import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.block.IToolable; import api.hbm.energymk2.IEnergyReceiverMK2; -import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -28,7 +28,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class Floodlight extends BlockContainer implements IToolable, INBTTransformable { +public class Floodlight extends BlockContainer implements IToolable, INBTBlockTransformable { public Floodlight(Material mat) { super(mat); diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index 4868d3dd0..a72f81db2 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -7,7 +7,7 @@ import java.util.Random; import com.hbm.blocks.BlockEnums.LightType; import com.hbm.blocks.ISpotlight; import com.hbm.main.ResourceManager; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -26,7 +26,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.common.util.ForgeDirection; -public class Spotlight extends Block implements ISpotlight, INBTTransformable { +public class Spotlight extends Block implements ISpotlight, INBTBlockTransformable { public static boolean disableOnGeneration = true; @@ -367,7 +367,7 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { public int transformMeta(int meta, int coordBaseMode) { // +1 to set as broken, won't turn on until broken and replaced int disabled = disableOnGeneration ? 1 : 0; - return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; + return (INBTBlockTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; } @Override diff --git a/src/main/java/com/hbm/blocks/network/FluidPump.java b/src/main/java/com/hbm/blocks/network/FluidPump.java index a3fcd1baa..9ce059fb4 100644 --- a/src/main/java/com/hbm/blocks/network/FluidPump.java +++ b/src/main/java/com/hbm/blocks/network/FluidPump.java @@ -25,7 +25,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; @@ -55,7 +55,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class FluidPump extends BlockContainer implements INBTTransformable, ILookOverlay, IGUIProvider { +public class FluidPump extends BlockContainer implements INBTBlockTransformable, ILookOverlay, IGUIProvider { public FluidPump(Material mat) { super(mat); @@ -127,7 +127,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) diff --git a/src/main/java/com/hbm/commands/CommandLocate.java b/src/main/java/com/hbm/commands/CommandLocate.java new file mode 100644 index 000000000..b0a7f8948 --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandLocate.java @@ -0,0 +1,118 @@ +package com.hbm.commands; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import com.hbm.lib.HbmWorld; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.SpawnCondition; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; + +public class CommandLocate extends CommandBase { + + private static final int MAX_DISTANCE = 256; + + @Override + public String getCommandName() { + return "ntmlocate"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return String.format(Locale.US, + "%s/%s structure %s- Locates the nearest structure with a given name.", + EnumChatFormatting.GREEN, getCommandName(), EnumChatFormatting.LIGHT_PURPLE + ); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) + throw new PlayerNotFoundException(); + + if(args.length == 0) + throw new WrongUsageException(getCommandUsage(sender), new Object[0]); + + if(args[0].equals("structure")) { + EntityPlayer player = (EntityPlayer) sender; + + SpawnCondition structure = NBTStructure.getStructure(args[1]); + + if(structure == null) { + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.no_match"); + message.getChatStyle().setColor(EnumChatFormatting.RED); + sender.addChatMessage(message); + return; + } + + int chunkX = MathHelper.floor_double(player.posX) / 16; + int chunkZ = MathHelper.floor_double(player.posZ) / 16; + + ChunkCoordIntPair pos = getNearestLocationTo(structure, player.worldObj, chunkX, chunkZ); + + if(pos == null) { + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.none_found"); + message.getChatStyle().setColor(EnumChatFormatting.RED); + sender.addChatMessage(message); + return; + } + + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.success.coordinates", structure.name, pos.chunkXPos * 16, pos.chunkZPos * 16); + message.getChatStyle().setColor(EnumChatFormatting.GREEN); + sender.addChatMessage(message); + } else { + throw new WrongUsageException(getCommandUsage(sender), new Object[0]); + } + } + + private ChunkCoordIntPair getNearestLocationTo(SpawnCondition spawn, World world, int chunkX, int chunkZ) { + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX, chunkZ) == spawn) + return new ChunkCoordIntPair(chunkX, chunkZ); + + for(int radius = 1; radius < MAX_DISTANCE; radius++) { + for(int x = chunkX - radius; x <= chunkX + radius; x++) { + if(HbmWorld.worldGenerator.getStructureAt(world, x, chunkZ - radius) == spawn) + return new ChunkCoordIntPair(x, chunkZ - radius); + if(HbmWorld.worldGenerator.getStructureAt(world, x, chunkZ + radius) == spawn) + return new ChunkCoordIntPair(x, chunkZ + radius); + } + for(int z = chunkZ - radius; z <= chunkZ + radius; z++) { + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX - radius, z) == spawn) + return new ChunkCoordIntPair(chunkX - radius, z); + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX + radius, z) == spawn) + return new ChunkCoordIntPair(chunkX + radius, z); + } + } + + return null; + } + + @SuppressWarnings("unchecked") + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] args) { + if(args.length < 1) + return Collections.emptyList(); + + if(args.length == 1) + return getListOfStringsMatchingLastWord(args, "structure"); + + if(args.length == 2) { + List structures = NBTStructure.listStructures(); + return getListOfStringsMatchingLastWord(args, structures.toArray(new String[structures.size()])); + } + + return Collections.emptyList(); + } + +} diff --git a/src/main/java/com/hbm/items/tool/ItemWandS.java b/src/main/java/com/hbm/items/tool/ItemWandS.java index 2de5998fb..55de41e9a 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandS.java +++ b/src/main/java/com/hbm/items/tool/ItemWandS.java @@ -10,7 +10,7 @@ import java.text.SimpleDateFormat; import com.hbm.blocks.ModBlocks; import com.hbm.util.BobMathUtil; import com.hbm.util.Tuple.Pair; -import com.hbm.world.gen.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index ed4ca9208..5242feb9b 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,10 +1,11 @@ package com.hbm.lib; import com.hbm.world.gen.MapGenNTMFeatures; -import com.hbm.world.gen.NBTStructure; import com.hbm.world.gen.NTMWorldGenerator; import com.hbm.world.gen.component.*; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; +import com.hbm.world.gen.nbt.NBTStructure; + import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.world.gen.structure.MapGenStructureIO; diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index f797b0de3..d6aebacd8 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -967,6 +967,7 @@ public class MainRegistry { event.registerServerCommand(new CommandRadiation()); event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); + event.registerServerCommand(new CommandLocate()); } @EventHandler diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 5c3f93090..077a3665f 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -1,7 +1,7 @@ package com.hbm.main; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index bb1c7b3d3..049428707 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -9,14 +9,15 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.StructureConfig; import com.hbm.main.StructureManager; -import com.hbm.world.gen.NBTStructure.JigsawPiece; -import com.hbm.world.gen.NBTStructure.JigsawPool; -import com.hbm.world.gen.NBTStructure.SpawnCondition; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; import com.hbm.world.gen.component.Component.CrabSpawners; import com.hbm.world.gen.component.Component.GreenOoze; import com.hbm.world.gen.component.Component.MeteorBricks; import com.hbm.world.gen.component.Component.SupplyCrates; +import com.hbm.world.gen.nbt.JigsawPiece; +import com.hbm.world.gen.nbt.JigsawPool; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.SpawnCondition; import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -41,44 +42,44 @@ public class NTMWorldGenerator implements IWorldGenerator { final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); /// SPIRE /// - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("spire") {{ canSpawn = biome -> biome.heightVariation <= 0.05F && !invalidBiomes.contains(biome); structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = 2; }}); - - NBTStructure.registerStructure(0, new SpawnCondition() {{ + + NBTStructure.registerStructure(0, new SpawnCondition("features") {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = 14 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("bunker") {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new BunkerStart(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = 1 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("vertibird") {{ canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; structure = new JigsawPiece("vertibird", StructureManager.vertibird, -3); spawnWeight = 3 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("crashed_vertibird") {{ canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; structure = new JigsawPiece("crashed_vertibird", StructureManager.crashed_vertibird, -10); spawnWeight = 3 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("aircraft_carrier") {{ canSpawn = oceanBiomes::contains; structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier, -6); maxHeight = 42; spawnWeight = 1; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("oil_rig") {{ canSpawn = biome -> biome == BiomeGenBase.deepOcean; structure = new JigsawPiece("oil_rig", StructureManager.oil_rig, -20); maxHeight = 12; @@ -86,7 +87,7 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 2; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("lighthouse") {{ canSpawn = lighthouseBiomes::contains; structure = new JigsawPiece("lighthouse", StructureManager.lighthouse, -40); maxHeight = 29; @@ -94,7 +95,7 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 2; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("beached_patrol") {{ canSpawn = beachBiomes::contains; structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol, -5); minHeight = 58; @@ -103,8 +104,8 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change - - NBTStructure.registerStructure(0, new SpawnCondition() {{ + + NBTStructure.registerStructure(0, new SpawnCondition("dish") {{ canSpawn = biome -> biome == BiomeGenBase.plains; structure = new JigsawPiece("dish", StructureManager.dish, -10); minHeight = 53; @@ -128,13 +129,13 @@ public class NTMWorldGenerator implements IWorldGenerator { put(ModBlocks.concrete_colored, new GreenOoze()); }}; - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("meteor_dungeon") {{ minHeight = 32; maxHeight = 32; sizeLimit = 128; canSpawn = biome -> biome.rootHeight >= 0; startPool = "start"; - pools = new HashMap() {{ + pools = new HashMap() {{ put("start", new JigsawPool() {{ add(new JigsawPiece("meteor_core", StructureManager.meteor_core) {{ blockTable = bricks; }}, 1); }}); @@ -255,4 +256,13 @@ public class NTMWorldGenerator implements IWorldGenerator { nbtGen.generateStructures(world, rand, chunkProvider, chunkX, chunkZ); } + public SpawnCondition getStructureAt(World world, int chunkX, int chunkZ) { + if(StructureConfig.enableStructures == 0) return null; + if(StructureConfig.enableStructures == 2 && !world.getWorldInfo().isMapFeaturesEnabled()) return null; + + setRandomSeed(world, chunkX, chunkZ); + + return nbtGen.getStructureAt(world, chunkX, chunkZ); + } + } diff --git a/src/main/java/com/hbm/world/gen/INBTTransformable.java b/src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java similarity index 89% rename from src/main/java/com/hbm/world/gen/INBTTransformable.java rename to src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java index 1d2cb8746..0247478e6 100644 --- a/src/main/java/com/hbm/world/gen/INBTTransformable.java +++ b/src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java @@ -1,8 +1,8 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import net.minecraft.block.Block; -public interface INBTTransformable { +public interface INBTBlockTransformable { /** * Defines this block as something that has a rotation or some other blockstate @@ -80,6 +80,30 @@ public interface INBTTransformable { return meta; } + // what in the FUCK mojangles + // same as stairs but 1 & 3 flipped + public static int transformMetaTrapdoor(int meta, int coordBaseMode) { + if(coordBaseMode == 0) return meta; + switch(coordBaseMode) { + case 1: //West + if((meta & 3) < 2) + meta = meta ^ 3; + else + meta = meta ^ 2; + break; + case 2: //North + meta = meta ^ 1; //Flip first bit + break; + case 3: //East + if((meta & 3) < 2) + meta = meta ^ 2; + else + meta = meta ^ 3; + break; + } + return meta; + } + public static int transformMetaPillar(int meta, int coordBaseMode) { if(coordBaseMode == 0 || coordBaseMode == 2) return meta; int type = meta & 3; diff --git a/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java b/src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java similarity index 90% rename from src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java rename to src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java index 33dc141c8..88a05ba2e 100644 --- a/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java +++ b/src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java @@ -1,4 +1,4 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java new file mode 100644 index 000000000..d58a5dcfa --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java @@ -0,0 +1,35 @@ +package com.hbm.world.gen.nbt; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.world.gen.structure.StructureComponent.BlockSelector; + +// Assigned to a Component to build +public class JigsawPiece { + + public final String name; + public final NBTStructure structure; + + // Block modifiers, for randomization and terrain matching + public Map blockTable; + public boolean conformToTerrain = false; // moves every single column to the terrain (digging out trenches, natural formations) + public boolean alignToTerrain = false; // aligns this component y-level individually, without moving individual columns (village houses) + public int heightOffset = 0; // individual offset for the structure + + public JigsawPiece(String name, NBTStructure structure) { + this(name, structure, 0); + } + + public JigsawPiece(String name, NBTStructure structure, int heightOffset) { + if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); + if(NBTStructure.jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); + + this.name = name; + this.structure = structure; + NBTStructure.jigsawMap.put(name, this); + + this.heightOffset = heightOffset; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java b/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java new file mode 100644 index 000000000..aaf0e70d2 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java @@ -0,0 +1,58 @@ +package com.hbm.world.gen.nbt; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.hbm.util.Tuple.Pair; + +// A set of pieces with weights +public class JigsawPool { + + // Weighted list of pieces to pick from + List> pieces = new ArrayList<>(); + int totalWeight = 0; + + public String fallback; + + private boolean isClone; + + public void add(JigsawPiece piece, int weight) { + if(weight <= 0) throw new IllegalStateException("JigsawPool spawn weight must be positive!"); + pieces.add(new Pair<>(piece, weight)); + totalWeight += weight; + } + + protected JigsawPool clone() { + JigsawPool clone = new JigsawPool(); + clone.pieces = new ArrayList<>(this.pieces); + clone.fallback = this.fallback; + clone.totalWeight = this.totalWeight; + clone.isClone = true; + + return clone; + } + + // If from a clone, will remove from the pool + public JigsawPiece get(Random rand) { + if(totalWeight <= 0) return null; + int weight = rand.nextInt(totalWeight); + + for(int i = 0; i < pieces.size(); i++) { + Pair pair = pieces.get(i); + weight -= pair.getValue(); + + if(weight < 0) { + if(isClone) { + pieces.remove(i); + totalWeight -= pair.getValue(); + } + + return pair.getKey(); + } + } + + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java similarity index 84% rename from src/main/java/com/hbm/world/gen/NBTStructure.java rename to src/main/java/com/hbm/world/gen/nbt/NBTStructure.java index 60da4735a..ed1632ee1 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java @@ -1,11 +1,10 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; -import java.util.function.Function; import java.util.function.Predicate; import com.hbm.blocks.ModBlocks; @@ -17,6 +16,7 @@ import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; import com.hbm.util.Tuple.Quartet; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.SpawnCondition.WorldCoordinate; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.*; @@ -31,6 +31,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.IChunkProvider; @@ -53,7 +54,10 @@ public class NBTStructure { * without having to define and register each structure manually */ + private static Map namedMap = new HashMap<>(); + protected static Map> weightedMap = new HashMap<>(); + protected static Map> customSpawnMap = new HashMap<>(); // serialization data protected static Map jigsawMap = new HashMap<>(); @@ -62,7 +66,7 @@ public class NBTStructure { private boolean isLoaded; - private ThreeInts size; + protected ThreeInts size; private List> itemPalette; private BlockState[][][] blockArray; @@ -89,6 +93,17 @@ public class NBTStructure { // Register a new structure for a given dimension public static void registerStructure(int dimensionId, SpawnCondition spawn) { + if(namedMap.containsKey(spawn.name) && namedMap.get(spawn.name) != spawn) + throw new IllegalStateException("A severe error has occurred in NBTStructure! A SpawnCondition has been registered with the same name as another: " + spawn.name); + + namedMap.put(spawn.name, spawn); + + if(spawn.checkCoordinates != null) { + List spawnList = customSpawnMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); + spawnList.add(spawn); + return; + } + List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); for(int i = 0; i < spawn.spawnWeight; i++) { weightedList.add(spawn); @@ -107,10 +122,7 @@ public class NBTStructure { } public static void registerNullWeight(int dimensionId, int weight, Predicate predicate) { - SpawnCondition spawn = new SpawnCondition() {{ - spawnWeight = weight; - canSpawn = predicate; - }}; + SpawnCondition spawn = new SpawnCondition(weight, predicate); List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); for(int i = 0; i < spawn.spawnWeight; i++) { @@ -118,6 +130,19 @@ public class NBTStructure { } } + // Presents a list of all structures registered (so far) + public static List listStructures() { + List names = new ArrayList<>(namedMap.keySet()); + names.sort((a, b) -> a.compareTo(b)); + return names; + } + + // Fetches a registered structure by name, + // If one is not found, will simply return null. + public static SpawnCondition getStructure(String name) { + return namedMap.get(name); + } + // Saves a selected area into an NBT structure (+ some of our non-standard stuff to support 1.7.10) public static void saveArea(String filename, World world, int x1, int y1, int z1, int x2, int y2, int z2, Set> exclude) { NBTTagCompound structure = new NBTTagCompound(); @@ -552,7 +577,7 @@ public class NBTStructure { return selector.func_151561_a(); } - if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformBlock(definition.block); + if(definition.block instanceof INBTBlockTransformable) return ((INBTBlockTransformable) definition.block).transformBlock(definition.block); return definition.block; } @@ -563,22 +588,23 @@ public class NBTStructure { } // Our shit - if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); + if(definition.block instanceof INBTBlockTransformable) return ((INBTBlockTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); if(coordBaseMode == 0) return definition.meta; // Vanilla shit - if(definition.block instanceof BlockStairs) return INBTTransformable.transformMetaStairs(definition.meta, coordBaseMode); - if(definition.block instanceof BlockRotatedPillar) return INBTTransformable.transformMetaPillar(definition.meta, coordBaseMode); - if(definition.block instanceof BlockDirectional) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); - if(definition.block instanceof BlockTorch) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); - if(definition.block instanceof BlockButton) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); - if(definition.block instanceof BlockDoor) return INBTTransformable.transformMetaDoor(definition.meta, coordBaseMode); - if(definition.block instanceof BlockLever) return INBTTransformable.transformMetaLever(definition.meta, coordBaseMode); - if(definition.block instanceof BlockSign) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); - if(definition.block instanceof BlockLadder) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); - if(definition.block instanceof BlockTripWireHook) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); - if(definition.block == Blocks.vine) return INBTTransformable.transformMetaVine(definition.meta, coordBaseMode); + if(definition.block instanceof BlockStairs) return INBTBlockTransformable.transformMetaStairs(definition.meta, coordBaseMode); + if(definition.block instanceof BlockRotatedPillar) return INBTBlockTransformable.transformMetaPillar(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDirectional) return INBTBlockTransformable.transformMetaDirectional(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTorch) return INBTBlockTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockButton) return INBTBlockTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDoor) return INBTBlockTransformable.transformMetaDoor(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLever) return INBTBlockTransformable.transformMetaLever(definition.meta, coordBaseMode); + if(definition.block instanceof BlockSign) return INBTBlockTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLadder) return INBTBlockTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTripWireHook) return INBTBlockTransformable.transformMetaDirectional(definition.meta, coordBaseMode); + if(definition.block instanceof BlockVine) return INBTBlockTransformable.transformMetaVine(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTrapDoor) return INBTBlockTransformable.transformMetaTrapdoor(definition.meta, coordBaseMode); return definition.meta; } @@ -649,152 +675,6 @@ public class NBTStructure { } - public static class SpawnCondition { - - // If defined, will spawn a single jigsaw piece, for single nbt structures - public JigsawPiece structure; - - // If defined, will spawn in a non-nbt structure component - public Function, StructureStart> start; - - public Predicate canSpawn; - public int spawnWeight = 1; - - // Named jigsaw pools that are referenced within the structure - public Map pools; - public String startPool; - - // Maximum amount of components in this structure - public int sizeLimit = 8; - - // How far the structure can extend horizontally from the center, maximum of 128 - // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large - public int rangeLimit = 128; - - // Height modifiers, will clamp height that the start generates at, allowing for: - // * Submarines that must spawn under the ocean surface - // * Bunkers that sit underneath the ground - public int minHeight = 1; - public int maxHeight = 128; - - // Can this spawn in the current biome - protected boolean isValid(BiomeGenBase biome) { - if(canSpawn == null) return true; - return canSpawn.test(biome); - } - - protected JigsawPool getPool(String name) { - return pools.get(name).clone(); - } - - // Builds all of the pools into neat rows and columns, for editing and debugging! - // Make sure structure debug is enabled, or it will no-op - // Do not use in generation - public void buildAll(World world, int x, int y, int z) { - if(!StructureConfig.debugStructures) return; - - int padding = 5; - int oz = 0; - - for(JigsawPool pool : pools.values()) { - int highestWidth = 0; - int ox = 0; - - for(Pair entry : pool.pieces) { - NBTStructure structure = entry.key.structure; - structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); - - ox += structure.size.x + padding; - highestWidth = Math.max(highestWidth, structure.size.z); - } - - oz += highestWidth + padding; - } - } - - } - - // A set of pieces with weights - public static class JigsawPool { - - // Weighted list of pieces to pick from - private List> pieces = new ArrayList<>(); - private int totalWeight = 0; - - public String fallback; - - private boolean isClone; - - public void add(JigsawPiece piece, int weight) { - if(weight <= 0) throw new IllegalStateException("JigsawPool spawn weight must be positive!"); - pieces.add(new Pair<>(piece, weight)); - totalWeight += weight; - } - - protected JigsawPool clone() { - JigsawPool clone = new JigsawPool(); - clone.pieces = new ArrayList<>(this.pieces); - clone.fallback = this.fallback; - clone.totalWeight = this.totalWeight; - clone.isClone = true; - - return clone; - } - - // If from a clone, will remove from the pool - public JigsawPiece get(Random rand) { - if(totalWeight <= 0) return null; - int weight = rand.nextInt(totalWeight); - - for(int i = 0; i < pieces.size(); i++) { - Pair pair = pieces.get(i); - weight -= pair.getValue(); - - if(weight < 0) { - if(isClone) { - pieces.remove(i); - totalWeight -= pair.getValue(); - } - - return pair.getKey(); - } - } - - return null; - } - - } - - // Assigned to a Component to build - public static class JigsawPiece { - - public final String name; - public final NBTStructure structure; - - // Block modifiers, for randomization and terrain matching - public Map blockTable; - public boolean conformToTerrain = false; // moves every single column to the terrain (digging out trenches, natural formations) - public boolean alignToTerrain = false; // aligns this component y-level individually, without moving individual columns (village houses) - public int heightOffset = 0; // individual offset for the structure - - public JigsawPiece(String name, NBTStructure structure) { - this(name, structure, 0); - } - - public JigsawPiece(String name, NBTStructure structure, int heightOffset) { - if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); - if(jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); - - this.name = name; - this.structure = structure; - jigsawMap.put(name, this); - - this.heightOffset = heightOffset; - } - - } - - // Each jigsaw block in a structure will instance one of these private static class JigsawConnection { @@ -872,7 +752,7 @@ public class NBTStructure { // Save to NBT @Override protected void func_143012_a(NBTTagCompound nbt) { - nbt.setString("piece", piece.name); + nbt.setString("piece", piece != null ? piece.name : "NULL"); nbt.setInteger("min", minHeight); nbt.setInteger("max", maxHeight); nbt.setBoolean("hasHeight", heightUpdated); @@ -1055,6 +935,10 @@ public class NBTStructure { } JigsawPool nextPool = spawn.getPool(fromConnection.poolName); + if(nextPool == null) { + MainRegistry.logger.warn("[Jigsaw] Jigsaw block points to invalid pool: " + fromConnection.poolName); + continue; + } Component nextComponent = null; @@ -1119,10 +1003,16 @@ public class NBTStructure { private Component buildNextComponent(Random rand, SpawnCondition spawn, JigsawPool pool, Component fromComponent, JigsawConnection fromConnection) { JigsawPiece nextPiece = pool.get(rand); - if(nextPiece == null) return null; + if(nextPiece == null) { + MainRegistry.logger.warn("[Jigsaw] Pool returned null piece: " + fromConnection.poolName); + return null; + } List connectionPool = getConnectionPool(nextPiece, fromConnection); - if(connectionPool == null) return null; + if(connectionPool == null || connectionPool.isEmpty()) { + MainRegistry.logger.warn("[Jigsaw] No valid connections for: " + fromConnection.targetName + " - in piece: " + nextPiece.name); + return null; + } JigsawConnection toConnection = connectionPool.get(rand.nextInt(connectionPool.size())); @@ -1192,7 +1082,42 @@ public class NBTStructure { @Override protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { - if(!weightedMap.containsKey(worldObj.provider.dimensionId)) return false; + nextSpawn = getSpawnAtCoords(chunkX, chunkZ); + return nextSpawn != null; + } + + public SpawnCondition getStructureAt(World world, int chunkX, int chunkZ) { + // make sure the random is in the correct state + this.worldObj = world; + this.rand.setSeed(world.getSeed()); + long l = this.rand.nextLong(); + long i1 = this.rand.nextLong(); + + long l1 = (long)chunkX * l; + long i2 = (long)chunkZ * i1; + this.rand.setSeed(l1 ^ i2 ^ world.getSeed()); + + // random nextInt call just before `canSpawnStructureAtCoords`, no, I don't know why Mojang added that + this.rand.nextInt(); + + return getSpawnAtCoords(chunkX, chunkZ); + } + + private SpawnCondition getSpawnAtCoords(int chunkX, int chunkZ) { + // attempt to spawn with custom chunk coordinate rules + if (customSpawnMap.containsKey(worldObj.provider.dimensionId)) { + WorldCoordinate coords = new WorldCoordinate(worldObj, new ChunkCoordIntPair(chunkX, chunkZ), rand); + + List spawnList = customSpawnMap.get(worldObj.provider.dimensionId); + for (SpawnCondition spawn : spawnList) { + if ((spawn.pools != null || spawn.structure != null) && spawn.checkCoordinates.test(coords)) { + return spawn; + } + } + } + + if (!weightedMap.containsKey(worldObj.provider.dimensionId)) + return null; int x = chunkX; int z = chunkZ; @@ -1208,15 +1133,16 @@ public class NBTStructure { x += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); z += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); - if(chunkX == x && chunkZ == z) { + if (chunkX == x && chunkZ == z) { BiomeGenBase biome = this.worldObj.getWorldChunkManager().getBiomeGenAt(chunkX * 16 + 8, chunkZ * 16 + 8); - nextSpawn = findSpawn(biome); + SpawnCondition spawn = findSpawn(biome); - return nextSpawn != null && (nextSpawn.pools != null || nextSpawn.start != null || nextSpawn.structure != null); + if(spawn != null && (spawn.pools != null || spawn.start != null || spawn.structure != null)) + return spawn; } - return false; + return null; } @Override diff --git a/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java new file mode 100644 index 000000000..b623ea864 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java @@ -0,0 +1,115 @@ +package com.hbm.world.gen.nbt; + +import java.util.Map; +import java.util.Random; +import java.util.function.Function; +import java.util.function.Predicate; + +import com.hbm.config.StructureConfig; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.Tuple.Quartet; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.gen.structure.StructureStart; + +public class SpawnCondition { + + public final String name; + + // If defined, will spawn a single jigsaw piece, for single nbt structures + public JigsawPiece structure; + + // If defined, will spawn in a non-nbt structure component + public Function, StructureStart> start; + + // If defined, will override regular spawn location checking, for placing at specific coordinates or with special rules + public Predicate checkCoordinates; + + // Our regular spawning mechanics, based on biome, you should generally use these + public Predicate canSpawn; + public int spawnWeight = 1; + + // Named jigsaw pools that are referenced within the structure + public Map pools; + public String startPool; + + // Maximum amount of components in this structure + public int sizeLimit = 8; + + // How far the structure can extend horizontally from the center, maximum of 128 + // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large + public int rangeLimit = 128; + + // Height modifiers, will clamp height that the start generates at, allowing for: + // * Submarines that must spawn under the ocean surface + // * Bunkers that sit underneath the ground + public int minHeight = 1; + public int maxHeight = 128; + + protected SpawnCondition(int weight, Predicate predicate) { + name = null; + spawnWeight = weight; + canSpawn = predicate; + } + + public SpawnCondition(String name) { + this.name = name; + } + + // Can this spawn in the current biome + protected boolean isValid(BiomeGenBase biome) { + if(canSpawn == null) return true; + return canSpawn.test(biome); + } + + protected JigsawPool getPool(String name) { + JigsawPool pool = pools.get(name); + return pool != null ? pool.clone() : null; + } + + // Builds all of the pools into neat rows and columns, for editing and debugging! + // Make sure structure debug is enabled, or it will no-op + // Do not use in generation + public void buildAll(World world, int x, int y, int z) { + if(!StructureConfig.debugStructures) return; + + int padding = 5; + int oz = 0; + + for(JigsawPool pool : pools.values()) { + int highestWidth = 0; + int ox = 0; + + for(Pair entry : pool.pieces) { + NBTStructure structure = entry.key.structure; + structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); + + ox += structure.size.x + padding; + highestWidth = Math.max(highestWidth, structure.size.z); + } + + oz += highestWidth + padding; + } + } + + /** + * Provides information about the current structure gen chunk, + * use the included random for consistent seeding! + */ + public static class WorldCoordinate { + + public final World world; + public final ChunkCoordIntPair coords; + public final Random rand; + + protected WorldCoordinate(World world, ChunkCoordIntPair coords, Random rand) { + this.world = world; + this.coords = coords; + this.rand = rand; + } + + } + +} \ No newline at end of file diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 32d100935..608213a68 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -705,6 +705,10 @@ commands.satellite.satellite_descended=Satellite successfully descended. commands.satellite.satellite_orbited=Satellite launched. commands.satellite.should_be_run_as_player=This command should be run by a player! +commands.locate.no_match=No structures with that name! +commands.locate.none_found=No structures found nearby! +commands.locate.success.coordinates=Structure %s found at %d, %d + container.ammoBag=Ammo Bag container.amsBase=AMS Base (Deco) container.amsEmitter=AMS Emitter (Deco) From 0c5c7a415050160736de9ea54bfb7575e5fc51ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=81=93=E7=A5=9E=20=E9=A6=B4=E5=AD=90?= Date: Fri, 8 Aug 2025 14:37:24 +0800 Subject: [PATCH 163/323] bee --- src/main/resources/assets/hbm/lang/zh_CN.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 902096a3f..c220e14b9 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6137,3 +6137,4 @@ item.gun_autoshotgun_heretic.name=异教徒 purex.schrab=从 %s 中萃取Sa326 tile.machine_purex.name=钚铀还原提取设备(PUREX) tile.machine_purex.desc=可用于多种核燃料的再处理机器。$大多数配方需要用到硝酸和煤油。 +qmaw.tab=[按 %s 键获取帮助] From 7213b9b84d111ff67779710aba622009b2b5d6e4 Mon Sep 17 00:00:00 2001 From: George Paton Date: Fri, 8 Aug 2025 16:53:13 +1000 Subject: [PATCH 164/323] move jiggy map --- src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java | 8 ++++++-- src/main/java/com/hbm/world/gen/nbt/NBTStructure.java | 5 +---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java index d58a5dcfa..039f8d154 100644 --- a/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java +++ b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java @@ -1,5 +1,6 @@ package com.hbm.world.gen.nbt; +import java.util.HashMap; import java.util.Map; import net.minecraft.block.Block; @@ -8,6 +9,9 @@ import net.minecraft.world.gen.structure.StructureComponent.BlockSelector; // Assigned to a Component to build public class JigsawPiece { + // Translates a given name into a jigsaw piece, for serialization + protected static Map jigsawMap = new HashMap<>(); + public final String name; public final NBTStructure structure; @@ -23,11 +27,11 @@ public class JigsawPiece { public JigsawPiece(String name, NBTStructure structure, int heightOffset) { if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); - if(NBTStructure.jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); + if(jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); this.name = name; this.structure = structure; - NBTStructure.jigsawMap.put(name, this); + jigsawMap.put(name, this); this.heightOffset = heightOffset; } diff --git a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java index ed1632ee1..385644257 100644 --- a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java @@ -59,9 +59,6 @@ public class NBTStructure { protected static Map> weightedMap = new HashMap<>(); protected static Map> customSpawnMap = new HashMap<>(); - // serialization data - protected static Map jigsawMap = new HashMap<>(); - private String name; private boolean isLoaded; @@ -761,7 +758,7 @@ public class NBTStructure { // Load from NBT @Override protected void func_143011_b(NBTTagCompound nbt) { - piece = jigsawMap.get(nbt.getString("piece")); + piece = JigsawPiece.jigsawMap.get(nbt.getString("piece")); minHeight = nbt.getInteger("min"); maxHeight = nbt.getInteger("max"); heightUpdated = nbt.getBoolean("hasHeight"); From 3f72a93d2802da8cbd1b1a76cf1705a097988ca6 Mon Sep 17 00:00:00 2001 From: George Paton Date: Fri, 8 Aug 2025 18:44:29 +1000 Subject: [PATCH 165/323] tandems! checking if all the affected chunks have generated yet has NOT yet been implemented tho --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../hbm/blocks/generic/BlockWandTandem.java | 438 ++++++++++++++++++ .../java/com/hbm/commands/CommandLocate.java | 2 +- .../java/com/hbm/main/StructureManager.java | 2 + .../java/com/hbm/tileentity/TileMappings.java | 2 + .../com/hbm/world/gen/nbt/NBTStructure.java | 80 +++- .../com/hbm/world/gen/nbt/SpawnCondition.java | 2 +- .../hbm/structures/test-tandem-core.nbt | Bin 0 -> 453 bytes .../assets/hbm/structures/test-tandem.nbt | Bin 0 -> 455 bytes .../hbm/textures/blocks/wand_tandem.png | Bin 0 -> 543 bytes .../hbm/textures/blocks/wand_tandem_back.png | Bin 0 -> 557 bytes .../hbm/textures/blocks/wand_tandem_side.png | Bin 0 -> 549 bytes .../hbm/textures/blocks/wand_tandem_top.png | Bin 0 -> 562 bytes 13 files changed, 503 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandTandem.java create mode 100644 src/main/resources/assets/hbm/structures/test-tandem-core.nbt create mode 100644 src/main/resources/assets/hbm/structures/test-tandem.nbt create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_tandem.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_tandem_back.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_tandem_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 99824c4d8..87269420e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1248,6 +1248,7 @@ public class ModBlocks { public static Block wand_loot; public static Block wand_jigsaw; public static Block wand_logic; + public static Block wand_tandem; public static Block logic_block; @@ -2411,6 +2412,7 @@ public class ModBlocks { wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); wand_logic = new BlockWandLogic().setBlockName("wand_logic").setBlockTextureName(RefStrings.MODID + ":wand_logic"); + wand_tandem = new BlockWandTandem().setBlockName("wand_tandem").setBlockTextureName(RefStrings.MODID + ":wand_tandem"); logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); @@ -3569,6 +3571,7 @@ public class ModBlocks { register(wand_loot); register(wand_jigsaw); register(wand_logic); + register(wand_tandem); register(logic_block); } diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java new file mode 100644 index 000000000..1ad176e63 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java @@ -0,0 +1,438 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Keyboard; + +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.INBTBlockTransformable; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure.JigsawConnection; +import com.hbm.world.gen.nbt.SpawnCondition; +import com.hbm.world.gen.nbt.JigsawPiece; +import com.hbm.world.gen.nbt.JigsawPool; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockPistonBase; +import net.minecraft.block.material.Material; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * You're familiar with Billy Mitchell, World Video Game Champion? He could probably do it. + * So I gotta find a way to harness his power. And I think I've found a way. + * + * THAT'S RIGHT, WE'RE GONNA CHEAT. + * + * NBTStructures have the inherent flaws of the vanilla structure system: Structures are composed + * before terrain gen even kicks in, placement order of components are arbitrary and certain + * connected parts will fall apart due to unexpected variance in the terrain. Not good. + * The solution: Simply delay generation of parts using a tile entity that checks if the chunks + * in front of it are loaded, and then places a random part from the chosen pool. When this happens, + * the player is usually still far far away so they'll be none the wiser. Chunk load checks help + * prevent forced chunk loading and all the lag that comes with that. + * + * The system is named after tandem shaped charges: Make a hole with the first charge, then deliver + * the actual payload. + * + * @author hbm, Mellow + */ +public class BlockWandTandem extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay { + + private IIcon iconTop; + private IIcon iconSide; + private IIcon iconBack; + + public BlockWandTandem() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityWandTandem(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + int l = BlockPistonBase.determineOrientation(world, x, y, z, player); + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_side"); + this.iconBack = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_back"); + } + + @Override + public IIcon getIcon(int side, int meta) { + if(side == meta) return blockIcon; + if(IBlockSideRotation.isOpposite(side, meta)) return iconBack; + if(side <= 1) return iconTop; + if(side > 3 && meta <= 1) return iconTop; + return iconSide; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(getRotationFromSide(world, x, y, z, 1)); + + int meta = world.getBlockMetadata(x, y, z); + if(side == meta || IBlockSideRotation.isOpposite(side, meta)) return 0; + + // downwards facing has no changes, upwards flips anything not handled already + if(meta == 0) return 0; + if(meta == 1) return 3; + + // top (and bottom) is rotated fairly normally + if(side == 1) { + switch(meta) { + case 2: return 3; + case 3: return 0; + case 4: return 1; + case 5: return 2; + } + } + + // you know what I aint explaining further, it's a fucking mess here + if(meta == 2) return side == 4 ? 2 : 1; + if(meta == 3) return side == 4 ? 1 : 2; + if(meta == 4) return side == 2 ? 1 : 2; + if(meta == 5) return side == 2 ? 2 : 1; + + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandTandem)) return false; + + TileEntityWandTandem jigsaw = (TileEntityWandTandem) te; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == Items.paper) { + TileEntityWandTandem.copyMode = true; + if(!player.getHeldItem().hasTagCompound()) { + player.getHeldItem().stackTagCompound = new NBTTagCompound(); + jigsaw.writeToNBT(player.getHeldItem().stackTagCompound); + } else { + jigsaw.readFromNBT(player.getHeldItem().stackTagCompound); + jigsaw.markDirty(); + } + TileEntityWandTandem.copyMode = false; + return true; + } + + if(!player.isSneaking()) { + Block block = getBlock(world, player.getHeldItem()); + if(block == ModBlocks.wand_air) block = Blocks.air; + + if(block != null && block != ModBlocks.wand_jigsaw && block != ModBlocks.wand_loot) { + jigsaw.replaceBlock = block; + jigsaw.replaceMeta = player.getHeldItem().getItemDamage(); + jigsaw.markDirty(); + + return true; + } + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) return false; + + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + + return true; + } + + return false; + } + + private Block getBlock(World world, ItemStack stack) { + if(stack == null) return null; + if(!(stack.getItem() instanceof ItemBlock)) return null; + + return ((ItemBlock) stack.getItem()).field_150939_a; + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GuiWandTandem((TileEntityWandTandem) world.getTileEntity(x, y, z)); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof TileEntityWandTandem)) return; + TileEntityWandTandem jigsaw = (TileEntityWandTandem) te; + + List text = new ArrayList(); + + text.add(EnumChatFormatting.GRAY + "Target pool: " + EnumChatFormatting.RESET + jigsaw.pool); + text.add(EnumChatFormatting.GRAY + "Target name: " + EnumChatFormatting.RESET + jigsaw.target); + text.add(EnumChatFormatting.GRAY + "Turns into: " + EnumChatFormatting.RESET + GameRegistry.findUniqueIdentifierFor(jigsaw.replaceBlock).toString()); + text.add(EnumChatFormatting.GRAY + " with meta: " + EnumChatFormatting.RESET + jigsaw.replaceMeta); + text.add(EnumChatFormatting.GRAY + "Joint type: " + EnumChatFormatting.RESET + (jigsaw.isRollable ? "Rollable" : "Aligned")); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + + public static class TileEntityWandTandem extends TileEntityLoadedBase implements IControlReceiver { + + public static boolean copyMode = false; + + private String pool = "default"; + private String target = "default"; + private Block replaceBlock = Blocks.air; + private int replaceMeta = 0; + private boolean isRollable = true; // sets joint type, rollable joints can be placed in any orientation for vertical jigsaw connections + + private boolean isArmed = false; + private SpawnCondition structure; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + tryGenerate(); + networkPackNT(15); + } + } + + private void tryGenerate() { + if(!this.isArmed || target == null || target.isEmpty() || pool == null || pool.isEmpty()) return; + + JigsawPool pool = structure.getPool(this.pool); + if(pool == null) return; + + JigsawPiece nextPiece = pool.get(worldObj.rand); + if(nextPiece == null) return; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); + + List connectionPool = nextPiece.structure.getConnectionPool(dir, target); + if(connectionPool == null) return; + + JigsawConnection toConnection = connectionPool.get(worldObj.rand.nextInt(connectionPool.size())); + int nextCoordBase = directionOffsetToCoordBase(dir.getOpposite(), toConnection.dir); + + BlockPos pos = new BlockPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + + // offset the starting point to the connecting point + int ox = nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int oy = toConnection.pos.y; + int oz = nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + + nextPiece.structure.build(worldObj, nextPiece, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase, structure.name); + + worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2); + } + + private int directionOffsetToCoordBase(ForgeDirection from, ForgeDirection to) { + for(int i = 0; i < 4; i++) { + if(from == to) return i % 4; + from = from.getRotation(ForgeDirection.DOWN); + } + return 0; + } + + @Override + public void serialize(ByteBuf buf) { + BufferUtil.writeString(buf, pool); + BufferUtil.writeString(buf, target); + buf.writeInt(Block.getIdFromBlock(replaceBlock)); + buf.writeInt(replaceMeta); + buf.writeBoolean(isRollable); + } + + @Override + public void deserialize(ByteBuf buf) { + pool = BufferUtil.readString(buf); + target = BufferUtil.readString(buf); + replaceBlock = Block.getBlockById(buf.readInt()); + replaceMeta = buf.readInt(); + isRollable = buf.readBoolean(); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + if(!copyMode) { + super.writeToNBT(nbt); + nbt.setInteger("direction", this.getBlockMetadata()); + if(isArmed) { + nbt.setBoolean("isArmed", isArmed); + nbt.setString("structure", structure.name); + } + } + + nbt.setString("pool", pool); + nbt.setString("target", target); + nbt.setString("block", GameRegistry.findUniqueIdentifierFor(replaceBlock).toString()); + nbt.setInteger("meta", replaceMeta); + nbt.setBoolean("roll", isRollable); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + if(!copyMode) { + super.readFromNBT(nbt); + isArmed = nbt.getBoolean("isArmed"); + structure = NBTStructure.getStructure(nbt.getString("structure")); + } + + pool = nbt.getString("pool"); + target = nbt.getString("target"); + replaceBlock = Block.getBlockFromName(nbt.getString("block")); + replaceMeta = nbt.getInteger("meta"); + isRollable = nbt.getBoolean("roll"); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return true; + } + + @Override + public void receiveControl(NBTTagCompound nbt) { + readFromNBT(nbt); + markDirty(); + } + + public void arm(SpawnCondition structure) { + isArmed = true; + this.structure = structure; + } + + } + + public static class GuiWandTandem extends GuiScreen { + + private final TileEntityWandTandem jigsaw; + + private GuiTextField textPool; + private GuiTextField textTarget; + + private GuiButton jointToggle; + + public GuiWandTandem(TileEntityWandTandem jigsaw) { + this.jigsaw = jigsaw; + } + + @Override + public void initGui() { + Keyboard.enableRepeatEvents(true); + + textPool = new GuiTextField(fontRendererObj, this.width / 2 - 150, 50, 300, 20); + textPool.setText(jigsaw.pool); + + textTarget = new GuiTextField(fontRendererObj, this.width / 2 + 10, 100, 140, 20); + textTarget.setText(jigsaw.target); + + jointToggle = new GuiButton(0, this.width / 2 + 60, 150, 90, 20, jigsaw.isRollable ? "Rollable" : "Aligned"); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + + drawString(fontRendererObj, "Target pool:", this.width / 2 - 150, 37, 0xA0A0A0); + textPool.drawTextBox(); + + drawString(fontRendererObj, "Target name:", this.width / 2 + 10, 87, 0xA0A0A0); + textTarget.drawTextBox(); + + drawString(fontRendererObj, "Joint type:", this.width / 2 + 60, 137, 0xA0A0A0); + jointToggle.drawButton(mc, mouseX, mouseY); + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + + NBTTagCompound data = new NBTTagCompound(); + jigsaw.writeToNBT(data); + + data.setString("pool", textPool.getText()); + data.setString("target", textTarget.getText()); + data.setBoolean("roll", jointToggle.displayString == "Rollable"); + + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, jigsaw.xCoord, jigsaw.yCoord, jigsaw.zCoord)); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + super.keyTyped(typedChar, keyCode); + textPool.textboxKeyTyped(typedChar, keyCode); + textTarget.textboxKeyTyped(typedChar, keyCode); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) { + super.mouseClicked(mouseX, mouseY, mouseButton); + textPool.mouseClicked(mouseX, mouseY, mouseButton); + textTarget.mouseClicked(mouseX, mouseY, mouseButton); + + if(jointToggle.mousePressed(mc, mouseX, mouseY)) { + jointToggle.displayString = jointToggle.displayString == "Rollable" ? "Aligned" : "Rollable"; + } + } + + @Override public boolean doesGuiPauseGame() { return false; } + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/commands/CommandLocate.java b/src/main/java/com/hbm/commands/CommandLocate.java index b0a7f8948..ec646c817 100644 --- a/src/main/java/com/hbm/commands/CommandLocate.java +++ b/src/main/java/com/hbm/commands/CommandLocate.java @@ -21,7 +21,7 @@ import net.minecraft.world.World; public class CommandLocate extends CommandBase { - private static final int MAX_DISTANCE = 256; + private static final int MAX_DISTANCE = 256; @Override public String getCommandName() { diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 077a3665f..e740331f3 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -68,5 +68,7 @@ public class StructureManager { // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); // public static final NBTStructure test_jigsaw_hall = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-hall.nbt")); + // public static final NBTStructure test_tandem_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-tandem-core.nbt")); + // public static final NBTStructure test_tandem = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-tandem.nbt")); } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index bae45ddca..63bc3640e 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -20,6 +20,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandTandem.TileEntityWandTandem; import com.hbm.blocks.generic.BlockWandLogic.TileEntityWandLogic; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.LogicBlock; @@ -243,6 +244,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); put(TileEntityWandLogic.class, "tileentity_wand_spawner"); + put(TileEntityWandTandem.class, "tileentity_wand_tandem"); putNetwork(); putBombs(); diff --git a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java index 385644257..2bf7de38c 100644 --- a/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java @@ -9,6 +9,7 @@ import java.util.function.Predicate; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockWand; +import com.hbm.blocks.generic.BlockWandTandem.TileEntityWandTandem; import com.hbm.config.GeneralConfig; import com.hbm.config.StructureConfig; import com.hbm.handler.ThreeInts; @@ -421,7 +422,7 @@ public class NBTStructure { return worldItemPalette; } - private TileEntity buildTileEntity(World world, Block block, HashMap worldItemPalette, NBTTagCompound nbt, int coordBaseMode) { + private TileEntity buildTileEntity(World world, Block block, HashMap worldItemPalette, NBTTagCompound nbt, int coordBaseMode, String structureName) { nbt = (NBTTagCompound)nbt.copy(); if(worldItemPalette != null) relinkItems(worldItemPalette, nbt); @@ -432,6 +433,10 @@ public class NBTStructure { ((INBTTileEntityTransformable) te).transformTE(world, coordBaseMode); } + if(te instanceof TileEntityWandTandem) { + ((TileEntityWandTandem) te).arm(getStructure(structureName)); + } + return te; } @@ -471,7 +476,7 @@ public class NBTStructure { world.setBlock(rx, ry, rz, block, meta, 2); if(state.nbt != null) { - TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode, null); world.setTileEntity(rx, ry, rz, te); } } @@ -479,7 +484,23 @@ public class NBTStructure { } } - protected boolean build(World world, JigsawPiece piece, StructureBoundingBox totalBounds, StructureBoundingBox generatingBounds, int coordBaseMode) { + // Used to construct tandems + public void build(World world, JigsawPiece piece, int x, int y, int z, int coordBaseMode, String structureName) { + StructureBoundingBox bb; + switch(coordBaseMode) { + case 1: + case 3: + bb = new StructureBoundingBox(x, y, z, x + piece.structure.size.z - 1, y + piece.structure.size.y - 1, z + piece.structure.size.x - 1); + break; + default: + bb = new StructureBoundingBox(x, y, z, x + piece.structure.size.x - 1, y + piece.structure.size.y - 1, z + piece.structure.size.z - 1); + break; + } + + build(world, piece, bb, bb, coordBaseMode, structureName); + } + + protected boolean build(World world, JigsawPiece piece, StructureBoundingBox totalBounds, StructureBoundingBox generatingBounds, int coordBaseMode, String structureName) { if(!isLoaded) { MainRegistry.logger.info("NBTStructure is invalid"); return false; @@ -528,7 +549,7 @@ public class NBTStructure { world.setBlock(rx, ry, rz, block, meta, 2); if(state.nbt != null) { - TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode, structureName); world.setTileEntity(rx, ry, rz, te); } } @@ -538,6 +559,16 @@ public class NBTStructure { return true; } + public List getConnectionPool(ForgeDirection dir, String target) { + if(dir == ForgeDirection.DOWN) { + return toTopConnections.get(target); + } else if(dir == ForgeDirection.UP) { + return toBottomConnections.get(target); + } + + return toHorizontalConnections.get(target); + } + // What a fucken mess, why even implement the IntArray NBT if ye aint gonna use it Moe Yang? private ThreeInts parsePos(NBTTagList pos) { NBTBase xb = (NBTBase)pos.tagList.get(0); @@ -605,7 +636,7 @@ public class NBTStructure { return definition.meta; } - private int rotateX(int x, int z, int coordBaseMode) { + public int rotateX(int x, int z, int coordBaseMode) { switch(coordBaseMode) { case 1: return size.z - 1 - z; case 2: return size.x - 1 - x; @@ -614,7 +645,7 @@ public class NBTStructure { } } - private int rotateZ(int x, int z, int coordBaseMode) { + public int rotateZ(int x, int z, int coordBaseMode) { switch(coordBaseMode) { case 1: return x; case 2: return size.z - 1 - z; @@ -673,10 +704,10 @@ public class NBTStructure { } // Each jigsaw block in a structure will instance one of these - private static class JigsawConnection { + public static class JigsawConnection { - private final ThreeInts pos; - private final ForgeDirection dir; + public final ThreeInts pos; + public final ForgeDirection dir; // what pool should we look through to find a connection private final String poolName; @@ -772,14 +803,14 @@ public class NBTStructure { if(!piece.conformToTerrain && !heightUpdated) { int y = MathHelper.clamp_int(getAverageHeight(world, box) + piece.heightOffset, minHeight, maxHeight); - if(!piece.alignToTerrain && parent != null) { + if(!piece.alignToTerrain) { parent.offsetYHeight(y); } else { offsetYHeight(y); } } - return piece.structure.build(world, piece, boundingBox, box, coordBaseMode); + return piece.structure.build(world, piece, boundingBox, box, coordBaseMode, parent.name); } public void offsetYHeight(int y) { @@ -876,12 +907,16 @@ public class NBTStructure { public static class Start extends StructureStart { + public String name; + public Start() {} @SuppressWarnings("unchecked") public Start(World world, Random rand, SpawnCondition spawn, int chunkX, int chunkZ) { super(chunkX, chunkZ); + name = spawn.name; + int x = chunkX << 4; int z = chunkZ << 4; @@ -966,7 +1001,7 @@ public class NBTStructure { } if(GeneralConfig.enableDebugMode) { - MainRegistry.logger.info("[Debug] Spawning NBT structure with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); + MainRegistry.logger.info("[Debug] Spawning NBT structure " + name + " with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); String componentList = "[Debug] Components: "; for(Object component : this.components) { componentList += ((Component) component).piece.structure.name + " "; @@ -1005,7 +1040,7 @@ public class NBTStructure { return null; } - List connectionPool = getConnectionPool(nextPiece, fromConnection); + List connectionPool = nextPiece.structure.getConnectionPool(fromConnection.dir, fromConnection.targetName); if(connectionPool == null || connectionPool.isEmpty()) { MainRegistry.logger.warn("[Jigsaw] No valid connections for: " + fromConnection.targetName + " - in piece: " + nextPiece.name); return null; @@ -1026,16 +1061,6 @@ public class NBTStructure { return new Component(spawn, nextPiece, rand, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase).connectedFrom(toConnection); } - private List getConnectionPool(JigsawPiece nextPiece, JigsawConnection fromConnection) { - if(fromConnection.dir == ForgeDirection.DOWN) { - return nextPiece.structure.toTopConnections.get(fromConnection.targetName); - } else if(fromConnection.dir == ForgeDirection.UP) { - return nextPiece.structure.toBottomConnections.get(fromConnection.targetName); - } - - return nextPiece.structure.toHorizontalConnections.get(fromConnection.targetName); - } - private int getDistanceTo(StructureBoundingBox box) { int x = box.getCenterX(); int z = box.getCenterZ(); @@ -1045,12 +1070,19 @@ public class NBTStructure { // post loading, update parent reference for loaded components @Override - public void func_143017_b(NBTTagCompound nbt) { + public void func_143017_b(NBTTagCompound nbt) { // readFromNBT + name = nbt.getString("name"); + for(Object o : components) { ((Component) o).parent = this; } } + @Override + public void func_143022_a(NBTTagCompound nbt) { // writeToNBT + nbt.setString("name", name); + } + public void offsetYHeight(int y) { for(Object o : components) { Component component = (Component) o; diff --git a/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java index b623ea864..f84d3aad8 100644 --- a/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java +++ b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java @@ -64,7 +64,7 @@ public class SpawnCondition { return canSpawn.test(biome); } - protected JigsawPool getPool(String name) { + public JigsawPool getPool(String name) { JigsawPool pool = pools.get(name); return pool != null ? pool.clone() : null; } diff --git a/src/main/resources/assets/hbm/structures/test-tandem-core.nbt b/src/main/resources/assets/hbm/structures/test-tandem-core.nbt new file mode 100644 index 0000000000000000000000000000000000000000..34a426eacbe3e805ca44c1c4b9a2d11970ace64f GIT binary patch literal 453 zcmV;$0XqI4iwFP!000000L_-cPQx$^hMgv5ZMh;OUV;N?9C!${H<-HCgNn47+6)9w z&$`XgKwWHcTBTM>``K~)+er(69L&&sqXvNSPU+4e!_GIp!2!lAhpUx!)%#HF22VNY zjT^`)TpH5BmmZH6Q;ZTYiGa}p#xRT$#HyewJOm^t%VP z8uGg7vGR@U#sp<><;(sReVFM_=*fg6>I@T;gqWBl#OO;)lNP7xRN-WT;VOlgSjC0i zPr$?^2|JR2iFHZnZieC3PE5>?5v-jUb!lakvSmb}pGu<7FfmDp;Zn&Rj>K?&xPy-v z&JTC+5ySc6N{yIUdk_ioGgcaAAJ`9vzEJQ33dIPiqzV84S`*$6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/test-tandem.nbt b/src/main/resources/assets/hbm/structures/test-tandem.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ba23b9b0c5efb36214e50f433ce67a226998b88b GIT binary patch literal 455 zcmV;&0XY62iwFP!000000F9PSPQx$|g~y58{IEqxTmpfFSa1l`8&qyGEe0o!5|;{2 zPtta*B2tedd6D>==XoB-b_q~`9P|&S05G)$wE}W%opu@rn4SWb8)K`_p&Vac3P?LU zP>_F8SPV`%JV(qi;tx|o+HPD9va{AeR^wLfjT0byYmCTY=~TZ%=X+8p1~gbXZQIj; zvO%XNB>`Ep-);@oFzU6cK_8XF;+Q+!zi*mXrwu+-wyk<}xUQ_RJ=QrSx`w-{?`Zpb zeNb(^{?NNY9mY{Rqbh91uG6SRt$Uw^yka%Euqv)FX~dLCh7l1{FCui32%RKCCymfa zBXnehj{LWz=9wgd;c6k7oCOsuf(hkJOekk!LOBz|<;=}9F(I8K!aFe`@5F?>6BF`I z43{(KotTi0|5qcJkaz!&MKB@ne!Vgb=bf04j*Re5OvpPiA@9V5yc5Ia%T&Oh7>nCiCDk>8;dHpV6T{Vu+gFL<>NU5bQt+B2vIcGu$h{%+o zs-%=20CUcW2q`66Ys45Q-F@G=TrN|)a}E)q);gI;t(D$8x3{&CSh>Qc_BkQW#^Ps>B%CwhdJ!guvqk&N*U?9LE9hz(!Ts_Z?NGlroJ2 zD5cPQM?^TK9>*~y1BjV%xm@VI&n;t&sk7EPJF;yXA%s~rRYkr%{WNKwU2x9LPMpm< zQ@OvtM?`SW@%72ahbo@~z;s$w@!n5!*L9s{o^j49_ugr(;k}=RoisxTGyAjB*Xwo8 vy8plP%U|zi=Bhg7l~Tw#^W*uKf4=h{fKn$%i%U(i00000NkvXXu0mjfpe_Kk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7389799c1be8f02dd81728c258d064e3f15c12e7 GIT binary patch literal 549 zcmV+=0^0qFP))y8~m>G-3g5`1vz%)(N zT5)&IZ=I}PCvjHm!OxetJ6+e|?u_GznbCD!6xUjrriq+0stUlDJEz#(p>11o&J4p4 z^uF%{VrGa4UDt&wU%hu=ez3);2~d#Z|jy8SNv%x~d3WM}V)QVLzyad~+e5uV>VS-nIc zVw)$es@#A4nw&GG6qd_n40DbXKmgpGX_{!7CK8!twrv|j6A=Kmx3}YNy8fMae>{)O nRWVVKQpSq&B^)BJ!Lqll}qQw&qt^#o6UxC905ovQER1?!pEbR zm&Y-j)O!5;8Ko4w_momt*A-R8d*3hDT1hDpW5iku!1rr!(e}bH48#}-A$0X+S-Oa- zA|iP2yDIFk)(NoP zZhN>fMsm)SQaCs`=&RIaS+Le(jKNxqbB?pKGXOq)c-0Xas`tLT$T=g{TIPAiTFbhw zJ-Fk$Py6NDcb?EtbIu(ZKvb1!nkc38q-(8vyKfk~-Hu@xdfBYC$mc7s|M6UO!5G8; zC+Cd!p7Zl_L Date: Sun, 10 Aug 2025 20:07:53 +0200 Subject: [PATCH 166/323] drowned in the slop, forgotten in the slurry --- changelog | 9 ++ .../gui/GUIMachineSolderingStation.java | 4 + .../hbm/qmaw/components/QComponentLink.java | 4 +- .../machine/TileEntityMachineShredder.java | 143 ++++++++---------- .../resources/assets/hbm/manual/arsenic.json | 11 ++ .../assets/hbm/manual/arsenic_bronze.json | 11 ++ .../resources/assets/hbm/manual/bismuth.json | 11 ++ .../assets/hbm/manual/bismuth_bronze.json | 11 ++ .../resources/assets/hbm/manual/bscco.json | 11 ++ .../resources/assets/hbm/manual/cadmium.json | 11 ++ .../assets/hbm/manual/ferrouranium.json | 11 ++ .../resources/assets/hbm/manual/silicon.json | 2 +- .../assets/hbm/manual/tantalium.json | 11 ++ 13 files changed, 166 insertions(+), 84 deletions(-) create mode 100644 src/main/resources/assets/hbm/manual/arsenic.json create mode 100644 src/main/resources/assets/hbm/manual/arsenic_bronze.json create mode 100644 src/main/resources/assets/hbm/manual/bismuth.json create mode 100644 src/main/resources/assets/hbm/manual/bismuth_bronze.json create mode 100644 src/main/resources/assets/hbm/manual/bscco.json create mode 100644 src/main/resources/assets/hbm/manual/cadmium.json create mode 100644 src/main/resources/assets/hbm/manual/ferrouranium.json create mode 100644 src/main/resources/assets/hbm/manual/tantalium.json diff --git a/changelog b/changelog index fa5fe2270..01b3f2283 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,15 @@ +## Added +* QMAW (quick manual and wiki) + * It's a simple ingame manual that can be found by pressing F1 on items (like the WIAJ presentations) + * Supports text and links and not much else + * Easy to make entries for, the system scans `assets/manual` for valid `.json` format files + * Should also work in resource packs (no recent tests for that, not going to make promises) + * Still WIP, many new info pages are yet to be made + ## Changed * All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed * The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too +* The shredder's sound will now start immediately when processing instead of with random delay ## Fixed * Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java index 7e718b9f9..e2283b312 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java @@ -69,6 +69,10 @@ public class GUIMachineSolderingStation extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(solderer.collisionPrevention) { + drawTexturedModalRect(guiLeft + 5, guiTop + 66, 192, 14, 10, 10); + } int p = (int) (solderer.power * 52 / Math.max(solderer.maxPower, 1)); drawTexturedModalRect(guiLeft + 152, guiTop + 70 - p, 176, 52 - p, 16, p); diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java index 97402d9fb..c2816835e 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentLink.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -68,8 +68,8 @@ public class QComponentLink extends ManualElement { GL11.glRotated(180, 1, 0, 0); RenderHelper.enableStandardItemLighting(); GL11.glRotated(-180, 1, 0, 0); - itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y); - itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y, null); + itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y - 1); + itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y - 1, null); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index 5fe3ae5ca..b3589fd45 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -32,7 +32,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public static final long maxPower = 10000; public static final int processingSpeed = 60; - private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}; + private static final int[] slots_io = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; private String customName; @@ -52,21 +52,19 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @Override public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { + if(slots[i] != null) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } else { - return null; + return null; } } @Override public void setInventorySlotContents(int i, ItemStack itemStack) { slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { itemStack.stackSize = getInventoryStackLimit(); } } @@ -93,42 +91,44 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @Override public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + } else { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64; } } - //You scrubs aren't needed for anything (right now) + // You scrubs aren't needed for anything (right now) @Override - public void openInventory() {} + public void openInventory() { + } + @Override - public void closeInventory() {} + public void closeInventory() { + } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - if(i < 9) return ShredderRecipes.getShredderResult(stack) != null && !(stack.getItem() instanceof ItemBlades); - if(i == 29) return stack.getItem() instanceof IBatteryItem; - if(i == 27 || i == 28) return stack.getItem() instanceof ItemBlades; + if(i < 9) + return ShredderRecipes.getShredderResult(stack) != null && !(stack.getItem() instanceof ItemBlades); + if(i == 29) + return stack.getItem() instanceof IBatteryItem; + if(i == 27 || i == 28) + return stack.getItem() instanceof ItemBlades; return false; } @Override public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { + if(slots[i] != null) { + if(slots[i].stackSize <= j) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { + if(slots[i].stackSize == 0) { slots[i] = null; } @@ -146,12 +146,10 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I this.power = nbt.getLong("powerTime"); slots = new ItemStack[getSizeInventory()]; - for(int i = 0; i < list.tagCount(); i++) - { + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { + if(b0 >= 0 && b0 < slots.length) { slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } @@ -165,19 +163,17 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I nbt.setLong("powerTime", power); NBTTagList list = new NBTTagList(); - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); + nbt1.setByte("slot", (byte) i); slots[i].writeToNBT(nbt1); list.appendTag(nbt1); } } nbt.setTag("items", list); - - if (customName != null) { + + if(customName != null) { nbt.setString("name", customName); } } @@ -210,8 +206,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { - if(i >= 9 && i <= 26) return true; - if(i >= 27 && i <= 28) if(itemStack.getItemDamage() == itemStack.getMaxDamage() && itemStack.getMaxDamage() > 0) return true; + if(i >= 9 && i <= 26) + return true; + if(i >= 27 && i <= 28) + if(itemStack.getItemDamage() == itemStack.getMaxDamage() && itemStack.getMaxDamage() > 0) + return true; return false; } @@ -235,15 +234,15 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I if(!worldObj.isRemote) { this.updateConnections(); + + if(this.progress == 0) this.soundCycle = 0; - if(hasPower() && canProcess()) - { + if(hasPower() && canProcess()) { progress++; power -= 5; - if(this.progress == TileEntityMachineShredder.processingSpeed) - { + if(this.progress == TileEntityMachineShredder.processingSpeed) { for(int i = 27; i <= 28; i++) if(slots[i].getMaxDamage() > 0) this.slots[i].setItemDamage(this.slots[i].getItemDamage() + 1); @@ -253,34 +252,31 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I flag1 = true; } if(soundCycle == 0) - this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "minecart.base", getVolume(1.0F), 0.75F); + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "minecart.base", getVolume(1.0F), 0.75F); soundCycle++; if(soundCycle >= 50) soundCycle = 0; - }else{ + } else { progress = 0; } boolean trigger = true; - if(hasPower() && canProcess() && this.progress == 0) - { + if(hasPower() && canProcess() && this.progress == 0) { trigger = false; } - if(trigger) - { - flag1 = true; - } + if(trigger) { + flag1 = true; + } power = Library.chargeTEFromItems(slots, 29, power, maxPower); networkPackNT(50); } - if(flag1) - { + if(flag1) { this.markDirty(); } } @@ -305,20 +301,15 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public void processItem() { - for(int inpSlot = 0; inpSlot < 9; inpSlot++) - { - if(slots[inpSlot] != null && hasSpace(slots[inpSlot])) - { + for(int inpSlot = 0; inpSlot < 9; inpSlot++) { + if(slots[inpSlot] != null && hasSpace(slots[inpSlot])) { ItemStack inp = slots[inpSlot]; ItemStack outp = ShredderRecipes.getShredderResult(inp); boolean flag = false; - for (int outSlot = 9; outSlot < 27; outSlot++) - { - if (slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && - slots[outSlot].getItemDamage() == outp.getItemDamage() && - slots[outSlot].stackSize + outp.stackSize <= outp.getMaxStackSize()) { + for(int outSlot = 9; outSlot < 27; outSlot++) { + if(slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && slots[outSlot].getItemDamage() == outp.getItemDamage() && slots[outSlot].stackSize + outp.stackSize <= outp.getMaxStackSize()) { slots[outSlot].stackSize += outp.stackSize; slots[inpSlot].stackSize -= 1; @@ -328,9 +319,8 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } if(!flag) - for (int outSlot = 9; outSlot < 27; outSlot++) - { - if (slots[outSlot] == null) { + for(int outSlot = 9; outSlot < 27; outSlot++) { + if(slots[outSlot] == null) { slots[outSlot] = outp.copy(); slots[inpSlot].stackSize -= 1; break; @@ -344,14 +334,10 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } public boolean canProcess() { - if(slots[27] != null && slots[28] != null && - this.getGearLeft() > 0 && this.getGearLeft() < 3 && - this.getGearRight() > 0 && this.getGearRight() < 3) { + if(slots[27] != null && slots[28] != null && this.getGearLeft() > 0 && this.getGearLeft() < 3 && this.getGearRight() > 0 && this.getGearRight() < 3) { - for(int i = 0; i < 9; i++) - { - if(slots[i] != null && slots[i].stackSize > 0 && hasSpace(slots[i])) - { + for(int i = 0; i < 9; i++) { + if(slots[i] != null && slots[i].stackSize > 0 && hasSpace(slots[i])) { return true; } } @@ -364,14 +350,13 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I ItemStack result = ShredderRecipes.getShredderResult(stack); - if (result != null) - for (int i = 9; i < 27; i++) { - if (slots[i] == null) { + if(result != null) + for(int i = 9; i < 27; i++) { + if(slots[i] == null) { return true; } - if (slots[i] != null && slots[i].getItem().equals(result.getItem()) - && slots[i].stackSize + result.stackSize <= result.getMaxStackSize()) { + if(slots[i] != null && slots[i].getItem().equals(result.getItem()) && slots[i].stackSize + result.stackSize <= result.getMaxStackSize()) { return true; } } @@ -401,13 +386,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public int getGearLeft() { - if(slots[27] != null && slots[27].getItem() instanceof ItemBlades) - { + if(slots[27] != null && slots[27].getItem() instanceof ItemBlades) { if(slots[27].getMaxDamage() == 0) return 1; - if(slots[27].getItemDamage() < slots[27].getItem().getMaxDamage()/2) - { + if(slots[27].getItemDamage() < slots[27].getItem().getMaxDamage() / 2) { return 1; } else if(slots[27].getItemDamage() != slots[27].getItem().getMaxDamage()) { return 2; @@ -421,13 +404,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public int getGearRight() { - if(slots[28] != null && slots[28].getItem() instanceof ItemBlades) - { + if(slots[28] != null && slots[28].getItem() instanceof ItemBlades) { if(slots[28].getMaxDamage() == 0) return 1; - if(slots[28].getItemDamage() < slots[28].getItem().getMaxDamage()/2) - { + if(slots[28].getItemDamage() < slots[28].getItem().getMaxDamage() / 2) { return 1; } else if(slots[28].getItemDamage() != slots[28].getItem().getMaxDamage()) { return 2; diff --git a/src/main/resources/assets/hbm/manual/arsenic.json b/src/main/resources/assets/hbm/manual/arsenic.json new file mode 100644 index 000000000..b6bf7df40 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/arsenic.json @@ -0,0 +1,11 @@ +{ + "name": "Arsenic", + "icon": ["hbm:item.ingot_arsenic", 1, 0], + "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], + "title": { + "en_US": "Arsenic" + }, + "content": { + "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/arsenic_bronze.json new file mode 100644 index 000000000..450f8dd21 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/arsenic_bronze.json @@ -0,0 +1,11 @@ +{ + "name": "Arsenic Bronze", + "icon": ["hbm:item.ingot_arsenic_bronze", 1, 0], + "trigger": [["hbm:item.ingot_arsenic_bronze"]], + "title": { + "en_US": "Arsenic Bronze" + }, + "content": { + "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/bismuth.json b/src/main/resources/assets/hbm/manual/bismuth.json new file mode 100644 index 000000000..369e6bf60 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/bismuth.json @@ -0,0 +1,11 @@ +{ + "name": "Bismuth", + "icon": ["hbm:item.ingot_bismuth", 1, 0], + "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], + "title": { + "en_US": "Bismuth" + }, + "content": { + "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/bismuth_bronze.json new file mode 100644 index 000000000..fcb22393f --- /dev/null +++ b/src/main/resources/assets/hbm/manual/bismuth_bronze.json @@ -0,0 +1,11 @@ +{ + "name": "Bismuth Bronze", + "icon": ["hbm:item.ingot_bismuth_bronze", 1, 0], + "trigger": [["hbm:item.ingot_bismuth_bronze"]], + "title": { + "en_US": "Bismuth Bronze" + }, + "content": { + "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/bscco.json b/src/main/resources/assets/hbm/manual/bscco.json new file mode 100644 index 000000000..4b25d11c0 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/bscco.json @@ -0,0 +1,11 @@ +{ + "name": "BSCCO", + "icon": ["hbm:item.ingot_bscco", 1, 0], + "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], + "title": { + "en_US": "BSCCO" + }, + "content": { + "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/cadmium.json b/src/main/resources/assets/hbm/manual/cadmium.json new file mode 100644 index 000000000..fb9281a02 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/cadmium.json @@ -0,0 +1,11 @@ +{ + "name": "Cadmium", + "icon": ["hbm:item.ingot_cadmium", 1, 0], + "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], + "title": { + "en_US": "Cadmium" + }, + "content": { + "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute." + } +} diff --git a/src/main/resources/assets/hbm/manual/ferrouranium.json b/src/main/resources/assets/hbm/manual/ferrouranium.json new file mode 100644 index 000000000..86629c988 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/ferrouranium.json @@ -0,0 +1,11 @@ +{ + "name": "Ferrouranium", + "icon": ["hbm:item.ingot_ferrouranium", 1, 0], + "trigger": [["hbm:item.ingot_ferrouranium"]], + "title": { + "en_US": "Ferrouranium" + }, + "content": { + "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition." + } +} diff --git a/src/main/resources/assets/hbm/manual/silicon.json b/src/main/resources/assets/hbm/manual/silicon.json index 97cec4e51..4a6f8defd 100644 --- a/src/main/resources/assets/hbm/manual/silicon.json +++ b/src/main/resources/assets/hbm/manual/silicon.json @@ -6,6 +6,6 @@ "en_US": "Silicon" }, "content": { - "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polmyer]], requiring [[oil|Crude Oil]] processing." + "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing." } } diff --git a/src/main/resources/assets/hbm/manual/tantalium.json b/src/main/resources/assets/hbm/manual/tantalium.json new file mode 100644 index 000000000..5368737b3 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/tantalium.json @@ -0,0 +1,11 @@ +{ + "name": "Tantalium", + "icon": ["hbm:item.ingot_tantalium", 1, 0], + "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], + "title": { + "en_US": "Tantalium" + }, + "content": { + "en_US": "Tantalium ('Tantalum') can be ectracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs." + } +} From 219db7acdfe6d874b9ec7535bbbe216265f5d76c Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 10 Aug 2025 22:02:23 +0200 Subject: [PATCH 167/323] blup --- changelog | 9 ++++++++- gradle.properties | 2 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index 01b3f2283..95f85136d 100644 --- a/changelog +++ b/changelog @@ -5,12 +5,19 @@ * Easy to make entries for, the system scans `assets/manual` for valid `.json` format files * Should also work in resource packs (no recent tests for that, not going to make promises) * Still WIP, many new info pages are yet to be made +* `/ntmlocate` + * Finds structures + * Only works on the new component structures, the old crusty ones like the factors and powerplant aren't supported ## Changed +* Updated chinese and russian localization * All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed * The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too * The shredder's sound will now start immediately when processing instead of with random delay +* The assembly machine can now make nuclear waste into barrels +* Capacitors now have OpenComputers integration ## Fixed * Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes -* Removed failed attempt at fixing the gun desync dupe which made things worse \ No newline at end of file +* Removed failed attempt at fixing the gun desync dupe which made things worse +* Fixed a potential crash regarding structure blocks \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e40665d77..fcfc33a9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5412H1 +mod_build_number=5418 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 543f77ad9..34f6c299c 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5412H1)"; + public static final String VERSION = "1.0.27 BETA (5418)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version From 0ec1e5735a5cfd4940e76d72e44bc69c7f54de30 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Sun, 10 Aug 2025 18:32:07 -0600 Subject: [PATCH 168/323] rebar --- src/main/resources/assets/hbm/lang/ru_RU.lang | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 6072fa3d9..cf1ef26da 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -864,6 +864,7 @@ container.reactorBreeding=Реактор-размножитель container.reactorControl=Блок удалённого доступа к реактору container.reactorLarge=Большой ядерный реактор container.reactorResearch=Исследовательский реактор +container.rebar=Установщик арматуры container.reix=Мэйнфрейм Rei-X container.rttyController=Контроллер редстоун-радио container.rtg=РИТЭГ-генератор @@ -1979,6 +1980,7 @@ item.ammo_standard.bmg50_ap.name=.50 BMG патрон (Бронебойный) item.ammo_standard.bmg50_he.name=.50 BMG патрон (Разрывной) item.ammo_standard.bmg50_du.name=.50 BMG патрон (Обеднённый уран) item.ammo_standard.bmg50_fmj.name=.50 BMG патрон (Цельнометаллическая оболочка) +item.ammo_standard.bmg50_sm.name=.50 BMG патрон (Звёздный Металл) item.ammo_standard.bmg50_jhp.name=.50 BMG патрон (Экспансивный+) item.ammo_standard.bmg50_sp.name=.50 BMG патрон (Экспансивный) item.ammo_standard.capacitor.name=Конденсатор (Стандартный) @@ -3178,7 +3180,7 @@ item.gun_maresleg_short.name=Нога кобылы item.gun_mas36.name=Южная Звезда item.gun_minigun.name=Персональный миниган item.gun_minigun_dual.name=Двойные миниганы -item.gun_minigun_lacunae.name=Лакунай +item.gun_minigun_lacunae.name=Лакунэ item.gun_mirv.name=M42 Ядерная катапульта "Экспериментальный МИРВ" item.gun_mirv_ammo.name=Восьмиричный МИРВ (LEGACY) item.gun_missile_launcher.name=Ракетница @@ -4355,6 +4357,7 @@ item.rbmk_tool.set=РБМК соединён! item.reacher.name=Вольфрамовые хваталки item.reactor_core.name=Активная зона реактора-размножителя item.reactor_sensor.name=Дистанционный датчик реактора +item.rebar_placer.name=Установщик арматуры item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -5440,6 +5443,7 @@ tile.concrete_colored_ext.pink.name=Бетон "Выбор строителя" - tile.concrete_colored_ext.purple.name=Бетон "Выбор строителя" - Таинственный фиолетовый tile.concrete_colored_ext.sand.name=Бетон "Выбор строителя" - Пустыня tile.concrete_pillar.name=Арматурный железобетонный столб +tile.concrete_rebar.name=Железобетон tile.concrete_slab.asphalt.name=Плита из асфальта tile.concrete_slab.concrete.name=Плита из бетонной плитки tile.concrete_slab.concrete_asbestos.name=Плита из асбестобетона @@ -6201,6 +6205,7 @@ tile.reactor_ejector.name=Выталкиватель отходов реакто tile.reactor_element.name=Реакторная камера tile.reactor_hatch.name=Люк доступа реактора tile.reactor_inserter.name=Автоматический заправщик реактора +tile.rebar.name=Арматура tile.red_barrel.name=Взрывная бочка tile.red_cable.name=Провод из красной меди tile.red_cable_classic.name=Провод из красной меди (Старый) From 5444f57cade5b04a92dea47fc81cee5a8bfc2b68 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 11 Aug 2025 11:14:06 +0200 Subject: [PATCH 169/323] the glunch --- changelog | 23 +------ src/main/java/com/hbm/calc/EasyLocation.java | 14 ----- src/main/java/com/hbm/calc/Location.java | 33 ---------- src/main/java/com/hbm/qmaw/GuiQMAW.java | 58 +++++++++++++++++- src/main/java/com/hbm/qmaw/ManualElement.java | 2 +- src/main/java/com/hbm/qmaw/QMAWLoader.java | 7 ++- .../hbm/qmaw/components/QComponentLink.java | 7 ++- .../hbm/qmaw/components/QComponentText.java | 3 +- .../network/TileEntityConverterHeRf.java | 7 ++- .../assets/hbm/textures/gui/gui_wiki.png | Bin 1017 -> 1258 bytes 10 files changed, 74 insertions(+), 80 deletions(-) delete mode 100644 src/main/java/com/hbm/calc/EasyLocation.java delete mode 100644 src/main/java/com/hbm/calc/Location.java diff --git a/changelog b/changelog index 95f85136d..9e379b53c 100644 --- a/changelog +++ b/changelog @@ -1,23 +1,2 @@ -## Added -* QMAW (quick manual and wiki) - * It's a simple ingame manual that can be found by pressing F1 on items (like the WIAJ presentations) - * Supports text and links and not much else - * Easy to make entries for, the system scans `assets/manual` for valid `.json` format files - * Should also work in resource packs (no recent tests for that, not going to make promises) - * Still WIP, many new info pages are yet to be made -* `/ntmlocate` - * Finds structures - * Only works on the new component structures, the old crusty ones like the factors and powerplant aren't supported - ## Changed -* Updated chinese and russian localization -* All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed -* The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too -* The shredder's sound will now start immediately when processing instead of with random delay -* The assembly machine can now make nuclear waste into barrels -* Capacitors now have OpenComputers integration - -## Fixed -* Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes -* Removed failed attempt at fixing the gun desync dupe which made things worse -* Fixed a potential crash regarding structure blocks \ No newline at end of file +* QMAW now has buttons for returning to previously viewed pages \ No newline at end of file diff --git a/src/main/java/com/hbm/calc/EasyLocation.java b/src/main/java/com/hbm/calc/EasyLocation.java deleted file mode 100644 index 8e4755c1b..000000000 --- a/src/main/java/com/hbm/calc/EasyLocation.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hbm.calc; - -public class EasyLocation { - - public double posX; - public double posY; - public double posZ; - - public EasyLocation(double x, double y, double z) { - posX = x; - posY = y; - posZ = z; - } -} diff --git a/src/main/java/com/hbm/calc/Location.java b/src/main/java/com/hbm/calc/Location.java deleted file mode 100644 index 6c1d7235d..000000000 --- a/src/main/java/com/hbm/calc/Location.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hbm.calc; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class Location { - - public int x; - public int y; - public int z; - public World world; - - public Location(World world, int x, int y, int z) { - this.world = world; - this.x = x; - this.y = y; - this.z = z; - } - - public Location add(int xa, int ya, int za) { - return new Location(world, x + xa, y + ya, z + za); - } - - public Location add(ForgeDirection dir) { - return add(dir.offsetX, dir.offsetY, dir.offsetZ); - } - - public TileEntity getTileEntity() { - return world.getTileEntity(x, y, z); - } - -} diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index b4d60c42b..c59834957 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -3,13 +3,16 @@ package com.hbm.qmaw; import java.util.ArrayList; import java.util.List; +import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; import com.hbm.qmaw.components.*; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.LanguageManager; @@ -22,8 +25,12 @@ public class GuiQMAW extends GuiScreen { protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png"); public String title; + public String qmawID; public ItemStack icon; public List> lines = new ArrayList(); + /** History for returning via button */ + public List back = new ArrayList(); + public List forward = new ArrayList(); protected int xSize = 340; protected int ySize = 224; @@ -38,6 +45,7 @@ public class GuiQMAW extends GuiScreen { public static final String EN_US = "en_US"; public GuiQMAW(QuickManualAndWiki qmaw) { + qmawID = qmaw.name; parseQMAW(qmaw); } @@ -163,6 +171,43 @@ public class GuiQMAW extends GuiScreen { this.lastClickX = x; this.lastClickY = y; } + + if(guiLeft + 3 <= x && guiLeft + 3 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) back(); + if(guiLeft + 21 <= x && guiLeft + 21 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) forward(); + } + + public void back() { + if(this.back.isEmpty()) return; + + String prev = back.get(back.size() - 1); + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(prev); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(back); + screen.back.remove(screen.back.size() - 1); + screen.forward.addAll(forward); + screen.forward.add(qmawID); + FMLCommonHandler.instance().showGuiScreen(screen); + } + } + + public void forward() { + if(this.forward.isEmpty()) return; + + String next = forward.get(forward.size() - 1); + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(next); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(back); + screen.back.add(qmawID); + screen.forward.addAll(forward); + screen.forward.remove(screen.forward.size() - 1); + FMLCommonHandler.instance().showGuiScreen(screen); + } } public int getSliderPosition() { @@ -213,7 +258,7 @@ public class GuiQMAW extends GuiScreen { private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - int x = 7; + int x = 43; int y = 4; if(this.icon != null) { @@ -242,7 +287,11 @@ public class GuiQMAW extends GuiScreen { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, 170, ySize); - drawTexturedModalRect(guiLeft + 170, guiTop, 22, 0, 170, ySize); + drawTexturedModalRect(guiLeft + 170, guiTop, 52, 0, 30, ySize); + drawTexturedModalRect(guiLeft + 200, guiTop, 52, 0, 140, ySize); + + if(!back.isEmpty()) drawTexturedModalRect(guiLeft + 3, guiTop + 3, 204, 0, 18, 18); + if(!forward.isEmpty()) drawTexturedModalRect(guiLeft + 21, guiTop + 3, 222, 0, 18, 18); // scroll bar drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16); @@ -273,7 +322,7 @@ public class GuiQMAW extends GuiScreen { boolean mouseOver = (elementX <= mouseX && elementX + element.getWidth() > mouseX && elementY < mouseY && elementY + element.getHeight() >= mouseY); element.render(mouseOver, elementX, elementY, mouseX, mouseY); if(elementX <= lastClickX && elementX + element.getWidth() > lastClickX && elementY < lastClickY && elementY + element.getHeight() >= lastClickY) - element.onClick(); + element.onClick(this); inset += element.getWidth(); } @@ -283,6 +332,9 @@ public class GuiQMAW extends GuiScreen { @Override protected void keyTyped(char typedChar, int keyCode) { + + if(keyCode == Keyboard.KEY_LEFT) back(); + if(keyCode == Keyboard.KEY_RIGHT) forward(); if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { this.mc.displayGuiScreen((GuiScreen) null); diff --git a/src/main/java/com/hbm/qmaw/ManualElement.java b/src/main/java/com/hbm/qmaw/ManualElement.java index 7d5c640d5..92ab74a13 100644 --- a/src/main/java/com/hbm/qmaw/ManualElement.java +++ b/src/main/java/com/hbm/qmaw/ManualElement.java @@ -5,5 +5,5 @@ public abstract class ManualElement { public abstract int getWidth(); public abstract int getHeight(); public abstract void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY); - public abstract void onClick(); + public abstract void onClick(GuiQMAW gui); } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index f085aeba4..3bf265372 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -60,6 +60,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { //no fucking null check, if this fails then the entire game will sink along with the ship String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath(); // exclude .class in the case of a dev env + MainRegistry.logger.info("[QMAW] Current running file: " + path); if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself qmaw.clear(); @@ -76,7 +77,10 @@ public class QMAWLoader implements IResourceManagerReloadListener { * */ public static void agonyEngine() { - for(File modFile : registeredModFiles) dissectZip(modFile); + for(File modFile : registeredModFiles) { + logJarAttempt(modFile.getName()); + dissectZip(modFile); + } File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar)); if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) { @@ -102,6 +106,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } + public static void logJarAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting jar " + name); } public static void logPackAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting resource " + name); } public static void logFoundManual(String name) { MainRegistry.logger.info("[QMAW] Found manual " + name); } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java index c2816835e..acb4a4c9b 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentLink.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -81,11 +81,14 @@ public class QComponentLink extends ManualElement { font.drawString(text, x, y, isMouseOver ? hoverColor : color); } - @Override public void onClick() { + @Override public void onClick(GuiQMAW gui) { QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); if(qmaw != null) { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(gui.back); + screen.back.add(gui.qmawID); + FMLCommonHandler.instance().showGuiScreen(screen); } } } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentText.java b/src/main/java/com/hbm/qmaw/components/QComponentText.java index 30fd266b5..efcb0ffd8 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentText.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentText.java @@ -1,5 +1,6 @@ package com.hbm.qmaw.components; +import com.hbm.qmaw.GuiQMAW; import com.hbm.qmaw.ManualElement; import net.minecraft.client.Minecraft; @@ -40,5 +41,5 @@ public class QComponentText extends ManualElement { font.drawString(text, x, y, color); } - @Override public void onClick() { } + @Override public void onClick(GuiQMAW gui) { } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java index 3d7072304..f6dc1fdff 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java @@ -2,9 +2,10 @@ package com.hbm.tileentity.network; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; -import com.hbm.calc.Location; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.Compat; +import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cofh.api.energy.EnergyStorage; @@ -41,8 +42,8 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - Location loc = new Location(worldObj, xCoord, yCoord, zCoord).add(dir); - TileEntity entity = loc.getTileEntity(); + BlockPos loc = new BlockPos(xCoord, yCoord, zCoord).offset(dir); + TileEntity entity = Compat.getTileStandard(worldObj, loc.getX(), loc.getY(), loc.getZ()); if (entity != null && entity instanceof IEnergyReceiver) { IEnergyReceiver receiver = (IEnergyReceiver) entity; diff --git a/src/main/resources/assets/hbm/textures/gui/gui_wiki.png b/src/main/resources/assets/hbm/textures/gui/gui_wiki.png index 48c92d1c46ca12cf5d22954dbccfe040f2e43d86..9f8c2d655a66fcc3422ab635e9e2e608eefec5b7 100644 GIT binary patch literal 1258 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGxWLQfaR zkcv5P@A&53c4KG=TzVmP6W6Ah%rD$-elT+l6mffZkU1kcW$NWE+Tzyxm78zBz4zwpb&2Pt9zdc$)|w|VoiZBOXg_)Tw*^zFm?mS-iBC(h_GG^_vrwYJf=Y5B6uUr%p;zmWcI zvD@S641ad~ue{iB*(CSd@4rfqIT)@R`CeXK|9{2ulil)+2XuF(H0c-G?Z0OBFQUeU zBQnXf{%o!#Q^VQHY=-M|{`7C(`DEgOgA6r4fBk&)`RDfyycK6xW;2{u|G&}D!sMLc zw4MX28Gn5G`dLZZvW;WIvi@Bs%1`7o7o0u$zhbu10o{r^)B8IaEx*-z=e$JmYh literal 1017 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%o{vi z978JRyuIt#H!DG+A#vG5519t(oevvi8hT%@TAnH1+v__!$Tv-*a(?s@@GZS24NI{oz1w>sh4J%ti=`wUmy+?G4z`Op2^|L5MmSH6I`XFGd( zP4Nfw%O?7K@HuDudFkt=vfFa4tN4KV6EFBNrH&!&LHw8X)q3kd3O!x@ KT-G@yGywq1n>$(n From b374f4088be4845b1cf1106e2123f1c226f8700e Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 11 Aug 2025 11:52:48 +0200 Subject: [PATCH 170/323] agony --- src/main/java/com/hbm/main/MainRegistry.java | 3 +++ src/main/java/com/hbm/qmaw/QMAWLoader.java | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e5c2ca63d..20fc7b204 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -40,6 +40,7 @@ import com.hbm.lib.HbmWorld; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.potion.HbmPotion; +import com.hbm.qmaw.QMAWLoader; import com.hbm.saveddata.satellites.Satellite; import com.hbm.tileentity.TileMappings; import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; @@ -253,6 +254,8 @@ public class MainRegistry { @EventHandler public void PreLoad(FMLPreInitializationEvent PreEvent) { CrashHelper.init(); + + QMAWLoader.registerModFileURL(FMLCommonHandler.instance().findContainerFor(RefStrings.MODID).getSource()); startupTime = System.currentTimeMillis(); configDir = PreEvent.getModConfigurationDirectory(); diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 3bf265372..ee1596b3f 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -48,7 +48,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { MainRegistry.logger.info("[QMAW] Loaded " + qmaw.size() + " manual entries! (" + (System.currentTimeMillis() - timestamp) + "ms)"); } - /** For the like 2 people who might consider making an NTM addon and want to include manual pages */ + /** For the like 2 people who might consider making an NTM addon and want to include manual pages. Requires the mod's actual JAR file as the parameter. */ public static void registerModFileURL(File file) { registeredModFiles.add(file); } @@ -56,12 +56,14 @@ public class QMAWLoader implements IResourceManagerReloadListener { /** Searches the asset folder for QMAW format JSON files and adds entries based on that */ public static void init() { - //the mod's file, assuming the mod is a file (not the case in a dev env, fuck!) + /*//the mod's file, assuming the mod is a file (not the case in a dev env, fuck!) //no fucking null check, if this fails then the entire game will sink along with the ship String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath(); // exclude .class in the case of a dev env MainRegistry.logger.info("[QMAW] Current running file: " + path); - if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself + if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself*/ // deactivated because it likely doesn't even fucking work + + // registering of the mod file now happens in the MainRegistry during preinit qmaw.clear(); triggers.clear(); @@ -153,7 +155,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { /** Opens a resource pack folder, skips to the manual folder, then tries to dissect that */ public static void dissectFolder(File folder) { - File manualFolder = new File(folder, "/assets/manual"); + File manualFolder = new File(folder, "/assets/hbm/manual"); if(manualFolder.exists() && manualFolder.isDirectory()) dissectManualFolder(manualFolder); } @@ -180,6 +182,12 @@ public class QMAWLoader implements IResourceManagerReloadListener { public static void registerJson(String file, JsonObject json) { String name = json.get("name").getAsString(); + + if(QMAWLoader.qmaw.containsKey(name)) { + MainRegistry.logger.info("[QMAW] Skipping existing entry " + file); + return; + } + QuickManualAndWiki qmaw = new QuickManualAndWiki(name); if(json.has("icon")) { From 938c28f293c6c3a1077bbdac8f6bbd821cecbbf0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 11 Aug 2025 11:59:28 +0200 Subject: [PATCH 171/323] work, whore --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 15aedca55..13f49a3ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,6 +12,7 @@ name: Java CI with Gradle on: schedule: - cron: "0 0 * * *" + workflow_dispatch: jobs: build: From 9cfdc171156b80fa27f0e35c3010cb277cf37742 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 14 Aug 2025 16:20:39 +0200 Subject: [PATCH 172/323] multidimensional time crystal --- changelog | 10 ++++++++- .../hbm/entity/item/EntityDeliveryDrone.java | 4 +++- .../com/hbm/entity/logic/EntityBalefire.java | 21 +++++++++---------- .../gui/LoadingScreenRendererNT.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 5 +++++ src/main/java/com/hbm/qmaw/QMAWLoader.java | 2 ++ .../hbm/tileentity/TileEntityProxyCombo.java | 2 +- .../tileentity/machine/TileEntityITER.java | 10 ++++----- .../machine/TileEntityReactorZirnox.java | 6 +++--- .../machine/TileEntityRefueler.java | 1 - .../hbm/manual/{ => material}/alloy.json | 0 .../assets/hbm/manual/material/aluminium.json | 11 ++++++++++ .../hbm/manual/{ => material}/arsenic.json | 0 .../manual/{ => material}/arsenic_bronze.json | 0 .../hbm/manual/{ => material}/bakelite.json | 0 .../hbm/manual/{ => material}/bismuth.json | 0 .../manual/{ => material}/bismuth_bronze.json | 0 .../hbm/manual/{ => material}/bscco.json | 0 .../hbm/manual/{ => material}/cadmium.json | 0 .../hbm/manual/material/cadmium_steel.json | 11 ++++++++++ .../assets/hbm/manual/material/cinnabar.json | 11 ++++++++++ .../assets/hbm/manual/material/coke.json | 11 ++++++++++ .../assets/hbm/manual/material/copper.json | 11 ++++++++++ .../assets/hbm/manual/material/desh.json | 11 ++++++++++ .../manual/{ => material}/ferrouranium.json | 0 .../assets/hbm/manual/material/graphite.json | 11 ++++++++++ .../assets/hbm/manual/material/gunmetal.json | 11 ++++++++++ .../assets/hbm/manual/material/hss.json | 11 ++++++++++ .../assets/hbm/manual/material/latex.json | 11 ++++++++++ .../assets/hbm/manual/material/lead.json | 11 ++++++++++ .../hbm/manual/{ => material}/mingrade.json | 0 .../assets/hbm/manual/material/neptunium.json | 11 ++++++++++ .../manual/{ => material}/plutonium-238.json | 0 .../manual/{ => material}/plutonium-239.json | 0 .../manual/{ => material}/plutonium-240.json | 0 .../manual/{ => material}/plutonium-241.json | 0 .../manual/{ => material}/plutonium-rg.json | 0 .../hbm/manual/{ => material}/plutonium.json | 0 .../hbm/manual/{ => material}/polonium.json | 0 .../hbm/manual/{ => material}/polymer.json | 0 .../hbm/manual/{ => material}/radium.json | 0 .../assets/hbm/manual/material/rubber.json | 11 ++++++++++ .../hbm/manual/{ => material}/silicon.json | 0 .../assets/hbm/manual/material/sodium.json | 11 ++++++++++ .../hbm/manual/{ => material}/steel.json | 0 .../assets/hbm/manual/material/sulfur.json | 11 ++++++++++ .../hbm/manual/{ => material}/tantalium.json | 0 .../hbm/manual/{ => material}/technetium.json | 0 .../{ => material}/technetium_steel.json | 0 .../hbm/manual/{ => material}/thorium.json | 0 .../manual/{ => material}/uranium-233.json | 0 .../manual/{ => material}/uranium-235.json | 0 .../manual/{ => material}/uranium-238.json | 0 .../hbm/manual/{ => material}/uranium.json | 0 .../hbm/manual/material/weaponsteel.json | 11 ++++++++++ 55 files changed, 215 insertions(+), 24 deletions(-) rename src/main/resources/assets/hbm/manual/{ => material}/alloy.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/aluminium.json rename src/main/resources/assets/hbm/manual/{ => material}/arsenic.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/arsenic_bronze.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/bakelite.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/bismuth.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/bismuth_bronze.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/bscco.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/cadmium.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/cadmium_steel.json create mode 100644 src/main/resources/assets/hbm/manual/material/cinnabar.json create mode 100644 src/main/resources/assets/hbm/manual/material/coke.json create mode 100644 src/main/resources/assets/hbm/manual/material/copper.json create mode 100644 src/main/resources/assets/hbm/manual/material/desh.json rename src/main/resources/assets/hbm/manual/{ => material}/ferrouranium.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/graphite.json create mode 100644 src/main/resources/assets/hbm/manual/material/gunmetal.json create mode 100644 src/main/resources/assets/hbm/manual/material/hss.json create mode 100644 src/main/resources/assets/hbm/manual/material/latex.json create mode 100644 src/main/resources/assets/hbm/manual/material/lead.json rename src/main/resources/assets/hbm/manual/{ => material}/mingrade.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/neptunium.json rename src/main/resources/assets/hbm/manual/{ => material}/plutonium-238.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/plutonium-239.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/plutonium-240.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/plutonium-241.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/plutonium-rg.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/plutonium.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/polonium.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/polymer.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/radium.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/rubber.json rename src/main/resources/assets/hbm/manual/{ => material}/silicon.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/sodium.json rename src/main/resources/assets/hbm/manual/{ => material}/steel.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/sulfur.json rename src/main/resources/assets/hbm/manual/{ => material}/tantalium.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/technetium.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/technetium_steel.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/thorium.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/uranium-233.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/uranium-235.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/uranium-238.json (100%) rename src/main/resources/assets/hbm/manual/{ => material}/uranium.json (100%) create mode 100644 src/main/resources/assets/hbm/manual/material/weaponsteel.json diff --git a/changelog b/changelog index 9e379b53c..d29339e12 100644 --- a/changelog +++ b/changelog @@ -1,2 +1,10 @@ ## Changed -* QMAW now has buttons for returning to previously viewed pages \ No newline at end of file +* QMAW now has buttons for returning to previously viewed pages +* QMAW file detection now includes subfolders to `manual` +* OpenComputers integration for the ZIRNOX should now return values in °C and bar instead of unexplained weird internal units + +## Fixed +* Fixed QMAW not working at all +* Potentially fixed a bug where proxy tile entities would reference unloaded core tile entities which would cause bizarre item voiding/duping issues in rare cases +* Fixed fusion reactor automation being able to remove items other than the breeding output slot +* Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java index db9e90da3..f733f99ca 100644 --- a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java +++ b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java @@ -200,9 +200,11 @@ public class EntityDeliveryDrone extends EntityDroneBase implements IInventory, } // This is the lowest padding that worked with my drone waypoint path. if they stop getting loaded crank up paddingSize - for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) this.posX, (int) this.posZ, (int) (this.posX + this.motionX), (int) (this.posZ + this.motionZ), 4)){ + for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) Math.floor(this.posX), (int) Math.floor(this.posZ), (int) Math.floor(this.posX + this.motionX), (int) Math.floor(this.posZ + this.motionZ), 8)){ ForgeChunkManager.forceChunk(loaderTicket, chunk); } + + System.out.println("guhhh"); } } diff --git a/src/main/java/com/hbm/entity/logic/EntityBalefire.java b/src/main/java/com/hbm/entity/logic/EntityBalefire.java index b368e171d..369a4aba9 100644 --- a/src/main/java/com/hbm/entity/logic/EntityBalefire.java +++ b/src/main/java/com/hbm/entity/logic/EntityBalefire.java @@ -10,8 +10,8 @@ import com.hbm.main.MainRegistry; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class EntityBalefire extends EntityExplosionChunkloading { - +public class EntityBalefire extends EntityExplosionChunkloading { + public int age = 0; public int destructionRange = 0; public ExplosionBalefire exp; @@ -24,13 +24,11 @@ public class EntityBalefire extends EntityExplosionChunkloading { destructionRange = nbt.getInteger("destructionRange"); speed = nbt.getInteger("speed"); did = nbt.getBoolean("did"); - - - exp = new ExplosionBalefire((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange); + + exp = new ExplosionBalefire((int) this.posX, (int) this.posY, (int) this.posZ, this.worldObj, this.destructionRange); exp.readFromNbt(nbt, "exp_"); - - this.did = true; - + + this.did = true; } @Override @@ -39,10 +37,10 @@ public class EntityBalefire extends EntityExplosionChunkloading { nbt.setInteger("destructionRange", destructionRange); nbt.setInteger("speed", speed); nbt.setBoolean("did", did); - + if(exp != null) exp.saveToNbt(nbt, "exp_"); - + } public EntityBalefire(World p_i1582_1_) { @@ -53,7 +51,8 @@ public class EntityBalefire extends EntityExplosionChunkloading { public void onUpdate() { super.onUpdate(); - if(!worldObj.isRemote) loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D)); + if(!worldObj.isRemote) + loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D)); if(!this.did) { if(GeneralConfig.enableExtendedLogging && !worldObj.isRemote) diff --git a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java index 8dd24c319..10c4624ee 100644 --- a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java +++ b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java @@ -37,7 +37,7 @@ public class LoadingScreenRendererNT extends LoadingScreenRenderer { } private String chooseTip() { - if(HTTPHandler.tipOfTheDay.isEmpty()) return "null"; + if(HTTPHandler.tipOfTheDay.isEmpty()) return "Explore! There's tons of free stuff to find."; return HTTPHandler.tipOfTheDay.get(new Random().nextInt(HTTPHandler.tipOfTheDay.size())); } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index c82f7b1b2..36081693c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -114,6 +114,8 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.oredict.OreDictionary; + import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -753,6 +755,9 @@ public class ModEventHandlerClient { try { QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp); + if(qmaw == null) { + qmaw = QMAWLoader.triggers.get(new ComparableStack(comp.item, 1, OreDictionary.WILDCARD_VALUE)); + } if(qmaw != null) { list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("qmaw.tab", Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode()))); lastQMAW = qmaw; diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index ee1596b3f..b84cf594e 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -174,6 +174,8 @@ public class QMAWLoader implements IResourceManagerReloadListener { } catch(Exception ex) { MainRegistry.logger.info("[QMAW] Error reading manual " + name + ": " + ex); } + } else if(file.isDirectory()) { + dissectManualFolder(file); // scrape subfolders too lmao } } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java index fb80aa785..dc30ea5b3 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java @@ -77,7 +77,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy /** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */ public TileEntity getTile() { - if(tile == null || tile.isInvalid()) { + if(tile == null || tile.isInvalid() || (tile instanceof TileEntityLoadedBase && !((TileEntityLoadedBase) tile).isLoaded)) { tile = this.getTE(); } return tile; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 1b75df130..93f8675ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -317,19 +317,19 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - return true; + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return slot == 2; // only allow removing breeder outputs } @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 1, 2, 4 }; } @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { + public boolean isItemValidForSlot(int i, ItemStack stack) { - if(i == 1 && BreederRecipes.getOutput(itemStack) != null) + if(i == 1 && BreederRecipes.getOutput(stack) != null) return true; return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 3f3ae011a..a7ec9973f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -468,13 +468,13 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getTemp(Context context, Arguments args) { - return new Object[] {heat}; + return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D)}; } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getPressure(Context context, Arguments args) { - return new Object[] {pressure}; + return new Object[] {Math.round(pressure * 1.0E-5D * 30.0D)}; } @Callback(direct = true) @@ -504,7 +504,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getInfo(Context context, Arguments args) { - return new Object[] {heat, pressure, water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn}; + return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D), Math.round(pressure * 1.0E-5D * 30.0D), water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn}; } @Callback(direct = true, limit = 4) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java index 22c3cf0d2..62f01a1e2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java @@ -153,5 +153,4 @@ public class TileEntityRefueler extends TileEntityLoadedBase implements IFluidSt public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } - } diff --git a/src/main/resources/assets/hbm/manual/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json similarity index 100% rename from src/main/resources/assets/hbm/manual/alloy.json rename to src/main/resources/assets/hbm/manual/material/alloy.json diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json new file mode 100644 index 000000000..9e5732336 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -0,0 +1,11 @@ +{ + "name": "Aluminium", + "icon": ["hbm:item.ingot_aluminium", 1, 0], + "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], + "title": { + "en_US": "Aluminium" + }, + "content": { + "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages." + } +} diff --git a/src/main/resources/assets/hbm/manual/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json similarity index 100% rename from src/main/resources/assets/hbm/manual/arsenic.json rename to src/main/resources/assets/hbm/manual/material/arsenic.json diff --git a/src/main/resources/assets/hbm/manual/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json similarity index 100% rename from src/main/resources/assets/hbm/manual/arsenic_bronze.json rename to src/main/resources/assets/hbm/manual/material/arsenic_bronze.json diff --git a/src/main/resources/assets/hbm/manual/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json similarity index 100% rename from src/main/resources/assets/hbm/manual/bakelite.json rename to src/main/resources/assets/hbm/manual/material/bakelite.json diff --git a/src/main/resources/assets/hbm/manual/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json similarity index 100% rename from src/main/resources/assets/hbm/manual/bismuth.json rename to src/main/resources/assets/hbm/manual/material/bismuth.json diff --git a/src/main/resources/assets/hbm/manual/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json similarity index 100% rename from src/main/resources/assets/hbm/manual/bismuth_bronze.json rename to src/main/resources/assets/hbm/manual/material/bismuth_bronze.json diff --git a/src/main/resources/assets/hbm/manual/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json similarity index 100% rename from src/main/resources/assets/hbm/manual/bscco.json rename to src/main/resources/assets/hbm/manual/material/bscco.json diff --git a/src/main/resources/assets/hbm/manual/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/cadmium.json rename to src/main/resources/assets/hbm/manual/material/cadmium.json diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json new file mode 100644 index 000000000..70cb3644b --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -0,0 +1,11 @@ +{ + "name": "Cadmium Steel", + "icon": ["hbm:item.ingot_cdalloy", 1, 0], + "trigger": [["hbm:item.ingot_cdalloy"]], + "title": { + "en_US": "Cadmium Steel" + }, + "content": { + "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json new file mode 100644 index 000000000..c142e7ff9 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -0,0 +1,11 @@ +{ + "name": "Cinnabar", + "icon": ["hbm:item.cinnebar", 1, 0], + "trigger": [["hbm:item.cinnebar"]], + "title": { + "en_US": "Cinnabar" + }, + "content": { + "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json new file mode 100644 index 000000000..fbf8d8631 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -0,0 +1,11 @@ +{ + "name": "Coke", + "icon": ["hbm:item.coke", 1, 0], + "trigger": [["hbm:item.coke", 1, 32767]], + "title": { + "en_US": "Coke" + }, + "content": { + "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json new file mode 100644 index 000000000..e56f6d71d --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -0,0 +1,11 @@ +{ + "name": "Copper", + "icon": ["hbm:item.ingot_copper", 1, 0], + "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], + "title": { + "en_US": "Copper" + }, + "content": { + "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json new file mode 100644 index 000000000..4de099c5a --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -0,0 +1,11 @@ +{ + "name": "Desh", + "icon": ["hbm:item.ingot_desh", 1, 0], + "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], + "title": { + "en_US": "Desh" + }, + "content": { + "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities." + } +} diff --git a/src/main/resources/assets/hbm/manual/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/ferrouranium.json rename to src/main/resources/assets/hbm/manual/material/ferrouranium.json diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json new file mode 100644 index 000000000..9d0624a78 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -0,0 +1,11 @@ +{ + "name": "Graphite", + "icon": ["hbm:item.ingot_graphite", 1, 0], + "trigger": [["hbm:item.ingot_graphite"]], + "title": { + "en_US": "Graphite" + }, + "content": { + "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json new file mode 100644 index 000000000..bf6ee920e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -0,0 +1,11 @@ +{ + "name": "Gunmetal", + "icon": ["hbm:item.ingot_gunmetal", 1, 0], + "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], + "title": { + "en_US": "Gunmetal" + }, + "content": { + "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json new file mode 100644 index 000000000..a74dfddaf --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -0,0 +1,11 @@ +{ + "name": "High-Speed Steel", + "icon": ["hbm:item.ingot_dura_steel", 1, 0], + "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], + "title": { + "en_US": "High-Speed Steel" + }, + "content": { + "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json new file mode 100644 index 000000000..c070e21e3 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -0,0 +1,11 @@ +{ + "name": "Latex", + "icon": ["hbm:item.ingot_biorubber", 1, 0], + "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], + "title": { + "en_US": "Latex" + }, + "content": { + "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa." + } +} diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json new file mode 100644 index 000000000..9735111c3 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -0,0 +1,11 @@ +{ + "name": "Lead", + "icon": ["hbm:item.ingot_lead", 1, 0], + "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], + "title": { + "en_US": "Lead" + }, + "content": { + "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits." + } +} diff --git a/src/main/resources/assets/hbm/manual/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json similarity index 100% rename from src/main/resources/assets/hbm/manual/mingrade.json rename to src/main/resources/assets/hbm/manual/material/mingrade.json diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json new file mode 100644 index 000000000..a730ab7cd --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -0,0 +1,11 @@ +{ + "name": "Neptunium", + "icon": ["hbm:item.ingot_neptunium", 1, 0], + "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], + "title": { + "en_US": "Neptunium" + }, + "content": { + "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]]." + } +} diff --git a/src/main/resources/assets/hbm/manual/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium-238.json rename to src/main/resources/assets/hbm/manual/material/plutonium-238.json diff --git a/src/main/resources/assets/hbm/manual/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium-239.json rename to src/main/resources/assets/hbm/manual/material/plutonium-239.json diff --git a/src/main/resources/assets/hbm/manual/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium-240.json rename to src/main/resources/assets/hbm/manual/material/plutonium-240.json diff --git a/src/main/resources/assets/hbm/manual/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium-241.json rename to src/main/resources/assets/hbm/manual/material/plutonium-241.json diff --git a/src/main/resources/assets/hbm/manual/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium-rg.json rename to src/main/resources/assets/hbm/manual/material/plutonium-rg.json diff --git a/src/main/resources/assets/hbm/manual/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/plutonium.json rename to src/main/resources/assets/hbm/manual/material/plutonium.json diff --git a/src/main/resources/assets/hbm/manual/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/polonium.json rename to src/main/resources/assets/hbm/manual/material/polonium.json diff --git a/src/main/resources/assets/hbm/manual/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json similarity index 100% rename from src/main/resources/assets/hbm/manual/polymer.json rename to src/main/resources/assets/hbm/manual/material/polymer.json diff --git a/src/main/resources/assets/hbm/manual/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/radium.json rename to src/main/resources/assets/hbm/manual/material/radium.json diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json new file mode 100644 index 000000000..9db9ddc37 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -0,0 +1,11 @@ +{ + "name": "Rubber", + "icon": ["hbm:item.ingot_rubber", 1, 0], + "trigger": [["hbm:item.ingot_rubber"]], + "title": { + "en_US": "Rubber" + }, + "content": { + "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe." + } +} diff --git a/src/main/resources/assets/hbm/manual/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json similarity index 100% rename from src/main/resources/assets/hbm/manual/silicon.json rename to src/main/resources/assets/hbm/manual/material/silicon.json diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json new file mode 100644 index 000000000..5165042e0 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -0,0 +1,11 @@ +{ + "name": "Sodium", + "icon": ["hbm:item.powder_sodium", 1, 0], + "trigger": [["hbm:item.powder_sodium"]], + "title": { + "en_US": "Sodium" + }, + "content": { + "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant." + } +} diff --git a/src/main/resources/assets/hbm/manual/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json similarity index 100% rename from src/main/resources/assets/hbm/manual/steel.json rename to src/main/resources/assets/hbm/manual/material/steel.json diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json new file mode 100644 index 000000000..32a07b988 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -0,0 +1,11 @@ +{ + "name": "Sulfur", + "icon": ["hbm:item.sulfur", 1, 0], + "trigger": [["hbm:item.sulfur"]], + "title": { + "en_US": "Sulfur" + }, + "content": { + "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye." + } +} diff --git a/src/main/resources/assets/hbm/manual/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/tantalium.json rename to src/main/resources/assets/hbm/manual/material/tantalium.json diff --git a/src/main/resources/assets/hbm/manual/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/technetium.json rename to src/main/resources/assets/hbm/manual/material/technetium.json diff --git a/src/main/resources/assets/hbm/manual/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json similarity index 100% rename from src/main/resources/assets/hbm/manual/technetium_steel.json rename to src/main/resources/assets/hbm/manual/material/technetium_steel.json diff --git a/src/main/resources/assets/hbm/manual/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/thorium.json rename to src/main/resources/assets/hbm/manual/material/thorium.json diff --git a/src/main/resources/assets/hbm/manual/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json similarity index 100% rename from src/main/resources/assets/hbm/manual/uranium-233.json rename to src/main/resources/assets/hbm/manual/material/uranium-233.json diff --git a/src/main/resources/assets/hbm/manual/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json similarity index 100% rename from src/main/resources/assets/hbm/manual/uranium-235.json rename to src/main/resources/assets/hbm/manual/material/uranium-235.json diff --git a/src/main/resources/assets/hbm/manual/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json similarity index 100% rename from src/main/resources/assets/hbm/manual/uranium-238.json rename to src/main/resources/assets/hbm/manual/material/uranium-238.json diff --git a/src/main/resources/assets/hbm/manual/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json similarity index 100% rename from src/main/resources/assets/hbm/manual/uranium.json rename to src/main/resources/assets/hbm/manual/material/uranium.json diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json new file mode 100644 index 000000000..87d951ce6 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -0,0 +1,11 @@ +{ + "name": "Weapon Steel", + "icon": ["hbm:item.ingot_weaponsteel", 1, 0], + "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], + "title": { + "en_US": "Weapon Steel" + }, + "content": { + "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads." + } +} From ba24ed64aae75f2fd988da70b111f21e26deb487 Mon Sep 17 00:00:00 2001 From: Bob Date: Fri, 15 Aug 2025 17:59:39 +0200 Subject: [PATCH 173/323] pink one detected --- changelog | 9 +- .../com/hbm/blocks/generic/BlockPlushie.java | 10 +- .../hbm/entity/item/EntityDeliveryDrone.java | 2 - .../com/hbm/inventory/OreDictManager.java | 19 +- .../ContainerMachineArcFurnaceLarge.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 11 +- .../com/hbm/module/ModulePatternMatcher.java | 4 +- .../render/tileentity/RenderNukeFstbmb.java | 80 +- .../hbm/render/tileentity/RenderPlushie.java | 14 +- .../bomb/TileEntityNukeBalefire.java | 12 +- .../machine/TileEntityMachineAutocrafter.java | 2 +- .../assets/hbm/models/trinkets/hundun.obj | 1538 +++++++++++++++++ .../assets/hbm/models/trinkets/pooh.obj | 334 ---- src/main/resources/assets/hbm/sounds.json | 1 + .../sounds/block/hunduns_magnificent_howl.ogg | Bin 0 -> 62398 bytes .../assets/hbm/textures/items/fluid_tank.png | Bin 337 -> 270 bytes .../hbm/textures/items/fluid_tank_overlay.png | Bin 181 -> 153 bytes .../hbm/textures/models/trinkets/hundun.png | Bin 0 -> 1336 bytes .../hbm/textures/models/trinkets/pooh.png | Bin 409 -> 0 bytes 19 files changed, 1630 insertions(+), 410 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/trinkets/hundun.obj delete mode 100644 src/main/resources/assets/hbm/models/trinkets/pooh.obj create mode 100644 src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg create mode 100644 src/main/resources/assets/hbm/textures/models/trinkets/hundun.png delete mode 100644 src/main/resources/assets/hbm/textures/models/trinkets/pooh.png diff --git a/changelog b/changelog index d29339e12..a06979124 100644 --- a/changelog +++ b/changelog @@ -2,9 +2,16 @@ * QMAW now has buttons for returning to previously viewed pages * QMAW file detection now includes subfolders to `manual` * OpenComputers integration for the ZIRNOX should now return values in °C and bar instead of unexplained weird internal units +* The sodium and strontium autogen ingots now have their correct hazard tags +* Pattern matchers, like the one used on the automatic crafting table, no longer care about NBT data of an item + * This means that RBMK fuel rods can now be automatically disassembled without the depletion number having to be a 100% match + * Due to the way the RBMK uncrafting handler works, a single autocrafter now correctly supports RBMK fuel of one type of any depletion level, yielding the correct recycling pellets ## Fixed * Fixed QMAW not working at all * Potentially fixed a bug where proxy tile entities would reference unloaded core tile entities which would cause bizarre item voiding/duping issues in rare cases * Fixed fusion reactor automation being able to remove items other than the breeding output slot -* Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors \ No newline at end of file +* Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors +* Fixed shift-click handling on the electric arc furnace not working with upgrades, and putting electrodes in the wrong slot +* Fixed issue with the load order where custom fluids wouldn't work properly for fluid loading/unloading and in custom recipes +* Fixed balefire bomb not rendering the egg when fully loaded \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java index 877d784e7..946961fc4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java @@ -96,12 +96,16 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); if(world.isRemote) { - TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.squishTimer = 11; return true; } else { - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F); + if(plushie.type == PlushieType.HUNDUN) { + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.hunduns_magnificent_howl", 100F, 1F); + } else { + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F); + } return true; } } @@ -155,7 +159,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti NONE( "NONE", null), YOMI( "Yomi", "Hi! Can I be your rabbit friend?"), NUMBERNINE( "Number Nine", "None of y'all deserve coal."), - POOH( "Winnie the Pooh", "Beloved children's character with no malicious intent."); + HUNDUN( "Hundun", "混沌"); public String label; public String inscription; diff --git a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java index f733f99ca..78ec2e81f 100644 --- a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java +++ b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java @@ -203,8 +203,6 @@ public class EntityDeliveryDrone extends EntityDroneBase implements IInventory, for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) Math.floor(this.posX), (int) Math.floor(this.posZ), (int) Math.floor(this.posX + this.motionX), (int) Math.floor(this.posZ + this.motionZ), 8)){ ForgeChunkManager.forceChunk(loaderTicket, chunk); } - - System.out.println("guhhh"); } } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 3e85fdfb4..b279bcfc2 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -454,7 +454,7 @@ public class OreDictManager { * HAZARDS, MISC */ LI .hydro(1F) .ingot(lithium) .dustSmall(powder_lithium_tiny) .dust(powder_lithium) .block(block_lithium) .ore(ore_gneiss_lithium); - NA .hydro(1F) .dust(powder_sodium); + NA .hydro(1F) .hazIngot() .dust(powder_sodium); /* * PHOSPHORUS @@ -494,7 +494,7 @@ public class OreDictManager { /* * FISSION FRAGMENTS */ - SR .hot(1F) .hydro(1F) .dust(powder_strontium); + SR .hot(1F) .hydro(1F) .hazIngot() .dust(powder_strontium); SR90 .rad(HazardRegistry.sr90) .hot(1F) .hydro(1F) .dustSmall(powder_sr90_tiny) .dust(powder_sr90) .ingot(ingot_sr90) .billet(billet_sr90) .nugget(nugget_sr90); I131 .rad(HazardRegistry.i131) .hot(1F) .dustSmall(powder_i131_tiny) .dust(powder_i131); XE135 .rad(HazardRegistry.xe135) .hot(10F) .dustSmall(powder_xe135_tiny) .dust(powder_xe135); @@ -912,6 +912,21 @@ public class OreDictManager { for(Block b : blocks) registerStack(tag, new ItemStack(b)); return this; } + + public DictFrame hazIngot() { + hazMult = HazardRegistry.ingot; + return autoRegHazard(INGOT); + } + + // TODO: rethink this. currently, keys are only registered on-demand if the dict frame has a valid entry, even though we can maximize compatibility + // by simply registereing all known shapes in the haz reg, whether it exists or not + public DictFrame autoRegHazard(MaterialShapes shape) { + String tag = shape.name(); + for(String mat : mats) { + registerHazards(hazards, hazMult, tag + mat); + } + return this; + } public static void registerHazards(List hazards, float hazMult, String dictKey) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java index 942f3cfcb..12318fe1d 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java @@ -61,9 +61,9 @@ public class ContainerMachineArcFurnaceLarge extends Container { if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 3, 4, false)) return null; } else if(rStack.getItem() == ModItems.arc_electrode) { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null; - } else if(rStack.getItem() instanceof ItemMachineUpgrade) { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 3, false)) return null; + } else if(rStack.getItem() instanceof ItemMachineUpgrade) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null; } else { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 5, 25, false)) return null; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 20fc7b204..d8e10dac7 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -851,6 +851,12 @@ public class MainRegistry { @EventHandler public static void PostLoad(FMLPostInitializationEvent PostEvent) { + // to make sure that foreign registered fluids are accounted for, + // even when the reload listener is registered too late due to load order + // IMPORTANT: fluids have to load before recipes. weird shit happens if not. + Fluids.reloadFluids(); + FluidContainerRegistry.register(); + MagicRecipes.register(); LemegetonRecipes.register(); SILEXRecipes.register(); @@ -879,7 +885,6 @@ public class MainRegistry { ArmorUtil.register(); HazmatRegistry.registerHazmats(); DamageResistanceHandler.init(); - FluidContainerRegistry.register(); BlockToolConversion.registerRecipes(); AchievementHandler.register(); @@ -912,10 +917,6 @@ public class MainRegistry { SuicideThreadDump.register(); CommandReloadClient.register(); - // to make sure that foreign registered fluids are accounted for, - // even when the reload listener is registered too late due to load order - Fluids.reloadFluids(); - //ExplosionTests.runTest(); } diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java index ecde925fa..37004116d 100644 --- a/src/main/java/com/hbm/module/ModulePatternMatcher.java +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -139,8 +139,8 @@ public class ModulePatternMatcher { } switch(mode) { - case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter); - case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter); + case MODE_EXACT: return input.isItemEqual(filter)/* && ItemStack.areItemStackTagsEqual(input, filter)*/; + case MODE_WILDCARD: return input.getItem() == filter.getItem()/* && ItemStack.areItemStackTagsEqual(input, filter)*/; case MODE_BEDROCK: if(input.getItem() != filter.getItem()) return false; if(!(input.getItem() instanceof ItemBedrockOreNew)) return false; diff --git a/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java b/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java index 82bf299b6..960f37f31 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java +++ b/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java @@ -15,50 +15,44 @@ import net.minecraft.util.ResourceLocation; public class RenderNukeFstbmb extends TileEntitySpecialRenderer { - @Override - public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) - { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5D, y, z + 0.5D); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); - switch(tileEntity.getBlockMetadata()) - { - case 2: - GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: - GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: - GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: - GL11.glRotatef(0, 0F, 1F, 0F); break; + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + + switch(tileEntity.getBlockMetadata()) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; } - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.fstbmb_tex); - ResourceManager.fstbmb.renderPart("Body"); - ResourceManager.fstbmb.renderPart("Balefire"); - - TileEntityNukeBalefire bf = (TileEntityNukeBalefire)tileEntity; - - if(bf.loaded) { - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png")); - RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F); - - FontRenderer font = Minecraft.getMinecraft().fontRenderer; - float f3 = 0.04F; - GL11.glTranslatef(0.815F, 0.9275F, 0.5F); - GL11.glScalef(f3, -f3, f3); - GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3); - GL11.glRotatef(90, 0, 1, 0); - GL11.glDepthMask(false); - GL11.glTranslatef(0, 1, 0); - font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000); - GL11.glDepthMask(true); - } - - GL11.glShadeModel(GL11.GL_FLAT); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.fstbmb_tex); + ResourceManager.fstbmb.renderPart("Body"); + ResourceManager.fstbmb.renderPart("Balefire"); - GL11.glPopMatrix(); - } + TileEntityNukeBalefire bf = (TileEntityNukeBalefire) tileEntity; + + if(bf.loaded) { + bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png")); + RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F); + + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + float f3 = 0.04F; + GL11.glTranslatef(0.815F, 0.9275F, 0.5F); + GL11.glScalef(f3, -f3, f3); + GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3); + GL11.glRotatef(90, 0, 1, 0); + GL11.glDepthMask(false); + GL11.glTranslatef(0, 1, 0); + font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000); + GL11.glDepthMask(true); + } + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPlushie.java b/src/main/java/com/hbm/render/tileentity/RenderPlushie.java index 702817abe..a482eba91 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPlushie.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPlushie.java @@ -30,10 +30,10 @@ import net.minecraftforge.client.model.IModelCustom; public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRendererProvider { public static final IModelCustom yomiModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/yomi.obj"), false).asVBO(); - public static final IModelCustom poohModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/pooh.obj"), false).asVBO(); + public static final IModelCustom hundunModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/hundun.obj"), false).asVBO(); public static final ResourceLocation yomiTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/yomi.png"); public static final ResourceLocation numbernineTex = new ResourceLocation(RefStrings.MODID, "textures/models/horse/numbernine.png"); - public static final ResourceLocation poohTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/pooh.png"); + public static final ResourceLocation hundunTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/hundun.png"); @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -53,7 +53,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen case NONE: break; case YOMI: GL11.glScaled(0.5, 0.5, 0.5); break; case NUMBERNINE: GL11.glScaled(0.75, 0.75, 0.75); break; - case POOH: GL11.glScaled(0.75, 0.75, 0.75); break; + case HUNDUN: GL11.glScaled(1, 1, 1); break; } renderPlushie(te.type); @@ -110,9 +110,9 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen IIcon icon = stack.getIconIndex(); ItemRenderer.renderItemIn2D(Tessellator.instance, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F); break; - case POOH: - Minecraft.getMinecraft().getTextureManager().bindTexture(poohTex); - poohModel.renderAll(); + case HUNDUN: + Minecraft.getMinecraft().getTextureManager().bindTexture(hundunTex); + hundunModel.renderPart("goober_posed"); break; } } @@ -138,7 +138,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen case NONE: break; case YOMI: GL11.glScaled(1.25, 1.25, 1.25); break; case NUMBERNINE: GL11.glTranslated(0, 0.25, 0.25); GL11.glScaled(1.25, 1.25, 1.25); break; - case POOH: GL11.glTranslated(0, 0.25, 0); GL11.glScaled(1.5, 1.5, 1.5); break; + case HUNDUN: GL11.glTranslated(0.5, 0.5, 0); GL11.glScaled(1.25, 1.25, 1.25); break; } renderPlushie(type); }}; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java index f88b7070b..3e9875521 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java @@ -40,7 +40,9 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { - if(!this.isLoaded()) { + this.loaded = this.isLoaded(); + + if(!loaded) { started = false; } @@ -89,21 +91,15 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU } public boolean isLoaded() { - return hasEgg() && hasBattery(); } public boolean hasEgg() { - - if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) { - return true; - } - + if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) return true; return false; } public boolean hasBattery() { - return getBattery() > 0; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index a9bc5fc86..eafcb988c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -239,7 +239,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen ItemStack valid = slots[i]; if(valid == null) return false; //null? since slots[slot] is not null by now, this other slot needs the item more - if(!(valid.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(valid, stack))) continue; //different item anyway? out with it + if(!(valid.isItemEqual(stack)/* && ItemStack.areItemStackTagsEqual(valid, stack)*/)) continue; //different item anyway? out with it //if there is another slot that actually does need the same item more, cancel if(valid.stackSize < size) diff --git a/src/main/resources/assets/hbm/models/trinkets/hundun.obj b/src/main/resources/assets/hbm/models/trinkets/hundun.obj new file mode 100644 index 000000000..4f241b676 --- /dev/null +++ b/src/main/resources/assets/hbm/models/trinkets/hundun.obj @@ -0,0 +1,1538 @@ +# Blender v2.79 (sub 0) OBJ File: 'hundun.blend' +# www.blender.org +o goober_posed +v 0.147740 1.125000 0.270838 +v 0.645838 1.125000 0.227260 +v 0.104162 1.125000 -0.227260 +v 0.602260 1.125000 -0.270838 +v 0.147740 1.625000 0.270838 +v 0.645838 1.625000 0.227260 +v 0.104162 1.625000 -0.227260 +v 0.602260 1.625000 -0.270838 +v 0.632220 1.156250 0.071604 +v 0.615878 1.156250 -0.115182 +v 0.632220 1.343750 0.071604 +v 0.615878 1.343750 -0.115182 +v 0.819006 1.156250 0.055263 +v 0.802664 1.156250 -0.131524 +v 0.819006 1.343750 0.055263 +v 0.802664 1.343750 -0.131524 +v 0.462946 1.625000 -0.070433 +v 0.452052 1.625000 -0.194957 +v 0.276160 1.625000 -0.054091 +v 0.265265 1.625000 -0.178616 +v 0.276160 1.875000 -0.054091 +v 0.462946 1.875000 -0.070433 +v 0.452052 1.875000 -0.194957 +v 0.265265 1.875000 -0.178616 +v 0.484735 1.625000 0.178616 +v 0.473840 1.625000 0.054091 +v 0.297948 1.625000 0.194957 +v 0.287054 1.625000 0.070433 +v 0.297948 1.875000 0.194957 +v 0.484735 1.875000 0.178616 +v 0.473840 1.875000 0.054091 +v 0.287054 1.875000 0.070433 +v -0.374080 0.062119 0.250000 +v 0.509803 0.946002 0.250000 +v -0.374080 0.062119 -0.250000 +v 0.509803 0.946002 -0.250000 +v -0.727633 0.415672 -0.250000 +v -0.727633 0.415672 0.250000 +v 0.156250 1.299556 0.250000 +v 0.156250 1.299556 -0.250000 +v 0.250000 0.875000 0.312500 +v 0.500000 0.125000 -0.062500 +v 0.250000 0.875000 0.062500 +v 0.500000 0.125000 -0.312500 +v 0.250000 0.875000 -0.312500 +v 0.250000 0.875000 -0.062500 +v 0.500000 0.875000 -0.062500 +v 0.500000 0.875000 -0.312500 +v 0.250000 0.000000 -0.312500 +v 0.250000 0.000000 -0.062500 +v 0.500000 0.125000 0.062500 +v 0.500000 0.125000 0.312500 +v 0.625000 0.125000 -0.062500 +v 0.625000 0.125000 -0.312500 +v 0.625000 0.000000 -0.062500 +v 0.625000 0.000000 -0.312500 +v 0.500000 0.875000 0.312500 +v 0.500000 0.875000 0.062500 +v 0.250000 0.000000 0.062500 +v 0.250000 0.000000 0.312500 +v 0.625000 0.125000 0.312500 +v 0.625000 0.125000 0.062500 +v 0.625000 0.000000 0.312500 +v 0.625000 0.000000 0.062500 +v 0.087399 0.282874 -0.062500 +v 0.087399 0.282874 -0.312500 +v 0.087399 0.282874 0.062500 +v 0.087399 0.282874 0.312500 +v -0.637046 0.476988 -0.062500 +v -0.637046 0.476988 -0.312500 +v 0.143435 0.009040 -0.312500 +v 0.143435 0.009040 -0.062500 +v 0.119751 0.403615 -0.062500 +v 0.119751 0.403615 -0.312500 +v 0.240492 0.371262 -0.062500 +v 0.240492 0.371262 -0.312500 +v -0.218788 0.106097 -0.062500 +v -0.218788 0.106097 -0.312500 +v -0.734103 0.114766 -0.312500 +v -0.734103 0.114766 -0.062500 +v -0.251140 -0.014643 -0.062500 +v -0.251140 -0.014643 -0.312500 +v -0.637046 0.476988 0.312500 +v -0.637046 0.476988 0.062500 +v 0.143435 0.009040 0.062500 +v 0.143435 0.009040 0.312500 +v 0.119751 0.403615 0.312500 +v 0.119751 0.403615 0.062500 +v 0.240492 0.371262 0.312500 +v 0.240492 0.371262 0.062500 +v -0.218788 0.106097 0.312500 +v -0.218788 0.106097 0.062500 +v -0.734103 0.114766 0.062500 +v -0.734103 0.114766 0.312500 +v -0.251140 -0.014643 0.312500 +v -0.251140 -0.014643 0.062500 +v 0.023667 0.415672 0.281250 +v 0.553998 0.946002 0.281250 +v 0.023667 0.415672 -0.281250 +v 0.553998 0.946002 -0.281250 +v -0.374080 0.813420 -0.281250 +v -0.374080 0.813420 0.281250 +v 0.156250 1.343750 0.281250 +v 0.156250 1.343750 -0.281250 +v 0.119333 1.093750 0.304692 +v 0.679692 1.093750 0.255667 +v 0.070308 1.093750 -0.255667 +v 0.630667 1.093750 -0.304692 +v 0.119333 1.656250 0.304692 +v 0.679692 1.656250 0.255667 +v 0.070308 1.656250 -0.255667 +v 0.630667 1.656250 -0.304692 +v -0.669194 0.312500 0.044194 +v -0.580806 0.312500 -0.044194 +v -0.631503 0.414894 -0.094892 +v -0.719892 0.414894 -0.006503 +v -0.870420 0.025712 -0.333808 +v -0.958808 0.025712 -0.245420 +v -0.921117 0.128106 -0.384506 +v -1.009506 0.128106 -0.296117 +v -0.978553 0.062500 -0.228553 +v -0.853553 0.062500 -0.228553 +v -0.853553 0.187500 -0.228553 +v -0.978553 0.187500 -0.228553 +v -0.853553 0.062500 -0.728553 +v -0.978553 0.062500 -0.728553 +v -0.853553 0.187500 -0.728553 +v -0.978553 0.187500 -0.728553 +v -0.960248 0.062500 -0.772748 +v -0.871859 0.062500 -0.684359 +v -0.871859 0.187500 -0.684359 +v -0.960248 0.187500 -0.772748 +v -0.518306 0.062500 -1.037912 +v -0.606694 0.062500 -1.126301 +v -0.518306 0.187500 -1.037912 +v -0.606694 0.187500 -1.126301 +v -0.562500 0.000000 -0.957107 +v -0.562500 0.000000 -1.207107 +v -0.562500 0.250000 -0.957107 +v -0.562500 0.250000 -1.207107 +v -0.062500 0.000000 -0.957107 +v -0.062500 0.000000 -1.207107 +v -0.062500 0.250000 -0.957107 +v -0.062500 0.250000 -1.207107 +v -0.130233 0.999672 -0.187500 +v -0.153109 1.022549 -0.308241 +v -0.041844 1.088061 -0.187500 +v -0.064721 1.110937 -0.308241 +v 0.125897 0.743543 -0.284557 +v 0.103020 0.766419 -0.405298 +v 0.214285 0.831931 -0.284557 +v 0.191409 0.854808 -0.405298 +v -0.266158 0.428491 -0.367025 +v -0.254720 0.417053 -0.306654 +v -0.479599 0.641932 -0.286144 +v -0.468161 0.630494 -0.225773 +v -0.114608 0.984047 -0.225773 +v -0.126046 0.995486 -0.286144 +v 0.098834 0.770606 -0.306654 +v 0.087396 0.782044 -0.367025 +v -0.153109 1.022549 0.308241 +v -0.130233 0.999672 0.187500 +v -0.064721 1.110937 0.308241 +v -0.041844 1.088061 0.187500 +v 0.103020 0.766419 0.405298 +v 0.125897 0.743543 0.284557 +v 0.191409 0.854808 0.405298 +v 0.214285 0.831931 0.284557 +v -0.254720 0.417053 0.306654 +v -0.266158 0.428491 0.367025 +v -0.468161 0.630494 0.225773 +v -0.479599 0.641932 0.286144 +v -0.126046 0.995486 0.286144 +v -0.114608 0.984047 0.225773 +v 0.087396 0.782044 0.367025 +v 0.098834 0.770606 0.306654 +vt 0.187500 0.875000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.250000 0.750000 +vt 0.187500 0.875000 +vt 0.187500 0.750000 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.750000 +vt 0.250000 0.968750 +vt 0.226562 0.937500 +vt 0.250000 0.937500 +vt 0.484375 0.640625 +vt 0.460938 0.687500 +vt 0.460938 0.640625 +vt 0.437500 0.640625 +vt 0.437500 0.687500 +vt 0.460938 0.734375 +vt 0.484375 0.687500 +vt 0.484375 0.734375 +vt 0.507812 0.687500 +vt 0.507812 0.640625 +vt 0.484375 0.593750 +vt 0.460938 0.593750 +vt 0.226562 0.937500 +vt 0.250000 0.968750 +vt 0.226562 0.968750 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.265625 0.875000 +vt 0.250000 0.937500 +vt 0.210938 0.937500 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.937500 +vt 0.265625 0.875000 +vt 0.218750 0.375000 +vt 0.062500 0.250000 +vt 0.218750 0.250000 +vt 0.062500 0.625000 +vt 0.218750 0.500000 +vt 0.218750 0.625000 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.062500 0.750000 +vt 0.218750 0.750000 +vt -0.000000 0.500000 +vt -0.000000 0.625000 +vt 0.546875 0.937500 +vt 0.578125 1.000000 +vt 0.546875 1.000000 +vt 0.703125 0.937500 +vt 0.734375 1.000000 +vt 0.703125 1.000000 +vt 0.734375 0.750000 +vt 0.703125 0.750000 +vt 0.578125 0.687500 +vt 0.546875 0.593750 +vt 0.578125 0.593750 +vt 0.734375 0.687500 +vt 0.703125 0.593750 +vt 0.734375 0.593750 +vt 0.578125 0.750000 +vt 0.546875 0.750000 +vt 0.703125 0.687500 +vt 0.703125 0.718750 +vt 0.687500 0.718750 +vt 0.625000 0.687500 +vt 0.593750 0.718750 +vt 0.546875 0.718750 +vt 0.578125 0.718750 +vt 0.734375 0.718750 +vt 0.781250 0.687500 +vt 0.750000 0.718750 +vt 0.546875 0.687500 +vt 0.531250 0.718750 +vt 0.812500 0.906250 +vt 0.781250 0.906250 +vt 0.656250 0.906250 +vt 0.625000 0.906250 +vt 0.640625 0.343750 +vt 0.640625 0.250000 +vt 0.671875 0.281250 +vt 0.718750 0.312500 +vt 0.687500 0.500000 +vt 0.687500 0.312500 +vt 0.718750 0.250000 +vt 0.687500 0.156250 +vt 0.718750 0.156250 +vt 0.765625 0.343750 +vt 0.734375 0.281250 +vt 0.765625 0.250000 +vt 0.687500 0.281250 +vt 0.718750 0.281250 +vt 0.453125 0.343750 +vt 0.453125 0.250000 +vt 0.484375 0.281250 +vt 0.781250 0.218750 +vt 0.812500 0.312500 +vt 0.781250 0.312500 +vt 0.781250 0.343750 +vt 0.812500 0.468750 +vt 0.781250 0.468750 +vt 0.578125 0.343750 +vt 0.546875 0.281250 +vt 0.578125 0.250000 +vt 0.531250 0.250000 +vt 0.500000 0.156250 +vt 0.531250 0.156250 +vt 0.531250 0.312500 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.718750 0.593750 +vt 0.718750 0.500000 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.593750 0.218750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.593750 +vt 0.531250 0.500000 +vt 0.429688 0.375000 +vt 0.343750 0.250000 +vt 0.429688 0.250000 +vt 0.343750 0.625000 +vt 0.429688 0.500000 +vt 0.429688 0.625000 +vt 0.343750 0.500000 +vt 0.343750 0.375000 +vt 0.429688 0.750000 +vt 0.281250 0.500000 +vt 0.281250 0.625000 +vt 0.437500 0.875000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.312500 0.875000 +vt 0.375000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 0.750000 +vt 0.312500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.046875 0.093750 +vt 0.031250 0.062500 +vt 0.046875 0.062500 +vt 0.031250 0.250000 +vt 0.046875 0.218750 +vt 0.046875 0.250000 +vt 0.031250 0.093750 +vt 0.015625 0.218750 +vt 0.015625 0.093750 +vt 0.000000 0.093750 +vt 0.000000 0.218750 +vt 0.062500 0.218750 +vt 0.031250 0.218750 +vt 0.109375 0.093750 +vt 0.093750 0.062500 +vt 0.109375 0.062500 +vt 0.093750 0.250000 +vt 0.109375 0.218750 +vt 0.109375 0.250000 +vt 0.093750 0.093750 +vt 0.078125 0.218750 +vt 0.078125 0.093750 +vt 0.062500 0.218750 +vt 0.062500 0.093750 +vt 0.125000 0.093750 +vt 0.093750 0.218750 +vt 0.171875 0.093750 +vt 0.156250 0.062500 +vt 0.171875 0.062500 +vt 0.156250 0.250000 +vt 0.171875 0.218750 +vt 0.171875 0.250000 +vt 0.156250 0.093750 +vt 0.140625 0.218750 +vt 0.140625 0.093750 +vt 0.125000 0.218750 +vt 0.125000 0.093750 +vt 0.187500 0.093750 +vt 0.156250 0.218750 +vt 0.281250 0.125000 +vt 0.250000 0.062500 +vt 0.281250 0.062500 +vt 0.250000 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.312500 +vt 0.312500 0.125000 +vt 0.250000 0.125000 +vt 0.250000 0.250000 +vt 0.218750 0.250000 +vt 0.218750 0.125000 +vt 0.187500 0.250000 +vt 0.187500 0.125000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.031250 0.468750 +vt 0.031250 0.375000 +vt 0.046875 0.343750 +vt 0.046875 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.468750 +vt -0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.406250 +vt 0.218750 0.312500 +vt 0.281250 0.328125 +vt 0.289062 0.328125 +vt 0.289062 0.406250 +vt 0.218750 0.500000 +vt 0.281250 0.500000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt 0.046875 0.375000 +vt 0.046875 0.343750 +vt 0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.000000 0.375000 +vt 0.062500 0.468750 +vt 0.031250 0.375000 +vt 0.031250 0.468750 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.281250 0.406250 +vt 0.218750 0.500000 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.312500 +vt 0.218750 0.312500 +vt 0.289062 0.328125 +vt 0.281250 0.328125 +vt 0.187500 1.000000 +vt 0.250000 0.875000 +vt 0.226562 0.968750 +vt 0.265625 0.937500 +vt 0.265625 0.937500 +vt 0.578125 0.937500 +vt 0.734375 0.937500 +vt 0.687500 0.906250 +vt 0.656250 0.906250 +vt 0.656250 0.687500 +vt 0.593750 0.906250 +vt 0.750000 0.906250 +vt 0.531250 0.906250 +vt 0.500000 0.906250 +vt 0.500000 0.687500 +vt 0.812500 0.687500 +vt 0.656250 0.687500 +vt 0.671875 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.687500 0.250000 +vt 0.734375 0.468750 +vt 0.484375 0.468750 +vt 0.437500 0.468750 +vt 0.437500 0.343750 +vt 0.500000 0.250000 +vt 0.812500 0.218750 +vt 0.812500 0.343750 +vt 0.546875 0.468750 +vt 0.687500 0.593750 +vt 0.625000 0.218750 +vt 0.625000 0.343750 +vt 0.500000 0.593750 +vt 0.343750 0.750000 +vt 0.437500 1.000000 +vt 0.500000 0.875000 +vt 0.062500 0.093750 +vt 0.125000 0.218750 +vt 0.187500 0.218750 +vt 0.312500 0.250000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt -0.000000 0.375000 +vt 0.281250 0.312500 +vt 0.062500 0.375000 +vt 0.281250 0.500000 +vt 0.289062 0.406250 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.9962 0.0000 -0.0872 +vn -0.9962 0.0000 0.0872 +vn -0.0872 0.0000 -0.9962 +vn 0.0872 0.0000 0.9962 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.7071 0.7071 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.5792 0.5736 0.5792 +vn -0.5792 -0.5736 -0.5792 +vn -0.7071 -0.0000 0.7071 +vn 0.4056 -0.8192 0.4056 +vn 0.7071 -0.0000 -0.7071 +vn -0.4056 0.8192 -0.4056 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.6830 0.6830 0.2588 +vn 0.6830 -0.6830 -0.2588 +vn -0.1830 0.1830 -0.9659 +vn 0.1830 -0.1830 0.9659 +vn -0.6830 0.6830 -0.2588 +vn 0.6830 -0.6830 0.2588 +vn 0.1830 -0.1830 -0.9659 +vn -0.1830 0.1830 0.9659 +s off +f 3/1/1 2/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 4/7/3 6/4/3 2/8/3 +f 1/9/4 7/10/4 3/11/4 +f 3/11/5 8/12/5 4/7/5 +f 2/8/6 5/13/6 1/14/6 +f 31/15/2 29/16/2 30/17/2 +f 14/18/3 15/19/3 13/20/3 +f 9/21/6 15/19/6 11/22/6 +f 11/23/2 16/24/2 12/25/2 +f 12/26/5 14/18/5 10/27/5 +f 10/28/1 13/20/1 9/29/1 +f 23/30/2 21/31/2 22/32/2 +f 20/33/5 23/30/5 18/34/5 +f 17/35/6 21/36/6 19/37/6 +f 19/38/4 24/39/4 20/33/4 +f 18/34/3 22/40/3 17/35/3 +f 28/41/5 31/42/5 26/43/5 +f 25/44/6 29/16/6 27/45/6 +f 27/45/4 32/46/4 28/41/4 +f 26/47/3 30/17/3 25/44/3 +f 35/48/7 34/49/7 33/50/7 +f 39/51/8 37/52/8 38/53/8 +f 33/54/9 37/52/9 35/55/9 +f 35/48/10 40/56/10 36/57/10 +f 34/58/11 38/53/11 33/59/11 +f 36/60/12 39/51/12 34/61/12 +f 57/62/2 43/63/2 41/64/2 +f 47/65/2 45/66/2 46/67/2 +f 44/68/13 47/65/13 42/69/13 +f 64/70/1 60/71/1 59/72/1 +f 56/73/1 50/74/1 49/75/1 +f 51/76/13 57/62/13 52/77/13 +f 55/78/11 53/79/11 42/80/11 +f 59/81/10 51/82/10 64/70/10 +f 61/83/13 64/70/13 62/84/13 +f 52/77/2 62/84/2 51/76/2 +f 53/79/13 56/73/13 54/85/13 +f 42/69/2 54/85/2 44/68/2 +f 49/86/10 44/87/10 56/73/10 +f 63/88/11 61/83/11 52/89/11 +f 49/86/14 46/90/14 45/91/14 +f 59/81/14 41/92/14 43/93/14 +f 77/94/11 72/95/11 65/96/11 +f 66/97/15 69/98/15 65/99/15 +f 76/100/16 72/101/16 71/102/16 +f 78/103/10 66/104/10 71/105/10 +f 73/106/15 76/100/15 74/107/15 +f 65/99/17 74/107/17 66/97/17 +f 91/108/11 86/109/11 68/110/11 +f 71/111/18 77/112/18 78/113/18 +f 77/112/16 82/114/16 78/113/16 +f 82/114/18 80/115/18 79/116/18 +f 92/117/10 67/118/10 85/119/10 +f 90/120/16 86/121/16 85/122/16 +f 67/123/15 83/124/15 68/125/15 +f 79/126/17 69/98/17 70/127/17 +f 87/128/15 90/120/15 88/129/15 +f 68/125/17 88/129/17 67/123/17 +f 85/130/18 91/131/18 92/132/18 +f 91/131/16 96/133/16 92/132/16 +f 96/133/18 94/134/18 93/135/18 +f 93/136/17 83/124/17 84/137/17 +f 99/138/7 98/139/7 97/140/7 +f 103/141/8 101/142/8 102/143/8 +f 99/138/10 104/144/10 100/145/10 +f 97/146/11 103/141/11 102/143/11 +f 100/147/12 103/141/12 98/148/12 +f 107/149/1 106/150/1 105/151/1 +f 110/152/2 111/153/2 109/154/2 +f 108/155/3 110/152/3 106/156/3 +f 105/157/4 111/158/4 107/159/4 +f 107/159/5 112/160/5 108/155/5 +f 106/156/6 109/161/6 105/162/6 +f 115/163/19 113/164/19 114/165/19 +f 118/166/20 119/167/20 117/168/20 +f 116/169/21 118/170/21 113/171/21 +f 114/172/22 118/170/22 117/173/22 +f 115/163/23 117/174/23 119/167/23 +f 116/169/24 119/167/24 120/175/24 +f 123/176/11 121/177/11 122/178/11 +f 126/179/10 127/180/10 125/181/10 +f 124/182/14 126/183/14 121/184/14 +f 121/184/1 125/185/1 122/186/1 +f 122/187/13 127/180/13 123/176/13 +f 123/176/2 128/188/2 124/182/2 +f 131/189/21 129/190/21 130/191/21 +f 134/192/23 135/193/23 133/194/23 +f 132/195/25 134/196/25 129/197/25 +f 129/197/1 133/198/1 130/199/1 +f 130/200/26 135/193/26 131/189/26 +f 131/189/2 136/201/2 132/195/2 +f 139/202/14 138/203/14 137/204/14 +f 142/205/13 143/206/13 141/207/13 +f 137/208/11 143/206/11 139/202/11 +f 140/209/2 143/206/2 144/210/2 +f 140/209/10 142/211/10 138/212/10 +f 138/212/1 141/213/1 137/214/1 +f 146/215/27 147/216/27 148/217/27 +f 152/218/28 149/219/28 150/220/28 +f 146/215/29 152/218/29 150/220/29 +f 146/215/9 149/221/9 145/222/9 +f 145/223/30 151/224/30 147/225/30 +f 147/225/12 152/218/12 148/217/12 +f 158/226/27 156/227/27 157/228/27 +f 160/229/29 155/230/29 158/226/29 +f 159/231/28 153/232/28 160/229/28 +f 155/230/9 154/233/9 156/234/9 +f 159/235/30 156/227/30 154/236/30 +f 161/237/31 164/238/31 162/239/31 +f 168/240/32 165/241/32 166/242/32 +f 162/243/33 168/244/33 166/245/33 +f 162/246/9 165/241/9 161/237/9 +f 161/237/34 167/247/34 163/248/34 +f 164/249/12 167/247/12 168/244/12 +f 173/250/31 171/251/31 172/252/31 +f 176/253/33 171/251/33 174/254/33 +f 175/255/32 169/256/32 176/257/32 +f 172/252/9 169/258/9 170/259/9 +f 175/255/34 172/252/34 170/259/34 +f 3/1/1 4/260/1 2/2/1 +f 6/4/2 8/12/2 7/5/2 +f 4/7/3 8/12/3 6/4/3 +f 1/9/4 5/261/4 7/10/4 +f 3/11/5 7/10/5 8/12/5 +f 2/8/6 6/4/6 5/13/6 +f 31/15/2 32/262/2 29/16/2 +f 14/18/3 16/24/3 15/19/3 +f 9/21/6 13/20/6 15/19/6 +f 11/23/2 15/19/2 16/24/2 +f 12/26/5 16/24/5 14/18/5 +f 10/28/1 14/18/1 13/20/1 +f 23/30/2 24/39/2 21/31/2 +f 20/33/5 24/39/5 23/30/5 +f 17/35/6 22/40/6 21/36/6 +f 19/38/4 21/263/4 24/39/4 +f 18/34/3 23/30/3 22/40/3 +f 28/41/5 32/46/5 31/42/5 +f 25/44/6 30/17/6 29/16/6 +f 27/45/4 29/16/4 32/46/4 +f 26/47/3 31/264/3 30/17/3 +f 35/48/7 36/57/7 34/49/7 +f 39/51/8 40/56/8 37/52/8 +f 33/54/9 38/53/9 37/52/9 +f 35/48/10 37/52/10 40/56/10 +f 34/58/11 39/51/11 38/53/11 +f 36/60/12 40/56/12 39/51/12 +f 57/62/2 58/265/2 43/63/2 +f 47/65/2 48/266/2 45/66/2 +f 44/68/13 48/266/13 47/65/13 +f 64/70/1 63/88/1 60/71/1 +f 56/73/1 55/78/1 50/74/1 +f 51/76/13 58/265/13 57/62/13 +f 47/267/11 46/268/11 42/80/11 +f 46/268/11 50/269/11 42/80/11 +f 50/269/11 55/78/11 42/80/11 +f 59/81/10 43/93/10 51/82/10 +f 43/93/10 58/270/10 51/82/10 +f 51/82/10 62/84/10 64/70/10 +f 61/83/13 63/88/13 64/70/13 +f 52/77/2 61/83/2 62/84/2 +f 53/79/13 55/78/13 56/73/13 +f 42/69/2 53/79/2 54/85/2 +f 49/86/10 45/91/10 44/87/10 +f 45/91/10 48/271/10 44/87/10 +f 44/87/10 54/85/10 56/73/10 +f 57/272/11 41/273/11 52/89/11 +f 41/273/11 60/274/11 52/89/11 +f 60/274/11 63/88/11 52/89/11 +f 49/86/14 50/275/14 46/90/14 +f 59/81/14 60/276/14 41/92/14 +f 65/96/11 69/277/11 77/94/11 +f 69/277/11 80/278/11 77/94/11 +f 80/278/11 81/279/11 77/94/11 +f 72/95/11 75/280/11 65/96/11 +f 75/280/11 73/106/11 65/96/11 +f 66/97/15 70/127/15 69/98/15 +f 76/100/16 75/280/16 72/101/16 +f 78/103/10 82/114/10 79/116/10 +f 79/116/10 70/281/10 78/103/10 +f 70/281/10 66/104/10 78/103/10 +f 66/104/10 74/107/10 76/100/10 +f 66/104/10 76/100/10 71/105/10 +f 73/106/15 75/280/15 76/100/15 +f 65/99/17 73/106/17 74/107/17 +f 68/110/11 83/282/11 91/108/11 +f 83/282/11 94/283/11 91/108/11 +f 94/283/11 95/284/11 91/108/11 +f 86/109/11 89/285/11 68/110/11 +f 89/285/11 87/128/11 68/110/11 +f 71/111/18 72/286/18 77/112/18 +f 77/112/16 81/287/16 82/114/16 +f 82/114/18 81/287/18 80/115/18 +f 92/117/10 96/133/10 93/135/10 +f 93/135/10 84/288/10 92/117/10 +f 84/288/10 67/118/10 92/117/10 +f 67/118/10 88/129/10 90/120/10 +f 67/118/10 90/120/10 85/119/10 +f 90/120/16 89/285/16 86/121/16 +f 67/123/15 84/137/15 83/124/15 +f 79/126/17 80/289/17 69/98/17 +f 87/128/15 89/285/15 90/120/15 +f 68/125/17 87/128/17 88/129/17 +f 85/130/18 86/290/18 91/131/18 +f 91/131/16 95/291/16 96/133/16 +f 96/133/18 95/291/18 94/134/18 +f 93/136/17 94/292/17 83/124/17 +f 99/138/7 100/145/7 98/139/7 +f 103/141/8 104/144/8 101/142/8 +f 99/138/10 101/142/10 104/144/10 +f 97/146/11 98/293/11 103/141/11 +f 100/147/12 104/144/12 103/141/12 +f 107/149/1 108/294/1 106/150/1 +f 110/152/2 112/160/2 111/153/2 +f 108/155/3 112/160/3 110/152/3 +f 105/157/4 109/295/4 111/158/4 +f 107/159/5 111/158/5 112/160/5 +f 106/156/6 110/152/6 109/161/6 +f 115/163/19 116/169/19 113/164/19 +f 118/166/20 120/175/20 119/167/20 +f 116/169/21 120/175/21 118/170/21 +f 114/172/22 113/171/22 118/170/22 +f 115/163/23 114/296/23 117/174/23 +f 116/169/24 115/163/24 119/167/24 +f 123/176/11 124/182/11 121/177/11 +f 126/179/10 128/188/10 127/180/10 +f 124/182/14 128/188/14 126/183/14 +f 121/184/1 126/183/1 125/185/1 +f 122/187/13 125/297/13 127/180/13 +f 123/176/2 127/180/2 128/188/2 +f 131/189/21 132/195/21 129/190/21 +f 134/192/23 136/201/23 135/193/23 +f 132/195/25 136/201/25 134/196/25 +f 129/197/1 134/196/1 133/198/1 +f 130/200/26 133/298/26 135/193/26 +f 131/189/2 135/193/2 136/201/2 +f 139/202/14 140/209/14 138/203/14 +f 142/205/13 144/210/13 143/206/13 +f 137/208/11 141/299/11 143/206/11 +f 140/209/2 139/202/2 143/206/2 +f 140/209/10 144/210/10 142/211/10 +f 138/212/1 142/211/1 141/213/1 +f 146/215/27 145/300/27 147/216/27 +f 152/218/28 151/301/28 149/219/28 +f 146/215/29 148/217/29 152/218/29 +f 146/215/9 150/220/9 149/221/9 +f 145/223/30 149/302/30 151/224/30 +f 147/225/12 151/224/12 152/218/12 +f 158/226/27 155/230/27 156/227/27 +f 160/229/29 153/232/29 155/230/29 +f 159/231/28 154/303/28 153/232/28 +f 155/230/9 153/232/9 154/233/9 +f 159/235/30 157/228/30 156/227/30 +f 161/237/31 163/248/31 164/238/31 +f 168/240/32 167/247/32 165/241/32 +f 162/243/33 164/249/33 168/244/33 +f 162/246/9 166/304/9 165/241/9 +f 161/237/34 165/241/34 167/247/34 +f 164/249/12 163/248/12 167/247/12 +f 173/250/31 174/254/31 171/251/31 +f 176/253/33 169/305/33 171/251/33 +f 175/255/32 170/259/32 169/256/32 +f 172/252/9 171/306/9 169/258/9 +f 175/255/34 173/250/34 172/252/34 +o goober +v 0.250000 1.000000 3.250000 +v 0.750000 1.000000 3.250000 +v 0.250000 1.000000 2.750000 +v 0.750000 1.000000 2.750000 +v 0.250000 1.500000 3.250000 +v 0.750000 1.500000 3.250000 +v 0.250000 1.500000 2.750000 +v 0.750000 1.500000 2.750000 +v 0.750000 1.031250 3.093750 +v 0.750000 1.031250 2.906250 +v 0.750000 1.218750 3.093750 +v 0.750000 1.218750 2.906250 +v 0.937500 1.031250 3.093750 +v 0.937500 1.031250 2.906250 +v 0.937500 1.218750 3.093750 +v 0.937500 1.218750 2.906250 +v 0.593750 1.500000 2.937500 +v 0.593750 1.500000 2.812500 +v 0.406250 1.500000 2.937500 +v 0.406250 1.500000 2.812500 +v 0.406250 1.750000 2.937500 +v 0.593750 1.750000 2.937500 +v 0.593750 1.750000 2.812500 +v 0.406250 1.750000 2.812500 +v 0.593750 1.500000 3.187500 +v 0.593750 1.500000 3.062500 +v 0.406250 1.500000 3.187500 +v 0.406250 1.500000 3.062500 +v 0.406250 1.750000 3.187500 +v 0.593750 1.750000 3.187500 +v 0.593750 1.750000 3.062500 +v 0.406250 1.750000 3.062500 +v -0.625000 0.500000 3.250000 +v 0.625000 0.500000 3.250000 +v -0.625000 0.500000 2.750000 +v 0.625000 0.500000 2.750000 +v -0.625000 1.000000 2.750000 +v -0.625000 1.000000 3.250000 +v 0.625000 1.000000 3.250000 +v 0.625000 1.000000 2.750000 +v 0.250000 0.875000 3.312500 +v 0.500000 0.125000 2.937500 +v 0.250000 0.875000 3.062500 +v 0.500000 0.125000 2.687500 +v 0.250000 0.875000 2.687500 +v 0.250000 0.875000 2.937500 +v 0.500000 0.875000 2.937500 +v 0.500000 0.875000 2.687500 +v 0.250000 0.000000 2.687500 +v 0.250000 0.000000 2.937500 +v 0.500000 0.125000 3.062500 +v 0.500000 0.125000 3.312500 +v 0.625000 0.125000 2.937500 +v 0.625000 0.125000 2.687500 +v 0.625000 0.000000 2.937500 +v 0.625000 0.000000 2.687500 +v 0.500000 0.875000 3.312500 +v 0.500000 0.875000 3.062500 +v 0.250000 0.000000 3.062500 +v 0.250000 0.000000 3.312500 +v 0.625000 0.125000 3.312500 +v 0.625000 0.125000 3.062500 +v 0.625000 0.000000 3.312500 +v 0.625000 0.000000 3.062500 +v -0.312500 0.125000 2.937500 +v -0.312500 0.125000 2.687500 +v -0.312500 0.125000 3.062500 +v -0.312500 0.125000 3.312500 +v -0.312500 0.875000 2.937500 +v -0.312500 0.875000 2.687500 +v -0.562500 0.000000 2.687500 +v -0.562500 0.000000 2.937500 +v -0.187500 0.125000 2.937500 +v -0.187500 0.125000 2.687500 +v -0.187500 0.000000 2.937500 +v -0.187500 0.000000 2.687500 +v -0.562500 0.375000 2.937500 +v -0.562500 0.375000 2.687500 +v -0.687500 0.875000 2.687500 +v -0.687500 0.875000 2.937500 +v -0.687500 0.375000 2.937500 +v -0.687500 0.375000 2.687500 +v -0.312500 0.875000 3.312500 +v -0.312500 0.875000 3.062500 +v -0.562500 0.000000 3.062500 +v -0.562500 0.000000 3.312500 +v -0.187500 0.125000 3.312500 +v -0.187500 0.125000 3.062500 +v -0.187500 0.000000 3.312500 +v -0.187500 0.000000 3.062500 +v -0.562500 0.375000 3.312500 +v -0.562500 0.375000 3.062500 +v -0.687500 0.875000 3.062500 +v -0.687500 0.875000 3.312500 +v -0.687500 0.375000 3.312500 +v -0.687500 0.375000 3.062500 +v -0.093750 0.468750 3.281250 +v 0.656250 0.468750 3.281250 +v -0.093750 0.468750 2.718750 +v 0.656250 0.468750 2.718750 +v -0.093750 1.031250 2.718750 +v -0.093750 1.031250 3.281250 +v 0.656250 1.031250 3.281250 +v 0.656250 1.031250 2.718750 +v 0.218750 0.968750 3.281250 +v 0.781250 0.968750 3.281250 +v 0.218750 0.968750 2.718750 +v 0.781250 0.968750 2.718750 +v 0.218750 1.531250 3.281250 +v 0.781250 1.531250 3.281250 +v 0.218750 1.531250 2.718750 +v 0.781250 1.531250 2.718750 +v -0.625000 0.812500 3.062500 +v -0.625000 0.812500 2.937500 +v -0.625000 0.937500 2.937500 +v -0.625000 0.937500 3.062500 +v -1.125000 0.812500 2.937500 +v -1.125000 0.812500 3.062500 +v -1.125000 0.937500 2.937500 +v -1.125000 0.937500 3.062500 +v -1.125000 0.812500 3.062500 +v -1.125000 0.812500 2.937500 +v -1.125000 0.937500 2.937500 +v -1.125000 0.937500 3.062500 +v -1.625000 0.812500 2.937500 +v -1.625000 0.812500 3.062500 +v -1.625000 0.937500 2.937500 +v -1.625000 0.937500 3.062500 +v -1.625000 0.812500 3.062500 +v -1.625000 0.812500 2.937500 +v -1.625000 0.937500 2.937500 +v -1.625000 0.937500 3.062500 +v -2.125000 0.812500 2.937500 +v -2.125000 0.812500 3.062500 +v -2.125000 0.937500 2.937500 +v -2.125000 0.937500 3.062500 +v -2.125000 0.750000 2.875000 +v -2.125000 0.750000 3.125000 +v -2.125000 1.000000 2.875000 +v -2.125000 1.000000 3.125000 +v -2.625000 0.750000 2.875000 +v -2.625000 0.750000 3.125000 +v -2.625000 1.000000 2.875000 +v -2.625000 1.000000 3.125000 +v 0.187500 1.000000 2.750000 +v 0.187500 1.000000 2.625000 +v 0.312500 1.000000 2.750000 +v 0.312500 1.000000 2.625000 +v 0.187500 0.625000 2.750000 +v 0.187500 0.625000 2.625000 +v 0.312500 0.625000 2.750000 +v 0.312500 0.625000 2.625000 +v -0.312500 0.656250 2.656250 +v -0.312500 0.656250 2.718750 +v -0.312500 0.968750 2.656250 +v -0.312500 0.968750 2.718750 +v 0.187500 0.968750 2.718750 +v 0.187500 0.968750 2.656250 +v 0.187500 0.656250 2.718750 +v 0.187500 0.656250 2.656250 +v 0.187500 1.000000 3.375000 +v 0.187500 1.000000 3.250000 +v 0.312500 1.000000 3.375000 +v 0.312500 1.000000 3.250000 +v 0.187500 0.625000 3.375000 +v 0.187500 0.625000 3.250000 +v 0.312500 0.625000 3.375000 +v 0.312500 0.625000 3.250000 +v -0.312500 0.656250 3.281250 +v -0.312500 0.656250 3.343750 +v -0.312500 0.968750 3.281250 +v -0.312500 0.968750 3.343750 +v 0.187500 0.968750 3.343750 +v 0.187500 0.968750 3.281250 +v 0.187500 0.656250 3.343750 +v 0.187500 0.656250 3.281250 +vt 0.187500 0.875000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.250000 0.750000 +vt 0.187500 0.875000 +vt 0.187500 0.750000 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.750000 +vt 0.250000 0.968750 +vt 0.226562 0.937500 +vt 0.250000 0.937500 +vt 0.484375 0.640625 +vt 0.460938 0.687500 +vt 0.460938 0.640625 +vt 0.437500 0.640625 +vt 0.437500 0.687500 +vt 0.460938 0.734375 +vt 0.484375 0.687500 +vt 0.484375 0.734375 +vt 0.507812 0.687500 +vt 0.507812 0.640625 +vt 0.484375 0.593750 +vt 0.460938 0.593750 +vt 0.226562 0.937500 +vt 0.250000 0.968750 +vt 0.226562 0.968750 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.265625 0.875000 +vt 0.250000 0.937500 +vt 0.210938 0.937500 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.937500 +vt 0.265625 0.875000 +vt 0.218750 0.375000 +vt 0.062500 0.250000 +vt 0.218750 0.250000 +vt 0.062500 0.625000 +vt 0.218750 0.500000 +vt 0.218750 0.625000 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.062500 0.750000 +vt 0.218750 0.750000 +vt -0.000000 0.500000 +vt -0.000000 0.625000 +vt 0.546875 0.937500 +vt 0.578125 1.000000 +vt 0.546875 1.000000 +vt 0.703125 0.937500 +vt 0.734375 1.000000 +vt 0.703125 1.000000 +vt 0.734375 0.750000 +vt 0.703125 0.750000 +vt 0.578125 0.687500 +vt 0.546875 0.593750 +vt 0.578125 0.593750 +vt 0.734375 0.687500 +vt 0.703125 0.593750 +vt 0.734375 0.593750 +vt 0.578125 0.750000 +vt 0.546875 0.750000 +vt 0.703125 0.687500 +vt 0.703125 0.718750 +vt 0.687500 0.718750 +vt 0.625000 0.687500 +vt 0.593750 0.718750 +vt 0.546875 0.718750 +vt 0.578125 0.718750 +vt 0.734375 0.718750 +vt 0.781250 0.687500 +vt 0.750000 0.718750 +vt 0.546875 0.687500 +vt 0.531250 0.718750 +vt 0.812500 0.906250 +vt 0.781250 0.906250 +vt 0.656250 0.906250 +vt 0.625000 0.906250 +vt 0.640625 0.343750 +vt 0.640625 0.250000 +vt 0.671875 0.281250 +vt 0.718750 0.312500 +vt 0.687500 0.500000 +vt 0.687500 0.312500 +vt 0.718750 0.250000 +vt 0.687500 0.156250 +vt 0.718750 0.156250 +vt 0.765625 0.343750 +vt 0.734375 0.281250 +vt 0.765625 0.250000 +vt 0.687500 0.281250 +vt 0.718750 0.281250 +vt 0.453125 0.343750 +vt 0.453125 0.250000 +vt 0.484375 0.281250 +vt 0.781250 0.218750 +vt 0.812500 0.312500 +vt 0.781250 0.312500 +vt 0.781250 0.343750 +vt 0.812500 0.468750 +vt 0.781250 0.468750 +vt 0.578125 0.343750 +vt 0.546875 0.281250 +vt 0.578125 0.250000 +vt 0.531250 0.250000 +vt 0.500000 0.156250 +vt 0.531250 0.156250 +vt 0.531250 0.312500 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.718750 0.593750 +vt 0.718750 0.500000 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.593750 0.218750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.593750 +vt 0.531250 0.500000 +vt 0.429688 0.375000 +vt 0.343750 0.250000 +vt 0.429688 0.250000 +vt 0.343750 0.625000 +vt 0.429688 0.500000 +vt 0.429688 0.625000 +vt 0.343750 0.500000 +vt 0.343750 0.375000 +vt 0.343750 0.750000 +vt 0.429688 0.750000 +vt 0.281250 0.500000 +vt 0.281250 0.625000 +vt 0.437500 0.875000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.312500 0.875000 +vt 0.375000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 0.750000 +vt 0.312500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.046875 0.093750 +vt 0.031250 0.062500 +vt 0.046875 0.062500 +vt 0.031250 0.250000 +vt 0.046875 0.218750 +vt 0.046875 0.250000 +vt 0.031250 0.093750 +vt 0.015625 0.218750 +vt 0.015625 0.093750 +vt 0.000000 0.218750 +vt 0.000000 0.093750 +vt 0.062500 0.093750 +vt 0.031250 0.218750 +vt 0.109375 0.093750 +vt 0.093750 0.062500 +vt 0.109375 0.062500 +vt 0.093750 0.250000 +vt 0.109375 0.218750 +vt 0.109375 0.250000 +vt 0.093750 0.093750 +vt 0.078125 0.218750 +vt 0.078125 0.093750 +vt 0.062500 0.218750 +vt 0.062500 0.093750 +vt 0.125000 0.093750 +vt 0.093750 0.218750 +vt 0.171875 0.093750 +vt 0.156250 0.062500 +vt 0.171875 0.062500 +vt 0.156250 0.250000 +vt 0.171875 0.218750 +vt 0.171875 0.250000 +vt 0.156250 0.093750 +vt 0.140625 0.218750 +vt 0.140625 0.093750 +vt 0.125000 0.218750 +vt 0.125000 0.093750 +vt 0.187500 0.093750 +vt 0.156250 0.218750 +vt 0.281250 0.125000 +vt 0.250000 0.062500 +vt 0.281250 0.062500 +vt 0.250000 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.312500 +vt 0.312500 0.125000 +vt 0.250000 0.250000 +vt 0.250000 0.125000 +vt 0.218750 0.250000 +vt 0.218750 0.125000 +vt 0.187500 0.250000 +vt 0.187500 0.125000 +vt 0.046875 0.500000 +vt 0.031250 0.468750 +vt 0.046875 0.468750 +vt 0.031250 0.375000 +vt 0.046875 0.343750 +vt 0.046875 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.468750 +vt -0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.406250 +vt 0.218750 0.312500 +vt 0.281250 0.328125 +vt 0.289062 0.328125 +vt 0.289062 0.406250 +vt 0.281250 0.500000 +vt 0.218750 0.500000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt 0.046875 0.375000 +vt 0.046875 0.343750 +vt 0.015625 0.468750 +vt 0.000000 0.375000 +vt 0.000000 0.468750 +vt 0.062500 0.468750 +vt 0.031250 0.375000 +vt 0.031250 0.468750 +vt 0.015625 0.375000 +vt 0.218750 0.421875 +vt 0.281250 0.406250 +vt 0.218750 0.406250 +vt 0.218750 0.500000 +vt 0.281250 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.312500 +vt 0.218750 0.312500 +vt 0.289062 0.406250 +vt 0.281250 0.328125 +vt 0.187500 1.000000 +vt 0.250000 0.875000 +vt 0.226562 0.968750 +vt 0.265625 0.937500 +vt 0.265625 0.937500 +vt 0.578125 0.937500 +vt 0.734375 0.937500 +vt 0.687500 0.906250 +vt 0.656250 0.906250 +vt 0.656250 0.687500 +vt 0.593750 0.906250 +vt 0.750000 0.906250 +vt 0.531250 0.906250 +vt 0.500000 0.906250 +vt 0.500000 0.687500 +vt 0.812500 0.687500 +vt 0.656250 0.687500 +vt 0.671875 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.687500 0.250000 +vt 0.734375 0.468750 +vt 0.484375 0.468750 +vt 0.437500 0.468750 +vt 0.437500 0.343750 +vt 0.500000 0.250000 +vt 0.812500 0.218750 +vt 0.812500 0.343750 +vt 0.546875 0.468750 +vt 0.687500 0.593750 +vt 0.625000 0.218750 +vt 0.625000 0.343750 +vt 0.500000 0.593750 +vt 0.437500 1.000000 +vt 0.500000 0.875000 +vt 0.062500 0.218750 +vt 0.125000 0.218750 +vt 0.187500 0.218750 +vt 0.312500 0.250000 +vt 0.031250 0.500000 +vt 0.031250 0.343750 +vt -0.000000 0.375000 +vt 0.281250 0.312500 +vt 0.062500 0.375000 +vt 0.281250 0.500000 +vt 0.289062 0.328125 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 179/307/35 178/308/35 177/309/35 +f 182/310/36 183/311/36 181/312/36 +f 180/313/37 182/310/37 178/314/37 +f 177/315/38 183/316/38 179/317/38 +f 179/317/39 184/318/39 180/313/39 +f 178/314/40 181/319/40 177/320/40 +f 207/321/36 205/322/36 206/323/36 +f 190/324/37 191/325/37 189/326/37 +f 185/327/40 191/325/40 187/328/40 +f 187/329/36 192/330/36 188/331/36 +f 188/332/39 190/324/39 186/333/39 +f 186/334/35 189/326/35 185/335/35 +f 199/336/36 197/337/36 198/338/36 +f 196/339/39 199/336/39 194/340/39 +f 193/341/40 197/342/40 195/343/40 +f 195/344/38 200/345/38 196/339/38 +f 194/340/37 198/346/37 193/341/37 +f 204/347/39 207/348/39 202/349/39 +f 201/350/40 205/322/40 203/351/40 +f 203/351/38 208/352/38 204/347/38 +f 202/353/37 206/323/37 201/350/37 +f 211/354/35 210/355/35 209/356/35 +f 215/357/36 213/358/36 214/359/36 +f 209/360/38 213/358/38 211/361/38 +f 211/354/39 216/362/39 212/363/39 +f 210/364/40 214/359/40 209/365/40 +f 212/366/37 215/357/37 210/367/37 +f 233/368/36 219/369/36 217/370/36 +f 223/371/36 221/372/36 222/373/36 +f 220/374/37 223/371/37 218/375/37 +f 240/376/35 236/377/35 235/378/35 +f 232/379/35 226/380/35 225/381/35 +f 227/382/37 233/368/37 228/383/37 +f 231/384/40 229/385/40 218/386/40 +f 235/387/39 227/388/39 240/376/39 +f 237/389/37 240/376/37 238/390/37 +f 228/383/36 238/390/36 227/382/36 +f 229/385/37 232/379/37 230/391/37 +f 218/375/36 230/391/36 220/374/36 +f 225/392/39 220/393/39 232/379/39 +f 239/394/40 237/389/40 228/395/40 +f 225/392/38 222/396/38 221/397/38 +f 235/387/38 217/398/38 219/399/38 +f 253/400/40 248/401/40 241/402/40 +f 242/403/37 245/404/37 241/405/37 +f 252/406/35 248/407/35 247/408/35 +f 254/409/39 242/410/39 247/411/39 +f 249/412/37 252/406/37 250/413/37 +f 241/405/36 250/413/36 242/403/36 +f 267/414/40 262/415/40 244/416/40 +f 247/417/38 253/418/38 254/419/38 +f 253/418/35 258/420/35 254/419/35 +f 258/420/38 256/421/38 255/422/38 +f 268/423/39 243/424/39 261/425/39 +f 266/426/35 262/427/35 261/428/35 +f 243/429/37 259/430/37 244/431/37 +f 255/432/36 245/404/36 246/433/36 +f 263/434/37 266/426/37 264/435/37 +f 244/431/36 264/435/36 243/429/36 +f 261/436/38 267/437/38 268/438/38 +f 267/437/35 272/439/35 268/438/35 +f 272/439/38 270/440/38 269/441/38 +f 269/442/36 259/430/36 260/443/36 +f 275/444/35 274/445/35 273/446/35 +f 279/447/36 277/448/36 278/449/36 +f 275/444/39 280/450/39 276/451/39 +f 274/452/40 278/449/40 273/453/40 +f 276/454/37 279/447/37 274/455/37 +f 283/456/35 282/457/35 281/458/35 +f 286/459/36 287/460/36 285/461/36 +f 284/462/37 286/459/37 282/463/37 +f 281/464/38 287/465/38 283/466/38 +f 283/466/39 288/467/39 284/462/39 +f 282/463/40 285/468/40 281/469/40 +f 291/470/37 289/471/37 290/472/37 +f 294/473/38 295/474/38 293/475/38 +f 292/476/40 294/477/40 289/478/40 +f 289/478/35 293/479/35 290/480/35 +f 290/481/39 295/474/39 291/470/39 +f 291/470/36 296/482/36 292/476/36 +f 299/483/37 297/484/37 298/485/37 +f 302/486/38 303/487/38 301/488/38 +f 300/489/40 302/490/40 297/491/40 +f 297/491/35 301/492/35 298/493/35 +f 298/494/39 303/487/39 299/483/39 +f 299/483/36 304/495/36 300/489/36 +f 307/496/37 305/497/37 306/498/37 +f 310/499/38 311/500/38 309/501/38 +f 308/502/40 310/503/40 305/504/40 +f 305/504/35 309/505/35 306/506/35 +f 306/507/39 311/500/39 307/496/39 +f 307/496/36 312/508/36 308/502/36 +f 315/509/37 314/510/37 313/511/37 +f 318/512/38 319/513/38 317/514/38 +f 313/515/39 319/513/39 315/509/39 +f 315/509/36 320/516/36 316/517/36 +f 316/517/40 318/518/40 314/519/40 +f 314/519/35 317/520/35 313/521/35 +f 321/522/36 324/523/36 322/524/36 +f 328/525/35 325/526/35 326/527/35 +f 324/523/39 326/527/39 322/524/39 +f 322/524/38 325/528/38 321/529/38 +f 321/530/40 327/531/40 323/532/40 +f 323/532/37 328/525/37 324/523/37 +f 334/533/36 332/534/36 333/535/36 +f 336/536/39 331/537/39 334/533/39 +f 335/538/35 329/539/35 336/536/35 +f 331/537/38 330/540/38 332/541/38 +f 333/535/40 330/542/40 335/543/40 +f 337/544/36 340/545/36 338/546/36 +f 344/547/35 341/548/35 342/549/35 +f 340/550/39 342/551/39 338/552/39 +f 338/553/38 341/548/38 337/544/38 +f 337/544/40 343/554/40 339/555/40 +f 339/555/37 344/556/37 340/550/37 +f 350/557/36 348/558/36 349/559/36 +f 352/560/39 347/561/39 350/557/39 +f 351/562/35 345/563/35 352/564/35 +f 347/565/38 346/566/38 348/558/38 +f 349/559/40 346/566/40 351/562/40 +f 179/307/35 180/567/35 178/308/35 +f 182/310/36 184/318/36 183/311/36 +f 180/313/37 184/318/37 182/310/37 +f 177/315/38 181/568/38 183/316/38 +f 179/317/39 183/316/39 184/318/39 +f 178/314/40 182/310/40 181/319/40 +f 207/321/36 208/569/36 205/322/36 +f 190/324/37 192/330/37 191/325/37 +f 185/327/40 189/326/40 191/325/40 +f 187/329/36 191/325/36 192/330/36 +f 188/332/39 192/330/39 190/324/39 +f 186/334/35 190/324/35 189/326/35 +f 199/336/36 200/345/36 197/337/36 +f 196/339/39 200/345/39 199/336/39 +f 193/341/40 198/346/40 197/342/40 +f 195/344/38 197/570/38 200/345/38 +f 194/340/37 199/336/37 198/346/37 +f 204/347/39 208/352/39 207/348/39 +f 201/350/40 206/323/40 205/322/40 +f 203/351/38 205/322/38 208/352/38 +f 202/353/37 207/571/37 206/323/37 +f 211/354/35 212/363/35 210/355/35 +f 215/357/36 216/362/36 213/358/36 +f 209/360/38 214/359/38 213/358/38 +f 211/354/39 213/358/39 216/362/39 +f 210/364/40 215/357/40 214/359/40 +f 212/366/37 216/362/37 215/357/37 +f 233/368/36 234/572/36 219/369/36 +f 223/371/36 224/573/36 221/372/36 +f 220/374/37 224/573/37 223/371/37 +f 240/376/35 239/394/35 236/377/35 +f 232/379/35 231/384/35 226/380/35 +f 227/382/37 234/572/37 233/368/37 +f 223/574/40 222/575/40 218/386/40 +f 222/575/40 226/576/40 218/386/40 +f 226/576/40 231/384/40 218/386/40 +f 235/387/39 219/399/39 227/388/39 +f 219/399/39 234/577/39 227/388/39 +f 227/388/39 238/390/39 240/376/39 +f 237/389/37 239/394/37 240/376/37 +f 228/383/36 237/389/36 238/390/36 +f 229/385/37 231/384/37 232/379/37 +f 218/375/36 229/385/36 230/391/36 +f 225/392/39 221/397/39 220/393/39 +f 221/397/39 224/578/39 220/393/39 +f 220/393/39 230/391/39 232/379/39 +f 233/579/40 217/580/40 228/395/40 +f 217/580/40 236/581/40 228/395/40 +f 236/581/40 239/394/40 228/395/40 +f 225/392/38 226/582/38 222/396/38 +f 235/387/38 236/583/38 217/398/38 +f 241/402/40 245/584/40 253/400/40 +f 245/584/40 256/585/40 253/400/40 +f 256/585/40 257/586/40 253/400/40 +f 248/401/40 251/587/40 241/402/40 +f 251/587/40 249/412/40 241/402/40 +f 242/403/37 246/433/37 245/404/37 +f 252/406/35 251/587/35 248/407/35 +f 254/409/39 258/420/39 255/422/39 +f 255/422/39 246/588/39 254/409/39 +f 246/588/39 242/410/39 254/409/39 +f 242/410/39 250/413/39 252/406/39 +f 242/410/39 252/406/39 247/411/39 +f 249/412/37 251/587/37 252/406/37 +f 241/405/36 249/412/36 250/413/36 +f 244/416/40 259/589/40 267/414/40 +f 259/589/40 270/590/40 267/414/40 +f 270/590/40 271/591/40 267/414/40 +f 262/415/40 265/592/40 244/416/40 +f 265/592/40 263/434/40 244/416/40 +f 247/417/38 248/593/38 253/418/38 +f 253/418/35 257/594/35 258/420/35 +f 258/420/38 257/594/38 256/421/38 +f 268/423/39 272/439/39 269/441/39 +f 269/441/39 260/595/39 268/423/39 +f 260/595/39 243/424/39 268/423/39 +f 243/424/39 264/435/39 266/426/39 +f 243/424/39 266/426/39 261/425/39 +f 266/426/35 265/592/35 262/427/35 +f 243/429/37 260/443/37 259/430/37 +f 255/432/36 256/596/36 245/404/36 +f 263/434/37 265/592/37 266/426/37 +f 244/431/36 263/434/36 264/435/36 +f 261/436/38 262/597/38 267/437/38 +f 267/437/35 271/598/35 272/439/35 +f 272/439/38 271/598/38 270/440/38 +f 269/442/36 270/599/36 259/430/36 +f 275/444/35 276/451/35 274/445/35 +f 279/447/36 280/450/36 277/448/36 +f 275/444/39 277/448/39 280/450/39 +f 274/452/40 279/447/40 278/449/40 +f 276/454/37 280/450/37 279/447/37 +f 283/456/35 284/600/35 282/457/35 +f 286/459/36 288/467/36 287/460/36 +f 284/462/37 288/467/37 286/459/37 +f 281/464/38 285/601/38 287/465/38 +f 283/466/39 287/465/39 288/467/39 +f 282/463/40 286/459/40 285/468/40 +f 291/470/37 292/476/37 289/471/37 +f 294/473/38 296/482/38 295/474/38 +f 292/476/40 296/482/40 294/477/40 +f 289/478/35 294/477/35 293/479/35 +f 290/481/39 293/602/39 295/474/39 +f 291/470/36 295/474/36 296/482/36 +f 299/483/37 300/489/37 297/484/37 +f 302/486/38 304/495/38 303/487/38 +f 300/489/40 304/495/40 302/490/40 +f 297/491/35 302/490/35 301/492/35 +f 298/494/39 301/603/39 303/487/39 +f 299/483/36 303/487/36 304/495/36 +f 307/496/37 308/502/37 305/497/37 +f 310/499/38 312/508/38 311/500/38 +f 308/502/40 312/508/40 310/503/40 +f 305/504/35 310/503/35 309/505/35 +f 306/507/39 309/604/39 311/500/39 +f 307/496/36 311/500/36 312/508/36 +f 315/509/37 316/517/37 314/510/37 +f 318/512/38 320/516/38 319/513/38 +f 313/515/39 317/605/39 319/513/39 +f 315/509/36 319/513/36 320/516/36 +f 316/517/40 320/516/40 318/518/40 +f 314/519/35 318/518/35 317/520/35 +f 321/522/36 323/606/36 324/523/36 +f 328/525/35 327/607/35 325/526/35 +f 324/523/39 328/525/39 326/527/39 +f 322/524/38 326/527/38 325/528/38 +f 321/530/40 325/608/40 327/531/40 +f 323/532/37 327/531/37 328/525/37 +f 334/533/36 331/537/36 332/534/36 +f 336/536/39 329/539/39 331/537/39 +f 335/538/35 330/609/35 329/539/35 +f 331/537/38 329/539/38 330/540/38 +f 333/535/40 332/534/40 330/542/40 +f 337/544/36 339/555/36 340/545/36 +f 344/547/35 343/554/35 341/548/35 +f 340/550/39 344/556/39 342/551/39 +f 338/553/38 342/610/38 341/548/38 +f 337/544/40 341/548/40 343/554/40 +f 339/555/37 343/554/37 344/556/37 +f 350/557/36 347/561/36 348/558/36 +f 352/560/39 345/611/39 347/561/39 +f 351/562/35 346/566/35 345/563/35 +f 347/565/38 345/612/38 346/566/38 +f 349/559/40 348/558/40 346/566/40 diff --git a/src/main/resources/assets/hbm/models/trinkets/pooh.obj b/src/main/resources/assets/hbm/models/trinkets/pooh.obj deleted file mode 100644 index 958bfc3e9..000000000 --- a/src/main/resources/assets/hbm/models/trinkets/pooh.obj +++ /dev/null @@ -1,334 +0,0 @@ -# Blender v2.79 (sub 0) OBJ File: 'pooh.blend' -# www.blender.org -o Cube_Cube.001 -v -0.250000 0.062500 0.250000 -v 0.250000 0.062500 0.250000 -v -0.250000 0.062500 -0.250000 -v 0.250000 0.062500 -0.250000 -v -0.250000 0.437500 0.250000 -v 0.250000 0.437500 0.250000 -v -0.250000 0.437500 -0.250000 -v 0.250000 0.437500 -0.250000 -v -0.187500 0.437500 0.187500 -v 0.187500 0.437500 0.187500 -v -0.187500 0.437500 -0.187500 -v 0.187500 0.437500 -0.187500 -v -0.187500 0.625000 -0.187500 -v -0.187500 0.625000 0.187500 -v 0.187500 0.625000 0.187500 -v 0.187500 0.625000 -0.187500 -v -0.250000 0.625000 0.250000 -v 0.250000 0.625000 0.250000 -v -0.250000 0.625000 -0.250000 -v 0.250000 0.625000 -0.250000 -v -0.250000 1.125000 -0.250000 -v -0.250000 1.125000 0.250000 -v 0.250000 1.125000 0.250000 -v 0.250000 1.125000 -0.250000 -v -0.125000 0.000000 -0.062500 -v 0.500000 0.000000 -0.062500 -v -0.125000 0.000000 -0.187500 -v 0.500000 0.000000 -0.187500 -v -0.125000 0.125000 -0.187500 -v -0.125000 0.125000 -0.062500 -v 0.500000 0.125000 -0.062500 -v 0.500000 0.125000 -0.187500 -v -0.125000 0.000000 0.187500 -v 0.500000 0.000000 0.187500 -v -0.125000 0.000000 0.062500 -v 0.500000 0.000000 0.062500 -v -0.125000 0.125000 0.062500 -v -0.125000 0.125000 0.187500 -v 0.500000 0.125000 0.187500 -v 0.500000 0.125000 0.062500 -v -0.062500 0.606694 -0.169194 -v 0.062500 0.606694 -0.169194 -v -0.062500 0.518306 -0.080806 -v 0.062500 0.518306 -0.080806 -v -0.062500 0.253141 -0.345971 -v -0.062500 0.341529 -0.434359 -v 0.062500 0.341529 -0.434359 -v 0.062500 0.253141 -0.345971 -v -0.062500 0.606694 0.169194 -v 0.062500 0.606694 0.169194 -v -0.062500 0.518306 0.080806 -v 0.062500 0.518306 0.080806 -v -0.062500 0.253141 0.345971 -v -0.062500 0.341529 0.434359 -v 0.062500 0.341529 0.434359 -v 0.062500 0.253141 0.345971 -v 0.250000 0.781250 0.031250 -v 0.250000 0.718750 0.031250 -v 0.250000 0.781250 -0.031250 -v 0.250000 0.718750 -0.031250 -v 0.312500 0.781250 -0.031250 -v 0.312500 0.781250 0.031250 -v 0.312500 0.718750 0.031250 -v 0.312500 0.718750 -0.031250 -v -0.093750 1.062500 -0.125000 -v 0.093750 1.062500 -0.125000 -v -0.093750 1.062500 -0.312500 -v 0.093750 1.062500 -0.312500 -v -0.093750 1.250000 -0.312500 -v -0.093750 1.250000 -0.125000 -v 0.093750 1.250000 -0.125000 -v 0.093750 1.250000 -0.312500 -v -0.093750 1.062500 0.312500 -v 0.093750 1.062500 0.312500 -v -0.093750 1.062500 0.125000 -v 0.093750 1.062500 0.125000 -v -0.093750 1.250000 0.125000 -v -0.093750 1.250000 0.312500 -v 0.093750 1.250000 0.312500 -v 0.093750 1.250000 0.125000 -vt 0.400000 -0.000000 -vt 0.200000 0.173913 -vt 0.200000 -0.000000 -vt 0.200000 0.304348 -vt 0.400000 0.478261 -vt 0.200000 0.478261 -vt 0.600000 0.173913 -vt 0.400000 0.304348 -vt 0.400000 0.173913 -vt 0.000000 0.304348 -vt 0.000000 0.173913 -vt 0.800000 0.173913 -vt 0.600000 0.304348 -vt 0.700000 0.304348 -vt 0.550000 0.369565 -vt 0.550000 0.304348 -vt 1.000000 0.304348 -vt 0.850000 0.369565 -vt 0.850000 0.304348 -vt 0.700000 0.369565 -vt 0.400000 0.369565 -vt 0.400000 0.304348 -vt 0.400000 0.478261 -vt 0.200000 0.652174 -vt 0.200000 0.478261 -vt 0.200000 0.826087 -vt 0.400000 1.000000 -vt 0.200000 1.000000 -vt 0.600000 0.652174 -vt 0.400000 0.826087 -vt 0.400000 0.652174 -vt -0.000000 0.826087 -vt -0.000000 0.652174 -vt 0.800000 0.652174 -vt 0.600000 0.826087 -vt 0.900000 0.260870 -vt 0.950000 0.043478 -vt 0.950000 0.260870 -vt 0.800000 0.043478 -vt 0.850000 0.260870 -vt 0.800000 0.260870 -vt 0.850000 -0.000000 -vt 0.800000 0.000000 -vt 0.800000 0.304348 -vt 0.850000 0.304348 -vt 0.850000 0.043478 -vt 0.900000 0.043478 -vt 1.000000 0.260870 -vt 0.900000 0.260870 -vt 0.950000 0.043478 -vt 0.950000 0.260870 -vt 0.800000 0.043478 -vt 0.850000 0.260870 -vt 0.800000 0.260870 -vt 0.850000 -0.000000 -vt 0.800000 0.000000 -vt 0.800000 0.304348 -vt 0.850000 0.304348 -vt 0.850000 0.043478 -vt 0.900000 0.043478 -vt 1.000000 0.260870 -vt 0.550000 0.369565 -vt 0.475000 0.434783 -vt 0.475000 0.369565 -vt 0.400000 0.043478 -vt 0.450000 0.000000 -vt 0.450000 0.043478 -vt 0.600000 0.173913 -vt 0.550000 0.043478 -vt 0.600000 0.043478 -vt 0.450000 0.173913 -vt 0.500000 0.043478 -vt 0.500000 0.173913 -vt 0.550000 0.173913 -vt 0.400000 0.173913 -vt 0.400000 0.000000 -vt 0.450000 0.043478 -vt 0.400000 0.043478 -vt 0.500000 0.173913 -vt 0.450000 0.173913 -vt 0.550000 0.043478 -vt 0.600000 0.173913 -vt 0.550000 0.173913 -vt 0.500000 0.043478 -vt 0.400000 0.173913 -vt 0.425000 0.521739 -vt 0.450000 0.543478 -vt 0.425000 0.543478 -vt 0.425000 0.565217 -vt 0.450000 0.565217 -vt 0.475000 0.543478 -vt 0.450000 0.521739 -vt 0.475000 0.521739 -vt 0.400000 0.521739 -vt 0.400000 0.543478 -vt 0.450000 0.500000 -vt 0.425000 0.500000 -vt 0.475000 0.500000 -vt 0.550000 0.565217 -vt 0.475000 0.565217 -vt 0.550000 0.434783 -vt 0.700000 0.434783 -vt 0.625000 0.500000 -vt 0.625000 0.434783 -vt 0.550000 0.500000 -vt 0.400000 0.500000 -vt 0.400000 0.434783 -vt 0.550000 0.369565 -vt 0.475000 0.434783 -vt 0.475000 0.369565 -vt 0.475000 0.500000 -vt 0.550000 0.565217 -vt 0.475000 0.565217 -vt 0.550000 0.434783 -vt 0.700000 0.434783 -vt 0.625000 0.500000 -vt 0.625000 0.434783 -vt 0.550000 0.500000 -vt 0.400000 0.500000 -vt 0.400000 0.434783 -vt 0.800000 0.304348 -vt 1.000000 0.369565 -vt 0.800000 0.826087 -vt 1.000000 0.043478 -vt 1.000000 0.043478 -vt 0.400000 0.000000 -vt 0.450000 0.000000 -vt 0.600000 0.043478 -vt 0.700000 0.500000 -vt 0.700000 0.500000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -s off -f 3/1/1 2/2/1 1/3/1 -f 6/4/2 7/5/2 5/6/2 -f 3/7/3 8/8/3 4/9/3 -f 2/2/4 5/10/4 1/11/4 -f 4/9/5 6/4/5 2/2/5 -f 1/12/6 7/13/6 3/7/6 -f 12/14/5 15/15/5 10/16/5 -f 9/17/6 13/18/6 11/19/6 -f 11/19/3 16/20/3 12/14/3 -f 10/16/4 14/21/4 9/22/4 -f 19/23/1 18/24/1 17/25/1 -f 23/26/2 21/27/2 22/28/2 -f 19/29/3 24/30/3 20/31/3 -f 18/24/4 22/32/4 17/33/4 -f 20/31/5 23/26/5 18/24/5 -f 17/34/6 21/35/6 19/29/6 -f 27/36/1 26/37/1 25/38/1 -f 31/39/2 29/40/2 30/41/2 -f 28/42/5 31/39/5 26/43/5 -f 25/44/6 29/40/6 27/45/6 -f 27/36/3 32/46/3 28/47/3 -f 26/37/4 30/48/4 25/38/4 -f 35/49/1 34/50/1 33/51/1 -f 39/52/2 37/53/2 38/54/2 -f 36/55/5 39/52/5 34/56/5 -f 33/57/6 37/53/6 35/58/6 -f 35/49/3 40/59/3 36/60/3 -f 34/50/4 38/61/4 33/51/4 -f 67/62/1 66/63/1 65/64/1 -f 47/65/7 45/66/7 46/67/7 -f 42/68/5 48/69/5 47/70/5 -f 41/71/6 45/72/6 43/73/6 -f 43/73/8 48/69/8 44/74/8 -f 42/75/9 46/67/9 41/71/9 -f 53/76/8 55/77/8 54/78/8 -f 55/77/5 52/79/5 50/80/5 -f 53/81/6 49/82/6 51/83/6 -f 56/84/7 51/83/7 52/79/7 -f 54/78/10 50/80/10 49/85/10 -f 63/86/5 61/87/5 62/88/5 -f 57/89/2 61/87/2 59/90/2 -f 59/91/3 64/92/3 60/93/3 -f 58/94/4 62/88/4 57/95/4 -f 60/96/1 63/86/1 58/97/1 -f 71/98/2 69/99/2 70/100/2 -f 68/101/5 71/98/5 66/63/5 -f 65/102/6 69/103/6 67/104/6 -f 67/104/3 72/105/3 68/101/3 -f 66/63/4 70/106/4 65/107/4 -f 75/108/1 74/109/1 73/110/1 -f 79/111/2 77/112/2 78/113/2 -f 76/114/5 79/111/5 74/109/5 -f 73/115/6 77/116/6 75/117/6 -f 75/117/3 80/118/3 76/114/3 -f 74/109/4 78/119/4 73/120/4 -f 3/1/1 4/9/1 2/2/1 -f 6/4/2 8/8/2 7/5/2 -f 3/7/3 7/13/3 8/8/3 -f 2/2/4 6/4/4 5/10/4 -f 4/9/5 8/8/5 6/4/5 -f 1/12/6 5/121/6 7/13/6 -f 12/14/5 16/20/5 15/15/5 -f 9/17/6 14/122/6 13/18/6 -f 11/19/3 13/18/3 16/20/3 -f 10/16/4 15/15/4 14/21/4 -f 19/23/1 20/31/1 18/24/1 -f 23/26/2 24/30/2 21/27/2 -f 19/29/3 21/35/3 24/30/3 -f 18/24/4 23/26/4 22/32/4 -f 20/31/5 24/30/5 23/26/5 -f 17/34/6 22/123/6 21/35/6 -f 27/36/1 28/47/1 26/37/1 -f 31/39/2 32/46/2 29/40/2 -f 28/42/5 32/46/5 31/39/5 -f 25/44/6 30/41/6 29/40/6 -f 27/36/3 29/40/3 32/46/3 -f 26/37/4 31/124/4 30/48/4 -f 35/49/1 36/60/1 34/50/1 -f 39/52/2 40/59/2 37/53/2 -f 36/55/5 40/59/5 39/52/5 -f 33/57/6 38/54/6 37/53/6 -f 35/49/3 37/53/3 40/59/3 -f 34/50/4 39/125/4 38/61/4 -f 67/62/1 68/101/1 66/63/1 -f 47/65/7 48/126/7 45/66/7 -f 42/68/5 44/74/5 48/69/5 -f 41/71/6 46/67/6 45/72/6 -f 43/73/8 45/72/8 48/69/8 -f 42/75/9 47/65/9 46/67/9 -f 53/76/8 56/127/8 55/77/8 -f 55/77/5 56/84/5 52/79/5 -f 53/81/6 54/128/6 49/82/6 -f 56/84/7 53/81/7 51/83/7 -f 54/78/10 55/77/10 50/80/10 -f 63/86/5 64/92/5 61/87/5 -f 57/89/2 62/88/2 61/87/2 -f 59/91/3 61/87/3 64/92/3 -f 58/94/4 63/86/4 62/88/4 -f 60/96/1 64/92/1 63/86/1 -f 71/98/2 72/105/2 69/99/2 -f 68/101/5 72/105/5 71/98/5 -f 65/102/6 70/129/6 69/103/6 -f 67/104/3 69/103/3 72/105/3 -f 66/63/4 71/98/4 70/106/4 -f 75/108/1 76/114/1 74/109/1 -f 79/111/2 80/118/2 77/112/2 -f 76/114/5 80/118/5 79/111/5 -f 73/115/6 78/130/6 77/116/6 -f 75/117/3 77/116/3 80/118/3 -f 74/109/4 79/111/4 78/119/4 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 1b5db22f5..f9d9b867d 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -64,6 +64,7 @@ "block.fel": {"category": "block", "sounds": [{"name": "block/fel", "stream": false}]}, "block.hephaestusRunning": {"category": "block", "sounds": [{"name": "block/hephaestusRunning", "stream": false}]}, "block.squeakyToy": {"category": "block", "sounds": [{"name": "block/squeakyToy", "stream": false}]}, + "block.hunduns_magnificent_howl": {"category": "block", "sounds": [{"name": "block/hunduns_magnificent_howl", "stream": false}]}, "block.pyroOperate": {"category": "block", "sounds": [{"name": "block/pyroOperate", "stream": false}]}, "block.motor": {"category": "block", "sounds": [{"name": "block/motor", "stream": false}]}, "block.engine": {"category": "block", "sounds": [{"name": "block/engine", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg b/src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..69ece8b82ef8e81660c373525082f946d1448b9b GIT binary patch literal 62398 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%0Ab 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 delta 295 zcmV+?0oeYI0?`7HGk*aHNklIYdY*^ty4|tZAPWGkwRA?uaR8|68l{vKvSmx~-E52jpns~W^&=Q#$nzYfRBuev z)Yiui0PuaEIF9>$5Cls>3xI=@Q|@kW2*a?C-x+uJ_9=>DeS*vB6~{-1{RsCDj{uxS z(Pkq6BuN55Gk^bF+t#YHzQRvxV?fn3zXvpJ%g%84PYGVXZvIadUC%^Bt95KbT@5`@G7 z3Gt4xVR4;h3hAAbKQuc)q0&1=1Rb~JH#25hpV+^#`Je&Q( rV@T>o?_IAtn7oi<2O{G7-e(2c+%)o31`!?r0000F>4e-6vyAn6^bAd4nmqhB&IZtLI@T%Vl6`O6Qt3gL`%sf zBG^Pxf);)Pi3G8ox08D_ z|9NkA=aPVd!_Do~bj~0~XQq=f@6U66-8Bw3x6`86$JeF)JIdOlqEU4NBKb%GvJR90 zB(`Op-AX#Z`<;`laW^N=l^zMIkzQ80d_y=<=V)EM$!={Fpl%Mw$d1ihk2{A7_6{IB zrrn$X0D$X1K4$eo4JeeL?wCfjT(43D6{l#LX3v=$x2n4I(2@eAvO}?R<$8Rs4yRMV z?9pDP0{Hc+u#L`br<$_%#QX8+w=L_aO$<}`L z(E0KmU}P#A{i=~j(KeF}p-8qWq*5{&YI^``$G0TO$LEt|0iE@Yf%RwSc;<4h4uL5; z{ZLO^MeMaepZfz4WC61C#}>xnU~RwexU;@N-U+a?Rb_zxouo|X7$yb4U`3G0n*|sZ zU~FN0;On9zP@;0IDwx6@p$NmI0NB|rMMfavfIJxhK#mS@u(q%51RT!CP)Fq$odTFf zq^$y!wYP#~9G6+L03q!shoXE%S?0hr`T=NG|At8cIPf+NG~LOg3J7iI-Xe3gOMA9d zwi1|!K~5f>nNGxy%Qn@G2KO8*({4_bUh}tUPoB;p-%X9`fY)BynOE-t0wC(rrM zUcBo0T?R^9lsJh2d~kkVbc#?^Da8A*<9$&cb_MXs`68>~TD=@byv+ir*j-#og~ONc z-R{2l`CS%EbY8E*h3Aj^Vg)=x%f>EO?>;59M+K___%QnA(Z2lhZO?C9A0ozHSayva z<2nl{`cyHs0#MtdqV`jO>|E6ir9p_m?ZN#!ByFL#M}hO_0Zh?vl}`tSNbMD%4Adjl zr;#rRssq@}^;C1TuXDe^>w5taeqsj*oY(;ZC#V=e1$WlrdsY(_AaMGg2f%yvsMiU^ zh-fz_l*cZgPl!~c0P-@i?l|IxhVlM4@f_yb`S|a{N~623P#W8IQQPNUH((0_bsIrN z9YFsyz|{^J`I;td&UIy<8rCdeP$zH&zJA^|3Fj1108abV#56FbfxOs$0KPmc7Ya_Y z0AEIdklZ}&u{qb3eGVEp%H&=L0C1c7$saJMLtWVCzYjEBHu!G<1d`bb1;X~7POS*8& zZ`FCeiFh{=Il@Q6op=6%ubDH~ zlgj`AR%NUJ)Nnty@B6+0_8<_CY+aqMJkQs(4DLO9KJEz=#2_$moTPzIzWo6JfJc{3 z7bZtb~G!mGk1te)vxwc7ca?>drYS%U~4zcRNwlEebd(BG^y25*b=qz_w4YYM~x;}?_ zur_VBo<;(###F(mP#aK!($~56DjYdjDo0j01PbNI3c1X5NAw| Date: Fri, 15 Aug 2025 11:14:49 -0600 Subject: [PATCH 174/323] Update alloy.json --- src/main/resources/assets/hbm/manual/material/alloy.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index 0c583e585..f1f71dec4 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_advanced_alloy", 1, 0], "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], "title": { - "en_US": "Advanced Alloy" + "en_US": "Advanced Alloy", + "ru_ru": "Продвинутый сплав" }, "content": { "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]]." + "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]]." } } From 8ddc169c315be40e9aa4cae53e4d37bf445c6c78 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:38:35 -0600 Subject: [PATCH 175/323] Update arsenic.json --- src/main/resources/assets/hbm/manual/material/arsenic.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index b6bf7df40..01fe95509 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_arsenic", 1, 0], "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], "title": { - "en_US": "Arsenic" + "en_US": "Arsenic", + "ru_RU": "Мышьяк" }, "content": { - "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]]." + "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", + "ru_RU": "Получается путем обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]]." } } From ad6c7c06a53c76381f0f62e1f8cf040f5e6c5e78 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:40:54 -0600 Subject: [PATCH 176/323] Update aluminium.json --- .../resources/assets/hbm/manual/material/aluminium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 9e5732336..5a20169ae 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_aluminium", 1, 0], "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], "title": { - "en_US": "Aluminium" + "en_US": "Aluminium", + "ru_RU": "Алюминий" }, "content": { - "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages." + "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", + "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путем обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозема.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." } } From bdba1fc503e1aad87952ab7e79fecbc5508a8b3c Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:44:20 -0600 Subject: [PATCH 177/323] Update alloy.json --- src/main/resources/assets/hbm/manual/material/alloy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index f1f71dec4..03ef80a7a 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -7,7 +7,7 @@ "ru_ru": "Продвинутый сплав" }, "content": { - "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]]." + "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]]." } } From 4c67d4d0c307225b457f7c25bd433600486bfcca Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:45:47 -0600 Subject: [PATCH 178/323] Update bscco.json --- src/main/resources/assets/hbm/manual/material/bscco.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index 4b25d11c0..a341b55af 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_bscco", 1, 0], "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], "title": { - "en_US": "BSCCO" + "en_US": "BSCCO", + "ru_RU": "BSCCO" }, "content": { - "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]]." + "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", + "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]]." } } From 5f041cde7d064d662237796f6b39dcb57a4cbd47 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:46:50 -0600 Subject: [PATCH 179/323] Update arsenic_bronze.json --- .../assets/hbm/manual/material/arsenic_bronze.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index 450f8dd21..d53db5d12 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_arsenic_bronze", 1, 0], "trigger": [["hbm:item.ingot_arsenic_bronze"]], "title": { - "en_US": "Arsenic Bronze" + "en_US": "Arsenic Bronze", + "ru_RU": "Мышьяковая бронза" }, "content": { - "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]]." + "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", + "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]]." } } From e6901d8134e4a77c28809e2e5d602fa072ab0093 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:47:36 -0600 Subject: [PATCH 180/323] Update bakelite.json --- src/main/resources/assets/hbm/manual/material/bakelite.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index 38d2a9dd1..d5d232149 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_bakelite", 1, 0], "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], "title": { - "en_US": "Bakelite" + "en_US": "Bakelite", + "ru_RU": "Бакелит" }, "content": { - "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes." + "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", + "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах." } } From af9780f57d38d5bda642caca73b0b0fc99ff0ac8 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:49:28 -0600 Subject: [PATCH 181/323] Update bismuth.json --- src/main/resources/assets/hbm/manual/material/bismuth.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 369e6bf60..9b3105586 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_bismuth", 1, 0], "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], "title": { - "en_US": "Bismuth" + "en_US": "Bismuth", + "ru_RU": "Висмут" }, "content": { - "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]]." + "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", + "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]]." } } From 907d97e1bae64b9c5267f8c08a5c4ec517aafe6d Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:50:01 -0600 Subject: [PATCH 182/323] Update bismuth_bronze.json --- .../assets/hbm/manual/material/bismuth_bronze.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index fcb22393f..07167ba3d 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_bismuth_bronze", 1, 0], "trigger": [["hbm:item.ingot_bismuth_bronze"]], "title": { - "en_US": "Bismuth Bronze" + "en_US": "Bismuth Bronze", + "ru_RU": "Висмутовая бронза" }, "content": { - "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]]." + "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", + "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]]." } } From 3ddad84863e9ed3e611e9106ac2ae32cb2a1c4f3 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:51:11 -0600 Subject: [PATCH 183/323] Update cadmium.json --- src/main/resources/assets/hbm/manual/material/cadmium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index fb9281a02..14d06bebe 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_cadmium", 1, 0], "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], "title": { - "en_US": "Cadmium" + "en_US": "Cadmium", + "ru_RU": "Кадмий" }, "content": { - "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute." + "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", + "ru_RU": "Изготовлен путем обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]]." } } From c841002f701d3e107546384b9022b53d12585f53 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:55:30 -0600 Subject: [PATCH 184/323] Update cadmium_steel.json --- .../resources/assets/hbm/manual/material/cadmium_steel.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index 70cb3644b..48ce8d495 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_cdalloy", 1, 0], "trigger": [["hbm:item.ingot_cdalloy"]], "title": { - "en_US": "Cadmium Steel" + "en_US": "Cadmium Steel", + "ru_RU": "Кадмиевая сталь" }, "content": { - "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes." + "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", + "ru_RU": "Коррозионно-стойкий сплав, изготовленный из [[стали|Steel]] и [[кадмия|Cadmium]]. Альтернатива [[технециевой стали|Technetium Steel]] в большинстве рецептов." } } From 6def4eaac9d589e2883077c6518539d8d51e0f22 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:56:58 -0600 Subject: [PATCH 185/323] Update cinnabar.json --- src/main/resources/assets/hbm/manual/material/cinnabar.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index c142e7ff9..12bd758f9 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.cinnebar", 1, 0], "trigger": [["hbm:item.cinnebar"]], "title": { - "en_US": "Cinnabar" + "en_US": "Cinnabar", + "ru_RU": "Киноварь" }, "content": { - "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production." + "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в косксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." } } From 75dd1ea555067541e65a02e811e5fb4eea104274 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:10:00 -0600 Subject: [PATCH 186/323] Update coke.json --- src/main/resources/assets/hbm/manual/material/coke.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index fbf8d8631..b113bd25f 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.coke", 1, 0], "trigger": [["hbm:item.coke", 1, 32767]], "title": { - "en_US": "Coke" + "en_US": "Coke", + "ru_RU": "Кокс" }, "content": { - "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]]." + "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", + "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путем переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешевого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путем коксования различных видов масла в [[коксовой установке|Coking Unit]]." } } From 0920358df496195e4afc333a6ed5d092e654f951 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:12:16 -0600 Subject: [PATCH 187/323] Update copper.json --- src/main/resources/assets/hbm/manual/material/copper.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index e56f6d71d..e8e155732 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_copper", 1, 0], "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], "title": { - "en_US": "Copper" + "en_US": "Copper", + "ru_RU": "Медь" }, "content": { - "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils." + "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", + "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." } } From f003235381bb4f2bb0d83dfa26e08426af0c044f Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:14:15 -0600 Subject: [PATCH 188/323] Update desh.json --- src/main/resources/assets/hbm/manual/material/desh.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index 4de099c5a..c0d7ddbeb 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_desh", 1, 0], "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], "title": { - "en_US": "Desh" + "en_US": "Desh", + "ru_RU": "Деш" }, "content": { - "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities." + "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельченные|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." } } From a88b7ef5dfbc5fd71ede53641f345aaed5127c0e Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:15:33 -0600 Subject: [PATCH 189/323] Update ferrouranium.json --- .../resources/assets/hbm/manual/material/ferrouranium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 86629c988..687434042 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_ferrouranium", 1, 0], "trigger": [["hbm:item.ingot_ferrouranium"]], "title": { - "en_US": "Ferrouranium" + "en_US": "Ferrouranium", + "ru_RU": "Ферроуран" }, "content": { - "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition." + "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах." } } From 74b0e4e929e3aed1812eb74ab3c77155ac7dcfd6 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:16:14 -0600 Subject: [PATCH 190/323] Update graphite.json --- src/main/resources/assets/hbm/manual/material/graphite.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 9d0624a78..22bcccc21 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_graphite", 1, 0], "trigger": [["hbm:item.ingot_graphite"]], "title": { - "en_US": "Graphite" + "en_US": "Graphite", + "ru_RU": "Графит" }, "content": { - "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes." + "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", + "ru_RU": "Изготавливается путем прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]]." } } From 7741330fec8dd674419778019034ff34afb46a61 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:16:48 -0600 Subject: [PATCH 191/323] Update gunmetal.json --- src/main/resources/assets/hbm/manual/material/gunmetal.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index bf6ee920e..f5d89a0b1 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_gunmetal", 1, 0], "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], "title": { - "en_US": "Gunmetal" + "en_US": "Gunmetal", + "ru_RU": "Оружейный металл" }, "content": { - "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition." + "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", + "ru_RU": "Сплав из [[алюминия|Aluminium]] и [[меди|Copper]]. Может быть изготовлен на наковальне или более эффективно в [[роторной печи|Rotary Furnace]]. В основном используется для деталей оружия, а также для гильз большинства боеприпасов." } } From adc57e79b4211f6bcc25db2e3829977860712974 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:17:24 -0600 Subject: [PATCH 192/323] Update hss.json --- src/main/resources/assets/hbm/manual/material/hss.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index a74dfddaf..26380d6c5 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_dura_steel", 1, 0], "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], "title": { - "en_US": "High-Speed Steel" + "en_US": "High-Speed Steel", + "ru_RU": "Высокоскоростная сталь" }, "content": { - "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable." + "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", + "ru_RU": "Сплав из [[стали|Steel]], [[вольфрама|Tungsten]] и [[кобальта|Cobalt]], изготовленный в [[плавильне|Crucible]]. Создается в виде жидкого металла, требует отливки в форму слитка или пластины перед использованием." } } From 10513425267a859b0174dbf8c68dff7368e372c8 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:18:22 -0600 Subject: [PATCH 193/323] Update latex.json --- src/main/resources/assets/hbm/manual/material/latex.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index c070e21e3..b2a4a5beb 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_biorubber", 1, 0], "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], "title": { - "en_US": "Latex" + "en_US": "Latex", + "ru_RU": "Латекс" }, "content": { - "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa." + "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", + "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путем прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот." } } From 0748abae077312fa3c6563eda98916750b29441c Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:18:39 -0600 Subject: [PATCH 194/323] Update lead.json --- src/main/resources/assets/hbm/manual/material/lead.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index 9735111c3..b4d919e1a 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_lead", 1, 0], "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], "title": { - "en_US": "Lead" + "en_US": "Lead", + "ru_RU": "Свинец" }, "content": { - "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits." + "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", + "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем." } } From aaff82553986817dc6567e4a22704c5608c83298 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:20:22 -0600 Subject: [PATCH 195/323] Update mingrade.json --- src/main/resources/assets/hbm/manual/material/mingrade.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index 73e1a6827..a65b8ad99 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_red_copper", 1, 0], "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { - "en_US": "Minecraft Grade Copper (Red Copper)" + "en_US": "Minecraft Grade Copper (Red Copper)", + "ru_RU": "Медь Minecraft (Красная медь)" }, "content": { - "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form." + "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", + "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проволоки." } } From 8e102c3fc8406ca1cc8106f6a6e588c20530cb0a Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:21:07 -0600 Subject: [PATCH 196/323] Update neptunium.json --- .../resources/assets/hbm/manual/material/neptunium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index a730ab7cd..90b6c56a5 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_neptunium", 1, 0], "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], "title": { - "en_US": "Neptunium" + "en_US": "Neptunium", + "ru_RU": "Нептуний" }, "content": { - "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]]." + "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащенное нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащенное нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." } } From 0911ddc4231ee587463eb87a7c0da65280110ec1 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:24:01 -0600 Subject: [PATCH 197/323] Update plutonium-238.json --- .../resources/assets/hbm/manual/material/plutonium-238.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index 74e61a1de..d770353f4 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_pu238", 1, 0], "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], "title": { - "en_US": "Plutonium-238" + "en_US": "Plutonium-238", + "ru_RU": "Плутоний-238" }, "content": { - "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot." + "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", + "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий." } } From d8a627259780bcf244116b3f8c1b1179cdc27153 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:24:51 -0600 Subject: [PATCH 198/323] Update plutonium-239.json --- .../resources/assets/hbm/manual/material/plutonium-239.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index 307242d98..b29fe03a0 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_pu239", 1, 0], "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], "title": { - "en_US": "Plutonium-239" + "en_US": "Plutonium-239", + "ru_RU": "Плутоний-239" }, "content": { - "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive." + "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащенных топливах для различных реакторов, в смеси с другими изотопами для менее обогащенных топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." } } From 07a6b144c8da445cdd9727083ee0d6859259754c Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:25:18 -0600 Subject: [PATCH 199/323] Update plutonium-240.json --- .../resources/assets/hbm/manual/material/plutonium-240.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 3a024fec6..859bfd7c0 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_pu240", 1, 0], "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], "title": { - "en_US": "Plutonium-240" + "en_US": "Plutonium-240", + "ru_RU": "Плутоний-240" }, "content": { - "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]]." + "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]]." } } From 2bd11fdd71250ba416adb7ea3e3866ff9c13d328 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:25:58 -0600 Subject: [PATCH 200/323] Update plutonium-241.json --- .../resources/assets/hbm/manual/material/plutonium-241.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 8edf8eddc..b10bb4ed9 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_pu241", 1, 0], "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], "title": { - "en_US": "Plutonium-241" + "en_US": "Plutonium-241", + "ru_RU": "Плутоний-241" }, "content": { - "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive." + "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащенное топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." } } From 96976e9fb4cf9014b566a6165e3ea9a16dbd0ec1 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:26:51 -0600 Subject: [PATCH 201/323] Update plutonium-rg.json --- .../resources/assets/hbm/manual/material/plutonium-rg.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index 9164df069..75a1b4975 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_pu_mix", 1, 0], "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], "title": { - "en_US": "Reactor-Grade Plutonium" + "en_US": "Reactor-Grade Plutonium", + "ru_RU": "Плутоний реакторного качества" }, "content": { - "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive." + "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", + "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащенное плутониевое топливо.

Умеренно радиоактивен." } } From 61ab6dda7b445db1ca350bc21617ccbf2033f73d Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:27:31 -0600 Subject: [PATCH 202/323] Update plutonium.json --- .../resources/assets/hbm/manual/material/plutonium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 7952e22e5..719c14800 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_plutonium", 1, 0], "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], "title": { - "en_US": "Plutonium" + "en_US": "Plutonium", + "ru_RU": "Плутоний" }, "content": { - "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]" + "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", + "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]" } } From 8c696a6f643c5565ffe6eeb49ffdb431ec955b73 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:28:11 -0600 Subject: [PATCH 203/323] Update polonium.json --- src/main/resources/assets/hbm/manual/material/polonium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index 00fac7d84..c36e74218 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_polonium", 1, 0], "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], "title": { - "en_US": "Polonium-210" + "en_US": "Polonium-210", + "ru_RU": "Полоний-210" }, "content": { - "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot." + "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", + "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." } } From 81f9915e54ee71df7091a4914509397e7b11099c Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:28:38 -0600 Subject: [PATCH 204/323] Update polymer.json --- src/main/resources/assets/hbm/manual/material/polymer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 1fbd464c2..9c540925b 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_polymer", 1, 0], "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], "title": { - "en_US": "Polymer" + "en_US": "Polymer", + "ru_RU": "Полимер" }, "content": { - "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]]." + "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", + "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].

Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]]." } } From 37cee61269cf46670e03bfdabae367dcebfcaaa6 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:30:23 -0600 Subject: [PATCH 205/323] Update radium.json --- src/main/resources/assets/hbm/manual/material/radium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 6ec2dcd92..0821eace7 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_ra226", 1, 0], "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], "title": { - "en_US": "Radium-226" + "en_US": "Radium-226", + "ru_RU": "Радий-226" }, "content": { - "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive." + "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечен с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." } } From bbe87c34c3449b1962a9462525c4451979acb999 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:31:34 -0600 Subject: [PATCH 206/323] Update rubber.json --- src/main/resources/assets/hbm/manual/material/rubber.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index 9db9ddc37..e317d6752 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_rubber", 1, 0], "trigger": [["hbm:item.ingot_rubber"]], "title": { - "en_US": "Rubber" + "en_US": "Rubber", + "ru_RU": "Резина" }, "content": { - "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe." + "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", + "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах." } } From f6ce5b5ae746248af25ba5bbe9f09c3f982e1f9c Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:33:30 -0600 Subject: [PATCH 207/323] Update silicon.json --- src/main/resources/assets/hbm/manual/material/silicon.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 4a6f8defd..67951240c 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_silicon", 1, 0], "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], "title": { - "en_US": "Silicon" + "en_US": "Silicon", + "ru_RU": "Кремний" }, "content": { - "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing." + "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", + "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]]." } } From 170984820931311404acfbc26a98eddcc71cbe78 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:34:22 -0600 Subject: [PATCH 208/323] Update sodium.json --- src/main/resources/assets/hbm/manual/material/sodium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 5165042e0..6ad6ac6f7 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.powder_sodium", 1, 0], "trigger": [["hbm:item.powder_sodium"]], "title": { - "en_US": "Sodium" + "en_US": "Sodium", + "ru_RU": "Натрий" }, "content": { - "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant." + "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", + "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]]." } } From 84c69e7803cf2d200b3fe86ee9136ed6abfa9dfc Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:35:04 -0600 Subject: [PATCH 209/323] Update steel.json --- src/main/resources/assets/hbm/manual/material/steel.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index 113d25af1..c9260f2c5 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_steel", 1, 0], "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], "title": { - "en_US": "Steel" + "en_US": "Steel", + "ru_RU": "Сталь" }, "content": { - "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]]." + "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", + "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путем комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]]." } } From cdda91f2d83772c31e3616db52e62ba126b89176 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:35:44 -0600 Subject: [PATCH 210/323] Update sulfur.json --- src/main/resources/assets/hbm/manual/material/sulfur.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 32a07b988..c73d90cb5 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.sulfur", 1, 0], "trigger": [["hbm:item.sulfur"]], "title": { - "en_US": "Sulfur" + "en_US": "Sulfur", + "ru_RU": "Сера" }, "content": { - "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye." + "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", + "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве желтого красителя." } } From aa5c85ade5fc151a9fb43c1953ba09b86647c425 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:36:10 -0600 Subject: [PATCH 211/323] Update tantalium.json --- .../resources/assets/hbm/manual/material/tantalium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 5368737b3..196550330 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_tantalium", 1, 0], "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], "title": { - "en_US": "Tantalium" + "en_US": "Tantalium", + "ru_RU": "Тантал" }, "content": { - "en_US": "Tantalium ('Tantalum') can be ectracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs." + "en_US": "Tantalium ('Tantalum') can be ectracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", + "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." } } From c39854dbb419f31c23fe17838a2bdda515cdf363 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:36:49 -0600 Subject: [PATCH 212/323] Update technetium.json --- .../resources/assets/hbm/manual/material/technetium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 97748ea2b..5eaef724f 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_technetium", 1, 0], "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], "title": { - "en_US": "Technetium" + "en_US": "Technetium", + "ru_RU": "Технеций" }, "content": { - "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive." + "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", + "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен." } } From 00980d937a4209e2246d11f98f0d3754157d5877 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:37:24 -0600 Subject: [PATCH 213/323] Update technetium_steel.json --- .../assets/hbm/manual/material/technetium_steel.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index 5f33be6c7..ac31ac861 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_tcalloy", 1, 0], "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], "title": { - "en_US": "Technetium Steel" + "en_US": "Technetium Steel", + "ru_RU": "Технециевая сталь" }, "content": { - "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangable with [[cadmium steel|Cadmium Steel]]." + "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", + "ru_RU": "Сплав из [[стали|Steel]] и [[технеция|Technetium]]. Устойчив к коррозии, используется в более прочных резервуарах для жидкостей и во многих продвинутых машинах. Доступен после [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]], так как технеций является синтетическим.

Полностью взаимозаменяем с [[кадмиевой сталью|Cadmium Steel]]." } } From a4b49633c6adaac005cb34917cd1a7d2838e0a82 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:38:13 -0600 Subject: [PATCH 214/323] Update thorium.json --- src/main/resources/assets/hbm/manual/material/thorium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index 1812f13e7..be512e7cc 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_th232", 1, 0], "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], "title": { - "en_US": "Thorium-232" + "en_US": "Thorium-232", + "ru_RU": "Торий-232" }, "content": { - "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive." + "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", + "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен." } } From 4c162e9f37e8fe074a083670c38ffde82ab11446 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:39:07 -0600 Subject: [PATCH 215/323] Update uranium-233.json --- .../resources/assets/hbm/manual/material/uranium-233.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index 1852de4c2..e0ab24b7d 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_u233", 1, 0], "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], "title": { - "en_US": "Uranium-233" + "en_US": "Uranium-233", + "ru_RU": "Уран-233" }, "content": { - "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive." + "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путем переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." } } From b8fa2a67d798e50a9056b513fb5d48fdd48fdbec Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:40:04 -0600 Subject: [PATCH 216/323] Update uranium-235.json --- .../resources/assets/hbm/manual/material/uranium-235.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 361c97c72..b9a75efc1 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_u235", 1, 0], "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], "title": { - "en_US": "Uranium-235" + "en_US": "Uranium-235", + "ru_RU": "Уран-235" }, "content": { - "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive." + "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", + "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путем переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." } } From 2546cf79b7163c60a8bbcea5ae08bf80b0c431e3 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:40:41 -0600 Subject: [PATCH 217/323] Update uranium-238.json --- .../resources/assets/hbm/manual/material/uranium-238.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index bef789d01..ca87770e1 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.billet_u238", 1, 0], "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], "title": { - "en_US": "Uranium-238" + "en_US": "Uranium-238", + "ru_RU": "Уран-238" }, "content": { - "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive." + "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", + "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." } } From 563defd5f167a8bf81187cb68123ced56f5d6413 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:41:27 -0600 Subject: [PATCH 218/323] Update uranium.json --- src/main/resources/assets/hbm/manual/material/uranium.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index 3c34cc07e..cfeec2dfc 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_uranium", 1, 0], "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], "title": { - "en_US": "Uranium" + "en_US": "Uranium", + "ru_RU": "Уран" }, "content": { - "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]" + "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", + "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путем превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" } } From 458ee0a90e3488e3e8a00596c1927a8fb4580259 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:42:02 -0600 Subject: [PATCH 219/323] Update weaponsteel.json --- .../resources/assets/hbm/manual/material/weaponsteel.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index 87d951ce6..52e5c11ed 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -3,9 +3,11 @@ "icon": ["hbm:item.ingot_weaponsteel", 1, 0], "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], "title": { - "en_US": "Weapon Steel" + "en_US": "Weapon Steel", + "ru_RU": "Оружейная сталь" }, "content": { - "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads." + "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", + "ru_RU": "Высококачественная версия [[стали|Steel]], изготовленная в [[роторной печи|Rotary Furnace]]. Требует [[коксовый газ|Coker Gas]] и, следовательно, [[коксовую установку|Coker Unit]]. Используется во многих оружиях среднего этапа игры, модификациях оружия и боеголовках ракет." } } From 4750b0eba2e80aae35bc004ba74fd8f3d489f918 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:45:41 -0600 Subject: [PATCH 220/323] Update aluminium.json --- src/main/resources/assets/hbm/manual/material/aluminium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 5a20169ae..9590844ad 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", - "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путем обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозема.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." + "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозема.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." } } From 470f950b1a35956479cd6df15a570f50c9c9cfad Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:46:08 -0600 Subject: [PATCH 221/323] Update aluminium.json --- src/main/resources/assets/hbm/manual/material/aluminium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 9590844ad..8bdf151bc 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", - "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозема.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." + "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." } } From 9b412c726d107601986408efba0f64828e9febaf Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:48:35 -0600 Subject: [PATCH 222/323] Update cinnabar.json --- src/main/resources/assets/hbm/manual/material/cinnabar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index 12bd758f9..bb721bf6f 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", - "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в косксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." } } From 9ff54c2495c46d2700407df271d7c5dbbd4aba30 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:49:51 -0600 Subject: [PATCH 223/323] Update coke.json --- src/main/resources/assets/hbm/manual/material/coke.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index b113bd25f..ffc79a820 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", - "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путем переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешевого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путем коксования различных видов масла в [[коксовой установке|Coking Unit]]." + "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путем переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путем коксования различных видов масла в [[коксовой установке|Coking Unit]]." } } From c99f647e156c6f5ba2e83c459ed43042c2d7c8b9 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:55:42 -0600 Subject: [PATCH 224/323] Update desh.json --- src/main/resources/assets/hbm/manual/material/desh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index c0d7ddbeb..a34e741c7 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", - "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельченные|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." } } From 9da95bbff3753eeeafc8faeeb05a1bc01efd417f Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:57:05 -0600 Subject: [PATCH 225/323] Update mingrade.json --- src/main/resources/assets/hbm/manual/material/mingrade.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index a65b8ad99..fe1732da5 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", - "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проволоки." + "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проводов." } } From 2ad1c2121d00fcc1a6fb85ef8833197e67b6f7a9 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:58:10 -0600 Subject: [PATCH 226/323] Update neptunium.json --- src/main/resources/assets/hbm/manual/material/neptunium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index 90b6c56a5..a68c7adb9 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", - "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащенное нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащенное нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." } } From 997ed75b791f1cd86519b61bb93a51a188c5b6ec Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:58:42 -0600 Subject: [PATCH 227/323] Update plutonium-239.json --- .../resources/assets/hbm/manual/material/plutonium-239.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index b29fe03a0..f64b725f8 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", - "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащенных топливах для различных реакторов, в смеси с другими изотопами для менее обогащенных топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." } } From de4a35900203ded4632c0bc426d6a22ec2c89b43 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:59:18 -0600 Subject: [PATCH 228/323] Update plutonium-241.json --- .../resources/assets/hbm/manual/material/plutonium-241.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index b10bb4ed9..096b8864c 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", - "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащенное топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." } } From 098ecd3791fe35c7c5bd0384c8e8a0fa02adf480 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:59:44 -0600 Subject: [PATCH 229/323] Update plutonium-rg.json --- src/main/resources/assets/hbm/manual/material/plutonium-rg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index 75a1b4975..c5cb2f1a4 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", - "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащенное плутониевое топливо.

Умеренно радиоактивен." + "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащённое плутониевое топливо.

Умеренно радиоактивен." } } From 9b7332a047020c528cdd1b58e463917f28339977 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:00:32 -0600 Subject: [PATCH 230/323] Update radium.json --- src/main/resources/assets/hbm/manual/material/radium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 0821eace7..331d37adc 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", - "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечен с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." } } From 9a47ec30f42013159ee104a55ee599e49a7b5d1f Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:03:46 -0600 Subject: [PATCH 231/323] Update sulfur.json --- src/main/resources/assets/hbm/manual/material/sulfur.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index c73d90cb5..7d9b5915b 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", - "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве желтого красителя." + "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя." } } From 74bd23d76ea11ba2f6fa840b3e9c16af85d7a49f Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:07:16 -0600 Subject: [PATCH 232/323] Update uranium-233.json --- src/main/resources/assets/hbm/manual/material/uranium-233.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index e0ab24b7d..d1802f419 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", - "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путем переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." } } From ed67caa19c3b89727e6f74971f335395368c0756 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:08:48 -0600 Subject: [PATCH 233/323] Update arsenic.json --- src/main/resources/assets/hbm/manual/material/arsenic.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index 01fe95509..d54f92d25 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", - "ru_RU": "Получается путем обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]]." + "ru_RU": "Получается путём обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]]." } } From 792dff062e22252e145136e3baa8145c6e06695e Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:09:10 -0600 Subject: [PATCH 234/323] Update cadmium.json --- src/main/resources/assets/hbm/manual/material/cadmium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 14d06bebe..0de201080 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", - "ru_RU": "Изготовлен путем обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]]." + "ru_RU": "Изготовлен путём обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]]." } } From 85895f7ce88eedcf4cc1b1ef2e3391269a470995 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:09:37 -0600 Subject: [PATCH 235/323] Update coke.json --- src/main/resources/assets/hbm/manual/material/coke.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index ffc79a820..234ab7588 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", - "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путем переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путем коксования различных видов масла в [[коксовой установке|Coking Unit]]." + "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]]." } } From ffd83ebef395992caea088d3b21c71b1ca2e1169 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:09:55 -0600 Subject: [PATCH 236/323] Update graphite.json --- src/main/resources/assets/hbm/manual/material/graphite.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 22bcccc21..1876c53fa 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", - "ru_RU": "Изготавливается путем прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]]." + "ru_RU": "Изготавливается путём прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]]." } } From 8ef85c4d04e9dd840766bda8e96e6d6600040309 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:10:12 -0600 Subject: [PATCH 237/323] Update latex.json --- src/main/resources/assets/hbm/manual/material/latex.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index b2a4a5beb..b5795bd32 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", - "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путем прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот." + "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путём прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот." } } From eaadc3661839720c77b64e76fb507be8c738ca14 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:10:29 -0600 Subject: [PATCH 238/323] Update steel.json --- src/main/resources/assets/hbm/manual/material/steel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index c9260f2c5..83c6f8867 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", - "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путем комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]]." + "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путём комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]]." } } From 9e2f116a32955783ad67ebc292e45eb51350a4fe Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:10:48 -0600 Subject: [PATCH 239/323] Update uranium-235.json --- src/main/resources/assets/hbm/manual/material/uranium-235.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index b9a75efc1..56b101d67 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", - "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путем переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." + "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." } } From 2db923173a1304d50f0805cedb85c28168a97cf8 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:11:05 -0600 Subject: [PATCH 240/323] Update uranium.json --- src/main/resources/assets/hbm/manual/material/uranium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index cfeec2dfc..89ab05f6b 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", - "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путем превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" + "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" } } From d669c4372e2ee49858bc43b9f41115dcdb671897 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 17 Aug 2025 12:03:09 +0300 Subject: [PATCH 241/323] Fix buzzsaw not replanting wheat occasionally --- .../hbm/tileentity/machine/TileEntityMachineAutosaw.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index f88c37ac3..7763e5ee7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -305,6 +305,14 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB entityItem.delayBeforeCanPickup = 10; worldObj.spawnEntityInWorld(entityItem); } + + // Apparently, until 1.14 full-grown wheat could sometimes drop no seeds at all + // This is a quick and dirty workaround for that. + if (b == Blocks.wheat && !replanted) { + replacementBlock = b; + replacementMeta = 0; + replanted = true; + } } worldObj.setBlock(x, y, z, replacementBlock, replacementMeta, 3); From bee95f9065cf3cfd7cef676dbd7a30d3cb0b5b98 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 17 Aug 2025 17:55:28 +0200 Subject: [PATCH 242/323] scrungus --- changelog | 7 +++++-- .../recipes/loader/SerializableRecipe.java | 2 +- .../com/hbm/itempool/ItemPoolsComponent.java | 12 ++++++++---- .../weapon/sedna/factory/XFactory12ga.java | 4 ++-- .../hbm/textures/models/trinkets/hundun.png | Bin 1336 -> 3240 bytes 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/changelog b/changelog index a06979124..c910a8ca3 100644 --- a/changelog +++ b/changelog @@ -1,11 +1,13 @@ ## Changed * QMAW now has buttons for returning to previously viewed pages -* QMAW file detection now includes subfolders to `manual` +* QMAW file detection now includes subfolders to `manual` in folder-based packs (which already worked in zip packs and the mod's jar file) * OpenComputers integration for the ZIRNOX should now return values in °C and bar instead of unexplained weird internal units * The sodium and strontium autogen ingots now have their correct hazard tags * Pattern matchers, like the one used on the automatic crafting table, no longer care about NBT data of an item * This means that RBMK fuel rods can now be automatically disassembled without the depletion number having to be a 100% match * Due to the way the RBMK uncrafting handler works, a single autocrafter now correctly supports RBMK fuel of one type of any depletion level, yielding the correct recycling pellets +* Blueprint folders have been added to more loot pools, making them less rare +* Replaced the winnie the pooh plushie with hundun ## Fixed * Fixed QMAW not working at all @@ -14,4 +16,5 @@ * Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors * Fixed shift-click handling on the electric arc furnace not working with upgrades, and putting electrodes in the wrong slot * Fixed issue with the load order where custom fluids wouldn't work properly for fluid loading/unloading and in custom recipes -* Fixed balefire bomb not rendering the egg when fully loaded \ No newline at end of file +* Fixed balefire bomb not rendering the egg when fully loaded +* Fixed selenium steel 12ga casings having the wrong color \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 80567014d..2770da7c7 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -123,7 +123,7 @@ public abstract class SerializableRecipe { Reader reader = new InputStreamReader(stream); recipe.readRecipeStream(reader); recipe.modified = true; - } catch(IOException ex) { + } catch(Throwable ex) { MainRegistry.logger.error("Failed to reset synced recipe stream", ex); } } else if(recFile.exists() && recFile.isFile()) { diff --git a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java index 8f1a78633..1e4600988 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java @@ -109,7 +109,8 @@ public class ItemPoolsComponent { weighted(ModItems.can_mrsugar, 0, 1, 2, 2), weighted(ModItems.cap_nuka, 0, 1, 16, 2), weighted(ModItems.book_guide, 3, 1, 1, 1), - weighted(ModBlocks.deco_computer, 0, 1, 1, 1) + weighted(ModBlocks.deco_computer, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -158,7 +159,8 @@ public class ItemPoolsComponent { weighted(ModItems.powder_bromine, 0, 1, 1, 1), weighted(ModItems.powder_cobalt, 0, 1, 1, 1), weighted(ModItems.powder_neodymium, 0, 1, 1, 1), - weighted(ModItems.powder_boron, 0, 1, 1, 1) + weighted(ModItems.powder_boron, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; @@ -186,7 +188,9 @@ public class ItemPoolsComponent { weighted(Items.paper, 0, 1, 6, 7), weighted(Items.clock, 0, 1, 1, 3), weighted(Items.book, 0, 1, 5, 10), - weighted(Items.experience_bottle, 0, 1, 3, 1) + weighted(Items.experience_bottle, 0, 1, 3, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; @@ -222,7 +226,7 @@ public class ItemPoolsComponent { weighted(ModItems.pellet_rtg_weak,0, 0, 1, 1), }; }}; - + new ItemPool(POOL_REPAIR_MATERIALS) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ingot_aluminium, 0, 2, 8, 3), diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 44f9d046f..c70d33501 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -271,8 +271,8 @@ public class XFactory12ga { g12_phosphorus = new BulletConfig().setItem(EnumAmmo.G12_PHOSPHORUS).setCasing(EnumCasingType.BUCKSHOT_ADVANCED, 6).setProjectiles(8).setDamage(1F/8F).setSpread(magnumSpread).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x910001, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12GA_PHOSPHORUS")) .setOnImpact((bullet, mop) -> { if(mop.entityHit != null && mop.entityHit instanceof EntityLivingBase) { HbmLivingProps data = HbmLivingProps.getData((EntityLivingBase) mop.entityHit); if(data.phosphorus < 300) data.phosphorus = 300; } }); //g12_anthrax = new BulletConfig().setItem(EnumAmmo.G12_ANTHRAX).setProjectiles(8).setDamage(1F/8F).setSpread(0.015F).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x749300, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12GA_ANTHRAX")); - g12_equestrian_bj = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setOnImpact(LAMBDA_BOAT).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_EQUESTRIAN, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12gaEquestrianBJ")); - g12_equestrian_tkr = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_EQUESTRIAN, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12gaEquestrianTKR")); + g12_equestrian_bj = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setOnImpact(LAMBDA_BOAT).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_EQUESTRIAN).setScale(0.75F).register("12gaEquestrianBJ")); + g12_equestrian_tkr = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_EQUESTRIAN).setScale(0.75F).register("12gaEquestrianTKR")); BulletConfig[] all = new BulletConfig[] {g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus}; diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/hundun.png b/src/main/resources/assets/hbm/textures/models/trinkets/hundun.png index 70bf3b41ac40518fd407ed9e49c36f0326b127e1..ab600170cdf0a4dad27b1d005d397327eafa9c19 100644 GIT binary patch delta 3221 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 Hu0mjfP02he delta 1302 zcmV+x1?l>z8Mq3NGk*l{NklF>4e-6vyAn6^bAd4nmqhB&IZtLI@T%Vl6`O z6Qt3gL`%sfBG^Pxf);)Pi3G8ox08D_|9NkA=aPVd!_Do~bj~0~XQq=f@6U66-8Bw3w|~>3*T>hT{yWOrqoPrD z10wlI0kRI103^0$o!v@0!26w(tZ_Fd&y^kts*zq+xqL%7QRiq~y~%EE6rgSn$H!?i(PTQF; zhU?&I_Gk|}BU8}%@*QAgDjWT(kx0=tlMSIrwko7jG8t-n0BXm#B+19;lVky%^^Jk` zXXkk4a;^@6DLVa7Pg_OowLqWy0}x~Zvh&9l#^GRXzklzzv%W#z39z$OWq|*kq)g`+ zCI!G?MUcsx1sD}zY+-!h>!Kr2qH?S%n8F>Q2*acR*x4;bMj+yVJQ)B$jt+3Jwy*63 z9L~p3N97ou0+>dmtpb#_w}NCGmszp^A?+uJqI^YJ=D;-i0cckLhDiZ9@HP!J-N~a0 z2yN%yB7bwWOMA9dwi1|!K~5f>nNGxy%Qn@G2KO8*({4_bUh}tUPoB;p-%X9`fY z)BynOE-t0wC(rrMUcBo0T?R^9lsJh2d~kkVbc#?^Da8A*<9$&cb_MXs`68>~TD=@b zyv+ir*j-#og~ONc-R{2l`CS%EbY8E*h3Aj^Vt)lZLd(W3SMNS0wMPZ30{Afc<y=TpuFFURZXG9pgF+DEd?}wE|GvqoVdxfb3k=4W&Vd!0o~PJ0xwPwnu^U=K)O7 zZEMQP4a0R}8-Zly66j1<9`_#lV zFs6aL*nR-MJS!IpPO<=BMuCvrJngYL*MF6L4jMSh&csCGu_wD(*Cs5$s6u<=@iKcrXZ6f=+J%P6NxqpZX z5IB7bfY$*`&kLB|-<{(D0FI%ztOnQ5PhRV}PSGII)Lzqh0^1!=wtE6y#|%ysU@qN) zxpb>=Il@Q6op=6%ubDH~lgj`AR%NUJ)Nnty@B6+0_8<_CY+aqMJkQs(4DLO9KJEz= z#2_$moTPzIzWo6JfJc{37bI&&j^c`ItBb1P;3boWJ-m8v(1R zZWRE2|6EP;o*$v7as?3cJw7gq?mP3-fB!>AR}K~96G51=^;IFhLS6nAZJV!EuPc=+ zfE?*lM*Vpl8@lsriAv_>I@NK=RIUIV2$`4VUhWiCwJQ>dMEv3}8p}e@3lB01b^rhX M07*qoM6N<$f=JkPa{vGU From be03467f659aaf30f13616ac0f49944ce9f68a00 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 17 Aug 2025 23:09:50 +0200 Subject: [PATCH 243/323] slunkus the great, lord of death --- changelog | 7 ++++++- gradle.properties | 2 +- src/main/java/com/hbm/blocks/ModBlocks.java | 5 ++--- .../java/com/hbm/blocks/generic/BlockCrate.java | 12 +++--------- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../assets/hbm/manual/material/tantalium.json | 2 +- .../hbm/textures/blocks/trapdoor_steel.png | Bin 790 -> 446 bytes .../assets/hbm/textures/items/fluid_barrel.png | Bin 305 -> 355 bytes .../hbm/textures/items/fluid_barrel_overlay.png | Bin 208 -> 175 bytes 9 files changed, 14 insertions(+), 16 deletions(-) diff --git a/changelog b/changelog index c910a8ca3..377222992 100644 --- a/changelog +++ b/changelog @@ -8,6 +8,9 @@ * Due to the way the RBMK uncrafting handler works, a single autocrafter now correctly supports RBMK fuel of one type of any depletion level, yielding the correct recycling pellets * Blueprint folders have been added to more loot pools, making them less rare * Replaced the winnie the pooh plushie with hundun +* Retextured the universal fluid tanks and barrels again +* Updated steel trapdoor texture +* Removed the old hexafluoride tanks from the creative tab ## Fixed * Fixed QMAW not working at all @@ -17,4 +20,6 @@ * Fixed shift-click handling on the electric arc furnace not working with upgrades, and putting electrodes in the wrong slot * Fixed issue with the load order where custom fluids wouldn't work properly for fluid loading/unloading and in custom recipes * Fixed balefire bomb not rendering the egg when fully loaded -* Fixed selenium steel 12ga casings having the wrong color \ No newline at end of file +* Fixed selenium steel 12ga casings having the wrong color +* Fixed the buzzsaw sometimes not replanting crops +* Scrungus \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index fcfc33a9b..394982cb6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5418 +mod_build_number=5425 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 87269420e..d30f6b619 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1825,9 +1825,8 @@ public class ModBlocks { machine_rotary_furnace = new MachineRotaryFurnace(Material.iron).setBlockName("machine_rotary_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_crystallizer = new MachineCrystallizer(Material.iron).setBlockName("machine_crystallizer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crystallizer"); - machine_uf6_tank = new MachineUF6Tank(Material.iron).setBlockName("machine_uf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - - machine_puf6_tank = new MachinePuF6Tank(Material.iron).setBlockName("machine_puf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + machine_uf6_tank = new MachineUF6Tank(Material.iron).setBlockName("machine_uf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); + machine_puf6_tank = new MachinePuF6Tank(Material.iron).setBlockName("machine_puf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); machine_reactor_breeding = new MachineReactorBreeding(Material.iron).setBlockName("machine_reactor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_reactor"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockCrate.java b/src/main/java/com/hbm/blocks/generic/BlockCrate.java index e24a62d78..abfebe1d1 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCrate.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.Spaghetti; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.ModItems; @@ -16,6 +17,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +@Spaghetti("this is implemented in the most braindead fucking way imaginable") // TODO: rework this unholy abomination using configurable loot pools public class BlockCrate extends BlockFalling { List crateList; @@ -69,22 +71,16 @@ public class BlockCrate extends BlockFalling { // Lead Crate BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium, 10); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u235, 5); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u238, 8); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium, 7); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu238, 5); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu239, 4); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu240, 6); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium_fuel, 8); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium_fuel, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_mox_fuel, 6); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium, 10); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u235, 5); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u238, 8); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_plutonium, 7); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu238, 5); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu239, 4); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu240, 6); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium_fuel, 8); @@ -96,7 +92,6 @@ public class BlockCrate extends BlockFalling { BlockCrate.addToListWithWeight(leadList, ModItems.cell_puf6, 8); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg, 6); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg_weak, 7); - BlockCrate.addToListWithWeight(leadList, ModItems.tritium_deuterium_cake, 5); BlockCrate.addToListWithWeight(leadList, ModItems.powder_yellowcake, 10); // Metal Crate @@ -110,14 +105,13 @@ public class BlockCrate extends BlockFalling { BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_battery), 8); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_lithium_battery), 5); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 8); - BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembler), 10); + BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembly_machine), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_fluidtank), 7); BlockCrate.addToListWithWeight(metalList, ModItems.centrifuge_element, 6); BlockCrate.addToListWithWeight(metalList, ModItems.motor, 8); BlockCrate.addToListWithWeight(metalList, ModItems.coil_tungsten, 7); BlockCrate.addToListWithWeight(metalList, ModItems.photo_panel, 3); BlockCrate.addToListWithWeight(metalList, ModItems.coil_copper, 10); - BlockCrate.addToListWithWeight(metalList, ModItems.tank_steel, 9); BlockCrate.addToListWithWeight(metalList, ModItems.blade_titanium, 3); BlockCrate.addToListWithWeight(metalList, ModItems.piston_selenium, 6); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 34f6c299c..b182de6f7 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5418)"; + public static final String VERSION = "1.0.27 BETA (5425)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 196550330..e3d0ee9c2 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -7,7 +7,7 @@ "ru_RU": "Тантал" }, "content": { - "en_US": "Tantalium ('Tantalum') can be ectracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", + "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." } } diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png index 23ed483c9f7729883c786aa7848c48f285ba3537..ec80cd8e007f6e10b75f7be63907ae4820da43a4 100644 GIT binary patch delta 421 zcmV;W0b2f+2EGH3BYyw{b3#c}2nYxWdo81+e#uoc%-oTyfK|HoNxB?%148C*?0aayT3S5RqIILfEVUnx^6Lc;LOqCF-x&i~W8NKv5LT^ZYdinCF=oBOwHwh#(@= zbLQ3Dt{tES(dnzm?Wh5llB^2*X7uyPA|){k?=1mNpAW&cpFDVHpz+l8cCk2 z{y1@(CWc{P97nF#Yo_eI|0QQFVHk!VBQ;HfwU)MRGmB)`PZK3HP4k|Ds%AakMwg(f zEX%U#g{tC=F^C9NRdK)HH@B*4eoP?*thIS9A{b-dMjpCcF8SpDebRpb{>arM#%M+= P00000NkvXXu0mjfI5Eh^ delta 767 zcmVH_m#Kqgef526_Qc97MTwT3gr15)<+D$yuGrv#Y=lTBn z&37O?kvB}Yas*7vbK>JMZDw{(t9hcD2#qw;rW>w3nHWp*?|*u~A*AYcpX&Ahy+2p| zV%jwzR4Y7W*p4SG(=f5@*@`!WTaBE)D7-Hmb!0%{3#F$5epH+d_*Jo!jE_QC_0+Ou zoGN1@=a|C1!d+&*X#C8hz9f>irV~;-WOw2cXPg)sDT*wS$D>cGC7J#0>;LvmQ4o(I zZ<`eyab(GfH-9Q>QM#t3W<*cRlV?Tc{yR@MGdK`*kHnzr!S`Rfp=Jv{H+}!(!1q57 zq2eCStdhSVISs#wzFE?`_MmAEPR>hOY8y`1q5aO*9sOIXkR8rs;Q1IDW})Q@>gI#2 ze$F|%h2*OIqD$D>g&w)zwD1M(mS_QJK}voA000SaNPk�XT000XT0n*)m`~Uy} zPf0{UR5;6>lhKZXFc3uttQf&432%M^|NlWeX$Zy#R0t?wPP5Y#boXIzVp=+L+nIaE zAkXtjelU)sUBfW6dsaX8dcDLL<8pwBqDYR%qYT5~l6_(j1a3b~lRO>|+3j}r`*b>q z>HA*lx_`C-pO_?xODxNBR-sl0*KD_2o6KRBW$uDFj^%tli^dO!gNyC=d%0e(_EDpy zcU>n-K%@mq_kk8X2-mDuE8$1-5+t>4JJScO*K1Lp@e}+qpU%$ zLSXeRRvRssVIZMtnve3(;G4yW3C9f*H~LekPysia%|{H5b%7!I%|^9~)_faPH@F5{ x)bFaQoQSH8R&lvp?6+?tdpk%)QOJM)(r;~L+{vGC7Q_Gm002ovPDHLkV1l$&atHtb diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel.png index fdc4318612fa761aed083d119c28fc133ed9d215..d3f440a4b383be28aeb52d7510637dd50f408c95 100644 GIT binary patch delta 339 zcmV-Z0j&P90^$p5$hK`)fTAciPHT-Z25T+P=QGg!#$qqjT7M&@49tZP0PEf)Fz`YE zDJA0Ki%cz~yoQ2uu$Rj4@Q(c1({DY~v>7zXBf-gw`euL(Tnc@9#%Ltx+qaict(bN^4^@#%K> zFoh#NZs1{pcuWdjEQFx0>+cDaQdCt15KO^2$23ieL9$HO>vgr(a=+g(#%%xK^?Cs$ l%XGM+0O#|0-JfHj#~*c8pi1?5T($rJ002ovPDHLkV1flEm6QMg delta 289 zcmaFNw2^6oWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Z2;1l8+ z85!x|;80v#tgWrx)6=tH!2%y2pIy6lUA}x7sAS^Z)9Zm0S4ogx@P8O!*mOqcJW!Og zz$3Dlfr0NZ2s0kfUy%Y7%<-&uaSYK2F6|5CJD|Yf+^x{}JHBG=i+|USwCr=x_GWHzV=8wj0;t^|@Kk?rY z3p0N)&18;P_f73ezf*JKIKN1Te7rBxzDnF?D@$bZtp}5V7W1V>c&7RKGH6KwIUGO? S0+)h8QVgE1elF{r5}E)ufoQ(~ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png index 518122010d2046d12f05a8818cded6184e8ccec2..7a1e2b4245899c7a2f3a6a9e84b35a68e05328e0 100644 GIT binary patch delta 130 zcmV-|0Db?^0j~j&G<#-AL_t(IjqQ-J4S+BV1Rul>nbOl_piB{W?mttQiijYHf{-W> zSNU!I+cNO;J~2k$>v_~j(n-3iHvMh@N#9Ua9L)f*^a4T%NGVmFbG{dFW;C;AHvEGt kx)+pEYAqtu(`8>}1%Ngyh`j|%@c;k-07*qoM6N<$f|f=$`v3p{ delta 164 zcmV;V09*gB0nh=EG=GOlL_t(IjqQ=K4Z|=D1Yd!d)jTS=iwgD{K1QekRb5qdz4cAU2o1gytjGa?x!Wp?9A-@zK6EW233s`RRsWuNX&chOX;>K zkMLD+IbjZ*VP>xjJ|zl>C|zwKB519l)|w72J)4+0K5^V`W*rz~fQT0V4{!(4_(jYF Sy0`!U0000 Date: Mon, 18 Aug 2025 22:07:50 +0800 Subject: [PATCH 244/323] Update zh_CN.lang --- src/main/resources/assets/hbm/lang/zh_CN.lang | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index c220e14b9..eb7c5f99b 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6138,3 +6138,6 @@ purex.schrab=从 %s 中萃取Sa326 tile.machine_purex.name=钚铀还原提取设备(PUREX) tile.machine_purex.desc=可用于多种核燃料的再处理机器。$大多数配方需要用到硝酸和煤油。 qmaw.tab=[按 %s 键获取帮助] +commands.locate.no_match=没有具有此名称的结构! +commands.locate.none_found=未在附近找到结构! +commands.locate.success.coordinates=在 %d, %d 处找到结构 %s From a0451b46a5720d71cc83db181a558e0bef41d97f Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 18 Aug 2025 16:35:50 +0200 Subject: [PATCH 245/323] the glunch --- changelog | 25 +- gradle.properties | 2 +- .../com/hbm/handler/BobmazonOfferFactory.java | 3 + .../hbm/handler/DispenserBehaviorHandler.java | 313 ++++++++++++++++++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 2 + src/main/java/com/hbm/main/MainRegistry.java | 313 +----------------- 7 files changed, 326 insertions(+), 334 deletions(-) create mode 100644 src/main/java/com/hbm/handler/DispenserBehaviorHandler.java diff --git a/changelog b/changelog index 377222992..d3d8a6554 100644 --- a/changelog +++ b/changelog @@ -1,25 +1,6 @@ ## Changed -* QMAW now has buttons for returning to previously viewed pages -* QMAW file detection now includes subfolders to `manual` in folder-based packs (which already worked in zip packs and the mod's jar file) -* OpenComputers integration for the ZIRNOX should now return values in °C and bar instead of unexplained weird internal units -* The sodium and strontium autogen ingots now have their correct hazard tags -* Pattern matchers, like the one used on the automatic crafting table, no longer care about NBT data of an item - * This means that RBMK fuel rods can now be automatically disassembled without the depletion number having to be a 100% match - * Due to the way the RBMK uncrafting handler works, a single autocrafter now correctly supports RBMK fuel of one type of any depletion level, yielding the correct recycling pellets -* Blueprint folders have been added to more loot pools, making them less rare -* Replaced the winnie the pooh plushie with hundun -* Retextured the universal fluid tanks and barrels again -* Updated steel trapdoor texture -* Removed the old hexafluoride tanks from the creative tab +* Blueprint folders can now be bought on bobmazon (64 for blue recipes, 256 for beige ones) ## Fixed -* Fixed QMAW not working at all -* Potentially fixed a bug where proxy tile entities would reference unloaded core tile entities which would cause bizarre item voiding/duping issues in rare cases -* Fixed fusion reactor automation being able to remove items other than the breeding output slot -* Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors -* Fixed shift-click handling on the electric arc furnace not working with upgrades, and putting electrodes in the wrong slot -* Fixed issue with the load order where custom fluids wouldn't work properly for fluid loading/unloading and in custom recipes -* Fixed balefire bomb not rendering the egg when fully loaded -* Fixed selenium steel 12ga casings having the wrong color -* Fixed the buzzsaw sometimes not replanting crops -* Scrungus \ No newline at end of file +* Fixed the QMAW loader crashing servers + * Oops \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 394982cb6..03457ea9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5425 +mod_build_number=5426 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/handler/BobmazonOfferFactory.java b/src/main/java/com/hbm/handler/BobmazonOfferFactory.java index e0b3c4560..e53b5f603 100644 --- a/src/main/java/com/hbm/handler/BobmazonOfferFactory.java +++ b/src/main/java/com/hbm/handler/BobmazonOfferFactory.java @@ -39,6 +39,9 @@ public class BobmazonOfferFactory { standard.add(new Offer(new ItemStack(ModItems.gun_kit_1, 1), Requirement.ASSEMBLY, 16)); standard.add(new Offer(new ItemStack(ModItems.geiger_counter, 1), Requirement.NONE, 16)); standard.add(new Offer(new ItemStack(ModItems.matchstick, 16), Requirement.STEEL, 2)); + //blueprints + standard.add(new Offer(new ItemStack(ModItems.blueprint_folder, 1, 0), Requirement.ASSEMBLY, 64)); + standard.add(new Offer(new ItemStack(ModItems.blueprint_folder, 1, 1), Requirement.OIL, 256)); //plants standard.add(new Offer(new ItemStack(Blocks.sapling, 1, 3), Requirement.STEEL, 12, 9)); standard.add(new Offer(new ItemStack(ModBlocks.plant_flower, 1, EnumFlowerType.FOXGLOVE.ordinal()), Requirement.STEEL, 16, 5)); diff --git a/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java b/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java new file mode 100644 index 000000000..b6fba216b --- /dev/null +++ b/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java @@ -0,0 +1,313 @@ +package com.hbm.handler; + +import com.hbm.entity.grenade.EntityGrenadeASchrab; +import com.hbm.entity.grenade.EntityGrenadeBlackHole; +import com.hbm.entity.grenade.EntityGrenadeBreach; +import com.hbm.entity.grenade.EntityGrenadeBurst; +import com.hbm.entity.grenade.EntityGrenadeCloud; +import com.hbm.entity.grenade.EntityGrenadeCluster; +import com.hbm.entity.grenade.EntityGrenadeDynamite; +import com.hbm.entity.grenade.EntityGrenadeElectric; +import com.hbm.entity.grenade.EntityGrenadeFire; +import com.hbm.entity.grenade.EntityGrenadeFlare; +import com.hbm.entity.grenade.EntityGrenadeFrag; +import com.hbm.entity.grenade.EntityGrenadeGas; +import com.hbm.entity.grenade.EntityGrenadeGascan; +import com.hbm.entity.grenade.EntityGrenadeGeneric; +import com.hbm.entity.grenade.EntityGrenadeIFBouncy; +import com.hbm.entity.grenade.EntityGrenadeIFBrimstone; +import com.hbm.entity.grenade.EntityGrenadeIFConcussion; +import com.hbm.entity.grenade.EntityGrenadeIFGeneric; +import com.hbm.entity.grenade.EntityGrenadeIFHE; +import com.hbm.entity.grenade.EntityGrenadeIFHopwire; +import com.hbm.entity.grenade.EntityGrenadeIFImpact; +import com.hbm.entity.grenade.EntityGrenadeIFIncendiary; +import com.hbm.entity.grenade.EntityGrenadeIFMystery; +import com.hbm.entity.grenade.EntityGrenadeIFNull; +import com.hbm.entity.grenade.EntityGrenadeIFSpark; +import com.hbm.entity.grenade.EntityGrenadeIFSticky; +import com.hbm.entity.grenade.EntityGrenadeIFToxic; +import com.hbm.entity.grenade.EntityGrenadeImpactGeneric; +import com.hbm.entity.grenade.EntityGrenadeLemon; +import com.hbm.entity.grenade.EntityGrenadeMIRV; +import com.hbm.entity.grenade.EntityGrenadeMk2; +import com.hbm.entity.grenade.EntityGrenadeNuclear; +import com.hbm.entity.grenade.EntityGrenadeNuke; +import com.hbm.entity.grenade.EntityGrenadePC; +import com.hbm.entity.grenade.EntityGrenadePlasma; +import com.hbm.entity.grenade.EntityGrenadePoison; +import com.hbm.entity.grenade.EntityGrenadePulse; +import com.hbm.entity.grenade.EntityGrenadeSchrabidium; +import com.hbm.entity.grenade.EntityGrenadeShrapnel; +import com.hbm.entity.grenade.EntityGrenadeSmart; +import com.hbm.entity.grenade.EntityGrenadeStrong; +import com.hbm.entity.grenade.EntityGrenadeTau; +import com.hbm.entity.grenade.EntityGrenadeZOMG; +import com.hbm.entity.grenade.EntityWastePearl; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemFertilizer; +import com.hbm.items.weapon.ItemGenericGrenade; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.BehaviorProjectileDispense; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.IProjectile; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class DispenserBehaviorHandler { + + public static void init() { + + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_generic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGeneric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_strong, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeStrong(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_frag, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFrag(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_fire, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFire(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cluster, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeCluster(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_flare, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFlare(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_electric, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeElectric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_poison, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePoison(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gas, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGas(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_schrabidium, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeSchrabidium(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuke, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeNuke(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuclear, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeNuclear(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pulse, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePulse(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_plasma, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePlasma(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_tau, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeTau(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_lemon, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeLemon(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mk2, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeMk2(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_aschrab, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeASchrab(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_zomg, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeZOMG(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_shrapnel, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeShrapnel(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_black_hole, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBlackHole(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gascan, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGascan(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cloud, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeCloud(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pink_cloud, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePC(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_smart, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeSmart(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mirv, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeMIRV(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_breach, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBreach(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_burst, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBurst(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_generic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFGeneric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_he, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFHE(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_bouncy, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFBouncy(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_sticky, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFSticky(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_impact, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFImpact(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_incendiary, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFIncendiary(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_toxic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFToxic(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_concussion, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFConcussion(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_brimstone, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFBrimstone(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_mystery, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFMystery(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_spark, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFSpark(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_hopwire, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFHopwire(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_null, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFNull(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.nuclear_waste_pearl, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityWastePearl(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeDynamite(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_kyiv, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.grenade_kyiv); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite_fishing, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.stick_dynamite_fishing); + } + }); + + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.powder_fertilizer, new BehaviorDefaultDispenseItem() { + + private boolean dispenseSound = true; + @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { + + EnumFacing facing = BlockDispenser.func_149937_b(source.getBlockMetadata()); + World world = source.getWorld(); + int x = source.getXInt() + facing.getFrontOffsetX(); + int y = source.getYInt() + facing.getFrontOffsetY(); + int z = source.getZInt() + facing.getFrontOffsetZ(); + this.dispenseSound = ItemFertilizer.useFertillizer(stack, world, x, y, z); + return stack; + } + @Override protected void playDispenseSound(IBlockSource source) { + if(this.dispenseSound) { + source.getWorld().playAuxSFX(1000, source.getXInt(), source.getYInt(), source.getZInt(), 0); + } else { + source.getWorld().playAuxSFX(1001, source.getXInt(), source.getYInt(), source.getZInt(), 0); + } + } + }); + } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index b182de6f7..b5f8b7af2 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5425)"; + public static final String VERSION = "1.0.27 BETA (5426)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 370772b1d..ef36a2084 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -145,6 +145,8 @@ public class ClientProxy extends ServerProxy { @Override public void registerPreRenderInfo() { AdvancedModelLoader.registerModelHandler(new HmfModelLoader()); + + QMAWLoader.registerModFileURL(FMLCommonHandler.instance().findContainerFor(RefStrings.MODID).getSource()); } /** Runs right after item and block init */ diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index d8e10dac7..0db237afe 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -9,15 +9,11 @@ import com.hbm.config.*; import com.hbm.crafting.RodRecipes; import com.hbm.creativetabs.*; import com.hbm.entity.EntityMappings; -import com.hbm.entity.grenade.*; import com.hbm.entity.logic.IChunkLoader; import com.hbm.entity.mob.siege.SiegeTier; import com.hbm.handler.*; import com.hbm.handler.ae2.AE2CompatHandler; -import com.hbm.handler.imc.IMCBlastFurnace; -import com.hbm.handler.imc.IMCCentrifuge; -import com.hbm.handler.imc.IMCCrystallizer; -import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.imc.*; import com.hbm.handler.microblocks.MicroBlocksCompatHandler; import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; @@ -33,14 +29,11 @@ import com.hbm.inventory.recipes.anvil.AnvilRecipes; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumAchievementType; import com.hbm.items.ModItems; -import com.hbm.items.tool.ItemFertilizer; -import com.hbm.items.weapon.ItemGenericGrenade; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.HbmWorld; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.potion.HbmPotion; -import com.hbm.qmaw.QMAWLoader; import com.hbm.saveddata.satellites.Satellite; import com.hbm.tileentity.TileMappings; import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; @@ -64,13 +57,7 @@ import cpw.mods.fml.common.event.FMLMissingMappingsEvent.MissingMapping; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; -import net.minecraft.block.BlockDispenser; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.BehaviorProjectileDispense; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.dispenser.IPosition; -import net.minecraft.entity.IProjectile; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.Item.ToolMaterial; @@ -81,7 +68,6 @@ import net.minecraft.stats.StatBase; import net.minecraft.stats.StatBasic; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumFacing; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.AchievementPage; @@ -254,8 +240,6 @@ public class MainRegistry { @EventHandler public void PreLoad(FMLPreInitializationEvent PreEvent) { CrashHelper.init(); - - QMAWLoader.registerModFileURL(FMLCommonHandler.instance().findContainerFor(RefStrings.MODID).getSource()); startupTime = System.currentTimeMillis(); configDir = PreEvent.getModConfigurationDirectory(); @@ -373,299 +357,8 @@ public class MainRegistry { } } }); - - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_generic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGeneric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_strong, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeStrong(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_frag, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFrag(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_fire, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFire(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cluster, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeCluster(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_flare, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFlare(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_electric, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeElectric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_poison, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePoison(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gas, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGas(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_schrabidium, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeSchrabidium(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuke, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeNuke(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuclear, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeNuclear(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pulse, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePulse(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_plasma, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePlasma(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_tau, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeTau(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_lemon, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeLemon(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mk2, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeMk2(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_aschrab, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeASchrab(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_zomg, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeZOMG(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_shrapnel, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeShrapnel(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_black_hole, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBlackHole(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gascan, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGascan(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cloud, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeCloud(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pink_cloud, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePC(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_smart, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeSmart(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mirv, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeMIRV(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_breach, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBreach(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_burst, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBurst(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_generic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFGeneric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_he, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFHE(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_bouncy, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFBouncy(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_sticky, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFSticky(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_impact, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFImpact(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_incendiary, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFIncendiary(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_toxic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFToxic(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_concussion, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFConcussion(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_brimstone, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFBrimstone(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_mystery, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFMystery(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_spark, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFSpark(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_hopwire, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFHopwire(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_null, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFNull(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.nuclear_waste_pearl, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityWastePearl(world, position.getX(), position.getY(), position.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeDynamite(world, position.getX(), position.getY(), position.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_kyiv, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.grenade_kyiv); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite_fishing, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.stick_dynamite_fishing); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.powder_fertilizer, new BehaviorDefaultDispenseItem() { - - private boolean dispenseSound = true; - @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { - - EnumFacing facing = BlockDispenser.func_149937_b(source.getBlockMetadata()); - World world = source.getWorld(); - int x = source.getXInt() + facing.getFrontOffsetX(); - int y = source.getYInt() + facing.getFrontOffsetY(); - int z = source.getZInt() + facing.getFrontOffsetZ(); - this.dispenseSound = ItemFertilizer.useFertillizer(stack, world, x, y, z); - return stack; - } - @Override protected void playDispenseSound(IBlockSource source) { - if(this.dispenseSound) { - source.getWorld().playAuxSFX(1000, source.getXInt(), source.getYInt(), source.getZInt(), 0); - } else { - source.getWorld().playAuxSFX(1001, source.getXInt(), source.getYInt(), source.getZInt(), 0); - } - } - }); - + + DispenserBehaviorHandler.init(); MicroBlocksCompatHandler.preInit(); } From 037af08963a363ee7bb2a29d2a560ec1f1b9ce3b Mon Sep 17 00:00:00 2001 From: CrpBnrz <2032217625@qq.com> Date: Tue, 19 Aug 2025 08:15:49 +0800 Subject: [PATCH 246/323] Fix formatted strings --- src/main/resources/assets/hbm/lang/zh_CN.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index eb7c5f99b..b781ed31c 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -2120,7 +2120,7 @@ item.canned_napalm.name=凝固汽油罐头 item.canned_napalm.desc=我喜欢早上闻着老梗的味道! item.canned_oil.name=机油罐头 item.canned_oil.desc=它既然能让发动机运转的更流畅,那为什么不能用在人类身上? -item.canned_pashtet.name=牛排罐头 +item.canned_pashtet.name=俄式肝酱罐头 item.canned_pashtet.desc=翻译服务不可用блядь! item.canned_pizza.name=意大利香肠比萨罐头 item.canned_pizza.desc=反人类罪 @@ -6140,4 +6140,4 @@ tile.machine_purex.desc=可用于多种核燃料的再处理机器。$大多数 qmaw.tab=[按 %s 键获取帮助] commands.locate.no_match=没有具有此名称的结构! commands.locate.none_found=未在附近找到结构! -commands.locate.success.coordinates=在 %d, %d 处找到结构 %s +commands.locate.success.coordinates=在 %2$d, %3$d 处找到结构 %1$s From e1d66c93a187692f87d363ea265a5c85b3e3d74f Mon Sep 17 00:00:00 2001 From: RealSilverMoon Date: Tue, 19 Aug 2025 16:23:56 +0800 Subject: [PATCH 247/323] i18n for RBMK DODD --- .../machine/rbmk/TileEntityRBMKBase.java | 14 ++++-- .../machine/rbmk/TileEntityRBMKRod.java | 6 ++- src/main/resources/assets/hbm/lang/en_US.lang | 47 +++++++++++++++++++ src/main/resources/assets/hbm/lang/zh_CN.lang | 47 +++++++++++++++++++ 4 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 219838228..94e666af3 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -156,7 +156,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { * Moves heat to neighboring parts, if possible, in a relatively fair manner */ private void moveHeat() { - + boolean reasim = RBMKDials.getReasimBoilers(worldObj); List rec = new ArrayList<>(); @@ -344,6 +344,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { exceptions.add("id"); exceptions.add("muffled"); + //Keep the title unlocalized is cool. String title = "Dump of Ordered Data Diagnostic (DODD)"; mc.fontRenderer.drawString(title, pX + 1, pZ - 19, 0x006000); mc.fontRenderer.drawString(title, pX, pZ - 20, 0x00FF00); @@ -359,8 +360,15 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { if(exceptions.contains(key)) continue; - - mc.fontRenderer.drawString(key + ": " + flush.getTag(key), pX, pZ, 0xFFFFFF); + String value = flush.getTag(key).toString(); + //No...’d‘ doesn't refer to "day" and ‘s’ doesn't refer to "second". Meaningless. + if (!value.isEmpty()) { + char lastChar = value.charAt(value.length() - 1); + if (lastChar == 'd' || lastChar == 's' || lastChar == 'b') { + value = value.substring(0, value.length() - 1); + } + } + mc.fontRenderer.drawString(I18nUtil.resolveKey("tile.rbmk.dodd." + key) + ": " + value, pX, pZ, 0xFFFFFF); pZ += 10; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 92b5ecfe2..8dc07b42d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -264,8 +264,10 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); BufferUtil.writeString(buf, ItemRBMKRod.getYield(slots[0]) + " / " + rod.yield + " (" + (ItemRBMKRod.getEnrichment(slots[0]) * 100) + "%)"); BufferUtil.writeString(buf, ItemRBMKRod.getPoison(slots[0]) + "%"); - BufferUtil.writeString(buf, ItemRBMKRod.getCoreHeat(slots[0]) + " / " + ItemRBMKRod.getHullHeat(slots[0]) + " / " + rod.meltingPoint); - } + //Heat is too long! Reduce it to 6 numbers is enough. + BufferUtil.writeString(buf, String.format("%.6f", ItemRBMKRod.getCoreHeat(slots[0])) + + " / " + String.format("%.6f", ItemRBMKRod.getHullHeat(slots[0])) + + " / " + String.format("%.2f", rod.meltingPoint)); } } @Override diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e772302f4..22f6475e7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5931,6 +5931,53 @@ tile.rbmk_steam_inlet.desc=Inserts water into RBMK columns if ReaSim boilers are tile.rbmk_steam_outlet.name=RBMK ReaSim Steam Outlet tile.rbmk_steam_outlet.desc=Extracts super dense steam from RBMK columns if ReaSim boilers are enabled$Connects to RBMK columns sideways tile.rbmk_storage.name=RBMK Storage Column +tile.rbmk.dodd.heat=Heat +tile.rbmk.dodd.reasimWater=ReaSim Water +tile.rbmk.dodd.reasimSteam=ReaSim Steam +tile.rbmk.dodd.level=Level +tile.rbmk.dodd.targetLevel=Target Level +tile.rbmk.dodd.startingLevel=Starting Level +tile.rbmk.dodd.mult=Mult +tile.rbmk.dodd.color=Color +tile.rbmk.dodd.levelLower=Level Lower +tile.rbmk.dodd.levelUpper=Level Upper +tile.rbmk.dodd.heatLower=Heat Lower +tile.rbmk.dodd.heatUpper=Heat Upper +tile.rbmk.dodd.function=Function +tile.rbmk.dodd.fluxSlow=Flux Slow +tile.rbmk.dodd.fluxFast=Flux Fast +tile.rbmk.dodd.hasRod=Has Rod +tile.rbmk.dodd.progress=Progress +tile.rbmk.dodd.gas=Gas +tile.rbmk.dodd.cooled=Cooled +tile.rbmk.dodd.burned=Burned +tile.rbmk.dodd.feed=Feed +tile.rbmk.dodd.steam=Steam +tile.rbmk.dodd.cryo=Cryo +tile.rbmk.dodd.fuel=Fuel +tile.rbmk.dodd.f_heat=heat +tile.rbmk.dodd.f_xenon=xenon +tile.rbmk.dodd.f_yield=yield +tile.rbmk.dodd.feed_type=Feed Type(ID) +tile.rbmk.dodd.steam_type=Steam Type(ID) +tile.rbmk.dodd.cryo_type=Cryo Type(ID) +tile.rbmk.dodd.gas_type=Gas Type(ID) +tile.rbmk.dodd.fuel_type=Fuel Type(ID) +tile.rbmk.dodd.feed_p=Feed Pressure +tile.rbmk.dodd.steam_p=Steam Pressure +tile.rbmk.dodd.cryo_p=Cryo Pressure +tile.rbmk.dodd.gas_p=Gas Pressure +tile.rbmk.dodd.fuel_p=Fuel Pressure +tile.rbmk.dodd.feed_max=Feed Max Amount +tile.rbmk.dodd.steam_max=Steam Max Amount +tile.rbmk.dodd.cryo_max=Cryo Max Amount +tile.rbmk.dodd.gas_max=Gas Max Amount +tile.rbmk.dodd.fuel_max=Fuel Max Amount +tile.rbmk.dodd.feed_amt=Feed Amount +tile.rbmk.dodd.steam_amt=Steam Amount +tile.rbmk.dodd.cryo_amt=Cryo Amount +tile.rbmk.dodd.gas_amt=Gas Amount +tile.rbmk.dodd.fuel_amt=Fuel Amount tile.reactor_computer.name=Reactor Control tile.reactor_conductor.name=Reactor Boiler tile.reactor_control.name=Control Rods diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index c220e14b9..377cd73b9 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -5566,6 +5566,53 @@ tile.rbmk_steam_inlet.desc=当启用ReaSim锅炉时向反应堆内输入水$从 tile.rbmk_steam_outlet.name=RBMK ReaSim蒸汽出口 tile.rbmk_steam_outlet.desc=当启用ReaSim锅炉时从反应堆内输出超热蒸汽$从侧面连接至反应堆结构 tile.rbmk_storage.name=RBMK燃料棒存储棒 +tile.rbmk.dodd.heat=温度 +tile.rbmk.dodd.reasimWater=ReaSim给水量 +tile.rbmk.dodd.reasimSteam=ReaSim蒸汽量 +tile.rbmk.dodd.level=控制棒深度 +tile.rbmk.dodd.targetLevel=目标深度 +tile.rbmk.dodd.startingLevel=起始深度 +tile.rbmk.dodd.mult=倍数 +tile.rbmk.dodd.color=颜色 +tile.rbmk.dodd.levelLower=深度下限 +tile.rbmk.dodd.levelUpper=深度上限 +tile.rbmk.dodd.heatLower=温度下限 +tile.rbmk.dodd.heatUpper=温度上限 +tile.rbmk.dodd.function=函数类型 +tile.rbmk.dodd.fluxSlow=慢中子计数 +tile.rbmk.dodd.fluxFast=快中子计数 +tile.rbmk.dodd.hasRod=是否有燃料棒 +tile.rbmk.dodd.progress=进度 +tile.rbmk.dodd.cooled=冷却中 +tile.rbmk.dodd.burned=燃烧中 +tile.rbmk.dodd.f_heat=燃料棒温度 +tile.rbmk.dodd.f_xenon=氙中毒指数 +tile.rbmk.dodd.f_yield=耐久 +tile.rbmk.dodd.gas=气体 +tile.rbmk.dodd.feed=工质储量 +tile.rbmk.dodd.steam=蒸汽储量 +tile.rbmk.dodd.cryo=凝胶储量 +tile.rbmk.dodd.fuel=燃料储量 +tile.rbmk.dodd.feed_type=工质种类(ID) +tile.rbmk.dodd.steam_type=蒸汽种类(ID) +tile.rbmk.dodd.cryo_type=凝胶种类(ID) +tile.rbmk.dodd.gas_type=气体种类(ID) +tile.rbmk.dodd.fuel_type=燃料种类(ID) +tile.rbmk.dodd.feed_p=工质压力 +tile.rbmk.dodd.steam_p=蒸汽压力 +tile.rbmk.dodd.cryo_p=凝胶压力 +tile.rbmk.dodd.gas_p=气体压力 +tile.rbmk.dodd.fuel_p=燃料压力 +tile.rbmk.dodd.feed_max=工质最大储量 +tile.rbmk.dodd.steam_max=蒸汽最大储量 +tile.rbmk.dodd.cryo_max=凝胶最大储量 +tile.rbmk.dodd.gas_max=气体最大储量 +tile.rbmk.dodd.fuel_max=燃料最大储量 +tile.rbmk.dodd.feed_amt=工质储量 +tile.rbmk.dodd.steam_amt=蒸汽储量 +tile.rbmk.dodd.cryo_amt=凝胶储量 +tile.rbmk.dodd.gas_amt=气体储量 +tile.rbmk.dodd.fuel_amt=燃料储量 tile.reactor_computer.name=反应堆控制器 tile.reactor_conductor.name=反应堆锅炉 tile.reactor_control.name=控制棒 From 525169743cc27f7f8bb81c537016a66c3fb2cf1d Mon Sep 17 00:00:00 2001 From: CrpBnrz <2032217625@qq.com> Date: Wed, 20 Aug 2025 21:28:56 +0800 Subject: [PATCH 248/323] QMAW localization from Tokiko --- src/main/resources/assets/hbm/manual/material/alloy.json | 6 ++++-- .../resources/assets/hbm/manual/material/aluminium.json | 6 ++++-- src/main/resources/assets/hbm/manual/material/arsenic.json | 6 ++++-- .../assets/hbm/manual/material/arsenic_bronze.json | 6 ++++-- src/main/resources/assets/hbm/manual/material/bakelite.json | 3 ++- src/main/resources/assets/hbm/manual/material/bismuth.json | 3 ++- .../assets/hbm/manual/material/bismuth_bronze.json | 3 ++- src/main/resources/assets/hbm/manual/material/bscco.json | 3 ++- src/main/resources/assets/hbm/manual/material/cadmium.json | 3 ++- .../resources/assets/hbm/manual/material/cadmium_steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/cinnabar.json | 3 ++- src/main/resources/assets/hbm/manual/material/coke.json | 3 ++- src/main/resources/assets/hbm/manual/material/copper.json | 3 ++- src/main/resources/assets/hbm/manual/material/desh.json | 3 ++- .../resources/assets/hbm/manual/material/ferrouranium.json | 3 ++- src/main/resources/assets/hbm/manual/material/graphite.json | 3 ++- src/main/resources/assets/hbm/manual/material/gunmetal.json | 3 ++- src/main/resources/assets/hbm/manual/material/hss.json | 3 ++- src/main/resources/assets/hbm/manual/material/latex.json | 3 ++- src/main/resources/assets/hbm/manual/material/lead.json | 3 ++- src/main/resources/assets/hbm/manual/material/mingrade.json | 3 ++- .../resources/assets/hbm/manual/material/neptunium.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-238.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-239.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-240.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-241.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-rg.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium.json | 3 ++- src/main/resources/assets/hbm/manual/material/polonium.json | 3 ++- src/main/resources/assets/hbm/manual/material/polymer.json | 3 ++- src/main/resources/assets/hbm/manual/material/radium.json | 3 ++- src/main/resources/assets/hbm/manual/material/rubber.json | 3 ++- src/main/resources/assets/hbm/manual/material/silicon.json | 3 ++- src/main/resources/assets/hbm/manual/material/sodium.json | 3 ++- src/main/resources/assets/hbm/manual/material/steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/sulfur.json | 3 ++- .../resources/assets/hbm/manual/material/tantalium.json | 3 ++- .../resources/assets/hbm/manual/material/technetium.json | 3 ++- .../assets/hbm/manual/material/technetium_steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/thorium.json | 3 ++- .../resources/assets/hbm/manual/material/uranium-233.json | 3 ++- .../resources/assets/hbm/manual/material/uranium-235.json | 3 ++- .../resources/assets/hbm/manual/material/uranium-238.json | 6 ++++-- src/main/resources/assets/hbm/manual/material/uranium.json | 3 ++- .../resources/assets/hbm/manual/material/weaponsteel.json | 6 ++++-- 45 files changed, 102 insertions(+), 51 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index 03ef80a7a..457f465a7 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], "title": { "en_US": "Advanced Alloy", - "ru_ru": "Продвинутый сплав" + "ru_ru": "Продвинутый сплав", + "zh_CN": "高级合金" }, "content": { "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", - "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]]." + "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]].", + "zh_CN": "在[[高炉|Blast Furnace]]中使用[[钢|Steel]]和[[紫铜|Minecraft Grade Copper]]制成。其制成的工具比钻石更加优质。同时也能用于制作[[聚变反应堆|Fusion Reactor]]和[[辐照舱|Exposure Chamber]]的高能磁铁。" } } diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 8bdf151bc..078893082 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], "title": { "en_US": "Aluminium", - "ru_RU": "Алюминий" + "ru_RU": "Алюминий", + "zh_CN": "铝" }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", - "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." + "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет.", + "zh_CN": "常见的轻质金属,在早期可使用[[复式炼焦炉|Combination Oven]]冶炼冰晶石(含铝矿石)来得到铝。后期可通过加工[[铝土矿|Bauxite]],后使用[[电解机|Electrolysis Machine]]处理氧化铝溶液得到。

用于制作管道,一般流体储存,制作[[炮铜|Gunmetal]]和导弹弹体。" } } diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index d54f92d25..5d8559a49 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], "title": { "en_US": "Arsenic", - "ru_RU": "Мышьяк" + "ru_RU": "Мышьяк", + "zh_CN": "砷" }, "content": { "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", - "ru_RU": "Получается путём обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]]." + "ru_RU": "Получается путём обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]].", + "zh_CN": "可通过在[[酸化机|Ore Acidizer]]中使用[[高性能溶剂|High-Performance Solvent]]处理油性废料获得。油性废料可在[[粉碎机|Shredder]]中粉碎[[水力压裂塔|Hydraulic Fracking Tower]]产生的污染方块获得。主要用于制作[[砷青铜|Arsenic Bronze]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index d53db5d12..a3feacd14 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_arsenic_bronze"]], "title": { "en_US": "Arsenic Bronze", - "ru_RU": "Мышьяковая бронза" + "ru_RU": "Мышьяковая бронза", + "zh_CN": "砷青铜" }, "content": { "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", - "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]]." + "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]].", + "zh_CN": "使用[[砷|Arsenic]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造了[[RBMK]]之后才能获得,因为提取砷需要用到[[高性能溶剂|High-Performance Solvent]]。

和[[铋青铜|Bismuth Bronze]]完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index d5d232149..27da9b801 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], "title": { "en_US": "Bakelite", - "ru_RU": "Бакелит" + "ru_RU": "Бакелит", + "zh_CN": "电木" }, "content": { "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 9b3105586..4ac2846b0 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], "title": { "en_US": "Bismuth", - "ru_RU": "Висмут" + "ru_RU": "Висмут", + "zh_CN": "铋" }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index 07167ba3d..e583f359b 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_bismuth_bronze"]], "title": { "en_US": "Bismuth Bronze", - "ru_RU": "Висмутовая бронза" + "ru_RU": "Висмутовая бронза", + "zh_CN": "铋青铜" }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index a341b55af..941023847 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], "title": { "en_US": "BSCCO", - "ru_RU": "BSCCO" + "ru_RU": "BSCCO", + "zh_CN": "BSCCO" }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 0de201080..2cd72905f 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], "title": { "en_US": "Cadmium", - "ru_RU": "Кадмий" + "ru_RU": "Кадмий", + "zh_CN": "镉" }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index 48ce8d495..2cdcf5bd6 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_cdalloy"]], "title": { "en_US": "Cadmium Steel", - "ru_RU": "Кадмиевая сталь" + "ru_RU": "Кадмиевая сталь", + "zh_CN": "镉钢" }, "content": { "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index bb721bf6f..959b7780e 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.cinnebar"]], "title": { "en_US": "Cinnabar", - "ru_RU": "Киноварь" + "ru_RU": "Киноварь", + "zh_CN": "朱砂" }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index 234ab7588..72dfa40b6 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.coke", 1, 32767]], "title": { "en_US": "Coke", - "ru_RU": "Кокс" + "ru_RU": "Кокс", + "zh_CN": "焦炭" }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index e8e155732..c81e68332 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], "title": { "en_US": "Copper", - "ru_RU": "Медь" + "ru_RU": "Медь", + "zh_CN": "铜" }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index a34e741c7..255772f18 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], "title": { "en_US": "Desh", - "ru_RU": "Деш" + "ru_RU": "Деш", + "zh_CN": "Desh" }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 687434042..9d6c3efcc 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_ferrouranium"]], "title": { "en_US": "Ferrouranium", - "ru_RU": "Ферроуран" + "ru_RU": "Ферроуран", + "zh_CN": "铀铁合金" }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 1876c53fa..7ea9d69a8 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_graphite"]], "title": { "en_US": "Graphite", - "ru_RU": "Графит" + "ru_RU": "Графит", + "zh_CN": "石墨" }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index f5d89a0b1..b7c339dcc 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], "title": { "en_US": "Gunmetal", - "ru_RU": "Оружейный металл" + "ru_RU": "Оружейный металл", + "zh_CN": "炮铜" }, "content": { "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index 26380d6c5..ebc3d25a2 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], "title": { "en_US": "High-Speed Steel", - "ru_RU": "Высокоскоростная сталь" + "ru_RU": "Высокоскоростная сталь", + "zh_CN": "高速钢" }, "content": { "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index b5795bd32..73a7d88ce 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], "title": { "en_US": "Latex", - "ru_RU": "Латекс" + "ru_RU": "Латекс", + "zh_CN": "乳胶" }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index b4d919e1a..1232d2f1d 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], "title": { "en_US": "Lead", - "ru_RU": "Свинец" + "ru_RU": "Свинец", + "zh_CN": "铅" }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index fe1732da5..f231f2b4b 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { "en_US": "Minecraft Grade Copper (Red Copper)", - "ru_RU": "Медь Minecraft (Красная медь)" + "ru_RU": "Медь Minecraft (Красная медь)", + "zh_CN": "紫铜" }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index a68c7adb9..adb08aa9b 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], "title": { "en_US": "Neptunium", - "ru_RU": "Нептуний" + "ru_RU": "Нептуний", + "zh_CN": "镎" }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index d770353f4..7e8406d2e 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], "title": { "en_US": "Plutonium-238", - "ru_RU": "Плутоний-238" + "ru_RU": "Плутоний-238", + "zh_CN": "钚-238" }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index f64b725f8..6c893050f 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], "title": { "en_US": "Plutonium-239", - "ru_RU": "Плутоний-239" + "ru_RU": "Плутоний-239", + "zh_CN": "钚-239" }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 859bfd7c0..c14ae8f38 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], "title": { "en_US": "Plutonium-240", - "ru_RU": "Плутоний-240" + "ru_RU": "Плутоний-240", + "zh_CN": "钚-240" }, "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 096b8864c..79df83f71 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], "title": { "en_US": "Plutonium-241", - "ru_RU": "Плутоний-241" + "ru_RU": "Плутоний-241", + "zh_CN": "钚-241" }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index c5cb2f1a4..664af5785 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], "title": { "en_US": "Reactor-Grade Plutonium", - "ru_RU": "Плутоний реакторного качества" + "ru_RU": "Плутоний реакторного качества", + "zh_CN": "反应堆级钚" }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 719c14800..72a9c21ad 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], "title": { "en_US": "Plutonium", - "ru_RU": "Плутоний" + "ru_RU": "Плутоний", + "zh_CN": "钚" }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index c36e74218..07f59e7d9 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], "title": { "en_US": "Polonium-210", - "ru_RU": "Полоний-210" + "ru_RU": "Полоний-210", + "zh_CN": "钋-210" }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 9c540925b..42f8dda92 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], "title": { "en_US": "Polymer", - "ru_RU": "Полимер" + "ru_RU": "Полимер", + "zh_CN": "聚合物" }, "content": { "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 331d37adc..8e77e9563 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], "title": { "en_US": "Radium-226", - "ru_RU": "Радий-226" + "ru_RU": "Радий-226", + "zh_CN": "镭-226" }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index e317d6752..6329a6f39 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_rubber"]], "title": { "en_US": "Rubber", - "ru_RU": "Резина" + "ru_RU": "Резина", + "zh_CN": "橡胶" }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 67951240c..57a2298ed 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], "title": { "en_US": "Silicon", - "ru_RU": "Кремний" + "ru_RU": "Кремний", + "zh_CN": "硅" }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 6ad6ac6f7..0a42d0063 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.powder_sodium"]], "title": { "en_US": "Sodium", - "ru_RU": "Натрий" + "ru_RU": "Натрий", + "zh_CN": "钠" }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index 83c6f8867..1fcaba283 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], "title": { "en_US": "Steel", - "ru_RU": "Сталь" + "ru_RU": "Сталь", + "zh_CN": "钢" }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 7d9b5915b..6b758020d 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.sulfur"]], "title": { "en_US": "Sulfur", - "ru_RU": "Сера" + "ru_RU": "Сера", + "zh_CN": "硫" }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index e3d0ee9c2..248b0414e 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], "title": { "en_US": "Tantalium", - "ru_RU": "Тантал" + "ru_RU": "Тантал", + "zh_CN": "钛" }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 5eaef724f..c1228b425 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], "title": { "en_US": "Technetium", - "ru_RU": "Технеций" + "ru_RU": "Технеций", + "zh_CN": "锝" }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index ac31ac861..13e14ae80 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], "title": { "en_US": "Technetium Steel", - "ru_RU": "Технециевая сталь" + "ru_RU": "Технециевая сталь", + "zh_CN": "锝钢" }, "content": { "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index be512e7cc..da6ff95c0 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], "title": { "en_US": "Thorium-232", - "ru_RU": "Торий-232" + "ru_RU": "Торий-232", + "zh_CN": "钍-232" }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index d1802f419..a87552a1d 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], "title": { "en_US": "Uranium-233", - "ru_RU": "Уран-233" + "ru_RU": "Уран-233", + "zh_CN": "铀-233" }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 56b101d67..3c6e4d4ae 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], "title": { "en_US": "Uranium-235", - "ru_RU": "Уран-235" + "ru_RU": "Уран-235", + "zh_CN": "铀-235" }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index ca87770e1..9f6474a37 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], "title": { "en_US": "Uranium-238", - "ru_RU": "Уран-238" + "ru_RU": "Уран-238", + "zh_CN": "铀-238" }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", - "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." + "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен.", + "zh_CN": "贫铀,不能作为燃料(即无法直接被反应堆使用)。通常作为[[铀|Uranium]]浓缩过程中的副产品。用于制造[[铀铁合金|Ferrouranium]],[[贫铀弹药|Depleted Uranium Ammo]]和低浓缩度燃料。含有铀-238的燃料在再处理时会产生有用的[[钚-239|Plutonium-239]]。

略有放射性。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index 89ab05f6b..8f18b8df7 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -4,7 +4,8 @@ "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], "title": { "en_US": "Uranium", - "ru_RU": "Уран" + "ru_RU": "Уран", + "zh_CN": "铀" }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index 52e5c11ed..06a8f4f55 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], "title": { "en_US": "Weapon Steel", - "ru_RU": "Оружейная сталь" + "ru_RU": "Оружейная сталь", + "zh_CN": "武器级钢" }, "content": { "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", - "ru_RU": "Высококачественная версия [[стали|Steel]], изготовленная в [[роторной печи|Rotary Furnace]]. Требует [[коксовый газ|Coker Gas]] и, следовательно, [[коксовую установку|Coker Unit]]. Используется во многих оружиях среднего этапа игры, модификациях оружия и боеголовках ракет." + "ru_RU": "Высококачественная версия [[стали|Steel]], изготовленная в [[роторной печи|Rotary Furnace]]. Требует [[коксовый газ|Coker Gas]] и, следовательно, [[коксовую установку|Coker Unit]]. Используется во многих оружиях среднего этапа игры, модификациях оружия и боеголовках ракет.", + "zh_CN": "在[[回转炉|Rotary Furnace]]中制作的高纯度[[钢|Steel]]。需要[[焦化气|Coker Gas]],焦化气则需要[[焦化装置|Coker Unit]]来制作。用于游戏中期的武器制作和改装以及导弹弹头的制作。" } } From b4b471e5c3f5ccf8b01a3f6a5f97e89976c9d190 Mon Sep 17 00:00:00 2001 From: FOlkvangrField Date: Wed, 20 Aug 2025 21:46:59 +0800 Subject: [PATCH 249/323] Fix --- .../hbm/config/CustomMachineConfigJSON.java | 25 ++-- .../java/com/hbm/inventory/fluid/Fluids.java | 21 ++-- src/main/java/com/hbm/qmaw/GuiQMAW.java | 114 +++++++++--------- src/main/java/com/hbm/qmaw/QMAWLoader.java | 66 +++++----- 4 files changed, 112 insertions(+), 114 deletions(-) diff --git a/src/main/java/com/hbm/config/CustomMachineConfigJSON.java b/src/main/java/com/hbm/config/CustomMachineConfigJSON.java index 87c67dfd3..7d67aba78 100644 --- a/src/main/java/com/hbm/config/CustomMachineConfigJSON.java +++ b/src/main/java/com/hbm/config/CustomMachineConfigJSON.java @@ -1,9 +1,8 @@ package com.hbm.config; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -148,7 +147,7 @@ public class CustomMachineConfigJSON { public static void readConfig(File config) { try { - JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class); + JsonObject json = gson.fromJson(new InputStreamReader(Files.newInputStream(config.toPath()), StandardCharsets.UTF_8), JsonObject.class); JsonArray machines = json.get("machines").getAsJsonArray(); for(int i = 0; i < machines.size(); i++) { @@ -182,32 +181,32 @@ public class CustomMachineConfigJSON { try { JsonArray recipeShape = machineObject.get("recipeShape").getAsJsonArray(); JsonArray recipeParts = machineObject.get("recipeParts").getAsJsonArray(); - + Object[] parts = new Object[recipeShape.size() + recipeParts.size()]; - + for(int j = 0; j < recipeShape.size(); j++) { parts[j] = recipeShape.get(j).getAsString(); } - + for(int j = 0; j < recipeParts.size(); j++) { Object o = null; - + if(j % 2 == 0) { o = recipeParts.get(j).getAsString().charAt(0); //god is dead and we killed him } else { AStack a = SerializableRecipe.readAStack(recipeParts.get(j).getAsJsonArray()); - + if(a instanceof ComparableStack) o = ((ComparableStack) a).toStack(); if(a instanceof OreDictStack) o = ((OreDictStack) a).name; } - + parts[j + recipeShape.size()] = o; } - + ItemStack stack = new ItemStack(ModBlocks.custom_machine, 1, i + 100); stack.stackTagCompound = new NBTTagCompound(); stack.stackTagCompound.setString("machineType", configuration.unlocalizedName); - + CraftingManager.addRecipeAuto(stack, parts); } catch(Exception ex) { MainRegistry.logger.error("Caught exception trying to parse core recipe for custom machine " + configuration.unlocalizedName); diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index b020867c4..3eb3f8886 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -1,9 +1,8 @@ package com.hbm.inventory.fluid; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,7 +34,7 @@ import net.minecraft.potion.PotionEffect; public class Fluids { public static final Gson gson = new Gson(); - + public static List additionalListeners = new ArrayList(); public static FluidType NONE; @@ -797,7 +796,7 @@ public class Fluids { private static void readCustomFluids(File file) { try { - JsonObject json = gson.fromJson(new FileReader(file), JsonObject.class); + JsonObject json = gson.fromJson(new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8), JsonObject.class); for(Entry entry : json.entrySet()) { @@ -879,12 +878,12 @@ public class Fluids { ex.printStackTrace(); } } - + public static void reloadFluids(){ File folder = MainRegistry.configHbmDir; File customTypes = new File(folder.getAbsolutePath() + File.separatorChar + "hbmFluidTypes.json"); if(!customTypes.exists()) initDefaultFluids(customTypes); - + for(FluidType type : customFluids){ idMapping.remove(type.getID()); registerOrder.remove(type); @@ -892,7 +891,7 @@ public class Fluids { metaOrder.remove(type); } customFluids.clear(); - + for(FluidType type : foreignFluids){ idMapping.remove(type.getID()); registerOrder.remove(type); @@ -900,7 +899,7 @@ public class Fluids { metaOrder.remove(type); } foreignFluids.clear(); - + readCustomFluids(customTypes); for(FluidType custom : customFluids) metaOrder.add(custom); File config = new File(MainRegistry.configHbmDir.getAbsolutePath() + File.separatorChar + "hbmFluidTraits.json"); @@ -911,7 +910,7 @@ public class Fluids { } else { readTraits(config); } - + for(IFluidRegisterListener listener : additionalListeners) listener.onFluidsLoad(); } private static void registerCalculatedFuel(FluidType type, double base, double combustMult, FuelGrade grade) { diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index c59834957..e98d4e476 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -23,7 +23,7 @@ import net.minecraft.util.ResourceLocation; public class GuiQMAW extends GuiScreen { protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png"); - + public String title; public String qmawID; public ItemStack icon; @@ -31,51 +31,51 @@ public class GuiQMAW extends GuiScreen { /** History for returning via button */ public List back = new ArrayList(); public List forward = new ArrayList(); - + protected int xSize = 340; protected int ySize = 224; protected int guiLeft; protected int guiTop; - + protected boolean isDragging = false; protected int scrollProgress = 0; protected int lastClickX = 0; protected int lastClickY = 0; - + public static final String EN_US = "en_US"; - + public GuiQMAW(QuickManualAndWiki qmaw) { qmawID = qmaw.name; parseQMAW(qmaw); } - + protected void parseQMAW(QuickManualAndWiki qmaw) { LanguageManager lang = Minecraft.getMinecraft().getLanguageManager(); - - this.title = qmaw.title.get(lang.getCurrentLanguage()); + + this.title = qmaw.title.get(lang.getCurrentLanguage().getLanguageCode()); if(title == null) this.title = qmaw.title.get(EN_US); if(title == null) this.title = "Missing Localization!"; - + this.icon = qmaw.icon; - - String toParse = qmaw.contents.get(lang.getCurrentLanguage()); + + String toParse = qmaw.contents.get(lang.getCurrentLanguage().getLanguageCode()); if(toParse == null) toParse = qmaw.contents.get(EN_US); if(toParse == null) toParse = "Missing Localization!"; toParse = "" + toParse; // strings are reference types, no? - + int maxLineLength = xSize - 29; String prevToParse = "" + toParse; int maxIterations = 1000; int currentLineWidth = 0; - + while(!toParse.isEmpty() && maxIterations > 0) { if(this.lines.isEmpty()) this.lines.add(new ArrayList()); List currentLine = this.lines.get(this.lines.size() - 1); - + toParse = toParse.trim(); - + maxIterations--; - + if(toParse.startsWith("
")) { toParse = toParse.substring(4); currentLine = new ArrayList(); @@ -83,25 +83,25 @@ public class GuiQMAW extends GuiScreen { currentLineWidth = 0; continue; } - + // handle links if(toParse.startsWith("[[")) { int end = toParse.indexOf("]]"); if(end != -1) { String link = toParse.substring(2, end); toParse = toParse.substring(end + 2); - + int pipe = link.indexOf("|"); QComponentLink linkComponent; - + String suffix = toParse.startsWith(" ") ? " " : ""; - + if(pipe == -1) { linkComponent = new QComponentLink(link, link + suffix); } else { linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe) + suffix); } - + // append to current line int width = linkComponent.getWidth(); if(width + currentLineWidth <= maxLineLength) { @@ -119,21 +119,21 @@ public class GuiQMAW extends GuiScreen { continue; } } - + // handle standard text int delimit = toParse.length(); - + int spaceIndex = toParse.indexOf(" "); if(spaceIndex != -1) delimit = Math.min(delimit, spaceIndex); int linkIndex = toParse.indexOf("[["); if(linkIndex != -1) delimit = Math.min(delimit, linkIndex); int brIndex = toParse.indexOf("
"); if(brIndex != -1) delimit = Math.min(delimit, brIndex); - + if(delimit > 0) { QComponentText textComponent = new QComponentText(toParse.substring(0, delimit) + (spaceIndex == delimit ? " " : "")); toParse = toParse.substring(delimit); - + // append to current line int width = textComponent.getWidth(); if(width + currentLineWidth <= maxLineLength) { @@ -150,7 +150,7 @@ public class GuiQMAW extends GuiScreen { prevToParse = "" + toParse; continue; } - + if(toParse.equals(prevToParse)) break; prevToParse = "" + toParse; } @@ -166,7 +166,7 @@ public class GuiQMAW extends GuiScreen { @Override protected void mouseClicked(int x, int y, int key) { super.mouseClicked(x, y, key); - + if(key == 0) { this.lastClickX = x; this.lastClickY = y; @@ -175,10 +175,10 @@ public class GuiQMAW extends GuiScreen { if(guiLeft + 3 <= x && guiLeft + 3 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) back(); if(guiLeft + 21 <= x && guiLeft + 21 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) forward(); } - + public void back() { if(this.back.isEmpty()) return; - + String prev = back.get(back.size() - 1); QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(prev); @@ -192,10 +192,10 @@ public class GuiQMAW extends GuiScreen { FMLCommonHandler.instance().showGuiScreen(screen); } } - + public void forward() { if(this.forward.isEmpty()) return; - + String next = forward.get(forward.size() - 1); QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(next); @@ -209,7 +209,7 @@ public class GuiQMAW extends GuiScreen { FMLCommonHandler.instance().showGuiScreen(screen); } } - + public int getSliderPosition() { double progress = (double) scrollProgress / (double) (lines.size() - 1); return 25 + (int) (progress * 180); @@ -217,38 +217,38 @@ public class GuiQMAW extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { - + if(Mouse.isButtonDown(0) && guiLeft + xSize - 15 <= mouseX && guiLeft + xSize - 15 + 12 > mouseX && guiTop + 25 < mouseY && guiTop + 25 + 191 >= mouseY) { isDragging = true; } - + if(!Mouse.isButtonDown(0)) isDragging = false; - + if(isDragging) { int min = guiTop + 25 + 8; int max = guiTop + 25 + 191 - 8; int span = max - min; - + double progress = MathHelper.clamp_double((double) (mouseY - min) / span, 0D, 1D); this.scrollProgress = MathHelper.clamp_int((int) Math.round((lines.size() - 1) * progress), 0, lines.size() - 1); } - + handleScroll(); //this.drawRect(0, 0, this.width, this.height, 0x80919191); this.drawRect(0, 0, this.width, this.height, 0xe0000000); - + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(mouseX, mouseY); GL11.glEnable(GL11.GL_LIGHTING); - + this.lastClickX = 0; this.lastClickY = 0; } - + protected void handleScroll() { - + if(!Mouse.isButtonDown(0) && !Mouse.isButtonDown(1) && Mouse.next()) { int scroll = Mouse.getEventDWheel(); if(scroll > 0 && this.scrollProgress > 0) this.scrollProgress--; @@ -257,10 +257,10 @@ public class GuiQMAW extends GuiScreen { } private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - + int x = 43; int y = 4; - + if(this.icon != null) { GL11.glPushMatrix(); GL11.glEnable(GL11.GL_DEPTH_TEST); @@ -273,13 +273,13 @@ public class GuiQMAW extends GuiScreen { RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glPopMatrix(); - + x += 18; y += (16 - this.fontRendererObj.FONT_HEIGHT) / 2; } - + y += 1; - + this.fontRendererObj.drawString(title, guiLeft + x, guiTop + y, 0xFFFFFF); } @@ -292,30 +292,30 @@ public class GuiQMAW extends GuiScreen { if(!back.isEmpty()) drawTexturedModalRect(guiLeft + 3, guiTop + 3, 204, 0, 18, 18); if(!forward.isEmpty()) drawTexturedModalRect(guiLeft + 21, guiTop + 3, 222, 0, 18, 18); - + // scroll bar drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16); - + int x = guiLeft + 7; int y = guiTop + 30; int lineNum = 0; - + for(List line : lines) { lineNum++; - + if(lineNum <= this.scrollProgress) continue; - + int maxHeight = 0; int inset = 0; - + for(ManualElement element : line) { maxHeight = Math.max(maxHeight, element.getHeight()); } - + if(y + maxHeight > guiTop + 219) break; - + if(line.isEmpty()) y += this.fontRendererObj.FONT_HEIGHT; - + for(ManualElement element : line) { int elementX = x + inset; int elementY = y + (maxHeight - element.getHeight()) / 2; @@ -325,7 +325,7 @@ public class GuiQMAW extends GuiScreen { element.onClick(this); inset += element.getWidth(); } - + y += maxHeight + 2; } } @@ -335,7 +335,7 @@ public class GuiQMAW extends GuiScreen { if(keyCode == Keyboard.KEY_LEFT) back(); if(keyCode == Keyboard.KEY_RIGHT) forward(); - + if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { this.mc.displayGuiScreen((GuiScreen) null); this.mc.setIngameFocus(); diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index b84cf594e..6e4aeec31 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -1,9 +1,8 @@ package com.hbm.qmaw; -import java.io.File; -import java.io.FileReader; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; @@ -47,7 +46,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { init(); MainRegistry.logger.info("[QMAW] Loaded " + qmaw.size() + " manual entries! (" + (System.currentTimeMillis() - timestamp) + "ms)"); } - + /** For the like 2 people who might consider making an NTM addon and want to include manual pages. Requires the mod's actual JAR file as the parameter. */ public static void registerModFileURL(File file) { registeredModFiles.add(file); @@ -62,14 +61,14 @@ public class QMAWLoader implements IResourceManagerReloadListener { // exclude .class in the case of a dev env MainRegistry.logger.info("[QMAW] Current running file: " + path); if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself*/ // deactivated because it likely doesn't even fucking work - + // registering of the mod file now happens in the MainRegistry during preinit - + qmaw.clear(); triggers.clear(); agonyEngine(); } - + /** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it

* This affront to god can load QMAW definition files from four different sources:
* * Any mod's jar that has registered itself to include QMAW files
@@ -78,12 +77,12 @@ public class QMAWLoader implements IResourceManagerReloadListener { * * Folder-based resource packs * */ public static void agonyEngine() { - + for(File modFile : registeredModFiles) { logJarAttempt(modFile.getName()); dissectZip(modFile); } - + File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar)); if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) { MainRegistry.logger.info("[QMAW] Exploring " + devEnvManualFolder.getAbsolutePath()); @@ -91,17 +90,17 @@ public class QMAWLoader implements IResourceManagerReloadListener { } ResourcePackRepository repo = Minecraft.getMinecraft().getResourcePackRepository(); - + for(Object o : repo.getRepositoryEntries()) { ResourcePackRepository.Entry entry = (ResourcePackRepository.Entry) o; IResourcePack pack = entry.getResourcePack(); logPackAttempt(pack.getPackName()); - + if(pack instanceof FileResourcePack) { dissectZip(((FileResourcePack) pack).resourcePackFile); } - + if(pack instanceof FolderResourcePack) { dissectFolder(((FolderResourcePack) pack).resourcePackFile); } @@ -111,27 +110,27 @@ public class QMAWLoader implements IResourceManagerReloadListener { public static void logJarAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting jar " + name); } public static void logPackAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting resource " + name); } public static void logFoundManual(String name) { MainRegistry.logger.info("[QMAW] Found manual " + name); } - + /** You put your white gloves on, you get your hand in there, and then you iterate OVER THE ENTIRE FUCKING ZIP until we find things we deem usable */ public static void dissectZip(File zipFile) { - + if(zipFile == null) { MainRegistry.logger.info("[QMAW] Pack file does not exist!"); return; } - + ZipFile zip = null; - + try { zip = new ZipFile(zipFile); Enumeration enumerator = zip.entries(); - + while(enumerator.hasMoreElements()) { ZipEntry entry = enumerator.nextElement(); String name = entry.getName(); if(name.startsWith("assets/hbm/manual/") && name.endsWith(".json")) { InputStream fileStream = zip.getInputStream(entry); - InputStreamReader reader = new InputStreamReader(fileStream); + InputStreamReader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8); try { JsonObject obj = (JsonObject) parser.parse(reader); String manName = name.replace("assets/hbm/manual/", ""); @@ -143,7 +142,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } } - + } catch(Exception ex) { MainRegistry.logger.info("[QMAW] Error dissecting zip " + zipFile.getName() + ": " + ex); } finally { @@ -152,13 +151,13 @@ public class QMAWLoader implements IResourceManagerReloadListener { } catch(Exception ex) { } } } - + /** Opens a resource pack folder, skips to the manual folder, then tries to dissect that */ public static void dissectFolder(File folder) { File manualFolder = new File(folder, "/assets/hbm/manual"); if(manualFolder.exists() && manualFolder.isDirectory()) dissectManualFolder(manualFolder); } - + /** Anal bleeding */ public static void dissectManualFolder(File folder) { @@ -167,7 +166,8 @@ public class QMAWLoader implements IResourceManagerReloadListener { String name = file.getName(); if(file.isFile() && name.endsWith(".json")) { try { - FileReader reader = new FileReader(file); + //FileReader reader = new FileReader(file); + InputStreamReader reader = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8); JsonObject obj = (JsonObject) parser.parse(reader); registerJson(name, obj); logFoundManual(name); @@ -179,35 +179,35 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } } - + /** Extracts all the info from a json file's main object to add a QMAW to the system. Very barebones, only handles name, icon and the localized text. */ public static void registerJson(String file, JsonObject json) { - + String name = json.get("name").getAsString(); - + if(QMAWLoader.qmaw.containsKey(name)) { MainRegistry.logger.info("[QMAW] Skipping existing entry " + file); return; } - + QuickManualAndWiki qmaw = new QuickManualAndWiki(name); - + if(json.has("icon")) { qmaw.setIcon(SerializableRecipe.readItemStack(json.get("icon").getAsJsonArray())); } - + JsonObject title = json.get("title").getAsJsonObject(); for(Entry part : title.entrySet()) { qmaw.addTitle(part.getKey(), part.getValue().getAsString()); } - + JsonObject content = json.get("content").getAsJsonObject(); for(Entry part : content.entrySet()) { qmaw.addLang(part.getKey(), part.getValue().getAsString()); } - + JsonArray triggers = json.get("trigger").getAsJsonArray(); - + for(JsonElement element : triggers) { ItemStack trigger = SerializableRecipe.readItemStack(element.getAsJsonArray()); // items get renamed and removed all the time, so we add some more debug goodness for those cases @@ -217,7 +217,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); } } - + if(!qmaw.contents.isEmpty()) { QMAWLoader.qmaw.put(name, qmaw); } From ecc81519195d4597499ff7f669c505d186686257 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Wed, 20 Aug 2025 23:39:07 +0300 Subject: [PATCH 250/323] i am alive! --- src/main/resources/assets/hbm/lang/uk_UA.lang | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 623aa6faa..0c9a59171 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -184,6 +184,14 @@ armorMod.type.leggings=Наголінники armorMod.type.servo=Сервоприводи armorMod.type.special=Спеціальне +autoswitch=Частина групи автоматичного перемикання "%s"$Рецепт змінюється залежно від першого інгредієнта +autoswitch.plate=Переробка паливних пластин +autoswitch.plates=Металеві пластини +autoswitch.pwr=Переробка палива ВВЕР +autoswitch.schrab=Екстракція шрабідіуму +autoswitch.watz=Переробка Ватцз гранул +autoswitch.zirnox=Переробка ЦИРНОКС палива + battery.mode.buffer=Буферний режим battery.mode.input=Зарядка battery.mode.off=Вимкнено @@ -697,6 +705,10 @@ commands.satellite.satellite_descended=Супутник успішно спус commands.satellite.satellite_orbited=Супутник запущено. commands.satellite.should_be_run_as_player=Цю команду має виконати гравець! +commands.locate.no_match=Немає споруд з такою назвою! +commands.locate.none_found=Поруч не знайдено жодних споруд! +commands.locate.success.coordinates=Структуру %s знайдено на %d, %d + container.ammoBag=Сумка для боєприпасів container.amsBase=AMS Base (Deco) container.amsEmitter=AMS Emitter (Deco) @@ -794,6 +806,7 @@ container.machineLargeTurbine=Промислова парова турбіна container.machineLiquefactor=Скраплювач container.machineMixer=Промисловий змішувач container.machineOreSlopper=Переробник корінної руди +container.machinePUREX=PUREX container.machinePyroOven=Піролізна піч container.machineRefinery=Нафтопереробний завод container.machineRotaryFurnace=Роторна піч @@ -841,6 +854,7 @@ container.radar=Радар container.radiobox=FM-передавач container.radiolysis=РІТЕГ та радіолізна камера container.radiorec=FM радіо +container.rbmkAutoloader=Автозавантажувач РБМК container.rbmkBoiler=Паровий канал РБМК container.rbmkControl=Регулюючий стрижень РБМК container.rbmkControlAuto=Автоматичний регулюючий стрижень РБМК @@ -853,6 +867,7 @@ container.reactorBreeding=Реактор-розмножувач container.reactorControl=Блок дистанційного керування реактором container.reactorLarge=Великий ядерний реактор container.reactorResearch=Дослідницький реактор +container.rebar=Постановщик арматури container.reix=Rei-X Mainframe container.rtg=РІТЕГ container.rtgFurnace=РІТЕГ піч @@ -1461,6 +1476,7 @@ hbmfluid.coalgas=Вугільний бензин hbmfluid.coalgas_leaded=Етильований вугільний бензин hbmfluid.coaloil=Скраплене вугілля hbmfluid.colloid=Колоїд +hbmfluid.concrete=Рідкий бетон hbmfluid.coolant=Охолоджувальна рідина hbmfluid.coolant_hot=Гаряча охолоджувальна рідина hbmfluid.crackoil=Крекінгова нафта @@ -2108,7 +2124,7 @@ item.billet_nuclear_waste.name=Заготовка ядерних відході item.billet_pb209.name=Заготовка свинцю-209 item.billet_po210be.name=Заготовка полоній-210 берилію item.billet_polonium.name=Заготовка полонію-210 -item.billet_pu_mix.name=Заготовка реакторного полонію +item.billet_pu_mix.name=Заготовка реакторного плутонію item.billet_pu238.name=Заготовка плутонію-238 item.billet_pu238be.name=Заготовка плутоній-238 берилію item.billet_pu239.name=Заготовка плутонію-239 @@ -2161,6 +2177,7 @@ item.blades_desh.name=Деш леза подрібнювача item.blades_steel.name=Стальні леза подрібнювача item.blades_titanium.name=Титанові леза подрібнювача item.blowtorch.name=Паяльна лампа +item.blueprint_folder.name=Буклет з кресленнями item.blueprints.name=Креслення item.board_copper.name=Мідна панель item.boat_rubber.name=Гумовий човен @@ -2772,7 +2789,7 @@ item.fleija_igniter.name=Імпульсний запальник item.fleija_kit.name=Комплект F.L.E.I.J.A. item.fleija_propellant.name=Шрабідієвий заряд item.fluid_barrel_empty.name=Порожня бочка для рідини -item.fluid_barrel_full.name=Бочка для рідини: +item.fluid_barrel_full.name=Бочка для рідини: %s item.fluid_barrel_infinite.name=Нескінченна бочка для рідини item.fluid_duct.name=Трубопровід: item.fluid_identifier.name=Ідентифікатор рідини @@ -2783,10 +2800,12 @@ item.fluid_identifier.usage2=трубопроводів в діапазоні 64 item.fluid_identifier_multi.name=Мульти ідентифікатор рідини item.fluid_identifier_multi.info=Універсальний ідентифікатор рідини для: item.fluid_identifier_multi.info2=Другий тип: +item.fluid_pack_empty.name=Великий контейнер для рідини +item.fluid_pack_full.name=Упаковано %s item.fluid_tank_empty.name=Порожній універсальний резервуар для рідини -item.fluid_tank_full.name=Універсальний резервуар для рідини: +item.fluid_tank_full.name=Універсальний резервуар для рідини: %s item.fluid_tank_lead_empty.name=Порожній резервуар для небезпечних матеріалів -item.fluid_tank_lead_full.name=Резервуар для небезпечних матеріалів: +item.fluid_tank_lead_full.name=Резервуар для небезпечних матеріалів: %s item.fluorite.name=Флюорит item.flywheel_beryllium.name=Берилієвий маховик item.fmn.name=Таблетка флунітразепаму @@ -2907,6 +2926,7 @@ item.gun_amat.name=Антиматерієва гвинтівка item.gun_amat_penance.name=Покаяння item.gun_amat_subtlety.name=Витонченість item.gun_autoshotgun.name=Автоматичний дробовик +item.gun_autoshotgun_heretic.name=Єретик item.gun_autoshotgun_sexy.name=Сексі item.gun_autoshotgun_shredder.name=Шредер item.gun_b92.name=§9B92 Енергетичний пістолет§r @@ -3171,6 +3191,13 @@ item.insert_polonium.name=Полонієва вставка item.insert_steel.name=Важка сталева вставка item.insert_xsapi.name=Твердосплавна протикульна броневставка item.insert_yharonite.name=Яронітова вставка +item.item_expensive.bronze_tubes.name=Бронзові структурні елементи +item.item_expensive.circuit.name=Розширена друкована плата +item.item_expensive.computer.name=Мейнфрейм +item.item_expensive.ferro_plating.name=Армовані фероуранові панелі +item.item_expensive.heavy_frame.name=Важкий каркас +item.item_expensive.lead_plating.name=Радіаційно-стійке покриття +item.item_expensive.steel_plating.name=Болтове сталеве покриття item.item_secret.aberrator.name=Частина Абератора item.item_secret.canister.name=Композит SB-26 item.item_secret.controller.name=Пропрієтарний блок керування @@ -4069,6 +4096,7 @@ item.rbmk_tool.set=РБМК підключено! item.reacher.name=Вольфрамовий ухват item.reactor_core.name=Активна зона реактора розмножувача item.reactor_sensor.name=Дистанційний датчик реактора +item.rebar_placer.name=Встановлювач арматури item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -4753,6 +4781,11 @@ potion.hbm_stability=Стабільність potion.hbm_taint=Отруєння порчею potion.hbm_telekinesis=! ! ! +purex.recycle=Переробка %s +purex.schrab=Екстракція шрабідіуму з %s + +qmaw.tab=[ Натисніть %s для допомоги ] + radar.clearMap=Очистити карту radar.detectMissiles=Виявляти ракети radar.detectPlayers=Виявляти гравців @@ -5143,6 +5176,7 @@ tile.concrete_colored_ext.pink.name=Бетон "Вибір будівельни tile.concrete_colored_ext.purple.name=Бетон "Вибір будівельника" - Таємничий фіолетовий tile.concrete_colored_ext.sand.name=Бетон "Вибір будівельника" - Буря в пустелі tile.concrete_pillar.name=Армована залізобетонна колона +tile.concrete_rebar.name=Залізобетон tile.concrete_slab.asphalt.name=Плита з асфальту tile.concrete_slab.concrete.name=Плита з бетонної плитки tile.concrete_slab.concrete_asbestos.name=Плита з азбестобетону @@ -5315,12 +5349,12 @@ tile.floodlight.name=Потужний прожектор tile.fluid_duct.name=Універсальний рідинний трубопровід (Застаріло) tile.fluid_duct_box.name=Універсальний рідинний трубопровід (Boxduct) tile.fluid_duct_exhaust.name=Вихлопна труба -tile.fluid_duct_paintable_block_exhaust.name=Вихлопна труба з покриттям +tile.fluid_duct_paintable_block_exhaust.name=Вихлопна труба, яку можна пофарбувати tile.fluid_duct_gauge.name=Вимірювальна труба tile.fluid_duct_gauge.desc=Труба, що показує, скільки рідини$переміщується в мережі за один тік.$Розділені мережі, з'єднані бочками$або цистернами, вважаються однією спільною мережею. tile.fluid_duct_neo.name=Універсальний рідинний трубопровід -tile.fluid_duct_paintable.name=Універсальний рідинний трубопровід з покриттям -tile.fluid_duct_solid.name=Універсальний рідинний трубопровід з покриттям (Застаріло) +tile.fluid_duct_paintable.name=Універсальний рідинний трубопровід, який можна пофарбувати +tile.fluid_duct_solid.name=Універсальний рідинний трубопровід, який можна пофарбувати (Застаріло) tile.fluid_pump.name=Насос регулювання потоку tile.fluid_switch.name=Редстоун рідинний клапан tile.fluid_valve.name=Рідинний клапан @@ -5580,6 +5614,8 @@ tile.machine_powerrtg.name=Полоній-теннессинова ізотоп tile.machine_press.name=Твердопаливний прес tile.machine_puf6_tank.name=Цистерна гексафториду плутонію tile.machine_pumpjack.name=Верстат-гойдалка +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Машина для переробки багатьох видів ядерного палива.$Для більшості рецептів потрібен гас та азотна кислота. tile.machine_pyrooven.name=Піролізна піч tile.machine_radar.name=Радар tile.machine_radar_large.name=Великий радар @@ -5870,6 +5906,7 @@ tile.rail_large_switch_flipped.name=Стандартний залізнични tile.rail_narrow.name=Вузькоколійні рейки tile.rail_wood.name=Дерев'яні рейки tile.rbmk_absorber.name=Борний поглинач нейтронів РБМК +tile.rbmk_autoloader.name=Автозавантажувач РБМК tile.rbmk_blank.name=Структурна колона РБМК tile.rbmk_boiler.name=Паровий канал РБМК tile.rbmk_console.name=Консоль РБМК @@ -5901,12 +5938,13 @@ tile.reactor_ejector.name=Reactor Waste Ejector tile.reactor_element.name=Reactor Chamber tile.reactor_hatch.name=Reactor Access Hatch tile.reactor_inserter.name=Reactor Fuel Inserter +tile.rebar.name=Арматура tile.red_barrel.name=Вибухова бочка tile.red_cable.name=Червономідний кабель tile.red_cable_classic.name=Червономідний кабель (Класичний) tile.red_cable_gauge.name=Датчик потужності tile.red_cable_gauge.desc=Кабель, який показує, скільки енергії$переміщується в мережі за один тік.$Розділені мережі, з’єднані блоками$накопичення енергії, вважаються однією спільною мережею. -tile.red_cable_paintable.name=Червономідний кабель, який можна фарбувати +tile.red_cable_paintable.name=Червономідний кабель, який можна пофарбувати tile.red_connector.name=Конектор електропередач tile.red_pylon.name=Опора лінії електропередач tile.red_pylon_large.name=Велика опора лінії електропередач @@ -6232,4 +6270,4 @@ desc.gui.upgrade.overdrive= * §7Перевантаження§r: Складає desc.gui.upgrade.power= * §1Енергозбереження§r: Складається до 3 рівнів desc.gui.upgrade.speed= * §4Швидкість§r: Складається до 3 рівнів -tile.oc_cable_paintable.name=Мережевий кабель, який можна фарбувати \ No newline at end of file +tile.oc_cable_paintable.name=Мережевий кабель, який можна пофарбувати \ No newline at end of file From a4e1cc139ff1d73952266f8a1229dd48a019a41b Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Wed, 20 Aug 2025 23:40:27 +0300 Subject: [PATCH 251/323] fuck yea --- src/main/resources/assets/hbm/manual/material/alloy.json | 2 ++ src/main/resources/assets/hbm/manual/material/aluminium.json | 2 ++ src/main/resources/assets/hbm/manual/material/arsenic.json | 2 ++ .../resources/assets/hbm/manual/material/arsenic_bronze.json | 2 ++ src/main/resources/assets/hbm/manual/material/bakelite.json | 2 ++ src/main/resources/assets/hbm/manual/material/bismuth.json | 2 ++ .../resources/assets/hbm/manual/material/bismuth_bronze.json | 2 ++ src/main/resources/assets/hbm/manual/material/bscco.json | 2 ++ src/main/resources/assets/hbm/manual/material/cadmium.json | 2 ++ .../resources/assets/hbm/manual/material/cadmium_steel.json | 2 ++ src/main/resources/assets/hbm/manual/material/cinnabar.json | 2 ++ src/main/resources/assets/hbm/manual/material/coke.json | 2 ++ src/main/resources/assets/hbm/manual/material/copper.json | 2 ++ src/main/resources/assets/hbm/manual/material/desh.json | 2 ++ .../resources/assets/hbm/manual/material/ferrouranium.json | 2 ++ src/main/resources/assets/hbm/manual/material/graphite.json | 2 ++ src/main/resources/assets/hbm/manual/material/gunmetal.json | 2 ++ src/main/resources/assets/hbm/manual/material/hss.json | 2 ++ src/main/resources/assets/hbm/manual/material/latex.json | 2 ++ src/main/resources/assets/hbm/manual/material/lead.json | 2 ++ src/main/resources/assets/hbm/manual/material/mingrade.json | 2 ++ src/main/resources/assets/hbm/manual/material/neptunium.json | 4 +++- .../resources/assets/hbm/manual/material/plutonium-238.json | 2 ++ .../resources/assets/hbm/manual/material/plutonium-239.json | 2 ++ .../resources/assets/hbm/manual/material/plutonium-240.json | 2 ++ .../resources/assets/hbm/manual/material/plutonium-241.json | 2 ++ .../resources/assets/hbm/manual/material/plutonium-rg.json | 2 ++ src/main/resources/assets/hbm/manual/material/plutonium.json | 2 ++ src/main/resources/assets/hbm/manual/material/polonium.json | 2 ++ src/main/resources/assets/hbm/manual/material/polymer.json | 2 ++ src/main/resources/assets/hbm/manual/material/radium.json | 2 ++ src/main/resources/assets/hbm/manual/material/rubber.json | 2 ++ src/main/resources/assets/hbm/manual/material/silicon.json | 2 ++ src/main/resources/assets/hbm/manual/material/sodium.json | 2 ++ src/main/resources/assets/hbm/manual/material/steel.json | 2 ++ src/main/resources/assets/hbm/manual/material/sulfur.json | 2 ++ src/main/resources/assets/hbm/manual/material/tantalium.json | 2 ++ src/main/resources/assets/hbm/manual/material/technetium.json | 2 ++ .../assets/hbm/manual/material/technetium_steel.json | 2 ++ src/main/resources/assets/hbm/manual/material/thorium.json | 2 ++ .../resources/assets/hbm/manual/material/uranium-233.json | 2 ++ .../resources/assets/hbm/manual/material/uranium-235.json | 2 ++ .../resources/assets/hbm/manual/material/uranium-238.json | 2 ++ src/main/resources/assets/hbm/manual/material/uranium.json | 2 ++ .../resources/assets/hbm/manual/material/weaponsteel.json | 2 ++ 45 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index 03ef80a7a..19967db56 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], "title": { "en_US": "Advanced Alloy", + "uk_UA": "Удосконалений сплав", "ru_ru": "Продвинутый сплав" }, "content": { "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", + "uk_UA": "Виготовлено в [[доменній печі|Blast Furnace]] зі [[сталі|Steel]] та [[червоної міді|Minecraft Grade Copper]]. З нього робиться спорядження краще за алмазне. Також використовується в деяких потужних магнітах для [[термоядерного реактору|Fusion Reactor]] та [[камери опромінювання|Exposure Chamber]].", "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 8bdf151bc..a94238bf5 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], "title": { "en_US": "Aluminium", + "uk_UA": "Алюміній", "ru_RU": "Алюминий" }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", + "uk_UA": "Звичайний, легкий метал. Доступний на ранніх стадіях шляхом плавлення кріоліту ('алюмінієвої руди') у [[коксовій печі|Combination Oven]]. Може бути отриманий пізніше шляхом обробки [[бокситів|Bauxite]], та [[електролізу|Electrolysis Machine]] отриманого розчину оксиду алюмінію.

Використовується в трубопроводах, загальній роботі з рідинами, як компонент [[гарматної бронзи|Gunmetal]] та фюзеляжів ракет.", "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." } } diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index d54f92d25..bd59c27e3 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], "title": { "en_US": "Arsenic", + "uk_UA": "Миш'як", "ru_RU": "Мышьяк" }, "content": { "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", + "uk_UA": "Отримується шляхом обробки нафтових відходів [[високоефективним розчинником|High-Performance Solvent]] в [[рудному окислювачі|Ore Acidizer]]. Нафтові відходи утворюються [[подрібненням|Shredder]] забруднених блоків, утворених [[вежею гідророзриву|Hydraulic Fracking Tower]]. В основному використовується як [[миш'якова бронза|Arsenic Bronze]].", "ru_RU": "Получается путём обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index d53db5d12..ac4c8e6f4 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_arsenic_bronze"]], "title": { "en_US": "Arsenic Bronze", + "uk_UA": "Миш'якова бронза", "ru_RU": "Мышьяковая бронза" }, "content": { "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", + "uk_UA": "Похідна від [[миш'яку|Arsenic]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]] через необхідність у [[високоефективному розчиннику|High-Performance Solvent]].

Повністю взаємозамінна з [[вісмутовою бронзою|Bismuth Bronze]].", "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index d5d232149..031844f3c 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], "title": { "en_US": "Bakelite", + "uk_UA": "Карболіт", "ru_RU": "Бакелит" }, "content": { "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", + "uk_UA": "Карболіт (радянська назва бакеліту) — альтернатива [[полімеру|Polymer]], виготовлений з [[ароматичних вуглеводнів|Aromatic Hydrocarbons]], отриманих з [[продуктів крекінгу нафти|Catalytic Cracking Tower]]. Повністю взаємозамінний у всіх рецептах.", "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах." } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 9b3105586..964c2cdad 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], "title": { "en_US": "Bismuth", + "uk_UA": "Вісмут", "ru_RU": "Висмут" }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", + "uk_UA": "Важкий метал, початково який можна отримати у результаті переробки відпрацьованого палива [[РБМК|RBMK]] в [[SILEX]], також може бути отриманий на пізнішій стадії переробки корінної руди з використанням [[високоефективного розчинника|High-Performance Solvent]]. Переважно використовуюється як [[вісмутова бронза|Bismuth Bronze]].", "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index 07167ba3d..176a944c6 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_bismuth_bronze"]], "title": { "en_US": "Bismuth Bronze", + "uk_UA": "Вісмутова бронза", "ru_RU": "Висмутовая бронза" }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", + "uk_UA": "Похідна від [[вісмуту|Bismuth]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]]br>
Повністю взаємозамінна з [[миш'яковою бронзою|Arsenic Bronze]].", "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index a341b55af..066f4e003 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], "title": { "en_US": "BSCCO", + "uk_UA": "Вісмут стронцій кальцій мідь оксид (BSCCO)", "ru_RU": "BSCCO" }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", + "uk_UA": "Потужний надпровідник, що використовується у високоякісних платах та котушках для [[прискорювача часток|Particle Accelerator]]. Потребує [[вісмут|Bismuth]], і тому доступний лише після побудови [[РБМК|RBMK]].", "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 0de201080..05f5181e4 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], "title": { "en_US": "Cadmium", + "uk_UA": "Кадмій", "ru_RU": "Кадмий" }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", + "uk_UA": "Виготовляється шляхом обробки листя гірчичної верби [[високоефективним розчинником|High-Performance Solvent]]. Використовується у [[полівінілхлориді|PVC]], пізньому альтернативному рецепті для [[гуми|Rubber]] та для [[кадмієвої сталі|Cadmium Steel]], яка виступає як замінник [[технецієвої сталі|Technetium Steel]].", "ru_RU": "Изготовлен путём обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index 48ce8d495..bd9d6339d 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_cdalloy"]], "title": { "en_US": "Cadmium Steel", + "uk_UA": "Кадмієва сталь", "ru_RU": "Кадмиевая сталь" }, "content": { "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", + "uk_UA": "Корозійностійкий сплав, виготовлений зі [[сталі|Steel]] та [[кадмію|Cadmium]]. Альтернатива [[технецієвій сталі|Technetium Steel]] в більшості рецептів.", "ru_RU": "Коррозионно-стойкий сплав, изготовленный из [[стали|Steel]] и [[кадмия|Cadmium]]. Альтернатива [[технециевой стали|Technetium Steel]] в большинстве рецептов." } } diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index bb721bf6f..459d22a98 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.cinnebar"]], "title": { "en_US": "Cinnabar", + "uk_UA": "Кіновар", "ru_RU": "Киноварь" }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", + "uk_UA": "Рідкісна руда. Може бути [[окислена|Ore Acidizer]] в 375mB [[ртуті|Mercury]] (3 краплі ртуті), або виплавлена у [[коксовій печі|Combination Oven]] в 100mB ртуті та трохи сірки. Здебільшого використовується як ранній спосіб отримання ртуті для виробництва [[деш|Desh]].", "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index 234ab7588..0ad74d780 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.coke", 1, 32767]], "title": { "en_US": "Coke", + "uk_UA": "Кокс", "ru_RU": "Кокс" }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", + "uk_UA": "Високочистий вуглець, має вдвічі вищу горючість, ніж вугілля. Може бути зпресований у [[графіт|Graphite]], використовується у різних рецептах [[сталі|Steel]] або як джерело вуглецю для [[ливарні|Crucible]].

Вугільний кокс можна виготовляти шляхом обсмаження вугільних брикетів або коксування вугілля в різних його формах.

Буровугільний кокс виготовляється з набагато дешевшого та менш потужного бурого вугілля майже таким самим способом, незважаючи на це, він має ті ж характеристики.

Нафтовий кокс виготовляється або з невугільних смол у [[коксовій печі|Combination Oven]], або шляхом коксування різних видів нафтопродуктів у [[коксовій установці|Coking Unit]].", "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index e8e155732..7feca78cd 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], "title": { "en_US": "Copper", + "uk_UA": "Мідь", "ru_RU": "Медь" }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", + "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index a34e741c7..f5b1e1027 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], "title": { "en_US": "Desh", + "uk_UA": "Деш", "ru_RU": "Деш" }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", + "uk_UA": "Високоміцний робочий сплав, виготовлений на [[хімічному заводі|Chemical Plant]]. Потребує [[легку нафту|Light oil]] з базової переробки [[нафти|Crude Oil]], [[ртуть|Mercury]], побічний продукт [[[центрифугування|Centrifuge]] редстоунової руди та деш суміш, яка є просто [[подрібненими|Shredder]] шматками рідкоземельної руди.

Використовується в різних речах, особливо в інструментах та зброї. Деш інструменти повільні та відповідають лише залізному тіру, але є першими доступними незламними інструментами з багатьма режимами роботи.", "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." } } diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 687434042..f2c635d9a 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_ferrouranium"]], "title": { "en_US": "Ferrouranium", + "uk_UA": "Фероуран", "ru_RU": "Ферроуран" }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", + "uk_UA": "Сплав [[сталі|Steel]] та [[урану-238|Uranium-238]], виготовлений у [[ливарні|Crucible]]. В основному використовується в уранобетоні, деталях зброї та вибухових боєприпасах.", "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах." } } diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 1876c53fa..be283d5f2 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_graphite"]], "title": { "en_US": "Graphite", + "uk_UA": "Графіт", "ru_RU": "Графит" }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", + "uk_UA": "Виготовляється пресуванням коксу. Використовується в ядерних реакторах, графітових електродах для [[електричної дугової печі|Electric Arc Furnace]] або як джерело вуглецю в різних рецептах [[ливарні|Crucible]].", "ru_RU": "Изготавливается путём прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index f5d89a0b1..8c1118d61 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], "title": { "en_US": "Gunmetal", + "uk_UA": "Гарматна бронза", "ru_RU": "Оружейный металл" }, "content": { "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", + "uk_UA": "Сплав [[алюмінію|Aluminium]] та [[міді|Copper]]. Може бути виготовлений на ковадлі або, що ефективніше, у [[роторній печі|Rotary Furnace]]. Використовується переважно для деталей зброї, а також для гільз більшості боєприпасів.", "ru_RU": "Сплав из [[алюминия|Aluminium]] и [[меди|Copper]]. Может быть изготовлен на наковальне или более эффективно в [[роторной печи|Rotary Furnace]]. В основном используется для деталей оружия, а также для гильз большинства боеприпасов." } } diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index 26380d6c5..364c5dd92 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], "title": { "en_US": "High-Speed Steel", + "uk_UA": "Швидкорізальна сталь", "ru_RU": "Высокоскоростная сталь" }, "content": { "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", + "uk_UA": "Сплав зі [[сталі|Steel]], [[вольфраму|Tungsten]] та [[кобальту|Cobalt]], виготовлений в [[ливарні|Crucible]]. Створюється у вигляді рідкого металу, перед використанням його необхідно відлити у форму зливка або пластини.

Використовується для виготовлення різального обладнання що працює на великих швидкостях.", "ru_RU": "Сплав из [[стали|Steel]], [[вольфрама|Tungsten]] и [[кобальта|Cobalt]], изготовленный в [[плавильне|Crucible]]. Создается в виде жидкого металла, требует отливки в форму слитка или пластины перед использованием." } } diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index b5795bd32..133ca076d 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], "title": { "en_US": "Latex", + "uk_UA": "Латекс", "ru_RU": "Латекс" }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", + "uk_UA": "Натуральна форма гуми, яку можна отримати з кульбаб або пресуванням тропічного дерева. У всіх рецептах може бути замінена на [[гуму|Rubber]], але не навпаки.", "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путём прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот." } } diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index b4d919e1a..d8b25c8b0 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], "title": { "en_US": "Lead", + "uk_UA": "Свинець", "ru_RU": "Свинец" }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", + "uk_UA": "Поширений ресурс. В основному використовується для речей, пов'язаних з радіацією, та для боєприпасів, а також як припій для багатьох схем.", "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем." } } diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index fe1732da5..64ffb5221 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { "en_US": "Minecraft Grade Copper (Red Copper)", + "uk_UA": "Червона мідь (aka Minecraft Grade Copper)", "ru_RU": "Медь Minecraft (Красная медь)" }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", + "uk_UA": "Сплав, виготовлений з [[міді|Copper]] та редстоуну в рівному співвідношенні в [[доменній печі|Blast Furnace]]. Використовується майже у всій електриці, зазвичай у вигляді дроту.", "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проводов." } } diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index a68c7adb9..c80bebbc1 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], "title": { "en_US": "Neptunium", - "ru_RU": "Нептуний" + "uk_UA": "Нептуній-237", + "ru_RU": "Нептуний"" }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", + "uk_UA": "Ізотоп здатний до розщеплення, зазвичай міститься у відпрацьованому паливі [[урану-235|Uranium-235]]. Здебільшого використовується для ядерних реакторів у чистому вигляді як високозбагачене нептунієве паливо або в поєднанні з [[ураном-238|Uranium-238]] як середньозбагачене нептунієве паливо. Використовується в [[ВВЕР|PWR]] та [[РБМК|RBMK]].", "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index d770353f4..7851b3f27 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], "title": { "en_US": "Plutonium-238", + "uk_UA": "Плутоній-238", "ru_RU": "Плутоний-238" }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", + "uk_UA": "Радіоізотоп, що використовується переважно в [[РІТЕГ|RTG]]. Отримується з гексафториду [[плутонію|Plutonium]], або з різного ядерного палива, переважно того, що використовує [[уран-235|Uranium-235]]. Використовується з [[берилієм|Beryllium]] як Плутоній-238 берилієве джерело нейтронів в [[РБМК|RBMK]].

Помірно радіоактивний, дуже гарячий.", "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index f64b725f8..ff2fbc3b9 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], "title": { "en_US": "Plutonium-239", + "uk_UA": "Плутоній-239", "ru_RU": "Плутоний-239" }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", + "uk_UA": "Перший здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути отриманий з багатьох видів відпрацьованого палива, що використовують [[уран-238|Uranium-238]] бо безпосередньо з [[реакторного плутонію|Reactor-Grade Plutonium]]. Використовується у високозбагаченому паливі для різних реакторів, змішується з іншими ізотопами для низькозбагаченого палива або як заряд у багатьох ядерних бомбах.

Помірно радіоактивний.", "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 859bfd7c0..f729c1710 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], "title": { "en_US": "Plutonium-240", + "uk_UA": "Плутоній-240", "ru_RU": "Плутоний-240" }, "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", + "uk_UA": "Не здатний до поділу ізотоп, що міститься в [[плутонії|Plutonium]] та [[реакторному плутонії|Reactor-Grade-Plutonium]]. Корисний лише при ручному виготовленні реакторного плутонію з [[плутонію-239|Plutonium-239]] або у спеціалізованих [[цирконієвих|Zirconium]] швидких розмножувачах для виготовлення [[плутонію-241|Plutonium-241]] в [[РБМК|RBMK]]." , "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 096b8864c..80f07e24e 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], "title": { "en_US": "Plutonium-241", + "uk_UA": "Плутоній-241", "ru_RU": "Плутоний-241" }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", + "uk_UA": "Другий здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути відновлений з відпрацьованого палива [[РБМК|RBMK]], багатого на [[плутоній-240|Plutonium-240]], а також з деяких видів [[цирконієвих|Zirconium]] швидких розмножувачів. Використовується лише в спеціальних паливних розмножувачах та як високозбагачене паливо, яке є потужнішим за свій аналог [[плутонію-239|Plutonium-239]]. Плутоній-241 в РБМК утворює [[америцій-241|Americium-241]] та [[америцій-242|Americium-242]] після переробки.

Високорадіоактивний.", "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index c5cb2f1a4..fd0fa1463 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], "title": { "en_US": "Reactor-Grade Plutonium", + "uk_UA": "Реакторний плутоній", "ru_RU": "Плутоний реакторного качества" }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", + "uk_UA": "Суміш [[плутонію-239|Plutonium-239]] та [[плутонію-240|Plutonium-240]]. Поширений результат переробки багатьох видів палива на основі [[урану|Uranium]], а також розмноження урану в [[Чиказькій дровітні|Chicago Pile]]. Використовується в багатьох реакторах як середньозбагачене плутонієве паливо.

Помірно радіоактивний.", "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащённое плутониевое топливо.

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 719c14800..b6a3f6d59 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], "title": { "en_US": "Plutonium", + "uk_UA": "Плутоній", "ru_RU": "Плутоний" }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", + "uk_UA": "Рідкісна форма природнього плутонію, що складається з плутонію-238, 239 та 240. Плутоній у формі руди вимкнено за замовчуванням. Може бути перероблений в [[газовій центріфузі|Gas Centrifuge]] у формі гексафториду, або використовуватися для певних рецептів [[циклотрона|Cyclotron]].

Помірно радіоактивний.

Див. також:
[[Плутоній-238|Plutonium-238]]
[[Плутоній-239|Plutonium-239]]
[[Плутоній-240|Plutonium-240]]
[[Плутоній-241|Plutonium-241]]", "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index c36e74218..d8fc0a075 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], "title": { "en_US": "Polonium-210", + "uk_UA": "Полоній-210", "ru_RU": "Полоний-210" }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", + "uk_UA": "Радіоізотоп, отриманий в результаті переробки [[радій-226|Radium-226]]берилієвих джерел нейтронів. Використовується для [[РІТЕГ|RTG]] або з [[берилієм|Beryllium]] у полоній-210 берилієвих джерелах нейтронів для [[РБМК|RBMK]].

Високорадіоактивний, дуже гарячий.", "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." } } diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 9c540925b..a23290a78 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], "title": { "en_US": "Polymer", + "uk_UA": "Полімер", "ru_RU": "Полимер" }, "content": { "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", + "uk_UA": "Полімер ('Тефлон') – це перший доступний тип пластику. потребує [[нафтовий газ|Petroleum Gas]], а отже, [[переробку нафти|Crude Oil]].

Повністю взаємозамінний з [[карболітом|Bakelite]], який стає доступним після [[крекінгу нафти|Catalytic Cracking Tower]].", "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].

Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 331d37adc..840c3234c 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], "title": { "en_US": "Radium-226", + "uk_UA": "Радій-226", "ru_RU": "Радий-226" }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", + "uk_UA": "Рідкісний радіоактивний матеріал, що міститься в [[уранових|Uranium]] та [[торієвих|Thorium-232]] рудах, можна отримати за допомогою [[центрифуги|Centrifuge]]. Використовується разом з [[берилієм|Beryllium]] у радій-226 берилієвих джерелах нейтронів, які необхідні для запуску [[Чиказької дровітні|Chicago Pile]], [[ВВЕР|PWR]], [[дослідницького реактора|Research Reactor]] та [[РБМК|RBMK]]. Перше доступне джерело нейтронів і часто найдешевше.

Помірно радіоактивний.", "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index e317d6752..b14267f2f 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_rubber"]], "title": { "en_US": "Rubber", + "uk_UA": "Гума", "ru_RU": "Резина" }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", + "uk_UA": "Нафтопродукт, отриманий з [[ненасичених вуглеводнів|Unsaturated Hydrocarbons]] та [[сірки|Sulfur]]. Для виробництва потрібна щонайменше [[вежа каталітичного крекінгу|Catalytic Cracking Tower]]. Може замінити [[латекс|Latex]] у всіх рецептах.", "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах." } } diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 67951240c..cbb4bf966 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], "title": { "en_US": "Silicon", + "uk_UA": "Кремній", "ru_RU": "Кремний" }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", + "uk_UA": "Важливий матеріал для виробництва інтегральних плат та будь-якої електроніки, складнішої за аналогову плату. Виготовляється в [[електричній дуговій печі|Electric Arc Furnace]] використанням матеріалів, що містять діоксид кремнію, наприклад звичайного піску, пекельного кварцу, скловолокна, кременю або [[азбесту|Asbestos]]. Використовується переважно як пластини (тобто заготовки) які [[пресуються|Burner Press]] за допомогою штампа схеми, а потім перетворюються на різні типи мікрочіпів. Через необхідність у дуговій печі, кремній стає доступний після отримання [[полімеру|Polymer]], що вимагає переробки [[нафти|Crude Oil]].", "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 6ad6ac6f7..55fe5a061 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.powder_sodium"]], "title": { "en_US": "Sodium", + "uk_UA": "Натрій", "ru_RU": "Натрий" }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", + "uk_UA": "В основному отримується з содаліту, дорогоцінного каменю, який зустрічається як побічний продукт [[центрифугування|Centrifuge]] багатьох руд. Використовується в рідкому вигляді як потужний охолоджувач для [[ВВЕР|PWR]].", "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index 83c6f8867..e25ef2fe4 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], "title": { "en_US": "Steel", + "uk_UA": "Сталь", "ru_RU": "Сталь" }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", + "uk_UA": "Покращена версія заліза, базовий матеріал. Використовується майже в усьому. Спочатку отримується шляхом поєднання вугілля та заліза в [[доменній печі|Blast Furnace]]. Покращені рецепти доступні пізніше в [[ливарні|Crucible]] та [[роторній печі|Rotary Furnace]].", "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путём комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 7d9b5915b..84236f8d7 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.sulfur"]], "title": { "en_US": "Sulfur", + "uk_UA": "Сірка", "ru_RU": "Сера" }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", + "uk_UA": "Звичайна руда, зустрічається у великих кількостях в пеклі. Використовується в різних речах, таких як [[сірчана кислота|Sulfuric Acid]], [[гума|Rubber]] та єлоукейку для отримання гексафториду [[урану|Uranium]]. Також може використовуватися для виготовлення пороху, сірників або як жовтий барвник.", "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя." } } diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index e3d0ee9c2..4ff81b7d9 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], "title": { "en_US": "Tantalium", + "uk_UA": "Тантал", "ru_RU": "Тантал" }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", + "uk_UA": "Тантал ('Танталій') можна отримати з [[колтану|Coltan]] який зустрічається лише в одному конкретному регіоні світу. Використовується переважно для танталових конденсаторів, які є критично важливими для блоків керування, що використовуються в більшості ядерних бомб.", "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 5eaef724f..294467b75 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], "title": { "en_US": "Technetium", + "uk_UA": "Технецій-99", "ru_RU": "Технеций" }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", + "uk_UA": "Синтетичний метал, перероблений з палива [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]] на ранніх етапах. також може бути отриманий з деяких видів палива [[РБМК|RBMK]] або [[корінної руди|Bedrock Ore]] за допомогою високоефективного розчинника.

В основному використовується для [[технецієвої сталі|Technetium Steel]].

Помірно радіоактивний.", "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index ac31ac861..cbe61e652 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], "title": { "en_US": "Technetium Steel", + "uk_UA": "Технецієва сталь", "ru_RU": "Технециевая сталь" }, "content": { "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", + "uk_UA": "Сплав, виготовлений зі [[сталі|Steel]] та [[технецію|Technetium]]. Стійкий до корозії, використовується в більш міцних резервуарах для рідини та в багатьох передових машинах. Одержується після [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]], оскільки технецій є синтетичним.

Повністю взаємозамінний з [[кадмієвою сталлю|Cadmium Steel]].", "ru_RU": "Сплав из [[стали|Steel]] и [[технеция|Technetium]]. Устойчив к коррозии, используется в более прочных резервуарах для жидкостей и во многих продвинутых машинах. Доступен после [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]], так как технеций является синтетическим.

Полностью взаимозаменяем с [[кадмиевой сталью|Cadmium Steel]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index be512e7cc..6af1f0d82 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], "title": { "en_US": "Thorium-232", + "uk_UA": "Торій-232", "ru_RU": "Торий-232" }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", + "uk_UA": "Фертильний (тобто придатний до розмноження) ізотоп який дає [[уран-233|Uranium-233]]. Може бути опромінений в [[РБМК|RBMK]] для отримання [[торієвого палива|Thorium Fuel]] або поєднаний з ураном-233. Паливо, отримане з торію, зазвичай економічне, але не дуже потужне. Також використовується у вигляді [[рідкої торієвої солі|Liquid Thorium Salt]], потужному теплоносію [[ВВЕР|PWR]] (перетворюючи його у реактор на розплавах солей) який швидко дає тонни урану-233.

Слабко радіоактивний.", "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index d1802f419..8fcdd5ad7 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], "title": { "en_US": "Uranium-233", + "uk_UA": "Уран-233", "ru_RU": "Уран-233" }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", + "uk_UA": "Штучний ізотоп урану здатного до розщеплення (тобто придатного для реакторів), отримується шляхом переробки [[палива на основі торію|Thorium Fuel]]. Високозбагачене паливо з урану-233, як правило, потужніше, ніж паливо, отримане з [[урану-235|Uranium-235]].

Помірно радіоактивний.", "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 56b101d67..772186fa9 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], "title": { "en_US": "Uranium-235", + "uk_UA": "Уран-235", "ru_RU": "Уран-235" }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", + "uk_UA": "Збагачений уран. Придатний до розщеплення, використовується в деяких реакторах безпосередньо як високозбагачене паливо або змішується з [[ураном-238|Uranium-238]] для отримання середньозбагаченого уранового палива. Збройового класу. Спочатку отримується шялхом переробки [[гексафториду урану|Uranium Hexafluoride]] у каскаді з чотирьох [[газових центрифуг|Gas Centriuge]], пізніше доступний шляхом розділення [[природного урану|Uranium]] за допомогою [[камери лазерного розділення ізотопів|SILEX]].

Помірно радіоактивний.", "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index ca87770e1..8791492b1 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], "title": { "en_US": "Uranium-238", + "uk_UA": "Уран-238", "ru_RU": "Уран-238" }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", + "uk_UA": "Збіднений уран, не ділиться (тобто не придатний для безпосереднього використання в реакторах). В основному побічний продукт збагачення [[урану|Uranium]]. Використовується у виготовленні [[фероурану|Ferrouranium]], [[боєприпасів зі збідненим ураном|Depleted Uranium Ammo]] та для певного низькозбагаченого палива. Паливо, що містить уран-238 зазвичай дає корисний [[плутоній-239|Plutonium-239]] під час переробки.

Слабо радіоактивний.", "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index 89ab05f6b..adfd06926 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], "title": { "en_US": "Uranium", + "uk_UA": "Уран", "ru_RU": "Уран" }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", + "uk_UA": "Природний уран, слабо радіоактивний. Сам по собі не дуже ділиться, його можна збагачувати, перетворюючи на [[гексафторид урану|Uranium Hexafluoride]] та оброблюючи в [[газових центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] та [[Чиказька дровітня|Chigago Pile]] можуть використовувати природний уран як паливо без збагачення.

Див. також:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index 52e5c11ed..d2fbdebf4 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -4,10 +4,12 @@ "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], "title": { "en_US": "Weapon Steel", + "uk_UA": "Збройова сталь", "ru_RU": "Оружейная сталь" }, "content": { "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", + "uk_UA": "Високочиста версія [[сталі|Steel]] виготовлена в [[роторній печі|Rotary Furnace]]. Потребує [[коксовий газ|Coker Gas]], тому і [[коксову установку|Coker Unit]]. Використовується в багатьох видах мідгеймової зброї, модифікаціях зброї та ракетних боєголовках.", "ru_RU": "Высококачественная версия [[стали|Steel]], изготовленная в [[роторной печи|Rotary Furnace]]. Требует [[коксовый газ|Coker Gas]] и, следовательно, [[коксовую установку|Coker Unit]]. Используется во многих оружиях среднего этапа игры, модификациях оружия и боеголовках ракет." } } From 763a702ed73346a27815072a2c495afef2d786f1 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Wed, 20 Aug 2025 23:55:03 +0300 Subject: [PATCH 252/323] xd --- src/main/resources/assets/hbm/manual/material/alloy.json | 2 +- src/main/resources/assets/hbm/manual/material/aluminium.json | 2 +- src/main/resources/assets/hbm/manual/material/arsenic.json | 2 +- .../resources/assets/hbm/manual/material/arsenic_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bakelite.json | 2 +- src/main/resources/assets/hbm/manual/material/bismuth.json | 2 +- .../resources/assets/hbm/manual/material/bismuth_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bscco.json | 2 +- src/main/resources/assets/hbm/manual/material/cadmium.json | 2 +- .../resources/assets/hbm/manual/material/cadmium_steel.json | 2 +- src/main/resources/assets/hbm/manual/material/cinnabar.json | 2 +- src/main/resources/assets/hbm/manual/material/coke.json | 2 +- src/main/resources/assets/hbm/manual/material/copper.json | 2 +- src/main/resources/assets/hbm/manual/material/desh.json | 2 +- src/main/resources/assets/hbm/manual/material/ferrouranium.json | 2 +- src/main/resources/assets/hbm/manual/material/graphite.json | 2 +- src/main/resources/assets/hbm/manual/material/gunmetal.json | 2 +- src/main/resources/assets/hbm/manual/material/hss.json | 2 +- src/main/resources/assets/hbm/manual/material/latex.json | 2 +- src/main/resources/assets/hbm/manual/material/lead.json | 2 +- src/main/resources/assets/hbm/manual/material/mingrade.json | 2 +- src/main/resources/assets/hbm/manual/material/neptunium.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-238.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-239.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-240.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-241.json | 2 +- src/main/resources/assets/hbm/manual/material/plutonium-rg.json | 2 +- src/main/resources/assets/hbm/manual/material/plutonium.json | 2 +- src/main/resources/assets/hbm/manual/material/polonium.json | 2 +- src/main/resources/assets/hbm/manual/material/polymer.json | 2 +- src/main/resources/assets/hbm/manual/material/radium.json | 2 +- src/main/resources/assets/hbm/manual/material/rubber.json | 2 +- src/main/resources/assets/hbm/manual/material/silicon.json | 2 +- src/main/resources/assets/hbm/manual/material/sodium.json | 2 +- src/main/resources/assets/hbm/manual/material/steel.json | 2 +- src/main/resources/assets/hbm/manual/material/sulfur.json | 2 +- src/main/resources/assets/hbm/manual/material/tantalium.json | 2 +- src/main/resources/assets/hbm/manual/material/technetium.json | 2 +- .../resources/assets/hbm/manual/material/technetium_steel.json | 2 +- src/main/resources/assets/hbm/manual/material/thorium.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-233.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-235.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-238.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium.json | 2 +- src/main/resources/assets/hbm/manual/material/weaponsteel.json | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index 19967db56..69c2dbca0 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], "title": { "en_US": "Advanced Alloy", - "uk_UA": "Удосконалений сплав", + "uk_UA": "Удосконалений сплав", "ru_ru": "Продвинутый сплав" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index a94238bf5..0f8c8b459 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], "title": { "en_US": "Aluminium", - "uk_UA": "Алюміній", + "uk_UA": "Алюміній", "ru_RU": "Алюминий" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index bd59c27e3..97501ed2d 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], "title": { "en_US": "Arsenic", - "uk_UA": "Миш'як", + "uk_UA": "Миш'як", "ru_RU": "Мышьяк" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index ac4c8e6f4..1107f9b38 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_arsenic_bronze"]], "title": { "en_US": "Arsenic Bronze", - "uk_UA": "Миш'якова бронза", + "uk_UA": "Миш'якова бронза", "ru_RU": "Мышьяковая бронза" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index 031844f3c..1b1abf1c7 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], "title": { "en_US": "Bakelite", - "uk_UA": "Карболіт", + "uk_UA": "Карболіт", "ru_RU": "Бакелит" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 964c2cdad..976224336 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], "title": { "en_US": "Bismuth", - "uk_UA": "Вісмут", + "uk_UA": "Вісмут", "ru_RU": "Висмут" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index 176a944c6..978c45e4a 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bismuth_bronze"]], "title": { "en_US": "Bismuth Bronze", - "uk_UA": "Вісмутова бронза", + "uk_UA": "Вісмутова бронза", "ru_RU": "Висмутовая бронза" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index 066f4e003..a66b18377 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], "title": { "en_US": "BSCCO", - "uk_UA": "Вісмут стронцій кальцій мідь оксид (BSCCO)", + "uk_UA": "Вісмут стронцій кальцій мідь оксид (BSCCO)", "ru_RU": "BSCCO" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 05f5181e4..7c7d98f1e 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], "title": { "en_US": "Cadmium", - "uk_UA": "Кадмій", + "uk_UA": "Кадмій", "ru_RU": "Кадмий" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index bd9d6339d..089edb914 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_cdalloy"]], "title": { "en_US": "Cadmium Steel", - "uk_UA": "Кадмієва сталь", + "uk_UA": "Кадмієва сталь", "ru_RU": "Кадмиевая сталь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index 459d22a98..2e6489b3a 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.cinnebar"]], "title": { "en_US": "Cinnabar", - "uk_UA": "Кіновар", + "uk_UA": "Кіновар", "ru_RU": "Киноварь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index 0ad74d780..0b71dd10e 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.coke", 1, 32767]], "title": { "en_US": "Coke", - "uk_UA": "Кокс", + "uk_UA": "Кокс", "ru_RU": "Кокс" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index 7feca78cd..5a225d419 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], "title": { "en_US": "Copper", - "uk_UA": "Мідь", + "uk_UA": "Мідь", "ru_RU": "Медь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index f5b1e1027..24dbb454b 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], "title": { "en_US": "Desh", - "uk_UA": "Деш", + "uk_UA": "Деш", "ru_RU": "Деш" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index f2c635d9a..3b0d356cc 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_ferrouranium"]], "title": { "en_US": "Ferrouranium", - "uk_UA": "Фероуран", + "uk_UA": "Фероуран", "ru_RU": "Ферроуран" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index be283d5f2..e47763265 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_graphite"]], "title": { "en_US": "Graphite", - "uk_UA": "Графіт", + "uk_UA": "Графіт", "ru_RU": "Графит" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index 8c1118d61..722c0c618 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], "title": { "en_US": "Gunmetal", - "uk_UA": "Гарматна бронза", + "uk_UA": "Гарматна бронза", "ru_RU": "Оружейный металл" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index 364c5dd92..99f2e8420 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], "title": { "en_US": "High-Speed Steel", - "uk_UA": "Швидкорізальна сталь", + "uk_UA": "Швидкорізальна сталь", "ru_RU": "Высокоскоростная сталь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index 133ca076d..138523e14 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], "title": { "en_US": "Latex", - "uk_UA": "Латекс", + "uk_UA": "Латекс", "ru_RU": "Латекс" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index d8b25c8b0..91c5a1f8a 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], "title": { "en_US": "Lead", - "uk_UA": "Свинець", + "uk_UA": "Свинець", "ru_RU": "Свинец" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index 64ffb5221..0c9102589 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { "en_US": "Minecraft Grade Copper (Red Copper)", - "uk_UA": "Червона мідь (aka Minecraft Grade Copper)", + "uk_UA": "Червона мідь (aka Minecraft Grade Copper)", "ru_RU": "Медь Minecraft (Красная медь)" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index c80bebbc1..960af17e0 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], "title": { "en_US": "Neptunium", - "uk_UA": "Нептуній-237", + "uk_UA": "Нептуній-237", "ru_RU": "Нептуний"" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index 7851b3f27..5224b81f0 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], "title": { "en_US": "Plutonium-238", - "uk_UA": "Плутоній-238", + "uk_UA": "Плутоній-238", "ru_RU": "Плутоний-238" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index ff2fbc3b9..b39cc3300 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], "title": { "en_US": "Plutonium-239", - "uk_UA": "Плутоній-239", + "uk_UA": "Плутоній-239", "ru_RU": "Плутоний-239" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index f729c1710..3a4268cf6 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], "title": { "en_US": "Plutonium-240", - "uk_UA": "Плутоній-240", + "uk_UA": "Плутоній-240", "ru_RU": "Плутоний-240" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 80f07e24e..ac9470a32 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], "title": { "en_US": "Plutonium-241", - "uk_UA": "Плутоній-241", + "uk_UA": "Плутоній-241", "ru_RU": "Плутоний-241" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index fd0fa1463..25d4db6aa 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], "title": { "en_US": "Reactor-Grade Plutonium", - "uk_UA": "Реакторний плутоній", + "uk_UA": "Реакторний плутоній", "ru_RU": "Плутоний реакторного качества" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index b6a3f6d59..6570bde4a 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], "title": { "en_US": "Plutonium", - "uk_UA": "Плутоній", + "uk_UA": "Плутоній", "ru_RU": "Плутоний" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index d8fc0a075..7fc11d66c 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], "title": { "en_US": "Polonium-210", - "uk_UA": "Полоній-210", + "uk_UA": "Полоній-210", "ru_RU": "Полоний-210" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index a23290a78..f612b2057 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], "title": { "en_US": "Polymer", - "uk_UA": "Полімер", + "uk_UA": "Полімер", "ru_RU": "Полимер" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 840c3234c..5aa58fbc3 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], "title": { "en_US": "Radium-226", - "uk_UA": "Радій-226", + "uk_UA": "Радій-226", "ru_RU": "Радий-226" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index b14267f2f..ba1381b17 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_rubber"]], "title": { "en_US": "Rubber", - "uk_UA": "Гума", + "uk_UA": "Гума", "ru_RU": "Резина" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index cbb4bf966..13f698a48 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], "title": { "en_US": "Silicon", - "uk_UA": "Кремній", + "uk_UA": "Кремній", "ru_RU": "Кремний" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 55fe5a061..72291dfac 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.powder_sodium"]], "title": { "en_US": "Sodium", - "uk_UA": "Натрій", + "uk_UA": "Натрій", "ru_RU": "Натрий" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index e25ef2fe4..7a2e2b105 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], "title": { "en_US": "Steel", - "uk_UA": "Сталь", + "uk_UA": "Сталь", "ru_RU": "Сталь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 84236f8d7..fb0722ecb 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.sulfur"]], "title": { "en_US": "Sulfur", - "uk_UA": "Сірка", + "uk_UA": "Сірка", "ru_RU": "Сера" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 4ff81b7d9..e736d524b 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], "title": { "en_US": "Tantalium", - "uk_UA": "Тантал", + "uk_UA": "Тантал", "ru_RU": "Тантал" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 294467b75..2d0a2dcf1 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], "title": { "en_US": "Technetium", - "uk_UA": "Технецій-99", + "uk_UA": "Технецій-99", "ru_RU": "Технеций" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index cbe61e652..768283d20 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], "title": { "en_US": "Technetium Steel", - "uk_UA": "Технецієва сталь", + "uk_UA": "Технецієва сталь", "ru_RU": "Технециевая сталь" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index 6af1f0d82..704e319f6 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], "title": { "en_US": "Thorium-232", - "uk_UA": "Торій-232", + "uk_UA": "Торій-232", "ru_RU": "Торий-232" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index 8fcdd5ad7..780953eb3 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], "title": { "en_US": "Uranium-233", - "uk_UA": "Уран-233", + "uk_UA": "Уран-233", "ru_RU": "Уран-233" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 772186fa9..cd949f50b 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], "title": { "en_US": "Uranium-235", - "uk_UA": "Уран-235", + "uk_UA": "Уран-235", "ru_RU": "Уран-235" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index 8791492b1..693c4317a 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], "title": { "en_US": "Uranium-238", - "uk_UA": "Уран-238", + "uk_UA": "Уран-238", "ru_RU": "Уран-238" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index adfd06926..c85bbbde1 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], "title": { "en_US": "Uranium", - "uk_UA": "Уран", + "uk_UA": "Уран", "ru_RU": "Уран" }, "content": { diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index d2fbdebf4..e53a8b270 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], "title": { "en_US": "Weapon Steel", - "uk_UA": "Збройова сталь", + "uk_UA": "Збройова сталь", "ru_RU": "Оружейная сталь" }, "content": { From 7505b72f7af16eddc83599cc7fe2ee5fdfd1b496 Mon Sep 17 00:00:00 2001 From: arantirnecrolord Date: Thu, 21 Aug 2025 13:07:19 +0300 Subject: [PATCH 253/323] pipirupirupirupipi --- src/main/resources/assets/hbm/manual/material/copper.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index 5a225d419..9c46250d1 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -9,7 +9,7 @@ }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", - "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", + "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." } } From 8ea7cf4080faf70a8e5f5dceafb523e7177aa8fb Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 22 Aug 2025 13:06:47 +0200 Subject: [PATCH 254/323] can't wait for people to complain about this one --- changelog | 6 +----- .../java/com/hbm/handler/BulletConfigSyncingUtil.java | 1 + .../java/com/hbm/handler/guncfg/GunEnergyFactory.java | 1 + .../java/com/hbm/handler/guncfg/GunNPCFactory.java | 1 + src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java | 1 + src/main/java/com/hbm/handler/imc/IMCCentrifuge.java | 1 + src/main/java/com/hbm/handler/imc/IMCCrystallizer.java | 1 + src/main/java/com/hbm/handler/imc/IMCHandler.java | 7 +++++++ src/main/java/com/hbm/tileentity/TileMappings.java | 10 +++++++++- src/main/java/com/hbm/util/Compat.java | 6 ++++++ 10 files changed, 29 insertions(+), 6 deletions(-) diff --git a/changelog b/changelog index d3d8a6554..67551c1c8 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,2 @@ ## Changed -* Blueprint folders can now be bought on bobmazon (64 for blue recipes, 256 for beige ones) - -## Fixed -* Fixed the QMAW loader crashing servers - * Oops \ No newline at end of file +* Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java index 3deab1d17..bf9cddaa0 100644 --- a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java +++ b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java @@ -5,6 +5,7 @@ import java.util.Map.Entry; import com.hbm.handler.guncfg.*; +@Deprecated public class BulletConfigSyncingUtil { private static HashMap configSet = new HashMap(); diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index d0e8e6bd7..dab6b35f3 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -4,6 +4,7 @@ import com.hbm.handler.BulletConfiguration; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; +@Deprecated public class GunEnergyFactory { public static BulletConfiguration getTurbineConfig() { diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index 8b5cb54bb..aa33eba4f 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -23,6 +23,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; +@Deprecated public class GunNPCFactory { public static BulletConfiguration getMaskmanOrb() { diff --git a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java index 7a99d4349..d553587bf 100644 --- a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java +++ b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java @@ -14,6 +14,7 @@ import net.minecraft.nbt.NBTTagList; * @author UFFR */ +@Deprecated public class IMCBlastFurnace extends IMCHandler { public static final ArrayList> buffer = new ArrayList<>(); diff --git a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java index 24456f70f..8fc5666cb 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java +++ b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +@Deprecated public class IMCCentrifuge extends IMCHandler { public static HashMap buffer = new HashMap(); diff --git a/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java b/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java index 9230bb11c..8ca219536 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java +++ b/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java @@ -13,6 +13,7 @@ import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +@Deprecated public class IMCCrystallizer extends IMCHandler { public static HashMap, CrystallizerRecipe> buffer = new HashMap(); diff --git a/src/main/java/com/hbm/handler/imc/IMCHandler.java b/src/main/java/com/hbm/handler/imc/IMCHandler.java index 22cd5a386..4aa650742 100644 --- a/src/main/java/com/hbm/handler/imc/IMCHandler.java +++ b/src/main/java/com/hbm/handler/imc/IMCHandler.java @@ -6,6 +6,13 @@ import com.hbm.main.MainRegistry; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; +/** + * I'm not aware of anyone even using these, and for proper addon mods it's way easier to use direct calls instead of messages. + * Too cumbersome to implement and maintain, especially since the recipe register listeners exist now. Current implementation will break on recipe reload anyway. + * + * @author hbm + */ +@Deprecated public abstract class IMCHandler { private static final HashMap handlers = new HashMap(); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 63bc3640e..250305afe 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -54,8 +54,9 @@ import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; import com.hbm.tileentity.turret.*; -import cpw.mods.fml.common.Loader; +import com.hbm.util.Compat; +import cpw.mods.fml.common.Loader; import net.minecraft.tileentity.TileEntity; public class TileMappings { @@ -480,5 +481,12 @@ public class TileMappings { if(IConfigurableMachine.class.isAssignableFrom(clazz)) { configurables.add((Class) clazz); } + + /** + * Causes problems with most machines where two independently acting tiles work together (TU machines, RBMKs, fluid transfer) + * Also breaks due to some sort of buffer leak in the threaded packets, if a boiler is involved (which uses a ByteBuf instead of the usual serializing) it crashes + * Ticking order of Torcherinos is AAA BBB CCC instead of ABC ABC ABC which can lead to some horrifying behavior + */ + Compat.blacklistAccelerator(clazz); } } diff --git a/src/main/java/com/hbm/util/Compat.java b/src/main/java/com/hbm/util/Compat.java index db59a6026..138b109ed 100644 --- a/src/main/java/com/hbm/util/Compat.java +++ b/src/main/java/com/hbm/util/Compat.java @@ -9,6 +9,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.eventhandler.EventBus; import cpw.mods.fml.common.eventhandler.IEventListener; import cpw.mods.fml.relauncher.ReflectionHelper; @@ -37,6 +38,7 @@ public class Compat { public static final String MOD_TC = "tc"; public static final String MOD_EIDS = "endlessids"; public static final String MOD_ANG = "angelica"; + public static final String MOD_TOR = "Torcherino"; public static Item tryLoadItem(String domain, String name) { return (Item) Item.itemRegistry.getObject(getReg(domain, name)); @@ -259,4 +261,8 @@ public class Compat { if(!world.getChunkProvider().chunkExists(x >> 4, z >> 4)) return null; return world.getTileEntity(x, y, z); } + + public static void blacklistAccelerator(Class clazz) { + FMLInterModComms.sendMessage("Torcherino", "blacklist-tile", clazz.getName()); + } } From aa045050a1d1d3c49eff110a5941353fa2cea827 Mon Sep 17 00:00:00 2001 From: CrpBnrz <2032217625@qq.com> Date: Sat, 23 Aug 2025 15:42:04 +0800 Subject: [PATCH 255/323] QMAW localization created by me --- .../resources/assets/hbm/manual/material/arsenic_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bakelite.json | 3 ++- src/main/resources/assets/hbm/manual/material/bismuth.json | 3 ++- .../resources/assets/hbm/manual/material/bismuth_bronze.json | 3 ++- src/main/resources/assets/hbm/manual/material/bscco.json | 5 +++-- src/main/resources/assets/hbm/manual/material/cadmium.json | 3 ++- .../resources/assets/hbm/manual/material/cadmium_steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/cinnabar.json | 3 ++- src/main/resources/assets/hbm/manual/material/coke.json | 3 ++- src/main/resources/assets/hbm/manual/material/copper.json | 3 ++- src/main/resources/assets/hbm/manual/material/desh.json | 3 ++- .../resources/assets/hbm/manual/material/ferrouranium.json | 3 ++- src/main/resources/assets/hbm/manual/material/graphite.json | 3 ++- src/main/resources/assets/hbm/manual/material/gunmetal.json | 3 ++- src/main/resources/assets/hbm/manual/material/hss.json | 3 ++- src/main/resources/assets/hbm/manual/material/latex.json | 3 ++- src/main/resources/assets/hbm/manual/material/lead.json | 3 ++- src/main/resources/assets/hbm/manual/material/mingrade.json | 3 ++- src/main/resources/assets/hbm/manual/material/neptunium.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-238.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-239.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-240.json | 5 +++-- .../resources/assets/hbm/manual/material/plutonium-241.json | 3 ++- .../resources/assets/hbm/manual/material/plutonium-rg.json | 3 ++- src/main/resources/assets/hbm/manual/material/plutonium.json | 3 ++- src/main/resources/assets/hbm/manual/material/polonium.json | 3 ++- src/main/resources/assets/hbm/manual/material/polymer.json | 3 ++- src/main/resources/assets/hbm/manual/material/radium.json | 3 ++- src/main/resources/assets/hbm/manual/material/rubber.json | 3 ++- src/main/resources/assets/hbm/manual/material/silicon.json | 3 ++- src/main/resources/assets/hbm/manual/material/sodium.json | 3 ++- src/main/resources/assets/hbm/manual/material/steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/sulfur.json | 3 ++- src/main/resources/assets/hbm/manual/material/tantalium.json | 5 +++-- .../resources/assets/hbm/manual/material/technetium.json | 3 ++- .../assets/hbm/manual/material/technetium_steel.json | 3 ++- src/main/resources/assets/hbm/manual/material/thorium.json | 3 ++- .../resources/assets/hbm/manual/material/uranium-233.json | 3 ++- .../resources/assets/hbm/manual/material/uranium-235.json | 3 ++- src/main/resources/assets/hbm/manual/material/uranium.json | 3 ++- 40 files changed, 82 insertions(+), 43 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index a3feacd14..2b99f895c 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -10,6 +10,6 @@ "content": { "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]].", - "zh_CN": "使用[[砷|Arsenic]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造了[[RBMK]]之后才能获得,因为提取砷需要用到[[高性能溶剂|High-Performance Solvent]]。

和[[铋青铜|Bismuth Bronze]]完全通用。" + "zh_CN": "使用[[砷|Arsenic]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造[[RBMK]]之后获得,因为提取砷需要用到[[高性能溶剂|High-Performance Solvent]]。

和[[铋青铜|Bismuth Bronze]]完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index 27da9b801..91066d846 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", - "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах." + "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах.", + "zh_CN": "[[聚合物|Polymer]]的替代品,使用处理[[裂化油|Catalytic Cracking Tower]]得到的产品之一[[芳香烃|Aromatic Hydrocarbons]]制作。在所有配方中与聚合物完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 4ac2846b0..cd9fcd48d 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", - "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]]." + "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]].", + "zh_CN": "一种重金属,最初可使用[[SILEX]]回收枯竭的[[RBMK]]燃料获取,之后也可在基岩矿石处理的后期步骤中,使用[[高性能溶剂|Hing-Performance Solvent]]处理矿石获取。主要用于制作[[铋青铜|Bismuth Bronze]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index e583f359b..dfec1324c 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", - "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]]." + "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]].", + "zh_CN": "使用[[铋|Bismuth]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造[[RBMK]]之后获得。

和[[砷青铜|Arsenic Bronze]]完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index 941023847..74947967d 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -5,10 +5,11 @@ "title": { "en_US": "BSCCO", "ru_RU": "BSCCO", - "zh_CN": "BSCCO" + "zh_CN": "BSCCO超导体" }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", - "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]]." + "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]].", + "zh_CN": "强力的超导体,用于制作高等级的电路及用于[[粒子加速器|Particle Accelerator]]的线圈。需要[[铋|Bismuth]]制作,因此只能在建造[[RBMK]]后获得。" } } diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 2cd72905f..92c03694e 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", - "ru_RU": "Изготовлен путём обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]]." + "ru_RU": "Изготовлен путём обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]].", + "zh_CN": "使用[[高性能溶剂|High-Performance Solvent]]处理芥子柳叶获取。用于制作[[PVC]],也可用于游戏后期的[[橡胶|Rubber]]替代配方,以及制作[[锝钢|Technetium Steel]]的替代品[[镉钢|Cadmium Steel]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index 2cdcf5bd6..2780b16d1 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", - "ru_RU": "Коррозионно-стойкий сплав, изготовленный из [[стали|Steel]] и [[кадмия|Cadmium]]. Альтернатива [[технециевой стали|Technetium Steel]] в большинстве рецептов." + "ru_RU": "Коррозионно-стойкий сплав, изготовленный из [[стали|Steel]] и [[кадмия|Cadmium]]. Альтернатива [[технециевой стали|Technetium Steel]] в большинстве рецептов.", + "zh_CN": "由[[钢|Steel]]和[[镉|Cadmium]]制成的耐腐蚀合金,可在大部分配方中替代[[锝钢|Technetium Steel]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index 959b7780e..ff0a50188 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", - "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]].", + "zh_CN": "稀有矿物,可[[酸化|Ore Acidizer]]为相当于375mB流体的[[水银|Mercury]]液滴,也可[[炼焦|Combination Oven]]为100mB水银和一个硫粉。其主要作为获取生产[[Desh]]需要的水银的早期手段。" } } diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index 72dfa40b6..c48c773dd 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", - "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]]." + "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]].", + "zh_CN": "高纯度的碳,其热值为煤炭的两倍。可被锻压为[[石墨|Graphite]],也可用于多种炼[[钢|Steel]]配方或作为[[坩埚|Crucible]]中碳的来源。

煤焦炭可通过在熔炉中烧炼煤球获取,或在复式炼焦炉中炼焦各种形式的煤炭获取。

褐煤焦炭可以以更廉价且品质更低的褐煤为原料,通过相同的方式获取, 尽管其特性与煤焦炭完全相同。

石油焦炭可通过在[[复式炼焦炉|Combination Oven]]中炼焦焦油(煤焦油除外)获取,也可通过在[[焦化装置|Coking Unit]]中焦化多种油获取。" } } diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index c81e68332..4ed4dbfae 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", - "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." + "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]].", + "zh_CN": "常见资源。纯铜主要用作结构材料,或在能够承受高温的设备中使用(作热导体); 铜的多种合金用途极广。

[[紫铜|Minecraft Grade Copper]]是红石和铜的合金,几乎所有电力设备都使用紫铜。

[[高级合金|Advanced Alloy]]是前期强力的装备材料,其性能优于钻石。

[[炮铜|Gunmetal]]是制作多种枪炮必不可少的材料,同时也用于制造弹壳。

[[铋青铜|Bismuth Bronze]]和[[砷青铜|Arsenic Bronze]]是 [[RBMK]] 后的材料,用于制作多种后期机器。

[[BSCCO]]是一种由铋衍生的超导体,高等级的量子电路和[[粒子加速器|Particle Accelerator]]线圈都需要BSCCO超导体制作。" } } diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index 255772f18..0a68e93e6 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", - "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.", + "zh_CN": "在[[化工厂|Chemical Plant]]中制成的高强度工作合金,需要基础[[原油|Crude Oil]]精炼的产物[[轻油|Light Oil]]、[[离心|Centrifuge]]红石矿石得到的副产物[[水银|Mercury]]以及[[粉碎|Shredder]]稀土矿石块得到的Desh混合物制作。

用于制作多种物品,特别是工具和武器。Desh制工具挖掘速度较慢且挖掘等级 只相当于铁制工具,但其是最早可获得的无法破坏的工具之一,而且具有多个工具 能力。" } } diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 9d6c3efcc..231415c43 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", - "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах." + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах.", + "zh_CN": "[[钢|Steel]]与[[铀-238|Uranium-238]]的合金,在坩埚中制成。 主要用于制作贫铀混凝土、武器部件和高爆弹药。" } } diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 7ea9d69a8..726def52f 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", - "ru_RU": "Изготавливается путём прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]]." + "ru_RU": "Изготавливается путём прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]].", + "zh_CN": "通过锻压焦炭获取。用于核反应堆、[[电弧炉|Electric Arc Furnace]]电极,也可作为部分[[坩埚|Crucible]]配方中碳的来源。" } } diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index b7c339dcc..522c94b84 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", - "ru_RU": "Сплав из [[алюминия|Aluminium]] и [[меди|Copper]]. Может быть изготовлен на наковальне или более эффективно в [[роторной печи|Rotary Furnace]]. В основном используется для деталей оружия, а также для гильз большинства боеприпасов." + "ru_RU": "Сплав из [[алюминия|Aluminium]] и [[меди|Copper]]. Может быть изготовлен на наковальне или более эффективно в [[роторной печи|Rotary Furnace]]. В основном используется для деталей оружия, а также для гильз большинства боеприпасов.", + "zh_CN": "[[铝|Aluminium]]和[[铜|Copper]]的合金。可在砧中制作,也可在[[回转炉|Rotary Furnace]]中更高效地制作。主要用于制作武器部件,也用于制作大部分弹壳。" } } diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index ebc3d25a2..a1f215049 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", - "ru_RU": "Сплав из [[стали|Steel]], [[вольфрама|Tungsten]] и [[кобальта|Cobalt]], изготовленный в [[плавильне|Crucible]]. Создается в виде жидкого металла, требует отливки в форму слитка или пластины перед использованием." + "ru_RU": "Сплав из [[стали|Steel]], [[вольфрама|Tungsten]] и [[кобальта|Cobalt]], изготовленный в [[плавильне|Crucible]]. Создается в виде жидкого металла, требует отливки в форму слитка или пластины перед использованием.", + "zh_CN": "[[钢|Steel]、[[钨|Tungsten]]、[[钴|Cobalt]]的合金,在[[坩埚|Crucible]]中制成。制造出的高速钢为熔融状态, 在使用前需要将其铸造成锭或板的形式。" } } diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index 73a7d88ce..39aff6376 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", - "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путём прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот." + "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путём прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот.", + "zh_CN": "橡胶的天然形态,可用蒲公英合成获得或锻压丛林木获得。可在所有配方中被[[橡胶|Rubber]]替代,反之则不行。" } } diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index 1232d2f1d..f782b0e50 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", - "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем." + "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем.", + "zh_CN": "常见资源,主要用于涉及辐射的设备,也用于制作弹药,以及用作电路板的焊料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index f231f2b4b..a78cfd1bc 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", - "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проводов." + "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проводов.", + "zh_CN": "等量的铜和红石在[[高炉|Blast Furnace]]中制作的合金。 主要以线的形式用于几乎所有电力设备。" } } diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index adb08aa9b..a97d4c7af 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", - "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]].", + "zh_CN": "一种易裂变同位素,主要存在于枯竭的[[铀-235|Uranium-235]]燃料中。 主要用于核反应堆,纯净的镎既可直接用作高浓缩度镎燃料,也可和[[铀-238|Uranium-238]]混合为中浓缩度镎燃料。可用于[[PWR]]和[[RBMK]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index 7e8406d2e..21f9396e4 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", - "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий." + "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий.", + "zh_CN": "放射性同位素,主要用于[[RTG]]。可从六氟化[[钚|Plutonium]]中提取,也可从一些核燃料(主要是含[[铀-235|Uranium-235]]的种类)中分离得到。可与[[铍|Beryllium]]混合制成钚-238-铍中子源,用于[[RBMK]]反应堆。

放射性中等,高温。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index 6c893050f..381d0383c 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", - "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен.", + "zh_CN": "[[钚|Plutonium]]主要的易裂变同位素,可从多种使用[[铀-238|Uranium-238]]的核燃料中提取,或直接从[[反应堆级钚|Reactor-Grade Plutonium]]中分离得到。可在多种反应堆中用作高浓缩度燃料,也可与其他同位素混合制成 浓缩度较低的燃料,还可在多种核弹中用作裂变材料。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index c14ae8f38..9626ebb5e 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -8,7 +8,8 @@ "zh_CN": "钚-240" }, "content": { - "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", - "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]]." + "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or in specialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", + "zh_CN": "[[钚|Plutonium]]和[[反应堆级钚|Reactor-Grade Plutonium]]中存在的不易裂变同位素。仅有的用途是手动与[[钚-239|Plutonium-239]]混合为反应堆级钚,或与[[锆|Zirconium]]一同制成专用于增殖的ZFB燃料棒,以在[[RBMK]]中生产[[钚-241|Plutonium-241]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 79df83f71..1720d6d21 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", - "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен.", + "zh_CN": "[[钚|Plutonium]]次要的易裂变同位素,可从枯竭的富含[[钚-240|Plutonium-240]]的[[RBMK]]燃料及特定种类的[[锆|Zirconium]]快速增殖燃料(ZFB)中提取。 仅用于专用的增殖燃料,或用作比相应的[[钚-239|Plutonium-239]]燃料更强力的高浓缩度燃料。再处理用于RBMK的钚-241燃料时 可以得到[[镅-241|Americium-241]]和[[镅-242|Americium-242]]。

放射性较强。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index 664af5785..4ba98b167 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", - "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащённое плутониевое топливо.

Умеренно радиоактивен." + "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащённое плутониевое топливо.

Умеренно радиоактивен.", + "zh_CN": "[[钚-239|Plutonium-239]]和[[钚-240|Plutonium-240]]的混合物。是再处理多种[[铀|Uranium]]基燃料的常见产物,也是在[[芝加哥反应堆|Chicago Pile]]中增殖铀的常见产物。可在多种反应堆中用作中浓缩度燃料。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 72a9c21ad..9986060ed 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", - "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]" + "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", + "zh_CN": "不纯钚的稀有形式,由钚-238、钚-239、钚-240组成。 钚的矿石形式默认禁用。钚可以以六氟化钚的形式在[[气体离心机|Gas Centrifuge]]中处理,也用于某些[[回旋加速器|Cyclotron]]配方。

放射性中等。

另见:
[[钚-238|Plutonium-238]]
[[钚-239|Plutonium-239]]
[[钚-240|Plutonium-240]]
[[钚-241|Plutonium-241]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index 07f59e7d9..22d740895 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", - "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." + "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", + "zh_CN": "再处理[[镭-226|Radium-226]]中子源时得到的放射性同位素。可用于[[RTG]],也可与[[铍|Beryllium]]混合为钋-210-铍中子源,用于[[RBMK]]。

放射性强,高温。" } } diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 42f8dda92..ade503072 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", - "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].

Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]]." + "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].

Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]].", + "zh_CN": "聚合物(“特氟龙”)是第一种可获取的塑料。需要[[石油气|Petroleum Gas]]制作,因此需要 [[原油处理|Crude Oil]]。和[[电木|Bakelite]]完全通用,后者在获得[[催化裂化塔|Catalytic Cracking Tower]]后才可制作。" } } diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 8e77e9563..06d698267 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", - "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен.", + "zh_CN": "稀有的放射性物质,存在于[[铀|Uranium]]矿石和[[钍|Thorium]]矿石中,可通过[[离心机|Centrifuge]]提取。可与[[铍|Beryllium]]混合得到启动[[芝加哥反应堆|Chicago Pile]]、[[RBMK]]、[[PWR]]、[[研究型反应堆|]]必须的镭-226-铍中子源。是最早可获得的中子放射源,而且通常也是最便宜的。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index 6329a6f39..671e9980a 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", - "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах." + "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", + "zh_CN": "一种石化产品,衍生自[[不饱和烃|Unsaturated Hydrocarbons]]和[[硫|Sulfur]]。至少需要一台[[催化裂化塔|Catalytic Cracking Tower]]才能制作。可在所有配方中替代[[乳胶|Latex]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 57a2298ed..ebc5a87b7 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", - "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]]." + "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]].", + "zh_CN": "生产集成电路以及其他比模拟电路更加复杂的电路的重要材料。可通过使用[[电弧炉|Electric Arc Furnace]]冶炼含二氧化硅的物品(如普通沙子、下界石英、玻璃纤维、燧石和[[石棉|Asbestos]])获取。主要的应用形式为在[[锻压机|Burner Press]]中经电路板锻模锻压的晶圆(即坯料),这些晶圆随后被用来制作多种微处理器。 因为其制作需要电弧炉,硅只能在获得[[聚合物|Polymer]]后制作,因此需要[[原油处理|Crude Oil]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 0a42d0063..353a3e09b 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", - "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]]." + "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]].", + "zh_CN": "主要通过方钠石获取,方钠石可作为多种矿石的[[离心|Centrifuge]]副产物获得。其液体形式可用作强力的[[PWR]]冷却剂。" } } diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index 1fcaba283..501adce8d 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", - "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путём комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]]." + "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путём комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]].", + "zh_CN": "铁的升级版,是一种基础金属,几乎所有东西都要用到钢。最初可通过在[[高炉|Blast Furnace]]中混合煤炭和铁获取,而之后也有通过[[坩埚|Crucible]]和[[回转炉|Rotary Furnace]]制作的高级配方。" } } diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 6b758020d..e6ed22ab1 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", - "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя." + "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", + "zh_CN": "常见矿物,在下界的生成量更多。用于多种配方,例如制作[[硫酸|Sulfuric Acid]]和 [[橡胶|Rubber]],也用于制作黄饼,作为合成六氟化[[铀|Uranium]]的原料。 也可用于制作火药、火柴,以及用作黄色染料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 248b0414e..d57799c4f 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -5,10 +5,11 @@ "title": { "en_US": "Tantalium", "ru_RU": "Тантал", - "zh_CN": "钛" + "zh_CN": "钽" }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", - "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." + "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб.", + "zh_CN": "钽可从仅生成在特定区域的[[钶钽铁矿|Coltan]]中提取。 主要用于制作钽电容器,钽电容器可作为大多数核弹所需的控制单元的重要原料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index c1228b425..b41775011 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", - "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен." + "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", + "zh_CN": "人工合成的金属元素,初期可通过再处理[[锆诺克斯|ZIRNOX]]和[[PWR]]的枯竭燃料获取。也可通过回收某些[[RBMK]]燃料或使用高性能溶剂处理[[基岩矿石|Bedrock Ore]]获取。

主要用于制作[[锝钢|Technetium Steel]]。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index 13e14ae80..fe47be061 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", - "ru_RU": "Сплав из [[стали|Steel]] и [[технеция|Technetium]]. Устойчив к коррозии, используется в более прочных резервуарах для жидкостей и во многих продвинутых машинах. Доступен после [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]], так как технеций является синтетическим.

Полностью взаимозаменяем с [[кадмиевой сталью|Cadmium Steel]]." + "ru_RU": "Сплав из [[стали|Steel]] и [[технеция|Technetium]]. Устойчив к коррозии, используется в более прочных резервуарах для жидкостей и во многих продвинутых машинах. Доступен после [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]], так как технеций является синтетическим.

Полностью взаимозаменяем с [[кадмиевой сталью|Cadmium Steel]].", + "zh_CN": "[[钢|Steel]]和[[锝|Technetium]]的合金,耐腐蚀,用于制作强度更高的液体储罐和多种高级机器。 由于锝需要人工制造,因此只能在建造[[锆诺克斯|ZIRNOX]]或[[PWR]]之后获取。

和[[镉钢|Cadmium Steel]]完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index da6ff95c0..5f08db13a 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", - "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен." + "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен.", + "zh_CN": "可增殖的同位素,增殖后产生[[铀-233|Uranium-233]]。可通过在[[RBMK]]中辐照或与铀-233混合得到[[钍燃料|Thorium Fuel]]。 总体来讲,由钍衍生的燃料成本较低,但能量不高。 也可用于[[液态钍盐|Liquid Thorium Salt]],其可作为一种强力的[[PWR]]冷却剂(同时将反应堆变成熔盐堆),同时快速产生大量铀-233。

略有放射性。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index a87552a1d..7ad84b1a3 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", - "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен.", + "zh_CN": "人工制造的易裂变(即能够用于反应堆)的铀同位素,可通过再处理[[钍基燃料|Thorium Fuel]]获取。总体来讲,高浓缩度的铀-233较基于铀-235的燃料更加强力。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 3c6e4d4ae..b14bc19ae 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", - "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." + "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен.", + "zh_CN": "浓缩的铀,容易裂变,可直接作为高浓缩度燃料用于某些反应堆,也可与[[铀-238|Uranium-238]]混合回中浓缩度的铀燃料。 也是一种武器级的同位素。最初可通过在四台串联的[[气体离心机|Gas Centrifuge]]中处理[[六氟化铀|Uranium Hexafluoride]]获取,之后也可直接在[[SILEX]]中 分离[[天然铀|Uranium]]获取。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index 8f18b8df7..b54a373cf 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -9,6 +9,7 @@ }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", - "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" + "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", + "zh_CN": "天然铀,具有微弱放射性。本身不太容易裂变,但可通过将其变为[[六氟化铀|Uranium Hexafluoride]]并在[[气体离心机|Gas Centrifuge]]中处理以将其浓缩。[[锆诺克斯|ZIRNOX]],[[RBMK]]和[[芝加哥反应堆|Chigago Pile]]可直接将未浓缩铀用作燃料。

另见:
[[铀-233|Uranium-233]]
[[铀-235|Uranium-235]]
[[铀-238|Uranium-238]]" } } From ee1ffc98bae9d55f69daecca97733bf0613bafaf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 21 Aug 2025 21:35:54 +0300 Subject: [PATCH 256/323] Make murky wings more controllable --- src/main/java/com/hbm/items/armor/WingsMurk.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index daec63319..7906daf55 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -100,7 +100,7 @@ public class WingsMurk extends JetpackBase { Vec3 orig = player.getLookVec(); Vec3 look = Vec3.createVectorHelper(orig.xCoord, 0, orig.zCoord).normalize(); - double mod = player.isSneaking() ? 0.25D : 1D; + double mod = player.isSneaking() ? 0.25D : player.isSprinting() ? 1D : 0.5D; if(player.moveForward != 0) { player.motionX += look.xCoord * 0.35 * player.moveForward * mod; From 16824452b0b7f69635b7d288170b3059cca55f49 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 23 Aug 2025 19:33:08 +0300 Subject: [PATCH 257/323] Better fine control Shift already introduces a slowdown, no need to account for that --- src/main/java/com/hbm/items/armor/WingsMurk.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index 7906daf55..f9e573683 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -100,7 +100,7 @@ public class WingsMurk extends JetpackBase { Vec3 orig = player.getLookVec(); Vec3 look = Vec3.createVectorHelper(orig.xCoord, 0, orig.zCoord).normalize(); - double mod = player.isSneaking() ? 0.25D : player.isSprinting() ? 1D : 0.5D; + double mod = player.isSprinting() ? 1D : 0.25D; if(player.moveForward != 0) { player.motionX += look.xCoord * 0.35 * player.moveForward * mod; From bdd56b6062d73c4f159e011b545ceef4240a7f22 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Tue, 19 Aug 2025 23:30:34 +0300 Subject: [PATCH 258/323] Remove murky wings forced slowfall --- src/main/java/com/hbm/items/armor/WingsMurk.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index f9e573683..3828052cc 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -1,6 +1,7 @@ package com.hbm.items.armor; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.ArmorModHandler; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; import com.hbm.render.model.ModelArmorWings; @@ -51,13 +52,12 @@ public class WingsMurk extends JetpackBase { if(player.fallDistance > 0) player.fallDistance = 0; - if(player.motionY < -0.4D) - player.motionY = -0.4D; - if(this == ModItems.wings_limp) { + + if(player.motionY < -0.4D) + player.motionY = -0.4D; - if(player.isSneaking()) { - + if(player.isSneaking()) { if(player.motionY < -0.08) { double mo = player.motionY * -0.2; From 0ac72afa97e58c7e4edad3201fcef56f633f33ab Mon Sep 17 00:00:00 2001 From: abel1502 Date: Tue, 19 Aug 2025 23:43:32 +0300 Subject: [PATCH 259/323] Make murky wings support shift+space for hovering --- .../java/com/hbm/items/armor/WingsMurk.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index 3828052cc..e9e7a52a5 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -81,10 +81,26 @@ public class WingsMurk extends JetpackBase { if(props.isJetpackActive()) { - if(player.motionY < 0.6D) - player.motionY += 0.2D; - else - player.motionY = 0.8D; + if(player.isSneaking()) { + if(player.motionY < -1) + player.motionY += 0.4D; + else if(player.motionY < -0.1) + player.motionY += 0.2D; + else if(player.motionY < 0) + player.motionY = 0; + else if(player.motionY > 1) + player.motionY -= 0.4D; + else if(player.motionY > 0.1) + player.motionY -= 0.2D; + else if(player.motionY > 0) + player.motionY = 0; + + } else { + if(player.motionY < 0.6D) + player.motionY += 0.2D; + else + player.motionY = 0.8D; + } } else if(props.enableBackpack && !player.isSneaking()) { From 9e99a219691dad8ed1f766805b446ee75b8ae5ed Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 23 Aug 2025 19:36:45 +0300 Subject: [PATCH 260/323] Remove unused import --- src/main/java/com/hbm/items/armor/WingsMurk.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index e9e7a52a5..c76c42fda 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -1,7 +1,6 @@ package com.hbm.items.armor; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.handler.ArmorModHandler; import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; import com.hbm.render.model.ModelArmorWings; From fb4bca354480b7544bec53cdd406b19f486e14f8 Mon Sep 17 00:00:00 2001 From: Bufka2011 <85364803+Bufka2011@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:13:02 -0600 Subject: [PATCH 261/323] Add files via upload --- src/main/resources/assets/hbm/lang/ru_RU.lang | 410 +++++++++++------- 1 file changed, 247 insertions(+), 163 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index cf1ef26da..154e215fa 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -14,7 +14,7 @@ achievement.bossCreeper.desc='Здесь есть ядерные криперы? achievement.bossCreeper=Бомба на четырёх ногах achievement.bossMaskman.desc=Врезать большому мальчику. achievement.bossMeltdown.desc=Скорее ужасно, чем отлично, но я приму то, что могу получить. -achievement.bossMaskman=6 месяцев срочной службы, и всё что я получил это паршивая футболка +achievement.bossMaskman=6 месяцев срочной службы, и всё, что я получил, это паршивая футболка achievement.bossMeltdown=3.6 рентген achievement.bossWorm.desc=Просто маленький металический червь. achievement.bossWorm=Разборка Баллс-О-Трон @@ -148,7 +148,7 @@ armor.explosionImmune=Не может получить никакого урон armor.fasterReload=Быстрая перезарядка armor.fastFall=Быстрое падение armor.fireproof=Огнеупорность -armor.fullSetBonus=Бонусы Полного Набора брони: +armor.fullSetBonus=Бонусы полного набора брони: armor.geigerHUD=Встроенный HUD счётчика Гейгера armor.geigerSound=Звуковой Счётчик Гейгера armor.glider=Присесть, чтобы спланировать @@ -274,7 +274,7 @@ book.starter.cover=Руководство промышленника$по вос book.starter.title1=Вступление book.starter.page1=Если вы читаете это, то весьма вероятно, что общество, так или иначе, полностью рухнуло. Правительства, страны и власть - это концепция прошлого, вместе со всеми удобствами цивилизованной жизни. Таким образом, это руководство расскажет вам,как изменить это, воссоздав индустрию и технологии прошлого для улучшения вашей собственной жизни. book.starter.title2=Уголь и горчичный газ -book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в её нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. +book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в её нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешёвый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. book.starter.title3=Наковальни и прессы book.starter.page3=Квинтэссенцией для начала вашего промышленного возрождения являются §lнаковальня§r и §lпресс§r. Наковальня позволит вам вручную создавать ранние механизмы, такие как сборочная машина, в то время как пресс позволит вам изготавливать пластины, провода и схемы, которые вы не можете сделать с помощью наковальни. book.starter.title4=Шаблоны @@ -299,7 +299,7 @@ book.starter.title12=Радиация book.starter.page12a=§oОстальная часть этой книги будет посвящена вопросам, связанным с §oрадиацией. Для вашей безопасности и безопасности других людей я дам вам §oсоветы о том, как смягчить воздействие и справиться с ней. book.starter.page12b=Достаточное воздействие радиации может привести и приведет к телесным повреждениям. Первый шаг - это внешняя защита; обязательно ограничьте свое воздействие и наденьте защитное снаряжение, например §lЗащитный костюм§r, или прикрепить §lОбшивку§r к вашей одежде или броне; вы также можете принять §lРад-X§r чтобы ограничить получаемую дозу. Спасибо современной медицине, вторым шагом может быть удаление, если это необходимо; например, §l"Обеззараживатель §lигрока"§r будет медленно уменьшать излучение, поглощённое вашим телом. §lАнтирадин§r может быть использован как профилактика при облучении, быстро и эффективно устраняя повреждения, причиненные вашему организму ионизирующим излучением. book.starter.title13=Обогащение урана -book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. +book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lжёлтый кек§r, а затем в §lГексафторид §lурана§r. book.starter.title14=Чикагская поленница book.starter.page14=В качестве альтернативы вы можете получить §lРеакторный плутоний§r, более мощное топливо, из природного урана, используя §lЧикагскую поленницу§r. Укладывая графитовые блоки и сверля их, вы можете вставить топливные стержни для размножения в плутоний и стержни источников нейтронов, такие как §lРадий-Бериллий§r, чтобы начать реакцию. Обязательно протестируйте свои конструкции; для предотвращения перегрева может потребоваться разделение или ограничение количества блоков. book.starter.title15=ЦИРНОКС РГО @@ -355,7 +355,7 @@ book_lore.book_iodine.name=Заметка book_lore.book_iodine.author=Дейв book_lore.book_iodine.page.0=Лады, вы не поверите, но старик Везэрвэйн наконец объявился через две недели после своего ухода и, что ещё более впечатляюще, он раскололся на тему своих занятий в каньоне: book_lore.book_iodine.page.1=Похоже, дебилы из НИОКР обнаружили соединение, в основном неорганическое, очень схожее с токсином, но вникните: умирающие клетки воспроизводят и выделяют его во внешнюю среду, создавая чрезвычайно заразный аэрозоль. -book_lore.book_iodine.page.2=Оно как вирус, но не вирус. Состав странный, его можно замешать в любой бутылке, но лишь в нужном порядке. Док сказал, что первый реактив это просто измельченные кристаллы иода, идущие в ячейку %d. +book_lore.book_iodine.page.2=Оно как вирус, но не вирус. Состав странный, его можно замешать в любой бутылке, но лишь в нужном порядке. Док сказал, что первый реактив это просто измельчённые кристаллы иода, идущие в ячейку %d. book_lore.book_phosphorous.name=Заметка book_lore.book_phosphorous.author=Дейв @@ -447,7 +447,7 @@ book_lore.bf_bomb_5.page.0=Я просто... не могу с этим спра book_lore.bf_bomb_5.page.1=Мы только что получили ещё одну порцию чистого жар-огня, а он нашел необходимое электрооборудование и источник энергии, чтобы проверить свое предположение. Я не знаю, что стало причиной (было ли запущено оборудование? Он начал слишком рано?), но оно свершилось мучительно медленно, book_lore.bf_bomb_5.page.2=когда зелёный свет поглотил стол, батарею и доктора Мелфина, стоящего всего в метре от него. Даже когда стол превратился в лужу кипящего металла на полу, он не загорелся. Я не знаю, что я увидел в его глазах... $$ Ужас или трепет, book_lore.bf_bomb_5.page.3=может из-за того, что он ещё жив? Чем бы ни был наш "чудо" материал, его это не волновало. В следующий момент он исчез в яркой вспышке света. Он испарился? сгорел? аннигилирован? Отошлите меня хоть в грёбаный ад, я больше ничего не знаю! -book_lore.bf_bomb_5.page.4=Меня тошнит от главного исследователя. Он звиздел, что мы могли бы быть более осторожными, продолжать просто кружить вокруг, какую-то ещё подымающую мораль чепуху. Этот тупой урод никогда не поймет, что играя с огнем, можно обжечься. $ Я не стал заморачиваться с +book_lore.bf_bomb_5.page.4=Меня тошнит от главного исследователя. Он звиздел, что мы могли бы быть более осторожными, продолжать просто кружить вокруг, какую-то ещё подымающую мораль чепуху. Этот тупой урод никогда не поймет, что, играя с огнем, можно обжечься. $ Я не стал заморачиваться с book_lore.bf_bomb_5.page.5=увольнением, просто забрал свои шмотки и побежал к холмам. В любом случае, неважно; учитывая отсутствие звонков и грибовидное облако, поднявшееся над моим (теперь уже бывшим) местом работы, они взорвали всё либо перешли в полное распоряжение военных. book_lore.bf_bomb_5.page.6=Есть важное различие между диссекцией и ВИВИСЕКЦИЕЙ, что они явно упустили из виду. Они могут рассекать металлы или атомы сколько угодно, но вторгаться внутрь, вивисекцировать саму реальность – это значит лишь порождать новых докторов Мелфинов. Кто знает! book_lore.bf_bomb_5.page.7=В конце-концов, правительство стремится превратить эту херню в бомбы, может, мы увидим ещё пару войн, ещё пару миллионов людей, встретивших судьбу хуже смерти. Они не могут прятать это вечно. $ $ Меня это не волнует. Теперь не волнует. Боже, пожалуйста, позволь мне вернуться @@ -584,7 +584,7 @@ chem.ethanol=Этанол chem.biogas=Биогаз chem.biofuel=Переэтерификация биотоплива chem.reoil=Регенерированное масло -chem.gasoline=Бензин +chem.gasoline=Газолин chem.tarsand=Битум из битумозного песка chem.meatprocessing=Переработка мяса глифидов chem.birkeland=Азотная кислота из воздуха @@ -630,7 +630,7 @@ chem.FC_DIESEL_KEROSENE=Крекинг дизеля chem.FC_GAS_PETROLEUM=Крекинг попутного газа chem.FC_I_NAPHTHA=Крекинг промышленного масла chem.FC_KEROSENE_PETROLEUM=Крекинг керосина -chem.FP_HEAVYOIL=Переработка тяжелой нефти +chem.FP_HEAVYOIL=Переработка тяжёлой нефти chem.FP_LIGHTOIL=Переработка лёгкой нефти chem.FP_NAPHTHA=Переработка нафты chem.FP_SMEAR=Переработка промышленного масла @@ -696,7 +696,7 @@ chem.VIT_GAS=Остекловывание газообразных ядерны chem.VIT_LIQUID=Остекловывание жидких ядерных отходов chem.XENON=Ксеноновый цикл Линде chem.XENON_OXY=Улучшенный ксеноновый цикл Линде -chem.YELLOWCAKE=Производство йеллоукейка +chem.YELLOWCAKE=Производство жёлтого кека commands.satellite.no_active_satellites=Нет активных спутников! commands.satellite.no_satellite=Спутник не найден! @@ -770,7 +770,7 @@ container.generator=Ядерный реактор container.hadron=Ускоритель частиц container.heaterFirebox=Топка container.heaterHeatex=Теплообменник -container.heaterOilburner=Жидкостный бойлер +container.heaterOilburner=Жидкостный котёл container.heaterOven=Нагревательная печь container.hydrotreater=Гидроочиститель container.iGenerator=Промышленный генератор @@ -849,7 +849,7 @@ container.pumpjack=Станок-качалка container.radGen=Радиационный двигатель container.radar=Радар container.radiobox=FM передатчик -container.radiolysis=РИТЭГ и Камера Радиолиза +container.radiolysis=РИТЭГ и камера радиолиза container.radiorec=FM радио container.rbmkAutoloader=Автозагрузчик стержней РБМК container.rbmkBoiler=Паровой канал РБМК @@ -910,7 +910,7 @@ copytool.invertFilter=Инвертированный фильтр copytool.orientation=Ориентация copytool.pattern0=Красная сторона copytool.pattern1=Оранжевая сторона -copytool.pattern2=Желтая сторона +copytool.pattern2=Жёлтая сторона copytool.pattern3=Зелёная сторона copytool.pattern4=Синяя сторона copytool.pattern5=Фиолетовая сторона @@ -923,7 +923,7 @@ crucible.cdalloy=Производство кадмиевой стали crucible.cmb=Производство стали Альянса crucible.ferro=Производство ферроуранового сплава crucible.hematite=Переплавка гематита в железо -crucible.hss=Производство высокоскоростной стали +crucible.hss=Производство быстрорежущей стали crucible.malachite=Переплавка малахита в медь crucible.magtung=Производство намагниченного вольфрама crucible.redcopper=Производство красной меди @@ -952,7 +952,7 @@ death.attack.amsCore=%1$s испарился в огне сингулярнос death.attack.asbestos=%1$s теперь имеет право на финансовую компенсацию. death.attack.bang=%1$s превратился в рагу. death.attack.blackhole=%1$s превратился в спагетти. -death.attack.blacklung=%1$s умер от болезни черных лёгких. +death.attack.blacklung=%1$s умер от болезни чёрных лёгких. death.attack.blender=%1$s стал фаршем. death.attack.boat=%1$s был пришиблен лодкой. death.attack.boil=%1$s был заживо сварен %2$s. @@ -1473,6 +1473,7 @@ hbmfluid.coalgas=Угольный газ hbmfluid.coalgas_leaded=Этилированный угольный газ hbmfluid.coaloil=Фотоген hbmfluid.colloid=Коллоидный раствор +hbmfluid.concrete=Жидкий бетон hbmfluid.coolant=Хладагент hbmfluid.coolant_hot=Горячий хладагент hbmfluid.crackoil=Крекированная нефть @@ -1497,7 +1498,7 @@ hbmfluid.gasoline=Газолин hbmfluid.gasoline_leaded=Этилированный газолин hbmfluid.heatingoil=Мазут hbmfluid.heatingoil_vacuum=Тяжёлый мазут -hbmfluid.heavyoil=Тяжелая нефть +hbmfluid.heavyoil=Тяжёлая нефть hbmfluid.heavyoil_vacuum=Вакуумная тяжёлая нефть hbmfluid.heavywater=Тяжёлая вода hbmfluid.heavywater_hot=Горячая тяжёлая вода @@ -1540,9 +1541,9 @@ hbmfluid.oil_ds=Десульфуризованная неочищенная не hbmfluid.oxygen=Жидкий кислород hbmfluid.oxyhydrogen=Гремучий газ hbmfluid.pain=Пандемониум(III)Раствор танталита -hbmfluid.perfluoromethyl=Перфторометил -hbmfluid.perfluoromethyl_cold=Холодный перфторометил -hbmfluid.perfluoromethyl_hot=Горячий перфторометил +hbmfluid.perfluoromethyl=Перфторометан +hbmfluid.perfluoromethyl_cold=Холодный перфторометан +hbmfluid.perfluoromethyl_hot=Горячий перфторометан hbmfluid.peroxide=Пероксид водорода hbmfluid.petroil=Бензин hbmfluid.petroil_leaded=Этилированный бензин @@ -1585,7 +1586,7 @@ hbmfluid.sunfloweroil=Подсолнечное масло hbmfluid.superhotsteam=Перегретый пар hbmfluid.syngas=Синтгаз hbmfluid.thorium_salt=Жидкая ториевая соль -hbmfluid.thorium_salt_depleted=Обедненная жидкая ториевая соль +hbmfluid.thorium_salt_depleted=Обеднённая жидкая ториевая соль hbmfluid.thorium_salt_hot=Горячая жидкая ториевая соль hbmfluid.tritium=Тритий hbmfluid.uf6=Гексафторид урана @@ -1645,7 +1646,7 @@ hbmmat.cryolite=Криолит hbmmat.desh=Деш hbmmat.diamond=Алмаз hbmmat.dineutronium=Динейтроний -hbmmat.durasteel=Высокоскоростная сталь +hbmmat.durasteel=Быстрорежущая сталь hbmmat.emerald=Изумруд hbmmat.euphemium=Эвфемий hbmmat.ferrouranium=Ферроуран @@ -1659,7 +1660,7 @@ hbmmat.graphene=Графен hbmmat.graphite=Графит hbmmat.gunmetal=Пушечная бронза hbmmat.hematite=Гематит -hbmmat.iron=Железа +hbmmat.iron=Железо hbmmat.lanthanum=Лантан hbmmat.lapis=Лазурит hbmmat.lead=Свинец @@ -1983,9 +1984,9 @@ item.ammo_standard.bmg50_fmj.name=.50 BMG патрон (Цельнометалл item.ammo_standard.bmg50_sm.name=.50 BMG патрон (Звёздный Металл) item.ammo_standard.bmg50_jhp.name=.50 BMG патрон (Экспансивный+) item.ammo_standard.bmg50_sp.name=.50 BMG патрон (Экспансивный) -item.ammo_standard.capacitor.name=Конденсатор (Стандартный) -item.ammo_standard.capacitor_ir.name=Конденсатор (Низкая длина волны) -item.ammo_standard.capacitor_overcharge.name=Конденсатор (Перезаряженный) +item.ammo_standard.capacitor.name=Оружейный конденсатор (Стандартный) +item.ammo_standard.capacitor_ir.name=Оружейный конденсатор (Коротковолновой) +item.ammo_standard.capacitor_overcharge.name=Оружейный конденсатор (Перегруженный) item.ammo_standard.coil_ferrouranium.name=Ферроураниевый шарик гаусс-пушки item.ammo_standard.coil_tungsten.name=Вольфрамовый шарик гаусс-пушки item.ammo_standard.ct_hook.name=Крюк-кошка @@ -2105,16 +2106,16 @@ item.ams_muzzle.desc=...он испускает штуковину с энерг item.analysis_tool.name=Анализатор item.analyzer.name=Анализатор item.anchor_remote.name=Устройство вызова -item.apple_euphemium.name=Эвфемиевое Яблоко +item.apple_euphemium.name=Эвфемиевое яблоко item.apple_lead.name=Свинцовое яблоко -item.apple_schrabidium.name=Шрабидиевое Яблоко +item.apple_schrabidium.name=Шрабидиевое яблоко item.arc_electrode.name=Графитовый электрод item.arc_electrode.desh.name=Деш-электрод item.arc_electrode.graphite.name=Графитовый электрод item.arc_electrode.lanthanium.name=Лантановый электрод item.arc_electrode.saturnite.name=Сатурнитовый электрод item.arc_electrode_burnt.name=Расплавленный электрод -item.arc_electrode_burnt.desh.name=Расплавленный Деш-электрод +item.arc_electrode_burnt.desh.name=Расплавленный деш-электрод item.arc_electrode_burnt.graphite.name=Расплавленный графитовый электрод item.arc_electrode_burnt.lanthanium.name=Расплавленный лантановый электрод item.arc_electrode_burnt.saturnite.name=Расплавленный сатурнитовый электрод @@ -2198,8 +2199,8 @@ item.battery_spark.name=Спарк-батарея item.battery_spark_cell_100.name=Спарк-Магический массив хранения энергии item.battery_spark_cell_1000.name=Спарк-Магическая масс-энергетическая пустота item.battery_spark_cell_10000.name=Устойчивый пространственно-временной спарк-кристалл -item.battery_spark_cell_25.name=Спарк-Магический аккумулятор -item.battery_spark_cell_2500.name=Спарк-Магическое море Дирака +item.battery_spark_cell_25.name=Спарк-магический аккумулятор +item.battery_spark_cell_2500.name=Спарк-магическое море Дирака item.battery_spark_cell_6.name=Спарк-энергоячейка item.battery_spark_cell_power.name=Абсурдный физический спарк-блок накопления энергии item.battery_steam.name=Паровой бак для хранения энергии @@ -2209,13 +2210,13 @@ item.battery_su_l.name=Большая одноразовая батарейка item.battery_trixite.name=Безымянная спарк-батарея item.bdcl.name=BDCL item.bedrock_ore.grade.base.name=Бедроковая руда (%s) -item.bedrock_ore.grade.base_roasted.name=Обожженная бедроковая руда (%s) +item.bedrock_ore.grade.base_roasted.name=Обожжённая бедроковая руда (%s) item.bedrock_ore.grade.base_washed.name=Промытая бедроковая руда (%s) item.bedrock_ore.grade.primary.name=Бедроковая руда (%s), первичная фракция -item.bedrock_ore.grade.primary_roasted.name=Бедроковая руда (%s), обожженная первичная фракция +item.bedrock_ore.grade.primary_roasted.name=Бедроковая руда (%s), обожжённая первичная фракция item.bedrock_ore.grade.primary_sulfuric.name=Бедроковая руда (%s), серная первичная фракция item.bedrock_ore.grade.primary_nosulfuric.name=Бедроковая руда (%s), отделённая серная первичная фракция -item.bedrock_ore.grade.primary_solvent.name=Бедроковая руда (%s), растворенная первичная фракция +item.bedrock_ore.grade.primary_solvent.name=Бедроковая руда (%s), растворённая первичная фракция item.bedrock_ore.grade.primary_nosolvent.name=Бедроковая руда (%s), отделённая растворенная первичная фракция item.bedrock_ore.grade.primary_rad.name=Бедроковая руда (%s), очищенная первичная фракция item.bedrock_ore.grade.primary_norad.name=Бедроковая руда (%s), отделённая очищенная первичная фракция @@ -2223,15 +2224,15 @@ item.bedrock_ore.grade.primary_first.name=Бедроковая руда (%s), п item.bedrock_ore.grade.primary_second.name=Бедроковая руда (%s), первичная фракция, малый вес item.bedrock_ore.grade.crumbs.name=Куски бедроковой руды (%s) item.bedrock_ore.grade.sulfuric_byproduct.name=Бедроковая руда (%s), серная побочка -item.bedrock_ore.grade.sulfuric_roasted.name=Бедроковая руда (%s), обожженная серная побочка +item.bedrock_ore.grade.sulfuric_roasted.name=Бедроковая руда (%s), обожжённая серная побочка item.bedrock_ore.grade.sulfuric_arc.name=Бедроковая руда (%s), переплавленная серная побочка item.bedrock_ore.grade.sulfuric_washed.name=Бедроковая руда (%s), промытая серная побочка -item.bedrock_ore.grade.solvent_byproduct.name=Бедроковая руда (%s), растворенная побочка -item.bedrock_ore.grade.solvent_roasted.name=Бедроковая руда (%s), обожженная растворенная побочка +item.bedrock_ore.grade.solvent_byproduct.name=Бедроковая руда (%s), растворённая побочка +item.bedrock_ore.grade.solvent_roasted.name=Бедроковая руда (%s), обожжённая растворенная побочка item.bedrock_ore.grade.solvent_arc.name=Бедроковая руда (%s), переплавленная растворенная побочка item.bedrock_ore.grade.solvent_washed.name=Бедроковая руда (%s), промытая растворенная побочка item.bedrock_ore.grade.rad_byproduct.name=Бедроковая руда (%s), очищенная побочка -item.bedrock_ore.grade.rad_roasted.name=Бедроковая руда (%s), обожженная очищенная побочка +item.bedrock_ore.grade.rad_roasted.name=Бедроковая руда (%s), обожжённая очищенная побочка item.bedrock_ore.grade.rad_arc.name=Бедроковая руда (%s), переплавленная очищенная побочка item.bedrock_ore.grade.rad_washed.name=Бедроковая руда (%s), промытая очищенная побочка item.bedrock_ore.trait.arc=§6Дуговая плавка @@ -2243,7 +2244,7 @@ item.bedrock_ore.trait.sulfuric=§6Обработанный серной кис item.bedrock_ore.trait.washed=§bПромытый в окислителе водой item.bedrock_ore.type.actinide.name=Актинидная item.bedrock_ore.type.crystal.name=Кристаллическая -item.bedrock_ore.type.heavy.name=Тяжелая металлическая +item.bedrock_ore.type.heavy.name=Тяжёлая металлическая item.bedrock_ore.type.light.name=Лёгкая металлическая item.bedrock_ore.type.nonmetal.name=Неметаллическая item.bedrock_ore.type.rare.name=Редкоземельная @@ -2266,7 +2267,7 @@ item.billet_bismuth.name=Заготовка висмута item.billet_co60.name=Заготовка кобальта-60 item.billet_cobalt.name=Заготовка кобальта item.billet_flashlead.name=Заготовка флэшлида -item.billet_flashlead.desc=Решетка распадается, вызывая реакции аннигиляции антивещества и материи, вызывая высвобождение$пионов, распадающихся на мюоны, катализирующих слияние$ядер, создавая новый элемент.$Пожалуйста, постарайся не отставать. +item.billet_flashlead.desc=Решётка распадается, вызывая реакции аннигиляции антивещества и материи, вызывая высвобождение$пионов, распадающихся на мюоны, катализирующих слияние$ядер, создавая новый элемент.$Пожалуйста, постарайся не отставать. item.billet_gh336.name=Заготовка гиорсия-336 item.billet_gh336.desc=Коллега Сиборгиума. item.billet_hes.name=Заготовка высокообогащённого шрабидиевого топлива @@ -2277,18 +2278,18 @@ item.billet_neptunium.name=Заготовка нептуния item.billet_neptunium_fuel.name=Заготовка нептуниевого топлива item.billet_nuclear_waste.name=Заготовка ядерных отходов item.billet_pb209.name=Заготовка свинца-209 -item.billet_po210be.name=Заготовка Полоний-210-Бериллия +item.billet_po210be.name=Заготовка полоний-210-бериллия item.billet_polonium.name=Заготовка полония-210 item.billet_pu_mix.name=Заготовка плутония реакторного качества item.billet_pu238.name=Заготовка плутония-238 -item.billet_pu238be.name=Заготовка Плутоний-210-Бериллия +item.billet_pu238be.name=Заготовка плутоний-238-бериллия item.billet_pu239.name=Заготовка плутония-239 item.billet_pu240.name=Заготовка плутония-240 item.billet_pu241.name=Заготовка плутония-241 item.billet_plutonium.name=Заготовка плутония item.billet_plutonium_fuel.name=Заготовка плутониевого топлива item.billet_ra226.name=Заготовка радия-226 -item.billet_ra226be.name=Заготовка Радий-226-Бериллия +item.billet_ra226be.name=Заготовка радий-226-бериллия item.billet_schrabidium.name=Заготовка шрабидия item.billet_schrabidium_fuel.name=Заготовка шрабидиевого топлива item.billet_silicon.name=Кремниевая пластина @@ -2342,7 +2343,7 @@ item.bobmazon_materials.name=Бобмазон: Материалы item.bobmazon_tools.name=Бобмазон: Предметы item.bobmazon_weapons.name=Бобмазон: Оружие и взрывчатка item.boltntm.name=Стержень (%s) -item.bolt_compound.name=Укрепленный вал турбины +item.bolt_compound.name=Укреплённый вал турбины item.bolt_spike.name=Железнодорожный гвоздь item.bolt_spike.desc=Излучает угрожающую ауру, как-то item.boltgun.name=Пневматический заклепочник @@ -2388,7 +2389,7 @@ item.can_breen.name=Личный резерв др.Брина item.can_creature.name=Энергетический напиток "Существо" item.can_empty.name=Пустая банка item.can_key.name=Винтовой ключ -item.can_luna.name=Черная Меза Луна - Темная Кола +item.can_luna.name=Чёрная меза луна - Тёмная кола item.can_mrsugar.name=Безалкогольный напиток 'Доктор Сахар' item.can_mug.name=MUG Root Beer item.can_overcharge.name=Перезарядка Delirium XT @@ -2407,7 +2408,7 @@ item.canister_full.name=Канистра: item.canister_gasoline.name=Канистра с этилированным бензином (LEGACY) item.canister_gasoline.desc=свинец - это друг$впусти друга в свой кровоток$*достаёт пистолет* живо. item.canister_heatingoil.name=Канистра с мазутом (LEGACY) -item.canister_heavyoil.name=Канистра с тяжелой нефтью (LEGACY) +item.canister_heavyoil.name=Канистра с тяжёлой нефтью (LEGACY) item.canister_kerosene.name=Канистра с керосином (LEGACY) item.canister_lightoil.name=Канистра с лёгкой нефтью (LEGACY) item.canister_napalm.name=Напалм Б @@ -2424,7 +2425,7 @@ item.canned_bark.name=Консервы вяленой сосновой коры item.canned_bark.desc=Очень хрустящие! item.canned_beef.name=Консервированная говядина item.canned_beef.desc=Несколько веков назад для этого умерла корова. -item.canned_bhole.name=Консервированная черная дыра +item.canned_bhole.name=Консервированная чёрная дыра item.canned_bhole.desc=Сингулярность это ням ням в моём там там item.canned_cheese.name=Консервированный плавленый сыр item.canned_cheese.desc=Это сыр? Это резиновый цемент? Кто знает. Кого волнует. @@ -2528,7 +2529,7 @@ item.centrifuge_tower.name=Башня центрифуги item.chainsaw.name=Бензопила item.cheese.name=Сыр item.cheese_quesadilla.name=Сырная кесадилья -item.chemical_dye.black.name=Химический краситель (Черный) +item.chemical_dye.black.name=Химический краситель (Чёрный) item.chemical_dye.blue.name=Химический краситель (Синий) item.chemical_dye.brown.name=Химический краситель (Коричневый) item.chemical_dye.cyan.name=Химический краситель (Голубой) @@ -2555,12 +2556,12 @@ item.chocolate.name=Фирменный радиевый шоколад item.chocolate.desc=Радиевый шоколад? Почти уверен, что это просто мет. item.chocolate_milk.name=Шоколадное молоко item.chopper.name=Вертолёт-охотник -item.chopper_blades.name=Лопасти Вертолёта-охотника +item.chopper_blades.name=Лопасти вертолёта-охотника item.chopper_gun.name=Огневая установка -item.chopper_head.name=Кабина Вертолета-охотника -item.chopper_tail.name=Хвост Вертолёта-охотника -item.chopper_torso.name=Корпус Вертолёта-охотника -item.chopper_wing.name=Крыло Вертолета-охотника +item.chopper_head.name=Кабина вертолёта-охотника +item.chopper_tail.name=Хвост вертолёта-охотника +item.chopper_torso.name=Корпус вертолёта-охотника +item.chopper_wing.name=Крыло вертолёта-охотника item.chunk_ore.malachite.name=Кусок малахита item.chunk_ore.rare.name=Кусок редкоземельной руды item.chunk_ore.moonstone.name=Лунный камень @@ -2730,7 +2731,7 @@ item.cordite.name=Кордит item.cotton_candy.name=Радиоактивная сахарная вата item.crackpipe.name=Оздоровительная трубка item.crate_caller.name=Запросчик поставки припасов -item.crayon.black.name=Черный мелок +item.crayon.black.name=Чёрный мелок item.crayon.blue.name=Синий мелок item.crayon.brown.name=Коричневый мелок item.crayon.cyan.name=Голубой мелок @@ -2853,8 +2854,8 @@ item.drillbit_desh.name=Деш-головка бура item.drillbit_desh_diamond.name=Деш-головка бура (с алмазным напылением) item.drillbit_ferro.name=Головка бура из ферроурана item.drillbit_ferro_diamond.name=Головка бура из ферроурана (с алмазным напылением) -item.drillbit_hss.name=Головка бура из высокоскоростной стали -item.drillbit_hss_diamond.name=Головка бура из высокоскоростной стали (с алмазным напылением) +item.drillbit_hss.name=Головка бура из быстрорежущей стали +item.drillbit_hss_diamond.name=Головка бура из быстрорежущей стали (с алмазным напылением) item.drillbit_steel.name=Головка бура из стали item.drillbit_steel_diamond.name=Головка бура из стали (с алмазным напылением) item.drillbit_tcalloy.name=Головка бура из технециевой стали @@ -2922,10 +2923,10 @@ item.fau_helmet.name=Фау-шлем item.fau_legs.name=Фау-поножи item.fau_plate.name=Фау-нагрудник item.filter_coal.name=Фильтр с активированным углём -item.fins_big_steel.name=Большие стальные ребра решетки +item.fins_big_steel.name=Большие стальные ребра решётки item.fins_flat.name=Плоский стальной кожух item.fins_quad_titanium.name=Маленькие титановые ребра -item.fins_small_steel.name=Малые стальные ребра решетки +item.fins_small_steel.name=Малые стальные ребра решётки item.fins_tri_steel.name=Большие стальные ребра item.five_htp.name=Таблетки энтерамина item.five_htp.desc=Убирает все DRX, Стабильность на 10 минут @@ -2936,7 +2937,7 @@ item.flame_opinion.desc=Что ж, мне это нравится... item.flame_politics.name=Политическая тема item.flame_politics.desc=Дональд Дак построит стену! item.flame_pony.name=Картинка цветной лошади -item.flame_pony.desc=Желтая лошадь побеждает синюю лошадь, это доказанный факт! +item.flame_pony.desc=Жёлтая лошадь побеждает синюю лошадь, это доказанный факт! item.flask_infusion.shield.name=Эликсир защиты item.fleija_core.name=Заряд Ф.Л.Е.И из урана 235 item.fleija_igniter.name=Импульсный воспламенитель @@ -3022,7 +3023,7 @@ item.gem_volcanic.name=Вулканический самоцвет item.generator_front.name=Перед генератора item.generator_steel.name=Корпус генератора item.glitch.name=Глюк -item.glowing_stew.name=Тушеные светящиеся грибы +item.glowing_stew.name=Тушёные светящиеся грибы item.glyphid_meat.name=Мясо глифидов item.glyphid_meat_grilled.name=Жареное мясо глифидов item.goggles.name=Защитные очки @@ -3249,7 +3250,7 @@ item.gun_uzi_saturnite.name=Сатурнитовый Узи item.gun_uzi_saturnite_silencer.name=Сатурнитовый Узи с глушителем item.gun_uzi_silencer.name=IMI Узи с глушителем item.gun_xvl1456.name=Прототип Тау-пушки XVL1456 -item.gun_xvl1456_ammo.name=Ящик с Обедненным Ураном-235 +item.gun_xvl1456_ammo.name=Ящик с обеднённым ураном-235 item.gun_zomg.name=ZOMG-пушка item.hand_drill.name=Ручная дрель item.hand_drill_desh.name=Ручная дрель из деша @@ -3295,7 +3296,7 @@ item.hull_small_aluminium.name=Небольшая алюминиевая обо item.hull_small_aluminium.desc=Может быть вставлен в просверленный графит item.hull_small_steel.name=Небольшая стальная оболочка item.icf_pellet.name=Топливная пеллета ICF -item.icf_pellet_depleted.name=Обедненная топливная пеллета ICF +item.icf_pellet_depleted.name=Обеднённая топливная пеллета ICF item.icf_pellet_empty.name=Пустая топливная пеллета ICF item.igniter.name=Зажигатель item.igniter.desc=(Щёлкните правой кнопкой мыши по Прототипу)$Это зелёная металлическая ручка с $ярко-красной кнопкой и маленькой крышкой.$Внизу выгравированы инициалы N.E.$. Кем бы ни был N.E., у него был отличный вкус в оттенках зелёного. @@ -3343,13 +3344,13 @@ item.ingot_copper.name=Слиток промышленной меди item.ingot_daffergon.name=Даффергоновый слиток item.ingot_desh.name=Слиток деш item.ingot_dineutronium.name=Динейтрониевый слиток -item.ingot_dura_steel.name=Слиток высокоскоростной стали +item.ingot_dura_steel.name=Слиток быстрорежущей стали item.ingot_electronium.name=Электрониевый слиток item.ingot_euphemium.name=Эвфемиевый слиток item.ingot_euphemium.desc=Совершенно особый и в то же время странный элемент. item.ingot_ferrouranium.name=Ферроураниевый слиток item.ingot_fiberglass.name=Стекловолокно -item.ingot_fiberglass.desc=С высоким содержанием волокна, с высоким содержанием стекла. Все, что нужно организму. +item.ingot_fiberglass.desc=С высоким содержанием волокна, с высоким содержанием стекла. Всё, что необходимо организму. item.ingot_firebrick.name=Шамотный кирпич item.ingot_gh336.name=Слиток гиорсия-336 item.ingot_gh336.desc=Коллега Сиборгиума. @@ -3452,7 +3453,7 @@ item.item_expensive.bronze_tubes.name=Бронзовые конструкцио item.item_expensive.circuit.name=Обширная печатная плата item.item_expensive.computer.name=Мейнфрейм item.item_expensive.ferro_plating.name=Армированные ферроураниевые панели -item.item_expensive.heavy_frame.name=Тяжелый каркас +item.item_expensive.heavy_frame.name=Тяжёлый каркас item.item_expensive.lead_plating.name=Радиационно-стойкое покрытие item.item_expensive.steel_plating.name=Стальная обшивка с болтовым соединением item.item_secret.aberrator.name=Часть Аберратора @@ -3514,9 +3515,9 @@ item.lithium.name=Куб лития item.lodestone.name=Магнетит item.loop_stew.name=Завтрак IT-шника item.loops.name=Пəтли -item.loot_10.name=Ящик с запчастями от Ракеты 10-го размера -item.loot_15.name=Ящик с запчастями от Ракеты 15-го размера -item.loot_misc.name=Общий ящик с запчастями от Ракеты +item.loot_10.name=Ящик с запчастями от ракеты 10-го размера +item.loot_15.name=Ящик с запчастями от ракеты 15-го размера +item.loot_misc.name=Общий ящик с запчастями от ракеты item.magnet_circular.name=Плоский магнит item.magnet_dee.name=Ди-магниты item.magnetron.name=Магнетрон @@ -3572,7 +3573,7 @@ item.mirror_tool.linked=Позиция выравнивания установл item.mirror_tool.desc=Щелкните правой кнопкой мыши по бойлеру, чтобы запомнить его положение.$Нажмите на зеркала, чтобы повернуть их в сторону бойлера item.missile_anti_ballistic.name=Антибаллистическая ракета item.missile_assembly.name=Сборка малой ракеты -item.missile_bhole.name=Ракета "Черная Дыра" +item.missile_bhole.name=Ракета "Чёрная Дыра" item.missile_burst.name=Запасная ракета item.missile_buster.name=Противобункерная ракета item.missile_buster_strong.name=Улучшенная противобункерная ракета @@ -3912,7 +3913,7 @@ item.paa_boots.name="Старые добрые ботинки" из PaA item.paa_legs.name=Укреплённые поножи из PaA item.paa_plate.name=Защищающая грудная пластина из PaA item.padlock.name=Замок -item.padlock_reinforced.name=Защищенный замок +item.padlock_reinforced.name=Защищённый замок item.padlock_rusty.name=Ржавый замок item.padlock_unbreakable.name=Несокрушимый замок item.pads_rubber.name=Резиновые прокладки @@ -3993,7 +3994,7 @@ item.pellet_rtg_actinium.desc=Сияние голубого света и бет item.pellet_rtg_americium.name=РИТЭГ-пеллета из америция-241 item.pellet_rtg_americium.desc=Редкий и надежный, старый добрый Америций! item.pellet_rtg_berkelium.name=РИТЭГ-пеллета из берклия-248 -item.pellet_rtg_berkelium.desc= +item.pellet_rtg_berkelium.desc=Экзотический источник альфа, служит дольше, чем америций! item.pellet_rtg_cobalt.name=РИТЭГ-пеллета из кобальта-60 item.pellet_rtg_cobalt.desc=Не лучший для РИТЭГ энергии, но хорош для гамма-радиации! item.pellet_rtg_depleted.bismuth.name=Распавшаяся РИТЭГ-пеллета висмута @@ -4013,15 +4014,15 @@ item.pellet_rtg_strontium.desc=Известен штату Калифорния. item.pellet_rtg_radium.name=РИТЭГ-пеллета из радия-226 item.pellet_rtg_radium.desc=Отличная стартовая пеллета, полученная из натурального радия! item.pellet_rtg_weak.name=Слабая урановая РИТЭГ-топливная пеллета -item.pellet_rtg_weak.desc=Более дешевая и слабая пеллета, теперь с большим количеством U238! +item.pellet_rtg_weak.desc=Более дешёвая и слабая пеллета, теперь с большим количеством U238! item.pellet_schrabidium.name=Чистая шрабидиевая Ватцз-пеллета item.photo_panel.name=Фотоэлектрическая панель item.pile_rod_boron.name=Контрольный стержень "Чикагской поленницы" item.pile_rod_boron.desc=§9[Поглотитель нейтронов]$§eПКМ, чтобы переключить item.pile_rod_detector.name=Регулирующий и детектирующий стержень "Чикагской поленницы" -item.pile_rod_detector.desc=§9[Детектор/поглотитель нейтронов]$§eПКМ дефьюзером чтобы увеличить/уменьшить лимит нейтронов$§eПКМ отвёрткой без шифта чтобы проверить поток +item.pile_rod_detector.desc=§9[Детектор/поглотитель нейтронов]$§eПКМ дефьюзером, чтобы увеличить/уменьшить лимит нейтронов$§eПКМ отвёрткой без шифта, чтобы проверить поток item.pile_rod_lithium.name=Литиевая ячейка "Чикагской поленницы" -item.pile_rod_lithium.desc=§a[Топливо-размножитель]$§eПКМ ручной дрелью чтобы проверить ядро ячейки +item.pile_rod_lithium.desc=§a[Топливо-размножитель]$§eПКМ ручной дрелью, чтобы проверить ядро ячейки item.pile_rod_plutonium.name=Плутониевый стержень "Чикагской поленницы" item.pile_rod_plutonium.desc=§d[Источник нейтронов] item.pile_rod_pu239.name=Урановый стержень-размножитель "Чикагской поленницы" @@ -4029,7 +4030,7 @@ item.pile_rod_pu239.desc=§a[Активное топливо]$§eбогатое item.pile_rod_source.name=Радий-226-Бериллевый источник нейтронов "Чикагской поленницы" item.pile_rod_source.desc=§d[Источник нейтронов] item.pile_rod_uranium.name=Урановый стержень "Чикагской поленницы" -item.pile_rod_uranium.desc=§a[Активное топливо]$§eПКМ ручной дрелью чтобы взять образец ядра стержня +item.pile_rod_uranium.desc=§a[Активное топливо]$§eПКМ ручной дрелью, чтобы взять образец ядра стержня item.pill_iodine.name=Таблетка иода item.pill_iodine.desc=Убирает негативные эффекты item.pill_herbal.name=Травяная паста @@ -4042,7 +4043,7 @@ item.pipes_steel.name=Стальные трубы item.pipes_steel.desc=Раскрафт был исключен из-за уклонения от уплаты налогов item.piston_selenium.name=Поршень двигателя внутреннего сгорания item.piston_set_desh.name=Набор деш-поршней -item.piston_set_dura.name=Набор поршней из высокоскоростной стали +item.piston_set_dura.name=Набор поршней из быстрорежущей стали item.piston_set_starmetal.name=Набор поршней из звёздного металла item.piston_set_steel.name=Набор стальных поршней item.plan_c.name=План С @@ -4067,7 +4068,7 @@ item.plate_copper.name=Медная пластина item.plate_dalekanium.name=Злой металл item.plate_desh.name=Составная пластина из деш item.plate_dineutronium.name=Составная пластина из динейтрония -item.plate_dura_steel.name=Пластина высокоскоростной стали +item.plate_dura_steel.name=Пластина быстрорежущей стали item.plate_euphemium.name=Составная пластина из эвфемия item.plate_fuel_mox.name=МОКС-топливная пластина item.plate_fuel_pu238be.name=Плутоний-238-Бериллевая топливная пластина @@ -4131,8 +4132,8 @@ item.powder_coal_tiny.name=Кучка угольного порошка item.powder_cobalt.name=Кобальтовый порошок item.powder_cobalt_tiny.name=Кучка кобальтового порошка item.powder_coltan.name=Очищенный танталит -item.powder_coltan_ore.name=Измельченный Колтан -item.powder_combine_steel.name=Измельченная сталь Альянса +item.powder_coltan_ore.name=Измельчённый Колтан +item.powder_combine_steel.name=Измельчённая сталь Альянса item.powder_copper.name=Медный порошок item.powder_cs137.name=Порошок цезия-137 item.powder_cs137_tiny.name=Кучка порошка цезия-137 @@ -4142,10 +4143,10 @@ item.powder_desh_mix.name=Смесь деш item.powder_desh_ready.name=ГотоваяДеш™ смесь item.powder_diamond.name=Алмазный порошок item.powder_dineutronium.name=Динейтрониевый порошок -item.powder_dura_steel.name=Измельченная высокоскоростная сталь +item.powder_dura_steel.name=Измельчённая быстрорежущая сталь item.powder_emerald.name=Изумрудный порошок item.powder_euphemium.name=Эвфемиевый порошок -item.powder_euphemium.desc=Измельченный розовый.$На вкус как клубника. +item.powder_euphemium.desc=Измельчённая розовизна.$На вкус как клубника. item.powder_fertilizer.name=Промышленное удобрение item.powder_fire.name=Красный фосфор item.powder_fire.desc=Используется в многоцелевых бомбах:$Зажигательные бомбы - это весело! @@ -4165,8 +4166,8 @@ item.powder_lignite.name=Порошок бурого угля item.powder_limestone.name=Известняковый порошок item.powder_lithium.name=Литиевый порошок item.powder_lithium_tiny.name=Кучка литиевого порошка -item.powder_magic.name=Измельченное зачарование -item.powder_magnetized_tungsten.name=Измельченный намагниченный вольфрам +item.powder_magic.name=Измельчённое зачарование +item.powder_magnetized_tungsten.name=Измельчённый намагниченный вольфрам item.powder_meteorite.name=Метеоритный порошок item.powder_meteorite_tiny.name=Кучка метеоритного порошка item.powder_molysite.name=Молизит @@ -4215,7 +4216,7 @@ item.powder_verticium.name=Вертициевый порошок item.powder_weidanium.name=Вейдановый порошок item.powder_xe135.name=Порошок ксенона-135 item.powder_xe135_tiny.name=Кучка порошка ксенона-135 -item.powder_yellowcake.name=Йеллоукейк +item.powder_yellowcake.name=Жёлтый кек item.powder_zirconium.name=Циркониевый порошок item.power_net_tool.name=Анализатор энергосети item.pipette.name=Пипетка @@ -4244,21 +4245,21 @@ item.pwr_fuel.men.name=Топливный стержень ВВЭР со сре item.pwr_fuel.mep.name=Топливный стержень ВВЭР со среднеобогащённым плутонием item.pwr_fuel.meu.name=Топливный стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel.mox.name=Топливный стержень ВВЭР с МОКС-топливом -item.pwr_fuel_depleted.bfb_am_mix.name=Обедненный стержень ВВЭР ЦБР с реакторным америцием -item.pwr_fuel_depleted.bfb_pu241.name=Обедненный стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel_depleted.hea242.name=Обедненный топливный стержень ВВЭР с высокообогащённым америцием-242 -item.pwr_fuel_depleted.hen237.name=Обедненный топливный стержень ВВЭР с высокообогащённым нептунием-237 -item.pwr_fuel_depleted.hep239.name=Обедненный топливный стержень ВВЭР с высокообогащённым плутонием-239 -item.pwr_fuel_depleted.hep241.name=Обедненный топливный стержень ВВЭР с высокообогащённым плутонием-241 -item.pwr_fuel_depleted.hes326.name=Обедненный топливный стержень ВВЭР с высокообогащённым шрабидием-326 -item.pwr_fuel_depleted.hes327.name=Обедненный топливный стержень ВВЭР с высокообогащённым шрабидием-327 -item.pwr_fuel_depleted.heu233.name=Обедненный топливный стержень ВВЭР с высокообогащённым ураном-233 -item.pwr_fuel_depleted.heu235.name=Обедненный топливный стержень ВВЭР с высокообогащённым ураном-235 -item.pwr_fuel_depleted.mea.name=Обедненный топливный стержень ВВЭР со среднеобогащённым америцием -item.pwr_fuel_depleted.men.name=Обедненный топливный стержень ВВЭР со среднеобогащённым нептунием -item.pwr_fuel_depleted.mep.name=Обедненный топливный стержень ВВЭР со среднеобогащённым плутонием -item.pwr_fuel_depleted.meu.name=Обедненный топливный стержень ВВЭР со среднеобогащённым ураном -item.pwr_fuel_depleted.mox.name=Обедненный топливный стержень ВВЭР с МОКС-топливом +item.pwr_fuel_depleted.bfb_am_mix.name=Обеднённый стержень ВВЭР ЦБР с реакторным америцием +item.pwr_fuel_depleted.bfb_pu241.name=Обеднённый стержень ВВЭР ЦБР с плутонием-241 +item.pwr_fuel_depleted.hea242.name=Обеднённый топливный стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel_depleted.hen237.name=Обеднённый топливный стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel_depleted.hep239.name=Обеднённый топливный стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel_depleted.hep241.name=Обеднённый топливный стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel_depleted.hes326.name=Обеднённый топливный стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel_depleted.hes327.name=Обеднённый топливный стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel_depleted.heu233.name=Обеднённый топливный стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel_depleted.heu235.name=Обеднённый топливный стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel_depleted.mea.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel_depleted.men.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel_depleted.mep.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel_depleted.meu.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым ураном +item.pwr_fuel_depleted.mox.name=Обеднённый топливный стержень ВВЭР с МОКС-топливом item.pwr_fuel_hot.bfb_am_mix.name=Горячий стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel_hot.bfb_pu241.name=Горячий стержень ВВЭР ЦБР с плутонием-241 item.pwr_fuel_hot.hea242.name=Горячий стержень ВВЭР с высокообогащённым америцием-242 @@ -4287,7 +4288,7 @@ item.rag_piss.name=Пропитанная мочой тряпка item.rangefinder.name=Дальнометр item.rbmk_fuel_balefire.name=Жар-топливный стержень РБМК item.rbmk_fuel_balefire_gold.name=Флэшголд-топливный стержень РБМК -item.rbmk_fuel_drx.name=§cДигамма топливный стержень РБМК§r +item.rbmk_fuel_drx.name=§cДигамма-топливный стержень РБМК§r item.rbmk_fuel_empty.name=Пустой топливный стержень РБМК item.rbmk_fuel_flashlead.name=Флэшлид-топливный стержень РБМК item.rbmk_fuel_hea241.name=Высокообогащённый америциевый-241 топливный стержень РБМК @@ -4321,7 +4322,7 @@ item.rbmk_lid.name=Покрывающая панель РБМК item.rbmk_lid_glass.name=Стеклянная покрывающая панель РБМК item.rbmk_pellet_balefire.name=Жар-топливная пеллета item.rbmk_pellet_balefire_gold.name=Флэшголд-топливная пеллета -item.rbmk_pellet_drx.name=§cДигамма топливная пеллета§r +item.rbmk_pellet_drx.name=§cДигамма-топливная пеллета§r item.rbmk_pellet_flashlead.name=Флэшлид-топливная пеллета item.rbmk_pellet_hea241.name=Высокообогащённая америциевая-241 топливная пеллета item.rbmk_pellet_hea242.name=Высокообогащённая америциевая-242 топливная пеллета @@ -4581,11 +4582,25 @@ item.sat_head_scanner.name=Сканер M700 item.sat_interface.name=Интерфейс спутникового управления item.sat_laser.name=Орбитальный Луч Смерти item.sat_lunar_miner.name=Модуль для добычи лунного грунта -item.sat_mapper.name=Спутник для Картографирования Поверхности +item.sat_mapper.name=Спутник для картографирования поверхности item.sat_miner.name=Модуль для добычи астероидов -item.sat_radar.name=Спутник с Радиолокационным Зондированием +item.sat_radar.name=Спутник с радиолокационным зондированием item.sat_resonator.name=Спутник с Зен-Резонатором item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования + +item.sat.desc.frequency=Частота спутника +item.sat.desc.foeq=Даёт тебе достижение. Это всё. +item.sat.desc.gerald.single_use=Одноразовое. +item.sat.desc.gerald.orbital_module=Требует орбитальный модуль. +item.sat.desc.gerald.melter=Расплавитель процессоров, проклятие каждого владельца сервера. +item.sat.desc.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. +item.sat.desc.mapper=Отображает загруженные в данный момент чанки. +item.sat.desc.miner=Доставит рудные порошки на грузовую посадочную площадку. +item.sat.desc.lunar_miner=Добывает лунный грунт, чтобы доставить его на грузовую посадочную площадку. +item.sat.desc.radar=Показывает карту активных объектов. +item.sat.desc.resonator=Позволяет телепортироваться без перезарядки. +item.sat.desc.scanner=Создаёт карту подземных руд сверху вниз. + item.sawblade.name=Лезвие пилорамы item.schnitzel_vegan.name=Вегетарианский шницель item.schrabidium_axe.name=Шрабидиевый топор @@ -4621,9 +4636,9 @@ item.settings_tool.name=Устройство настройки item.shackles.name=Оковы item.shellntm.name=Оболочка (%s) item.shimmer_axe.name=Отлитый топор -item.shimmer_axe_head.name=Тяжелое лезвие топора +item.shimmer_axe_head.name=Тяжёлое лезвие топора item.shimmer_handle.name=Усиленная полимерная ручка -item.shimmer_head.name=Тяжелая головка молота +item.shimmer_head.name=Тяжёлая головка молота item.shimmer_sledge.name=Отлитая кувалда item.singularity.name=Сингулярность item.singularity_counter_resonant.name=Заключённая контр-резонансная сингулярность @@ -4643,7 +4658,7 @@ item.solid_fuel_bf.name=Твердое топливо (Жар-пламя) item.solid_fuel_presto.name=Топливное полено item.solid_fuel_presto_bf.name=Топливное полено (Жар-пламя) item.solid_fuel_presto_triplet.name=Сжатые топливные поленья -item.solid_fuel_presto_triplet_bf.name=Сжатые топливные полена (Жар-пламя) +item.solid_fuel_presto_triplet_bf.name=Сжатые топливные поленья (Жар-пламя) item.solinium_core.name=Полустабильный солиниевый заряд item.solinium_igniter.name=Солиниевый импульсный воспламенитель item.solinium_kit.name=Солиниевый комплект @@ -4801,7 +4816,7 @@ item.tsar_kit.name=Комплект Царь Бомбы item.turbine_titanium.name=Титановая паровая турбина item.turbine_tungsten.name=Усиленные лопасти турбовентилятора item.turret_biometry.name=Карта телелинка -item.turret_cheapo_ammo.name=Дешевые турельные боеприпасы 6x24 +item.turret_cheapo_ammo.name=Дешёвые турельные боеприпасы 6x24 item.turret_chip.name=Турельный чип искусственного интеллекта item.turret_control.name=Турельный контроллер item.turret_cwis_ammo.name=Барабан 20-мм патронов @@ -4874,8 +4889,8 @@ item.warhead_nuclear.name=Ядерная боеголовка item.warhead_thermo_endo.name=Эндотермическая боеголовка item.warhead_thermo_exo.name=Экзотермическая боеголовка item.warhead_volcano.name=Тектоническая боеголовка -item.waste_mox.name=Обедненное МОКС-топливо -item.waste_natural_uranium.name=Обедненное природное урановое топливо +item.waste_mox.name=Обеднённое МОКС-топливо +item.waste_natural_uranium.name=Обеднённое природное урановое топливо item.waste_plate_mox.name=Обеднённая МОКС-топливная пластина item.waste_plate_pu238be.name=Обеднённая плутоний-238-бериллевая топливная пластина item.waste_plate_pu239.name=Обеднённая высокообогащённая плутониевая-239 топливная пластина @@ -4883,17 +4898,17 @@ item.waste_plate_ra226be.name=Обеднённая радий-226-берилле item.waste_plate_sa326.name=Обеднённая высокообогащённая шрабидий-326 топливная пластина item.waste_plate_u233.name=Обеднённая высокообогащённая уран-233 топливная пластина item.waste_plate_u235.name=Обеднённая высокообогащённая уран-235 топливная пластина -item.waste_plutonium.name=Обедненное плутониевое топливо -item.waste_schrabidium.name=Обедненное шрабидиевое топливо -item.waste_thorium.name=Обедненное ториевое топливо -item.waste_u235.name=Обедненное уран-235 топливо -item.waste_u233.name=Обедненное уран-233 топливо -item.waste_uranium.name=Обедненное урановое топливо -item.waste_zfb_mox.name=Обедненное ЦТС МОКС-топливо +item.waste_plutonium.name=Обеднённое плутониевое топливо +item.waste_schrabidium.name=Обеднённое шрабидиевое топливо +item.waste_thorium.name=Обеднённое ториевое топливо +item.waste_u235.name=Обеднённое уран-235 топливо +item.waste_u233.name=Обеднённое уран-233 топливо +item.waste_uranium.name=Обеднённое урановое топливо +item.waste_zfb_mox.name=Обеднённое ЦТС МОКС-топливо item.watch.name=Сломанные карманные часы item.watch.desc=Маленькие синие карманные часы.$На стекле есть несколько трещин,$и несколько осколков отсутствуют.$Перестали тикать в 2:34. item.watz_pellet.boron.name=Поглощающая Ватцз-пеллета из бора -item.watz_pellet.du.name=Поглощающая Ватцз-пеллета из обедненного урана +item.watz_pellet.du.name=Поглощающая Ватцз-пеллета из обеднённого урана item.watz_pellet.hes.name=Ватцз-пеллета из высокообогащённого шрабидия item.watz_pellet.lead.name=Поглощающая Ватцз-пеллета из свинца item.watz_pellet.les.name=Ватцз-пеллета из низкообогащённого шрабидия @@ -4904,18 +4919,18 @@ item.watz_pellet.nqd.name=Ватцз-пеллета из обогащённог item.watz_pellet.nqr.name=Ватцз-пеллета из наквадрии item.watz_pellet.hen.name=Ватцз-пеллета из высокообогащённого нептуния item.watz_pellet.schrabidium.name=Ватцз-пеллета из чистого шрабидия -item.watz_pellet_depleted.boron.name=Поглощающая Ватцз-пеллета из бора (Обедненная) -item.watz_pellet_depleted.du.name=Поглощающая Ватцз-пеллета из обедненного урана (Обедненная) -item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащённого шрабидия (Обедненная) -item.watz_pellet_depleted.lead.name=Поглощающая Ватцз-пеллета из свинца (Обедненная) -item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащённого шрабидия (Обедненная) -item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия (Обедненная) -item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащённого плутония (Обедненная) -item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащённого урана (Обедненная) -item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащённого наквадаха (Обедненная) -item.watz_pellet_depleted.nqr.name=Ватцз-пеллета из наквадрии (Обедненная) -item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащённого нептуния (Обедненная) -item.watz_pellet_depleted.schrabidium.name=Ватцз-пеллета из чистого шрабидия (Обедненная) +item.watz_pellet_depleted.boron.name=Поглощающая Ватцз-пеллета из бора (Обеднённая) +item.watz_pellet_depleted.du.name=Поглощающая Ватцз-пеллета из обеднённого урана (Обеднённая) +item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.lead.name=Поглощающая Ватцз-пеллета из свинца (Обеднённая) +item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащённого плутония (Обеднённая) +item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащённого урана (Обеднённая) +item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащённого наквадаха (Обеднённая) +item.watz_pellet_depleted.nqr.name=Ватцз-пеллета из наквадрии (Обеднённая) +item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащённого нептуния (Обеднённая) +item.watz_pellet_depleted.schrabidium.name=Ватцз-пеллета из чистого шрабидия (Обёдненная) item.weapon_bat.name=Любимица Ричарда item.weapon_bat_nail.name=Клише item.weapon_golf_club.name=Клюшка русского бандита @@ -4933,8 +4948,8 @@ item.weapon_mod_generic.bronze_damage.name=Оптимизированный бр item.weapon_mod_generic.bronze_dura.name=Высокопрочные запчасти из бронзы item.weapon_mod_generic.desh_damage.name=Оптимизированный деш ресивер item.weapon_mod_generic.desh_dura.name=Высокопрочные запчасти из деша -item.weapon_mod_generic.dura_damage.name=Оптимизированный высокоскоростной ресивер -item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из высокоскоростной стали +item.weapon_mod_generic.dura_damage.name=Оптимизированный быстрорежущий ресивер +item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из быстрорежущей стали item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроураниевый ресивер item.weapon_mod_generic.ferro_dura.name=Высокопрочные запчасти из ферроурана item.weapon_mod_generic.iron_damage.name=Оптимизированный железный ресивер @@ -4994,10 +5009,53 @@ item.wood_gavel.name=Деревянный молоток item.wrench.name=Газовый ключ item.wrench_archineer.name=Гаечный ключ инженера item.wrench_flipped.name=Лезвие на гаечном ключе -item.xanax.name=Препарат "НАКСА" против дигаммы +item.xanax.name=Препарат "НАКСА" против Дигаммы item.xanax.desc=Снимает 500mDRX item.zirconium_legs.name=Циркониевые штаны +item.custom_missile_part.he.type=HE +item.custom_missile_part.inc.type=Зажигательная +item.custom_missile_part.buster.type=Разрушитель бункеров +item.custom_missile_part.cluster.type=Кластерная +item.custom_missile_part.nuclear.type=Ядерная +item.custom_missile_part.tx.type=Термоядерная (TX) +item.custom_missile_part.n2.type=N² +item.custom_missile_part.balefire.type=Жар +item.custom_missile_part.schrab.type=Шрабидиевая +item.custom_missile_part.taint.type=Порча +item.custom_missile_part.cloud.type=Облако +item.custom_missile_part.turbine.type=Турбина +item.custom_missile_part.custom0.type=Custom0 +item.custom_missile_part.custom1.type=Custom1 +item.custom_missile_part.custom2.type=Custom2 +item.custom_missile_part.custom3.type=Custom3 +item.custom_missile_part.custom4.type=Custom4 +item.custom_missile_part.custom5.type=Custom5 +item.custom_missile_part.custom6.type=Custom6 +item.custom_missile_part.custom7.type=Custom7 +item.custom_missile_part.custom8.type=Custom8 +item.custom_missile_part.custom9.type=Custom9 + +item.custom_missile_part.fuel.any=Любое жидкое топливо +item.custom_missile_part.fuel.kerosene=Керосин / Пероксид +item.custom_missile_part.fuel.solid=Твёрдое топливо +item.custom_missile_part.fuel.hydrogen=Водород / Кислород +item.custom_missile_part.fuel.xenon=Ксеноновый газ +item.custom_missile_part.fuel.balefire=Ракетное жар-топливо / Пероксид + +item.custom_missile_part.rarity.common=§7Обычный +item.custom_missile_part.rarity.uncommon=§eНеобычный +item.custom_missile_part.rarity.rare=§bРедкий +item.custom_missile_part.rarity.epic=§dЭпический +item.custom_missile_part.rarity.legendary=§2Легендарный +item.custom_missile_part.rarity.strange=§3Странный + +item.missile.fuel.solid=Твёрдое топливо (предварительно заправленное) +item.missile.fuel.ethanol_peroxide=Этанол / Пероксид водорода +item.missile.fuel.kerosene_peroxide=Керосин / Пероксид водорода +item.missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +item.missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород + itemGroup.tabBlocks=Руды и блоки NTM itemGroup.tabConsumable=Расходные материалы и снаряжение NTM itemGroup.tabControl=Топливо и элементы механизмов NTM @@ -5019,7 +5077,7 @@ pa.pause_unloaded=Приостановлен pa.pause_unloaded.desc=Частица вошла$в незагруженный чанк. Операция$была приостановлена$до тех пор пока частица и источник частиц$не будут загружены. #The particle has entered an$unloaded chunk. The operation has$been suspended, until both the$particle and the particle source$are loaded. pa.crash_defocus=Расфокус! -pa.crash_defocus.desc=Частица потеряла фокус.$Убедитесь что ускоритель имеет достаточное количество квадрупольных магнитов. +pa.crash_defocus.desc=Частица потеряла фокус.$Убедитесь, что ускоритель имеет достаточное количество квадрупольных магнитов. pa.crash_derail=Сход с рельсов! pa.crash_derail.desc=Частица вышла за пределы ускорителя.$Убедитесь что никакие части не отсутствуют,$и что диполи настроены правильно. pa.crash_cannot_enter=Отклонено! @@ -5068,7 +5126,7 @@ radar.target.custom1015=Ракета 10/15 размера radar.target.custom15=Ракета 15 размера radar.target.custom1520=Ракета 15/20 размера radar.target.custom20=Ракета 20 размера -radar.target.doomsday=Ракета судного дня +radar.target.doomsday=Ракета Судного Дня radar.target.shuttle=Космический шаттл Reliant Robin radar.target.tier0=Ракета 0-го уровня radar.target.tier1=Ракета 1-го уровня @@ -5104,7 +5162,7 @@ rbmk.screen.rod=Управ: %s rbmk.screen.temp=Темп: %s rbmk.screen.xenon=Ксенон: %s -shape.barrelHeavy=Тяжелый ствол +shape.barrelHeavy=Тяжёлый ствол shape.barrelLight=Лёгкий ствол shape.billet=Заготовка shape.blade=Лопасть @@ -5217,9 +5275,9 @@ tile.block_copper.name=Медный блок tile.block_corium.name=Кориум tile.block_corium_cobble.name=Буриум tile.block_daffergon.name=Даффергоновый блок -tile.block_desh.name=Укрепленный блок деш +tile.block_desh.name=Укреплённый блок деш tile.block_dineutronium.name=Блок динейтрония -tile.block_dura_steel.name=Укрепленный блок высокоскоростной стали +tile.block_dura_steel.name=Укреплённый блок быстрорежущей стали tile.block_electrical_scrap.name=Блок отходов электроники tile.block_euphemium.name=Блок эвфемия tile.block_euphemium_cluster.name=Эвфемиево-вытравленный кластер шрабидия @@ -5249,7 +5307,7 @@ tile.block_meteor_treasure.name=Блок метеоритных сокровищ tile.block_mox_fuel.name=Блок МОКС топлива tile.block_neptunium.name=Нептуниевый блок tile.block_niter.name=Блок селитры -tile.block_niter_reinforced.name=Укрепленный блок селитры +tile.block_niter_reinforced.name=Укреплённый блок селитры tile.block_niobium.name=Блок ниобия tile.block_plutonium.name=Плутониевый блок tile.block_plutonium_fuel.name=Блок плутониевого топлива @@ -5297,7 +5355,7 @@ tile.block_waste_painted.name=Покрашенный блок ядерных о tile.block_waste_vitrified.name=Блок остеклованных ядерных отходов tile.block_weidanium.name=Вейданиевый блок tile.block_white_phosphorus.name=Блок белого фосфора -tile.block_yellowcake.name=Блок йеллоукейка +tile.block_yellowcake.name=Блок жёлтого кека tile.block_zirconium.name=Блок циркония tile.boat.name=Лодка tile.bobblehead.name=Болванчик @@ -5393,8 +5451,8 @@ tile.cm_circuit.schrabidium.name=Блок микросхем 5-го уровня tile.cm_engine.bismuth.name=Моторный блок из висмута tile.cm_engine.desh.name=Моторный блок из деша tile.cm_engine.standard.name=Моторный блок -tile.cm_flux.name=Приемник нейтронного потока -tile.cm_heat.name=Теплоприемник +tile.cm_flux.name=Приёмник нейтронного потока +tile.cm_heat.name=Теплоприёмник tile.cm_port.alloy.name=Люк из продвинутого сплава tile.cm_port.desh.name=Люк из деша tile.cm_port.steel.name=Люк из стали @@ -5418,7 +5476,7 @@ tile.concrete_brick_slab.brick_concrete_broken.name=Плита из разруш tile.concrete_brick_slab.brick_concrete_cracked.name=Плита из потресканных бетонных кирпичей tile.concrete_brick_slab.brick_concrete_mossy.name=Плита из замшелых бетонных кирпичей tile.concrete_brick_slab.brick_ducrete.name=Плита из дюкретовых кирпичей -tile.concrete_colored.black.name=Черный бетон +tile.concrete_colored.black.name=Чёрный бетон tile.concrete_colored.blue.name=Синий бетон tile.concrete_colored.brown.name=Коричневый бетон tile.concrete_colored.cyan.name=Бирюзовый бетон @@ -5471,19 +5529,19 @@ tile.corium_block.name=Кориум tile.crane_boxer.name=Конвейерный упаковщик tile.crane_boxer.desc=Загружает настраиваемое количество стопок в ящики, которые перемещаются по конвейерным лентам$Правый клик отверткой для установки входной стороны$Шифтовый клик отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_extractor.name=Конвейерный извлекатель -tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны +tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны tile.crane_grabber.name=Конвейерный сборщик -tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны +tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны tile.crane_inserter.name=Конвейерный вставщик tile.crane_inserter.desc=Принимает предметы с конвейеров и помещает их в контейнеры$Правый щелчок отверткой для установки входной стороны$Shift-щелчок отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_partitioner.name=Вставщик окислителя tile.crane_partitioner.desc=Принимает и сохраняет до девяти входов рудного окислителя$и освобождает их, если они соответствуют требуемому размеру входа.$Неправильные предметы также сохраняются и должны быть извлечены из стороны. tile.crane_router.name=Конвейерный сортировщик -tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как черный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит +tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как чёрный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит tile.crane_splitter.name=Конвейерный разделитель tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в вставщик или сортировщик$Соотношение можно настроить с помощью отвертки tile.crane_unboxer.name=Конвейерный распаковщик -tile.crane_unboxer.desc=Прием коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны +tile.crane_unboxer.desc=Приём коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны tile.crashed_bomb.name=Неразорвавшаяся бомба tile.crate.name=Ящик снабжения tile.crate_ammo.name=Ящик из звёздного металла @@ -5499,7 +5557,7 @@ tile.crate_supply.name=Ящик с припасами tile.crate_template.name=Сборочный ящик tile.crate_tungsten.name=Вольфрамовый ящик tile.crate_weapon.name=Ящик с оружием -tile.crystal_hardened.name=Закаленный темный кристалл +tile.crystal_hardened.name=Закаленный тёмный кристалл tile.crystal_pulsar.name=Пульсирующий кристалл tile.crystal_virus.name=Тёмный кристалл tile.deco_aluminium.name=Алюминиевый декоративный блок @@ -5595,14 +5653,14 @@ tile.factory_titanium_furnace.name=Люк доступа базовой фабр tile.factory_titanium_hull.name=Корпус базовой фабрики tile.fallout.name=Радиоактивный осадок tile.fan.name=Вентилятор -tile.fan.desc=Активируется редстоуном$Толкает существ до 10 блоков$ПКМ отвёрткой чтобы повернуть$ПКМ ручным сверлом чтобы переключить режим +tile.fan.desc=Активируется редстоуном$Толкает существ до 10 блоков$ПКМ отвёрткой, чтобы повернуть$ПКМ ручной дрелью, чтобы переключить режим tile.fan.falloffOn=Сила вентилятора уменьшается с расстоянием tile.fan.falloffOff=Постоянная сила вентилорая tile.fence_metal.name=Проволочная сетка tile.fence_metal_post.name=Столб проволочной сетки tile.field_disturber.name=Подавитель высокоэнергитических полей tile.filing_cabinet.green.name=Пыльный картотечный шкафчик -tile.filing_cabinet.steel.name=Стальной карточеный шкафчик +tile.filing_cabinet.steel.name=Стальной картотечный шкафчик tile.fire_digamma.name=Затяжная Дигамма tile.fire_door.name=Пожарная дверь tile.fireworks.name=Батарея фейерверков @@ -5685,8 +5743,8 @@ tile.glyphid_spawner.name=Спавнер улья глифидов tile.gneiss_brick.name=Сланцевые кирпичи tile.gneiss_chiseled.name=Высеченный сланец tile.gneiss_tile.name=Сланцевая плитка -tile.gravel_diamond.name=Измельченные алмазы -tile.gravel_obsidian.name=Измельченный обсидиан +tile.gravel_diamond.name=Измельчённые алмазы +tile.gravel_obsidian.name=Измельчённый обсидиан tile.hadron_access.name=Терминал доступа ускорителя частиц tile.hadron_analysis.name=Стенка камеры ускорителя частиц tile.hadron_analysis_glass.name=Окно камеры ускорителя частиц @@ -5720,7 +5778,7 @@ tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. tile.heater_heatex.name=Теплообменный нагреватель tile.heater_heatex.desc=Выделяет тепло из горячих жидкостей. -tile.heater_oilburner.name=Жидкостный бойлер +tile.heater_oilburner.name=Жидкостный котёл tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо.$Может быть настроено с помощью отвертки. tile.heater_oven.name=Нагревательная печь tile.heater_oven.desc=Производит тепло, сжигая твёрдое топливо.$Принимает тепло снизу с 50%% эффективностью. @@ -5787,7 +5845,7 @@ tile.machine_assemfac.name=Сборочный завод tile.machine_assembly_machine.name=Сборочная машина tile.machine_autocrafter.name=Автоматический верстак tile.machine_autosaw.name=Автоматическая пила -tile.machine_autosaw.desc=Срубает ближайшие растения, пересаживает деревья$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжелую нефть +tile.machine_autosaw.desc=Срубает ближайшие растения, пересаживает деревья$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжёлую нефть tile.machine_autosaw.suspended=Приостановлена tile.machine_bat9000.name=Охереть-большая цистерна 9000 tile.machine_battery.name=Энергохранилище @@ -5821,7 +5879,7 @@ tile.machine_controller.name=Блок удалённого доступа к р tile.machine_converter_he_rf.name=Конвертер энергии HE в RF tile.machine_converter_rf_he.name=Конвертер энергии RF в HE tile.machine_conveyor_press.name=Конвейерный пресс -tile.machine_conveyor_press.desc=Лента двигается слево-направо$ПКМ чтобы установить штамп$ПКМ отвёрткой чтобы снять штамп +tile.machine_conveyor_press.desc=Лента двигается слева направо$ПКМ, чтобы установить штамп$ПКМ отвёрткой, чтобы снять штамп tile.machine_crucible.name=Плавильня tile.machine_crystallizer.name=Рудный окислитель tile.machine_cyclotron.name=Циклотрон @@ -6018,7 +6076,7 @@ tile.ore_gneiss_lithium.name=Сланцевая литиевая руда tile.ore_gneiss_rare.name=Сланцевая редкоземельная руда tile.ore_gneiss_schrabidium.name=Сланцевая шрабидиевая руда tile.ore_gneiss_uranium.name=Сланцевая урановая руда -tile.ore_gneiss_uranium_scorched.name=Обожённая сланцевая урановая руда +tile.ore_gneiss_uranium_scorched.name=Обожжённая сланцевая урановая руда tile.ore_lead.name=Свинцовая руда tile.ore_lignite.name=Бурый уголь tile.ore_meteor.aluminium.name=Метеоритная алюминиевая руда @@ -6045,7 +6103,7 @@ tile.ore_nether_smoldering.name=Тлеющий адский камень tile.ore_nether_sulfur.name=Адская серная руда tile.ore_nether_tungsten.name=Адская вольфрамовая руда tile.ore_nether_uranium.name=Адская урановая руда -tile.ore_nether_uranium_scorched.name=Обожённая адская урановая руда +tile.ore_nether_uranium_scorched.name=Обожжённая адская урановая руда tile.ore_niter.name=Селитровая руда tile.ore_oil.name=Нефтяной карман tile.ore_oil_empty.name=Пустой нефтяной карман @@ -6058,16 +6116,16 @@ tile.ore_sellafield_diamond.name=Селлафитовая алмазная ру tile.ore_sellafield_emerald.name=Селлафитовая изумрудная руда tile.ore_sellafield_radgem.name=Селлафитовый радиоактивный самоцвет tile.ore_sellafield_schrabidium.name=Селлафитовая шрабидиевая руда -tile.ore_sellafield_uranium_scorched.name=Обожженная селлафитовая урановая руда +tile.ore_sellafield_uranium_scorched.name=Обожжённая селлафитовая урановая руда tile.ore_sulfur.name=Серная руда -tile.ore_tektite_osmiridium.name=Перемешанный с осмиридием Тектит +tile.ore_tektite_osmiridium.name=Перемешанный с осмиридием тектит tile.ore_thorium.name=Ториевая руда tile.ore_tikite.name=Трикситовая руда tile.ore_titanium.name=Титановая руда tile.ore_tungsten.name=Вольфрамовая руда tile.ore_unobtainium.name=Брайтбленд tile.ore_uranium.name=Урановая руда -tile.ore_uranium_scorched.name=Обожженная урановая руда +tile.ore_uranium_scorched.name=Обожжённая урановая руда tile.ore_verticium.name=Долларовый Зелёный минерал tile.ore_volcano.name=Геотермальный источник tile.ore_weidanium.name=Вейдитит @@ -6082,7 +6140,7 @@ tile.pa_quadrupole.desc=Требует охлаждения!$Уменьшает tile.pa_rfc.name=Радиочастотный резонатор tile.pa_rfc.desc=Требует охлаждения!$Ускоряет частицы на 100 единиц,$и увеличивает расфокус на 100 единиц.$Частица столкнется при достижении расфокуса в 1000 единиц. tile.pa_source.name=Источник частиц -tile.pa_source.desc=Требует охлаждения!$Использует два предмета чтобы создать частицу. +tile.pa_source.desc=Требует охлаждения!$Использует два предмета, чтобы создать частицу. tile.part_emitter.name=Декоративный источник частиц tile.pedestal.name=Пьедестал tile.pink_barrel.name=Керосиновая бочка @@ -6118,7 +6176,7 @@ tile.pribris_burning.name=Горящие обломки РБМК tile.pribris_digamma.name=Почерневшие обломки РБМК tile.pribris_radiating.name=Тлеющие обломки РБМК tile.pump_electric.name=Электрический насос для грунтовых вод -tile.pump_electric.desc=Использует электричество для выкачивания грунтовых вод$Выкачывает до 10,000мБ/тик$Должно быть размещено ниже Y:70 +tile.pump_electric.desc=Использует электричество для выкачивания грунтовых вод$Выкачивает до 10,000мБ/тик$Должно быть размещено ниже Y:70 tile.pump_steam.name=Паровой насос для грунтовых вод tile.pump_steam.desc=Использует пар для выкачивания грунтовых вод$Выкачывает до 1000мБ/тик$Должно быть размещено ниже Y:70 tile.pwr_block.name=Водо-водяной энергетический реактор (ВВЭР) @@ -6311,7 +6369,7 @@ tile.stones_slab.lightstone.2.name=Плита из светлокаменног tile.struct_icf_core.name=Ядро инерциального термоядерного реактора (ICF) tile.struct_iter_core.name=Ядро термоядерного реактора tile.struct_launcher.name=Блок-компонент пусковой площадки -tile.struct_launcher_core.name=Compact Launch Pad Core Component +tile.struct_launcher_core.name=Ядро компактной пусковой площадки tile.struct_launcher_core_large.name=Ядро большой пусковой площадки tile.struct_plasma_core.name=Ядро нагревателя плазмы tile.struct_scaffold.name=Подмосток пусковой площадки @@ -6340,7 +6398,7 @@ tile.turret_chekhov.name=Крупнокалиберная пулеметная tile.turret_cwis.name=”Фэленкс” Mk-15 CIWS tile.turret_flamer.name=Турель с огнемётом tile.turret_friendly.name=Турель Гатлинга "Мистер Дружелюбный" -tile.turret_fritz.name=Тяжелая огнеметная турель "Фриц" +tile.turret_fritz.name=Тяжёлая огнеметная турель "Фриц" tile.turret_heavy.name=Турель с тяжёлым пулемётом tile.turret_himars.name=Ракетная артиллерийская турель "Генри" tile.turret_howard.name=Двойная турель Гатлинга CIWS "Говард" @@ -6407,7 +6465,7 @@ tile.sliding_seal_door.name=Раздвижная герметичная двер trait.asbestos=Содержит асбест trait.blinding=Ослепление trait.coal=Угольная пыль -trait.digamma=Дигамма радиация +trait.digamma=Дигамма-радиация trait.drop=Опасно выкидывать trait.explosive=Воспламеняющийся / Взрывоопасный trait.furnace=Даёт %s операций в ядерной печи @@ -6466,7 +6524,7 @@ tool.ability.hammer_flat=Плоская зона действия tool.ability.luck=Удача tool.ability.mercury=Ртутное касание tool.ability.midas=Прикосновение Мидаса -tool.ability.recursion=Жилковый Майнер +tool.ability.recursion=Жилковый майнер tool.ability.shredder=Авто-измельчитель tool.ability.silktouch=Шёлковое касание tool.ability.smelter=Авто-плавка @@ -6538,3 +6596,29 @@ desc.gui.upgrade.power= * §1Энергосбережение§r: Стакает desc.gui.upgrade.speed= * §4Скорость§r: Стакается до 3-х уровней tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель + +desc.util.type=Тип +desc.util.size=Размер +desc.util.weight=Вес +desc.util.inaccuracy=Неточность +desc.util.strength=Сила +desc.util.top_size=Верхний размер +desc.util.bottom_size=Нижний размер +desc.util.fuel_type=Тип топлива +desc.util.fuel_amount=Количество топлива +desc.util.health=Здоровье +desc.util.rarity=Редкость +desc.util.not_launchable=Не запускается! +desc.util.fuel_capacity=Ёмкость топливного бака +desc.util.warhead=Боеголовка +desc.util.chip_inaccuracy=Неточность чипа +desc.util.fin_inaccuracy=Неточность стабилизатора + +gui.chemical.duration=Длительность: %s +gui.chemical.consumption=Потребление: %s +gui.chemical.input=Вход: +gui.chemical.output=Выход: +gui.chemical.click_to_set_recipe=Нажмите, чтобы выбрать рецепт + + +// Last updated 23.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // From fa6b4faeeed484b8bc727c058965fd3724234c17 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 17:09:19 -0600 Subject: [PATCH 262/323] I18n for machines implementation --- .../gui/GUIMachineAssemblyMachine.java | 33 +++++---- .../gui/GUIMachineChemicalPlant.java | 35 ++++----- .../hbm/inventory/gui/GUIMachinePUREX.java | 31 ++++---- .../recipes/loader/GenericRecipe.java | 73 +++++++++++++------ src/main/resources/assets/hbm/lang/en_US.lang | 11 +++ src/main/resources/assets/hbm/lang/ru_RU.lang | 16 ++-- 6 files changed, 123 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index d69a8f062..5104850ca 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -8,6 +8,7 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -21,22 +22,22 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_assembler.png"); private TileEntityMachineAssemblyMachine assembler; - + public GUIMachineAssemblyMachine(InventoryPlayer invPlayer, TileEntityMachineAssemblyMachine tedf) { super(new ContainerMachineAssemblyMachine(invPlayer, tedf)); assembler = tedf; - + this.xSize = 176; this.ySize = 256; } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 99, 52, 16); assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 99, 52, 16); - + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { @@ -44,32 +45,32 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule.recipe); this.func_146283_a(recipe.print(), mouseX, mouseY); } else { - this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); } } } - + @Override protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.assembler.hasCustomInventoryName() ? this.assembler.getInventoryName() : I18n.format(this.assembler.getInventoryName()); - + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + int p = (int) (assembler.power * 61 / assembler.maxPower); drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); @@ -77,25 +78,25 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { int j = (int) Math.ceil(70 * assembler.assemblerModule.progress); drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); - + /// LEFT LED if(assembler.didProcess) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); } - + /// RIGHT LED if(assembler.didProcess) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null && assembler.power >= recipe.power) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); } - + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); - + if(recipe != null && recipe.inputItem != null) { for(int i = 0; i < recipe.inputItem.length; i++) { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule.inputSlots[i]); @@ -115,7 +116,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { GL11.glColor4f(1F, 1F, 1F, 1F); GL11.glDisable(GL11.GL_BLEND); } - + assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 52, 16, 1); assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 52, 16, 1); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index 78a2e619b..50838b3a8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -8,6 +8,7 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -21,15 +22,15 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_chemplant.png"); private TileEntityMachineChemicalPlant chemplant; - + public GUIMachineChemicalPlant(InventoryPlayer invPlayer, TileEntityMachineChemicalPlant tedf) { super(new ContainerMachineChemicalPlant(invPlayer, tedf)); chemplant = tedf; - + this.xSize = 176; this.ySize = 256; } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -38,7 +39,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { chemplant.inputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 8 + i * 18, guiTop + 18, 16, 34); chemplant.outputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 80 + i * 18, guiTop + 18, 16, 34); } - + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, chemplant.power, chemplant.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { @@ -46,32 +47,32 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule.recipe); this.func_146283_a(recipe.print(), mouseX, mouseY); } else { - this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); } } } - + @Override protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.chemplant.hasCustomInventoryName() ? this.chemplant.getInventoryName() : I18n.format(this.chemplant.getInventoryName()); - + String name = this.chemplant.hasCustomInventoryName() ? this.chemplant.getInventoryName() : I18nUtil.resolveKey(this.chemplant.getInventoryName()); + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + this.fontRendererObj.drawString(I18nUtil.resolveKey("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + int p = (int) (chemplant.power * 61 / chemplant.maxPower); drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); @@ -79,25 +80,25 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { int j = (int) Math.ceil(70 * chemplant.chemplantModule.progress); drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule.recipe); - + /// LEFT LED if(chemplant.didProcess) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); } - + /// RIGHT LED if(chemplant.didProcess) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null && chemplant.power >= recipe.power) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); } - + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); - + if(recipe != null && recipe.inputItem != null) { for(int i = 0; i < recipe.inputItem.length; i++) { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(chemplant.chemplantModule.inputSlots[i]); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java index 3cb1b0108..8d746cf11 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java @@ -8,6 +8,7 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachinePUREX; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -21,15 +22,15 @@ public class GUIMachinePUREX extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_purex.png"); private TileEntityMachinePUREX purex; - + public GUIMachinePUREX(InventoryPlayer invPlayer, TileEntityMachinePUREX tedf) { super(new ContainerMachinePUREX(invPlayer, tedf)); purex = tedf; - + this.xSize = 176; this.ySize = 256; } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -38,7 +39,7 @@ public class GUIMachinePUREX extends GuiInfoContainer { purex.inputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 8 + i * 18, guiTop + 18, 16, 52); } purex.outputTanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 36, 16, 52); - + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, purex.power, purex.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { @@ -46,32 +47,32 @@ public class GUIMachinePUREX extends GuiInfoContainer { GenericRecipe recipe = (GenericRecipe) PUREXRecipes.INSTANCE.recipeNameMap.get(this.purex.purexModule.recipe); this.func_146283_a(recipe.print(), mouseX, mouseY); } else { - this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); } } } - + @Override protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PUREXRecipes.INSTANCE, purex, purex.purexModule.recipe, 0, ItemBlueprints.grabPool(purex.slots[1]), this); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.purex.hasCustomInventoryName() ? this.purex.getInventoryName() : I18n.format(this.purex.getInventoryName()); - + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + int p = (int) (purex.power * 61 / purex.maxPower); drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); @@ -79,25 +80,25 @@ public class GUIMachinePUREX extends GuiInfoContainer { int j = (int) Math.ceil(70 * purex.purexModule.progress); drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - + GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purex.purexModule.recipe); - + /// LEFT LED if(purex.didProcess) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); } - + /// RIGHT LED if(purex.didProcess) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null && purex.power >= recipe.power) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); } - + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); - + if(recipe != null && recipe.inputItem != null) { for(int i = 0; i < recipe.inputItem.length; i++) { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(purex.purexModule.inputSlots[i]); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 99c37e984..2c53d35dd 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -35,20 +35,20 @@ public class GenericRecipe { public boolean customLocalization = false; protected String[] blueprintPools = null; public String autoSwitchGroup = null; - + public GenericRecipe(String name) { this.name = name; } - + public boolean isPooled() { return blueprintPools != null; } public String[] getPools() { return this.blueprintPools; } - + public boolean isPartOfPool(String lookingFor) { if(!isPooled()) return false; for(String pool : blueprintPools) if (pool.equals(lookingFor)) return true; return false; } - + public GenericRecipe setDuration(int duration) { this.duration = duration; return this; } public GenericRecipe setPower(long power) { this.power = power; return this; } public GenericRecipe setup(int duration, long power) { return this.setDuration(duration).setPower(power); } @@ -68,13 +68,13 @@ public class GenericRecipe { public GenericRecipe inputFluidsEx(FluidStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } public GenericRecipe outputFluids(FluidStack... output) { this.outputFluid = output; return this; } - + public GenericRecipe outputItems(ItemStack... output) { this.outputItem = new IOutput[output.length]; for(int i = 0; i < outputItem.length; i++) this.outputItem[i] = new ChanceOutput(output[i]); return this; } - + public GenericRecipe setIconToFirstIngredient() { if(this.inputItem != null) { List stacks = this.inputItem[0].extractForNEI(); @@ -82,9 +82,9 @@ public class GenericRecipe { } return this; } - + public ItemStack getIcon() { - + if(icon == null) { if(outputItem != null) { if(outputItem[0] instanceof ChanceOutput) icon = ((ChanceOutput) outputItem[0]).stack.copy(); @@ -95,15 +95,15 @@ public class GenericRecipe { icon = ItemFluidIcon.make(outputFluid[0]); } } - + if(icon == null) icon = new ItemStack(ModItems.nothing); return icon; } - + public String getInternalName() { return this.name; } - + public String getLocalizedName() { String name = null; if(customLocalization) name = I18nUtil.resolveKey(this.name); @@ -111,28 +111,57 @@ public class GenericRecipe { if(this.nameWrapper != null) name = I18nUtil.resolveKey(this.nameWrapper, name); return name; } - + public List print() { List list = new ArrayList(); list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + + // autoswitch group (two lines: label + "Enabled for") if(this.autoSwitchGroup != null) { - String[] lines = I18nUtil.resolveKeyArray("autoswitch", I18nUtil.resolveKey(this.autoSwitchGroup)); - for(String line : lines) list.add(EnumChatFormatting.GOLD + line); + String groupNameLocalized = I18nUtil.resolveKey(this.autoSwitchGroup); + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.recipe.autoswitch") + ": " + groupNameLocalized); + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.recipe.enabledFor") + " " + groupNameLocalized); } - if(duration > 0) list.add(EnumChatFormatting.RED + "Duration: " + this.duration / 20D + "s"); - if(power > 0) list.add(EnumChatFormatting.RED + "Consumption: " + BobMathUtil.getShortNumber(power) + "HE/t"); - list.add(EnumChatFormatting.BOLD + "Input:"); + + // duration (seconds) + if(duration > 0) { + double seconds = this.duration / 20D; + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.recipe.duration") + ": " + seconds + "s"); + } + + // power / consumption + if(power > 0) { + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.recipe.consumption") + ": " + BobMathUtil.getShortNumber(power) + "HE/t"); + } + + // input label + items + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.input") + ":"); if(inputItem != null) for(AStack stack : inputItem) { ItemStack display = stack.extractForCyclingDisplay(20); list.add(" " + EnumChatFormatting.GRAY + display.stackSize + "x " + display.getDisplayName()); } - if(inputFluid != null) for(FluidStack fluid : inputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " at " + EnumChatFormatting.RED + fluid.pressure + " PU")); - list.add(EnumChatFormatting.BOLD + "Output:"); - if(outputItem != null) for(IOutput output : outputItem) for(String line : output.getLabel()) list.add(" " + line); - if(outputFluid != null) for(FluidStack fluid : outputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " at " + EnumChatFormatting.RED + fluid.pressure + " PU")); + if(inputFluid != null) for(FluidStack fluid : inputFluid) { + String mB = I18nUtil.resolveKey("gui.recipe.mB"); + String pressurePart = fluid.pressure == 0 ? "" : + " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU"; + list.add(" " + EnumChatFormatting.BLUE + fluid.fill + mB + " " + fluid.type.getLocalizedName() + pressurePart); + } + + // output label + items + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.output") + ":"); + if(outputItem != null) for(IOutput output : outputItem) + for(String line : output.getLabel()) list.add(" " + line); + if(outputFluid != null) for(FluidStack fluid : outputFluid) { + String mB = I18nUtil.resolveKey("gui.recipe.mB"); + String pressurePart = fluid.pressure == 0 ? "" : + " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU"; + list.add(" " + EnumChatFormatting.BLUE + fluid.fill + mB + " " + fluid.type.getLocalizedName() + pressurePart); + } + return list; } - + + /** Default impl only matches localized name substring, can be extended to include ingredients as well */ public boolean matchesSearch(String substring) { return getLocalizedName().toLowerCase(Locale.US).contains(substring.toLowerCase(Locale.US)); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e772302f4..cf7cfd858 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6270,4 +6270,15 @@ desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 +# Shared recipe labels +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.mB=mB +gui.recipe.atPressure=at +gui.recipe.autoswitch=Auto-switch group +gui.recipe.enabledFor=Enabled for +gui.recipe.setRecipe=Click to set recipe + tile.oc_cable_paintable.name=Paintable Network Cable diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 154e215fa..09e404bdf 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6614,11 +6614,15 @@ desc.util.warhead=Боеголовка desc.util.chip_inaccuracy=Неточность чипа desc.util.fin_inaccuracy=Неточность стабилизатора -gui.chemical.duration=Длительность: %s -gui.chemical.consumption=Потребление: %s -gui.chemical.input=Вход: -gui.chemical.output=Выход: -gui.chemical.click_to_set_recipe=Нажмите, чтобы выбрать рецепт - +# Shared recipe labels +gui.recipe.duration=Длительность +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.mB=mB +gui.recipe.atPressure=при давлении в +gui.recipe.autoswitch=Группа автоматического переключения +gui.recipe.enabledFor=Включено для +gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт // Last updated 23.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // From 60b9e1fb186e3fd1bdb397543a41571571cd40f7 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 17:51:01 -0600 Subject: [PATCH 263/323] I18n implementation for missiles and sattelites --- .../com/hbm/items/machine/ItemSatChip.java | 43 +-- .../hbm/items/weapon/ItemCustomMissile.java | 71 +++-- .../items/weapon/ItemCustomMissilePart.java | 291 +++++++++--------- .../com/hbm/items/weapon/ItemMissile.java | 69 +++-- 4 files changed, 252 insertions(+), 222 deletions(-) diff --git a/src/main/java/com/hbm/items/machine/ItemSatChip.java b/src/main/java/com/hbm/items/machine/ItemSatChip.java index b02dd36fa..5f66e57a1 100644 --- a/src/main/java/com/hbm/items/machine/ItemSatChip.java +++ b/src/main/java/com/hbm/items/machine/ItemSatChip.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.items.ISatChip; import com.hbm.items.ModItems; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -14,36 +15,36 @@ public class ItemSatChip extends Item implements ISatChip { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add("Satellite frequency: " + getFreq(itemstack)); - + list.add(I18nUtil.resolveKey("satchip.frequency") + ": " + getFreq(itemstack)); + if(this == ModItems.sat_foeq) - list.add("Gives you an achievement. That's it."); - + list.add(I18nUtil.resolveKey("satchip.foeq")); + if(this == ModItems.sat_gerald) { - list.add("Single use."); - list.add("Requires orbital module."); - list.add("Melter of CPUs, bane of every server owner."); + list.add(I18nUtil.resolveKey("satchip.gerald.line1")); + list.add(I18nUtil.resolveKey("satchip.gerald.line2")); + list.add(I18nUtil.resolveKey("satchip.gerald.line3")); } - + if(this == ModItems.sat_laser) - list.add("Allows to summon lasers with a 15 second cooldown."); - + list.add(I18nUtil.resolveKey("satchip.laser")); + if(this == ModItems.sat_mapper) - list.add("Displays currently loaded chunks."); - + list.add(I18nUtil.resolveKey("satchip.mapper")); + if(this == ModItems.sat_miner) - list.add("Will deliver ore powders to a cargo landing pad."); - + list.add(I18nUtil.resolveKey("satchip.miner")); + if(this == ModItems.sat_lunar_miner) - list.add("Mines moon turf to deliver it to a cargo landing pad."); - + list.add(I18nUtil.resolveKey("satchip.lunar_miner")); + if(this == ModItems.sat_radar) - list.add("Shows a map of active entities."); - + list.add(I18nUtil.resolveKey("satchip.radar")); + if(this == ModItems.sat_resonator) - list.add("Allows for teleportation with no cooldown."); - + list.add(I18nUtil.resolveKey("satchip.resonator")); + if(this == ModItems.sat_scanner) - list.add("Creates a topdown map of underground ores."); + list.add(I18nUtil.resolveKey("satchip.scanner")); } } diff --git a/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java b/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java index a0bd103b3..6d428a401 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java @@ -6,6 +6,7 @@ import com.hbm.handler.MissileStruct; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissilePart.FuelType; import com.hbm.items.weapon.ItemCustomMissilePart.WarheadType; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -15,35 +16,35 @@ import net.minecraft.util.EnumChatFormatting; public class ItemCustomMissile extends Item { public static ItemStack buildMissile(Item chip, Item warhead, Item fuselage, Item stability, Item thruster) { - + if(stability == null) { return buildMissile(new ItemStack(chip), new ItemStack(warhead), new ItemStack(fuselage), null, new ItemStack(thruster)); } else { return buildMissile(new ItemStack(chip), new ItemStack(warhead), new ItemStack(fuselage), new ItemStack(stability), new ItemStack(thruster)); } } - + public static ItemStack buildMissile(ItemStack chip, ItemStack warhead, ItemStack fuselage, ItemStack stability, ItemStack thruster) { - + ItemStack missile = new ItemStack(ModItems.missile_custom); writeToNBT(missile, "chip", Item.getIdFromItem(chip.getItem())); writeToNBT(missile, "warhead", Item.getIdFromItem(warhead.getItem())); writeToNBT(missile, "fuselage", Item.getIdFromItem(fuselage.getItem())); writeToNBT(missile, "thruster", Item.getIdFromItem(thruster.getItem())); - + if(stability != null) writeToNBT(missile, "stability", Item.getIdFromItem(stability.getItem())); - + return missile; } - + private static void writeToNBT(ItemStack stack, String key, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.stackTagCompound.setInteger(key, value); } - + public static int readFromNBT(ItemStack stack, String key) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); @@ -52,53 +53,63 @@ public class ItemCustomMissile extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + if(!stack.hasTagCompound()) return; - + try { ItemCustomMissilePart chip = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "chip")); ItemCustomMissilePart warhead = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "warhead")); ItemCustomMissilePart fuselage = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "fuselage")); ItemCustomMissilePart stability = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "stability")); ItemCustomMissilePart thruster = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "thruster")); - - list.add(EnumChatFormatting.BOLD + "Warhead: " + EnumChatFormatting.GRAY + warhead.getWarhead((WarheadType)warhead.attributes[0])); - list.add(EnumChatFormatting.BOLD + "Strength: " + EnumChatFormatting.GRAY + (Float)warhead.attributes[1]); - list.add(EnumChatFormatting.BOLD + "Fuel Type: " + EnumChatFormatting.GRAY + fuselage.getFuel((FuelType)fuselage.attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel amount: " + EnumChatFormatting.GRAY + (Float)fuselage.attributes[1] + "l"); - list.add(EnumChatFormatting.BOLD + "Chip inaccuracy: " + EnumChatFormatting.GRAY + (Float)chip.attributes[0] * 100 + "%"); - + + // warhead name + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.warhead") + ": " + EnumChatFormatting.GRAY + warhead.getWarhead((WarheadType)warhead.attributes[0])); + + // strength + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.strength") + ": " + EnumChatFormatting.GRAY + (Float)warhead.attributes[1]); + + // fuel type & amount + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.fuelType") + ": " + EnumChatFormatting.GRAY + fuselage.getFuel((FuelType)fuselage.attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)fuselage.attributes[1] + "l"); + + // chip inaccuracy + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.chipInaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)chip.attributes[0] * 100 + "%"); + + // fin inaccuracy if(stability != null) - list.add(EnumChatFormatting.BOLD + "Fin inaccuracy: " + EnumChatFormatting.GRAY + (Float)stability.attributes[0] * 100 + "%"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.finInaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)stability.attributes[0] * 100 + "%"); else - list.add(EnumChatFormatting.BOLD + "Fin inaccuracy: " + EnumChatFormatting.GRAY + "100%"); - - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + fuselage.getSize(fuselage.top) + "/" + fuselage.getSize(fuselage.bottom)); - + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.finInaccuracy") + ": " + EnumChatFormatting.GRAY + "100%"); + + // size + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.size") + ": " + EnumChatFormatting.GRAY + fuselage.getSize(fuselage.top) + "/" + fuselage.getSize(fuselage.bottom)); + + // health float health = warhead.health + fuselage.health + thruster.health; if(stability != null) health += stability.health; - - list.add(EnumChatFormatting.BOLD + "Health: " + EnumChatFormatting.GRAY + health + "HP"); - + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); + } catch(Exception ex) { - list.add(EnumChatFormatting.RED + "### I AM ERROR ###"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("error.generic")); } } - + public static MissileStruct getStruct(ItemStack stack) { - + if(stack == null || !(stack.getItem() instanceof ItemCustomMissile)) return null; - + ItemCustomMissilePart warhead = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "warhead")); ItemCustomMissilePart fuselage = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "fuselage")); ItemCustomMissilePart stability = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "stability")); ItemCustomMissilePart thruster = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "thruster")); - + MissileStruct missile = new MissileStruct(warhead, fuselage, stability, thruster); - + return missile; } } diff --git a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java index 26c459982..0318b3875 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java +++ b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java @@ -8,6 +8,7 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.items.special.ItemLootCrate; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -15,7 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class ItemCustomMissilePart extends Item { - + public PartType type; public PartSize top; public PartSize bottom; @@ -24,37 +25,37 @@ public class ItemCustomMissilePart extends Item { private String title; private String author; private String witty; - + public ItemCustomMissilePart() { this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.missileTab); } - + public static HashMap parts = new HashMap(); - + /** * == Chips == * [0]: inaccuracy - * + * * == Warheads == * [0]: type * [1]: strength/radius/cluster count * [2]: weight - * + * * == Fuselages == * [0]: type * [1]: tank size - * + * * == Stability == * [0]: inaccuracy mod - * + * * == Thrusters === * [0]: type * [1]: consumption * [2]: lift strength */ public Object[] attributes; - + public enum PartType { CHIP, WARHEAD, @@ -62,9 +63,9 @@ public class ItemCustomMissilePart extends Item { FINS, THRUSTER } - + public enum PartSize { - + //for chips ANY, //for missile tips and thrusters @@ -74,9 +75,9 @@ public class ItemCustomMissilePart extends Item { SIZE_15, SIZE_20 } - + public enum WarheadType { - + HE, INC, BUSTER, @@ -89,8 +90,8 @@ public class ItemCustomMissilePart extends Item { TAINT, CLOUD, TURBINE, - - //shit solution but it works. this allows traits to be attached to these empty dummy types, allowing for custom warheads + + //dummy/custom types CUSTOM0, CUSTOM1, CUSTOM2, CUSTOM3, CUSTOM4, CUSTOM5, CUSTOM6, CUSTOM7, CUSTOM8, CUSTOM9; /** Overrides that type's impact effect. Only runs serverside */ @@ -100,44 +101,50 @@ public class ItemCustomMissilePart extends Item { /** Override for the warhead's name in the missile description */ public String labelCustom = null; } - + public enum FuelType { - + KEROSENE, SOLID, HYDROGEN, XENON, BALEFIRE } - + public enum Rarity { - - COMMON(EnumChatFormatting.GRAY + "Common"), - UNCOMMON(EnumChatFormatting.YELLOW + "Uncommon"), - RARE(EnumChatFormatting.AQUA + "Rare"), - EPIC(EnumChatFormatting.LIGHT_PURPLE + "Epic"), - LEGENDARY(EnumChatFormatting.DARK_GREEN + "Legendary"), - SEWS_CLOTHES_AND_SUCKS_HORSE_COCK(EnumChatFormatting.DARK_AQUA + "Strange"); - - String name; - - Rarity(String name) { - this.name = name; + + COMMON("part.rarity.common", EnumChatFormatting.GRAY), + UNCOMMON("part.rarity.uncommon", EnumChatFormatting.YELLOW), + RARE("part.rarity.rare", EnumChatFormatting.AQUA), + EPIC("part.rarity.epic", EnumChatFormatting.LIGHT_PURPLE), + LEGENDARY("part.rarity.legendary", EnumChatFormatting.DARK_GREEN), + SEWS_CLOTHES_AND_SUCKS_HORSE_COCK("part.rarity.strange", EnumChatFormatting.DARK_AQUA); + + private final String key; + private final EnumChatFormatting color; + + Rarity(String key, EnumChatFormatting color) { + this.key = key; + this.color = color; + } + + public String getDisplay() { + return color + I18nUtil.resolveKey(key); } } - + public ItemCustomMissilePart makeChip(float inaccuracy) { - + this.type = PartType.CHIP; this.top = PartSize.ANY; this.bottom = PartSize.ANY; this.attributes = new Object[] { inaccuracy }; - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeWarhead(WarheadType type, float punch, float weight, PartSize size) { this.type = PartType.WARHEAD; @@ -145,12 +152,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = size; this.attributes = new Object[] { type, punch, weight }; setTextureName(RefStrings.MODID + ":mp_warhead"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeFuselage(FuelType type, float fuel, PartSize top, PartSize bottom) { this.type = PartType.FUSELAGE; @@ -158,12 +165,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = bottom; attributes = new Object[] { type, fuel }; setTextureName(RefStrings.MODID + ":mp_fuselage"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeStability(float inaccuracy, PartSize size) { this.type = PartType.FINS; @@ -171,12 +178,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = size; this.attributes = new Object[] { inaccuracy }; setTextureName(RefStrings.MODID + ":mp_stability"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeThruster(FuelType type, float consumption, float lift, PartSize size) { this.type = PartType.THRUSTER; @@ -184,9 +191,9 @@ public class ItemCustomMissilePart extends Item { this.bottom = PartSize.NONE; this.attributes = new Object[] { type, consumption, lift }; setTextureName(RefStrings.MODID + ":mp_thruster"); - + parts.put(this.hashCode(), this); - + return this; } @@ -196,122 +203,122 @@ public class ItemCustomMissilePart extends Item { if(title != null) list.add(EnumChatFormatting.DARK_PURPLE + "\"" + title + "\""); - + try { switch(type) { - case CHIP: - list.add(EnumChatFormatting.BOLD + "Inaccuracy: " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); - break; - case WARHEAD: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + "Type: " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Strength: " + EnumChatFormatting.GRAY + (Float)attributes[1]); - list.add(EnumChatFormatting.BOLD + "Weight: " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); - break; - case FUSELAGE: - list.add(EnumChatFormatting.BOLD + "Top size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Bottom size: " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + "Fuel type: " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel amount: " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); - break; - case FINS: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Inaccuracy: " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); - break; - case THRUSTER: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Fuel type: " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel consumption: " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); - list.add(EnumChatFormatting.BOLD + "Max. payload: " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); - break; + case CHIP: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + break; + case WARHEAD: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.type") + ": " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.strength") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1]); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.weight") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + break; + case FUSELAGE: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.topSize") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.bottomSize") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); + break; + case FINS: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + break; + case THRUSTER: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelConsumption") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.maxPayload") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + break; } } catch(Exception ex) { - list.add("### I AM ERROR ###"); + list.add(I18nUtil.resolveKey("error.generic")); } - + if(type != PartType.CHIP) - list.add(EnumChatFormatting.BOLD + "Health: " + EnumChatFormatting.GRAY + health + "HP"); - + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); + if(this.rarity != null) - list.add(EnumChatFormatting.BOLD + "Rarity: " + EnumChatFormatting.GRAY + this.rarity.name); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.rarity") + ": " + EnumChatFormatting.GRAY + this.rarity.getDisplay()); if(author != null) - list.add(EnumChatFormatting.WHITE + " by " + author); + list.add(EnumChatFormatting.WHITE + " " + I18nUtil.resolveKey("part.by") + " " + author); if(witty != null) list.add(EnumChatFormatting.GOLD + " " + EnumChatFormatting.ITALIC + "\"" + witty + "\""); } - + public String getSize(PartSize size) { - + switch(size) { - case ANY: - return "Any"; - case SIZE_10: - return "1.0m"; - case SIZE_15: - return "1.5m"; - case SIZE_20: - return "2.0m"; - default: - return "None"; + case ANY: + return I18nUtil.resolveKey("part.size.any"); + case SIZE_10: + return "1.0m"; + case SIZE_15: + return "1.5m"; + case SIZE_20: + return "2.0m"; + default: + return I18nUtil.resolveKey("part.size.none"); } } - + public String getWarhead(WarheadType type) { - + if(type.labelCustom != null) return type.labelCustom; - + switch(type) { - case HE: - return EnumChatFormatting.YELLOW + "HE"; - case INC: - return EnumChatFormatting.GOLD + "Incendiary"; - case CLUSTER: - return EnumChatFormatting.GRAY + "Cluster"; - case BUSTER: - return EnumChatFormatting.WHITE + "Bunker Buster"; - case NUCLEAR: - return EnumChatFormatting.DARK_GREEN + "Nuclear"; - case TX: - return EnumChatFormatting.DARK_PURPLE + "Thermonuclear (TX)"; - case N2: - return EnumChatFormatting.RED + "N²"; - case BALEFIRE: - return EnumChatFormatting.GREEN + "BF"; - case SCHRAB: - return EnumChatFormatting.AQUA + "Schrabidium"; - case TAINT: - return EnumChatFormatting.DARK_PURPLE + "Taint"; - case CLOUD: - return EnumChatFormatting.LIGHT_PURPLE + "Cloud"; - case TURBINE: - return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + "Turbine"; - default: - return EnumChatFormatting.BOLD + "N/A"; + case HE: + return EnumChatFormatting.YELLOW + I18nUtil.resolveKey("warhead.he"); + case INC: + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("warhead.incendiary"); + case CLUSTER: + return EnumChatFormatting.GRAY + I18nUtil.resolveKey("warhead.cluster"); + case BUSTER: + return EnumChatFormatting.WHITE + I18nUtil.resolveKey("warhead.bunker_buster"); + case NUCLEAR: + return EnumChatFormatting.DARK_GREEN + I18nUtil.resolveKey("warhead.nuclear"); + case TX: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("warhead.thermonuclear"); + case N2: + return EnumChatFormatting.RED + I18nUtil.resolveKey("warhead.n2"); + case BALEFIRE: + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("warhead.balefire"); + case SCHRAB: + return EnumChatFormatting.AQUA + I18nUtil.resolveKey("warhead.schrabidium"); + case TAINT: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("warhead.taint"); + case CLOUD: + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("warhead.cloud"); + case TURBINE: + return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + I18nUtil.resolveKey("warhead.turbine"); + default: + return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } } - + public String getFuel(FuelType type) { - + switch(type) { - case KEROSENE: - return EnumChatFormatting.LIGHT_PURPLE + "Kerosene / Peroxide"; - case SOLID: - return EnumChatFormatting.GOLD + "Solid Fuel"; - case HYDROGEN: - return EnumChatFormatting.DARK_AQUA + "Hydrogen / Oxygen"; - case XENON: - return EnumChatFormatting.DARK_PURPLE + "Xenon Gas"; - case BALEFIRE: - return EnumChatFormatting.GREEN + "BF Rocket Fuel / Peroxide"; - default: - return EnumChatFormatting.BOLD + "N/A"; + case KEROSENE: + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("missile.fuel.kerosene_peroxide"); // reuse missile fuel keys + case SOLID: + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("missile.fuel.solid"); + case HYDROGEN: + return EnumChatFormatting.DARK_AQUA + I18nUtil.resolveKey("missile.fuel.ethanol_peroxide"); // closest match + case XENON: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("fuel.xenon"); + case BALEFIRE: + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("fuel.balefire"); + default: + return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } } - + //am i retarded? /* yes */ public ItemCustomMissilePart copy() { - + ItemCustomMissilePart part = new ItemCustomMissilePart(); part.type = this.type; part.top = this.top; @@ -320,33 +327,33 @@ public class ItemCustomMissilePart extends Item { part.attributes = this.attributes; part.health = this.health; part.setTextureName(this.iconString); - + return part; } - + public ItemCustomMissilePart setAuthor(String author) { this.author = author; return this; } - + public ItemCustomMissilePart setTitle(String title) { this.title = title; return this; } - + public ItemCustomMissilePart setWittyText(String witty) { this.witty = witty; return this; } - + public ItemCustomMissilePart setHealth(float health) { this.health = health; return this; } - + public ItemCustomMissilePart setRarity(Rarity rarity) { this.rarity = rarity; - + if(this.type == PartType.FUSELAGE) { if(this.top == PartSize.SIZE_10) ItemLootCrate.list10.add(this); diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index 692750516..f7f181da3 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -3,53 +3,57 @@ package com.hbm.items.weapon; import java.util.List; import com.hbm.items.ItemCustomLore; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class ItemMissile extends ItemCustomLore { - + public final MissileFormFactor formFactor; public final MissileTier tier; public final MissileFuel fuel; public int fuelCap; public boolean launchable = true; - + public ItemMissile(MissileFormFactor form, MissileTier tier) { this(form, tier, form.defaultFuel); } - + public ItemMissile(MissileFormFactor form, MissileTier tier, MissileFuel fuel) { this.formFactor = form; this.tier = tier; this.fuel = fuel; this.setFuelCap(this.fuel.defaultCap); } - + public ItemMissile notLaunchable() { this.launchable = false; return this; } - + public ItemMissile setFuelCap(int fuelCap) { this.fuelCap = fuelCap; return this; } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add(EnumChatFormatting.ITALIC + this.tier.display); - + // Tier localized: missile.tier.tier0, missile.tier.tier1, ... + String tierKey = "missile.tier." + this.tier.name().toLowerCase(); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey(tierKey)); + if(!this.launchable) { - list.add(EnumChatFormatting.RED + "Not launchable!"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.missile.notLaunchable")); } else { - list.add("Fuel: " + this.fuel.display); - if(this.fuelCap > 0) list.add("Fuel capacity: " + this.fuelCap + "mB"); + // Fuel localized & colored via enum helper + list.add(I18nUtil.resolveKey("gui.missile.fuel") + ": " + this.fuel.getDisplay()); + if(this.fuelCap > 0) list.add(I18nUtil.resolveKey("gui.missile.fuelCapacity") + ": " + this.fuelCap + "mB"); super.addInformation(itemstack, player, list, bool); } } - + public enum MissileFormFactor { ABM(MissileFuel.SOLID), MICRO(MissileFuel.SOLID), @@ -58,41 +62,48 @@ public class ItemMissile extends ItemCustomLore { HUGE(MissileFuel.KEROSENE_LOXY), ATLAS(MissileFuel.JETFUEL_LOXY), OTHER(MissileFuel.KEROSENE_PEROXIDE); - + protected MissileFuel defaultFuel; - + private MissileFormFactor(MissileFuel defaultFuel) { this.defaultFuel = defaultFuel; } } - + public enum MissileTier { TIER0("Tier 0"), TIER1("Tier 1"), TIER2("Tier 2"), TIER3("Tier 3"), TIER4("Tier 4"); - + public String display; - + private MissileTier(String display) { this.display = display; } } - + public enum MissileFuel { - SOLID(EnumChatFormatting.GOLD + "Solid Fuel (pre-fueled)", 0), - ETHANOL_PEROXIDE(EnumChatFormatting.AQUA + "Ethanol / Hydrogen Peroxide", 4_000), - KEROSENE_PEROXIDE(EnumChatFormatting.BLUE + "Kerosene / Hydrogen Peroxide", 8_000), - KEROSENE_LOXY(EnumChatFormatting.LIGHT_PURPLE + "Kerosene / Liquid Oxygen", 12_000), - JETFUEL_LOXY(EnumChatFormatting.RED + "Jet Fuel / Liquid Oxygen", 16_000); - - public String display; - public int defaultCap; - - private MissileFuel(String display, int defaultCap) { - this.display = display; + SOLID("missile.fuel.solid" + " (pre-fueled)", EnumChatFormatting.GOLD, 0), + ETHANOL_PEROXIDE("missile.fuel.ethanol_peroxide", EnumChatFormatting.AQUA, 4_000), + KEROSENE_PEROXIDE("missile.fuel.kerosene_peroxide", EnumChatFormatting.BLUE, 8_000), + KEROSENE_LOXY("missile.fuel.kerosene_loxy", EnumChatFormatting.LIGHT_PURPLE, 12_000), + JETFUEL_LOXY("missile.fuel.jetfuel_loxy", EnumChatFormatting.RED, 16_000); + + private final String key; + public final EnumChatFormatting color; + public final int defaultCap; + + private MissileFuel(String key, EnumChatFormatting color, int defaultCap) { + this.key = key; + this.color = color; this.defaultCap = defaultCap; } + + /** Returns a color localized string for display */ + public String getDisplay() { + return color + I18nUtil.resolveKey(this.key); + } } } From 3f641a843b29bcf562848fde8f3afe533ef1cb2f Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 17:51:47 -0600 Subject: [PATCH 264/323] I18n implementation for bomb parts --- .../java/com/hbm/items/bomb/ItemFleija.java | 27 ++++++++----------- src/main/java/com/hbm/items/bomb/ItemN2.java | 13 +++++---- .../java/com/hbm/items/bomb/ItemSolinium.java | 8 +++--- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hbm/items/bomb/ItemFleija.java b/src/main/java/com/hbm/items/bomb/ItemFleija.java index d9424f67e..623b12d9b 100644 --- a/src/main/java/com/hbm/items/bomb/ItemFleija.java +++ b/src/main/java/com/hbm/items/bomb/ItemFleija.java @@ -3,7 +3,7 @@ package com.hbm.items.bomb; import java.util.List; import com.hbm.items.ModItems; - +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; @@ -12,22 +12,17 @@ import net.minecraft.item.ItemStack; public class ItemFleija extends Item { @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("F.L.E.I.J.A."); + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(I18nUtil.resolveKey("item.fleija.name")); super.addInformation(itemstack, player, list, bool); } - @Override - public EnumRarity getRarity(ItemStack p_77613_1_) { - - if(this == ModItems.fleija_propellant) - { - return EnumRarity.rare; - } - - return EnumRarity.common; - } - + @Override + public EnumRarity getRarity(ItemStack itemstack) { + if (this == ModItems.fleija_propellant) { + return EnumRarity.rare; + } + return EnumRarity.common; + } } diff --git a/src/main/java/com/hbm/items/bomb/ItemN2.java b/src/main/java/com/hbm/items/bomb/ItemN2.java index c837fee78..feffaf6bf 100644 --- a/src/main/java/com/hbm/items/bomb/ItemN2.java +++ b/src/main/java/com/hbm/items/bomb/ItemN2.java @@ -2,17 +2,16 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public class ItemN2 extends Item { - - @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("N² Mine"); - } + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(I18nUtil.resolveKey("item.n2.mine")); + } } diff --git a/src/main/java/com/hbm/items/bomb/ItemSolinium.java b/src/main/java/com/hbm/items/bomb/ItemSolinium.java index a04321ecb..f921d49e5 100644 --- a/src/main/java/com/hbm/items/bomb/ItemSolinium.java +++ b/src/main/java/com/hbm/items/bomb/ItemSolinium.java @@ -2,6 +2,7 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -9,10 +10,9 @@ import net.minecraft.item.ItemStack; public class ItemSolinium extends Item { @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("Solinium Bomb"); + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(I18nUtil.resolveKey("item.solinium.name")); super.addInformation(itemstack, player, list, bool); } } From 9a0cadaf9d91a698ae8814af7e27feb6c37549b6 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 18:10:46 -0600 Subject: [PATCH 265/323] I18n implementation for guns --- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 145 +++++++++--------- src/main/resources/assets/hbm/lang/en_US.lang | 121 +++++++++++++++ src/main/resources/assets/hbm/lang/ru_RU.lang | 134 ++++++++++++++-- 3 files changed, 315 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index 704eb09a6..c43550972 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -29,6 +29,7 @@ import com.hbm.render.util.RenderScreenOverlay; import com.hbm.sound.AudioWrapper; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -55,10 +56,10 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public long[] lastShot; /** [0;1] randomized every shot for various rendering applications */ public double shotRand = 0D; - + public static List secrets = new ArrayList(); public List recognizedMods = new ArrayList(); - + public static final DecimalFormatSymbols SYMBOLS_US = new DecimalFormatSymbols(Locale.US); public static final DecimalFormat FORMAT_DMG = new DecimalFormat("#.##", SYMBOLS_US); @@ -68,20 +69,20 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static float recoilRebound = 0.25F; public static float offsetVertical = 0; public static float offsetHorizontal = 0; - + public static void setupRecoil(float vertical, float horizontal, float decay, float rebound) { recoilVertical += vertical; recoilHorizontal += horizontal; recoilDecay = decay; recoilRebound = rebound; } - + public static void setupRecoil(float vertical, float horizontal) { setupRecoil(vertical, horizontal, 0.75F, 0.25F); } public static final String O_GUNCONFIG = "O_GUNCONFIG_"; - + public static final String KEY_DRAWN = "drawn"; public static final String KEY_AIMING = "aiming"; public static final String KEY_MODE = "mode_"; @@ -98,28 +99,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static final String KEY_LOCKEDON = "lockedon"; public static final String KEY_CANCELRELOAD = "cancel"; public static final String KEY_EQUIPPED = "eqipped"; - + public static ConcurrentHashMap loopedSounds = new ConcurrentHashMap(); public static float prevAimingProgress; public static float aimingProgress; - + /** NEVER ACCESS DIRECTLY - USE GETTER */ protected GunConfig[] configs_DNA; - + public Function LAMBDA_NAME_MUTATOR; public WeaponQuality quality; - + public GunConfig getConfig(ItemStack stack, int index) { GunConfig cfg = configs_DNA[index]; if(stack == null) return cfg; return WeaponModManager.eval(cfg, stack, O_GUNCONFIG + index, this, index); } - + public int getConfigCount() { return configs_DNA.length; } - + public ItemGunBaseNT(WeaponQuality quality, GunConfig... cfg) { this.setMaxStackSize(1); this.configs_DNA = cfg; @@ -130,7 +131,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(quality == WeaponQuality.LEGENDARY || quality == WeaponQuality.SECRET) this.secrets.add(this); this.setTextureName(RefStrings.MODID + ":gun_darter"); } - + public static enum WeaponQuality { A_SIDE, B_SIDE, @@ -148,73 +149,73 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I RELOADING, //forced delay after which a reload action happens, may be canceled (TBI) JAMMED, //forced delay due to jamming } - + public ItemGunBaseNT setNameMutator(Function lambda) { this.LAMBDA_NAME_MUTATOR = lambda; return this; } public String getItemStackDisplayName(ItemStack stack) { - + if(this.LAMBDA_NAME_MUTATOR != null) { String unloc = this.LAMBDA_NAME_MUTATOR.apply(stack); if(unloc != null) return (StatCollector.translateToLocal(unloc + ".name")).trim(); } - + return super.getItemStackDisplayName(stack); } - + @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + int configs = this.configs_DNA.length; for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); for(Receiver rec : config.getReceivers(stack)) { IMagazine mag = rec.getMagazine(stack); - list.add("Ammo: " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); float dmg = rec.getBaseDamage(stack); - list.add("Base Damage: " + FORMAT_DMG.format(dmg)); + list.add(I18nUtil.resolveKey("gui.weapon.baseDamage") + ": " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { BulletConfig bullet = (BulletConfig) mag.getType(stack, player.inventory); int min = (int) (bullet.projectilesMin * rec.getSplitProjectiles(stack)); int max = (int) (bullet.projectilesMax * rec.getSplitProjectiles(stack)); - list.add("Damage with current ammo: " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); + list.add(I18nUtil.resolveKey("gui.weapon.damageWithAmmo") + ": " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); } } - + float maxDura = config.getDurability(stack); if(maxDura > 0) { int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); - list.add("Condition: " + dura + "%"); + list.add(I18nUtil.resolveKey("gui.weapon.condition") + ": " + dura + "%"); } - + for(ItemStack upgrade : WeaponModManager.getUpgradeItems(stack, i)) { list.add(EnumChatFormatting.YELLOW + upgrade.getDisplayName()); } } - + switch(this.quality) { - case A_SIDE: list.add(EnumChatFormatting.YELLOW + "Standard Arsenal"); break; - case B_SIDE: list.add(EnumChatFormatting.GOLD + "B-Side"); break; - case LEGENDARY: list.add(EnumChatFormatting.RED + "Legendary Weapon"); break; - case SPECIAL: list.add(EnumChatFormatting.AQUA + "Special Weapon"); break; - case UTILITY: list.add(EnumChatFormatting.GREEN + "Utility"); break; - case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + "SECRET"); break; - case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + "DEBUG"); break; + case A_SIDE: list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.weapon.quality.aside")); break; + case B_SIDE: list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.weapon.quality.bside")); break; + case LEGENDARY: list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.quality.legendary")); break; + case SPECIAL: list.add(EnumChatFormatting.AQUA + I18nUtil.resolveKey("gui.weapon.quality.special")); break; + case UTILITY: list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("gui.weapon.quality.utility")); break; + case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + I18nUtil.resolveKey("gui.weapon.quality.secret")); break; + case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + I18nUtil.resolveKey("gui.weapon.quality.debug")); break; } - + if(Minecraft.getMinecraft().currentScreen instanceof GUIWeaponTable && !this.recognizedMods.isEmpty()) { - list.add(EnumChatFormatting.RED + "Accepts:"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.accepts" + ":")); for(ComparableStack comp : this.recognizedMods) list.add(EnumChatFormatting.RED + " " + comp.toStack().getDisplayName()); } } - + @Override public boolean canHandleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind) { return keybind == EnumKeybind.GUN_PRIMARY || keybind == EnumKeybind.GUN_SECONDARY || keybind == EnumKeybind.GUN_TERTIARY || keybind == EnumKeybind.RELOAD; } - + @Override public void handleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind, boolean newState) { handleKeybind(player, player.inventory, stack, keybind, newState); @@ -222,13 +223,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public void handleKeybind(EntityLivingBase entity, IInventory inventory, ItemStack stack, EnumKeybind keybind, boolean newState) { if(!GeneralConfig.enableGuns) return; - + int configs = this.configs_DNA.length; - + for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); LambdaContext ctx = new LambdaContext(config, entity, inventory, i); - + if(keybind == EnumKeybind.GUN_PRIMARY && newState && !getPrimary(stack, i)) { if(config.getPressPrimary(stack) != null) config.getPressPrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_PRIMARY && !newState && getPrimary(stack, i)) { if(config.getReleasePrimary(stack) != null) config.getReleasePrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_SECONDARY && newState && !getSecondary(stack, i)) { if(config.getPressSecondary(stack) != null) config.getPressSecondary(stack).accept(stack, ctx); this.setSecondary(stack, i, newState); continue; } @@ -243,7 +244,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onEquip(EntityPlayer player, ItemStack stack) { for(int i = 0; i < this.configs_DNA.length; i++) { - if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; + if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; playAnimation(player, stack, AnimType.EQUIP, i); this.setPrimary(stack, i, false); this.setSecondary(stack, i, false); @@ -251,7 +252,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadKey(stack, i, false); } } - + public static void playAnimation(EntityPlayer player, ItemStack stack, AnimType type, int index) { if(player instanceof EntityPlayerMP) { PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(type.ordinal(), 0, index), (EntityPlayerMP) player); @@ -262,7 +263,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { - + if(!(entity instanceof EntityLivingBase)) return; EntityPlayer player = entity instanceof EntityPlayer ? (EntityPlayer) entity : null; int confNo = this.configs_DNA.length; @@ -272,17 +273,17 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I configs[i] = this.getConfig(stack, i); ctx[i] = new LambdaContext(configs[i], (EntityLivingBase) entity, player != null ? player.inventory : null, i); } - + if(world.isRemote) { - + if(isHeld && player == MainRegistry.proxy.me()) { - + /// DEBUG /// /*Vec3 offset = Vec3.createVectorHelper(-0.2, -0.1, 0.75); offset.rotateAroundX(-entity.rotationPitch / 180F * (float) Math.PI); offset.rotateAroundY(-entity.rotationYaw / 180F * (float) Math.PI); world.spawnParticle("flame", entity.posX + offset.xCoord, entity.posY + entity.getEyeHeight() + offset.yCoord, entity.posZ + offset.zCoord, 0, 0, 0);*/ - + /// AIMING /// prevAimingProgress = aimingProgress; boolean aiming = this.getIsAiming(stack); @@ -290,12 +291,12 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(aiming && aimingProgress < 1F) aimingProgress += aimSpeed; if(!aiming && aimingProgress > 0F) aimingProgress -= aimSpeed; aimingProgress = MathHelper.clamp_float(aimingProgress, 0F, 1F); - + /// SMOKE NODES /// for(int i = 0; i < confNo; i++) if(configs[i].getSmokeHandler(stack) != null) { configs[i].getSmokeHandler(stack).accept(stack, ctx[i]); } - + for(int i = 0; i < confNo; i++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); @@ -303,18 +304,18 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I } return; } - + /// ON EQUIP /// if(player != null) { boolean wasHeld = this.getIsEquipped(stack); - + if(!wasHeld && isHeld && player != null) { this.onEquip(player, stack); } } - + this.setIsEquipped(stack, isHeld); - + /// RESET WHEN NOT EQUIPPED /// if(!isHeld) { for(int i = 0; i < confNo; i++) { @@ -329,13 +330,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadCancel(stack, false); return; } - + for(int i = 0; i < confNo; i++) for(int k = 0; k == 0 || (k < 2 && ArmorTrenchmaster.isTrenchMaster(player) && this.getState(stack, i) == GunState.RELOADING); k++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); - + setAnimTimer(stack, i, getAnimTimer(stack, i) + 1); - + /// STTATE MACHINE /// int timer = this.getTimer(stack, i); if(timer > 0) this.setTimer(stack, i, timer - 1); @@ -371,7 +372,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static void setLastAnim(ItemStack stack, int index, AnimType value) { setValueInt(stack, KEY_LASTANIM + index, value.ordinal()); } public static int getAnimTimer(ItemStack stack, int index) { return getValueInt(stack, KEY_ANIMTIMER + index); } public static void setAnimTimer(ItemStack stack, int index, int value) { setValueInt(stack, KEY_ANIMTIMER + index, value); } - + // BUTTON STATES // public static boolean getPrimary(ItemStack stack, int index) { return getValueBool(stack, KEY_PRIMARY + index); } public static void setPrimary(ItemStack stack, int index, boolean value) { setValueBool(stack, KEY_PRIMARY + index, value); } @@ -387,28 +388,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I // EQUIPPED // public static boolean getIsEquipped(ItemStack stack) { return getValueBool(stack, KEY_EQUIPPED); } public static void setIsEquipped(ItemStack stack, boolean value) { setValueBool(stack, KEY_EQUIPPED, value); } - - + + /// UTIL /// public static int getValueInt(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getInteger(name); return 0; } public static void setValueInt(ItemStack stack, String name, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setInteger(name, value); } - + public static float getValueFloat(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getFloat(name); return 0; } public static void setValueFloat(ItemStack stack, String name, float value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setFloat(name, value); } - + public static byte getValueByte(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getByte(name); return 0; } public static void setValueByte(ItemStack stack, String name, byte value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setByte(name, value); } - + public static boolean getValueBool(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getBoolean(name); return false; } public static void setValueBool(ItemStack stack, String name, boolean value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setBoolean(name, value); } - + /** Wrapper for extra context used in most Consumer lambdas which are part of the guncfg */ public static class LambdaContext { public final GunConfig config; public final EntityLivingBase entity; public final IInventory inventory; public final int configIndex; - + public LambdaContext(GunConfig config, EntityLivingBase player, IInventory inventory, int configIndex) { this.config = config; this.entity = player; @@ -425,42 +426,42 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override @SideOnly(Side.CLIENT) public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { - + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - + if(type == ElementType.CROSSHAIRS) { event.setCanceled(true); GunConfig config = gun.getConfig(stack, 0); if(config.getHideCrosshair(stack) && aimingProgress >= 1F) return; RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, config.getCrosshair(stack)); } - + int confNo = this.configs_DNA.length; - + for(int i = 0; i < confNo; i++) { IHUDComponent[] components = gun.getConfig(stack, i).getHUDComponents(stack); - + if(components != null) for(IHUDComponent component : components) { int bottomOffset = 0; component.renderHUDComponent(event, type, player, stack, bottomOffset, i); bottomOffset += component.getComponentHeight(player, stack); } } - + Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - + /*@Override public boolean getShareTag() { return false; }*/ // nbt sync dupe fix, didn't work - + public static class SmokeNode { - + public double forward = 0D; public double side = 0D; public double lift = 0D; public double alpha; public double width = 1D; - + public SmokeNode(double alpha) { this.alpha = alpha; } } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cf7cfd858..12707d8ac 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6282,3 +6282,124 @@ gui.recipe.enabledFor=Enabled for gui.recipe.setRecipe=Click to set recipe tile.oc_cable_paintable.name=Paintable Network Cable + +# shared recipe / machine labels +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.mB=mB +gui.recipe.atPressure=at +gui.recipe.autoswitch=Auto-switch group +gui.recipe.enabledFor=Enabled for +gui.recipe.setRecipe=Click to set recipe + +# --- Missile / parts (generic) --- +gui.missile.warhead=Warhead +gui.missile.strength=Strength +gui.missile.fuelType=Fuel Type +gui.missile.fuelAmount=Fuel amount +gui.missile.chipInaccuracy=Chip inaccuracy +gui.missile.finInaccuracy=Fin inaccuracy +gui.missile.size=Size +gui.missile.health=Health +gui.missile.fuel=Fuel +gui.missile.fuelCapacity=Fuel capacity +gui.missile.notLaunchable=Not launchable! + +# missile tiers +missile.tier.tier0=Tier 0 +missile.tier.tier1=Tier 1 +missile.tier.tier2=Tier 2 +missile.tier.tier3=Tier 3 +missile.tier.tier4=Tier 4 + +# missile fuel names +missile.fuel.solid=Solid Fuel +missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide +missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide +missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen +missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen + +# warheads (used by parts) +warhead.he=HE +warhead.incendiary=Incendiary +warhead.cluster=Cluster +warhead.bunker_buster=Bunker Buster +warhead.nuclear=Nuclear +warhead.thermonuclear=Thermonuclear (TX) +warhead.n2=N² +warhead.balefire=BF +warhead.schrabidium=Schrabidium +warhead.taint=Taint +warhead.cloud=Cloud +warhead.turbine=Turbine + +# part keys +part.inaccuracy=Inaccuracy +part.size=Size +part.type=Type +part.strength=Strength +part.weight=Weight +part.topSize=Top size +part.bottomSize=Bottom size +part.fuelType=Fuel type +part.fuelAmount=Fuel amount +part.fuelConsumption=Fuel consumption +part.maxPayload=Max. payload +part.health=Health +part.rarity=Rarity +part.by=by +part.size.any=Any +part.size.none=None + +# fuel extras used by parts +fuel.xenon=Xenon +fuel.balefire=BF Rocket Fuel + +# part rarity keys (enum-based) +part.rarity.common=Common +part.rarity.uncommon=Uncommon +part.rarity.rare=Rare +part.rarity.epic=Epic +part.rarity.legendary=Legendary +part.rarity.strange=Strange + +# generic / fallback +general.na=N/A +error.generic=### I AM ERROR ### + +# --- Satellite chips --- +satchip.frequency=Satellite frequency +satchip.foeq=Gives you an achievement. That's it. +satchip.gerald.line1=Single use. +satchip.gerald.line2=Requires orbital module. +satchip.gerald.line3=Melter of CPUs, bane of every server owner. +satchip.laser=Allows to summon lasers with a 15 second cooldown. +satchip.mapper=Displays currently loaded chunks. +satchip.miner=Will deliver ore powders to a cargo landing pad. +satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. +satchip.radar=Shows a map of active entities. +satchip.resonator=Allows for teleportation with no cooldown. +satchip.scanner=Creates a topdown map of underground ores. + +# --- Items (bomb components) --- +item.bomb_part.used_in=Used in: +item.n2.mine=N² Mine +item.fleija.name=F.L.E.I.J.A. +item.solinium.name=Solinium Bomb + +# --- Weapon / gun tooltips --- +gui.weapon.ammo=Ammo +gui.weapon.baseDamage=Base Damage +gui.weapon.damageWithAmmo=Damage with current ammo +gui.weapon.condition=Condition +gui.weapon.accepts=Accepts + +gui.weapon.quality.aside=Standard Arsenal +gui.weapon.quality.bside=B-Side +gui.weapon.quality.legendary=Legendary Weapon +gui.weapon.quality.special=Special Weapon +gui.weapon.quality.utility=Utility +gui.weapon.quality.secret=SECRET +gui.weapon.quality.debug=DEBUG diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 09e404bdf..4b342ef2d 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -4588,19 +4588,6 @@ item.sat_radar.name=Спутник с радиолокационным зонд item.sat_resonator.name=Спутник с Зен-Резонатором item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования -item.sat.desc.frequency=Частота спутника -item.sat.desc.foeq=Даёт тебе достижение. Это всё. -item.sat.desc.gerald.single_use=Одноразовое. -item.sat.desc.gerald.orbital_module=Требует орбитальный модуль. -item.sat.desc.gerald.melter=Расплавитель процессоров, проклятие каждого владельца сервера. -item.sat.desc.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. -item.sat.desc.mapper=Отображает загруженные в данный момент чанки. -item.sat.desc.miner=Доставит рудные порошки на грузовую посадочную площадку. -item.sat.desc.lunar_miner=Добывает лунный грунт, чтобы доставить его на грузовую посадочную площадку. -item.sat.desc.radar=Показывает карту активных объектов. -item.sat.desc.resonator=Позволяет телепортироваться без перезарядки. -item.sat.desc.scanner=Создаёт карту подземных руд сверху вниз. - item.sawblade.name=Лезвие пилорамы item.schnitzel_vegan.name=Вегетарианский шницель item.schrabidium_axe.name=Шрабидиевый топор @@ -6625,4 +6612,125 @@ gui.recipe.autoswitch=Группа автоматического переклю gui.recipe.enabledFor=Включено для gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт +# shared recipe / machine labels +gui.recipe.duration=Время +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.mB=mB +gui.recipe.atPressure=при +gui.recipe.autoswitch=Автопереключение группы +gui.recipe.enabledFor=Доступно для +gui.recipe.setRecipe=Нажмите, чтобы установить рецепт + +# --- Missile / parts (generic) --- +gui.missile.warhead=Боеголовка +gui.missile.strength=Мощность +gui.missile.fuelType=Тип топлива +gui.missile.fuelAmount=Количество топлива +gui.missile.chipInaccuracy=Неточность чипа +gui.missile.finInaccuracy=Неточность стабилизаторов +gui.missile.size=Размер +gui.missile.health=Прочность +gui.missile.fuel=Топливо +gui.missile.fuelCapacity=Ёмкость топлива +gui.missile.notLaunchable=Невозможно запустить! + +# missile tiers +missile.tier.tier0=Уровень 0 +missile.tier.tier1=Уровень 1 +missile.tier.tier2=Уровень 2 +missile.tier.tier3=Уровень 3 +missile.tier.tier4=Уровень 4 + +# missile fuel names +missile.fuel.solid=Твердое топливо +missile.fuel.ethanol_peroxide=Этанол / Перекись водорода +missile.fuel.kerosene_peroxide=Керосин / Перекись водорода +missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород + +# warheads (used by parts) +warhead.he=HE +warhead.incendiary=Зажигательная +warhead.cluster=Кассетная +warhead.bunker_buster=Противобункерная +warhead.nuclear=Ядерная +warhead.thermonuclear=Термоядерная (TX) +warhead.n2=N² +warhead.balefire=Жар-ядерная +warhead.schrabidium=Шрабидевая +warhead.taint=Порча +warhead.cloud=Облако +warhead.turbine=Турбина + +# part keys +part.inaccuracy=Неточность +part.size=Размер +part.type=Тип +part.strength=Прочность +part.weight=Вес +part.topSize=Верхний размер +part.bottomSize=Нижний размер +part.fuelType=Тип топлива +part.fuelAmount=Количество топлива +part.fuelConsumption=Расход топлива +part.maxPayload=Макс. нагрузка +part.health=Прочность +part.rarity=Редкость +part.by=Автор +part.size.any=Любой +part.size.none=Нет + +# fuel extras used by parts +fuel.xenon=Ксенон +fuel.balefire=Жар-ракетное топливо + +# part rarity keys (enum-based, neuter) +part.rarity.common=Обычное +part.rarity.uncommon=Необычное +part.rarity.rare=Редкое +part.rarity.epic=Эпическое +part.rarity.legendary=Легендарное +part.rarity.strange=Странное + +# generic / fallback +general.na=Н/Д +error.generic=### Я ОШИБКА ### + +# --- Satellite chips --- +satchip.frequency=Частота спутника +satchip.foeq=Даёт достижение. И всё. +satchip.gerald.line1=Одноразовый. +satchip.gerald.line2=Требуется орбитальный модуль. +satchip.gerald.line3=Расплавитель процессоров, проклятие каждого владельца сервера. +satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. +satchip.mapper=Отображает загруженные в данный момент чанки. +satchip.miner=Доставляет рудные порошки на посадочную площадку. +satchip.lunar_miner=Добывает лунный грунт и доставляет на посадочную площадку. +satchip.radar=Показывает карту активных сущностей +satchip.resonator=Позволяет телепортироваться без перезарядки. +satchip.scanner=Создаёт карту подземных руд сверху вниз. + +# --- Items (bomb components) --- +item.bomb_part.used_in=Используется в: +item.n2.mine=Мина N² +item.fleija.name=Ф.Л.Е.Я. +item.solinium.name=Синий Ополаскиватель + +# --- Weapon / gun tooltips --- +gui.weapon.ammo=Боеприпасы +gui.weapon.baseDamage=Базовый урон +gui.weapon.damageWithAmmo=Урон с текущими боеприпасами +gui.weapon.condition=Состояние +gui.weapon.accepts=Принимает + +gui.weapon.quality.aside=Стандартный арсенал +gui.weapon.quality.bside=Би-Сайд +gui.weapon.quality.legendary=Легендарное оружие +gui.weapon.quality.special=Специальное оружие +gui.weapon.quality.utility=Утилитарное +gui.weapon.quality.secret=СЕКРЕТ +gui.weapon.quality.debug=ОТЛАДКА + // Last updated 23.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // From 9e83f241793e738ced67afbf89b7e2e0d62b9ed1 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 18:49:57 -0600 Subject: [PATCH 266/323] Blueprint Booklet --- src/main/resources/assets/hbm/lang/ru_RU.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 4b342ef2d..aba087791 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2333,6 +2333,7 @@ item.blades_desh.name=Деш-лезвия измельчителя item.blades_steel.name=Стальные лезвия измельчителя item.blades_titanium.name=Титановые лезвия измельчителя item.blowtorch.name=Паяльная лампа +item.blueprint_folder.name=Буклет чертежей item.blueprints.name=Чертежи item.board_copper.name=Медная панель item.boat_rubber.name=Резиновая лодка From 90522b98db3a3191eec5b031e143164c9929258d Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 18:52:10 -0600 Subject: [PATCH 267/323] Destroyed? --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index aba087791..3f1b7af63 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6501,8 +6501,8 @@ trait.rbmx.xenon=Свинцовое отравление: %s trait.rbmx.xenonBurn=Функция разрушения свинца: %s trait.rbmx.xenonGen=Функция создания свинца: %s -trait.tile.cluster=Выпадает только тогда, когда разрушен игроком -trait.tile.depth=Может быть разрушен только взрывом +trait.tile.cluster=Выпадает только тогда, когда добыт игроком +trait.tile.depth=Может быть добыт только взрывом tool.ability.centrifuge=Авто-центрифуга tool.ability.crystallizer=Авто-кристаллизатор From f9369f5e027f4fc3f2503ffc5962ab36e4e3964d Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 19:14:29 -0600 Subject: [PATCH 268/323] Minor changes --- .../com/hbm/items/weapon/ItemMissile.java | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 1 + src/main/resources/assets/hbm/lang/ru_RU.lang | 48 ++----------------- 3 files changed, 5 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index f7f181da3..e8fcd6964 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -85,7 +85,7 @@ public class ItemMissile extends ItemCustomLore { } public enum MissileFuel { - SOLID("missile.fuel.solid" + " (pre-fueled)", EnumChatFormatting.GOLD, 0), + SOLID("missile.fuel.solid.prefueled", EnumChatFormatting.GOLD, 0), ETHANOL_PEROXIDE("missile.fuel.ethanol_peroxide", EnumChatFormatting.AQUA, 4_000), KEROSENE_PEROXIDE("missile.fuel.kerosene_peroxide", EnumChatFormatting.BLUE, 8_000), KEROSENE_LOXY("missile.fuel.kerosene_loxy", EnumChatFormatting.LIGHT_PURPLE, 12_000), diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 12707d8ac..97fb3954c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6316,6 +6316,7 @@ missile.tier.tier4=Tier 4 # missile fuel names missile.fuel.solid=Solid Fuel +missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 3f1b7af63..6515b44be 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -4649,7 +4649,7 @@ item.solid_fuel_presto_triplet.name=Сжатые топливные полень item.solid_fuel_presto_triplet_bf.name=Сжатые топливные поленья (Жар-пламя) item.solinium_core.name=Полустабильный солиниевый заряд item.solinium_igniter.name=Солиниевый импульсный воспламенитель -item.solinium_kit.name=Солиниевый комплект +item.solinium_kit.name=Комплект Синего Ополаскивателя item.solinium_propellant.name=Солиниевый сжимающий заряд item.sopsign.name=Боевой топор из знака С ОП item.spawn_duck.name=Золотое яйцо @@ -5001,49 +5001,6 @@ item.xanax.name=Препарат "НАКСА" против Дигаммы item.xanax.desc=Снимает 500mDRX item.zirconium_legs.name=Циркониевые штаны -item.custom_missile_part.he.type=HE -item.custom_missile_part.inc.type=Зажигательная -item.custom_missile_part.buster.type=Разрушитель бункеров -item.custom_missile_part.cluster.type=Кластерная -item.custom_missile_part.nuclear.type=Ядерная -item.custom_missile_part.tx.type=Термоядерная (TX) -item.custom_missile_part.n2.type=N² -item.custom_missile_part.balefire.type=Жар -item.custom_missile_part.schrab.type=Шрабидиевая -item.custom_missile_part.taint.type=Порча -item.custom_missile_part.cloud.type=Облако -item.custom_missile_part.turbine.type=Турбина -item.custom_missile_part.custom0.type=Custom0 -item.custom_missile_part.custom1.type=Custom1 -item.custom_missile_part.custom2.type=Custom2 -item.custom_missile_part.custom3.type=Custom3 -item.custom_missile_part.custom4.type=Custom4 -item.custom_missile_part.custom5.type=Custom5 -item.custom_missile_part.custom6.type=Custom6 -item.custom_missile_part.custom7.type=Custom7 -item.custom_missile_part.custom8.type=Custom8 -item.custom_missile_part.custom9.type=Custom9 - -item.custom_missile_part.fuel.any=Любое жидкое топливо -item.custom_missile_part.fuel.kerosene=Керосин / Пероксид -item.custom_missile_part.fuel.solid=Твёрдое топливо -item.custom_missile_part.fuel.hydrogen=Водород / Кислород -item.custom_missile_part.fuel.xenon=Ксеноновый газ -item.custom_missile_part.fuel.balefire=Ракетное жар-топливо / Пероксид - -item.custom_missile_part.rarity.common=§7Обычный -item.custom_missile_part.rarity.uncommon=§eНеобычный -item.custom_missile_part.rarity.rare=§bРедкий -item.custom_missile_part.rarity.epic=§dЭпический -item.custom_missile_part.rarity.legendary=§2Легендарный -item.custom_missile_part.rarity.strange=§3Странный - -item.missile.fuel.solid=Твёрдое топливо (предварительно заправленное) -item.missile.fuel.ethanol_peroxide=Этанол / Пероксид водорода -item.missile.fuel.kerosene_peroxide=Керосин / Пероксид водорода -item.missile.fuel.kerosene_loxy=Керосин / Жидкий кислород -item.missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород - itemGroup.tabBlocks=Руды и блоки NTM itemGroup.tabConsumable=Расходные материалы и снаряжение NTM itemGroup.tabControl=Топливо и элементы механизмов NTM @@ -6645,7 +6602,8 @@ missile.tier.tier3=Уровень 3 missile.tier.tier4=Уровень 4 # missile fuel names -missile.fuel.solid=Твердое топливо +missile.fuel.solid=Твёрдое топливо +missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) missile.fuel.ethanol_peroxide=Этанол / Перекись водорода missile.fuel.kerosene_peroxide=Керосин / Перекись водорода missile.fuel.kerosene_loxy=Керосин / Жидкий кислород From 54a5769deec35238ece3eebbe8cf9a301148b63c Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 20:10:04 -0600 Subject: [PATCH 269/323] Minor changes --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 6515b44be..b78bdcd05 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -3088,7 +3088,7 @@ item.gun_autoshotgun_sexy.name=Секси item.gun_autoshotgun_shredder.name=Шреддер item.gun_avenger.name=CZ57 “Авенджер” item.gun_b92.name=§9Энергетический бластер B92§r -item.gun_b92_ammo.name=§9Энергетический Элемент B92§r +item.gun_b92_ammo.name=§9Энергетический элемент B92§r item.gun_b93.name=§cМодифицированный бластер B93§r item.gun_benelli.name=Benelli Autoshotgun item.gun_bf.name=BEL @@ -4219,7 +4219,7 @@ item.powder_xe135.name=Порошок ксенона-135 item.powder_xe135_tiny.name=Кучка порошка ксенона-135 item.powder_yellowcake.name=Жёлтый кек item.powder_zirconium.name=Циркониевый порошок -item.power_net_tool.name=Анализатор энергосети +item.power_net_tool.name=Анализатор электросети item.pipette.name=Пипетка item.pipette_boron.name=Борная пипетка item.pipette_laboratory.name=Лабораторная пипетка From 4903b2e189ca526e524345ba7a6f8fe731af501a Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:18:37 -0700 Subject: [PATCH 270/323] Update TileEntityMachineArcFurnaceLarge.java --- .../tileentity/machine/TileEntityMachineArcFurnaceLarge.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 6c9be1f71..7af24b639 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -29,6 +29,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CrucibleUtil; +import com.hbm.util.ItemStackUtil; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.i18n.I18nUtil; @@ -400,6 +401,8 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl liquids.add(matStack.copy()); } + + public static int getStackAmount(List stack) { int amount = 0; for(MaterialStack mat : stack) amount += mat.amount; From 52149b098e05c470decc74d733d8d46dde548cb8 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:31:37 -0700 Subject: [PATCH 271/323] Update AE2CompatHandler.java --- src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java index b40571179..968899426 100644 --- a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java +++ b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java @@ -14,5 +14,6 @@ public class AE2CompatHandler { @Optional.Method(modid = "appliedenergistics2") private static void registerHandler() { AEApi.instance().registries().externalStorage().addExternalStorageInterface(new MSUExternalStorageHandler()); + AEApi.instance().registries().externalStorage().addExternalStorageInterface(new AFLExternalStorageHandler()); } } From 0a99397f3067c658b21c423a9734dbe39939dc40 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:34:07 -0700 Subject: [PATCH 272/323] Add files via upload --- .../ae2/AFLExternalStorageHandler.java | 34 +++++++++++ .../ae2/ArcFurnaceLargeMEInventory.java | 60 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java create mode 100644 src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java diff --git a/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java new file mode 100644 index 000000000..37ff769e3 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java @@ -0,0 +1,34 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; +import com.hbm.tileentity.TileEntityProxyCombo; +import cpw.mods.fml.common.Optional; + +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.me.storage.MEMonitorIInventory; +import appeng.util.inv.IMEAdaptor; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2")}) +public class AFLExternalStorageHandler implements IExternalStorageHandler { + + public AFLExternalStorageHandler() {} + + @Override + public boolean canHandle(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource mySrc) { + boolean coreProxy = te instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) te).getTile() instanceof TileEntityMachineArcFurnaceLarge; + return channel == StorageChannel.ITEMS && (te instanceof TileEntityMachineArcFurnaceLarge || coreProxy); + } + + @Override + public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src) { + if (!canHandle(te, d, channel, src)) return null; + if (te instanceof TileEntityProxyCombo) return new MEMonitorIInventory(new IMEAdaptor(new ArcFurnaceLargeMEInventory((TileEntityMachineArcFurnaceLarge) ((TileEntityProxyCombo)te).getTile()), src)) {}; + return new MEMonitorIInventory(new IMEAdaptor(new ArcFurnaceLargeMEInventory((TileEntityMachineArcFurnaceLarge) te), src)) {}; + } + +} diff --git a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java new file mode 100644 index 000000000..5698bebed --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java @@ -0,0 +1,60 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; +import com.hbm.tileentity.TileEntityProxyCombo; + +import cpw.mods.fml.common.Optional; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import net.minecraft.item.ItemStack; + +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2")}) +public class ArcFurnaceLargeMEInventory implements IMEInventory { + + private TileEntityMachineArcFurnaceLarge afl; + + public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { + this.afl = afl; + } + + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack is = input.getItemStack(); + is = afl.distributeInput(is, type == Actionable.MODULATE); + + if(is == null) return null; + return AEApi.instance().storage().createItemStack(is); + } + + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + ItemStack is = request.getItemStack(); + is = afl.collectRequested(is, mode == Actionable.MODULATE); + + if(is == null) return null; + return AEApi.instance().storage().createItemStack(is); + } + + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack is; + for(int i = 0; i < 25; i++) { + is = afl.getAvailableItemFromSlot(i); + if(is != null) out.add(AEApi.instance().storage().createItemStack(is)); + } + + return out; + } + + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } + +} From 13b398882988caf079a8e2e0533297f5da0ac6a9 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:42:15 -0700 Subject: [PATCH 273/323] Update ContainerMachineArcFurnaceLarge.java --- .../inventory/container/ContainerMachineArcFurnaceLarge.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java index 12318fe1d..05109bac9 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java @@ -65,11 +65,12 @@ public class ContainerMachineArcFurnaceLarge extends Container { } else if(rStack.getItem() instanceof ItemMachineUpgrade) { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null; } else { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 5, 25, false)) return null; + stack = furnace.distributeInput(stack, true); + if(stack != null && stack.stackSize == rStack.stackSize) return null; } } - if(stack.stackSize == 0) { + if(stack == null || stack.stackSize == 0) { slot.putStack((ItemStack) null); } else { slot.onSlotChanged(); From f0bd84fa477ea44afde2fb09b8ce6067c17962f7 Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 21:02:52 -0700 Subject: [PATCH 274/323] Update TileEntityMachineArcFurnaceLarge.java From 14f7668a9a28f0b99bb8c2be240d5628fdc16f1e Mon Sep 17 00:00:00 2001 From: R-Kaenbyou <152870189+R-Kaenbyou@users.noreply.github.com> Date: Sat, 23 Aug 2025 21:09:37 -0700 Subject: [PATCH 275/323] Update TileEntityMachineArcFurnaceLarge.java --- .../TileEntityMachineArcFurnaceLarge.java | 105 +++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 7af24b639..6968f8b1a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -401,7 +401,110 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl liquids.add(matStack.copy()); } - + //Returns what is unused, or null if used up + public ItemStack distributeInput(ItemStack is, boolean modulate) { + if(is.stackSize == 0) return null; + ItemStack split; + + //Slots 0,1,2 + if(is.getItem() == ModItems.arc_electrode) { + for(int i = 0; i < 3; i++) { + if(slots[i] == null) { + split = is.splitStack(1); + if(modulate) this.setInventorySlotContents(i, split); + } + if (is.stackSize == 0) return null; + } + //Don't tell me you're gonna add an arc furnace recipe smelting electrodes + return is; + } + + //Slots 5-24 + ArcFurnaceRecipe recipe = ArcFurnaceRecipes.getOutput(is, this.liquidMode); + if(recipe != null) { + int maxStackSize = this.liquidMode ? 64 : recipe.solidOutput.getMaxStackSize() / recipe.solidOutput.stackSize; + maxStackSize = Math.min(maxStackSize, Math.min(is.getMaxStackSize(), getMaxInputSize())); + + //Scan + for(int i = 5; i < 25; i++){ + if(slots[i] == null) { + if(is.stackSize > maxStackSize) { + split = is.splitStack(maxStackSize); + if(modulate) slots[i] = split; + } else { + if(modulate) slots[i] = is; + return null; + } + } else if(ItemStackUtil.areStacksCompatible(is, slots[i]) && slots[i].stackSize < maxStackSize) { + if(is.stackSize > maxStackSize - slots[i].stackSize) { + is.splitStack(maxStackSize - slots[i].stackSize); + if(modulate) slots[i].stackSize = maxStackSize; + } else { + if(modulate) slots[i].stackSize += is.stackSize; + return null; + } + } + } + } + return is; + } + + //Returns requested ItemStack + public ItemStack collectRequested(ItemStack is, boolean modulate) { + int req = is.stackSize; + if(req == 0) return null; + + //Slots 0,1,2 + if(is.getItem() != ModItems.arc_electrode) { + for(int i = 0; i < 3; i++) { + if(slots[i] == null) continue; + if(ItemStackUtil.areStacksCompatible(is, slots[i])) { + if(req > slots[i].stackSize) { + req -= slots[i].stackSize; + if(modulate) slots[i] = null; + } else if(req < slots[i].stackSize) { + if(modulate) slots[i].stackSize -= req; + return is; + } else { + if(modulate) slots[i] = null; + return is; + } + } + } + } + + //Slots 5-24 + if(ArcFurnaceRecipes.getOutput(is, this.liquidMode) == null) { + for(int i = 5; i < 25; i++) { + if(slots[i] == null) continue; + if(ItemStackUtil.areStacksCompatible(is, slots[i])) { + if(req > slots[i].stackSize) { + req -= slots[i].stackSize; + if(modulate) slots[i] = null; + } else if(req < slots[i].stackSize) { + if(modulate) slots[i].stackSize -= req; + return is; + } else { + if(modulate) slots[i] = null; + return is; + } + } + } + } + + is.stackSize -= req; + if(is.stackSize == 0) return null; + return is; + } + + //Return ItemStack in slot, null if unavailable + public ItemStack getAvailableItemFromSlot(int slot) { + if(slots[slot] == null) return null; + if(slot < 3 && slots[slot].getItem() == ModItems.arc_electrode) return null; + else if(slot > 4 && ArcFurnaceRecipes.getOutput(slots[slot], this.liquidMode) != null) return null; + else if(slot == 3 || slot == 4) return null; + else return slots[slot]; + } public static int getStackAmount(List stack) { int amount = 0; From 1d18d832e705fddc5ba1fb74a515c24e0327d7ed Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 11:02:13 -0600 Subject: [PATCH 276/323] Sorting --- src/main/resources/assets/hbm/lang/en_US.lang | 240 ++++++++---------- 1 file changed, 107 insertions(+), 133 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 97fb3954c..2fb55b6b7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1057,6 +1057,16 @@ desc.gui.zirnox.pressure=§6Pressure§r$Pressure can be reduced by venting CO2.$ desc.gui.zirnox.warning1=§cError:§r Water is required for$the reactor to function properly! desc.gui.zirnox.warning2=§cError:§r CO2 is required for$the reactor to function properly! +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.mB=mB +gui.recipe.atPressure=at +gui.recipe.autoswitch=Auto-switch group +gui.recipe.enabledFor=Enabled for +gui.recipe.setRecipe=Click to set recipe + desc.item.ammo.con_accuracy2=- Highly decreased accuracy desc.item.ammo.con_damage=- Highly decreased damage desc.item.ammo.con_heavy_wear=- Highly increased wear @@ -1387,6 +1397,8 @@ gun.name.win20Poly=Winchester Model 20 Polymer gun.name.win20Satur=Winchester Model 20 D-25A gun.name.zomg=EMC101 Prismatic Negative Energy Cannon + + hadron.analysis=Analyzing... hadron.buttonOn=Analysis Chamber (if present) is ON hadron.buttonOff=Analysis Chamber is OFF @@ -2994,6 +3006,18 @@ item.gun_tesla_cannon.name=Tesla Cannon item.gun_uzi.name=Uzi item.gun_uzi_richter.name=Richter item.gun_uzi_akimbo.name=Uzis +gui.weapon.ammo=Ammo +gui.weapon.baseDamage=Base Damage +gui.weapon.damageWithAmmo=Damage with current ammo +gui.weapon.condition=Condition +gui.weapon.accepts=Accepts +gui.weapon.quality.aside=Standard Arsenal +gui.weapon.quality.bside=B-Side +gui.weapon.quality.legendary=Legendary Weapon +gui.weapon.quality.special=Special Weapon +gui.weapon.quality.utility=Utility +gui.weapon.quality.secret=SECRET +gui.weapon.quality.debug=DEBUG item.hand_drill.name=Hand Drill item.hand_drill_desh.name=Desh Hand Drill item.hazmat_boots.name=Hazmat Boots @@ -3346,6 +3370,85 @@ item.missile_strong.name=Strong HE Missile item.missile_taint.name=Taint-Tipped Missile item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Using the power of nuclear explosives, we can summon a volcano! + +gui.missile.warhead=Warhead +gui.missile.strength=Strength +gui.missile.fuelType=Fuel Type +gui.missile.fuelAmount=Fuel amount +gui.missile.chipInaccuracy=Chip inaccuracy +gui.missile.finInaccuracy=Fin inaccuracy +gui.missile.size=Size +gui.missile.health=Health +gui.missile.fuel=Fuel +gui.missile.fuelCapacity=Fuel capacity +gui.missile.notLaunchable=Not launchable! + +missile.tier.tier0=Tier 0 +missile.tier.tier1=Tier 1 +missile.tier.tier2=Tier 2 +missile.tier.tier3=Tier 3 +missile.tier.tier4=Tier 4 + +missile.fuel.solid=Solid Fuel +missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) +missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide +missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide +missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen +missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen + +warhead.he=HE +warhead.incendiary=Incendiary +warhead.cluster=Cluster +warhead.bunker_buster=Bunker Buster +warhead.nuclear=Nuclear +warhead.thermonuclear=Thermonuclear (TX) +warhead.n2=N² +warhead.balefire=BF +warhead.schrabidium=Schrabidium +warhead.taint=Taint +warhead.cloud=Cloud +warhead.turbine=Turbine + +part.inaccuracy=Inaccuracy +part.size=Size +part.type=Type +part.strength=Strength +part.weight=Weight +part.topSize=Top size +part.bottomSize=Bottom size +part.fuelType=Fuel type +part.fuelAmount=Fuel amount +part.fuelConsumption=Fuel consumption +part.maxPayload=Max. payload +part.health=Health +part.rarity=Rarity +part.by=by +part.size.any=Any +part.size.none=None + +fuel.xenon=Xenon +fuel.balefire=BF Rocket Fuel + +part.rarity.common=Common +part.rarity.uncommon=Uncommon +part.rarity.rare=Rare +part.rarity.epic=Epic +part.rarity.legendary=Legendary +part.rarity.strange=Strange + +satchip.frequency=Satellite frequency +satchip.foeq=Gives you an achievement. That's it. +satchip.gerald.line1=Single use. +satchip.gerald.line2=Requires orbital module. +satchip.gerald.line3=Melter of CPUs, bane of every server owner. +satchip.laser=Allows to summon lasers with a 15 second cooldown. +satchip.mapper=Displays currently loaded chunks. +satchip.miner=Will deliver ore powders to a cargo landing pad. +satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. +satchip.radar=Shows a map of active entities. +satchip.resonator=Allows for teleportation with no cooldown. +satchip.scanner=Creates a topdown map of underground ores. + item.mold_base.name=Blank Foundry Mold item.mold.name=Foundry Mold item.morning_glory.name=Morning Glory @@ -5713,6 +5816,10 @@ tile.nuke_n45.name=N45 Naval Mine tile.nuke_prototype.name=The Prototype tile.nuke_solinium.name=The Blue Rinse tile.nuke_tsar.name=Tsar Bomba +item.bomb_part.used_in=Used in: +item.n2.mine=N² Mine +item.fleija.name=F.L.E.I.J.A. +item.solinium.name=Solinium Bomb tile.oil_duct.name=Oil Pipe tile.oil_duct_solid.name=Coated Oil Pipe tile.oil_pipe.name=Crude Oil Extraction Pipe @@ -6270,137 +6377,4 @@ desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 -# Shared recipe labels -gui.recipe.duration=Duration -gui.recipe.consumption=Consumption -gui.recipe.input=Input -gui.recipe.output=Output -gui.recipe.mB=mB -gui.recipe.atPressure=at -gui.recipe.autoswitch=Auto-switch group -gui.recipe.enabledFor=Enabled for -gui.recipe.setRecipe=Click to set recipe - tile.oc_cable_paintable.name=Paintable Network Cable - -# shared recipe / machine labels -gui.recipe.duration=Duration -gui.recipe.consumption=Consumption -gui.recipe.input=Input -gui.recipe.output=Output -gui.recipe.mB=mB -gui.recipe.atPressure=at -gui.recipe.autoswitch=Auto-switch group -gui.recipe.enabledFor=Enabled for -gui.recipe.setRecipe=Click to set recipe - -# --- Missile / parts (generic) --- -gui.missile.warhead=Warhead -gui.missile.strength=Strength -gui.missile.fuelType=Fuel Type -gui.missile.fuelAmount=Fuel amount -gui.missile.chipInaccuracy=Chip inaccuracy -gui.missile.finInaccuracy=Fin inaccuracy -gui.missile.size=Size -gui.missile.health=Health -gui.missile.fuel=Fuel -gui.missile.fuelCapacity=Fuel capacity -gui.missile.notLaunchable=Not launchable! - -# missile tiers -missile.tier.tier0=Tier 0 -missile.tier.tier1=Tier 1 -missile.tier.tier2=Tier 2 -missile.tier.tier3=Tier 3 -missile.tier.tier4=Tier 4 - -# missile fuel names -missile.fuel.solid=Solid Fuel -missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) -missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide -missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide -missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen -missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen - -# warheads (used by parts) -warhead.he=HE -warhead.incendiary=Incendiary -warhead.cluster=Cluster -warhead.bunker_buster=Bunker Buster -warhead.nuclear=Nuclear -warhead.thermonuclear=Thermonuclear (TX) -warhead.n2=N² -warhead.balefire=BF -warhead.schrabidium=Schrabidium -warhead.taint=Taint -warhead.cloud=Cloud -warhead.turbine=Turbine - -# part keys -part.inaccuracy=Inaccuracy -part.size=Size -part.type=Type -part.strength=Strength -part.weight=Weight -part.topSize=Top size -part.bottomSize=Bottom size -part.fuelType=Fuel type -part.fuelAmount=Fuel amount -part.fuelConsumption=Fuel consumption -part.maxPayload=Max. payload -part.health=Health -part.rarity=Rarity -part.by=by -part.size.any=Any -part.size.none=None - -# fuel extras used by parts -fuel.xenon=Xenon -fuel.balefire=BF Rocket Fuel - -# part rarity keys (enum-based) -part.rarity.common=Common -part.rarity.uncommon=Uncommon -part.rarity.rare=Rare -part.rarity.epic=Epic -part.rarity.legendary=Legendary -part.rarity.strange=Strange - -# generic / fallback -general.na=N/A -error.generic=### I AM ERROR ### - -# --- Satellite chips --- -satchip.frequency=Satellite frequency -satchip.foeq=Gives you an achievement. That's it. -satchip.gerald.line1=Single use. -satchip.gerald.line2=Requires orbital module. -satchip.gerald.line3=Melter of CPUs, bane of every server owner. -satchip.laser=Allows to summon lasers with a 15 second cooldown. -satchip.mapper=Displays currently loaded chunks. -satchip.miner=Will deliver ore powders to a cargo landing pad. -satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. -satchip.radar=Shows a map of active entities. -satchip.resonator=Allows for teleportation with no cooldown. -satchip.scanner=Creates a topdown map of underground ores. - -# --- Items (bomb components) --- -item.bomb_part.used_in=Used in: -item.n2.mine=N² Mine -item.fleija.name=F.L.E.I.J.A. -item.solinium.name=Solinium Bomb - -# --- Weapon / gun tooltips --- -gui.weapon.ammo=Ammo -gui.weapon.baseDamage=Base Damage -gui.weapon.damageWithAmmo=Damage with current ammo -gui.weapon.condition=Condition -gui.weapon.accepts=Accepts - -gui.weapon.quality.aside=Standard Arsenal -gui.weapon.quality.bside=B-Side -gui.weapon.quality.legendary=Legendary Weapon -gui.weapon.quality.special=Special Weapon -gui.weapon.quality.utility=Utility -gui.weapon.quality.secret=SECRET -gui.weapon.quality.debug=DEBUG From 7793f9fa24d04f238d7c406ac254937776407f22 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 11:09:03 -0600 Subject: [PATCH 277/323] More sorting --- src/main/resources/assets/hbm/lang/en_US.lang | 5 +- src/main/resources/assets/hbm/lang/ru_RU.lang | 253 ++++++++---------- 2 files changed, 108 insertions(+), 150 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 2fb55b6b7..c536a9fb5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1397,8 +1397,6 @@ gun.name.win20Poly=Winchester Model 20 Polymer gun.name.win20Satur=Winchester Model 20 D-25A gun.name.zomg=EMC101 Prismatic Negative Energy Cannon - - hadron.analysis=Analyzing... hadron.buttonOn=Analysis Chamber (if present) is ON hadron.buttonOff=Analysis Chamber is OFF @@ -6378,3 +6376,6 @@ desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 tile.oc_cable_paintable.name=Paintable Network Cable + +general.na=N/A +error.generic=### I AM ERROR ### diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index b78bdcd05..54a873aa4 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1054,6 +1054,16 @@ desc.gui.zirnox.pressure=§6Давление§r$Давление можно сн desc.gui.zirnox.warning1=§cВнимание:§r Вода необходима для$правильной работы реактора! desc.gui.zirnox.warning2=§cВнимание:§r CO2 необходим для$правильной работы реактора! +gui.recipe.duration=Длительность +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.mB=mB +gui.recipe.atPressure=при давлении в +gui.recipe.autoswitch=Группа автоматического переключения +gui.recipe.enabledFor=Включено для +gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт + desc.item.ammo.con_accuracy2=- Сильно сниженная точность desc.item.ammo.con_damage=- Сильно сниженный урон desc.item.ammo.con_heavy_wear=- Сильно увеличенный износ @@ -3246,6 +3256,18 @@ item.gun_uboinik_ammo.name=Дробь 12x70 калибра (LEGACY) item.gun_uzi.name=IMI Узи item.gun_uzi_richter.name=Richter item.gun_uzi_akimbo.name=Акимбо Узи +gui.weapon.ammo=Боеприпасы +gui.weapon.baseDamage=Базовый урон +gui.weapon.damageWithAmmo=Урон с текущими боеприпасами +gui.weapon.condition=Состояние +gui.weapon.accepts=Принимает +gui.weapon.quality.aside=Стандартный арсенал +gui.weapon.quality.bside=Би-Сайд +gui.weapon.quality.legendary=Легендарное оружие +gui.weapon.quality.special=Специальное оружие +gui.weapon.quality.utility=Утилитарное +gui.weapon.quality.secret=СЕКРЕТ +gui.weapon.quality.debug=ОТЛАДКА item.gun_uzi_ammo.name=Патроны кал. 22LR (LEGACY) item.gun_uzi_saturnite.name=Сатурнитовый Узи item.gun_uzi_saturnite_silencer.name=Сатурнитовый Узи с глушителем @@ -3609,6 +3631,84 @@ item.missile_strong.name=Мощная фугасная ракета item.missile_taint.name=Зараженная ракета item.missile_volcano.name=Тектоническая ракета item.missile_volcano.desc=Используя силу ядерной взрывчатки, мы можем вызвать вулкан! + +gui.missile.warhead=Боеголовка +gui.missile.strength=Мощность +gui.missile.fuelType=Тип топлива +gui.missile.fuelAmount=Количество топлива +gui.missile.chipInaccuracy=Неточность чипа +gui.missile.finInaccuracy=Неточность стабилизаторов +gui.missile.size=Размер +gui.missile.health=Прочность +gui.missile.fuel=Топливо +gui.missile.fuelCapacity=Ёмкость топлива +gui.missile.notLaunchable=Невозможно запустить! + +missile.tier.tier0=Уровень 0 +missile.tier.tier1=Уровень 1 +missile.tier.tier2=Уровень 2 +missile.tier.tier3=Уровень 3 +missile.tier.tier4=Уровень 4 +missile.fuel.solid=Твёрдое топливо +missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) +missile.fuel.ethanol_peroxide=Этанол / Перекись водорода +missile.fuel.kerosene_peroxide=Керосин / Перекись водорода +missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород + +warhead.he=HE +warhead.incendiary=Зажигательная +warhead.cluster=Кассетная +warhead.bunker_buster=Противобункерная +warhead.nuclear=Ядерная +warhead.thermonuclear=Термоядерная (TX) +warhead.n2=N² +warhead.balefire=Жар-ядерная +warhead.schrabidium=Шрабидевая +warhead.taint=Порча +warhead.cloud=Облако +warhead.turbine=Турбина + +part.inaccuracy=Неточность +part.size=Размер +part.type=Тип +part.strength=Прочность +part.weight=Вес +part.topSize=Верхний размер +part.bottomSize=Нижний размер +part.fuelType=Тип топлива +part.fuelAmount=Количество топлива +part.fuelConsumption=Расход топлива +part.maxPayload=Макс. нагрузка +part.health=Прочность +part.rarity=Редкость +part.by=Автор +part.size.any=Любой +part.size.none=Нет + +fuel.xenon=Ксенон +fuel.balefire=Жар-ракетное топливо + +part.rarity.common=Обычное +part.rarity.uncommon=Необычное +part.rarity.rare=Редкое +part.rarity.epic=Эпическое +part.rarity.legendary=Легендарное +part.rarity.strange=Странное + +satchip.frequency=Частота спутника +satchip.foeq=Даёт достижение. И всё. +satchip.gerald.line1=Одноразовый. +satchip.gerald.line2=Требуется орбитальный модуль. +satchip.gerald.line3=Расплавитель процессоров, проклятие каждого владельца сервера. +satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. +satchip.mapper=Отображает загруженные в данный момент чанки. +satchip.miner=Доставляет рудные порошки на посадочную площадку. +satchip.lunar_miner=Добывает лунный грунт и доставляет на посадочную площадку. +satchip.radar=Показывает карту активных сущностей +satchip.resonator=Позволяет телепортироваться без перезарядки. +satchip.scanner=Создаёт карту подземных руд сверху вниз. + item.mold_base.name=Пустая литейная форма item.mold.name=Литейная форма item.morning_glory.name=Фиалковый вьюнок @@ -5983,6 +6083,10 @@ tile.nuke_n45.name=Морская мина N45 tile.nuke_prototype.name=Прототип tile.nuke_solinium.name=Синий Ополаскиватель tile.nuke_tsar.name=Царь-бомба +item.bomb_part.used_in=Используется в: +item.n2.mine=Мина N² +item.fleija.name=Ф.Л.Е.Я. +item.solinium.name=Синий Ополаскиватель tile.oil_duct.name=Труба для нефти tile.oil_duct_solid.name=Покрытая труба для нефти tile.oil_pipe.name=Труба для извлечения неочищенной нефти @@ -6542,154 +6646,7 @@ desc.gui.upgrade.speed= * §4Скорость§r: Стакается до 3-х tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель -desc.util.type=Тип -desc.util.size=Размер -desc.util.weight=Вес -desc.util.inaccuracy=Неточность -desc.util.strength=Сила -desc.util.top_size=Верхний размер -desc.util.bottom_size=Нижний размер -desc.util.fuel_type=Тип топлива -desc.util.fuel_amount=Количество топлива -desc.util.health=Здоровье -desc.util.rarity=Редкость -desc.util.not_launchable=Не запускается! -desc.util.fuel_capacity=Ёмкость топливного бака -desc.util.warhead=Боеголовка -desc.util.chip_inaccuracy=Неточность чипа -desc.util.fin_inaccuracy=Неточность стабилизатора - -# Shared recipe labels -gui.recipe.duration=Длительность -gui.recipe.consumption=Потребление -gui.recipe.input=Вход -gui.recipe.output=Выход -gui.recipe.mB=mB -gui.recipe.atPressure=при давлении в -gui.recipe.autoswitch=Группа автоматического переключения -gui.recipe.enabledFor=Включено для -gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт - -# shared recipe / machine labels -gui.recipe.duration=Время -gui.recipe.consumption=Потребление -gui.recipe.input=Вход -gui.recipe.output=Выход -gui.recipe.mB=mB -gui.recipe.atPressure=при -gui.recipe.autoswitch=Автопереключение группы -gui.recipe.enabledFor=Доступно для -gui.recipe.setRecipe=Нажмите, чтобы установить рецепт - -# --- Missile / parts (generic) --- -gui.missile.warhead=Боеголовка -gui.missile.strength=Мощность -gui.missile.fuelType=Тип топлива -gui.missile.fuelAmount=Количество топлива -gui.missile.chipInaccuracy=Неточность чипа -gui.missile.finInaccuracy=Неточность стабилизаторов -gui.missile.size=Размер -gui.missile.health=Прочность -gui.missile.fuel=Топливо -gui.missile.fuelCapacity=Ёмкость топлива -gui.missile.notLaunchable=Невозможно запустить! - -# missile tiers -missile.tier.tier0=Уровень 0 -missile.tier.tier1=Уровень 1 -missile.tier.tier2=Уровень 2 -missile.tier.tier3=Уровень 3 -missile.tier.tier4=Уровень 4 - -# missile fuel names -missile.fuel.solid=Твёрдое топливо -missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) -missile.fuel.ethanol_peroxide=Этанол / Перекись водорода -missile.fuel.kerosene_peroxide=Керосин / Перекись водорода -missile.fuel.kerosene_loxy=Керосин / Жидкий кислород -missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород - -# warheads (used by parts) -warhead.he=HE -warhead.incendiary=Зажигательная -warhead.cluster=Кассетная -warhead.bunker_buster=Противобункерная -warhead.nuclear=Ядерная -warhead.thermonuclear=Термоядерная (TX) -warhead.n2=N² -warhead.balefire=Жар-ядерная -warhead.schrabidium=Шрабидевая -warhead.taint=Порча -warhead.cloud=Облако -warhead.turbine=Турбина - -# part keys -part.inaccuracy=Неточность -part.size=Размер -part.type=Тип -part.strength=Прочность -part.weight=Вес -part.topSize=Верхний размер -part.bottomSize=Нижний размер -part.fuelType=Тип топлива -part.fuelAmount=Количество топлива -part.fuelConsumption=Расход топлива -part.maxPayload=Макс. нагрузка -part.health=Прочность -part.rarity=Редкость -part.by=Автор -part.size.any=Любой -part.size.none=Нет - -# fuel extras used by parts -fuel.xenon=Ксенон -fuel.balefire=Жар-ракетное топливо - -# part rarity keys (enum-based, neuter) -part.rarity.common=Обычное -part.rarity.uncommon=Необычное -part.rarity.rare=Редкое -part.rarity.epic=Эпическое -part.rarity.legendary=Легендарное -part.rarity.strange=Странное - -# generic / fallback general.na=Н/Д error.generic=### Я ОШИБКА ### -# --- Satellite chips --- -satchip.frequency=Частота спутника -satchip.foeq=Даёт достижение. И всё. -satchip.gerald.line1=Одноразовый. -satchip.gerald.line2=Требуется орбитальный модуль. -satchip.gerald.line3=Расплавитель процессоров, проклятие каждого владельца сервера. -satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. -satchip.mapper=Отображает загруженные в данный момент чанки. -satchip.miner=Доставляет рудные порошки на посадочную площадку. -satchip.lunar_miner=Добывает лунный грунт и доставляет на посадочную площадку. -satchip.radar=Показывает карту активных сущностей -satchip.resonator=Позволяет телепортироваться без перезарядки. -satchip.scanner=Создаёт карту подземных руд сверху вниз. - -# --- Items (bomb components) --- -item.bomb_part.used_in=Используется в: -item.n2.mine=Мина N² -item.fleija.name=Ф.Л.Е.Я. -item.solinium.name=Синий Ополаскиватель - -# --- Weapon / gun tooltips --- -gui.weapon.ammo=Боеприпасы -gui.weapon.baseDamage=Базовый урон -gui.weapon.damageWithAmmo=Урон с текущими боеприпасами -gui.weapon.condition=Состояние -gui.weapon.accepts=Принимает - -gui.weapon.quality.aside=Стандартный арсенал -gui.weapon.quality.bside=Би-Сайд -gui.weapon.quality.legendary=Легендарное оружие -gui.weapon.quality.special=Специальное оружие -gui.weapon.quality.utility=Утилитарное -gui.weapon.quality.secret=СЕКРЕТ -gui.weapon.quality.debug=ОТЛАДКА - -// Last updated 23.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // +// Last updated 24.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // From 78ea52cbabafa0554a8b3a8a689ff504568739a7 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 12:37:14 -0600 Subject: [PATCH 278/323] I18n implementation for ItemLemon.java --- .../java/com/hbm/items/food/ItemLemon.java | 52 ++++++++----------- src/main/resources/assets/hbm/lang/en_US.lang | 19 +++++++ src/main/resources/assets/hbm/lang/ru_RU.lang | 19 +++++++ 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index b331b799e..482cb37bc 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -2,6 +2,8 @@ package com.hbm.items.food; import java.util.List; +import com.hbm.util.i18n.I18nUtil; + import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -29,70 +31,62 @@ public class ItemLemon extends ItemFood { public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { if(this == ModItems.lemon) { - list.add("Eh, good enough."); + list.add(I18nUtil.resolveKey("item.lemon.desc")); } if(this == ModItems.med_ipecac) { - list.add("Bitter juice that will cause your stomach"); - list.add("to forcefully eject its contents."); + list.add(I18nUtil.resolveKey("item.med_ipecac.desc.1")); + list.add(I18nUtil.resolveKey("item.med_ipecac.desc.2")); } if(this == ModItems.med_ptsd) { - list.add("This isn't even PTSD mediaction, it's just"); - list.add("Ipecac in a different bottle!"); + list.add(I18nUtil.resolveKey("item.med_ptsd.desc.1")); + list.add(I18nUtil.resolveKey("item.med_ptsd.desc.2")); } if(this == ModItems.med_schizophrenia) { - list.add("Makes the voices go away. Just for a while."); + list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.1")); list.add(""); - list.add("..."); - list.add("Better not take it."); - } - - if(this == ModItems.med_schizophrenia) { - list.add("Makes the voices go away. Just for a while."); - list.add(""); - list.add("..."); - list.add("Better not take it."); + list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.2")); + list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.3")); } if(this == ModItems.loops) { - list.add("Brøther, may I have some lööps?"); + list.add(I18nUtil.resolveKey("item.loops.desc")); } if(this == ModItems.loop_stew) { - list.add("A very, very healthy breakfast."); + list.add(I18nUtil.resolveKey("item.loop_stew.desc")); } if(this == ModItems.twinkie) { - list.add("Expired 600 years ago!"); + list.add(I18nUtil.resolveKey("item.twinkie.desc")); } if(this == ModItems.pudding) { - list.add("What if he did?"); - list.add("What if he didn't?"); - list.add("What if the world was made of pudding?"); + list.add(I18nUtil.resolveKey("item.pudding.desc.1")); + list.add(I18nUtil.resolveKey("item.pudding.desc.2")); + list.add(I18nUtil.resolveKey("item.pudding.desc.3")); } if(this == ModItems.ingot_semtex) { - list.add("Semtex H Plastic Explosive"); - list.add("Performant explosive for many applications."); - list.add("Edible"); + list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.1")); + list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.2")); + list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.3")); } if(this == ModItems.peas) { - list.add("He accepts your offering."); + list.add(I18nUtil.resolveKey("item.peas.desc")); } if(this == ModItems.quesadilla) { - list.add("That's what a 50 year old yeast infection does to you."); + list.add(I18nUtil.resolveKey("item.cheese_quesadilla.desc")); } } - - @Override + @Override protected void onFoodEaten(ItemStack stack, World world, EntityPlayer player) - { + { if(this == ModItems.med_ipecac || this == ModItems.med_ptsd) { player.addPotionEffect(new PotionEffect(Potion.hunger.id, 50, 49)); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c536a9fb5..6d22361d2 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2384,6 +2384,7 @@ item.centrifuge_tower.name=Centrifuge Tower item.chainsaw.name=Chainsaw item.cheese.name=Cheese item.cheese_quesadilla.name=Cheese Quesadilla +item.cheese_quesadilla.desc=That's what a 50 year old yeast infection does to you. item.chemical_dye.black.name=Chemical Dye (Black) item.chemical_dye.blue.name=Chemical Dye (Blue) item.chemical_dye.brown.name=Chemical Dye (Brown) @@ -3172,6 +3173,9 @@ item.ingot_schrabidium_fuel.name=Ingot of Schrabidium Fuel item.ingot_schraranium.name=Schraranium Ingot item.ingot_schraranium.desc=Made from uranium in a schrabidium transmutator item.ingot_semtex.name=Bar of Semtex +item.ingot_semtex.desc.1=Semtex H Plastic Explosive +item.ingot_semtex.desc.2=Performant explosive for many applications. +item.ingot_semtex.desc.3=Edible item.ingot_silicon.name=Silicon Boule item.ingot_smore.name=S'more Ingot item.ingot_solinium.name=Solinium Ingot @@ -3262,6 +3266,7 @@ item.launch_code_piece.name=Silo Launch Code Piece item.launch_key.name=Silo Launch Key item.lead_gavel.name=Leaden Gavel item.lemon.name="Lemon" +item.lemon.desc=Eh, good enough. item.letter.name=Express Mail item.levitation_unit.name=Gravity Manipulator item.lignite.name=Lignite @@ -3274,7 +3279,9 @@ item.liquidator_plate.name=Liquidator Suit Chestplate item.lithium.name=Lithium Cube item.lodestone.name=Lodestone item.loop_stew.name=IT Breakfast +item.loop_stew.desc=A very, very healthy breakfast. item.loops.name=Lööps +item.loops.desc=Brøther, may I have some lööps? item.loot_10.name=Size 10 Missile Loot Crate item.loot_15.name=Size 15 Missile Loot Crate item.loot_misc.name=General Missile Loot Crate @@ -3301,8 +3308,15 @@ item.mechanism_rifle_2.name=Advanced Rifle Mechanism item.mechanism_special.name=High-Tech Weapon Mechanism item.med_bag.name=First Aid Kit item.med_ipecac.name=Ipecac Syrup +item.med_ipecac.desc.1=Bitter juice that will cause your stomach +item.med_ipecac.desc.2=to forcefully eject its contents. item.med_ptsd.name=PTSD Medication +item.med_ptsd.desc.1=This isn't even PTSD mediaction, it's just +item.med_ptsd.desc.2=Ipecac in a different bottle! item.med_schiziphrenia.name=Schizophrenia Medication +item.med_schizophrenia.desc.1=Makes the voices go away. Just for a while. +item.med_schizophrenia.desc.2=... +item.med_schizophrenia.desc.3=Better not take it. item.medal_liquidator.name=Liquidator Medal item.meltdown_tool.name=Dyatlov Instant Meltdown Applicator item.memespoon.name=§eMarket Gardener @@ -3803,6 +3817,7 @@ item.particle_strange.name=Strange Quark Capsule item.particle_tachyon.name=Tachyon Capsule item.parts_legendary.name=Legendary Parts item.peas.name=Peas +item.peas.desc=He accepts your offering. item.pedestal_steel.name=Steel Pedestal item.pellet_advanced.name=Advanced Watz Performance Improver item.pellet_antimatter.name=Antimatter Cluster @@ -4069,6 +4084,9 @@ item.primer_buckshot.name=Buckshot Primer (x12) item.protection_charm.name=Charm of Protection item.prototype_kit.name=Prototype Kit item.pudding.name=Pudding +item.pudding.desc.1=What if he did? +item.pudding.desc.2=What if he didn't? +item.pudding.desc.3=What if the world was made of pudding? item.pwr_fuel.bfb_am_mix.name=Fuel Grade Americium PWR BFB Rod item.pwr_fuel.bfb_pu241.name=Plutonium-241 PWR BFB Rod item.pwr_fuel.hea242.name=HEA-242 PWR Fuel Rod @@ -4645,6 +4663,7 @@ item.turret_rocket_ammo.name=Rocket Turret 2x4 Ammunition item.turret_spitfire_ammo.name=AA-Shell item.turret_tau_ammo.name=Tau Turret Uranium Ammo item.twinkie.name=Twinkie +item.twinkie.desc=Expired 600 years ago! item.ullapool_caber.name=Ullapool Caber item.undefined.name=Undefined item.upgrade_5g.name=5G Radiation Emitter Upgrade diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 54a873aa4..e8f1e035a 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2540,6 +2540,7 @@ item.centrifuge_tower.name=Башня центрифуги item.chainsaw.name=Бензопила item.cheese.name=Сыр item.cheese_quesadilla.name=Сырная кесадилья +item.cheese_quesadilla.desc=Вот что делает с вами 50-летняя дрожжевая инфекция. item.chemical_dye.black.name=Химический краситель (Чёрный) item.chemical_dye.blue.name=Химический краситель (Синий) item.chemical_dye.brown.name=Химический краситель (Коричневый) @@ -3431,6 +3432,9 @@ item.ingot_schrabidium_fuel.name=Слиток шрабидиевого топл item.ingot_schraranium.name=Шрараниевый слиток item.ingot_schraranium.desc=Делается из урана в шрабидиевом трансмутаторе item.ingot_semtex.name=Семтекс +item.ingot_semtex.desc.1=Пластиковая взрывчатка Семтекс H +item.ingot_semtex.desc.2=Эффективное взрывчатое вещество для многих применений. +item.ingot_semtex.desc.3=Съедобно item.ingot_silicon.name=Кремниевый брусок item.ingot_smore.name=Слиток с'мора item.ingot_solinium.name=Солиниевый слиток @@ -3525,6 +3529,7 @@ item.launch_code_piece.name=Кусок кода запуска item.launch_key.name=Ключ запуска item.lead_gavel.name=Свинцовый молоток item.lemon.name="Лимон" +item.lemon.desc=Ну, вроде нормально. item.letter.name=Экспресс-почта item.levitation_unit.name=Гравитационный манипулятор item.lignite.name=Бурый уголь @@ -3537,7 +3542,9 @@ item.liquidator_plate.name=Нагрудник костюма Ликвидато item.lithium.name=Куб лития item.lodestone.name=Магнетит item.loop_stew.name=Завтрак IT-шника +item.loop_stew.desc=Очень, очень полезный завтрак. item.loops.name=Пəтли +item.loops.desc=Брø, можно мне немного пəтлей? item.loot_10.name=Ящик с запчастями от ракеты 10-го размера item.loot_15.name=Ящик с запчастями от ракеты 15-го размера item.loot_misc.name=Общий ящик с запчастями от ракеты @@ -3564,8 +3571,15 @@ item.mechanism_rifle_2.name=Усовершенствованный винтов item.mechanism_special.name=Механизм высокотехнологичного оружия item.med_bag.name=Аптечка первой помощи item.med_ipecac.name=Сироп из рвотного корня +item.med_ipecac.desc.1=Горький сок, который заставит ваш желудок +item.med_ipecac.desc.2=с силой извергнуть свое содержимое. item.med_ptsd.name=Лечение ПТСР +item.med_ptsd.desc.1=Это даже не лекарство от ПТСР, +item.med_ptsd.desc.2=это просто рвотный корень в другой банке! item.med_schiziphrenia.name=Лекарство от шизофрении +item.med_schizophrenia.desc.1=Заставляет голоса исчезнуть. Хоть на время. +item.med_schizophrenia.desc.2=... +item.med_schizophrenia.desc.3=Лучше не принимать. item.medal_liquidator.name=Медаль Ликвидатора item.meltdown_tool.name=Аппликатор мгновенного расплавления Дятлова item.memespoon.name=§eЗемлекоп @@ -4065,6 +4079,7 @@ item.particle_strange.name=Капсула со Странным кварком item.particle_tachyon.name=Капсула с тахионом item.parts_legendary.name=Легендарные запчасти item.peas.name=Горошек +item.peas.desc=Он принимает твое приношение. item.pedestal_steel.name=Стальная стойка item.pellet_advanced.name=Улучшитель производительности Ватцз item.pellet_antimatter.name=Кластер антиматерии @@ -4331,6 +4346,9 @@ item.primer_buckshot.name=Картечные Капсюли (x12) item.protection_charm.name=Талисман защиты item.prototype_kit.name=Комплект Прототипа item.pudding.name=Пудинг +item.pudding.desc.1=Что, если бы он сделал? +item.pudding.desc.2=Что, если бы он не сделал? +item.pudding.desc.3=Что, если бы мир был сделан из пудинга? item.pwr_fuel.bfb_am_mix.name=Стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel.bfb_pu241.name=Стержень ВВЭР ЦБР с плутонием-241 item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащённым америцием-242 @@ -4915,6 +4933,7 @@ item.turret_rocket_ammo.name=Боекомплект ракетной турел item.turret_spitfire_ammo.name=AA-Снаряд item.turret_tau_ammo.name=Урановые боеприпасы Тау-турели item.twinkie.name=Твинки +item.twinkie.desc=Испортилось 600 лет назад! item.ullapool_caber.name=Аллапульское бревно item.undefined.name=Undefined item.upgrade_5g.name=Улучшение "5G излучение" From 4b28ee222775bc36490ed68ea66540e35acfc990 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 12:51:25 -0600 Subject: [PATCH 279/323] I18n implementation for cloth --- src/main/java/com/hbm/items/special/ItemRag.java | 16 +++++++--------- src/main/resources/assets/hbm/lang/en_US.lang | 2 ++ src/main/resources/assets/hbm/lang/ru_RU.lang | 2 ++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/items/special/ItemRag.java b/src/main/java/com/hbm/items/special/ItemRag.java index bb883f6eb..ad53fd20d 100644 --- a/src/main/java/com/hbm/items/special/ItemRag.java +++ b/src/main/java/com/hbm/items/special/ItemRag.java @@ -2,6 +2,7 @@ package com.hbm.items.special; import java.util.List; +import com.hbm.util.i18n.I18nUtil; import com.hbm.items.ModItems; import net.minecraft.block.material.Material; @@ -15,31 +16,28 @@ public class ItemRag extends Item { @Override public boolean onEntityItemUpdate(EntityItem entityItem) { - + if(entityItem != null && !entityItem.worldObj.isRemote) { - + if(entityItem.worldObj.getBlock((int)Math.floor(entityItem.posX), (int)Math.floor(entityItem.posY), (int)Math.floor(entityItem.posZ)).getMaterial() == Material.water) { ItemStack stack = entityItem.getEntityItem(); entityItem.setEntityItemStack(new ItemStack(ModItems.rag_damp, stack.stackSize)); return true; } } - return false; } - + @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - stack.stackSize--; player.inventory.addItemStackToInventory(new ItemStack(ModItems.rag_piss)); - return stack; } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add("Drop into water to make damp cloth."); - list.add("Right-click to urinate on the cloth."); + list.add(I18nUtil.resolveKey("item.rag.desc.1")); + list.add(I18nUtil.resolveKey("item.rag.desc.2")); } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 6d22361d2..e0a543148 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4140,6 +4140,8 @@ item.radaway_strong.name=Strong RadAway item.radx.name=Rad-X item.radx.desc=Increases radiation resistance by 0.2 (37%%) for 3 minutes item.rag.name=Cloth +item.rag.desc.1=Drop into water to make damp cloth. +item.rag.desc.2=Right-click to urinate on the cloth. item.rag_damp.name=Damp Cloth item.rag_piss.name=Piss-Soaked Rag item.rangefinder.name=Rangefinder diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index e8f1e035a..0b513b9c0 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -4402,6 +4402,8 @@ item.radaway_strong.name=Усиленный антирадин item.radx.name=Рад-X item.radx.desc=Increases radiation resistance by 0.2 (37%) for 3 minutes item.rag.name=Тряпка +item.rag.desc.1=Бросьте в воду, чтобы намочить тряпку. +item.rag.desc.2=ПКМ, чтобы помочиться на тряпку. item.rag_damp.name=Влажная тряпка item.rag_piss.name=Пропитанная мочой тряпка item.rangefinder.name=Дальнометр From 9d67211dddd7cd48a463d2f012ad070f39baac91 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 14:27:48 -0600 Subject: [PATCH 280/323] Fixed a joke that has been a bad joke for centuries. --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 0b513b9c0..6c39deebc 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2465,7 +2465,7 @@ item.canned_napalm.desc=Люблю запах старых мемов по ут item.canned_oil.name=Консервированное моторное масло item.canned_oil.desc=Заставляет мотор работать, почему не может и людей? item.canned_pashtet.name=Паштет -item.canned_pashtet.desc=услуги перевода недоступны! +item.canned_pashtet.desc=Translation services are not available! item.canned_pizza.name=Консервированная пицца item.canned_pizza.desc=Преступление против человечества. item.canned_recursion.name=Консервированная рекурсия From d5e923c263bcf86ea3fef3d20dda57ebf11923ef Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sun, 24 Aug 2025 14:28:38 -0600 Subject: [PATCH 281/323] Uhuh --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 6c39deebc..037b7c5b4 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2464,7 +2464,7 @@ item.canned_napalm.name=Консервированный напалм item.canned_napalm.desc=Люблю запах старых мемов по утрам. item.canned_oil.name=Консервированное моторное масло item.canned_oil.desc=Заставляет мотор работать, почему не может и людей? -item.canned_pashtet.name=Паштет +item.canned_pashtet.name=Pate item.canned_pashtet.desc=Translation services are not available! item.canned_pizza.name=Консервированная пицца item.canned_pizza.desc=Преступление против человечества. From 951c00d79d423e3d155a56a9624c693ae1fa407b Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 25 Aug 2025 09:12:09 +0200 Subject: [PATCH 282/323] some fixes, RBMK control rod copyable --- changelog | 7 +++++- .../java/com/hbm/blocks/BlockDummyable.java | 1 + .../rbmk/TileEntityRBMKControlAuto.java | 24 ++++++++++++++++++- .../rbmk/TileEntityRBMKControlManual.java | 18 ++++++++++++-- .../network/TileEntityCraneGrabber.java | 6 ++++- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/changelog b/changelog index 67551c1c8..0b80e7764 100644 --- a/changelog +++ b/changelog @@ -1,2 +1,7 @@ ## Changed -* Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines \ No newline at end of file +* Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines +* RBMK control rod colors and auto control rod settings are now copiable + +## Fixed +* Fixed conveyor grabber dropping items off at an offset when placing them on a conveyor belt due to a client desync +* Fixed occasional crash caused by using the settings tool on the autoloader \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index fe9a001ca..5b72660bf 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -565,6 +565,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl @Override public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { int[] pos = findCore(world, x, y, z); + if(pos == null) return; TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); if (tile instanceof ICopiable) ((ICopiable) tile).pasteSettings(nbt, index, world, player, pos[0], pos[1], pos[2]); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java index 5c1837c71..c587fc355 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java @@ -1,10 +1,12 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; import com.hbm.inventory.container.ContainerRBMKControlAuto; import com.hbm.inventory.gui.GUIRBMKControlAuto; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; +import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,7 +18,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements IControlReceiver { +public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements IControlReceiver, ICopiable { public RBMKFunction function = RBMKFunction.LINEAR; public double levelLower; @@ -164,4 +166,24 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIRBMKControlAuto(player.inventory, this); } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("levelLower", levelLower); + data.setDouble("levelUpper", levelUpper); + data.setDouble("heatLower", heatLower); + data.setDouble("heatUpper", heatUpper); + data.setInteger("function", function.ordinal()); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("levelLower")) levelLower = nbt.getDouble("levelLower"); + if(nbt.hasKey("levelUpper")) levelLower = nbt.getDouble("levelUpper"); + if(nbt.hasKey("heatLower")) levelLower = nbt.getDouble("heatLower"); + if(nbt.hasKey("heatUpper")) levelLower = nbt.getDouble("heatUpper"); + if(nbt.hasKey("function")) function = EnumUtil.grabEnumSafely(RBMKFunction.class, nbt.getInteger("function")); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index b34f99a5e..721ef2af6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -2,9 +2,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.blocks.machine.rbmk.RBMKControl; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; import com.hbm.inventory.container.ContainerRBMKControl; import com.hbm.inventory.gui.GUIRBMKControl; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; +import com.hbm.util.EnumUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -20,7 +22,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver { +public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver, ICopiable { public RBMKColor color; public double startingLevel; @@ -177,5 +179,17 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIRBMKControl(player.inventory, this); - } + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("color", color.ordinal()); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("color")) color = EnumUtil.grabEnumSafely(RBMKColor.class, nbt.getInteger("color")); + } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java index 61d9df4de..976201ba5 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java @@ -107,7 +107,11 @@ public class TileEntityCraneGrabber extends TileEntityCraneBase implements IGUIP Vec3 pos = Vec3.createVectorHelper(xCoord + 0.5 + outputSide.offsetX * 0.55, yCoord + 0.5 + outputSide.offsetY * 0.55, zCoord + 0.5 + outputSide.offsetZ * 0.55); Vec3 snap = belt.getClosestSnappingPosition(worldObj, xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ, pos); - item.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + EntityMovingItem newItem = new EntityMovingItem(worldObj); + newItem.setItemStack(item.getItemStack().copy()); + newItem.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + item.setDead(); + worldObj.spawnEntityInWorld(newItem); break; } From 4e30ac808450faeb7db74f11591295c73196295d Mon Sep 17 00:00:00 2001 From: RealSilverMoon Date: Mon, 25 Aug 2025 21:02:01 +0800 Subject: [PATCH 283/323] A little distinction --- src/main/resources/assets/hbm/lang/en_US.lang | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 22f6475e7..1b0ad2baf 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5931,7 +5931,7 @@ tile.rbmk_steam_inlet.desc=Inserts water into RBMK columns if ReaSim boilers are tile.rbmk_steam_outlet.name=RBMK ReaSim Steam Outlet tile.rbmk_steam_outlet.desc=Extracts super dense steam from RBMK columns if ReaSim boilers are enabled$Connects to RBMK columns sideways tile.rbmk_storage.name=RBMK Storage Column -tile.rbmk.dodd.heat=Heat +tile.rbmk.dodd.heat=Column Heat tile.rbmk.dodd.reasimWater=ReaSim Water tile.rbmk.dodd.reasimSteam=ReaSim Steam tile.rbmk.dodd.level=Level @@ -5955,9 +5955,9 @@ tile.rbmk.dodd.feed=Feed tile.rbmk.dodd.steam=Steam tile.rbmk.dodd.cryo=Cryo tile.rbmk.dodd.fuel=Fuel -tile.rbmk.dodd.f_heat=heat -tile.rbmk.dodd.f_xenon=xenon -tile.rbmk.dodd.f_yield=yield +tile.rbmk.dodd.f_heat=Fuel Heat +tile.rbmk.dodd.f_xenon=Fuel Xenon +tile.rbmk.dodd.f_yield=Fuel Yield tile.rbmk.dodd.feed_type=Feed Type(ID) tile.rbmk.dodd.steam_type=Steam Type(ID) tile.rbmk.dodd.cryo_type=Cryo Type(ID) From bf0aa7d2850704b2dc42a9b9cc452e903c8834f8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 25 Aug 2025 16:30:35 +0200 Subject: [PATCH 284/323] changelog --- changelog | 8 +++++++- src/main/java/com/hbm/items/ModItems.java | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 0b80e7764..8be9f46fc 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,13 @@ ## Changed +* Updated ukrainian and chinese localization, including QMAW * Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines * RBMK control rod colors and auto control rod settings are now copiable +* Murky wings no longer have slowfall, and using shift+space cancels the momentum +* Murky wings are now slow by default and speed up when sprinting +* The arc furnace can now be used with AE2 buses, which was previously not possible due to the unique stacksize limitations ## Fixed * Fixed conveyor grabber dropping items off at an offset when placing them on a conveyor belt due to a client desync -* Fixed occasional crash caused by using the settings tool on the autoloader \ No newline at end of file +* Fixed occasional crash caused by using the settings tool on the autoloader +* Fixed QMAW not correctly working with other languages +* Fixed QMAW loading breaking entirely due to file encoding \ No newline at end of file diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f04a7218f..8a8c42675 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1476,6 +1476,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; + public static Item gun_n_i_4_n_i; // we GET THERE when we GET THERE public static Item gun_charge_thrower; From f73d81310aebe0d5ed111645db0a11c47163bcb2 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 10:31:57 -0600 Subject: [PATCH 285/323] Minor changes --- src/main/resources/assets/hbm/lang/ru_RU.lang | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 037b7c5b4..bb946d525 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2935,11 +2935,11 @@ item.fau_helmet.name=Фау-шлем item.fau_legs.name=Фау-поножи item.fau_plate.name=Фау-нагрудник item.filter_coal.name=Фильтр с активированным углём -item.fins_big_steel.name=Большие стальные ребра решётки +item.fins_big_steel.name=Большие стальные рёбра решётки item.fins_flat.name=Плоский стальной кожух -item.fins_quad_titanium.name=Маленькие титановые ребра -item.fins_small_steel.name=Малые стальные ребра решётки -item.fins_tri_steel.name=Большие стальные ребра +item.fins_quad_titanium.name=Маленькие титановые рёбра +item.fins_small_steel.name=Малые стальные рёбра решётки +item.fins_tri_steel.name=Большие стальные рёбра item.five_htp.name=Таблетки энтерамина item.five_htp.desc=Убирает все DRX, Стабильность на 10 минут item.flame_conspiracy.name=Конспирологическая теория @@ -4059,7 +4059,7 @@ item.part_lithium.name=Коробка литиевой пыли item.part_mechanism.name=Оружейный механизм (%s) item.part_plutonium.name=Коробка плутониевой пыли item.part_receiver_heavy.name=Тяжёлый ресивер (%s) -item.part_receiver_light.name=Лёгкий ресивер(%s) +item.part_receiver_light.name=Лёгкий ресивер (%s) item.part_stock.name=Приклад (%s) item.particle_aelectron.name=Капсула с Позитроном item.particle_amat.name=Капсула с Антиматерией From b209795f605f1a0460b4fe7daf241d39153b83ca Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 10:49:22 -0600 Subject: [PATCH 286/323] Rangefinder --- src/main/resources/assets/hbm/lang/ru_RU.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index bb946d525..8b88b8612 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -4406,7 +4406,7 @@ item.rag.desc.1=Бросьте в воду, чтобы намочить тряп item.rag.desc.2=ПКМ, чтобы помочиться на тряпку. item.rag_damp.name=Влажная тряпка item.rag_piss.name=Пропитанная мочой тряпка -item.rangefinder.name=Дальнометр +item.rangefinder.name=Дальномер item.rbmk_fuel_balefire.name=Жар-топливный стержень РБМК item.rbmk_fuel_balefire_gold.name=Флэшголд-топливный стержень РБМК item.rbmk_fuel_drx.name=§cДигамма-топливный стержень РБМК§r From 8033fde2b914775c201695b388f26d58fd7c341a Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 10:52:30 -0600 Subject: [PATCH 287/323] Aluminium manual fix --- src/main/resources/assets/hbm/manual/material/aluminium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 8bdf151bc..db7074f22 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", - "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." + "ru_RU": "Распространённый легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет." } } From d71057bbab175af36bef022fcd578eeaff814b34 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:08:54 -0600 Subject: [PATCH 288/323] QMAW fixes --- src/main/resources/assets/hbm/manual/material/bismuth.json | 2 +- .../resources/assets/hbm/manual/material/bismuth_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bscco.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-235.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-238.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 9b3105586..b3952837f 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", - "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]]." + "ru_RU": "Тяжёлый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен в поздние стадии обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовой бронзы|Bismuth Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index 07167ba3d..cdc42f860 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", - "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]]." + "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяема с [[мышьяковой бронзой|Arsenic Bronze]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index a341b55af..3bf13e4d3 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", - "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]]." + "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмут|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 56b101d67..eed2f9d79 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", - "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." + "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index ca87770e1..ad433990b 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", - "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." + "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроуране|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." } } From ad9cb55b985d6cbaf541c342303a3ec58b52340d Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:10:35 -0600 Subject: [PATCH 289/323] More QMAW fixes --- src/main/resources/assets/hbm/manual/material/cinnabar.json | 2 +- src/main/resources/assets/hbm/manual/material/desh.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index bb721bf6f..e43790df3 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", - "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]]." + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деш|Desh]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index a34e741c7..a3969e06a 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", - "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." } } From 79074e19c2541f5f2b11416a564fc55efb8c05b7 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:12:51 -0600 Subject: [PATCH 290/323] Ferrouranium --- src/main/resources/assets/hbm/lang/ru_RU.lang | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 8b88b8612..6f1de13c1 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1906,7 +1906,7 @@ item.ammo_bag_infinite.name=Бесконечная сумка для боепр item.ammo_arty_phosphorus_multi.name=Фосфорный 16-дюймовый мульти-снаряд item.ammo_cell.name=Энерго-патроны item.ammo_coilgun.name=Вольфрамовый шар для гаусс-пушки -item.ammo_coilgun_du.name=Ферроураниевый шар для гаусс-пушки +item.ammo_coilgun_du.name=Ферроурановый шар для гаусс-пушки item.ammo_coilgun_rubber.name=Резиновый шар для гаусс-пушки item.ammo_container.name=Контейнер с боеприпасами item.ammo_dart.name=Пластиковый дротик (Иссущающий) @@ -1997,7 +1997,7 @@ item.ammo_standard.bmg50_sp.name=.50 BMG патрон (Экспансивный) item.ammo_standard.capacitor.name=Оружейный конденсатор (Стандартный) item.ammo_standard.capacitor_ir.name=Оружейный конденсатор (Коротковолновой) item.ammo_standard.capacitor_overcharge.name=Оружейный конденсатор (Перегруженный) -item.ammo_standard.coil_ferrouranium.name=Ферроураниевый шарик гаусс-пушки +item.ammo_standard.coil_ferrouranium.name=Ферроурановый шарик гаусс-пушки item.ammo_standard.coil_tungsten.name=Вольфрамовый шарик гаусс-пушки item.ammo_standard.ct_hook.name=Крюк-кошка item.ammo_standard.ct_mortar.name=Разрывной снаряд @@ -3372,7 +3372,7 @@ item.ingot_dura_steel.name=Слиток быстрорежущей стали item.ingot_electronium.name=Электрониевый слиток item.ingot_euphemium.name=Эвфемиевый слиток item.ingot_euphemium.desc=Совершенно особый и в то же время странный элемент. -item.ingot_ferrouranium.name=Ферроураниевый слиток +item.ingot_ferrouranium.name=Ферроурановый слиток item.ingot_fiberglass.name=Стекловолокно item.ingot_fiberglass.desc=С высоким содержанием волокна, с высоким содержанием стекла. Всё, что необходимо организму. item.ingot_firebrick.name=Шамотный кирпич @@ -3479,7 +3479,7 @@ item.insert_yharonite.name=Яронитовая пластина item.item_expensive.bronze_tubes.name=Бронзовые конструкционные элементы item.item_expensive.circuit.name=Обширная печатная плата item.item_expensive.computer.name=Мейнфрейм -item.item_expensive.ferro_plating.name=Армированные ферроураниевые панели +item.item_expensive.ferro_plating.name=Армированные ферроурановые панели item.item_expensive.heavy_frame.name=Тяжёлый каркас item.item_expensive.lead_plating.name=Радиационно-стойкое покрытие item.item_expensive.steel_plating.name=Стальная обшивка с болтовым соединением @@ -5059,7 +5059,7 @@ item.weapon_mod_generic.desh_damage.name=Оптимизированный деш item.weapon_mod_generic.desh_dura.name=Высокопрочные запчасти из деша item.weapon_mod_generic.dura_damage.name=Оптимизированный быстрорежущий ресивер item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из быстрорежущей стали -item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроураниевый ресивер +item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроурановый ресивер item.weapon_mod_generic.ferro_dura.name=Высокопрочные запчасти из ферроурана item.weapon_mod_generic.iron_damage.name=Оптимизированный железный ресивер item.weapon_mod_generic.iron_dura.name=Высокопрочные запчасти из железа @@ -5278,7 +5278,7 @@ tile.anvil_bismuth.name=Висмутовая наковальня tile.anvil_bismuth_bronze.name=Наковальня из висмутовой бронзы tile.anvil_desh.name=Деш-наковальня tile.anvil_dnt.name=Динейтрониевая наковальня -tile.anvil_ferrouranium.name=Ферроураниевая наковальня +tile.anvil_ferrouranium.name=Ферроурановая наковальня tile.anvil_iron.name=Железная наковальня tile.anvil_lead.name=Свинцовая наковальня tile.anvil_meteorite.name=Метеоритовая наковальня From ee41e9a7ed3ae8e915e995e42effa9c398cda46f Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:22:43 -0600 Subject: [PATCH 291/323] QMAW fixes --- src/main/resources/assets/hbm/manual/material/alloy.json | 2 +- src/main/resources/assets/hbm/manual/material/aluminium.json | 2 +- src/main/resources/assets/hbm/manual/material/arsenic.json | 2 +- .../resources/assets/hbm/manual/material/arsenic_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bakelite.json | 2 +- src/main/resources/assets/hbm/manual/material/bismuth.json | 2 +- .../resources/assets/hbm/manual/material/bismuth_bronze.json | 2 +- src/main/resources/assets/hbm/manual/material/bscco.json | 2 +- src/main/resources/assets/hbm/manual/material/cadmium.json | 2 +- .../resources/assets/hbm/manual/material/cadmium_steel.json | 2 +- src/main/resources/assets/hbm/manual/material/cinnabar.json | 2 +- src/main/resources/assets/hbm/manual/material/coke.json | 2 +- src/main/resources/assets/hbm/manual/material/copper.json | 4 ++-- src/main/resources/assets/hbm/manual/material/desh.json | 2 +- .../resources/assets/hbm/manual/material/ferrouranium.json | 2 +- src/main/resources/assets/hbm/manual/material/graphite.json | 2 +- src/main/resources/assets/hbm/manual/material/gunmetal.json | 2 +- src/main/resources/assets/hbm/manual/material/hss.json | 2 +- src/main/resources/assets/hbm/manual/material/latex.json | 2 +- src/main/resources/assets/hbm/manual/material/lead.json | 2 +- src/main/resources/assets/hbm/manual/material/mingrade.json | 2 +- src/main/resources/assets/hbm/manual/material/neptunium.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-238.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-239.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-240.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-241.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-rg.json | 2 +- src/main/resources/assets/hbm/manual/material/plutonium.json | 2 +- src/main/resources/assets/hbm/manual/material/polonium.json | 2 +- src/main/resources/assets/hbm/manual/material/polymer.json | 2 +- src/main/resources/assets/hbm/manual/material/radium.json | 2 +- src/main/resources/assets/hbm/manual/material/rubber.json | 2 +- src/main/resources/assets/hbm/manual/material/silicon.json | 2 +- src/main/resources/assets/hbm/manual/material/sodium.json | 2 +- src/main/resources/assets/hbm/manual/material/steel.json | 2 +- src/main/resources/assets/hbm/manual/material/sulfur.json | 2 +- src/main/resources/assets/hbm/manual/material/tantalium.json | 2 +- src/main/resources/assets/hbm/manual/material/technetium.json | 2 +- .../assets/hbm/manual/material/technetium_steel.json | 2 +- src/main/resources/assets/hbm/manual/material/thorium.json | 2 +- .../resources/assets/hbm/manual/material/uranium-233.json | 2 +- .../resources/assets/hbm/manual/material/uranium-235.json | 2 +- .../resources/assets/hbm/manual/material/uranium-238.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium.json | 2 +- .../resources/assets/hbm/manual/material/weaponsteel.json | 2 +- 45 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index 03ef80a7a..7d6276d8f 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], "title": { "en_US": "Advanced Alloy", - "ru_ru": "Продвинутый сплав" + "ru_ru": "Продвинутый сплав" }, "content": { "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index db7074f22..f36edce36 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], "title": { "en_US": "Aluminium", - "ru_RU": "Алюминий" + "ru_RU": "Алюминий" }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index d54f92d25..6e379c6c0 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], "title": { "en_US": "Arsenic", - "ru_RU": "Мышьяк" + "ru_RU": "Мышьяк" }, "content": { "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index d53db5d12..32e00bb1d 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_arsenic_bronze"]], "title": { "en_US": "Arsenic Bronze", - "ru_RU": "Мышьяковая бронза" + "ru_RU": "Мышьяковая бронза" }, "content": { "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index d5d232149..7759a73fe 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], "title": { "en_US": "Bakelite", - "ru_RU": "Бакелит" + "ru_RU": "Бакелит" }, "content": { "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index b3952837f..921eb33a4 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], "title": { "en_US": "Bismuth", - "ru_RU": "Висмут" + "ru_RU": "Висмут" }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index cdc42f860..3befaffba 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bismuth_bronze"]], "title": { "en_US": "Bismuth Bronze", - "ru_RU": "Висмутовая бронза" + "ru_RU": "Висмутовая бронза" }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index 3bf13e4d3..65e4ad1b1 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], "title": { "en_US": "BSCCO", - "ru_RU": "BSCCO" + "ru_RU": "BSCCO" }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 0de201080..83ad670aa 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], "title": { "en_US": "Cadmium", - "ru_RU": "Кадмий" + "ru_RU": "Кадмий" }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index 48ce8d495..9f90f1b66 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_cdalloy"]], "title": { "en_US": "Cadmium Steel", - "ru_RU": "Кадмиевая сталь" + "ru_RU": "Кадмиевая сталь" }, "content": { "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index e43790df3..349fb4386 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.cinnebar"]], "title": { "en_US": "Cinnabar", - "ru_RU": "Киноварь" + "ru_RU": "Киноварь" }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index 234ab7588..7ca4f99c4 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.coke", 1, 32767]], "title": { "en_US": "Coke", - "ru_RU": "Кокс" + "ru_RU": "Кокс" }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index e8e155732..6a893226d 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -4,10 +4,10 @@ "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], "title": { "en_US": "Copper", - "ru_RU": "Медь" + "ru_RU": "Медь" }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", - "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." + "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index a3969e06a..ebb91a37a 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], "title": { "en_US": "Desh", - "ru_RU": "Деш" + "ru_RU": "Деш" }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 687434042..3f9fa4f8d 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_ferrouranium"]], "title": { "en_US": "Ferrouranium", - "ru_RU": "Ферроуран" + "ru_RU": "Ферроуран" }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 1876c53fa..dd28e61c4 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_graphite"]], "title": { "en_US": "Graphite", - "ru_RU": "Графит" + "ru_RU": "Графит" }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index f5d89a0b1..23abdec47 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], "title": { "en_US": "Gunmetal", - "ru_RU": "Оружейный металл" + "ru_RU": "Оружейный металл" }, "content": { "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index 26380d6c5..0c438e98f 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], "title": { "en_US": "High-Speed Steel", - "ru_RU": "Высокоскоростная сталь" + "ru_RU": "Высокоскоростная сталь" }, "content": { "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index b5795bd32..b96807fef 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], "title": { "en_US": "Latex", - "ru_RU": "Латекс" + "ru_RU": "Латекс" }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index b4d919e1a..9620ac425 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], "title": { "en_US": "Lead", - "ru_RU": "Свинец" + "ru_RU": "Свинец" }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index fe1732da5..c4943c1c3 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { "en_US": "Minecraft Grade Copper (Red Copper)", - "ru_RU": "Медь Minecraft (Красная медь)" + "ru_RU": "Медь Minecraft (Красная медь)" }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index a68c7adb9..ae4865970 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], "title": { "en_US": "Neptunium", - "ru_RU": "Нептуний" + "ru_RU": "Нептуний" }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index d770353f4..3612bd86d 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], "title": { "en_US": "Plutonium-238", - "ru_RU": "Плутоний-238" + "ru_RU": "Плутоний-238" }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index f64b725f8..ee3cf2d0b 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], "title": { "en_US": "Plutonium-239", - "ru_RU": "Плутоний-239" + "ru_RU": "Плутоний-239" }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 859bfd7c0..8c5edce45 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], "title": { "en_US": "Plutonium-240", - "ru_RU": "Плутоний-240" + "ru_RU": "Плутоний-240" }, "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 096b8864c..67a4de27d 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], "title": { "en_US": "Plutonium-241", - "ru_RU": "Плутоний-241" + "ru_RU": "Плутоний-241" }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index c5cb2f1a4..fe8864f91 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], "title": { "en_US": "Reactor-Grade Plutonium", - "ru_RU": "Плутоний реакторного качества" + "ru_RU": "Плутоний реакторного качества" }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 719c14800..7416907b7 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], "title": { "en_US": "Plutonium", - "ru_RU": "Плутоний" + "ru_RU": "Плутоний" }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index c36e74218..3f4e25da7 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], "title": { "en_US": "Polonium-210", - "ru_RU": "Полоний-210" + "ru_RU": "Полоний-210" }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 9c540925b..3cbe6d6fb 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], "title": { "en_US": "Polymer", - "ru_RU": "Полимер" + "ru_RU": "Полимер" }, "content": { "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 331d37adc..ad6c7ed8f 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], "title": { "en_US": "Radium-226", - "ru_RU": "Радий-226" + "ru_RU": "Радий-226" }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index e317d6752..bdc560004 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_rubber"]], "title": { "en_US": "Rubber", - "ru_RU": "Резина" + "ru_RU": "Резина" }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 67951240c..2ff2706b0 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], "title": { "en_US": "Silicon", - "ru_RU": "Кремний" + "ru_RU": "Кремний" }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 6ad6ac6f7..42a12db2d 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.powder_sodium"]], "title": { "en_US": "Sodium", - "ru_RU": "Натрий" + "ru_RU": "Натрий" }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index 83c6f8867..57d3a38e0 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], "title": { "en_US": "Steel", - "ru_RU": "Сталь" + "ru_RU": "Сталь" }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 7d9b5915b..6de200015 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.sulfur"]], "title": { "en_US": "Sulfur", - "ru_RU": "Сера" + "ru_RU": "Сера" }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index e3d0ee9c2..7b68bd468 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], "title": { "en_US": "Tantalium", - "ru_RU": "Тантал" + "ru_RU": "Тантал" }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 5eaef724f..cc9e55a8f 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], "title": { "en_US": "Technetium", - "ru_RU": "Технеций" + "ru_RU": "Технеций" }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index ac31ac861..a5167b546 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], "title": { "en_US": "Technetium Steel", - "ru_RU": "Технециевая сталь" + "ru_RU": "Технециевая сталь" }, "content": { "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index be512e7cc..7032d8f14 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], "title": { "en_US": "Thorium-232", - "ru_RU": "Торий-232" + "ru_RU": "Торий-232" }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index d1802f419..93ac7e040 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], "title": { "en_US": "Uranium-233", - "ru_RU": "Уран-233" + "ru_RU": "Уран-233" }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index eed2f9d79..7fd575367 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], "title": { "en_US": "Uranium-235", - "ru_RU": "Уран-235" + "ru_RU": "Уран-235" }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index ad433990b..8594a63fa 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], "title": { "en_US": "Uranium-238", - "ru_RU": "Уран-238" + "ru_RU": "Уран-238" }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index 89ab05f6b..db712fba1 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], "title": { "en_US": "Uranium", - "ru_RU": "Уран" + "ru_RU": "Уран" }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index 52e5c11ed..c5c3aad4c 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], "title": { "en_US": "Weapon Steel", - "ru_RU": "Оружейная сталь" + "ru_RU": "Оружейная сталь" }, "content": { "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", From 3cbc342af5d73562d9870b040a85f4af5240d895 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:23:12 -0600 Subject: [PATCH 292/323] Red copper --- src/main/resources/assets/hbm/manual/material/mingrade.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index c4943c1c3..4152da2a7 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -4,7 +4,7 @@ "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], "title": { "en_US": "Minecraft Grade Copper (Red Copper)", - "ru_RU": "Медь Minecraft (Красная медь)" + "ru_RU": "Красная медь" }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", From f7cf05d944f91ef60e1d9a7498021141c759cff3 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:35:20 -0600 Subject: [PATCH 293/323] QMAW desh fix --- src/main/resources/assets/hbm/manual/material/desh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index ebb91a37a..b698b0680 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", - "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[лёгкую нефть|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртуть|Mercury]], побочный продукт [[центрифугирования|Centrifuge]] красной руды, и смесь деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деш медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей." } } From d6b095c568c2a79f7b2c6350d7fdaa2710b57fcd Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 11:36:31 -0600 Subject: [PATCH 294/323] Fix --- src/main/resources/assets/hbm/manual/material/ferrouranium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 3f9fa4f8d..adaed0dba 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", - "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах." + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[плавильне|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах." } } From 37279845be2177e9adf0481d2d9e7e6f7acdeb4b Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:02:16 -0600 Subject: [PATCH 295/323] Fixes --- src/main/resources/assets/hbm/manual/material/lead.json | 2 +- src/main/resources/assets/hbm/manual/material/neptunium.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-238.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-239.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-240.json | 2 +- src/main/resources/assets/hbm/manual/material/polonium.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index 9620ac425..d00e85eee 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", - "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем." + "ru_RU": "Распространённый ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем." } } diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index ae4865970..35eb51058 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", - "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе из [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index 3612bd86d..4ff984f27 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", - "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий." + "ru_RU": "Радиоизотоп, в основном используется в [[РИТЭГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках плутоний-210-бериллевых источниках для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index ee3cf2d0b..c06031700 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", - "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённом топливе для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 8c5edce45..b1ecc726e 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or inspecialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", - "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]]." + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[ЦТС|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index 3f4e25da7..985a382a3 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", - "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." + "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." } } From 12d2d6b8dd1ec1c243150dcd2f7ca7888be2cc51 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:10:30 -0600 Subject: [PATCH 296/323] Fixed QMAW again --- .../resources/assets/hbm/manual/material/plutonium-241.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 67a4de27d..85c28ab7d 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", - "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанного топлива [[РБМК|RBMK]], богатого [[плутонием-240|Plutonium-240]], а также из определенных видов [[циркониевого|Zirconium]] топлива быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." } } From b75e14d9fc73474192c41387188313f92eb1f68d Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:11:43 -0600 Subject: [PATCH 297/323] Reader fixed --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 6f1de13c1..da9a913b4 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -869,7 +869,7 @@ container.reix=Мэйнфрейм Rei-X container.rttyController=Контроллер редстоун-радио container.rtg=РИТЭГ-генератор container.rtgFurnace=РИТЭГ-печь -container.rttyReader=Редстоун-радио ридер +container.rttyReader=Редстоун-радио считыватель container.rttyCounter=Редстоун-радио счётчик предметов container.rttyLogic=Редстоун-радио логический приёмник container.rttyReceiver=Редстоун-радио приёмник @@ -6279,7 +6279,7 @@ tile.radio_torch_counter.name=Редстоун-радио счётчик пре tile.radio_torch_counter.desc=Ставится на плоские поверхности или совместимые компараторные блоки$Сигнал зависит от количества нужных предметов tile.radio_torch_logic.name=Редстоун-радио логический приёмник tile.radio_torch_logic.desc=Размещается на плоских поверхностях или совместимых с компаратором блоках$Сопоставляет сигналы красного камня с условиями, оцениваемыми в заданном порядке$Числовые или строковые входы сравниваются с константой -tile.radio_torch_reader.name=Редстоун-радио ридер +tile.radio_torch_reader.name=Редстоун-радио считыватель tile.radio_torch_reader.desc=Считывает значения из подключенных блоков,$а затем отправляет их с указанной частотой tile.radio_torch_receiver.name=Редстоун-радио приёмник tile.radio_torch_receiver.desc=Ставится на плоские поверхности или совместимые компараторные блоки From 518871bf2bc4900ce175f2d9fc2fb2ad7f4cba05 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:24:33 -0600 Subject: [PATCH 298/323] Polonium fix --- src/main/resources/assets/hbm/manual/material/polonium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index 985a382a3..22c8ddc26 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", - "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." + "ru_RU": "Радиоизотоп, получаемый переработкой нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий." } } From 61e10fe48fe4aaaf9a3d15a9182b16698659722c Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:25:05 -0600 Subject: [PATCH 299/323] I'm tired of fixing --- src/main/resources/assets/hbm/manual/material/radium.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index ad6c7ed8f..f841ea5aa 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", - "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен." } } From 7e87efcc489cf5a7ef28526caa51bf2f4163e4dd Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:44:22 -0600 Subject: [PATCH 300/323] QMAW --- .../resources/assets/hbm/manual/material/plutonium-241.json | 2 +- src/main/resources/assets/hbm/manual/material/plutonium.json | 2 +- src/main/resources/assets/hbm/manual/material/rubber.json | 2 +- src/main/resources/assets/hbm/manual/material/silicon.json | 2 +- src/main/resources/assets/hbm/manual/material/sodium.json | 2 +- src/main/resources/assets/hbm/manual/material/sulfur.json | 2 +- src/main/resources/assets/hbm/manual/material/tantalium.json | 2 +- src/main/resources/assets/hbm/manual/material/technetium.json | 2 +- src/main/resources/assets/hbm/manual/material/thorium.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 85c28ab7d..033808d58 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", - "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанного топлива [[РБМК|RBMK]], богатого [[плутонием-240|Plutonium-240]], а также из определенных видов [[циркониевого|Zirconium]] топлива быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанного топлива [[РБМК|RBMK]], богатого [[плутонием-240|Plutonium-240]], а также из определённых видов [[циркониевого|Zirconium]] топлива быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 7416907b7..ad7168886 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", - "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]" + "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определённых рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index bdc560004..66f8849fe 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", - "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах." + "ru_RU": "Продукт переработки нефти, получаемый из [[непредельных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах." } } diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index 2ff2706b0..1484af12f 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", - "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]]." + "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, кварц незера, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index 42a12db2d..57b38539f 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", - "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]]." + "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифугования|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]]." } } diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 6de200015..01e8864e8 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", - "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя." + "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жётлом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя." } } diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 7b68bd468..082342961 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", - "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." + "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одной определённой области мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб." } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index cc9e55a8f..dea678478 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", - "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен." + "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых видов топлива [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index 7032d8f14..43ebff79a 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", - "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен." + "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топливо, производное от тория, обычно экономично, но не очень мощное. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен." } } From a2a91d929adad81ceac845c53622f153c8e73ac6 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 12:47:43 -0600 Subject: [PATCH 301/323] QMAW again --- src/main/resources/assets/hbm/manual/material/uranium-233.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium-235.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index 93ac7e040..e659d193b 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", - "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащённое топливо из урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 7fd575367..253c53ed5 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", - "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." + "ru_RU": "Обогащённый уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index db712fba1..cbec7f769 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", - "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" + "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащён путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" } } From e062b4d2c38c2e24166cbf46436c8aa4feea0d4a Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 13:34:06 -0600 Subject: [PATCH 302/323] More manual fixes --- src/main/resources/assets/hbm/manual/material/uranium-238.json | 2 +- src/main/resources/assets/hbm/manual/material/uranium.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index 8594a63fa..196aed97c 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", - "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроуране|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." + "ru_RU": "Обеднённый уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроуране|Ferrouranium]], для [[боеприпасов с обеднённым ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных видов топлива. Виды топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен." } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index cbec7f769..72f5b29dd 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -8,6 +8,6 @@ }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", - "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащён путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" + "ru_RU": "Природный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащён путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать природный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]" } } From 742595c83f47b08772c8453372a6cd439ac8216d Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 13:35:25 -0600 Subject: [PATCH 303/323] I18n implementation for Meteorite Swords and Dusted Steel --- .../com/hbm/items/special/ItemHotDusted.java | 12 ++--- .../hbm/items/tool/ItemSwordMeteorite.java | 49 ++++++++++--------- src/main/resources/assets/hbm/lang/en_US.lang | 26 ++++++++++ 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/hbm/items/special/ItemHotDusted.java b/src/main/java/com/hbm/items/special/ItemHotDusted.java index 64cee05ca..7ddecbbbd 100644 --- a/src/main/java/com/hbm/items/special/ItemHotDusted.java +++ b/src/main/java/com/hbm/items/special/ItemHotDusted.java @@ -1,22 +1,20 @@ package com.hbm.items.special; - +import com.hbm.util.i18n.I18nUtil; import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; - public class ItemHotDusted extends ItemHot { - public ItemHotDusted(int heat) { super(heat); this.setHasSubtypes(true); } - + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add("Forged " + stack.getItemDamage() + " time(s)"); + list.add(I18nUtil.resolveKey("item.hot_dusted.forged") + " " + stack.getItemDamage() + " " + + I18nUtil.resolveKey("item.hot_dusted.times")); } - + public static int getMaxHeat(ItemStack stack) { return heat - stack.getItemDamage() * 10; } diff --git a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java index eefbae55d..933db145a 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.hbm.items.ModItems; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,63 +27,63 @@ public class ItemSwordMeteorite extends ItemSwordAbility { super.addInformation(stack, player, list, ext); if(this == ModItems.meteorite_sword) { - list.add(EnumChatFormatting.ITALIC + "Forged from a fallen star"); - list.add(EnumChatFormatting.ITALIC + "Sharper than most terrestrial blades"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.desc2")); } if(this == ModItems.meteorite_sword_seared) { - list.add(EnumChatFormatting.ITALIC + "Fire strengthens the blade"); - list.add(EnumChatFormatting.ITALIC + "Making it even more powerful"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.seared.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.seared.desc2")); } if(this == ModItems.meteorite_sword_reforged) { - list.add(EnumChatFormatting.ITALIC + "The sword has been reforged"); - list.add(EnumChatFormatting.ITALIC + "To rectify past imperfections"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.reforged.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.reforged.desc2")); } if(this == ModItems.meteorite_sword_hardened) { - list.add(EnumChatFormatting.ITALIC + "Extremely high pressure has been used"); - list.add(EnumChatFormatting.ITALIC + "To harden the blade further"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.hardened.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.hardened.desc2")); } if(this == ModItems.meteorite_sword_alloyed) { - list.add(EnumChatFormatting.ITALIC + "Cobalt fills the fissures"); - list.add(EnumChatFormatting.ITALIC + "Strengthening the sword"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.alloyed.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.alloyed.desc2")); } if(this == ModItems.meteorite_sword_machined) { - list.add(EnumChatFormatting.ITALIC + "Advanced machinery was used"); - list.add(EnumChatFormatting.ITALIC + "To refine the blade even more"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.machined.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.machined.desc2")); } if(this == ModItems.meteorite_sword_treated) { - list.add(EnumChatFormatting.ITALIC + "Chemicals have been applied"); - list.add(EnumChatFormatting.ITALIC + "Making the sword more powerful"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.treated.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.treated.desc2")); } if(this == ModItems.meteorite_sword_etched) { - list.add(EnumChatFormatting.ITALIC + "Acids clean the material"); - list.add(EnumChatFormatting.ITALIC + "To make this the perfect sword"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.etched.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.etched.desc2")); } if(this == ModItems.meteorite_sword_bred) { - list.add(EnumChatFormatting.ITALIC + "Immense heat and radiation"); - list.add(EnumChatFormatting.ITALIC + "Compress the material"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.bred.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.bred.desc2")); } if(this == ModItems.meteorite_sword_irradiated) { - list.add(EnumChatFormatting.ITALIC + "The power of the Atom"); - list.add(EnumChatFormatting.ITALIC + "Gives the sword might"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.irradiated.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.irradiated.desc2")); } if(this == ModItems.meteorite_sword_fused) { - list.add(EnumChatFormatting.ITALIC + "This blade has met"); - list.add(EnumChatFormatting.ITALIC + "With the forces of the stars"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.fused.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.fused.desc2")); } if(this == ModItems.meteorite_sword_baleful) { - list.add(EnumChatFormatting.ITALIC + "This sword has met temperatures"); - list.add(EnumChatFormatting.ITALIC + "Far beyond what normal material can endure"); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.baleful.desc1")); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.baleful.desc2")); } /* diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e0a543148..86896916f 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3183,6 +3183,8 @@ item.ingot_sr90.name=Strontium-90 Ingot item.ingot_starmetal.name=§9Starmetal Ingot§r item.ingot_steel.name=Steel Ingot item.ingot_steel_dusted.name=Dusted Steel Ingot +item.hot_dusted.forged=Forged +item.hot_dusted.times=time(s) item.ingot_tantalium.name=Tantalium Ingot item.ingot_tantalium.desc='Tantalum' item.ingot_tantalium.desc.P11=AKA Tantalum. @@ -3327,17 +3329,41 @@ item.mese_pickaxe.name=Mese Pickaxe item.meteor_charm.name=Meteor Charm item.meteor_remote.name=Meteorite Remote item.meteorite_sword.name=Meteorite Sword +item.meteorite_sword.desc1=Forged from a fallen star +item.meteorite_sword.desc2=Sharper than most terrestrial blades item.meteorite_sword_seared.name=Meteorite Sword (Seared) +item.meteorite_sword.seared.desc1=Fire strengthens the blade +item.meteorite_sword.seared.desc2=Making it even more powerful item.meteorite_sword_reforged.name=Meteorite Sword (Reforged) +item.meteorite_sword.reforged.desc1=The sword has been reforged +item.meteorite_sword.reforged.desc2=To rectify past imperfections item.meteorite_sword_hardened.name=Meteorite Sword (Hardened) +item.meteorite_sword.hardened.desc1=Extremely high pressure has been used +item.meteorite_sword.hardened.desc2=To harden the blade further item.meteorite_sword_alloyed.name=Meteorite Sword (Alloyed) +item.meteorite_sword.alloyed.desc1=Cobalt fills the fissures +item.meteorite_sword.alloyed.desc2=Strengthening the sword item.meteorite_sword_machined.name=Meteorite Sword (Machined) +item.meteorite_sword.machined.desc1=Advanced machinery was used +item.meteorite_sword.machined.desc2=To refine the blade even more item.meteorite_sword_treated.name=Meteorite Sword (Treated) +item.meteorite_sword.treated.desc1=Chemicals have been applied +item.meteorite_sword.treated.desc2=Making the sword more powerful item.meteorite_sword_etched.name=Meteorite Sword (Etched) +item.meteorite_sword.etched.desc1=Acids clean the material +item.meteorite_sword.etched.desc2=To make this the perfect sword item.meteorite_sword_bred.name=Meteorite Sword (Bred) +item.meteorite_sword.bred.desc1=Immense heat and radiation +item.meteorite_sword.bred.desc2=Compress the material item.meteorite_sword_irradiated.name=Meteorite Sword (Irradiated) +item.meteorite_sword.irradiated.desc1=The power of the Atom +item.meteorite_sword.irradiated.desc2=Gives the sword might item.meteorite_sword_fused.name=Meteorite Sword (Fused) +item.meteorite_sword.fused.desc1=This blade has met +item.meteorite_sword.fused.desc2=With the forces of the stars item.meteorite_sword_baleful.name=Meteorite Sword (Baleful) +item.meteorite_sword.baleful.desc1=This sword has met temperatures +item.meteorite_sword.baleful.desc2=Far beyond what normal material can endure item.mike_cooling_unit.name=Deuterium Cooling Unit item.mike_core.name=Uranium Coated Deuterium Tank item.mike_deut.name=Deuterium Tank From fcabf659af9d11643ca501bc891bfbc83a19ad6b Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 13:42:17 -0600 Subject: [PATCH 304/323] To be translated --- src/main/resources/assets/hbm/lang/ru_RU.lang | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index da9a913b4..e22069166 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -3589,18 +3589,43 @@ item.mese_axe.name=Месе топор item.mese_pickaxe.name=Месе кирка item.meteor_charm.name=Талисман от метеоритов item.meteor_remote.name=Устройство для вызова метеоритов + item.meteorite_sword.name=Метеоритовый меч +item.meteorite_sword.desc1=Forged from a fallen star +item.meteorite_sword.desc2=Sharper than most terrestrial blades item.meteorite_sword_seared.name=Метеоритовый меч (Опаленный) +item.meteorite_sword.seared.desc1=Fire strengthens the blade +item.meteorite_sword.seared.desc2=Making it even more powerful item.meteorite_sword_reforged.name=Метеоритовый меч (Перекованный) +item.meteorite_sword.reforged.desc1=The sword has been reforged +item.meteorite_sword.reforged.desc2=To rectify past imperfections item.meteorite_sword_hardened.name=Метеоритовый меч (Закалённый) +item.meteorite_sword.hardened.desc1=Extremely high pressure has been used +item.meteorite_sword.hardened.desc2=To harden the blade further item.meteorite_sword_alloyed.name=Метеоритовый меч (Легированный) +item.meteorite_sword.alloyed.desc1=Cobalt fills the fissures +item.meteorite_sword.alloyed.desc2=Strengthening the sword item.meteorite_sword_machined.name=Метеоритовый меч (Механически обработанный) +item.meteorite_sword.machined.desc1=Advanced machinery was used +item.meteorite_sword.machined.desc2=To refine the blade even more item.meteorite_sword_treated.name=Метеоритовый меч (Обработанный) +item.meteorite_sword.treated.desc1=Chemicals have been applied +item.meteorite_sword.treated.desc2=Making the sword more powerful item.meteorite_sword_etched.name=Метеоритовый меч (Гравированный) +item.meteorite_sword.etched.desc1=Acids clean the material +item.meteorite_sword.etched.desc2=To make this the perfect sword item.meteorite_sword_bred.name=Метеоритовый меч (Разведённый) +item.meteorite_sword.bred.desc1=Immense heat and radiation +item.meteorite_sword.bred.desc2=Compress the material item.meteorite_sword_irradiated.name=Метеоритовый меч (Облучённый) +item.meteorite_sword.irradiated.desc1=The power of the Atom +item.meteorite_sword.irradiated.desc2=Gives the sword might item.meteorite_sword_fused.name=Метеоритовый меч (Сплавленный) +item.meteorite_sword.fused.desc1=This blade has met +item.meteorite_sword.fused.desc2=With the forces of the stars item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) +item.meteorite_sword.baleful.desc1=This sword has met temperatures +item.meteorite_sword.baleful.desc2=Far beyond what normal material can endure item.mike_cooling_unit.name=Блок охлаждения дейтерия item.mike_core.name=Дейтериевый бак с урановым покрытием item.mike_deut.name=Дейтериевый бак @@ -6671,3 +6696,7 @@ general.na=Н/Д error.generic=### Я ОШИБКА ### // Last updated 24.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // + +# Hot Dusted Item +item.hot_dusted.forged=Кован +item.hot_dusted.times=раз(а) From 6ed83ab7ec8235e8f9223f128c518f6a53807ad2 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 14:13:45 -0600 Subject: [PATCH 305/323] Updated swords translations --- src/main/resources/assets/hbm/lang/ru_RU.lang | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index e22069166..906974c2e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -3591,41 +3591,41 @@ item.meteor_charm.name=Талисман от метеоритов item.meteor_remote.name=Устройство для вызова метеоритов item.meteorite_sword.name=Метеоритовый меч -item.meteorite_sword.desc1=Forged from a fallen star -item.meteorite_sword.desc2=Sharper than most terrestrial blades -item.meteorite_sword_seared.name=Метеоритовый меч (Опаленный) -item.meteorite_sword.seared.desc1=Fire strengthens the blade -item.meteorite_sword.seared.desc2=Making it even more powerful +item.meteorite_sword.desc1=Выкован из павшей звезды +item.meteorite_sword.desc2=Острее, чем большинство земных лезвий +item.meteorite_sword_seared.name=Метеоритовый меч (Опалённый) +item.meteorite_sword.seared.desc1=Огонь укрепляет клинок, +item.meteorite_sword.seared.desc2=Делая его даже ещё мощнее item.meteorite_sword_reforged.name=Метеоритовый меч (Перекованный) -item.meteorite_sword.reforged.desc1=The sword has been reforged -item.meteorite_sword.reforged.desc2=To rectify past imperfections +item.meteorite_sword.reforged.desc1=Меч был перекован, +item.meteorite_sword.reforged.desc2=Чтобы искоренить прошлые недостатки item.meteorite_sword_hardened.name=Метеоритовый меч (Закалённый) -item.meteorite_sword.hardened.desc1=Extremely high pressure has been used -item.meteorite_sword.hardened.desc2=To harden the blade further +item.meteorite_sword.hardened.desc1=Экстремально высокое давление использовано, +item.meteorite_sword.hardened.desc2=Чтобы закаливать этот меч дальше item.meteorite_sword_alloyed.name=Метеоритовый меч (Легированный) -item.meteorite_sword.alloyed.desc1=Cobalt fills the fissures -item.meteorite_sword.alloyed.desc2=Strengthening the sword +item.meteorite_sword.alloyed.desc1=Кобальт заполняет трещины, +item.meteorite_sword.alloyed.desc2=Упрочняя меч item.meteorite_sword_machined.name=Метеоритовый меч (Механически обработанный) -item.meteorite_sword.machined.desc1=Advanced machinery was used -item.meteorite_sword.machined.desc2=To refine the blade even more +item.meteorite_sword.machined.desc1=Было использовано передовое оборудование, +item.meteorite_sword.machined.desc2=Чтобы еще больше усовершенствовать лезвие item.meteorite_sword_treated.name=Метеоритовый меч (Обработанный) -item.meteorite_sword.treated.desc1=Chemicals have been applied -item.meteorite_sword.treated.desc2=Making the sword more powerful +item.meteorite_sword.treated.desc1=Были применены химикаты, +item.meteorite_sword.treated.desc2=Делающие меч мощнее item.meteorite_sword_etched.name=Метеоритовый меч (Гравированный) -item.meteorite_sword.etched.desc1=Acids clean the material -item.meteorite_sword.etched.desc2=To make this the perfect sword +item.meteorite_sword.etched.desc1=Кислоты очищают материал, +item.meteorite_sword.etched.desc2=Чтобы получить этот идеальный меч item.meteorite_sword_bred.name=Метеоритовый меч (Разведённый) -item.meteorite_sword.bred.desc1=Immense heat and radiation -item.meteorite_sword.bred.desc2=Compress the material +item.meteorite_sword.bred.desc1=Огромные количества тепла и радиации +item.meteorite_sword.bred.desc2=Сжимают материал item.meteorite_sword_irradiated.name=Метеоритовый меч (Облучённый) -item.meteorite_sword.irradiated.desc1=The power of the Atom -item.meteorite_sword.irradiated.desc2=Gives the sword might +item.meteorite_sword.irradiated.desc1=Сила Атома +item.meteorite_sword.irradiated.desc2=Придает мечу мощи item.meteorite_sword_fused.name=Метеоритовый меч (Сплавленный) -item.meteorite_sword.fused.desc1=This blade has met -item.meteorite_sword.fused.desc2=With the forces of the stars +item.meteorite_sword.fused.desc1=Этот клинок встретился +item.meteorite_sword.fused.desc2=С силами звёзд item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) -item.meteorite_sword.baleful.desc1=This sword has met temperatures -item.meteorite_sword.baleful.desc2=Far beyond what normal material can endure +item.meteorite_sword.baleful.desc1=Этот меч встретил температуры +item.meteorite_sword.baleful.desc2=Гораздо большие, чем обычный материал может выдержать item.mike_cooling_unit.name=Блок охлаждения дейтерия item.mike_core.name=Дейтериевый бак с урановым покрытием item.mike_deut.name=Дейтериевый бак From 23669e6337c7bd82a1d8f4eea4123938e6de3d02 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 15:14:30 -0600 Subject: [PATCH 306/323] YES, MY QMAW (used python for this) --- .../resources/assets/hbm/manual/material/alloy.json | 12 ++++++------ .../assets/hbm/manual/material/aluminium.json | 10 +++++----- .../assets/hbm/manual/material/arsenic.json | 8 ++++---- .../assets/hbm/manual/material/arsenic_bronze.json | 8 ++++---- .../assets/hbm/manual/material/bakelite.json | 8 ++++---- .../assets/hbm/manual/material/bismuth.json | 10 +++++----- .../assets/hbm/manual/material/bismuth_bronze.json | 10 +++++----- .../resources/assets/hbm/manual/material/bscco.json | 10 +++++----- .../assets/hbm/manual/material/cadmium.json | 8 ++++---- .../assets/hbm/manual/material/cadmium_steel.json | 8 ++++---- .../assets/hbm/manual/material/cinnabar.json | 10 +++++----- .../resources/assets/hbm/manual/material/coke.json | 8 ++++---- .../resources/assets/hbm/manual/material/copper.json | 10 +++++----- .../resources/assets/hbm/manual/material/desh.json | 10 +++++----- .../assets/hbm/manual/material/ferrouranium.json | 10 +++++----- .../assets/hbm/manual/material/graphite.json | 8 ++++---- .../assets/hbm/manual/material/gunmetal.json | 8 ++++---- .../resources/assets/hbm/manual/material/hss.json | 8 ++++---- .../resources/assets/hbm/manual/material/latex.json | 8 ++++---- .../resources/assets/hbm/manual/material/lead.json | 10 +++++----- .../assets/hbm/manual/material/mingrade.json | 10 +++++----- .../assets/hbm/manual/material/neptunium.json | 10 +++++----- .../assets/hbm/manual/material/plutonium-238.json | 10 +++++----- .../assets/hbm/manual/material/plutonium-239.json | 10 +++++----- .../assets/hbm/manual/material/plutonium-240.json | 12 ++++++------ .../assets/hbm/manual/material/plutonium-241.json | 10 +++++----- .../assets/hbm/manual/material/plutonium-rg.json | 8 ++++---- .../assets/hbm/manual/material/plutonium.json | 10 +++++----- .../assets/hbm/manual/material/polonium.json | 10 +++++----- .../assets/hbm/manual/material/polymer.json | 8 ++++---- .../resources/assets/hbm/manual/material/radium.json | 10 +++++----- .../resources/assets/hbm/manual/material/rubber.json | 10 +++++----- .../assets/hbm/manual/material/silicon.json | 10 +++++----- .../resources/assets/hbm/manual/material/sodium.json | 10 +++++----- .../resources/assets/hbm/manual/material/steel.json | 8 ++++---- .../resources/assets/hbm/manual/material/sulfur.json | 10 +++++----- .../assets/hbm/manual/material/tantalium.json | 10 +++++----- .../assets/hbm/manual/material/technetium.json | 10 +++++----- .../assets/hbm/manual/material/technetium_steel.json | 8 ++++---- .../assets/hbm/manual/material/thorium.json | 10 +++++----- .../assets/hbm/manual/material/uranium-233.json | 10 +++++----- .../assets/hbm/manual/material/uranium-235.json | 10 +++++----- .../assets/hbm/manual/material/uranium-238.json | 10 +++++----- .../assets/hbm/manual/material/uranium.json | 10 +++++----- .../assets/hbm/manual/material/weaponsteel.json | 8 ++++---- 45 files changed, 212 insertions(+), 212 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json index f82cac205..fc37bc84e 100644 --- a/src/main/resources/assets/hbm/manual/material/alloy.json +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -1,13 +1,13 @@ { "name": "Advanced Alloy", "icon": ["hbm:item.ingot_advanced_alloy", 1, 0], - "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], - "title": { - "en_US": "Advanced Alloy", + "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], + "title": { + "en_US": "Advanced Alloy", "uk_UA": "Удосконалений сплав", - "ru_ru": "Продвинутый сплав", - "zh_CN": "高级合金" - }, + "zh_CN": "高级合金", + "ru_RU": "Продвинутый сплав" + }, "content": { "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", "uk_UA": "Виготовлено в [[доменній печі|Blast Furnace]] зі [[сталі|Steel]] та [[червоної міді|Minecraft Grade Copper]]. З нього робиться спорядження краще за алмазне. Також використовується в деяких потужних магнітах для [[термоядерного реактору|Fusion Reactor]] та [[камери опромінювання|Exposure Chamber]].", diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json index 482872e9e..8a8af90d9 100644 --- a/src/main/resources/assets/hbm/manual/material/aluminium.json +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -1,17 +1,17 @@ { "name": "Aluminium", "icon": ["hbm:item.ingot_aluminium", 1, 0], - "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], - "title": { - "en_US": "Aluminium", + "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], + "title": { + "en_US": "Aluminium", "uk_UA": "Алюміній", "ru_RU": "Алюминий", "zh_CN": "铝" - }, + }, "content": { "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", "uk_UA": "Звичайний, легкий метал. Доступний на ранніх стадіях шляхом плавлення кріоліту ('алюмінієвої руди') у [[коксовій печі|Combination Oven]]. Може бути отриманий пізніше шляхом обробки [[бокситів|Bauxite]], та [[електролізу|Electrolysis Machine]] отриманого розчину оксиду алюмінію.

Використовується в трубопроводах, загальній роботі з рідинами, як компонент [[гарматної бронзи|Gunmetal]] та фюзеляжів ракет.", - "ru_RU": "Обычный, легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет.", + "ru_RU": "Распространённый легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет.", "zh_CN": "常见的轻质金属,在早期可使用[[复式炼焦炉|Combination Oven]]冶炼冰晶石(含铝矿石)来得到铝。后期可通过加工[[铝土矿|Bauxite]],后使用[[电解机|Electrolysis Machine]]处理氧化铝溶液得到。

用于制作管道,一般流体储存,制作[[炮铜|Gunmetal]]和导弹弹体。" } } diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json index 0672fe16b..eee027fb1 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -1,13 +1,13 @@ { "name": "Arsenic", "icon": ["hbm:item.ingot_arsenic", 1, 0], - "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], - "title": { - "en_US": "Arsenic", + "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], + "title": { + "en_US": "Arsenic", "uk_UA": "Миш'як", "ru_RU": "Мышьяк", "zh_CN": "砷" - }, + }, "content": { "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", "uk_UA": "Отримується шляхом обробки нафтових відходів [[високоефективним розчинником|High-Performance Solvent]] в [[рудному окислювачі|Ore Acidizer]]. Нафтові відходи утворюються [[подрібненням|Shredder]] забруднених блоків, утворених [[вежею гідророзриву|Hydraulic Fracking Tower]]. В основному використовується як [[миш'якова бронза|Arsenic Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json index 276d30ecb..eaec58dcb 100644 --- a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -1,13 +1,13 @@ { "name": "Arsenic Bronze", "icon": ["hbm:item.ingot_arsenic_bronze", 1, 0], - "trigger": [["hbm:item.ingot_arsenic_bronze"]], - "title": { - "en_US": "Arsenic Bronze", + "trigger": [["hbm:item.ingot_arsenic_bronze"]], + "title": { + "en_US": "Arsenic Bronze", "uk_UA": "Миш'якова бронза", "ru_RU": "Мышьяковая бронза", "zh_CN": "砷青铜" - }, + }, "content": { "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", "uk_UA": "Похідна від [[миш'яку|Arsenic]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]] через необхідність у [[високоефективному розчиннику|High-Performance Solvent]].

Повністю взаємозамінна з [[вісмутовою бронзою|Bismuth Bronze]].", diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json index 256c49e4a..2d7a05db9 100644 --- a/src/main/resources/assets/hbm/manual/material/bakelite.json +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -1,13 +1,13 @@ { "name": "Bakelite", "icon": ["hbm:item.ingot_bakelite", 1, 0], - "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], - "title": { - "en_US": "Bakelite", + "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], + "title": { + "en_US": "Bakelite", "uk_UA": "Карболіт", "ru_RU": "Бакелит", "zh_CN": "电木" - }, + }, "content": { "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", "uk_UA": "Карболіт (радянська назва бакеліту) — альтернатива [[полімеру|Polymer]], виготовлений з [[ароматичних вуглеводнів|Aromatic Hydrocarbons]], отриманих з [[продуктів крекінгу нафти|Catalytic Cracking Tower]]. Повністю взаємозамінний у всіх рецептах.", diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json index 83ddb2af5..40d513ca7 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -1,17 +1,17 @@ { "name": "Bismuth", "icon": ["hbm:item.ingot_bismuth", 1, 0], - "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], - "title": { - "en_US": "Bismuth", + "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], + "title": { + "en_US": "Bismuth", "uk_UA": "Вісмут", "ru_RU": "Висмут", "zh_CN": "铋" - }, + }, "content": { "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", "uk_UA": "Важкий метал, початково який можна отримати у результаті переробки відпрацьованого палива [[РБМК|RBMK]] в [[SILEX]], також може бути отриманий на пізнішій стадії переробки корінної руди з використанням [[високоефективного розчинника|High-Performance Solvent]]. Переважно використовуюється як [[вісмутова бронза|Bismuth Bronze]].", - "ru_RU": "Тяжелый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен из поздних стадий обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовай бронзы|Bismuth Bronze]].", + "ru_RU": "Тяжёлый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен в поздние стадии обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовой бронзы|Bismuth Bronze]].", "zh_CN": "一种重金属,最初可使用[[SILEX]]回收枯竭的[[RBMK]]燃料获取,之后也可在基岩矿石处理的后期步骤中,使用[[高性能溶剂|Hing-Performance Solvent]]处理矿石获取。主要用于制作[[铋青铜|Bismuth Bronze]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json index 087dc41a3..a2d5eb72d 100644 --- a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -1,17 +1,17 @@ { "name": "Bismuth Bronze", "icon": ["hbm:item.ingot_bismuth_bronze", 1, 0], - "trigger": [["hbm:item.ingot_bismuth_bronze"]], - "title": { - "en_US": "Bismuth Bronze", + "trigger": [["hbm:item.ingot_bismuth_bronze"]], + "title": { + "en_US": "Bismuth Bronze", "uk_UA": "Вісмутова бронза", "ru_RU": "Висмутовая бронза", "zh_CN": "铋青铜" - }, + }, "content": { "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", "uk_UA": "Похідна від [[вісмуту|Bismuth]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]]br>
Повністю взаємозамінна з [[миш'яковою бронзою|Arsenic Bronze]].", - "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяемо с [[мышьяковой бронзой|Arsenic Bronze]].", + "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяема с [[мышьяковой бронзой|Arsenic Bronze]].", "zh_CN": "使用[[铋|Bismuth]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造[[RBMK]]之后获得。

和[[砷青铜|Arsenic Bronze]]完全通用。" } } diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json index dcf3cea68..562b4789d 100644 --- a/src/main/resources/assets/hbm/manual/material/bscco.json +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -1,17 +1,17 @@ { "name": "BSCCO", "icon": ["hbm:item.ingot_bscco", 1, 0], - "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], - "title": { - "en_US": "BSCCO", + "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], + "title": { + "en_US": "BSCCO", "uk_UA": "Вісмут стронцій кальцій мідь оксид (BSCCO)", "ru_RU": "BSCCO", "zh_CN": "BSCCO超导体" - }, + }, "content": { "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", "uk_UA": "Потужний надпровідник, що використовується у високоякісних платах та котушках для [[прискорювача часток|Particle Accelerator]]. Потребує [[вісмут|Bismuth]], і тому доступний лише після побудови [[РБМК|RBMK]].", - "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмута|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]].", + "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмут|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]].", "zh_CN": "强力的超导体,用于制作高等级的电路及用于[[粒子加速器|Particle Accelerator]]的线圈。需要[[铋|Bismuth]]制作,因此只能在建造[[RBMK]]后获得。" } } diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json index 1984736aa..10b34e06e 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -1,13 +1,13 @@ { "name": "Cadmium", "icon": ["hbm:item.ingot_cadmium", 1, 0], - "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], - "title": { - "en_US": "Cadmium", + "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], + "title": { + "en_US": "Cadmium", "uk_UA": "Кадмій", "ru_RU": "Кадмий", "zh_CN": "镉" - }, + }, "content": { "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", "uk_UA": "Виготовляється шляхом обробки листя гірчичної верби [[високоефективним розчинником|High-Performance Solvent]]. Використовується у [[полівінілхлориді|PVC]], пізньому альтернативному рецепті для [[гуми|Rubber]] та для [[кадмієвої сталі|Cadmium Steel]], яка виступає як замінник [[технецієвої сталі|Technetium Steel]].", diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json index d40670596..776a3dc5e 100644 --- a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -1,13 +1,13 @@ { "name": "Cadmium Steel", "icon": ["hbm:item.ingot_cdalloy", 1, 0], - "trigger": [["hbm:item.ingot_cdalloy"]], - "title": { - "en_US": "Cadmium Steel", + "trigger": [["hbm:item.ingot_cdalloy"]], + "title": { + "en_US": "Cadmium Steel", "uk_UA": "Кадмієва сталь", "ru_RU": "Кадмиевая сталь", "zh_CN": "镉钢" - }, + }, "content": { "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", "uk_UA": "Корозійностійкий сплав, виготовлений зі [[сталі|Steel]] та [[кадмію|Cadmium]]. Альтернатива [[технецієвій сталі|Technetium Steel]] в більшості рецептів.", diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json index f7949487b..75596122a 100644 --- a/src/main/resources/assets/hbm/manual/material/cinnabar.json +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -1,17 +1,17 @@ { "name": "Cinnabar", "icon": ["hbm:item.cinnebar", 1, 0], - "trigger": [["hbm:item.cinnebar"]], - "title": { - "en_US": "Cinnabar", + "trigger": [["hbm:item.cinnebar"]], + "title": { + "en_US": "Cinnabar", "uk_UA": "Кіновар", "ru_RU": "Киноварь", "zh_CN": "朱砂" - }, + }, "content": { "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", "uk_UA": "Рідкісна руда. Може бути [[окислена|Ore Acidizer]] в 375mB [[ртуті|Mercury]] (3 краплі ртуті), або виплавлена у [[коксовій печі|Combination Oven]] в 100mB ртуті та трохи сірки. Здебільшого використовується як ранній спосіб отримання ртуті для виробництва [[деш|Desh]].", - "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деша|Desh]].", + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деш|Desh]].", "zh_CN": "稀有矿物,可[[酸化|Ore Acidizer]]为相当于375mB流体的[[水银|Mercury]]液滴,也可[[炼焦|Combination Oven]]为100mB水银和一个硫粉。其主要作为获取生产[[Desh]]需要的水银的早期手段。" } } diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json index a388628b0..d5ff23cef 100644 --- a/src/main/resources/assets/hbm/manual/material/coke.json +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -1,13 +1,13 @@ { "name": "Coke", "icon": ["hbm:item.coke", 1, 0], - "trigger": [["hbm:item.coke", 1, 32767]], - "title": { - "en_US": "Coke", + "trigger": [["hbm:item.coke", 1, 32767]], + "title": { + "en_US": "Coke", "uk_UA": "Кокс", "ru_RU": "Кокс", "zh_CN": "焦炭" - }, + }, "content": { "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", "uk_UA": "Високочистий вуглець, має вдвічі вищу горючість, ніж вугілля. Може бути зпресований у [[графіт|Graphite]], використовується у різних рецептах [[сталі|Steel]] або як джерело вуглецю для [[ливарні|Crucible]].

Вугільний кокс можна виготовляти шляхом обсмаження вугільних брикетів або коксування вугілля в різних його формах.

Буровугільний кокс виготовляється з набагато дешевшого та менш потужного бурого вугілля майже таким самим способом, незважаючи на це, він має ті ж характеристики.

Нафтовий кокс виготовляється або з невугільних смол у [[коксовій печі|Combination Oven]], або шляхом коксування різних видів нафтопродуктів у [[коксовій установці|Coking Unit]].", diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index f23c45460..8142651c4 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -1,17 +1,17 @@ { "name": "Copper", "icon": ["hbm:item.ingot_copper", 1, 0], - "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], - "title": { - "en_US": "Copper", + "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], + "title": { + "en_US": "Copper", "uk_UA": "Мідь", "ru_RU": "Медь", "zh_CN": "铜" - }, + }, "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", - "ru_RU": "Обычный ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]].", + "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]].", "zh_CN": "常见资源。纯铜主要用作结构材料,或在能够承受高温的设备中使用(作热导体); 铜的多种合金用途极广。

[[紫铜|Minecraft Grade Copper]]是红石和铜的合金,几乎所有电力设备都使用紫铜。

[[高级合金|Advanced Alloy]]是前期强力的装备材料,其性能优于钻石。

[[炮铜|Gunmetal]]是制作多种枪炮必不可少的材料,同时也用于制造弹壳。

[[铋青铜|Bismuth Bronze]]和[[砷青铜|Arsenic Bronze]]是 [[RBMK]] 后的材料,用于制作多种后期机器。

[[BSCCO]]是一种由铋衍生的超导体,高等级的量子电路和[[粒子加速器|Particle Accelerator]]线圈都需要BSCCO超导体制作。" } } diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json index 06a1c2e08..1b21e5ce7 100644 --- a/src/main/resources/assets/hbm/manual/material/desh.json +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -1,17 +1,17 @@ { "name": "Desh", "icon": ["hbm:item.ingot_desh", 1, 0], - "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], - "title": { - "en_US": "Desh", + "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], + "title": { + "en_US": "Desh", "uk_UA": "Деш", "ru_RU": "Деш", "zh_CN": "Desh" - }, + }, "content": { "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", "uk_UA": "Високоміцний робочий сплав, виготовлений на [[хімічному заводі|Chemical Plant]]. Потребує [[легку нафту|Light oil]] з базової переробки [[нафти|Crude Oil]], [[ртуть|Mercury]], побічний продукт [[[центрифугування|Centrifuge]] редстоунової руди та деш суміш, яка є просто [[подрібненими|Shredder]] шматками рідкоземельної руди.

Використовується в різних речах, особливо в інструментах та зброї. Деш інструменти повільні та відповідають лише залізному тіру, але є першими доступними незламними інструментами з багатьма режимами роботи.", - "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[легкой нефти|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртути|Mercury]], побочного продукта [[центрифугирования|Centrifuge]] красной руды, и смеси деша, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деша медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.", + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[лёгкую нефть|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртуть|Mercury]], побочный продукт [[центрифугирования|Centrifuge]] красной руды, и смесь деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деш медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.", "zh_CN": "在[[化工厂|Chemical Plant]]中制成的高强度工作合金,需要基础[[原油|Crude Oil]]精炼的产物[[轻油|Light Oil]]、[[离心|Centrifuge]]红石矿石得到的副产物[[水银|Mercury]]以及[[粉碎|Shredder]]稀土矿石块得到的Desh混合物制作。

用于制作多种物品,特别是工具和武器。Desh制工具挖掘速度较慢且挖掘等级 只相当于铁制工具,但其是最早可获得的无法破坏的工具之一,而且具有多个工具 能力。" } } diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 3baed1083..4d46f1c36 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -1,17 +1,17 @@ { "name": "Ferrouranium", "icon": ["hbm:item.ingot_ferrouranium", 1, 0], - "trigger": [["hbm:item.ingot_ferrouranium"]], - "title": { - "en_US": "Ferrouranium", + "trigger": [["hbm:item.ingot_ferrouranium"]], + "title": { + "en_US": "Ferrouranium", "uk_UA": "Фероуран", "ru_RU": "Ферроуран", "zh_CN": "铀铁合金" - }, + }, "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", "uk_UA": "Сплав [[сталі|Steel]] та [[урану-238|Uranium-238]], виготовлений у [[ливарні|Crucible]]. В основному використовується в уранобетоні, деталях зброї та вибухових боєприпасах.", - "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[тигле|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах.", + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[плавильне|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах.", "zh_CN": "[[钢|Steel]]与[[铀-238|Uranium-238]]的合金,在坩埚中制成。 主要用于制作贫铀混凝土、武器部件和高爆弹药。" } } diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json index 5ac4bc20f..eb0be35b5 100644 --- a/src/main/resources/assets/hbm/manual/material/graphite.json +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -1,13 +1,13 @@ { "name": "Graphite", "icon": ["hbm:item.ingot_graphite", 1, 0], - "trigger": [["hbm:item.ingot_graphite"]], - "title": { - "en_US": "Graphite", + "trigger": [["hbm:item.ingot_graphite"]], + "title": { + "en_US": "Graphite", "uk_UA": "Графіт", "ru_RU": "Графит", "zh_CN": "石墨" - }, + }, "content": { "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", "uk_UA": "Виготовляється пресуванням коксу. Використовується в ядерних реакторах, графітових електродах для [[електричної дугової печі|Electric Arc Furnace]] або як джерело вуглецю в різних рецептах [[ливарні|Crucible]].", diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json index 119797202..78ac96aaa 100644 --- a/src/main/resources/assets/hbm/manual/material/gunmetal.json +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -1,13 +1,13 @@ { "name": "Gunmetal", "icon": ["hbm:item.ingot_gunmetal", 1, 0], - "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], - "title": { - "en_US": "Gunmetal", + "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], + "title": { + "en_US": "Gunmetal", "uk_UA": "Гарматна бронза", "ru_RU": "Оружейный металл", "zh_CN": "炮铜" - }, + }, "content": { "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", "uk_UA": "Сплав [[алюмінію|Aluminium]] та [[міді|Copper]]. Може бути виготовлений на ковадлі або, що ефективніше, у [[роторній печі|Rotary Furnace]]. Використовується переважно для деталей зброї, а також для гільз більшості боєприпасів.", diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json index 956ee73b1..5e31bd555 100644 --- a/src/main/resources/assets/hbm/manual/material/hss.json +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -1,13 +1,13 @@ { "name": "High-Speed Steel", "icon": ["hbm:item.ingot_dura_steel", 1, 0], - "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], - "title": { - "en_US": "High-Speed Steel", + "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], + "title": { + "en_US": "High-Speed Steel", "uk_UA": "Швидкорізальна сталь", "ru_RU": "Высокоскоростная сталь", "zh_CN": "高速钢" - }, + }, "content": { "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", "uk_UA": "Сплав зі [[сталі|Steel]], [[вольфраму|Tungsten]] та [[кобальту|Cobalt]], виготовлений в [[ливарні|Crucible]]. Створюється у вигляді рідкого металу, перед використанням його необхідно відлити у форму зливка або пластини.

Використовується для виготовлення різального обладнання що працює на великих швидкостях.", diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json index ac1ef6212..a00bcfee7 100644 --- a/src/main/resources/assets/hbm/manual/material/latex.json +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -1,13 +1,13 @@ { "name": "Latex", "icon": ["hbm:item.ingot_biorubber", 1, 0], - "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], - "title": { - "en_US": "Latex", + "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], + "title": { + "en_US": "Latex", "uk_UA": "Латекс", "ru_RU": "Латекс", "zh_CN": "乳胶" - }, + }, "content": { "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", "uk_UA": "Натуральна форма гуми, яку можна отримати з кульбаб або пресуванням тропічного дерева. У всіх рецептах може бути замінена на [[гуму|Rubber]], але не навпаки.", diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json index 388735583..629b2d00a 100644 --- a/src/main/resources/assets/hbm/manual/material/lead.json +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -1,17 +1,17 @@ { "name": "Lead", "icon": ["hbm:item.ingot_lead", 1, 0], - "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], - "title": { - "en_US": "Lead", + "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], + "title": { + "en_US": "Lead", "uk_UA": "Свинець", "ru_RU": "Свинец", "zh_CN": "铅" - }, + }, "content": { "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", "uk_UA": "Поширений ресурс. В основному використовується для речей, пов'язаних з радіацією, та для боєприпасів, а також як припій для багатьох схем.", - "ru_RU": "Обычный ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем.", + "ru_RU": "Распространённый ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем.", "zh_CN": "常见资源,主要用于涉及辐射的设备,也用于制作弹药,以及用作电路板的焊料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json index f94cd9c2d..92137c7f0 100644 --- a/src/main/resources/assets/hbm/manual/material/mingrade.json +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -1,13 +1,13 @@ { "name": "Minecraft Grade Copper", "icon": ["hbm:item.ingot_red_copper", 1, 0], - "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], - "title": { - "en_US": "Minecraft Grade Copper (Red Copper)", + "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], + "title": { + "en_US": "Minecraft Grade Copper (Red Copper)", "uk_UA": "Червона мідь (aka Minecraft Grade Copper)", - "ru_RU": "Медь Minecraft (Красная медь)", + "ru_RU": "Красная медь", "zh_CN": "紫铜" - }, + }, "content": { "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", "uk_UA": "Сплав, виготовлений з [[міді|Copper]] та редстоуну в рівному співвідношенні в [[доменній печі|Blast Furnace]]. Використовується майже у всій електриці, зазвичай у вигляді дроту.", diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json index 464241f76..0e3b80a58 100644 --- a/src/main/resources/assets/hbm/manual/material/neptunium.json +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -1,17 +1,17 @@ { "name": "Neptunium", "icon": ["hbm:item.ingot_neptunium", 1, 0], - "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], - "title": { - "en_US": "Neptunium", + "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], + "title": { + "en_US": "Neptunium", "uk_UA": "Нептуній-237", "ru_RU": "Нептуний", "zh_CN": "镎" - }, + }, "content": { "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", "uk_UA": "Ізотоп здатний до розщеплення, зазвичай міститься у відпрацьованому паливі [[урану-235|Uranium-235]]. Здебільшого використовується для ядерних реакторів у чистому вигляді як високозбагачене нептунієве паливо або в поєднанні з [[ураном-238|Uranium-238]] як середньозбагачене нептунієве паливо. Використовується в [[ВВЕР|PWR]] та [[РБМК|RBMK]].", - "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]].", + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе из [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]].", "zh_CN": "一种易裂变同位素,主要存在于枯竭的[[铀-235|Uranium-235]]燃料中。 主要用于核反应堆,纯净的镎既可直接用作高浓缩度镎燃料,也可和[[铀-238|Uranium-238]]混合为中浓缩度镎燃料。可用于[[PWR]]和[[RBMK]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json index 4fee0f32a..9d2330fdf 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-238.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -1,17 +1,17 @@ { "name": "Plutonium-238", "icon": ["hbm:item.billet_pu238", 1, 0], - "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], - "title": { - "en_US": "Plutonium-238", + "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], + "title": { + "en_US": "Plutonium-238", "uk_UA": "Плутоній-238", "ru_RU": "Плутоний-238", "zh_CN": "钚-238" - }, + }, "content": { "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", "uk_UA": "Радіоізотоп, що використовується переважно в [[РІТЕГ|RTG]]. Отримується з гексафториду [[плутонію|Plutonium]], або з різного ядерного палива, переважно того, що використовує [[уран-235|Uranium-235]]. Використовується з [[берилієм|Beryllium]] як Плутоній-238 берилієве джерело нейтронів в [[РБМК|RBMK]].

Помірно радіоактивний, дуже гарячий.", - "ru_RU": "Радиоизотоп, в основном используется в [[РТГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Плутоний-210-Бериллий для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий.", + "ru_RU": "Радиоизотоп, в основном используется в [[РИТЭГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках плутоний-210-бериллевых источниках для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий.", "zh_CN": "放射性同位素,主要用于[[RTG]]。可从六氟化[[钚|Plutonium]]中提取,也可从一些核燃料(主要是含[[铀-235|Uranium-235]]的种类)中分离得到。可与[[铍|Beryllium]]混合制成钚-238-铍中子源,用于[[RBMK]]反应堆。

放射性中等,高温。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json index 8237af3ed..1a80f4cbc 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-239.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -1,17 +1,17 @@ { "name": "Plutonium-239", "icon": ["hbm:item.billet_pu239", 1, 0], - "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], - "title": { - "en_US": "Plutonium-239", + "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], + "title": { + "en_US": "Plutonium-239", "uk_UA": "Плутоній-239", "ru_RU": "Плутоний-239", "zh_CN": "钚-239" - }, + }, "content": { "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", "uk_UA": "Перший здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути отриманий з багатьох видів відпрацьованого палива, що використовують [[уран-238|Uranium-238]] бо безпосередньо з [[реакторного плутонію|Reactor-Grade Plutonium]]. Використовується у високозбагаченому паливі для різних реакторів, змішується з іншими ізотопами для низькозбагаченого палива або як заряд у багатьох ядерних бомбах.

Помірно радіоактивний.", - "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённых топливах для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен.", + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённом топливе для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен.", "zh_CN": "[[钚|Plutonium]]主要的易裂变同位素,可从多种使用[[铀-238|Uranium-238]]的核燃料中提取,或直接从[[反应堆级钚|Reactor-Grade Plutonium]]中分离得到。可在多种反应堆中用作高浓缩度燃料,也可与其他同位素混合制成 浓缩度较低的燃料,还可在多种核弹中用作裂变材料。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 2ff18cbb8..95294cb75 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -1,17 +1,17 @@ { "name": "Plutonium-240", "icon": ["hbm:item.billet_pu240", 1, 0], - "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], - "title": { - "en_US": "Plutonium-240", + "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], + "title": { + "en_US": "Plutonium-240", "uk_UA": "Плутоній-240", "ru_RU": "Плутоний-240", "zh_CN": "钚-240" - }, + }, "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or in specialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", - "uk_UA": "Не здатний до поділу ізотоп, що міститься в [[плутонії|Plutonium]] та [[реакторному плутонії|Reactor-Grade-Plutonium]]. Корисний лише при ручному виготовленні реакторного плутонію з [[плутонію-239|Plutonium-239]] або у спеціалізованих [[цирконієвих|Zirconium]] швидких розмножувачах для виготовлення [[плутонію-241|Plutonium-241]] в [[РБМК|RBMK]]." , - "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", + "uk_UA": "Не здатний до поділу ізотоп, що міститься в [[плутонії|Plutonium]] та [[реакторному плутонії|Reactor-Grade-Plutonium]]. Корисний лише при ручному виготовленні реакторного плутонію з [[плутонію-239|Plutonium-239]] або у спеціалізованих [[цирконієвих|Zirconium]] швидких розмножувачах для виготовлення [[плутонію-241|Plutonium-241]] в [[РБМК|RBMK]].", + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[ЦТС|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", "zh_CN": "[[钚|Plutonium]]和[[反应堆级钚|Reactor-Grade Plutonium]]中存在的不易裂变同位素。仅有的用途是手动与[[钚-239|Plutonium-239]]混合为反应堆级钚,或与[[锆|Zirconium]]一同制成专用于增殖的ZFB燃料棒,以在[[RBMK]]中生产[[钚-241|Plutonium-241]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json index 324827ecd..58afa6faa 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-241.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -1,17 +1,17 @@ { "name": "Plutonium-241", "icon": ["hbm:item.billet_pu241", 1, 0], - "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], - "title": { - "en_US": "Plutonium-241", + "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], + "title": { + "en_US": "Plutonium-241", "uk_UA": "Плутоній-241", "ru_RU": "Плутоний-241", "zh_CN": "钚-241" - }, + }, "content": { "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", "uk_UA": "Другий здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути відновлений з відпрацьованого палива [[РБМК|RBMK]], багатого на [[плутоній-240|Plutonium-240]], а також з деяких видів [[цирконієвих|Zirconium]] швидких розмножувачів. Використовується лише в спеціальних паливних розмножувачах та як високозбагачене паливо, яке є потужнішим за свій аналог [[плутонію-239|Plutonium-239]]. Плутоній-241 в РБМК утворює [[америцій-241|Americium-241]] та [[америцій-242|Americium-242]] після переробки.

Високорадіоактивний.", - "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанных топлив [[РБМК|RBMK]], богатых [[плутонием-240|Plutonium-240]], а также из определенных типов [[циркониевых|Zirconium]] топлив быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен.", + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанного топлива [[РБМК|RBMK]], богатого [[плутонием-240|Plutonium-240]], а также из определённых видов [[циркониевого|Zirconium]] топлива быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен.", "zh_CN": "[[钚|Plutonium]]次要的易裂变同位素,可从枯竭的富含[[钚-240|Plutonium-240]]的[[RBMK]]燃料及特定种类的[[锆|Zirconium]]快速增殖燃料(ZFB)中提取。 仅用于专用的增殖燃料,或用作比相应的[[钚-239|Plutonium-239]]燃料更强力的高浓缩度燃料。再处理用于RBMK的钚-241燃料时 可以得到[[镅-241|Americium-241]]和[[镅-242|Americium-242]]。

放射性较强。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json index 533205523..0876eab04 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -1,13 +1,13 @@ { "name": "Reactor-Grade Plutonium", "icon": ["hbm:item.billet_pu_mix", 1, 0], - "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], - "title": { - "en_US": "Reactor-Grade Plutonium", + "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], + "title": { + "en_US": "Reactor-Grade Plutonium", "uk_UA": "Реакторний плутоній", "ru_RU": "Плутоний реакторного качества", "zh_CN": "反应堆级钚" - }, + }, "content": { "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", "uk_UA": "Суміш [[плутонію-239|Plutonium-239]] та [[плутонію-240|Plutonium-240]]. Поширений результат переробки багатьох видів палива на основі [[урану|Uranium]], а також розмноження урану в [[Чиказькій дровітні|Chicago Pile]]. Використовується в багатьох реакторах як середньозбагачене плутонієве паливо.

Помірно радіоактивний.", diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index d10cdb6f3..73ea1e57f 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -1,17 +1,17 @@ { "name": "Plutonium", "icon": ["hbm:item.ingot_plutonium", 1, 0], - "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], - "title": { - "en_US": "Plutonium", + "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], + "title": { + "en_US": "Plutonium", "uk_UA": "Плутоній", "ru_RU": "Плутоний", "zh_CN": "钚" - }, + }, "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", "uk_UA": "Рідкісна форма природнього плутонію, що складається з плутонію-238, 239 та 240. Плутоній у формі руди вимкнено за замовчуванням. Може бути перероблений в [[газовій центріфузі|Gas Centrifuge]] у формі гексафториду, або використовуватися для певних рецептів [[циклотрона|Cyclotron]].

Помірно радіоактивний.

Див. також:
[[Плутоній-238|Plutonium-238]]
[[Плутоній-239|Plutonium-239]]
[[Плутоній-240|Plutonium-240]]
[[Плутоній-241|Plutonium-241]]", - "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определенных рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", + "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определённых рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", "zh_CN": "不纯钚的稀有形式,由钚-238、钚-239、钚-240组成。 钚的矿石形式默认禁用。钚可以以六氟化钚的形式在[[气体离心机|Gas Centrifuge]]中处理,也用于某些[[回旋加速器|Cyclotron]]配方。

放射性中等。

另见:
[[钚-238|Plutonium-238]]
[[钚-239|Plutonium-239]]
[[钚-240|Plutonium-240]]
[[钚-241|Plutonium-241]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index e0642cddc..465165588 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -1,17 +1,17 @@ { "name": "Polonium-210", "icon": ["hbm:item.billet_polonium", 1, 0], - "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], - "title": { - "en_US": "Polonium-210", + "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], + "title": { + "en_US": "Polonium-210", "uk_UA": "Полоній-210", "ru_RU": "Полоний-210", "zh_CN": "钋-210" - }, + }, "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", "uk_UA": "Радіоізотоп, отриманий в результаті переробки [[радій-226|Radium-226]]берилієвих джерел нейтронів. Використовується для [[РІТЕГ|RTG]] або з [[берилієм|Beryllium]] у полоній-210 берилієвих джерелах нейтронів для [[РБМК|RBMK]].

Високорадіоактивний, дуже гарячий.", - "ru_RU": "Радиоизотоп, получаемый из переработки нейтронных источников [[радия-226|Radium-226]]. Используется для [[РТГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках Полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", + "ru_RU": "Радиоизотоп, получаемый переработкой нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", "zh_CN": "再处理[[镭-226|Radium-226]]中子源时得到的放射性同位素。可用于[[RTG]],也可与[[铍|Beryllium]]混合为钋-210-铍中子源,用于[[RBMK]]。

放射性强,高温。" } } diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json index 60e8163c0..c0f38ff48 100644 --- a/src/main/resources/assets/hbm/manual/material/polymer.json +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -1,13 +1,13 @@ { "name": "Polymer", "icon": ["hbm:item.ingot_polymer", 1, 0], - "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], - "title": { - "en_US": "Polymer", + "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], + "title": { + "en_US": "Polymer", "uk_UA": "Полімер", "ru_RU": "Полимер", "zh_CN": "聚合物" - }, + }, "content": { "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", "uk_UA": "Полімер ('Тефлон') – це перший доступний тип пластику. потребує [[нафтовий газ|Petroleum Gas]], а отже, [[переробку нафти|Crude Oil]].

Повністю взаємозамінний з [[карболітом|Bakelite]], який стає доступним після [[крекінгу нафти|Catalytic Cracking Tower]].", diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json index 4c4cb433d..cd3e8a006 100644 --- a/src/main/resources/assets/hbm/manual/material/radium.json +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -1,17 +1,17 @@ { "name": "Radium-226", "icon": ["hbm:item.billet_ra226", 1, 0], - "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], - "title": { - "en_US": "Radium-226", + "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], + "title": { + "en_US": "Radium-226", "uk_UA": "Радій-226", "ru_RU": "Радий-226", "zh_CN": "镭-226" - }, + }, "content": { "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", "uk_UA": "Рідкісний радіоактивний матеріал, що міститься в [[уранових|Uranium]] та [[торієвих|Thorium-232]] рудах, можна отримати за допомогою [[центрифуги|Centrifuge]]. Використовується разом з [[берилієм|Beryllium]] у радій-226 берилієвих джерелах нейтронів, які необхідні для запуску [[Чиказької дровітні|Chicago Pile]], [[ВВЕР|PWR]], [[дослідницького реактора|Research Reactor]] та [[РБМК|RBMK]]. Перше доступне джерело нейтронів і часто найдешевше.

Помірно радіоактивний.", - "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках Радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен.", + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен.", "zh_CN": "稀有的放射性物质,存在于[[铀|Uranium]]矿石和[[钍|Thorium]]矿石中,可通过[[离心机|Centrifuge]]提取。可与[[铍|Beryllium]]混合得到启动[[芝加哥反应堆|Chicago Pile]]、[[RBMK]]、[[PWR]]、[[研究型反应堆|]]必须的镭-226-铍中子源。是最早可获得的中子放射源,而且通常也是最便宜的。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index 9b6d7a442..f9718972a 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -1,17 +1,17 @@ { "name": "Rubber", "icon": ["hbm:item.ingot_rubber", 1, 0], - "trigger": [["hbm:item.ingot_rubber"]], - "title": { - "en_US": "Rubber", + "trigger": [["hbm:item.ingot_rubber"]], + "title": { + "en_US": "Rubber", "uk_UA": "Гума", "ru_RU": "Резина", "zh_CN": "橡胶" - }, + }, "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", "uk_UA": "Нафтопродукт, отриманий з [[ненасичених вуглеводнів|Unsaturated Hydrocarbons]] та [[сірки|Sulfur]]. Для виробництва потрібна щонайменше [[вежа каталітичного крекінгу|Catalytic Cracking Tower]]. Може замінити [[латекс|Latex]] у всіх рецептах.", - "ru_RU": "Продукт переработки нефти, получаемый из [[ненасыщенных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", + "ru_RU": "Продукт переработки нефти, получаемый из [[непредельных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", "zh_CN": "一种石化产品,衍生自[[不饱和烃|Unsaturated Hydrocarbons]]和[[硫|Sulfur]]。至少需要一台[[催化裂化塔|Catalytic Cracking Tower]]才能制作。可在所有配方中替代[[乳胶|Latex]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json index e13ba0485..53f20d37e 100644 --- a/src/main/resources/assets/hbm/manual/material/silicon.json +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -1,17 +1,17 @@ { "name": "Silicon", "icon": ["hbm:item.billet_silicon", 1, 0], - "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], - "title": { - "en_US": "Silicon", + "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], + "title": { + "en_US": "Silicon", "uk_UA": "Кремній", "ru_RU": "Кремний", "zh_CN": "硅" - }, + }, "content": { "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", "uk_UA": "Важливий матеріал для виробництва інтегральних плат та будь-якої електроніки, складнішої за аналогову плату. Виготовляється в [[електричній дуговій печі|Electric Arc Furnace]] використанням матеріалів, що містять діоксид кремнію, наприклад звичайного піску, пекельного кварцу, скловолокна, кременю або [[азбесту|Asbestos]]. Використовується переважно як пластини (тобто заготовки) які [[пресуються|Burner Press]] за допомогою штампа схеми, а потім перетворюються на різні типи мікрочіпів. Через необхідність у дуговій печі, кремній стає доступний після отримання [[полімеру|Polymer]], що вимагає переробки [[нафти|Crude Oil]].", - "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, незер-кварц, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]].", + "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, кварц незера, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]].", "zh_CN": "生产集成电路以及其他比模拟电路更加复杂的电路的重要材料。可通过使用[[电弧炉|Electric Arc Furnace]]冶炼含二氧化硅的物品(如普通沙子、下界石英、玻璃纤维、燧石和[[石棉|Asbestos]])获取。主要的应用形式为在[[锻压机|Burner Press]]中经电路板锻模锻压的晶圆(即坯料),这些晶圆随后被用来制作多种微处理器。 因为其制作需要电弧炉,硅只能在获得[[聚合物|Polymer]]后制作,因此需要[[原油处理|Crude Oil]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json index ef804af7c..90c98db3f 100644 --- a/src/main/resources/assets/hbm/manual/material/sodium.json +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -1,17 +1,17 @@ { "name": "Sodium", "icon": ["hbm:item.powder_sodium", 1, 0], - "trigger": [["hbm:item.powder_sodium"]], - "title": { - "en_US": "Sodium", + "trigger": [["hbm:item.powder_sodium"]], + "title": { + "en_US": "Sodium", "uk_UA": "Натрій", "ru_RU": "Натрий", "zh_CN": "钠" - }, + }, "content": { "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", "uk_UA": "В основному отримується з содаліту, дорогоцінного каменю, який зустрічається як побічний продукт [[центрифугування|Centrifuge]] багатьох руд. Використовується в рідкому вигляді як потужний охолоджувач для [[ВВЕР|PWR]].", - "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифуги|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]].", + "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифугования|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]].", "zh_CN": "主要通过方钠石获取,方钠石可作为多种矿石的[[离心|Centrifuge]]副产物获得。其液体形式可用作强力的[[PWR]]冷却剂。" } } diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json index d67a8e335..77dad347b 100644 --- a/src/main/resources/assets/hbm/manual/material/steel.json +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -1,13 +1,13 @@ { "name": "Steel", "icon": ["hbm:item.ingot_steel", 1, 0], - "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], - "title": { - "en_US": "Steel", + "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], + "title": { + "en_US": "Steel", "uk_UA": "Сталь", "ru_RU": "Сталь", "zh_CN": "钢" - }, + }, "content": { "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", "uk_UA": "Покращена версія заліза, базовий матеріал. Використовується майже в усьому. Спочатку отримується шляхом поєднання вугілля та заліза в [[доменній печі|Blast Furnace]]. Покращені рецепти доступні пізніше в [[ливарні|Crucible]] та [[роторній печі|Rotary Furnace]].", diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 83b15a84d..071ea8633 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -1,17 +1,17 @@ { "name": "Sulfur", "icon": ["hbm:item.sulfur", 1, 0], - "trigger": [["hbm:item.sulfur"]], - "title": { - "en_US": "Sulfur", + "trigger": [["hbm:item.sulfur"]], + "title": { + "en_US": "Sulfur", "uk_UA": "Сірка", "ru_RU": "Сера", "zh_CN": "硫" - }, + }, "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", "uk_UA": "Звичайна руда, зустрічається у великих кількостях в пеклі. Використовується в різних речах, таких як [[сірчана кислота|Sulfuric Acid]], [[гума|Rubber]] та єлоукейку для отримання гексафториду [[урану|Uranium]]. Також може використовуватися для виготовлення пороху, сірників або як жовтий барвник.", - "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных целей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в йеллоукейке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", + "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жётлом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", "zh_CN": "常见矿物,在下界的生成量更多。用于多种配方,例如制作[[硫酸|Sulfuric Acid]]和 [[橡胶|Rubber]],也用于制作黄饼,作为合成六氟化[[铀|Uranium]]的原料。 也可用于制作火药、火柴,以及用作黄色染料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json index 3a6375f2b..cf3e30380 100644 --- a/src/main/resources/assets/hbm/manual/material/tantalium.json +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -1,17 +1,17 @@ { "name": "Tantalium", "icon": ["hbm:item.ingot_tantalium", 1, 0], - "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], - "title": { - "en_US": "Tantalium", + "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], + "title": { + "en_US": "Tantalium", "uk_UA": "Тантал", "ru_RU": "Тантал", "zh_CN": "钽" - }, + }, "content": { "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", "uk_UA": "Тантал ('Танталій') можна отримати з [[колтану|Coltan]] який зустрічається лише в одному конкретному регіоні світу. Використовується переважно для танталових конденсаторів, які є критично важливими для блоків керування, що використовуються в більшості ядерних бомб.", - "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одном определенном регионе мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб.", + "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одной определённой области мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб.", "zh_CN": "钽可从仅生成在特定区域的[[钶钽铁矿|Coltan]]中提取。 主要用于制作钽电容器,钽电容器可作为大多数核弹所需的控制单元的重要原料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 910ac0a21..9c529e2cf 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -1,17 +1,17 @@ { "name": "Technetium", "icon": ["hbm:item.ingot_technetium", 1, 0], - "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], - "title": { - "en_US": "Technetium", + "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], + "title": { + "en_US": "Technetium", "uk_UA": "Технецій-99", "ru_RU": "Технеций", "zh_CN": "锝" - }, + }, "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", "uk_UA": "Синтетичний метал, перероблений з палива [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]] на ранніх етапах. також може бути отриманий з деяких видів палива [[РБМК|RBMK]] або [[корінної руди|Bedrock Ore]] за допомогою високоефективного розчинника.

В основному використовується для [[технецієвої сталі|Technetium Steel]].

Помірно радіоактивний.", - "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых топлив [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", + "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых видов топлива [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", "zh_CN": "人工合成的金属元素,初期可通过再处理[[锆诺克斯|ZIRNOX]]和[[PWR]]的枯竭燃料获取。也可通过回收某些[[RBMK]]燃料或使用高性能溶剂处理[[基岩矿石|Bedrock Ore]]获取。

主要用于制作[[锝钢|Technetium Steel]]。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json index 6b99056f2..848f139a7 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium_steel.json +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -1,13 +1,13 @@ { "name": "Technetium Steel", "icon": ["hbm:item.ingot_tcalloy", 1, 0], - "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], - "title": { - "en_US": "Technetium Steel", + "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], + "title": { + "en_US": "Technetium Steel", "uk_UA": "Технецієва сталь", "ru_RU": "Технециевая сталь", "zh_CN": "锝钢" - }, + }, "content": { "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", "uk_UA": "Сплав, виготовлений зі [[сталі|Steel]] та [[технецію|Technetium]]. Стійкий до корозії, використовується в більш міцних резервуарах для рідини та в багатьох передових машинах. Одержується після [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]], оскільки технецій є синтетичним.

Повністю взаємозамінний з [[кадмієвою сталлю|Cadmium Steel]].", diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json index bbea607d3..075261d4a 100644 --- a/src/main/resources/assets/hbm/manual/material/thorium.json +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -1,17 +1,17 @@ { "name": "Thorium-232", "icon": ["hbm:item.billet_th232", 1, 0], - "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], - "title": { - "en_US": "Thorium-232", + "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], + "title": { + "en_US": "Thorium-232", "uk_UA": "Торій-232", "ru_RU": "Торий-232", "zh_CN": "钍-232" - }, + }, "content": { "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", "uk_UA": "Фертильний (тобто придатний до розмноження) ізотоп який дає [[уран-233|Uranium-233]]. Може бути опромінений в [[РБМК|RBMK]] для отримання [[торієвого палива|Thorium Fuel]] або поєднаний з ураном-233. Паливо, отримане з торію, зазвичай економічне, але не дуже потужне. Також використовується у вигляді [[рідкої торієвої солі|Liquid Thorium Salt]], потужному теплоносію [[ВВЕР|PWR]] (перетворюючи його у реактор на розплавах солей) який швидко дає тонни урану-233.

Слабко радіоактивний.", - "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топлива, производные от тория, обычно экономичны, но не очень мощные. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен.", + "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топливо, производное от тория, обычно экономично, но не очень мощное. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен.", "zh_CN": "可增殖的同位素,增殖后产生[[铀-233|Uranium-233]]。可通过在[[RBMK]]中辐照或与铀-233混合得到[[钍燃料|Thorium Fuel]]。 总体来讲,由钍衍生的燃料成本较低,但能量不高。 也可用于[[液态钍盐|Liquid Thorium Salt]],其可作为一种强力的[[PWR]]冷却剂(同时将反应堆变成熔盐堆),同时快速产生大量铀-233。

略有放射性。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json index 721edee4c..ea6e52f83 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-233.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -1,17 +1,17 @@ { "name": "Uranium-233", "icon": ["hbm:item.billet_u233", 1, 0], - "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], - "title": { - "en_US": "Uranium-233", + "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], + "title": { + "en_US": "Uranium-233", "uk_UA": "Уран-233", "ru_RU": "Уран-233", "zh_CN": "铀-233" - }, + }, "content": { "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", "uk_UA": "Штучний ізотоп урану здатного до розщеплення (тобто придатного для реакторів), отримується шляхом переробки [[палива на основі торію|Thorium Fuel]]. Високозбагачене паливо з урану-233, як правило, потужніше, ніж паливо, отримане з [[урану-235|Uranium-235]].

Помірно радіоактивний.", - "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащенное топливо урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен.", + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащённое топливо из урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен.", "zh_CN": "人工制造的易裂变(即能够用于反应堆)的铀同位素,可通过再处理[[钍基燃料|Thorium Fuel]]获取。总体来讲,高浓缩度的铀-233较基于铀-235的燃料更加强力。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json index 818c9e367..23e2a810c 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-235.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -1,17 +1,17 @@ { "name": "Uranium-235", "icon": ["hbm:item.billet_u235", 1, 0], - "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], - "title": { - "en_US": "Uranium-235", + "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], + "title": { + "en_US": "Uranium-235", "uk_UA": "Уран-235", "ru_RU": "Уран-235", "zh_CN": "铀-235" - }, + }, "content": { "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", "uk_UA": "Збагачений уран. Придатний до розщеплення, використовується в деяких реакторах безпосередньо як високозбагачене паливо або змішується з [[ураном-238|Uranium-238]] для отримання середньозбагаченого уранового палива. Збройового класу. Спочатку отримується шялхом переробки [[гексафториду урану|Uranium Hexafluoride]] у каскаді з чотирьох [[газових центрифуг|Gas Centriuge]], пізніше доступний шляхом розділення [[природного урану|Uranium]] за допомогою [[камери лазерного розділення ізотопів|SILEX]].

Помірно радіоактивний.", - "ru_RU": "Обогащенный уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенных урановых топлив. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен.", + "ru_RU": "Обогащённый уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен.", "zh_CN": "浓缩的铀,容易裂变,可直接作为高浓缩度燃料用于某些反应堆,也可与[[铀-238|Uranium-238]]混合回中浓缩度的铀燃料。 也是一种武器级的同位素。最初可通过在四台串联的[[气体离心机|Gas Centrifuge]]中处理[[六氟化铀|Uranium Hexafluoride]]获取,之后也可直接在[[SILEX]]中 分离[[天然铀|Uranium]]获取。

放射性中等。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json index d333810a9..6d55e3765 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium-238.json +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -1,17 +1,17 @@ { "name": "Uranium-238", "icon": ["hbm:item.billet_u238", 1, 0], - "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], - "title": { - "en_US": "Uranium-238", + "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], + "title": { + "en_US": "Uranium-238", "uk_UA": "Уран-238", "ru_RU": "Уран-238", "zh_CN": "铀-238" - }, + }, "content": { "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", "uk_UA": "Збіднений уран, не ділиться (тобто не придатний для безпосереднього використання в реакторах). В основному побічний продукт збагачення [[урану|Uranium]]. Використовується у виготовленні [[фероурану|Ferrouranium]], [[боєприпасів зі збідненим ураном|Depleted Uranium Ammo]] та для певного низькозбагаченого палива. Паливо, що містить уран-238 зазвичай дає корисний [[плутоній-239|Plutonium-239]] під час переробки.

Слабо радіоактивний.", - "ru_RU": "Истощенный уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроурание|Ferrouranium]], для [[боеприпасов с истощенным ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных топлив. Топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен.", + "ru_RU": "Обеднённый уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроуране|Ferrouranium]], для [[боеприпасов с обеднённым ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных видов топлива. Виды топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен.", "zh_CN": "贫铀,不能作为燃料(即无法直接被反应堆使用)。通常作为[[铀|Uranium]]浓缩过程中的副产品。用于制造[[铀铁合金|Ferrouranium]],[[贫铀弹药|Depleted Uranium Ammo]]和低浓缩度燃料。含有铀-238的燃料在再处理时会产生有用的[[钚-239|Plutonium-239]]。

略有放射性。" } } diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json index e7507ab62..a85eae076 100644 --- a/src/main/resources/assets/hbm/manual/material/uranium.json +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -1,17 +1,17 @@ { "name": "Uranium", "icon": ["hbm:item.ingot_uranium", 1, 0], - "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], - "title": { - "en_US": "Uranium", + "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], + "title": { + "en_US": "Uranium", "uk_UA": "Уран", "ru_RU": "Уран", "zh_CN": "铀" - }, + }, "content": { "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", "uk_UA": "Природний уран, слабо радіоактивний. Сам по собі не дуже ділиться, його можна збагачувати, перетворюючи на [[гексафторид урану|Uranium Hexafluoride]] та оброблюючи в [[газових центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] та [[Чиказька дровітня|Chigago Pile]] можуть використовувати природний уран як паливо без збагачення.

Див. також:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", - "ru_RU": "Натуральный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащен путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать натуральный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", + "ru_RU": "Природный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащён путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать природный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", "zh_CN": "天然铀,具有微弱放射性。本身不太容易裂变,但可通过将其变为[[六氟化铀|Uranium Hexafluoride]]并在[[气体离心机|Gas Centrifuge]]中处理以将其浓缩。[[锆诺克斯|ZIRNOX]],[[RBMK]]和[[芝加哥反应堆|Chigago Pile]]可直接将未浓缩铀用作燃料。

另见:
[[铀-233|Uranium-233]]
[[铀-235|Uranium-235]]
[[铀-238|Uranium-238]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json index d96c3dbd6..9b7d9b2df 100644 --- a/src/main/resources/assets/hbm/manual/material/weaponsteel.json +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -1,13 +1,13 @@ { "name": "Weapon Steel", "icon": ["hbm:item.ingot_weaponsteel", 1, 0], - "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], - "title": { - "en_US": "Weapon Steel", + "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], + "title": { + "en_US": "Weapon Steel", "uk_UA": "Збройова сталь", "ru_RU": "Оружейная сталь", "zh_CN": "武器级钢" - }, + }, "content": { "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", "uk_UA": "Високочиста версія [[сталі|Steel]] виготовлена в [[роторній печі|Rotary Furnace]]. Потребує [[коксовий газ|Coker Gas]], тому і [[коксову установку|Coker Unit]]. Використовується в багатьох видах мідгеймової зброї, модифікаціях зброї та ракетних боєголовках.", From 48b4124c14a9db7c65fcaefdeb28e0572312541e Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 15:52:45 -0600 Subject: [PATCH 307/323] Manual update --- src/main/resources/assets/hbm/manual/material/ferrouranium.json | 2 +- .../resources/assets/hbm/manual/material/plutonium-240.json | 2 +- src/main/resources/assets/hbm/manual/material/polonium.json | 2 +- src/main/resources/assets/hbm/manual/material/sulfur.json | 2 +- src/main/resources/assets/hbm/manual/material/technetium.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json index 4d46f1c36..3efb82964 100644 --- a/src/main/resources/assets/hbm/manual/material/ferrouranium.json +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -11,7 +11,7 @@ "content": { "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", "uk_UA": "Сплав [[сталі|Steel]] та [[урану-238|Uranium-238]], виготовлений у [[ливарні|Crucible]]. В основному використовується в уранобетоні, деталях зброї та вибухових боєприпасах.", - "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[плавильне|Crucible]]. В основном используется в дюкрете, деталях оружий и взрывных боеприпасах.", + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[плавильне|Crucible]]. В основном используется в дюкрете, деталях оружия и взрывных боеприпасах.", "zh_CN": "[[钢|Steel]]与[[铀-238|Uranium-238]]的合金,在坩埚中制成。 主要用于制作贫铀混凝土、武器部件和高爆弹药。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json index 95294cb75..1406f170a 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium-240.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -11,7 +11,7 @@ "content": { "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or in specialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", "uk_UA": "Не здатний до поділу ізотоп, що міститься в [[плутонії|Plutonium]] та [[реакторному плутонії|Reactor-Grade-Plutonium]]. Корисний лише при ручному виготовленні реакторного плутонію з [[плутонію-239|Plutonium-239]] або у спеціалізованих [[цирконієвих|Zirconium]] швидких розмножувачах для виготовлення [[плутонію-241|Plutonium-241]] в [[РБМК|RBMK]].", - "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[ЦТС|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", "zh_CN": "[[钚|Plutonium]]和[[反应堆级钚|Reactor-Grade Plutonium]]中存在的不易裂变同位素。仅有的用途是手动与[[钚-239|Plutonium-239]]混合为反应堆级钚,或与[[锆|Zirconium]]一同制成专用于增殖的ZFB燃料棒,以在[[RBMK]]中生产[[钚-241|Plutonium-241]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json index 465165588..5c3dd0e46 100644 --- a/src/main/resources/assets/hbm/manual/material/polonium.json +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -11,7 +11,7 @@ "content": { "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", "uk_UA": "Радіоізотоп, отриманий в результаті переробки [[радій-226|Radium-226]]берилієвих джерел нейтронів. Використовується для [[РІТЕГ|RTG]] або з [[берилієм|Beryllium]] у полоній-210 берилієвих джерелах нейтронів для [[РБМК|RBMK]].

Високорадіоактивний, дуже гарячий.", - "ru_RU": "Радиоизотоп, получаемый переработкой нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в нейтронных источниках полоний-210-бериллий для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", + "ru_RU": "Радиоизотоп, получаемый переработкой нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в полоний-210-бериллиевых источниках нейтронов для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", "zh_CN": "再处理[[镭-226|Radium-226]]中子源时得到的放射性同位素。可用于[[RTG]],也可与[[铍|Beryllium]]混合为钋-210-铍中子源,用于[[RBMK]]。

放射性强,高温。" } } diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index 071ea8633..be277db2c 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -11,7 +11,7 @@ "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", "uk_UA": "Звичайна руда, зустрічається у великих кількостях в пеклі. Використовується в різних речах, таких як [[сірчана кислота|Sulfuric Acid]], [[гума|Rubber]] та єлоукейку для отримання гексафториду [[урану|Uranium]]. Також може використовуватися для виготовлення пороху, сірників або як жовтий барвник.", - "ru_RU": "Обычная руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жётлом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", + "ru_RU": "Распространённая руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жётлом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", "zh_CN": "常见矿物,在下界的生成量更多。用于多种配方,例如制作[[硫酸|Sulfuric Acid]]和 [[橡胶|Rubber]],也用于制作黄饼,作为合成六氟化[[铀|Uranium]]的原料。 也可用于制作火药、火柴,以及用作黄色染料。" } } diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json index 9c529e2cf..d640d843e 100644 --- a/src/main/resources/assets/hbm/manual/material/technetium.json +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -11,7 +11,7 @@ "content": { "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", "uk_UA": "Синтетичний метал, перероблений з палива [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]] на ранніх етапах. також може бути отриманий з деяких видів палива [[РБМК|RBMK]] або [[корінної руди|Bedrock Ore]] за допомогою високоефективного розчинника.

В основному використовується для [[технецієвої сталі|Technetium Steel]].

Помірно радіоактивний.", - "ru_RU": "Синтетический металл, перерабатывается из топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых видов топлива [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", + "ru_RU": "Синтетический металл, получаемый в результате переработки топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых видов топлива [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", "zh_CN": "人工合成的金属元素,初期可通过再处理[[锆诺克斯|ZIRNOX]]和[[PWR]]的枯竭燃料获取。也可通过回收某些[[RBMK]]燃料或使用高性能溶剂处理[[基岩矿石|Bedrock Ore]]获取。

主要用于制作[[锝钢|Technetium Steel]]。

放射性中等。" } } From 2eecf17100ae63564a68e72d99dab91f47162df4 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Mon, 25 Aug 2025 15:52:58 -0600 Subject: [PATCH 308/323] DODD --- src/main/resources/assets/hbm/lang/ru_RU.lang | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 906974c2e..c17266768 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -6351,6 +6351,53 @@ tile.rbmk_steam_inlet.desc=Подает воду в колонны RBMK, есл tile.rbmk_steam_outlet.name=Порт вывода пара РБМК РеаСим tile.rbmk_steam_outlet.desc=Извлекает перегретый пар из колонн РБМК, если включены ReaSim бойлеры$Подключается к колоннам RBMK сбоку tile.rbmk_storage.name=Колонна-хранилище РБМК +tile.rbmk.dodd.heat=Температура колонны +tile.rbmk.dodd.reasimWater=Вода РеаСим +tile.rbmk.dodd.reasimSteam=Пар РеаСим +tile.rbmk.dodd.level=Уровень +tile.rbmk.dodd.targetLevel=Целевой уровень +tile.rbmk.dodd.startingLevel=Начальный уровень +tile.rbmk.dodd.mult=Мульт. +tile.rbmk.dodd.color=Цвет +tile.rbmk.dodd.levelLower=Уровень ниже +tile.rbmk.dodd.levelUpper=Уровень выше +tile.rbmk.dodd.heatLower=Температура ниже +tile.rbmk.dodd.heatUpper=Температура выше +tile.rbmk.dodd.function=Функция +tile.rbmk.dodd.fluxSlow=Медленный поток +tile.rbmk.dodd.fluxFast=Быстрый поток +tile.rbmk.dodd.hasRod=Имеет стержень +tile.rbmk.dodd.progress=Прогресс +tile.rbmk.dodd.gas=Газ +tile.rbmk.dodd.cooled=Охлажденный +tile.rbmk.dodd.burned=Сожженный +tile.rbmk.dodd.feed=Питание +tile.rbmk.dodd.steam=Пар +tile.rbmk.dodd.cryo=Крио +tile.rbmk.dodd.fuel=Топливо +tile.rbmk.dodd.f_heat=Температура топлива +tile.rbmk.dodd.f_xenon=Отравление ксеноном +tile.rbmk.dodd.f_yield=Выход топлива +tile.rbmk.dodd.feed_type=Тип питания(ID) +tile.rbmk.dodd.steam_type=Тип пара(ID) +tile.rbmk.dodd.cryo_type=Тип крио(ID) +tile.rbmk.dodd.gas_type=Тип газа(ID) +tile.rbmk.dodd.fuel_type=Тип топлива(ID) +tile.rbmk.dodd.feed_p=Давление +tile.rbmk.dodd.steam_p=Давление пара +tile.rbmk.dodd.cryo_p=Давление крио +tile.rbmk.dodd.gas_p=Давление газа +tile.rbmk.dodd.fuel_p=Давление топлива +tile.rbmk.dodd.feed_max=Максимальное количество питания +tile.rbmk.dodd.steam_max=Максимальное количество пара +tile.rbmk.dodd.cryo_max=Максимальное количество крио +tile.rbmk.dodd.gas_max=Максимальное количество газа +tile.rbmk.dodd.fuel_max=Максимальное количество топлива +tile.rbmk.dodd.feed_amt=Количество питания +tile.rbmk.dodd.steam_amt=Количество пара +tile.rbmk.dodd.cryo_amt=Количество крио +tile.rbmk.dodd.gas_amt=Количество газа +tile.rbmk.dodd.fuel_amt=Количество топлива tile.reactor_computer.name=Контроллер реактора tile.reactor_conductor.name=Бойлер реактора tile.reactor_control.name=Регулирующие стержни From 03d195fd91ad2abcf099cf0fe1d29a17a79c5f6a Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 26 Aug 2025 15:49:27 +0200 Subject: [PATCH 309/323] ough --- changelog | 3 +- .../com/hbm/commands/CommandCustomize.java | 51 ++++++++++++++++++ .../java/com/hbm/items/ICustomizable.java | 9 ++++ src/main/java/com/hbm/main/MainRegistry.java | 1 + .../textures/items/pwr_fuel.bfb_am_mix.png | Bin 449 -> 440 bytes .../hbm/textures/items/pwr_fuel.bfb_pu241.png | Bin 438 -> 434 bytes .../hbm/textures/items/pwr_fuel.hea242.png | Bin 428 -> 428 bytes .../hbm/textures/items/pwr_fuel.hen237.png | Bin 412 -> 414 bytes .../hbm/textures/items/pwr_fuel.hep239.png | Bin 403 -> 404 bytes .../hbm/textures/items/pwr_fuel.hep241.png | Bin 418 -> 421 bytes .../hbm/textures/items/pwr_fuel.hes326.png | Bin 431 -> 423 bytes .../hbm/textures/items/pwr_fuel.hes327.png | Bin 434 -> 440 bytes .../hbm/textures/items/pwr_fuel.heu233.png | Bin 433 -> 434 bytes .../hbm/textures/items/pwr_fuel.heu235.png | Bin 419 -> 422 bytes .../hbm/textures/items/pwr_fuel.mea.png | Bin 431 -> 437 bytes .../hbm/textures/items/pwr_fuel.men.png | Bin 429 -> 426 bytes .../hbm/textures/items/pwr_fuel.mep.png | Bin 414 -> 410 bytes .../hbm/textures/items/pwr_fuel.meu.png | Bin 422 -> 434 bytes .../hbm/textures/items/pwr_fuel.mox.png | Bin 414 -> 414 bytes .../hbm/textures/items/pwr_fuel_base.png | Bin 422 -> 420 bytes .../hbm/textures/items/pwr_fuel_depleted.png | Bin 373 -> 369 bytes .../hbm/textures/items/pwr_fuel_hot.png | Bin 401 -> 398 bytes 22 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hbm/commands/CommandCustomize.java create mode 100644 src/main/java/com/hbm/items/ICustomizable.java diff --git a/changelog b/changelog index 8be9f46fc..1751d00af 100644 --- a/changelog +++ b/changelog @@ -10,4 +10,5 @@ * Fixed conveyor grabber dropping items off at an offset when placing them on a conveyor belt due to a client desync * Fixed occasional crash caused by using the settings tool on the autoloader * Fixed QMAW not correctly working with other languages -* Fixed QMAW loading breaking entirely due to file encoding \ No newline at end of file +* Fixed QMAW loading breaking entirely due to file encoding +* Fixed PWR fuel rod textures being 18x18 instead of 16x16 \ No newline at end of file diff --git a/src/main/java/com/hbm/commands/CommandCustomize.java b/src/main/java/com/hbm/commands/CommandCustomize.java new file mode 100644 index 000000000..a217eb56a --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandCustomize.java @@ -0,0 +1,51 @@ +package com.hbm.commands; + +import com.hbm.items.ICustomizable; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; + +public class CommandCustomize extends CommandBase { + + @Override + public String getCommandName() { + return "ntmcustomize"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmcustomize"; + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return true; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) { + sender.addChatMessage(new ChatComponentText("Customization is only available to players!").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + return; + } + + EntityPlayer player = (EntityPlayer) sender; + + if(player.getHeldItem() == null || !(player.getHeldItem().getItem() instanceof ICustomizable)) { + sender.addChatMessage(new ChatComponentText("You have to hold a customizable item to use this command!").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + return; + } + + ICustomizable item = (ICustomizable) player.getHeldItem().getItem(); + item.customize(player, player.getHeldItem(), args); + } +} diff --git a/src/main/java/com/hbm/items/ICustomizable.java b/src/main/java/com/hbm/items/ICustomizable.java new file mode 100644 index 000000000..74b82506f --- /dev/null +++ b/src/main/java/com/hbm/items/ICustomizable.java @@ -0,0 +1,9 @@ +package com.hbm.items; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface ICustomizable { + + public void customize(EntityPlayer player, ItemStack stack, String... args); +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0db237afe..9f5366d6c 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -665,6 +665,7 @@ public class MainRegistry { event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); event.registerServerCommand(new CommandLocate()); + event.registerServerCommand(new CommandCustomize()); ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes } diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png index 12f553847930a7c2ec42eea7d826417b17ef87ca..1362ef70b32417a106d97d707d2893f1906a48f9 100644 GIT binary patch delta 433 zcmV;i0Z#tG1GobriBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde{V@d zK~y-6rISle0znXlzws4KNF00&QDfZb0Sr4<>^K8Q;SMZVv+4`5W6ceSYa@vo9}|0e z-ZqXPX%|L<42X$;Qk%c4zp7MM!#`y$I}kz`r4+vJE;goRe=4yBF>4!_1zs&6cI%caU65LTSQNi)g2t{71=Co;~bZe&o9U) ziF}r1v4-JjH2}alJYao$3&s;BZ(~NU8N&}qz3^`UfTN=llWfHJH6x2Pf5RZ(J}h_z z738aYOJ~_?fFFcNPvsI5tx^m@IG$ycn^YME-ae`%%@2B`(I82Z%;eiy z;>GzXe{XLQLh!yvqtS@pJ9`ZCf)4h}*uQKpudfNikT491qKLDfW%NAGU(w-ynVnJ* z`=o-re?Z+~G)$)XK>+sAAwP<{Fq<=foG~4zOr9ZegU^8gj*lzMf72Jqn{r0gZ^CoL%Isbc|f`f=0i$ZUqIGfGnYPEt8BFo`$ zh~;uw`d}8*=~NB|0}0?yYMLfTf1{DS^*`JSuIpklnJD1#cnl$gqE~K(w|5JN!vU01 z zj8Hwr_W=N4nr&!LbzIUbPVpIBeB+#6i>zuBf1}%dg=w~77%eoLjWU}Ge+YuG)SM>C zeLxs;c%H8qE@;}}(`4r10sxrHQs5K1Z0 zbzSzX4m^(`3^~M6AUR#I*=!U-1pr7NBwxjRJ}0`a%lsUy*X!bC%3mb?^6e~(A4G7v VCJ9?bkC}e^e^QmUCt^`o2%CR{LhJR;y^Ot;G{Ibvj1a={ zJkJyhIf6hEMG8IBtmaF4y`Gh{_iN@EvxPOAO~>;*v%5##Zuj_|Z9Ce&zmcyQ{RIN> Z0r{-C{pe9gng9R*07*qo1w^hwV1k0#!I%I5 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png index 02db8994d1197110292759bd1fc8f8795e7fc879..5d37d8a53fd1a68273f8abdea95a9a250aff7131 100644 GIT binary patch delta 413 zcmV;O0b>5F1FQofiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZykf2ET_ zZW=KZhCk1QN=;DEw5YpA${Egn)cFas+VB#!N z5M>4twNHAR-@pI&{QN)o&k*Mhq?A66W0X=Tr5FqbrQA}m-|zeJc#L!Ikj-Y3;c$4i z;32x*u5UCN9{4M()v9l`TK<$Df1Cn~#ez5F1FQofiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtaf6bG@ zZW=KVhClCyN=;GGwy3v8>N9ZT#Eoa*QMmB{JOL-a0OG=H@CK+w2@+DWj_sJ;vI`sc zL`4)YB1#V(X)gbazZs7`@V}Wj7nD-^G)+-Tp_F1WnbhXj2FByDpU>ww=l*)P+hsbP zo-O{uhQp!nbUGe*;mu~#_j)}ae>xL|#LZ^IU@&;4_xpXEbHU(3M3j9)|h>>niP2` zVHYJ)ercNV@6Y4$82%}_wP1|V{eDjn1O!3AY&NU))+Q&Di7plkoO7Si@AsL{=Qj`h z)ObABUazOXx9D^_Iv5P}+JASQf7tDIj7FmhcsLy5oU7#h>x8zI?RJYXhOa$Xuh%4! z{0!(mbP-S3Y&L{pNEn7#YstNwW~=!-K&#Qh^E@OMG*d3gh5PnBd71wV0C;?Qq~SLx z%aWojNV60b<#ay%4gm1{@=S3l$cl_OiHYK<)>nB2cdB;!LwQ!cLM^}^Y;DDu#%V3U z*SA3dKtLoBY-l+I2kg<}PLAjtktQi^ZP!;IAo4!e#u(99IUbJK@C^`0G0n2cYPG72 z@*Tj}DgdU_sg$lnV?`3d&wZB5W&J<6-uzd+0v>$5&LJ9SrT_o{07*qoM6N<$f~>~0 ADF6Tf delta 404 zcmV;F0c-xA1DpdPiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe^W_B zK~y-6&67KB0znLhzsd5HASmQ0bX0VlfunE-3Tmpk039_q;06>FNHi?F!?15wP7wux z*hQeEh$T0_J)iBd4FAp4qoCGW_WM1q>*BgDv)QaPzcetJOk}ZGV6DA)zu#v*pFb>q zW8?8ydcB?iH{NQsWH1;=(VMp-e{r|lF&d5T^x<%bwYIQ$rAU;fu-$IaT66tJ>-CyQ zMbCrU?`@Q$*lafVzK`$w7-LAClv=&^8mL~a<2Vi~RY)S7qce?WgEUW{2LW_GI#erF z@;oQYGvXvhlyE#9UjqSjKf7e-j3i44qmUpBN^=XhW{<_20Z5bL(MmzaYBP6w9LBGK zRHQJz;ou%Hp1~e1!6_h)Vw%z{2MNfJ18A+4go1bQF#b0v3_@yojn!&Zcp{gM6ex9d yd(-Ju)7uEWF-uc!(D0000~!=>-7})m917w2ZMp;{Z3xk?RJbtqXKw191@0ML9gY7o1<*E zTZ}Qh&S1S>lSrX~BB0f7lSsy9vmpoqf*`fotEJrg_?mdj=NKgbvVHNF50IJsGq!}zlR0000||I5N?G}75@ zMjXet>~_0Mr_;B?A7VHhYNyjt;2|50hW2_rb)E5C;%2j9Fc>`P{eGV~j-A6RF7e_i z>-8FA4EJ}mTrSDPX~+#~G@E2nuv)E%qKGJpu-1}^e-hMcXuB`*rH%N6l`j;B*O5J0=#CeL#&*DL8cBT3Vjz0R#2UTg*+JDX_Ax!RSRKnExX;0y|of_^7}F-8LQh<<551Em8YiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde_TmK zK~y-6rIRsk>OdHTzkdxTk;sdXI7E6nDmu=?Q}W{+)cCD)LyTre?`415}VD2!C+7_?)UpR=SqC7NL-AvUatv)fZsb< zE|;WI3Q#s^zP*u3&T6$HiXx&Y!dgozir;8FXHc)zI7?0{ITxd(qP)DmlIar(0RFtc z<9QycN|xuOmn-6V98ag`3;WqG(w*fd*Z2E@ub9^o*kdON^ z9h_rtE$w#uPME}TwSj&W1poo5=fd7vcDo&WYdJW_>3AfGV|*Z z!N6Bxu~?KG48ZRc0ORpk8fx&>P|pQlh53A5{SS(l{}q1$N}0k#CFQPD00000NkvXX Hu0mjfQUJAj delta 410 zcmV;L0cHNB1EK>ViBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe_2UH zK~y-6&66>1!cYu`KPM1c35vKycQz(A&cIQ)0|PVDy8s(AH(>9;z<|U;L>?(51QK_s zsGxm8LhVpXUTnY5zidDFZzlJW#u(jfHiThF7>10;2yjQ$6wy*beK#g zcbnhXU@*{jyRE>D*XwodcDw3&f8)7=>-Cy`zyBlN>-C7^*x9_|3Z6V=wOV0};d(}k z#ez(ng502bqd_JG%jJ?Niin~JYb}{5L9O-}s9LFTl!8nOPM(s9^7Q;nt`8^zcxg8A zeIHdNFAB2L8S#Dghr?qafL5zTp68s-XVPOvlBT7#&aJ(dYz81Z9?L=caE4y|0@_*o zqc}~HQcwjzUT-hFS_nI9*>1P&tmQq9IqdhONkX9R!~RqRdT{__j0EZteFFt5%;$3_ z>1##;B3FNJG#W`wJp%Qp7DAxHY&N_9&#u+{%KifK0hfNq{ZpJX-~a#s07*qoM6N<$ Ef{bLmGXMYp diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png index d659fdd2fd0c54d2e31c22affa403e221d57822d..4ece6a899a945d43ce9c7d255da9c62858c78f62 100644 GIT binary patch delta 415 zcmV;Q0bu^G1E&KaiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde_lyM zK~y-6rIWvE!cY{4zx=V2gG)s48Jx1&K?gzV8~7Go-FyI_!0B$C#6@r`bm(RVadiy_ zuaSg+1e16>Db~bV+5>0#-5=jM+;a~6GqigTLI}0n?eKjc-}f1h$A#WPaWopK*=$A> zMVD+gn@lE?y9F;X7z~tc+Y0!Wf8}ynwcBlV>(_6E&1OTt-_L=&-7ZlS<#h8_n73L~ zmP>>XT>rs(y~b%Yz;S*C7?#Df)1k6h5Cj215D#Uw_cBUyCs&A zSW2|x5lW@U0Dw}hh6$v)jsfUdh91XoIQ$L(@Kmpp0!fx(Bnh}~p)WUubyUiGOemN_ z4vRM&ejolcAI;0*X{d;tJ?w)NKd)`kE8002ov JPDHLkV1ng;x0wI{ delta 423 zcmV;Y0a*U01Fr)iiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe`ZNU zK~y-6&6B@s!cY{4zx=V2Lzal(GdN|lLmdiI-@v!%>gEIZ1WtGBBw2)Rg$~`Cp>%Z> zgV#txK!QoU9ZHMhjo8wm2hQ?4=YHpK&pGhl%s3YmLa6n6O%z2$QN(02sm!kojK^a& zo6Shm^xHd~4%6xMZ1E!-4u{I~e>?>odA(j&-ELRu-k3UZxm+?B3{Lc3uSc4u+TylO ze7w2Ad3!?$!Qmgx=W~K~8-n06kmb7gx3@U2uf%ao9LFR{!i(oYmR;VF?Yh{O#Y4YO zwpx)%NhT%6ZU?p6+(u-*O)1aQ@AQ2=>aV&yq3eHN9u+Nl*% zR?{n{rUjK!l851mzK`Rdf$pB4DZ-H5VnH5;6jD+~5h_XW-ruz#8$f+-E&v7?LI~sD zanxg@L9tpeu!ckPlbzw)NRT Rgn|G7002ovPDHLkV1k7Q#18-f diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png index 7a1f8df9883e8205beceed32f6f0e5d60b3419ff..15a94978f6548096807531ffcc0377dc1f406548 100644 GIT binary patch delta 433 zcmV;i0Z#t11GobriBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde{V@d zK~y-6rISr+B0(62pHgSSK!>1Cf)@ycklDnYD|ep3qqy?`p1@UIK-_qZ9ta5`5Hko9 z&}qBupK2W2zse#rV(fMdlMlYlTQ5(2RrMBpu*ALvDW!2;7o`+RDcbFJsy9_^wOXdv z>!G#Ybfr?E)9LKpa8r#&!<5Tqe*?T}%d$+hS~a`=%&ssT4yo7c32?1eLu;MTbGyRw z`Ww$bej=r0`wsg3KGEel*!I5xRkgVnOJ<69AAem6!`be~e+eS`s-< zsxR>h+Ex3Q%yo1a5Gh6Aj1$IL5VDApfSh>^3IGB`?)xoazJNCx5sY25tC)HoaS&qN zKc-J0K!`uFmQsq0eS;^rKH(xrsk&x8jXhTbUG-d zKD|^b(Q36;HveL^T1^*=MGbs$f7`Zoxm?z!nv6;8^?FpR)o*&GQb8$YY`$p{XBX$Z zJU%0YVEK-^-7fLzF*we8AiGdtk<0V+@I(*<1VKO;hP<7fur-~mKhf@ffh-mj@+{<# znLi{M4$02vB*}Pv5WwEy0oz(L+t^@|u^8(Gi|Lfe{UHb-cXY(WvPjU3f95k{*Gw{t`3EjareH=ziV>8Hjw9U(FqFf%o-zOY+C{Hr-eUdQ3zP(SMNQ3@x z03n2xajx+DuSD*ESV~5Iz|PGbj^h|t#QFePhP|uT>w5VgwcG90d$v5yuk0@%@0pRu Vs}j4>O8@`>07*qoM6N<$0fMp##&G}u diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png index 8961cc6363c24c7cb1b732a113ee6778464de80b..2e20c783894f24570a5e67449e7ad76a370fd380 100644 GIT binary patch delta 427 zcmV;c0aX661F{1liBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde`!fX zK~y-6rIS5w0x=LqpG|(Ggb0?9Ris=XJslMtXW%Gw9Doy0`2vWBYtW~lpdcd2t`{$c z5D=_WBt*c1f|8M@`8<9ek3YjdLmXRBO1Ur$(ORRmrqya4tUV|;n@!j4cCps}WVu|X z-EJQ}@F(i^x+|4R4%o?THtQ;te~R0$m;1tKG@@3krNGr{6>DuuKie1lhg*ijAxbH> zXVCBW@%)?L0r`9m;YkLA0mc}NF~o69;XcP=@o@sc%af5AoClZLGcK+(oL@1VOre0O_7^f13m_V{?qj z{C%G8Ks@f6$(Wc(NBF+KQ#hT@4g=hmQ2-Di-kvp{=Me@Wk&ZB9!(?KaO=pbX(ms%z zjpEzZN-6O=3<-jeC>mo-jEybPOH8lVOFe_wbRhQrMWfMh+dk-YI*0$k_7(mTpOFE; V1*0W_3IG5A07*qoM6N<$0fIr3xLp7M delta 425 zcmV;a0apI91F-`kiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe`rZW zK~y-6&6B-O0znXfzdcYB#lRsF6JNldj*5J^SYS_cxty)le`?m1lkC4#j`GB`TmCSc#M>i z-5CvsL;Ujf&q0Mk9^re8MkBP=XswCknBrZY)$08OkY6C9h;eio!`e@#zyYQl1{ zOb6LV>{bD^j)_!s5ImdBQ$bk(@vwj4uTKi!_X&fLNJZ$W=IzZepUs)Ry6@<#Bd}Wq zkWz}5aYzt^M9~zjV@zy_o?`}sfpcwQ3lffh*J`!w?j7}dz2pCEx0_$dUqC(qE854i TDfK}300000NkvXXu0mjf$OXnQ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png index c80a207b0fafb1e1332017dd76ede97d9c56aa55..7b398f44bfb56fd94b4d5c79b0aeb6c46082e921 100644 GIT binary patch delta 414 zcmV;P0b%~51EvEZiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde_csL zK~y-6rIS5w0x=LqpBIuy2@xz16e-7`qoU&s9EFYpZ~`h{0MT#_Za_gnM8d8YFXmrl zogx8|-9-& ziw~Zx)oR&lwQ7MMp3CKIykVm)<)@v5MXV@Av&^Ph}z-@ezHnKkV_mWciRX1wGf7beL?`n=1f1 zBv3&jak*Tj0SI*FnGEPv3*{FZ{(m0ZX2@6<@Bx?*IS*07*qo IM6N<$g0`QqcK`qY delta 411 zcmV;M0c8HB1ET{WiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe_BaI zK~y-6&67KB!axu}pKX#z2@x0wij-r}QPFV*jzY%)I04mO0MT#_Za_gnM1s9$&GHv` zQxSn!qoAb7NYl*hyxIA|e-r1LQwU+gFhoj;l#))Tllnf@(Qda*zu!k|{jJq%m2S6t zHTjt|n@v-xR19#Y*=*L-YBghve{pTb$z(#K(YUbJ>vgo&*5nzRvHVtKJRT#2;Iv1> z;Sj(4{Buw~pTqH8Mxzl*DU?#gaZKSg$9B890p#cLTo2>JLpHWUKXTGP0dtlalm@Dz5%3S zA{kxS7mH;o$XeR;UE=#bVGt6@2sKm8=bGhW$!u!hBNxDcIVykv z$C~IPW-u67$L1VCj^*xJt(H06qh7Cf{mxE*^DFra$QQY}zX$mFAJ_l@002ovPDHLk FV1iS-zX$*T diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png index 90305870db415327424c5da962d9fd6be9cbed1f..cb92ca0747ed46de93a37e31179be900261cd1b1 100644 GIT binary patch delta 430 zcmV;f0a5<11GNJoiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde{4xa zK~y-6rIWF48bJ_-zr8b&oFJo%Eq95OXP~2^qjS%r@D3EzRQm!n5jAhX8xR{MNJ#N5 zyUX64;o!Wkf^6;(wldN*|NisMXm%I=GsLL_DW#9&7^M_SDTc#grMFV-_xpZ49^;%l zWUJL;G#Z_3c!*xF=bO!@2i|18e_r?PcH1BOgJWU2T+;1!OW;nYgLAH=UmOcRJ~vn_ z7Dy?1y@T0o#<$uf({q5R(I5&#=JPqm7>qGkYx(}^3%epbKf%|l2BKCY5}@}2oqJ5~ z*^3R^(grF305?&D4+8=Z6a{|2Cl5llY4$zP6c<17ht=F6#6xC@jOMS3QChQFTWsQRS;n7T84&y{yh8{8 zDW$kiG>=N5j7D3FO%i_RDbwk+^ppdD*HZut1_SZSt+-D#51D2Dv}Q7yRR4qH;*Z7) YDQ3f3MD!Yr00000NkvXX1g=70g4IyM#Q*>R delta 423 zcmV;Y0a*UE1Fr)iiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe`ZNU zK~y-6&6B}y8Zi)tKktT0O;FIbQE!QqXW+((8@Jwh6mC2KPr%79fRHL)gEv44YLSqV zb!^A%78W+{DHRc3M3f#n(p>(T`DQ$};eRu6EGVV)X_}&xLMg>?IIPUC3=9SXKbcH$ z&i(aPtHo$EI@BxnT3Nka&CE zV6j*rrDT6cv)PR6+GnPxf|5pqB#xQS=NMx!#$c`G=F?$h{BB1P#cZww6@u1Ks5r*(N+y@M!nBB{7-@m7=uf>Dgje4wvWr+J-?9zz@8CbpR=) zxLau+l|mVfwidfu@w3R7PN%^yB3?n?5eEtVe&6rEqw#or{GaVl^C9~ekUz7B%YO_A Rpwa*U002ovPDHLkV1hbX!T|sP diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png index c21db4157bc81194a7980fa73e2cfd885b0d35c4..c7d9463dbea0feec5d8696002c411ec01ec65ceb 100644 GIT binary patch delta 418 zcmV;T0bTyB1F8cdiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde_=^P zK~y-6rIWvo+CUJ8Kd*g>k`NGgc@sJ+I=bt56yAY?n#wOgbE4)AcmoOwBpR>1>ow~? z`0NySL3b>OL>XzC-~Q&C(P$R_GrU_5VHmbi6d|QVO37lexaz$s&StZAwOV0}Ip=UV zWVu}4Yvi#k&u+IvDTPuBtu4A9R$QMb$^x6)t3GEdsZMV(cq#JYK0xb~ zBu*ToJzC15boAhb_Iw=Ac%F@OR9_(@NfIZdIwdn1xy`AM?h?hH!e=}WAPhqe-4L3>zeUh;(otpJRX10N23v1Yo~eW5`W(RV7J>L zgy8LsHk%FMFQ>N~)a!K#{DAFti&6@u6lt3B?KY$-zF!aO_PX4JH+c9oK~3#fR1{FP zw6xcQ0PgPZ2>bv`%TxQr@mS-BJ_mF7HxR(X?}ryibEK?FOkvLUIxm-{d)e86vM8?y zrD;YICm(ckFjQrAJ;=lbDpANtlEevFnvv_A!W1+I_pyC|KUn)W0fZ1b%L P00000NkvXXu0mjfWE#IA diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png index 1d1334635620d17b9f7a97f35fde08d0709662ab..9feec8b65c71ccd27eef0ae42e45aa509b5eaf5a 100644 GIT binary patch delta 402 zcmV;D0d4-C1DXRNiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde^E(9 zK~y-6rIRsk!axv3-`d6m$pmp0Ix0HOfN~P5h@OI)Y8y&AYHq*{C@7F`)aJ-+Yb`##g@wA5QFj>ltJEEa@e_{?s%%X~h6 zdEqmL!=ZFK9RYr&=XuiW^(61NfAYd^w_`9E6u|v{pD+vyx|0`fmayG!(OUC!2J7{j zL=_q+0=#CEL}hF?8-gGp2m*{TBua4W^=g2c<8W0OiORTHLZXDXMuSu;bO7+)YGK

;Yx84tw-T(^u5+vYvqbXkOR1)SglqCf(7ui w3xLUFqUvJdibX9`xT07tm*xK;U;Nkj0+FG-SrvkBhX4Qo07*qoM6N<$f*d@xM*si- delta 406 zcmV;H0crl41D*pRiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe^p6D zK~y-6&62xr!axv3&)PhK#6x@w9TgqlfcOboDwLjrn#xT|I%>Xzf&z&Ki(L%Z80<-r z1c6v1IZBZ$ZF6V#%xLezf0KGu^gK_t+bzED!11i|gJ+ihmE z*~{S%8V-ljYPAG-IMr%ZI-QQ#f9^OobF-C=eZnsMi1lHjNn|X1B^?HrxdECFz za=9c{)`je#YOO}BQdX-KT5Gh{7-NW)P%4-6fr^C!XO$AGl#3(8N_eYONF>Kb0QE)# z*L4vQk~Ag0Tv4ve@pQ@u0%$gyBuT>MdL=r?gi(~)YfbHtkqkh5KIa4NY>j#HqcF?| zDyE9PG3<6b_Qr4s0#3&xQ5aGZ`^Q!Q{Smh)KHk5)!C)YjW*ze#z1D_M?^!GsR+4iM z_<;aSCKFW_hmtrHQ${C!oc=eRm^e7ytkO07*qoM6N<$f(VVW AMgRZ+ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png index ca1e8e89e9696083d76ebb4883d6b46e35b135ef..eaf2ddeecebc09e63746b2e4db4243d144dc5b3d 100644 GIT binary patch delta 427 zcmV;c0aX5`1F{1liBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde`!fX zK~y-6rIWF4A~6t#KO62MU5LU07e&fr&{5IRrRPz22MTH`zW~jNnm6DLD3ER=64u`J z#t;G`>r{slc2S6Kq-lQ7d^4IE!+)AM^`MmUT5F6k7-JX?hlR0)V!z+_wdS;7Z!Q7QBDvc!*HlHGoX zEahjI0|3sXM?*^IAc+1|{?RP{`zI`aze}YZyDJGkj z%^3ij5}P;|xLU0X0p&mV!*Sdr#PY!q1OYnI#3sfjmgi^3dbK85=I=oMOT0%20Hu_8 z3N=xriQ@!oQ(WqZA5*5&X>JV?;A0m6gTX*N{*8DFHOmKsUL;H=lj47HocvvT2l{=x V?Wq&PIRF3v07*qoM6N<$0fN|yz7YTb delta 414 zcmV;P0b%~K1EvEZiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe_csL zK~y-6&67P&0znjjzgRxB&$P24#1aS%&|> zjui&NERks8OJ4JSzBlh@;J=A;$ti>|K@cFNL`q4!-A;^8bhKJ6)9dxnT7PS$QlZo7 zTr7SfjYh+i%Vh(cXeN^})oRt)e{x)#aXcPVuh-A)wOS3WwY7NKW-PrF7>z~<4!CfZJ?L&&2dzbBQi<`2~ z+6n^57xK7{i{pSXF}rxjX0v9sT3!bNC_WX5P0T*tv)yg+eS2Gwur)PRbcqS8dc?5nyC_~g#F`H=?^99q1{f=CKH;g$bfDpp@90mA(Kp0L@ zDndt^@FSw%?_1aA96+x)X93M-(;VMXx7)q^&yHX7EBOn^7r(E>Gu-lRN&o-=07*qo IM6N<$f(sq96aWAK diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png index 59d0a64a2fb0be0f2c930c34f446911e60fd6e59..056578a18d1a33fd123a5c44c882b9af0e01faa8 100644 GIT binary patch delta 399 zcmV;A0dW4F1D*pRiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZykf2ET> zZUQk7MxPf#h=K?SN1>ylqoe02+<}6c$`_!CsJQ_*prAma!QlO2*So+vMI=Jji;^fK zP4oHloAHbc{|s^OKuT$MyB$g?lu}Hm(^7A#I3ADfd_E@(!)tcCU1qb{-GbK`jYhW9 z=~&=fHX04v>-B8W?-hmZcFS-$e{{h8exEQ59lcr<>dhxMn+;M*ZfCGst$28@{S0Wn zH1UMTdc8(#jn*39_o+1=xftgK<$!9XiU3TWQqNP8JcZ1|mW~*vQ zgfKyZK4|tzp%0qC4~W8uB#t>9v+@oG2r)ni04b#~LBd|`zW`B07NsngOJ@%rz-<=* tlgUIReu4=;GYbui#iINl6fgfZJ^&$%#vpC75xf8Z002ovPDHLkV1ix~s$Bp8 delta 399 zcmV;A0dW4F1D*pRiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtaf6bFS zZo)tihCdrZh++{EjzUL8M@P?5xB~?>)n0%mqUHwNfPw;vhK2P5du_m*A_@VqMnOrD zk^W{L-^|Wv;lG)4D=368>-8EbB~nU8qfudgVPG&An8{>97=|acS}n%o@y+HJ*6;UC zv)MGjg*?wQ?RMMPYFwLhwOY~ZfAy~Xolb`^46V(}HfOc=#B#Yr2*LS|=JPoZ&y}Bp zYA-ch$7Qitpp-%>h41@Ryho1O`m$nBxm3mhbe>YpQ<6M|%*7O}+6n@wzt$f=-dzR<`3}JO$g=>hy=2?JkP`TeSF`i)9IvUQ_Xg} zo%H*Cq?Ailt5v$)?#718YBrmRf8#g_@I$t3C$(BFSr-_04n==N@w@H49WySKoA6kVaUaq+uCd<)0PK}4ayyV$S#ontPGwL9P%8c%0H9d5i07cca;4@vHD|oS zEKCmqd`j~K24Ff_AX6Y8QOwLUeFN~+JH{U?qCg`<%`DWsN1Di6;9gg@1B4Kn=etuT zV}(CfOeYJ1iRSU<0M~VmQQkP)tyU{por7MlxBVadrM>`-PO(##v)G3K0000f=-dbJ<_GZBO$g=-hy0ylNEAgJUc8Wc))70%^&Ff6 z6pwF+wIP}(D4jqtkKVR&>>z+0&mp%3d7ULUGvsszT>!0<-+=&%C5L1NbmmKXW>)rE zUu_z#9{5o96Inr%@f>A=y~hdDz;0p%J$8?fBTXC{RAiV&hPT)d2Xp+Z-OWKlh|JUN z3FDDQjx>|;oN#P-xZcP2ed~&>-J52!nJ)gLZnwMnp8a`z0(ii&Q%dwWaR2}S07*qo IM6N<$f^EUK3jhEB diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png index cb2b2d545e76b30c2713def15febd44e906d9498..34fd113b5c9a3df8084ddab419e664c7d974c755 100644 GIT binary patch delta 361 zcmV-v0ha#t0`USNiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyde<(>r zK~y-6rIRs^gD@0CC$K<@AklIRL`Q+>I0HvX#{oD2l`jybAs3)WT!7vUNFbWn*m9~x zNdSR%NBYh9&$DcQ1OL=%Yk?4=+O|d4b?CYdd7iKKu9{hvsiG(_j^kWG5a4#ZZEiU0 zdc7*&_Z5JTx?CpFxGt6^Z}6&Pb%Oia_X58#}yLOAEg0G{W8F^1>!KMBSd7-MtT zw(WfYA>;YXNr4%c;2Rn=mYH)lIdQ}sRv_xpYSAN)lxUx~C`@v4_<00000NkvXX Hu0mjfg6o*) delta 365 zcmV-z0h0dl0`&qRiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtTe=JEv zK~y-6&66>XgD?<9e_(+WL88quqI4-xx}1Td(B%M}AeAqG(!d4iQ7(|)O)NR0!NwzR zwJ2y!M5^79e)GrkMw;;e|1DPUl8iC?cswA4fDi(g%VqZcY@#R%TU8aht{ZhY98i|! z+vbzV^W5(DdkbKq&1Ped$D?)Ce|RpFbB-*_e)*@<30>DYn}4~?+wF!VNx&Gx>x}OA z`)8mq4AC?Vk|cqY5>iS$pHFbk5d^_G3GN60Ib(*7-Qi3K8!K55MX9&N~zg`VHlQ!wAN0T*7`HhZnuL{LkfN0Ln#HN z)Ch^=csYnMwo21<0?}GyyWOH~Tjz2f2h_1g2>(lqLWPX@60#ZoqyqTky zf&G=naU53Ppx5j1bUozaWdp!ULpAZr!)F>PB~nT}f6wFb%Ej6@uWSG~KEX-^+$Nsk zJb+*Zv)Q~kcCZBiAeF&7^kE7Fi;NwC?{5hJNS#4^3VS}p{m^Cz*#gRoWHK=!2B0s2 z(a>xjPw1OlGy!*SmkWrPgOmqjMSlc0os0npwPvMK(beob1V39ScTVYcyGDJax9jz~ jUiCq%8`awU5B?J01|5|b_tq&h00000NkvXXu0mjfthSJQ delta 340 zcmV-a0jvIw1CawEiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJtT2uMjp zK~y-6&5=Agf38{!h(g#SQ0XMo{Im1TWM>Bco9(O%I*y|Ug8@Pagb*|ujmYryI}R`g=Ah*HW}JZ=*2 zvme-BX&lF4@sE1F9#7XpE?zbSS!t*yUU~RTBc()2e~IULJYKn2`^JXMAdXM45&^e~ zXE+Za2q6q-kl4W%Ab?Z`>(GZO5X?Px1irr|2q1L^@hR;25ceY?5HU5B7Y(17VMb72 z0;Az-U_7C3p1v7$_jWmli5XCNFjn+OaMQ^cL6PfTsZ?||`wqeH)XJSxy4|iZXYJk8 m>vg@j9!ITKYx6t%bNdE>M3one@JB!Z0000 Date: Tue, 26 Aug 2025 14:18:07 -0600 Subject: [PATCH 310/323] https://imgur.com/a/IBLwDde --- .../recipes/loader/GenericRecipe.java | 12 +- .../java/com/hbm/items/bomb/ItemFleija.java | 4 +- src/main/java/com/hbm/items/bomb/ItemN2.java | 4 +- .../java/com/hbm/items/bomb/ItemSolinium.java | 4 +- .../java/com/hbm/items/food/ItemLemon.java | 34 ++- .../com/hbm/items/machine/ItemSatChip.java | 9 +- .../com/hbm/items/special/ItemHotDusted.java | 6 +- .../java/com/hbm/items/special/ItemRag.java | 9 +- .../hbm/items/tool/ItemSwordMeteorite.java | 96 ++++--- .../items/weapon/ItemCustomMissilePart.java | 88 +++--- .../com/hbm/items/weapon/ItemMissile.java | 18 +- src/main/resources/assets/hbm/lang/en_US.lang | 261 ++++++++--------- src/main/resources/assets/hbm/lang/ru_RU.lang | 266 ++++++++---------- 13 files changed, 387 insertions(+), 424 deletions(-) diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index 2c53d35dd..53a0bb7a2 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -118,9 +118,8 @@ public class GenericRecipe { // autoswitch group (two lines: label + "Enabled for") if(this.autoSwitchGroup != null) { - String groupNameLocalized = I18nUtil.resolveKey(this.autoSwitchGroup); - list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.recipe.autoswitch") + ": " + groupNameLocalized); - list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.recipe.enabledFor") + " " + groupNameLocalized); + String[] lines = I18nUtil.resolveKeyArray("autoswitch", I18nUtil.resolveKey(this.autoSwitchGroup)); + for(String line : lines) list.add(EnumChatFormatting.GOLD + line); } // duration (seconds) @@ -140,12 +139,7 @@ public class GenericRecipe { ItemStack display = stack.extractForCyclingDisplay(20); list.add(" " + EnumChatFormatting.GRAY + display.stackSize + "x " + display.getDisplayName()); } - if(inputFluid != null) for(FluidStack fluid : inputFluid) { - String mB = I18nUtil.resolveKey("gui.recipe.mB"); - String pressurePart = fluid.pressure == 0 ? "" : - " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU"; - list.add(" " + EnumChatFormatting.BLUE + fluid.fill + mB + " " + fluid.type.getLocalizedName() + pressurePart); - } + if (inputFluid != null) for (FluidStack fluid : inputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU")); // output label + items list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.output") + ":"); diff --git a/src/main/java/com/hbm/items/bomb/ItemFleija.java b/src/main/java/com/hbm/items/bomb/ItemFleija.java index 623b12d9b..06b8c0d68 100644 --- a/src/main/java/com/hbm/items/bomb/ItemFleija.java +++ b/src/main/java/com/hbm/items/bomb/ItemFleija.java @@ -2,8 +2,10 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; import com.hbm.util.i18n.I18nUtil; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; @@ -14,7 +16,7 @@ public class ItemFleija extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); - list.add(I18nUtil.resolveKey("item.fleija.name")); + list.add(ModBlocks.nuke_fleija.getLocalizedName()); super.addInformation(itemstack, player, list, bool); } diff --git a/src/main/java/com/hbm/items/bomb/ItemN2.java b/src/main/java/com/hbm/items/bomb/ItemN2.java index feffaf6bf..da909b8d3 100644 --- a/src/main/java/com/hbm/items/bomb/ItemN2.java +++ b/src/main/java/com/hbm/items/bomb/ItemN2.java @@ -2,7 +2,9 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.util.i18n.I18nUtil; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,6 +14,6 @@ public class ItemN2 extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); - list.add(I18nUtil.resolveKey("item.n2.mine")); + list.add(ModBlocks.nuke_n2.getLocalizedName()); } } diff --git a/src/main/java/com/hbm/items/bomb/ItemSolinium.java b/src/main/java/com/hbm/items/bomb/ItemSolinium.java index f921d49e5..9951a7111 100644 --- a/src/main/java/com/hbm/items/bomb/ItemSolinium.java +++ b/src/main/java/com/hbm/items/bomb/ItemSolinium.java @@ -2,7 +2,9 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.util.i18n.I18nUtil; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,7 +14,7 @@ public class ItemSolinium extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); - list.add(I18nUtil.resolveKey("item.solinium.name")); + list.add(ModBlocks.nuke_solinium.getLocalizedName() + " name"); super.addInformation(itemstack, player, list, bool); } } diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index 482cb37bc..2d211ff2f 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -35,20 +35,24 @@ public class ItemLemon extends ItemFood { } if(this == ModItems.med_ipecac) { - list.add(I18nUtil.resolveKey("item.med_ipecac.desc.1")); - list.add(I18nUtil.resolveKey("item.med_ipecac.desc.2")); + String[] lines = I18nUtil.resolveKeyArray("item.med_ipecac.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.med_ptsd) { - list.add(I18nUtil.resolveKey("item.med_ptsd.desc.1")); - list.add(I18nUtil.resolveKey("item.med_ptsd.desc.2")); + String[] lines = I18nUtil.resolveKeyArray("item.med_ptsd.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.med_schizophrenia) { - list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.1")); - list.add(""); - list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.2")); - list.add(I18nUtil.resolveKey("item.med_schizophrenia.desc.3")); + String[] lines = I18nUtil.resolveKeyArray("item.med_schizophrenia.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.loops) { @@ -64,15 +68,17 @@ public class ItemLemon extends ItemFood { } if(this == ModItems.pudding) { - list.add(I18nUtil.resolveKey("item.pudding.desc.1")); - list.add(I18nUtil.resolveKey("item.pudding.desc.2")); - list.add(I18nUtil.resolveKey("item.pudding.desc.3")); + String[] lines = I18nUtil.resolveKeyArray("item.pudding.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.ingot_semtex) { - list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.1")); - list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.2")); - list.add(I18nUtil.resolveKey("item.ingot_semtex.desc.3")); + String[] lines = I18nUtil.resolveKeyArray("item.ingot_semtex.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.peas) { diff --git a/src/main/java/com/hbm/items/machine/ItemSatChip.java b/src/main/java/com/hbm/items/machine/ItemSatChip.java index 5f66e57a1..164c6540c 100644 --- a/src/main/java/com/hbm/items/machine/ItemSatChip.java +++ b/src/main/java/com/hbm/items/machine/ItemSatChip.java @@ -20,10 +20,11 @@ public class ItemSatChip extends Item implements ISatChip { if(this == ModItems.sat_foeq) list.add(I18nUtil.resolveKey("satchip.foeq")); - if(this == ModItems.sat_gerald) { - list.add(I18nUtil.resolveKey("satchip.gerald.line1")); - list.add(I18nUtil.resolveKey("satchip.gerald.line2")); - list.add(I18nUtil.resolveKey("satchip.gerald.line3")); + if (this == ModItems.sat_gerald) { + String[] lines = I18nUtil.resolveKeyArray("satchip.gerald.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.sat_laser) diff --git a/src/main/java/com/hbm/items/special/ItemHotDusted.java b/src/main/java/com/hbm/items/special/ItemHotDusted.java index 7ddecbbbd..0c9f3f86d 100644 --- a/src/main/java/com/hbm/items/special/ItemHotDusted.java +++ b/src/main/java/com/hbm/items/special/ItemHotDusted.java @@ -1,8 +1,11 @@ package com.hbm.items.special; import com.hbm.util.i18n.I18nUtil; + import java.util.List; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; + public class ItemHotDusted extends ItemHot { public ItemHotDusted(int heat) { super(heat); @@ -11,8 +14,7 @@ public class ItemHotDusted extends ItemHot { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add(I18nUtil.resolveKey("item.hot_dusted.forged") + " " + stack.getItemDamage() + " " + - I18nUtil.resolveKey("item.hot_dusted.times")); + list.add(String.format(I18nUtil.resolveKey("item.hot_dusted.forged"), stack.getItemDamage())); } public static int getMaxHeat(ItemStack stack) { diff --git a/src/main/java/com/hbm/items/special/ItemRag.java b/src/main/java/com/hbm/items/special/ItemRag.java index ad53fd20d..44e606e57 100644 --- a/src/main/java/com/hbm/items/special/ItemRag.java +++ b/src/main/java/com/hbm/items/special/ItemRag.java @@ -19,7 +19,8 @@ public class ItemRag extends Item { if(entityItem != null && !entityItem.worldObj.isRemote) { - if(entityItem.worldObj.getBlock((int)Math.floor(entityItem.posX), (int)Math.floor(entityItem.posY), (int)Math.floor(entityItem.posZ)).getMaterial() == Material.water) { + if (entityItem.worldObj.getBlock((int) Math.floor(entityItem.posX), (int) Math.floor(entityItem.posY), + (int) Math.floor(entityItem.posZ)).getMaterial() == Material.water) { ItemStack stack = entityItem.getEntityItem(); entityItem.setEntityItemStack(new ItemStack(ModItems.rag_damp, stack.stackSize)); return true; @@ -37,7 +38,9 @@ public class ItemRag extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add(I18nUtil.resolveKey("item.rag.desc.1")); - list.add(I18nUtil.resolveKey("item.rag.desc.2")); + String[] lines = I18nUtil.resolveKeyArray("item.rag.desc"); + for (String line : lines) { + list.add(line); + } } } diff --git a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java index 933db145a..eda062796 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java @@ -26,64 +26,88 @@ public class ItemSwordMeteorite extends ItemSwordAbility { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { super.addInformation(stack, player, list, ext); - if(this == ModItems.meteorite_sword) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.desc2")); + if (this == ModItems.meteorite_sword) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_seared) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.seared.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.seared.desc2")); + if (this == ModItems.meteorite_sword_seared) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.seared.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_reforged) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.reforged.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.reforged.desc2")); + if (this == ModItems.meteorite_sword_reforged) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.reforged.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_hardened) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.hardened.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.hardened.desc2")); + if (this == ModItems.meteorite_sword_hardened) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.hardened.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_alloyed) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.alloyed.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.alloyed.desc2")); + if (this == ModItems.meteorite_sword_alloyed) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.alloyed.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_machined) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.machined.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.machined.desc2")); + if (this == ModItems.meteorite_sword_machined) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.machined.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_treated) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.treated.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.treated.desc2")); + if (this == ModItems.meteorite_sword_treated) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.treated.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_etched) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.etched.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.etched.desc2")); + if (this == ModItems.meteorite_sword_etched) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.etched.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_bred) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.bred.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.bred.desc2")); + if (this == ModItems.meteorite_sword_bred) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.bred.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_irradiated) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.irradiated.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.irradiated.desc2")); + if (this == ModItems.meteorite_sword_irradiated) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.irradiated.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_fused) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.fused.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.fused.desc2")); + if (this == ModItems.meteorite_sword_fused) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.fused.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_baleful) { - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.baleful.desc1")); - list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey("item.meteorite_sword.baleful.desc2")); + if (this == ModItems.meteorite_sword_baleful) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.baleful.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } /* diff --git a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java index 0318b3875..29b391eaf 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java +++ b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java @@ -91,7 +91,7 @@ public class ItemCustomMissilePart extends Item { CLOUD, TURBINE, - //dummy/custom types + //shit solution but it works. this allows traits to be attached to these empty dummy types, allowing for custom warheads CUSTOM0, CUSTOM1, CUSTOM2, CUSTOM3, CUSTOM4, CUSTOM5, CUSTOM6, CUSTOM7, CUSTOM8, CUSTOM9; /** Overrides that type's impact effect. Only runs serverside */ @@ -113,12 +113,12 @@ public class ItemCustomMissilePart extends Item { public enum Rarity { - COMMON("part.rarity.common", EnumChatFormatting.GRAY), - UNCOMMON("part.rarity.uncommon", EnumChatFormatting.YELLOW), - RARE("part.rarity.rare", EnumChatFormatting.AQUA), - EPIC("part.rarity.epic", EnumChatFormatting.LIGHT_PURPLE), - LEGENDARY("part.rarity.legendary", EnumChatFormatting.DARK_GREEN), - SEWS_CLOTHES_AND_SUCKS_HORSE_COCK("part.rarity.strange", EnumChatFormatting.DARK_AQUA); + COMMON("item.missile.part.rarity.common", EnumChatFormatting.GRAY), + UNCOMMON("item.missile.part.rarity.uncommon", EnumChatFormatting.YELLOW), + RARE("item.missile.part.rarity.rare", EnumChatFormatting.AQUA), + EPIC("item.missile.part.rarity.epic", EnumChatFormatting.LIGHT_PURPLE), + LEGENDARY("item.missile.part.rarity.legendary", EnumChatFormatting.DARK_GREEN), + SEWS_CLOTHES_AND_SUCKS_HORSE_COCK("item.missile.part.rarity.strange", EnumChatFormatting.DARK_AQUA); private final String key; private final EnumChatFormatting color; @@ -207,29 +207,29 @@ public class ItemCustomMissilePart extends Item { try { switch(type) { case CHIP: - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); break; case WARHEAD: - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.type") + ": " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.strength") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1]); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.weight") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.type") + ": " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.strength") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1]); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.weight") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); break; case FUSELAGE: - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.topSize") + ": " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.bottomSize") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.topSize") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.bottomSize") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); break; case FINS: - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); break; case THRUSTER: - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.fuelConsumption") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.maxPayload") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelConsumption") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.maxPayload") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); break; } } catch(Exception ex) { @@ -237,12 +237,12 @@ public class ItemCustomMissilePart extends Item { } if(type != PartType.CHIP) - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); if(this.rarity != null) - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("part.rarity") + ": " + EnumChatFormatting.GRAY + this.rarity.getDisplay()); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.rarity") + ": " + EnumChatFormatting.GRAY + this.rarity.getDisplay()); if(author != null) - list.add(EnumChatFormatting.WHITE + " " + I18nUtil.resolveKey("part.by") + " " + author); + list.add(EnumChatFormatting.WHITE + " " + I18nUtil.resolveKey("item.missile.part.by") + " " + author); if(witty != null) list.add(EnumChatFormatting.GOLD + " " + EnumChatFormatting.ITALIC + "\"" + witty + "\""); } @@ -251,7 +251,7 @@ public class ItemCustomMissilePart extends Item { switch(size) { case ANY: - return I18nUtil.resolveKey("part.size.any"); + return I18nUtil.resolveKey("item.missile.part.size.any"); case SIZE_10: return "1.0m"; case SIZE_15: @@ -259,7 +259,7 @@ public class ItemCustomMissilePart extends Item { case SIZE_20: return "2.0m"; default: - return I18nUtil.resolveKey("part.size.none"); + return I18nUtil.resolveKey("item.missile.part.size.none"); } } @@ -269,29 +269,29 @@ public class ItemCustomMissilePart extends Item { switch(type) { case HE: - return EnumChatFormatting.YELLOW + I18nUtil.resolveKey("warhead.he"); + return EnumChatFormatting.YELLOW + I18nUtil.resolveKey("item.warhead.desc.he"); case INC: - return EnumChatFormatting.GOLD + I18nUtil.resolveKey("warhead.incendiary"); + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("item.warhead.desc.incendiary"); case CLUSTER: - return EnumChatFormatting.GRAY + I18nUtil.resolveKey("warhead.cluster"); + return EnumChatFormatting.GRAY + I18nUtil.resolveKey("item.warhead.desc.cluster"); case BUSTER: - return EnumChatFormatting.WHITE + I18nUtil.resolveKey("warhead.bunker_buster"); + return EnumChatFormatting.WHITE + I18nUtil.resolveKey("item.warhead.desc.bunker_buster"); case NUCLEAR: - return EnumChatFormatting.DARK_GREEN + I18nUtil.resolveKey("warhead.nuclear"); + return EnumChatFormatting.DARK_GREEN + I18nUtil.resolveKey("item.warhead.desc.nuclear"); case TX: - return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("warhead.thermonuclear"); + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.warhead.desc.thermonuclear"); case N2: - return EnumChatFormatting.RED + I18nUtil.resolveKey("warhead.n2"); + return EnumChatFormatting.RED + I18nUtil.resolveKey("item.warhead.desc.n2"); case BALEFIRE: - return EnumChatFormatting.GREEN + I18nUtil.resolveKey("warhead.balefire"); + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("item.warhead.desc.balefire"); case SCHRAB: - return EnumChatFormatting.AQUA + I18nUtil.resolveKey("warhead.schrabidium"); + return EnumChatFormatting.AQUA + I18nUtil.resolveKey("item.warhead.desc.schrabidium"); case TAINT: - return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("warhead.taint"); + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.warhead.desc.taint"); case CLOUD: - return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("warhead.cloud"); + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("item.warhead.desc.cloud"); case TURBINE: - return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + I18nUtil.resolveKey("warhead.turbine"); + return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + I18nUtil.resolveKey("item.warhead.desc.turbine"); default: return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } @@ -301,15 +301,15 @@ public class ItemCustomMissilePart extends Item { switch(type) { case KEROSENE: - return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("missile.fuel.kerosene_peroxide"); // reuse missile fuel keys + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("item.missile.fuel.kerosene_peroxide"); // reuse missile fuel keys case SOLID: - return EnumChatFormatting.GOLD + I18nUtil.resolveKey("missile.fuel.solid"); + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("item.missile.fuel.solid"); case HYDROGEN: - return EnumChatFormatting.DARK_AQUA + I18nUtil.resolveKey("missile.fuel.ethanol_peroxide"); // closest match + return EnumChatFormatting.DARK_AQUA + I18nUtil.resolveKey("item.missile.fuel.ethanol_peroxide"); // closest match case XENON: - return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("fuel.xenon"); + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.missile.fuel.xenon"); case BALEFIRE: - return EnumChatFormatting.GREEN + I18nUtil.resolveKey("fuel.balefire"); + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("item.missile.fuel.balefire"); default: return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index e8fcd6964..dbd031944 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -41,15 +41,15 @@ public class ItemMissile extends ItemCustomLore { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { // Tier localized: missile.tier.tier0, missile.tier.tier1, ... - String tierKey = "missile.tier." + this.tier.name().toLowerCase(); + String tierKey = "item.missile.tier." + this.tier.name().toLowerCase(); list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey(tierKey)); if(!this.launchable) { - list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.missile.notLaunchable")); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("item.missile.desc.notLaunchable")); } else { // Fuel localized & colored via enum helper - list.add(I18nUtil.resolveKey("gui.missile.fuel") + ": " + this.fuel.getDisplay()); - if(this.fuelCap > 0) list.add(I18nUtil.resolveKey("gui.missile.fuelCapacity") + ": " + this.fuelCap + "mB"); + list.add(I18nUtil.resolveKey("item.missile.desc.fuel") + ": " + this.fuel.getDisplay()); + if(this.fuelCap > 0) list.add(I18nUtil.resolveKey("item.missile.desc.fuelCapacity") + ": " + this.fuelCap + "mB"); super.addInformation(itemstack, player, list, bool); } } @@ -85,11 +85,11 @@ public class ItemMissile extends ItemCustomLore { } public enum MissileFuel { - SOLID("missile.fuel.solid.prefueled", EnumChatFormatting.GOLD, 0), - ETHANOL_PEROXIDE("missile.fuel.ethanol_peroxide", EnumChatFormatting.AQUA, 4_000), - KEROSENE_PEROXIDE("missile.fuel.kerosene_peroxide", EnumChatFormatting.BLUE, 8_000), - KEROSENE_LOXY("missile.fuel.kerosene_loxy", EnumChatFormatting.LIGHT_PURPLE, 12_000), - JETFUEL_LOXY("missile.fuel.jetfuel_loxy", EnumChatFormatting.RED, 16_000); + SOLID("item.missile.fuel.solid.prefueled", EnumChatFormatting.GOLD, 0), + ETHANOL_PEROXIDE("item.missile.fuel.ethanol_peroxide", EnumChatFormatting.AQUA, 4_000), + KEROSENE_PEROXIDE("item.missile.fuel.kerosene_peroxide", EnumChatFormatting.BLUE, 8_000), + KEROSENE_LOXY("item.missile.fuel.kerosene_loxy", EnumChatFormatting.LIGHT_PURPLE, 12_000), + JETFUEL_LOXY("item.missile.fuel.jetfuel_loxy", EnumChatFormatting.RED, 16_000); private final String key; public final EnumChatFormatting color; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e07656628..c84185573 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1057,16 +1057,6 @@ desc.gui.zirnox.pressure=§6Pressure§r$Pressure can be reduced by venting CO2.$ desc.gui.zirnox.warning1=§cError:§r Water is required for$the reactor to function properly! desc.gui.zirnox.warning2=§cError:§r CO2 is required for$the reactor to function properly! -gui.recipe.duration=Duration -gui.recipe.consumption=Consumption -gui.recipe.input=Input -gui.recipe.output=Output -gui.recipe.mB=mB -gui.recipe.atPressure=at -gui.recipe.autoswitch=Auto-switch group -gui.recipe.enabledFor=Enabled for -gui.recipe.setRecipe=Click to set recipe - desc.item.ammo.con_accuracy2=- Highly decreased accuracy desc.item.ammo.con_damage=- Highly decreased damage desc.item.ammo.con_heavy_wear=- Highly increased wear @@ -1240,6 +1230,8 @@ entity.hbm.entity_bullet.name=Bullet entity.hbm.entity_rocket.name=Rocket entity.hbm.entity_schrabnel.name=Schrabnel +error.generic=### I AM ERROR ### + excavator.crusher=Toggle Crusher excavator.drill=Toggle Drill excavator.silktouch=Toggle Silk Touch @@ -1269,6 +1261,28 @@ geiger.playerRes=Player resistance: geiger.title=GEIGER COUNTER geiger.title.dosimeter=DOSIMETER +general.na=N/A + +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.atPressure=at +gui.recipe.setRecipe=Click to set recipe + +gui.weapon.ammo=Ammo +gui.weapon.baseDamage=Base Damage +gui.weapon.damageWithAmmo=Damage with current ammo +gui.weapon.condition=Condition +gui.weapon.accepts=Accepts +gui.weapon.quality.aside=Standard Arsenal +gui.weapon.quality.bside=B-Side +gui.weapon.quality.legendary=Legendary Weapon +gui.weapon.quality.special=Special Weapon +gui.weapon.quality.utility=Utility +gui.weapon.quality.secret=SECRET +gui.weapon.quality.debug=DEBUG + gun.make.ARMALITE=Armalite gun.make.AUTO_ORDINANCE=Auto-Ordnance Corporation gun.make.BAE=BAE Systems plc @@ -2203,6 +2217,7 @@ item.bolt_spike.name=Railroad Spike item.bolt_spike.desc=Radiates a threatening aura, somehow item.boltgun.name=Pneumatic Rivet Gun item.bomb_caller.name=Airstrike Designator +item.bomb_part.used_in=Used in: item.bomb_waffle.name=Waffle of Mass Destruction item.book_guide.name=Guide Book item.book_of_.name=The Book of Boxcars @@ -3005,18 +3020,6 @@ item.gun_tesla_cannon.name=Tesla Cannon item.gun_uzi.name=Uzi item.gun_uzi_richter.name=Richter item.gun_uzi_akimbo.name=Uzis -gui.weapon.ammo=Ammo -gui.weapon.baseDamage=Base Damage -gui.weapon.damageWithAmmo=Damage with current ammo -gui.weapon.condition=Condition -gui.weapon.accepts=Accepts -gui.weapon.quality.aside=Standard Arsenal -gui.weapon.quality.bside=B-Side -gui.weapon.quality.legendary=Legendary Weapon -gui.weapon.quality.special=Special Weapon -gui.weapon.quality.utility=Utility -gui.weapon.quality.secret=SECRET -gui.weapon.quality.debug=DEBUG item.hand_drill.name=Hand Drill item.hand_drill_desh.name=Desh Hand Drill item.hazmat_boots.name=Hazmat Boots @@ -3054,6 +3057,7 @@ item.hev_legs.name=HEV Mark IV Leggings item.holotape_damaged.name=Damaged Holotape item.holotape_image.name=Holotape item.horseshoe_magnet.name=Horseshoe Magnet +item.hot_dusted.forged=Forged %s time(s) item.hull_big_aluminium.name=Big Aluminium Shell item.hull_big_steel.name=Big Steel Shell item.hull_big_titanium.name=Big Titanium Shell @@ -3173,9 +3177,7 @@ item.ingot_schrabidium_fuel.name=Ingot of Schrabidium Fuel item.ingot_schraranium.name=Schraranium Ingot item.ingot_schraranium.desc=Made from uranium in a schrabidium transmutator item.ingot_semtex.name=Bar of Semtex -item.ingot_semtex.desc.1=Semtex H Plastic Explosive -item.ingot_semtex.desc.2=Performant explosive for many applications. -item.ingot_semtex.desc.3=Edible +item.ingot_semtex.desc=Semtex H Plastic Explosive$Performant explosive for many applications.$Edible item.ingot_silicon.name=Silicon Boule item.ingot_smore.name=S'more Ingot item.ingot_solinium.name=Solinium Ingot @@ -3183,8 +3185,6 @@ item.ingot_sr90.name=Strontium-90 Ingot item.ingot_starmetal.name=§9Starmetal Ingot§r item.ingot_steel.name=Steel Ingot item.ingot_steel_dusted.name=Dusted Steel Ingot -item.hot_dusted.forged=Forged -item.hot_dusted.times=time(s) item.ingot_tantalium.name=Tantalium Ingot item.ingot_tantalium.desc='Tantalum' item.ingot_tantalium.desc.P11=AKA Tantalum. @@ -3310,15 +3310,11 @@ item.mechanism_rifle_2.name=Advanced Rifle Mechanism item.mechanism_special.name=High-Tech Weapon Mechanism item.med_bag.name=First Aid Kit item.med_ipecac.name=Ipecac Syrup -item.med_ipecac.desc.1=Bitter juice that will cause your stomach -item.med_ipecac.desc.2=to forcefully eject its contents. +item.med_ipecac.desс=Bitter juice that will cause your stomach$to forcefully eject its contents. item.med_ptsd.name=PTSD Medication -item.med_ptsd.desc.1=This isn't even PTSD mediaction, it's just -item.med_ptsd.desc.2=Ipecac in a different bottle! +item.med_ptsd.desc=This isn't even PTSD medication, it's just$Ipecac in a different bottle! item.med_schiziphrenia.name=Schizophrenia Medication -item.med_schizophrenia.desc.1=Makes the voices go away. Just for a while. -item.med_schizophrenia.desc.2=... -item.med_schizophrenia.desc.3=Better not take it. +item.med_schizophrenia.desc=Makes the voices go away. Just for a while.$...$Better not take it. item.medal_liquidator.name=Liquidator Medal item.meltdown_tool.name=Dyatlov Instant Meltdown Applicator item.memespoon.name=§eMarket Gardener @@ -3329,41 +3325,29 @@ item.mese_pickaxe.name=Mese Pickaxe item.meteor_charm.name=Meteor Charm item.meteor_remote.name=Meteorite Remote item.meteorite_sword.name=Meteorite Sword -item.meteorite_sword.desc1=Forged from a fallen star -item.meteorite_sword.desc2=Sharper than most terrestrial blades +item.meteorite_sword.desc=Forged from a fallen star$Sharper than most terrestrial blades item.meteorite_sword_seared.name=Meteorite Sword (Seared) -item.meteorite_sword.seared.desc1=Fire strengthens the blade -item.meteorite_sword.seared.desc2=Making it even more powerful +item.meteorite_sword.seared.desc=Fire strengthens the blade$Making it even more powerful item.meteorite_sword_reforged.name=Meteorite Sword (Reforged) -item.meteorite_sword.reforged.desc1=The sword has been reforged -item.meteorite_sword.reforged.desc2=To rectify past imperfections +item.meteorite_sword.reforged.desc=The sword has been reforged$To rectify past imperfections item.meteorite_sword_hardened.name=Meteorite Sword (Hardened) -item.meteorite_sword.hardened.desc1=Extremely high pressure has been used -item.meteorite_sword.hardened.desc2=To harden the blade further +item.meteorite_sword.hardened.desc=Extremely high pressure has been used$To harden the blade further item.meteorite_sword_alloyed.name=Meteorite Sword (Alloyed) -item.meteorite_sword.alloyed.desc1=Cobalt fills the fissures -item.meteorite_sword.alloyed.desc2=Strengthening the sword +item.meteorite_sword.alloyed.desc=Cobalt fills the fissures$Strengthening the sword item.meteorite_sword_machined.name=Meteorite Sword (Machined) -item.meteorite_sword.machined.desc1=Advanced machinery was used -item.meteorite_sword.machined.desc2=To refine the blade even more +item.meteorite_sword.machined.desc=Advanced machinery was used$To refine the blade even more item.meteorite_sword_treated.name=Meteorite Sword (Treated) -item.meteorite_sword.treated.desc1=Chemicals have been applied -item.meteorite_sword.treated.desc2=Making the sword more powerful +item.meteorite_sword.treated.desc=Chemicals have been applied$Making the sword more powerful item.meteorite_sword_etched.name=Meteorite Sword (Etched) -item.meteorite_sword.etched.desc1=Acids clean the material -item.meteorite_sword.etched.desc2=To make this the perfect sword +item.meteorite_sword.etched.desc=Acids clean the material$To make this the perfect sword item.meteorite_sword_bred.name=Meteorite Sword (Bred) -item.meteorite_sword.bred.desc1=Immense heat and radiation -item.meteorite_sword.bred.desc2=Compress the material +item.meteorite_sword.bred.desc=Immense heat and radiation$Compress the material item.meteorite_sword_irradiated.name=Meteorite Sword (Irradiated) -item.meteorite_sword.irradiated.desc1=The power of the Atom -item.meteorite_sword.irradiated.desc2=Gives the sword might +item.meteorite_sword.irradiated.desc=The power of the Atom$Gives the sword might item.meteorite_sword_fused.name=Meteorite Sword (Fused) -item.meteorite_sword.fused.desc1=This blade has met -item.meteorite_sword.fused.desc2=With the forces of the stars +item.meteorite_sword.fused.desc=This blade has met$With the forces of the stars item.meteorite_sword_baleful.name=Meteorite Sword (Baleful) -item.meteorite_sword.baleful.desc1=This sword has met temperatures -item.meteorite_sword.baleful.desc2=Far beyond what normal material can endure +item.meteorite_sword.baleful.desc=This sword has met temperatures$Far beyond what normal material can endure item.mike_cooling_unit.name=Deuterium Cooling Unit item.mike_core.name=Uranium Coated Deuterium Tank item.mike_deut.name=Deuterium Tank @@ -3382,6 +3366,17 @@ item.missile_cluster.name=Cluster Missile item.missile_cluster_strong.name=Strong Cluster Missile item.missile_custom.name=Custom Missile item.missile_decoy.name=Decoy Missile +item.missile.desc.warhead=Warhead +item.missile.desc.strength=Strength +item.missile.desc.fuelType=Fuel Type +item.missile.desc.fuelAmount=Fuel amount +item.missile.desc.chipInaccuracy=Chip inaccuracy +item.missile.desc.finInaccuracy=Fin inaccuracy +item.missile.desc.size=Size +item.missile.desc.health=Health +item.missile.desc.fuel=Fuel +item.missile.desc.fuelCapacity=Fuel capacity +item.missile.desc.notLaunchable=Not launchable! item.missile_doomsday.name=Doomsday Missile item.missile_doomsday_rusted.name=Damaged Doomsday Missile item.missile_drill.name=The Concrete Cracker @@ -3389,6 +3384,14 @@ item.missile_emp.name=EMP Missile item.missile_emp_strong.name=Strong EMP Missile item.missile_endo.name=Endothermic Missile item.missile_exo.name=Exothermic Missile +item.missile.fuel.balefire=BF Rocket Fuel +item.missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen +item.missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide +item.missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen +item.missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide +item.missile.fuel.solid=Solid Fuel +item.missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) +item.missile.fuel.xenon=Xenon item.missile_generic.name=High Explosive Missile item.missile_incendiary.name=Incendiary Missile item.missile_incendiary_strong.name=Strong Incendiary Missile @@ -3397,6 +3400,28 @@ item.missile_kit.name=Missile Kit item.missile_micro.name=Micro-Nuclear Missile item.missile_nuclear.name=Nuclear Missile item.missile_nuclear_cluster.name=Thermonuclear Missile +item.missile.part.bottomSize=Bottom size +item.missile.part.by=by +item.missile.part.fuelAmount=Fuel amount +item.missile.part.fuelConsumption=Fuel consumption +item.missile.part.fuelType=Fuel type +item.missile.part.health=Health +item.missile.part.inaccuracy=Inaccuracy +item.missile.part.maxPayload=Max. payload +item.missile.part.rarity=Rarity +item.missile.part.rarity.common=Common +item.missile.part.rarity.epic=Epic +item.missile.part.rarity.legendary=Legendary +item.missile.part.rarity.rare=Rare +item.missile.part.rarity.strange=Strange +item.missile.part.rarity.uncommon=Uncommon +item.missile.part.size=Size +item.missile.part.size.any=Any +item.missile.part.size.none=None +item.missile.part.strength=Strength +item.missile.part.topSize=Top size +item.missile.part.type=Type +item.missile.part.weight=Weight item.missile_rain.name=Bomblet Rain item.missile_schrabidium.name=Schrabidium Missile item.missile_shuttle.name=Reliant Robin Space Shuttle @@ -3406,87 +3431,14 @@ item.missile_soyuz_lander.desc=Doubles as a crappy lander! item.missile_stealth.name=Stealth Missile item.missile_strong.name=Strong HE Missile item.missile_taint.name=Taint-Tipped Missile +item.missile.tier.tier0=Tier 0 +item.missile.tier.tier1=Tier 1 +item.missile.tier.tier2=Tier 2 +item.missile.tier.tier3=Tier 3 +item.missile.tier.tier4=Tier 4 item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Using the power of nuclear explosives, we can summon a volcano! -gui.missile.warhead=Warhead -gui.missile.strength=Strength -gui.missile.fuelType=Fuel Type -gui.missile.fuelAmount=Fuel amount -gui.missile.chipInaccuracy=Chip inaccuracy -gui.missile.finInaccuracy=Fin inaccuracy -gui.missile.size=Size -gui.missile.health=Health -gui.missile.fuel=Fuel -gui.missile.fuelCapacity=Fuel capacity -gui.missile.notLaunchable=Not launchable! - -missile.tier.tier0=Tier 0 -missile.tier.tier1=Tier 1 -missile.tier.tier2=Tier 2 -missile.tier.tier3=Tier 3 -missile.tier.tier4=Tier 4 - -missile.fuel.solid=Solid Fuel -missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) -missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide -missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide -missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen -missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen - -warhead.he=HE -warhead.incendiary=Incendiary -warhead.cluster=Cluster -warhead.bunker_buster=Bunker Buster -warhead.nuclear=Nuclear -warhead.thermonuclear=Thermonuclear (TX) -warhead.n2=N² -warhead.balefire=BF -warhead.schrabidium=Schrabidium -warhead.taint=Taint -warhead.cloud=Cloud -warhead.turbine=Turbine - -part.inaccuracy=Inaccuracy -part.size=Size -part.type=Type -part.strength=Strength -part.weight=Weight -part.topSize=Top size -part.bottomSize=Bottom size -part.fuelType=Fuel type -part.fuelAmount=Fuel amount -part.fuelConsumption=Fuel consumption -part.maxPayload=Max. payload -part.health=Health -part.rarity=Rarity -part.by=by -part.size.any=Any -part.size.none=None - -fuel.xenon=Xenon -fuel.balefire=BF Rocket Fuel - -part.rarity.common=Common -part.rarity.uncommon=Uncommon -part.rarity.rare=Rare -part.rarity.epic=Epic -part.rarity.legendary=Legendary -part.rarity.strange=Strange - -satchip.frequency=Satellite frequency -satchip.foeq=Gives you an achievement. That's it. -satchip.gerald.line1=Single use. -satchip.gerald.line2=Requires orbital module. -satchip.gerald.line3=Melter of CPUs, bane of every server owner. -satchip.laser=Allows to summon lasers with a 15 second cooldown. -satchip.mapper=Displays currently loaded chunks. -satchip.miner=Will deliver ore powders to a cargo landing pad. -satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. -satchip.radar=Shows a map of active entities. -satchip.resonator=Allows for teleportation with no cooldown. -satchip.scanner=Creates a topdown map of underground ores. - item.mold_base.name=Blank Foundry Mold item.mold.name=Foundry Mold item.morning_glory.name=Morning Glory @@ -4110,9 +4062,7 @@ item.primer_buckshot.name=Buckshot Primer (x12) item.protection_charm.name=Charm of Protection item.prototype_kit.name=Prototype Kit item.pudding.name=Pudding -item.pudding.desc.1=What if he did? -item.pudding.desc.2=What if he didn't? -item.pudding.desc.3=What if the world was made of pudding? +item.pudding.desc=What if he did?$What if he didn't?$What if the world was made of pudding? item.pwr_fuel.bfb_am_mix.name=Fuel Grade Americium PWR BFB Rod item.pwr_fuel.bfb_pu241.name=Plutonium-241 PWR BFB Rod item.pwr_fuel.hea242.name=HEA-242 PWR Fuel Rod @@ -4166,8 +4116,7 @@ item.radaway_strong.name=Strong RadAway item.radx.name=Rad-X item.radx.desc=Increases radiation resistance by 0.2 (37%%) for 3 minutes item.rag.name=Cloth -item.rag.desc.1=Drop into water to make damp cloth. -item.rag.desc.2=Right-click to urinate on the cloth. +item.rag.desc=Drop into water to make damp cloth.$Right-click to urinate on the cloth. item.rag_damp.name=Damp Cloth item.rag_piss.name=Piss-Soaked Rag item.rangefinder.name=Rangefinder @@ -4736,6 +4685,18 @@ item.wand_d.name=Debug Wand item.wand_k.name=Construction Wand item.wand_s.name=Structure Wand item.structure_custommachine.name=Custom Machine Structure Output Wand +item.warhead.desc.he=HE +item.warhead.desc.incendiary=Incendiary +item.warhead.desc.cluster=Cluster +item.warhead.desc.bunker_buster=Bunker Buster +item.warhead.desc.nuclear=Nuclear +item.warhead.desc.thermonuclear=Thermonuclear (TX) +item.warhead.desc.n2=N² +item.warhead.desc.balefire=BF +item.warhead.desc.schrabidium=Schrabidium +item.warhead.desc.taint=Taint +item.warhead.desc.cloud=Cloud +item.warhead.desc.turbine=Turbine item.warhead_buster_large.name=Large Bunker Buster Warhead item.warhead_buster_medium.name=Medium Bunker Buster Warhead item.warhead_buster_small.name=Small Bunker Buster Warhead @@ -4985,6 +4946,17 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +satchip.frequency=Satellite frequency +satchip.foeq=Gives you an achievement. That's it. +satchip.gerald.desc=Single use.$Requires orbital module.$Melter of CPUs, bane of every server owner. +satchip.laser=Allows to summon lasers with a 15 second cooldown. +satchip.mapper=Displays currently loaded chunks. +satchip.miner=Will deliver ore powders to a cargo landing pad. +satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. +satchip.radar=Shows a map of active entities. +satchip.resonator=Allows for teleportation with no cooldown. +satchip.scanner=Creates a topdown map of underground ores. + shape.barrelHeavy=Heavy Barrel shape.barrelLight=Light Barrel shape.billet=Billet @@ -5861,10 +5833,6 @@ tile.nuke_n45.name=N45 Naval Mine tile.nuke_prototype.name=The Prototype tile.nuke_solinium.name=The Blue Rinse tile.nuke_tsar.name=Tsar Bomba -item.bomb_part.used_in=Used in: -item.n2.mine=N² Mine -item.fleija.name=F.L.E.I.J.A. -item.solinium.name=Solinium Bomb tile.oil_duct.name=Oil Pipe tile.oil_duct_solid.name=Coated Oil Pipe tile.oil_pipe.name=Crude Oil Extraction Pipe @@ -6470,6 +6438,3 @@ desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 tile.oc_cable_paintable.name=Paintable Network Cable - -general.na=N/A -error.generic=### I AM ERROR ### diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index c17266768..bb3c9c63e 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1054,16 +1054,6 @@ desc.gui.zirnox.pressure=§6Давление§r$Давление можно сн desc.gui.zirnox.warning1=§cВнимание:§r Вода необходима для$правильной работы реактора! desc.gui.zirnox.warning2=§cВнимание:§r CO2 необходим для$правильной работы реактора! -gui.recipe.duration=Длительность -gui.recipe.consumption=Потребление -gui.recipe.input=Вход -gui.recipe.output=Выход -gui.recipe.mB=mB -gui.recipe.atPressure=при давлении в -gui.recipe.autoswitch=Группа автоматического переключения -gui.recipe.enabledFor=Включено для -gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт - desc.item.ammo.con_accuracy2=- Сильно сниженная точность desc.item.ammo.con_damage=- Сильно сниженный урон desc.item.ammo.con_heavy_wear=- Сильно увеличенный износ @@ -1237,6 +1227,8 @@ entity.hbm.entity_bullet.name=Пуля entity.hbm.entity_rocket.name=Ракета entity.hbm.entity_schrabnel.name=Шрапнель +error.generic=### Я ОШИБКА ### + excavator.crusher=Включить измельчитель excavator.drill=Включить бур excavator.silktouch=Включить шёлковое касание @@ -1266,6 +1258,28 @@ geiger.playerRes=Защищённость игрока: geiger.title=СЧЁТЧИК ГЕЙГЕРА geiger.title.dosimeter=ДОЗИМЕТР +general.na=Н/Д + +gui.recipe.duration=Длительность +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.atPressure=при давлении в +gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт + +gui.weapon.ammo=Боеприпасы +gui.weapon.baseDamage=Базовый урон +gui.weapon.damageWithAmmo=Урон с текущими боеприпасами +gui.weapon.condition=Состояние +gui.weapon.accepts=Принимает +gui.weapon.quality.aside=Стандартный арсенал +gui.weapon.quality.bside=Би-Сайд +gui.weapon.quality.legendary=Легендарное оружие +gui.weapon.quality.special=Специальное оружие +gui.weapon.quality.utility=Утилитарное +gui.weapon.quality.secret=СЕКРЕТНОЕ +gui.weapon.quality.debug=ОТЛАДКА + gun.make.ARMALITE=Armalite gun.make.AUTO_ORDINANCE=Корпорация Авто-Орденс gun.make.BAE=БАЕ Системс @@ -2359,6 +2373,7 @@ item.bolt_spike.name=Железнодорожный гвоздь item.bolt_spike.desc=Излучает угрожающую ауру, как-то item.boltgun.name=Пневматический заклепочник item.bomb_caller.name=Устройство для обозначения авиаудара +item.bomb_part.used_in=Используется в: item.bomb_waffle.name=Вафля массового поражения item.book_guide.name=Руководство item.book_of_.name=Книга Вагонов @@ -3257,18 +3272,6 @@ item.gun_uboinik_ammo.name=Дробь 12x70 калибра (LEGACY) item.gun_uzi.name=IMI Узи item.gun_uzi_richter.name=Richter item.gun_uzi_akimbo.name=Акимбо Узи -gui.weapon.ammo=Боеприпасы -gui.weapon.baseDamage=Базовый урон -gui.weapon.damageWithAmmo=Урон с текущими боеприпасами -gui.weapon.condition=Состояние -gui.weapon.accepts=Принимает -gui.weapon.quality.aside=Стандартный арсенал -gui.weapon.quality.bside=Би-Сайд -gui.weapon.quality.legendary=Легендарное оружие -gui.weapon.quality.special=Специальное оружие -gui.weapon.quality.utility=Утилитарное -gui.weapon.quality.secret=СЕКРЕТ -gui.weapon.quality.debug=ОТЛАДКА item.gun_uzi_ammo.name=Патроны кал. 22LR (LEGACY) item.gun_uzi_saturnite.name=Сатурнитовый Узи item.gun_uzi_saturnite_silencer.name=Сатурнитовый Узи с глушителем @@ -3313,6 +3316,7 @@ item.hev_legs.name=Поножи H.E.V Модели IV item.holotape_damaged.name=Повреждённый голодиск item.holotape_image.name=Голодиск item.horseshoe_magnet.name=Магнит-подкова +item.hot_dusted.forged=Выковано %s раз(а) item.hull_big_aluminium.name=Большая алюминиевая оболочка item.hull_big_steel.name=Большая стальная оболочка item.hull_big_titanium.name=Большая титановая оболочка @@ -3432,9 +3436,7 @@ item.ingot_schrabidium_fuel.name=Слиток шрабидиевого топл item.ingot_schraranium.name=Шрараниевый слиток item.ingot_schraranium.desc=Делается из урана в шрабидиевом трансмутаторе item.ingot_semtex.name=Семтекс -item.ingot_semtex.desc.1=Пластиковая взрывчатка Семтекс H -item.ingot_semtex.desc.2=Эффективное взрывчатое вещество для многих применений. -item.ingot_semtex.desc.3=Съедобно +item.ingot_semtex.desc=Пластиковая взрывчатка Семтекс H$Эффективное взрывчатое вещество для многих применений.$Съедобно item.ingot_silicon.name=Кремниевый брусок item.ingot_smore.name=Слиток с'мора item.ingot_solinium.name=Солиниевый слиток @@ -3571,15 +3573,11 @@ item.mechanism_rifle_2.name=Усовершенствованный винтов item.mechanism_special.name=Механизм высокотехнологичного оружия item.med_bag.name=Аптечка первой помощи item.med_ipecac.name=Сироп из рвотного корня -item.med_ipecac.desc.1=Горький сок, который заставит ваш желудок -item.med_ipecac.desc.2=с силой извергнуть свое содержимое. +item.med_ipecac.desс=Горький сок, который заставит ваш желудок$с силой извергнуть свое содержимое. item.med_ptsd.name=Лечение ПТСР -item.med_ptsd.desc.1=Это даже не лекарство от ПТСР, -item.med_ptsd.desc.2=это просто рвотный корень в другой банке! +item.med_ptsd.desc=Это даже не лекарство от ПТСР,$это просто рвотный корень в другой банке! item.med_schiziphrenia.name=Лекарство от шизофрении -item.med_schizophrenia.desc.1=Заставляет голоса исчезнуть. Хоть на время. -item.med_schizophrenia.desc.2=... -item.med_schizophrenia.desc.3=Лучше не принимать. +item.med_schizophrenia.desc=Заставляет голоса исчезнуть. На некоторое время.$...$Лучше не принимать. item.medal_liquidator.name=Медаль Ликвидатора item.meltdown_tool.name=Аппликатор мгновенного расплавления Дятлова item.memespoon.name=§eЗемлекоп @@ -3589,43 +3587,29 @@ item.mese_axe.name=Месе топор item.mese_pickaxe.name=Месе кирка item.meteor_charm.name=Талисман от метеоритов item.meteor_remote.name=Устройство для вызова метеоритов - -item.meteorite_sword.name=Метеоритовый меч -item.meteorite_sword.desc1=Выкован из павшей звезды -item.meteorite_sword.desc2=Острее, чем большинство земных лезвий +item.meteorite_sword.desc=Выкован из павшей звезды$Острее, чем большинство земных лезвий item.meteorite_sword_seared.name=Метеоритовый меч (Опалённый) -item.meteorite_sword.seared.desc1=Огонь укрепляет клинок, -item.meteorite_sword.seared.desc2=Делая его даже ещё мощнее +item.meteorite_sword.seared.desc=Огонь укрепляет клинок,$Делая его даже ещё мощнее item.meteorite_sword_reforged.name=Метеоритовый меч (Перекованный) -item.meteorite_sword.reforged.desc1=Меч был перекован, -item.meteorite_sword.reforged.desc2=Чтобы искоренить прошлые недостатки +item.meteorite_sword.reforged.desc=Меч был перекован,$Чтобы искоренить прошлые недостатки item.meteorite_sword_hardened.name=Метеоритовый меч (Закалённый) -item.meteorite_sword.hardened.desc1=Экстремально высокое давление использовано, -item.meteorite_sword.hardened.desc2=Чтобы закаливать этот меч дальше +item.meteorite_sword.hardened.desc=Экстремально высокое давление использовано,$Чтобы закаливать этот меч дальше item.meteorite_sword_alloyed.name=Метеоритовый меч (Легированный) -item.meteorite_sword.alloyed.desc1=Кобальт заполняет трещины, -item.meteorite_sword.alloyed.desc2=Упрочняя меч +item.meteorite_sword.alloyed.desc=Кобальт заполняет трещины,$Упрочняя меч item.meteorite_sword_machined.name=Метеоритовый меч (Механически обработанный) -item.meteorite_sword.machined.desc1=Было использовано передовое оборудование, -item.meteorite_sword.machined.desc2=Чтобы еще больше усовершенствовать лезвие +item.meteorite_sword.machined.desc=Было использовано передовое оборудование,$Чтобы ещё больше усовершенствовать лезвие item.meteorite_sword_treated.name=Метеоритовый меч (Обработанный) -item.meteorite_sword.treated.desc1=Были применены химикаты, -item.meteorite_sword.treated.desc2=Делающие меч мощнее +item.meteorite_sword.treated.desc=Были применены химикаты,$Делающие меч мощнее item.meteorite_sword_etched.name=Метеоритовый меч (Гравированный) -item.meteorite_sword.etched.desc1=Кислоты очищают материал, -item.meteorite_sword.etched.desc2=Чтобы получить этот идеальный меч +item.meteorite_sword.etched.desc=Кислоты очищают материал,$Чтобы получить этот идеальный меч item.meteorite_sword_bred.name=Метеоритовый меч (Разведённый) -item.meteorite_sword.bred.desc1=Огромные количества тепла и радиации -item.meteorite_sword.bred.desc2=Сжимают материал +item.meteorite_sword.bred.desc=Огромные количества тепла и радиации$Сжимают материал item.meteorite_sword_irradiated.name=Метеоритовый меч (Облучённый) -item.meteorite_sword.irradiated.desc1=Сила Атома -item.meteorite_sword.irradiated.desc2=Придает мечу мощи +item.meteorite_sword.irradiated.desc=Сила Атома$Придает мечу мощи item.meteorite_sword_fused.name=Метеоритовый меч (Сплавленный) -item.meteorite_sword.fused.desc1=Этот клинок встретился -item.meteorite_sword.fused.desc2=С силами звёзд +item.meteorite_sword.fused.desc=Этот клинок встретился$С силами звёзд item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) -item.meteorite_sword.baleful.desc1=Этот меч встретил температуры -item.meteorite_sword.baleful.desc2=Гораздо большие, чем обычный материал может выдержать +item.meteorite_sword.baleful.desc=Этот меч встретил температуры$Гораздо большие, чем обычный материал может выдержать item.mike_cooling_unit.name=Блок охлаждения дейтерия item.mike_core.name=Дейтериевый бак с урановым покрытием item.mike_deut.name=Дейтериевый бак @@ -3644,6 +3628,17 @@ item.missile_cluster.name=Кластерная ракета item.missile_cluster_strong.name=Мощная кластерная ракета item.missile_custom.name=Пользовательская Ракета item.missile_decoy.name=Ракета-приманка +item.missile.desc.warhead=Боеголовка +item.missile.desc.strength=Сила +item.missile.desc.fuelType=Тип топлива +item.missile.desc.fuelAmount=Количество топлива +item.missile.desc.chipInaccuracy=Неточность чипа +item.missile.desc.finInaccuracy=Неточность стабилизаторов +item.missile.desc.size=Размер +item.missile.desc.health=Здоровье +item.missile.desc.fuel=Топливо +item.missile.desc.fuelCapacity=Вместимость топлива +item.missile.desc.notLaunchable=Не запускаемо! item.missile_doomsday.name=Ракета Судного Дня item.missile_doomsday_rusted.name=Повреждённая ракета Судного Дня item.missile_drill.name=Крушитель бетона @@ -3651,6 +3646,14 @@ item.missile_emp.name=ЭМИ-ракета item.missile_emp_strong.name=Мощная ЭМИ-ракета item.missile_endo.name=Эндотермическая ракета item.missile_exo.name=Экзотермическая ракета +item.missile.fuel.balefire=Ракетное жар-топливо +item.missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород +item.missile.fuel.ethanol_peroxide=Этанол / Пероксид водорода +item.missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +item.missile.fuel.kerosene_peroxide=Керосин / Пероксид водорода +item.missile.fuel.solid=Твёрдое топливо +item.missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) +item.missile.fuel.xenon=Ксенон item.missile_generic.name=Фугасная ракета item.missile_incendiary.name=Зажигательная ракета item.missile_incendiary_strong.name=Мощная зажигательная ракета @@ -3659,6 +3662,28 @@ item.missile_kit.name=Ракетный набор item.missile_micro.name=Микро-ядерная ракета item.missile_nuclear.name=Ядерная ракета item.missile_nuclear_cluster.name=Термоядерная ракета +item.missile.part.bottomSize=Нижний размер +item.missile.part.by=Автор - +item.missile.part.fuelAmount=Количество топлива +item.missile.part.fuelConsumption=Потребление топлива +item.missile.part.fuelType=Тип топлива +item.missile.part.health=Здоровье +item.missile.part.inaccuracy=Неточность +item.missile.part.maxPayload=Максимальная полезная нагрузка +item.missile.part.rarity=Редкость +item.missile.part.rarity.common=Обычная +item.missile.part.rarity.epic=Эпическая +item.missile.part.rarity.legendary=Легендарная +item.missile.part.rarity.rare=Редкая +item.missile.part.rarity.strange=Странная +item.missile.part.rarity.uncommon=Необычная +item.missile.part.size=Размер +item.missile.part.size.any=Любой +item.missile.part.size.none=Нет +item.missile.part.strength=Сила +item.missile.part.topSize=Верхний размер +item.missile.part.type=Тип +item.missile.part.weight=Вес item.missile_rain.name=Бомбовый дождь item.missile_schrabidium.name=Шрабидиевая ракета item.missile_shuttle.name=Космический шаттл Reliant Robin @@ -3668,86 +3693,14 @@ item.missile_soyuz_lander.desc=А также паршивый посадочны item.missile_stealth.name=Стелс-ракета item.missile_strong.name=Мощная фугасная ракета item.missile_taint.name=Зараженная ракета +item.missile.tier.tier0=Уровень 0 +item.missile.tier.tier1=Уровень 1 +item.missile.tier.tier2=Уровень 2 +item.missile.tier.tier3=Уровень 3 +item.missile.tier.tier4=Уровень 4 item.missile_volcano.name=Тектоническая ракета item.missile_volcano.desc=Используя силу ядерной взрывчатки, мы можем вызвать вулкан! -gui.missile.warhead=Боеголовка -gui.missile.strength=Мощность -gui.missile.fuelType=Тип топлива -gui.missile.fuelAmount=Количество топлива -gui.missile.chipInaccuracy=Неточность чипа -gui.missile.finInaccuracy=Неточность стабилизаторов -gui.missile.size=Размер -gui.missile.health=Прочность -gui.missile.fuel=Топливо -gui.missile.fuelCapacity=Ёмкость топлива -gui.missile.notLaunchable=Невозможно запустить! - -missile.tier.tier0=Уровень 0 -missile.tier.tier1=Уровень 1 -missile.tier.tier2=Уровень 2 -missile.tier.tier3=Уровень 3 -missile.tier.tier4=Уровень 4 -missile.fuel.solid=Твёрдое топливо -missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) -missile.fuel.ethanol_peroxide=Этанол / Перекись водорода -missile.fuel.kerosene_peroxide=Керосин / Перекись водорода -missile.fuel.kerosene_loxy=Керосин / Жидкий кислород -missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород - -warhead.he=HE -warhead.incendiary=Зажигательная -warhead.cluster=Кассетная -warhead.bunker_buster=Противобункерная -warhead.nuclear=Ядерная -warhead.thermonuclear=Термоядерная (TX) -warhead.n2=N² -warhead.balefire=Жар-ядерная -warhead.schrabidium=Шрабидевая -warhead.taint=Порча -warhead.cloud=Облако -warhead.turbine=Турбина - -part.inaccuracy=Неточность -part.size=Размер -part.type=Тип -part.strength=Прочность -part.weight=Вес -part.topSize=Верхний размер -part.bottomSize=Нижний размер -part.fuelType=Тип топлива -part.fuelAmount=Количество топлива -part.fuelConsumption=Расход топлива -part.maxPayload=Макс. нагрузка -part.health=Прочность -part.rarity=Редкость -part.by=Автор -part.size.any=Любой -part.size.none=Нет - -fuel.xenon=Ксенон -fuel.balefire=Жар-ракетное топливо - -part.rarity.common=Обычное -part.rarity.uncommon=Необычное -part.rarity.rare=Редкое -part.rarity.epic=Эпическое -part.rarity.legendary=Легендарное -part.rarity.strange=Странное - -satchip.frequency=Частота спутника -satchip.foeq=Даёт достижение. И всё. -satchip.gerald.line1=Одноразовый. -satchip.gerald.line2=Требуется орбитальный модуль. -satchip.gerald.line3=Расплавитель процессоров, проклятие каждого владельца сервера. -satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. -satchip.mapper=Отображает загруженные в данный момент чанки. -satchip.miner=Доставляет рудные порошки на посадочную площадку. -satchip.lunar_miner=Добывает лунный грунт и доставляет на посадочную площадку. -satchip.radar=Показывает карту активных сущностей -satchip.resonator=Позволяет телепортироваться без перезарядки. -satchip.scanner=Создаёт карту подземных руд сверху вниз. - item.mold_base.name=Пустая литейная форма item.mold.name=Литейная форма item.morning_glory.name=Фиалковый вьюнок @@ -4371,9 +4324,7 @@ item.primer_buckshot.name=Картечные Капсюли (x12) item.protection_charm.name=Талисман защиты item.prototype_kit.name=Комплект Прототипа item.pudding.name=Пудинг -item.pudding.desc.1=Что, если бы он сделал? -item.pudding.desc.2=Что, если бы он не сделал? -item.pudding.desc.3=Что, если бы мир был сделан из пудинга? +item.pudding.desc=Что, если бы он сделал?$WЧто, если бы он не сделал?$Что, если бы если мир был сделан из пуддинга? item.pwr_fuel.bfb_am_mix.name=Стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel.bfb_pu241.name=Стержень ВВЭР ЦБР с плутонием-241 item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащённым америцием-242 @@ -4427,8 +4378,7 @@ item.radaway_strong.name=Усиленный антирадин item.radx.name=Рад-X item.radx.desc=Increases radiation resistance by 0.2 (37%) for 3 minutes item.rag.name=Тряпка -item.rag.desc.1=Бросьте в воду, чтобы намочить тряпку. -item.rag.desc.2=ПКМ, чтобы помочиться на тряпку. +item.rag.desc=Бросьте в воду, чтобы намочить.$Нажмите правой кнопкой мыши, чтобы помочиться на тряпку. item.rag_damp.name=Влажная тряпка item.rag_piss.name=Пропитанная мочой тряпка item.rangefinder.name=Дальномер @@ -5005,6 +4955,18 @@ item.wand_d.name=Отладочная палочка item.wand_k.name=Строительная палочка item.wand_s.name=Структурная палочка item.structure_custommachine.name=Жезл обозначения кастомных машин +item.warhead.desc.he=HE +item.warhead.desc.incendiary=Зажигательная +item.warhead.desc.cluster=Кассетная +item.warhead.desc.bunker_buster=Разрушитель бункеров +item.warhead.desc.nuclear=Ядерная +item.warhead.desc.thermonuclear=Термоядерная (TX) +item.warhead.desc.n2=N² +item.warhead.desc.balefire=Жар-ядерная +item.warhead.desc.schrabidium=Шрабидиевая +item.warhead.desc.taint=Порча +item.warhead.desc.cloud=Облако +item.warhead.desc.turbine=Турбина item.warhead_buster_large.name=Большая бункерная боеголовка item.warhead_buster_medium.name=Средняя бункерная боеголовка item.warhead_buster_small.name=Малая бункерная боеголовка @@ -5253,6 +5215,17 @@ rbmk.screen.rod=Управ: %s rbmk.screen.temp=Темп: %s rbmk.screen.xenon=Ксенон: %s +satchip.frequency=Частота спутника +satchip.foeq=Даёт тебе достижение. Это всё. +satchip.gerald.desc=Одноразовый.$Требует орбитальный модуль.$Плавитель процессоров, проклятие администраторов серверов. +satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд.. +satchip.mapper=Отображает загруженные в данный момент чанки. +satchip.miner=Доставит рудный порошок на грузовую посадочную площадку. +satchip.lunar_miner=Добывает лунный грунт, чтобы доставить его на грузовую посадочную площадку. +satchip.radar=Показывает карту активных сущностей. +satchip.resonator=Позволяет телепортироваться без перезарядки. +satchip.scanner=Создает карту подземных руд сверху вниз. + shape.barrelHeavy=Тяжёлый ствол shape.barrelLight=Лёгкий ствол shape.billet=Заготовка @@ -6129,10 +6102,6 @@ tile.nuke_n45.name=Морская мина N45 tile.nuke_prototype.name=Прототип tile.nuke_solinium.name=Синий Ополаскиватель tile.nuke_tsar.name=Царь-бомба -item.bomb_part.used_in=Используется в: -item.n2.mine=Мина N² -item.fleija.name=Ф.Л.Е.Я. -item.solinium.name=Синий Ополаскиватель tile.oil_duct.name=Труба для нефти tile.oil_duct_solid.name=Покрытая труба для нефти tile.oil_pipe.name=Труба для извлечения неочищенной нефти @@ -6739,11 +6708,4 @@ desc.gui.upgrade.speed= * §4Скорость§r: Стакается до 3-х tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель -general.na=Н/Д -error.generic=### Я ОШИБКА ### - -// Last updated 24.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // - -# Hot Dusted Item -item.hot_dusted.forged=Кован -item.hot_dusted.times=раз(а) +// Last updated 26.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // From 708879c276da2bdc69caeaf5670e85636d31ad6b Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Tue, 26 Aug 2025 16:21:33 -0600 Subject: [PATCH 311/323] Minor ru_RU.lang changes --- src/main/resources/assets/hbm/lang/ru_RU.lang | 14 +++++++------- .../assets/hbm/manual/material/copper.json | 2 +- .../assets/hbm/manual/material/plutonium.json | 2 +- .../assets/hbm/manual/material/rubber.json | 2 +- .../assets/hbm/manual/material/sulfur.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index bb3c9c63e..a2ad8583c 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2415,9 +2415,9 @@ item.can_breen.name=Личный резерв др.Брина item.can_creature.name=Энергетический напиток "Существо" item.can_empty.name=Пустая банка item.can_key.name=Винтовой ключ -item.can_luna.name=Чёрная меза луна - Тёмная кола +item.can_luna.name=Чёрная Меза луна - Тёмная кола item.can_mrsugar.name=Безалкогольный напиток 'Доктор Сахар' -item.can_mug.name=MUG Root Beer +item.can_mug.name=Квас "Царские Припасы" item.can_overcharge.name=Перезарядка Delirium XT item.can_redbomb.name=Энергетический напиток "Красная Бомба" item.can_smart.name=Энергетический напиток “Смарт” @@ -4088,7 +4088,7 @@ item.pellet_rtg_actinium.desc=Сияние голубого света и бет item.pellet_rtg_americium.name=РИТЭГ-пеллета из америция-241 item.pellet_rtg_americium.desc=Редкий и надежный, старый добрый Америций! item.pellet_rtg_berkelium.name=РИТЭГ-пеллета из берклия-248 -item.pellet_rtg_berkelium.desc=Экзотический источник альфа, служит дольше, чем америций! +item.pellet_rtg_berkelium.desc=Экзотический источник альфа-излучения, служит дольше, чем америций! item.pellet_rtg_cobalt.name=РИТЭГ-пеллета из кобальта-60 item.pellet_rtg_cobalt.desc=Не лучший для РИТЭГ энергии, но хорош для гамма-радиации! item.pellet_rtg_depleted.bismuth.name=Распавшаяся РИТЭГ-пеллета висмута @@ -4226,7 +4226,7 @@ item.powder_coal_tiny.name=Кучка угольного порошка item.powder_cobalt.name=Кобальтовый порошок item.powder_cobalt_tiny.name=Кучка кобальтового порошка item.powder_coltan.name=Очищенный танталит -item.powder_coltan_ore.name=Измельчённый Колтан +item.powder_coltan_ore.name=Измельчённый колтан item.powder_combine_steel.name=Измельчённая сталь Альянса item.powder_copper.name=Медный порошок item.powder_cs137.name=Порошок цезия-137 @@ -4240,7 +4240,7 @@ item.powder_dineutronium.name=Динейтрониевый порошок item.powder_dura_steel.name=Измельчённая быстрорежущая сталь item.powder_emerald.name=Изумрудный порошок item.powder_euphemium.name=Эвфемиевый порошок -item.powder_euphemium.desc=Измельчённая розовизна.$На вкус как клубника. +item.powder_euphemium.desc=Измельчённая розовость.$На вкус как клубника. item.powder_fertilizer.name=Промышленное удобрение item.powder_fire.name=Красный фосфор item.powder_fire.desc=Используется в многоцелевых бомбах:$Зажигательные бомбы - это весело! @@ -4275,7 +4275,7 @@ item.powder_paleogenite.name=Порошок палеогенита item.powder_paleogenite_tiny.name=Кучка палеогенитового порошка item.powder_plutonium.name=Плутониевый порошок item.powder_poison.name=Ядовитый порошок -item.powder_poison.desc=Используется в многоцелевых бомбах:$Внимание: Ядовито! +item.powder_poison.desc=Используется в многоцелевых бомбах:$Внимание: ядовито! item.powder_polonium.name=Порошок полония-210 item.powder_polymer.name=Полимерный порошок item.powder_power.name=Энерго-порошок @@ -5044,7 +5044,7 @@ item.weapon_mod_generic.bronze_damage.name=Оптимизированный бр item.weapon_mod_generic.bronze_dura.name=Высокопрочные запчасти из бронзы item.weapon_mod_generic.desh_damage.name=Оптимизированный деш ресивер item.weapon_mod_generic.desh_dura.name=Высокопрочные запчасти из деша -item.weapon_mod_generic.dura_damage.name=Оптимизированный быстрорежущий ресивер +item.weapon_mod_generic.dura_damage.name=Оптимизированный ресивер из быстрорежущей стали item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из быстрорежущей стали item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроурановый ресивер item.weapon_mod_generic.ferro_dura.name=Высокопрочные запчасти из ферроурана diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json index 8142651c4..bbcc0eabe 100644 --- a/src/main/resources/assets/hbm/manual/material/copper.json +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -11,7 +11,7 @@ "content": { "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", - "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для квантовых схем высокого уровня и катушек [[ускорителя частиц|Particle Accelerator]].", + "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для высокоуровневых квантовых схем и катушек [[ускорителя частиц|Particle Accelerator]].", "zh_CN": "常见资源。纯铜主要用作结构材料,或在能够承受高温的设备中使用(作热导体); 铜的多种合金用途极广。

[[紫铜|Minecraft Grade Copper]]是红石和铜的合金,几乎所有电力设备都使用紫铜。

[[高级合金|Advanced Alloy]]是前期强力的装备材料,其性能优于钻石。

[[炮铜|Gunmetal]]是制作多种枪炮必不可少的材料,同时也用于制造弹壳。

[[铋青铜|Bismuth Bronze]]和[[砷青铜|Arsenic Bronze]]是 [[RBMK]] 后的材料,用于制作多种后期机器。

[[BSCCO]]是一种由铋衍生的超导体,高等级的量子电路和[[粒子加速器|Particle Accelerator]]线圈都需要BSCCO超导体制作。" } } diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json index 73ea1e57f..a3e0bdd3f 100644 --- a/src/main/resources/assets/hbm/manual/material/plutonium.json +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -11,7 +11,7 @@ "content": { "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", "uk_UA": "Рідкісна форма природнього плутонію, що складається з плутонію-238, 239 та 240. Плутоній у формі руди вимкнено за замовчуванням. Може бути перероблений в [[газовій центріфузі|Gas Centrifuge]] у формі гексафториду, або використовуватися для певних рецептів [[циклотрона|Cyclotron]].

Помірно радіоактивний.

Див. також:
[[Плутоній-238|Plutonium-238]]
[[Плутоній-239|Plutonium-239]]
[[Плутоній-240|Plutonium-240]]
[[Плутоній-241|Plutonium-241]]", - "ru_RU": "Редкая форма нечистого плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определённых рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", + "ru_RU": "Редкая форма природного плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определённых рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", "zh_CN": "不纯钚的稀有形式,由钚-238、钚-239、钚-240组成。 钚的矿石形式默认禁用。钚可以以六氟化钚的形式在[[气体离心机|Gas Centrifuge]]中处理,也用于某些[[回旋加速器|Cyclotron]]配方。

放射性中等。

另见:
[[钚-238|Plutonium-238]]
[[钚-239|Plutonium-239]]
[[钚-240|Plutonium-240]]
[[钚-241|Plutonium-241]]" } } diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json index f9718972a..41be5fcee 100644 --- a/src/main/resources/assets/hbm/manual/material/rubber.json +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -11,7 +11,7 @@ "content": { "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", "uk_UA": "Нафтопродукт, отриманий з [[ненасичених вуглеводнів|Unsaturated Hydrocarbons]] та [[сірки|Sulfur]]. Для виробництва потрібна щонайменше [[вежа каталітичного крекінгу|Catalytic Cracking Tower]]. Може замінити [[латекс|Latex]] у всіх рецептах.", - "ru_RU": "Продукт переработки нефти, получаемый из [[непредельных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", + "ru_RU": "Нефтепродукт, получаемый из [[непредельных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", "zh_CN": "一种石化产品,衍生自[[不饱和烃|Unsaturated Hydrocarbons]]和[[硫|Sulfur]]。至少需要一台[[催化裂化塔|Catalytic Cracking Tower]]才能制作。可在所有配方中替代[[乳胶|Latex]]。" } } diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json index be277db2c..5984bf61d 100644 --- a/src/main/resources/assets/hbm/manual/material/sulfur.json +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -11,7 +11,7 @@ "content": { "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", "uk_UA": "Звичайна руда, зустрічається у великих кількостях в пеклі. Використовується в різних речах, таких як [[сірчана кислота|Sulfuric Acid]], [[гума|Rubber]] та єлоукейку для отримання гексафториду [[урану|Uranium]]. Також може використовуватися для виготовлення пороху, сірників або як жовтий барвник.", - "ru_RU": "Распространённая руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жётлом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", + "ru_RU": "Распространённая руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жёлтом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", "zh_CN": "常见矿物,在下界的生成量更多。用于多种配方,例如制作[[硫酸|Sulfuric Acid]]和 [[橡胶|Rubber]],也用于制作黄饼,作为合成六氟化[[铀|Uranium]]的原料。 也可用于制作火药、火柴,以及用作黄色染料。" } } From 5605a9c3b81a443b2d30e42c43d6a54796c0f83f Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Tue, 26 Aug 2025 16:25:11 -0600 Subject: [PATCH 312/323] Minor changes --- src/main/resources/assets/hbm/lang/ru_RU.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index a2ad8583c..68cd5e606 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1548,8 +1548,8 @@ hbmfluid.lpg=Сжиженный попутный газ (СПГ) hbmfluid.lubricant=Машинная смазка hbmfluid.lye=Щёлок hbmfluid.mercury=Ртуть -hbmfluid.mug=Пиво "Mug Root" -hbmfluid.mug_hot=Горячее пиво "Mug Root" +hbmfluid.mug=Квас "Царские Припасы" +hbmfluid.mug_hot=Горячий квас "Царские Припасы" hbmfluid.mustardgas=Иприт hbmfluid.naphtha=Нафта hbmfluid.naphtha_coker=Коксовая нафта From e5b29e3352caf7e79ac3853b0c84244ad060f6c8 Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 27 Aug 2025 13:12:01 +1000 Subject: [PATCH 313/323] fix transparent pixel issue in wiki icon screenshitter --- .../inventory/gui/GUIScreenWikiRender.java | 93 ++++++++++--------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index 900e4e9b6..a183812dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -26,12 +26,12 @@ import net.minecraft.util.ResourceLocation; public class GUIScreenWikiRender extends GuiScreen { - // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks - // taking a screenshot of each, as fast as the game can render them + // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks + // taking a screenshot of each, as fast as the game can render them protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/nei/gui_nei.png"); protected ItemStack[] preview; - protected int index = 0; + protected int index = 0; protected int scale = 1; protected String saveLocation = "wiki-screenshots"; protected String prefix = ""; @@ -52,7 +52,7 @@ public class GUIScreenWikiRender extends GuiScreen { this.getStackName = getStackName; } - @Override + @Override public void drawScreen(int mouseX, int mouseY, float f) { if(this.mc.theWorld != null) { GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFC6C6C6); @@ -60,57 +60,64 @@ public class GUIScreenWikiRender extends GuiScreen { this.drawBackground(0); } - // Once we've reached the end of the array, immedaitely close this GUI - if(index >= preview.length) { - this.mc.thePlayer.closeScreen(); - return; - } - + // Once we've reached the end of the array, immedaitely close this GUI + if(index >= preview.length) { + this.mc.thePlayer.closeScreen(); + return; + } + this.drawGuiContainerBackgroundLayer(); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(preview[index]); GL11.glEnable(GL11.GL_LIGHTING); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); int zoom = scale * res.getScaleFactor(); - try { - String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); - if(!slotName.endsWith(".name")) { - saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFF8B8B8B); - } - } catch (Exception ex) { - // Just skip any failures caused by display name or rendering - } + try { + String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); + if(!slotName.endsWith(".name")) { + saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFFFF00FF); + } + } catch (Exception ex) { + // Just skip any failures caused by display name or rendering + } - index++; - } + index++; + } protected void drawGuiContainerBackgroundLayer() { GL11.glPushMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(texture); - ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glScaled(scale, scale, scale); - this.drawTexturedModalRect(0, res.getScaledHeight_double() / scale - 18D, 5, 87, 18, 18); - GL11.glPopMatrix(); - } + { - public void drawTexturedModalRect(double x, double y, int sourceX, int sourceY, int sizeX, int sizeY) { - double f = 0.00390625D; - double f1 = 0.00390625D; - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.draw(); + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + + int size = 18; + double y = res.getScaledHeight_double() / scale - 18D; + + GL11.glScaled(scale, scale, scale); + + GL11.glColor4f(1.0F, 0.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertex((double) 0, (double) y + size, (double) this.zLevel); + tessellator.addVertex((double) size, (double) y + size, (double) this.zLevel); + tessellator.addVertex((double) size, (double) y, (double) this.zLevel); + tessellator.addVertex((double) 0, (double) y, (double) this.zLevel); + tessellator.draw(); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + } + GL11.glPopMatrix(); } protected void drawGuiContainerForegroundLayer(ItemStack preview) { if(preview == null) return; - + GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); @@ -119,11 +126,11 @@ public class GUIScreenWikiRender extends GuiScreen { GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); - + GL11.glScaled(scale, scale, scale); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); + GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); this.zLevel = 200.0F; itemRender.zLevel = 200.0F; @@ -134,7 +141,7 @@ public class GUIScreenWikiRender extends GuiScreen { itemRender.zLevel = 0.0F; this.zLevel = 0.0F; - + GL11.glPopMatrix(); } From a00034787769fbf55972db0190c539ad524428fc Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 27 Aug 2025 13:38:43 +1000 Subject: [PATCH 314/323] yeah I was overcomplicating that, this is much better --- .../inventory/gui/GUIScreenWikiRender.java | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index a183812dc..42b3c6b49 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -19,7 +19,6 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -54,11 +53,7 @@ public class GUIScreenWikiRender extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float f) { - if(this.mc.theWorld != null) { - GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFC6C6C6); - } else { - this.drawBackground(0); - } + GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFFF00FF); // Once we've reached the end of the array, immedaitely close this GUI if(index >= preview.length) { @@ -66,7 +61,6 @@ public class GUIScreenWikiRender extends GuiScreen { return; } - this.drawGuiContainerBackgroundLayer(); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(preview[index]); GL11.glEnable(GL11.GL_LIGHTING); @@ -86,35 +80,6 @@ public class GUIScreenWikiRender extends GuiScreen { index++; } - protected void drawGuiContainerBackgroundLayer() { - GL11.glPushMatrix(); - { - - ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - - int size = 18; - double y = res.getScaledHeight_double() / scale - 18D; - - GL11.glScaled(scale, scale, scale); - - GL11.glColor4f(1.0F, 0.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertex((double) 0, (double) y + size, (double) this.zLevel); - tessellator.addVertex((double) size, (double) y + size, (double) this.zLevel); - tessellator.addVertex((double) size, (double) y, (double) this.zLevel); - tessellator.addVertex((double) 0, (double) y, (double) this.zLevel); - tessellator.draw(); - - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - } - GL11.glPopMatrix(); - } - protected void drawGuiContainerForegroundLayer(ItemStack preview) { if(preview == null) return; From b98c8c3f98c45d9fa44321af319571431493ba9c Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 15:12:47 +0200 Subject: [PATCH 315/323] sdsa --- .../assets/hbm/structures/ntmruinsA.nbt | Bin 0 -> 2328 bytes .../assets/hbm/structures/ntmruinsB.nbt | Bin 0 -> 2166 bytes .../assets/hbm/structures/ntmruinsC.nbt | Bin 0 -> 2204 bytes .../assets/hbm/structures/ntmruinsD.nbt | Bin 0 -> 1976 bytes .../assets/hbm/structures/ntmruinsE.nbt | Bin 0 -> 1675 bytes .../assets/hbm/structures/ntmruinsF.nbt | Bin 0 -> 806 bytes .../assets/hbm/structures/ntmruinsG.nbt | Bin 0 -> 529 bytes .../assets/hbm/structures/ntmruinsH.nbt | Bin 0 -> 753 bytes .../assets/hbm/structures/ntmruinsI.nbt | Bin 0 -> 597 bytes .../assets/hbm/structures/ntmruinsJ.nbt | Bin 0 -> 1327 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsA.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsB.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsC.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsD.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsE.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsF.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsG.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsH.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsI.nbt create mode 100644 src/main/resources/assets/hbm/structures/ntmruinsJ.nbt diff --git a/src/main/resources/assets/hbm/structures/ntmruinsA.nbt b/src/main/resources/assets/hbm/structures/ntmruinsA.nbt new file mode 100644 index 0000000000000000000000000000000000000000..100fab771e210d83f85bba2c4f5e3a3ec237090b GIT binary patch literal 2328 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/ntmruinsE.nbt b/src/main/resources/assets/hbm/structures/ntmruinsE.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8a367816551123059e6256d83fb52e28eeb95301 GIT binary patch literal 1675 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/ntmruinsI.nbt b/src/main/resources/assets/hbm/structures/ntmruinsI.nbt new file mode 100644 index 0000000000000000000000000000000000000000..d85d370d1240918894961e1cdf99430d045aab6d GIT binary patch literal 597 zcmV-b0;>HViwFP!000000IinWj?*v@hNrQeLzm-L0xp2Pf=jfp2%&ulv~Lh4snJ?Z z;>tEi%hThub+EiX1npMxMXPUS{`qI(bPZ4emh2Bj05F|GAEHlLK}ko&6r&QRPX&3~ z^KK{C`pdTp(4I>ZWIhD~B2}a4DZ*t|`eYWf3NXlGvH*iE1_c;mG1y^Nrvny40*tLW z4=}doBEaAUjIFs0F!=(ei1>Wy$2OoN9JW1w1A2EV;Hg^Pi$VZ*AWkA9}{}q znfmm&GxgPSXZlQ6Lu0G-PaXd?s%bhUWNZr?#d>5JRXs(%tv6sZX^bBJg{vyD{3^$D3*UJE78-5;O^2kuIX90Y@r!GBm@;P=n7=}b1 zM&j|%)nk}cE!RWWAL8lV?JM`pebRHr6di7wo~pTxVt@QPz2-M-Sl-$C|yMGtze&ABx z1;W2SLgDwJ!mZ#tIws>U5@Smy_+RN)kF+tL=R64dN(3MBhTm;D9(XZ=g19!DNr&78|B7C;1czIog;_uM<83uAH>qorR4~Yo zfb998HPIQ2og0~lv31TpOgw-|h(2J_0rN1O!Pq(%9%gJYV+Ru`z5o*|8U`YES6uSk zeN0C38Bap?9PMK_0~kAh&OA&ofCv>rF9o zRyhml9oJgYJNG?IsxXmQOZGu93Gra!@P&*W4D$t;kn9-@J9jY57hsq#z%XBc$w=J* zWBWqhR}+UXT=Pg@xc0310!*yvEPdgdN7G08Le|V=|F0dptl?nn*yVi#j264}myfYy zf8b%*_npMyFX^4s9N)*}T>{LA)C4fhUtn0@0mJV6U|5X;!}13VtE*sGT?NDZ1;+00 z4?WD8a$bQr3wh@Uqn(BHvX9ZuLV8)&1Td`Dfzi%FdfCUY@42Zt_OdH>&C6hzm%-Sv z%lj&rl=wY0J1<9yPlxzj_EV`(W_BMt4`naN%yCWl*u$_q1jEh(3_A-j>@2{rdkYxW zQ^2r11jFv4V2T0rjFow$-!D9jrnBaEFs$~1VYL?wyB~tFb(TFBjHYuSbe8_g%(35H zacO=Bqs1=$?pjN`8|P;C84;i6=GcQihTVI?Fnz$V+yKM$0b}bU`vn-*m%*@ixnP(F z!LavrxjFWitn*-49RtI13=Dg342Jm&411>s#@0~YH^A5$K5{U!=gPhVCQ|k+J$PXX z6Ru`mXu@T+GFu{CPXF9lBU+Z-)NDfwo4Wh{?|*(BnRNNv_4T5>>SKx4b-gh8PcL7- zp8WE|kFPTmZ~ro4?!TQaUv$-?{Q9b#*ONtEcbN&QEAw#k%k5uN-cA0PuCBKK)z8^A z)tfhE<2nji5*`btFvsmwzLo&P+9??J>H-Xt84R;B7&)8enIm?o&$&ZGc^2o6c{a?r>dNJ->7wio%ctwz zkDGM*tT4r^re2rL=8wJEzW$A#ZA#tG(`9KMAL`n?Ud@}bD<|!;uV8PDHuAzTaxtB$ z;~w;7xturC>+VI>)T_yC+O(cQ-y8;ge!SSMspdCq$!}SZ>uRx>HlC4}@3ro2s80@~ zcY_Xd^x@BM`i7%T@YFZKtf_Cx)uhjaYJhrQ`lg}dpXuXw+fY?};!Coj8#v_{zB~E& zZ`b|87x=Pn+jpnyHZbhdH~y89c|$Yj{pPvd&m+$~YU-RO;pH6#@cho_IW3;&cU=)~ lud|0ctGe`wF24M~dk; Date: Wed, 27 Aug 2025 15:28:38 +0200 Subject: [PATCH 316/323] labubu funk --- src/main/java/com/hbm/lib/HbmWorld.java | 4 +- .../com/hbm/world/gen/MapGenNTMFeatures.java | 46 +++++----- .../hbm/world/gen/component/RuinFeatures.java | 88 +++++++++---------- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index ed4ca9208..9e5f03161 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -40,8 +40,8 @@ public class HbmWorld { private static void registerNTMFeatures() { CivilianFeatures.registerComponents(); OfficeFeatures.registerComponents(); - RuinFeatures.registerComponents(); +// RuinFeatures.registerComponents(); BunkerComponents.registerComponents(); MapGenStructureIO.func_143031_a(SiloComponent.class, "NTMSiloComponent"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java index 20f380ed9..96641134f 100644 --- a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java @@ -15,10 +15,10 @@ import com.hbm.world.gen.component.CivilianFeatures.NTMLab2; import com.hbm.world.gen.component.CivilianFeatures.RuralHouse1; import com.hbm.world.gen.component.OfficeFeatures.LargeOffice; import com.hbm.world.gen.component.OfficeFeatures.LargeOfficeCorner; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; import com.hbm.world.gen.component.SiloComponent; import net.minecraft.world.World; @@ -124,26 +124,26 @@ public class MapGenNTMFeatures extends MapGenStructure { */ //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP - if(rand.nextInt(3) == 0) { //Empty Ruin Structures - switch(rand.nextInt(4)) { - case 0: - NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); - this.components.add(ruin1); - break; - case 1: - NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); - this.components.add(ruin2); - break; - case 2: - NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); - this.components.add(ruin3); - break; - case 3: - NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); - this.components.add(ruin4); - } +// if(rand.nextInt(3) == 0) { //Empty Ruin Structures +// switch(rand.nextInt(4)) { +// case 0: +// NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); +// this.components.add(ruin1); +// break; +// case 1: +// NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); +// this.components.add(ruin2); +// break; +// case 2: +// NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); +// this.components.add(ruin3); +// break; +// case 3: +// NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); +// this.components.add(ruin4); +// } - } else if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk + if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk SiloComponent silo = new SiloComponent(rand, i, j); this.components.add(silo); } else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah diff --git a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java index 9204e7b0e..0e59878d5 100644 --- a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java +++ b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java @@ -8,42 +8,42 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureBoundingBox; - +// Idk what i should do with these if you read this bob do whatever since it's not used anywhere public class RuinFeatures { - + public static void registerComponents() { MapGenStructureIO.func_143031_a(NTMRuin1.class, "NTMRuin1"); MapGenStructureIO.func_143031_a(NTMRuin2.class, "NTMRuin2"); MapGenStructureIO.func_143031_a(NTMRuin3.class, "NTMRuin3"); MapGenStructureIO.func_143031_a(NTMRuin4.class, "NTMRuin4"); } - + public static class NTMRuin1 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin1() { super(); } - + public NTMRuin1(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 8, 6, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 8, 10, -1, box); - + int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 6, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithMetadataBlocks(world, box, 1, 3, 0, 3, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); this.fillWithBlocks(world, box, 4, 0, 0, 4, 6 - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -83,39 +83,39 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 8, 0, 6, 8, 0, 6, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 0, 10 - 2, 8, 1, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 2, 10 - 1, 8, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin2 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin2() { super(); } - + public NTMRuin2(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 7, 5, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 7, 10, -1, box); - + int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithMetadataBlocks(world, box, 1, 3, 0, 7 - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); this.fillWithBlocks(world, box, 7, 0, 0, 7, 5, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -146,40 +146,40 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 7, 0, 6, 7, 0, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 6, 7, 1, 7, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 10 - 1, 7, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 7 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin3 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin3() { super(); } - + public NTMRuin3(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 8, 3, 10); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, 10, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 8, 0, 8, 10, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 8, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 4, 8, 4, -1, box); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithBlocks(world, box, 8, 0, 0, 8, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 8 - 1, 0, 0, false, rand, RandomConcreteBricks); @@ -202,44 +202,44 @@ public class RuinFeatures { this.fillWithBlocks(world, box, 4, 0, 4, 4, 2, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Center Wall this.fillWithRandomizedBlocks(world, box, 3, 0, 4, 3, 1, 4, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 5, 0, 4, 8 - 1, 1, 4, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 8 - 1, 0, 3, Blocks.gravel, Blocks.air, false); this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin4 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin4() { super(); } - + public NTMRuin4(Random rand, int minX, int minZ) { super(rand, minX, 64, minZ, 10, 2, 11); } @Override public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - + //System.out.println(this.coordBaseMode); if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { return false; } //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 10, 5, 10, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, 5, 4, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 11, 10 - 1, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 4, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 5, 10 - 1, 5, -1, box); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 1 this.fillWithBlocks(world, box, 5, 0, 0, 5, 2, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); @@ -263,12 +263,12 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 11 - 1, false, rand, RandomConcreteBricks); //Left Wall this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 1, 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 1, 7, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 4, 0, 5, Blocks.gravel, Blocks.air, false); this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 6, 10 - 1, 0, 11 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + } From 76b51ebca951dea6788350c75c049f06b1f30dd4 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 16:04:30 +0200 Subject: [PATCH 317/323] BOIIIIIIIIIIIIIIIIII TS (type soul) getting a 20 hog code ( setro and minors? like in minecraft? I know nothing of association with setro and minors.) --- src/main/java/com/hbm/config/WorldConfig.java | 6 ++--- src/main/java/com/hbm/lib/HbmWorldGen.java | 22 +++++++++---------- .../com/hbm/world/gen/NTMWorldGenerator.java | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 0eb14c026..f6faf2856 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -81,7 +81,7 @@ public class WorldConfig { public static boolean enableSulfurCave = true; public static boolean enableAsbestosCave = true; - public static int radioStructure = 500; +// public static int radioStructure = 500; public static int antennaStructure = 250; public static int atomStructure = 500; public static int dungeonStructure = 64; @@ -204,7 +204,7 @@ public class WorldConfig { enableAsbestosCave = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.C01_enableAsbestosCave", "Toggles asbestos caves", true); final String CATEGORY_DUNGEON = CommonConfig.CATEGORY_DUNGEONS; - radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); +// radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); antennaStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.01_antennaSpawn", "Spawn antenna on every nTH chunk", 250); atomStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.02_atomSpawn", "Spawn power plant on every nTH chunk", 500); dungeonStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.04_dungeonSpawn", "Spawn library dungeon on every nTH chunk", 64); @@ -245,7 +245,7 @@ public class WorldConfig { craterBiomeOuterRad = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R02_craterBiomeOuterRad", "RAD/s for the outer crater biome", 0.5D); craterBiomeWaterMult = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R03_craterBiomeWaterMult", "Multiplier for RAD/s in crater biomes when in water", 5D); - radioStructure = CommonConfig.setDefZero(radioStructure, 1000); +// radioStructure = CommonConfig.setDefZero(radioStructure, 1000); antennaStructure = CommonConfig.setDefZero(antennaStructure, 1000); atomStructure = CommonConfig.setDefZero(atomStructure, 1000); dungeonStructure = CommonConfig.setDefZero(dungeonStructure, 1000); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 6bdbc7b8b..25d85495b 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -223,17 +223,17 @@ public class HbmWorldGen implements IWorldGenerator { } } - if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { - if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { - for(int a = 0; a < 1; a++) { - int x = i + rand.nextInt(16); - int z = j + rand.nextInt(16); - int y = world.getHeightValue(x, z); - - new Radio01().generate(world, rand, x, y, z); - } - } - } +// if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { +// if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { +// for(int a = 0; a < 1; a++) { +// int x = i + rand.nextInt(16); +// int z = j + rand.nextInt(16); +// int y = world.getHeightValue(x, z); +// +// new Radio01().generate(world, rand, x, y, z); +// } +// } +// } if(biome.temperature >= 0.4F && biome.rainfall <= 0.6F) { if(WorldConfig.antennaStructure > 0 && rand.nextInt(WorldConfig.antennaStructure) == 0) { diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index aefeedf4e..baf4a1a1b 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -47,7 +47,7 @@ public class NTMWorldGenerator implements IWorldGenerator { structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = 2; }}); - + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); @@ -114,7 +114,7 @@ public class NTMWorldGenerator implements IWorldGenerator { NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = flatbiomes::contains; structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); - spawnWeight = 40; + spawnWeight = 30; }}); NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); From 848ac39463735dcf6a5e24a11dc2ad66aedec76f Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:24:58 +0200 Subject: [PATCH 318/323] resolve hopefully i hope --- src/main/java/com/hbm/world/gen/NTMWorldGenerator.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 049428707..9ea1272e2 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -40,6 +40,7 @@ public class NTMWorldGenerator implements IWorldGenerator { final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + final List flatbiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.plains, BiomeGenBase.icePlains, BiomeGenBase.desert }); /// SPIRE /// NBTStructure.registerStructure(0, new SpawnCondition("spire") {{ @@ -113,6 +114,12 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition("radio") {{ + canSpawn = flatbiomes::contains; + structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); + spawnWeight = 30; + }}); + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); From 66971b3310cbca7ca98d20baa7475338338f376d Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Wed, 27 Aug 2025 17:36:40 +0200 Subject: [PATCH 319/323] SIX @SEVEN --- src/main/java/com/hbm/util/LootGenerator.java | 14 +++++ .../com/hbm/world/gen/NTMWorldGenerator.java | 51 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index cee32e713..a91ec0e3a 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -29,6 +29,7 @@ public class LootGenerator { public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; public static final String LOOT_FLAREGUN = "LOOT_FLAREGUN"; + public static final String LOOT_SHIT = "LOOT_SHIT"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -42,6 +43,7 @@ public class LootGenerator { case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); + case LOOT_SHIT: lootShit(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -233,4 +235,16 @@ public class LootGenerator { 0.25, k * 0.03125, 0.125); } } + public static void lootShit(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 3; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_OF_GARBAGE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } } diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 049428707..3fcb7e903 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -113,6 +113,57 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin1") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; + spawnWeight = 20; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin2") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin3") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin4") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin5") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin6") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin7") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin8") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin9") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin10") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; + spawnWeight = 35; + }}); + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); From c978fa8955c6eddddce0f8d1e995ea626264fadb Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 28 Aug 2025 15:01:39 +1000 Subject: [PATCH 320/323] PWR printing device, exports a built PWR as a series of slices to be edited together for posting --- .../blocks/machine/MachinePWRController.java | 2 + .../inventory/gui/GUIScreenSlicePrinter.java | 127 +++++++++++++ .../inventory/gui/GUIScreenWikiRender.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 33 ++-- .../com/hbm/items/machine/ItemPWRPrinter.java | 173 ++++++++++++++++++ .../machine/TileEntityPWRController.java | 20 +- src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/textures/items/pwr_printer.png | Bin 0 -> 433 bytes 8 files changed, 341 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java create mode 100644 src/main/java/com/hbm/items/machine/ItemPWRPrinter.java create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_printer.png diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 0d27ea490..61b9930dc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.handler.threading.PacketThreading; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -80,6 +81,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv if(!controller.assembled) { assemble(world, x, y, z, player); } else { + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.pwr_printer) return false; FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java new file mode 100644 index 000000000..f26624082 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java @@ -0,0 +1,127 @@ +package com.hbm.inventory.gui; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; + +import net.minecraft.block.Block; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; + +public class GUIScreenSlicePrinter extends GuiScreen { + + private final int x1, y1, z1; + private final int x2, y2, z2; + private final int sizeX, sizeY, sizeZ; + + private HashSet whitelist; + + private int yIndex; + + private RenderBlocks renderer; + + private String dirname; + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2) { + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.z1 = Math.min(z1, z2); + this.x2 = Math.max(x1, x2); + this.y2 = Math.max(y1, y2); + this.z2 = Math.max(z1, z2); + + this.sizeX = this.x2 - this.x1 + 1; + this.sizeY = this.y2 - this.y1 + 1; + this.sizeZ = this.z2 - this.z1 + 1; + + dirname = dateFormat.format(new Date()).toString(); + } + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, HashSet whitelist) { + this(x1, y1, z1, x2, y2, z2); + this.whitelist = whitelist; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + if(renderer == null) { + this.renderer = new RenderBlocks(mc.theWorld); + } + + GuiScreen.drawRect(0, 0, width, height, 0xFFFF00FF); + + // Once we've reached the top slice, close the GUI + if(yIndex >= sizeY) { + mc.thePlayer.addChatMessage(new ChatComponentText("Slices saved to: .minecraft/printer/" + dirname)); + mc.thePlayer.closeScreen(); + return; + } + + GL11.glPushMatrix(); + { + + setupRotation(); + + mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator.instance.startDrawingQuads(); + + for(int x = 0; x < sizeX; x++) { + for(int z = 0; z < sizeZ; z++) { + Block block = mc.theWorld.getBlock(x1 + x, y1 + yIndex, z1 + z); + if(whitelist != null && !whitelist.contains(block)) continue; + + // Revert PWR blocks to originals for slice rendering + if(block instanceof BlockPWR) { + TileEntity tile = mc.theWorld.getTileEntity(x1 + x, y1 + yIndex, z1 + z); + if(tile instanceof TileEntityBlockPWR) { + TileEntityBlockPWR pwr = (TileEntityBlockPWR) tile; + if(pwr.block != null) { + block = pwr.block; + } + } + } + + renderer.renderBlockByRenderType(block, x, 0, z); + } + } + + Tessellator.instance.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + + } + GL11.glPopMatrix(); + + File printerDir = new File(mc.mcDataDir, "printer"); + printerDir.mkdir(); + + GUIScreenWikiRender.saveScreenshot(printerDir, dirname, "slice_" + yIndex + ".png", 0, 0, mc.displayWidth, mc.displayHeight, 0xFFFF00FF); + + yIndex++; + } + + private void setupRotation() { + double scale = -24; + + GL11.glTranslated(width / 2, height / 2 - 36, 400); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.5); //incredible flattening power + + GL11.glRotated(-30, 1, 0, 0); + GL11.glRotated(-45, 0, 1, 0); + GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + } + +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index 42b3c6b49..576f3bdf7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -116,7 +116,7 @@ public class GUIScreenWikiRender extends GuiScreen { // This implementation is based directly on ScreenShotHelper.saveScreenshot() // But allows for defining a rect where you want to sample pixels from - private static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { + public static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { try { File screenshotDirectory = new File(dataDir, ssDir); screenshotDirectory.mkdir(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f04a7218f..0bd86628a 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -64,7 +64,7 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; public class ModItems { - + public static HashSet excludeNEI = new HashSet(); public static void mainRegistry() { @@ -645,7 +645,7 @@ public class ModItems { public static Item seg_10; public static Item seg_15; public static Item seg_20; - + public static Item combine_scrap; public static Item shimmer_head; @@ -1035,6 +1035,7 @@ public class ModItems { public static Item pwr_fuel; public static Item pwr_fuel_hot; public static Item pwr_fuel_depleted; + public static Item pwr_printer; public static Item rbmk_lid; public static Item rbmk_lid_glass; @@ -1476,7 +1477,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; - + public static Item gun_charge_thrower; public static Item ammo_standard; @@ -2072,7 +2073,7 @@ public class ModItems { public static Item hazmat_paa_boots; public static Item rebar_placer; - + public static Item wand; public static Item wand_s; public static Item wand_d; @@ -2234,7 +2235,7 @@ public class ModItems { public static Item conveyor_wand; public static void initializeItem() { - + redstone_sword = new RedstoneSword(ToolMaterial.STONE).setUnlocalizedName("redstone_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":redstone_sword"); big_sword = new BigSword(ToolMaterial.EMERALD).setUnlocalizedName("big_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":big_sword"); @@ -2966,7 +2967,7 @@ public class ModItems { gas_full = new ItemGasTank().setUnlocalizedName("gas_full").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.gas_empty).setTextureName(RefStrings.MODID + ":gas_empty"); ItemSimpleConsumable.init(); - + //TODO: move all this crap to ItemSimpleConsumable syringe_empty = new Item().setUnlocalizedName("syringe_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_empty"); syringe_metal_empty = new Item().setUnlocalizedName("syringe_metal_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_empty"); @@ -2976,7 +2977,7 @@ public class ModItems { syringe_metal_super = new ItemSyringe().setUnlocalizedName("syringe_metal_super").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_super"); syringe_taint = new ItemSyringe().setUnlocalizedName("syringe_taint").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_taint"); syringe_mkunicorn = new ItemSyringe().setUnlocalizedName("syringe_mkunicorn").setFull3D().setCreativeTab(null).setTextureName(RefStrings.MODID + ":syringe_mkunicorn"); - + med_bag = new ItemSyringe().setUnlocalizedName("med_bag").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":med_bag"); radx = new ItemPill(0).setUnlocalizedName("radx").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":radx"); siox = new ItemPill(0).setUnlocalizedName("siox").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":siox"); @@ -3181,6 +3182,7 @@ public class ModItems { pwr_fuel = new ItemPWRFuel().setUnlocalizedName("pwr_fuel").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel"); pwr_fuel_hot = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_hot").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_hot"); pwr_fuel_depleted = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_depleted").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_depleted"); + pwr_printer = new ItemPWRPrinter().setUnlocalizedName("pwr_printer").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_printer"); rbmk_lid = new ItemRBMKLid().setUnlocalizedName("rbmk_lid").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid"); rbmk_lid_glass = new ItemRBMKLid().setUnlocalizedName("rbmk_lid_glass").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid_glass"); @@ -4512,7 +4514,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cmb_pickaxe").setTextureName(RefStrings.MODID + ":cmb_pickaxe"); - + cmb_axe = new ItemToolAbility(30F, 0, MainRegistry.tMatCMB, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4537,7 +4539,7 @@ public class ModItems { .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim"); - + elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) @@ -4546,14 +4548,14 @@ public class ModItems { .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IWeaponAbility.CHAINSAW, 0) .addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim"); - + elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim"); - + desh_sword = new ItemSwordAbility(12.5F, 0, MainRegistry.tMatDesh) .addAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("desh_sword").setTextureName(RefStrings.MODID + ":desh_sword"); @@ -4563,7 +4565,7 @@ public class ModItems { .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe"); - + desh_axe = new ItemToolAbility(7.5F, -0.05, MainRegistry.tMatDesh, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 0) .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) @@ -4978,9 +4980,9 @@ public class ModItems { } private static void registerItem() { - + excludeNEI.add(item_secret); - + //Weapons GameRegistry.registerItem(redstone_sword, redstone_sword.getUnlocalizedName()); GameRegistry.registerItem(big_sword, big_sword.getUnlocalizedName()); @@ -5687,7 +5689,7 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_empty, fluid_barrel_empty.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); - + //Packaged fluids GameRegistry.registerItem(fluid_pack_empty, fluid_pack_empty.getUnlocalizedName()); GameRegistry.registerItem(fluid_pack_full, fluid_pack_full.getUnlocalizedName()); @@ -5994,6 +5996,7 @@ public class ModItems { GameRegistry.registerItem(pwr_fuel, pwr_fuel.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_hot, pwr_fuel_hot.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_depleted, pwr_fuel_depleted.getUnlocalizedName()); + GameRegistry.registerItem(pwr_printer, pwr_printer.getUnlocalizedName()); //RBMK parts GameRegistry.registerItem(rbmk_lid, rbmk_lid.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java new file mode 100644 index 000000000..d7c3f5ee7 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java @@ -0,0 +1,173 @@ +package com.hbm.items.machine; + +import java.util.HashSet; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; +import com.hbm.inventory.gui.GUIScreenSlicePrinter; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.TileEntityPWRController; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemPWRPrinter extends Item implements IGUIProvider { + + private static int x1, y1, z1; + private static int x2, y2, z2; + private static Block[] blockSync; + + private HashSet fill = new HashSet<>(); + private static HashSet whitelist = new HashSet() {{ + add(ModBlocks.pwr_block); + add(ModBlocks.pwr_controller); + }}; + + // Piggybacking functions using the bytebuf TE sync + public static void serialize(World world, ByteBuf buf) { + buf.writeInt(x1); + buf.writeInt(y1); + buf.writeInt(z1); + buf.writeInt(x2); + buf.writeInt(y2); + buf.writeInt(z2); + + for(Block block : blockSync) { + buf.writeInt(Block.getIdFromBlock(block)); + } + + blockSync = null; + } + + public static void deserialize(World world, ByteBuf buf) { + x1 = buf.readInt(); + y1 = buf.readInt(); + z1 = buf.readInt(); + x2 = buf.readInt(); + y2 = buf.readInt(); + z2 = buf.readInt(); + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + Block block = Block.getBlockById(buf.readInt()); + + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityBlockPWR)) continue; + ((TileEntityBlockPWR) tile).block = block; + } + } + } + + System.out.println("oh wow it synced and attempted to GUI!"); + + // Open the printer GUI on any client players holding the printer + // yeah it's a shit hack yay weee wooo + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(player != null && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemPWRPrinter) { + FMLNetworkHandler.openGui(Minecraft.getMinecraft().thePlayer, MainRegistry.instance, 0, world, 0, 0, 0); + } + + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityPWRController)) return false; + if(world.isRemote) return true; + + TileEntityPWRController pwr = (TileEntityPWRController) tile; + syncAndScreenshot(world, pwr); + + return true; + } + + public void syncAndScreenshot(World world, TileEntityPWRController pwr) { + findBounds(world, pwr); + + int sizeX = x2 - x1 + 1; + int sizeY = y2 - y1 + 1; + int sizeZ = z2 - z1 + 1; + + blockSync = new Block[sizeX * sizeY * sizeZ]; + int i = 0; + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityBlockPWR) { + blockSync[i] = ((TileEntityBlockPWR) tile).block; + } + i++; + } + } + } + + pwr.isPrinting = true; + } + + public void findBounds(World world, TileEntityPWRController pwr) { + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); + + fill.clear(); + fill.add(new BlockPos(pwr.xCoord, pwr.yCoord, pwr.zCoord)); + x1 = x2 = pwr.xCoord; + y1 = y2 = pwr.yCoord; + z1 = z2 = pwr.zCoord; + floodFill(world, pwr.xCoord + dir.offsetX, pwr.yCoord, pwr.zCoord + dir.offsetZ); + } + + public void floodFill(World world, int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + if(fill.contains(pos)) return; + + if(world.getBlock(x, y, z) instanceof BlockPWR) { + fill.add(pos); + + x1 = Math.min(x1, x); + y1 = Math.min(y1, y); + z1 = Math.min(z1, z); + x2 = Math.max(x2, x); + y2 = Math.max(y2, y); + z2 = Math.max(z2, z); + + floodFill(world, x + 1, y, z); + floodFill(world, x - 1, y, z); + floodFill(world, x, y + 1, z); + floodFill(world, x, y - 1, z); + floodFill(world, x, y, z + 1); + floodFill(world, x, y, z - 1); + } + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, whitelist); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add("Use on a constructed PWR controller to generate construction diagrams"); + } + +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 653ec66ca..1cff1e6e5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -12,12 +12,13 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; -import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemPWRPrinter; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; @@ -375,8 +376,17 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG return this.rodCount + (int) Math.ceil(this.heatsinkCount / 4D); } + public boolean isPrinting; + @Override public void serialize(ByteBuf buf) { + buf.writeBoolean(isPrinting); + if(isPrinting) { + ItemPWRPrinter.serialize(worldObj, buf); + isPrinting = false; + return; + } + super.serialize(buf); buf.writeInt(this.rodCount); buf.writeLong(this.coreHeat); @@ -395,6 +405,14 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void deserialize(ByteBuf buf) { + if(buf.readBoolean()) { + // piggybacking off of this packet so that we don't have to sync EVERY PWR + // block continuously to the client for one tiny screenshot tool + + ItemPWRPrinter.deserialize(worldObj, buf); + return; + } + super.deserialize(buf); this.rodCount = buf.readInt(); this.coreHeat = buf.readLong(); diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e772302f4..1ce70f12f 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4013,6 +4013,7 @@ item.pwr_fuel_hot.men.name=Hot MEN PWR Fuel Rod item.pwr_fuel_hot.mep.name=Hot MEP PWR Fuel Rod item.pwr_fuel_hot.meu.name=Hot MEU PWR Fuel Rod item.pwr_fuel_hot.mox.name=Hot MOX PWR Fuel Rod +item.pwr_printer.name=PWR Printer item.quartz_plutonium.name=Plutonic Quartz item.radar_linker.name=Radar Linker item.radaway.name=RadAway diff --git a/src/main/resources/assets/hbm/textures/items/pwr_printer.png b/src/main/resources/assets/hbm/textures/items/pwr_printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a79ce1f2448d16a8180250315274362c2f06fef2 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4;$2!aJHjZQ!j&H|6fVg?4j10c+pb*+;VD9B#o>Fdh=l0$~YOvL&9x*I^DubwWB zAr_~T6C_w89M4{!_5a3?7mq9&J0@JKH#avgOR+QR<(W|+`RVm_eYFzjjVljl9{B$L z{?EiW=I_@TDqTLo;C$fTz3=wSK%guv%*@U%e)xNS{DT}eHn%oob^QerN17JhJow(; z+M0dN|M&Of*~<9*+W!ClZ~W))@Aik+&&%`J*Z)y_(;6>$k*8``5f3|mPKrfEg7RTo zYj?I<+e)^k#1HaPKF5s@JxH>z|Chq?r+`1bXQ9M_6CD?}#5r_6e13jD4+x}h$(2;| zpVxDh!R-q}%JT;zopr0C*Rjv;Y7A literal 0 HcmV?d00001 From a636440d136300f12ccbbfb0b4eb833ab3dcd26f Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 28 Aug 2025 15:47:22 +1000 Subject: [PATCH 321/323] rotate to always show controller at bottom right --- .../blocks/machine/MachinePWRController.java | 2 +- .../inventory/gui/GUIScreenSlicePrinter.java | 25 ++++++++++++++++--- .../com/hbm/items/machine/ItemPWRPrinter.java | 7 ++++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 61b9930dc..68007db4d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -56,7 +56,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { - return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); + return metadata == 0 && side != 0 && side != 1 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java index f26624082..915f99b1c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java @@ -18,12 +18,14 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraftforge.common.util.ForgeDirection; public class GUIScreenSlicePrinter extends GuiScreen { private final int x1, y1, z1; private final int x2, y2, z2; private final int sizeX, sizeY, sizeZ; + private final ForgeDirection dir; private HashSet whitelist; @@ -34,7 +36,7 @@ public class GUIScreenSlicePrinter extends GuiScreen { private String dirname; private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); - public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2) { + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir) { this.x1 = Math.min(x1, x2); this.y1 = Math.min(y1, y2); this.z1 = Math.min(z1, z2); @@ -42,6 +44,8 @@ public class GUIScreenSlicePrinter extends GuiScreen { this.y2 = Math.max(y1, y2); this.z2 = Math.max(z1, z2); + this.dir = dir; + this.sizeX = this.x2 - this.x1 + 1; this.sizeY = this.y2 - this.y1 + 1; this.sizeZ = this.z2 - this.z1 + 1; @@ -49,8 +53,8 @@ public class GUIScreenSlicePrinter extends GuiScreen { dirname = dateFormat.format(new Date()).toString(); } - public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, HashSet whitelist) { - this(x1, y1, z1, x2, y2, z2); + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir, HashSet whitelist) { + this(x1, y1, z1, x2, y2, z2, dir); this.whitelist = whitelist; } @@ -121,7 +125,20 @@ public class GUIScreenSlicePrinter extends GuiScreen { GL11.glRotated(-30, 1, 0, 0); GL11.glRotated(-45, 0, 1, 0); - GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + + if(dir == ForgeDirection.WEST) { + GL11.glRotated(180, 0, 1, 0); + } else if(dir == ForgeDirection.NORTH) { + GL11.glRotated(-90, 0, 1, 0); + } else if(dir == ForgeDirection.SOUTH) { + GL11.glRotated(90, 0, 1, 0); + } + + if(dir == ForgeDirection.WEST || dir == ForgeDirection.EAST) { + GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + } else { + GL11.glTranslated(sizeZ / -2D, -sizeY / 2D, sizeX / -2D); + } } } diff --git a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java index d7c3f5ee7..1ef5ec736 100644 --- a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java +++ b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java @@ -29,6 +29,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { private static int x1, y1, z1; private static int x2, y2, z2; private static Block[] blockSync; + private static ForgeDirection dir; private HashSet fill = new HashSet<>(); private static HashSet whitelist = new HashSet() {{ @@ -44,6 +45,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { buf.writeInt(x2); buf.writeInt(y2); buf.writeInt(z2); + buf.writeInt(dir.ordinal()); for(Block block : blockSync) { buf.writeInt(Block.getIdFromBlock(block)); @@ -59,6 +61,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { x2 = buf.readInt(); y2 = buf.readInt(); z2 = buf.readInt(); + dir = ForgeDirection.values()[buf.readInt()]; for(int x = x1; x <= x2; x++) { for(int y = y1; y <= y2; y++) { @@ -121,7 +124,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { } public void findBounds(World world, TileEntityPWRController pwr) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); + dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); fill.clear(); fill.add(new BlockPos(pwr.xCoord, pwr.yCoord, pwr.zCoord)); @@ -161,7 +164,7 @@ public class ItemPWRPrinter extends Item implements IGUIProvider { @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, whitelist); + return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, dir, whitelist); } @SuppressWarnings({ "unchecked", "rawtypes" }) From 4fba0fc42a5e8668311b8f721c84f8a45435fef4 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 29 Aug 2025 15:18:26 +0200 Subject: [PATCH 322/323] i forgor --- changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 1751d00af..191a7880f 100644 --- a/changelog +++ b/changelog @@ -1,5 +1,6 @@ ## Changed -* Updated ukrainian and chinese localization, including QMAW +* Updated ukrainian, chinese and russian localization, including QMAW +* Some previously hardcoded lang strings are now affected by translations * Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines * RBMK control rod colors and auto control rod settings are now copiable * Murky wings no longer have slowfall, and using shift+space cancels the momentum From 53d1323604a409da848b4b2393cf486f9529c3d3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 31 Aug 2025 12:08:19 +0200 Subject: [PATCH 323/323] i lied, get fucked --- .../java/com/hbm/entity/EntityMappings.java | 1 + .../projectile/EntityBulletBeamBase.java | 117 +- .../com/hbm/entity/projectile/EntityCoin.java | 51 + .../ae2/ArcFurnaceLargeMEInventory.java | 51 +- src/main/java/com/hbm/items/ModItems.java | 3 +- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 5 +- .../sedna/factory/GunFactoryClient.java | 3 + .../weapon/sedna/factory/LegoClient.java | 19 + .../sedna/factory/XFactoryAccelerator.java | 59 + .../items/weapon/sedna/impl/ItemGunNI4NI.java | 110 + .../weapon/sedna/mags/MagazineInfinite.java | 39 + src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 3 + .../render/entity/projectile/RenderCoin.java | 39 + .../item/weapon/sedna/ItemRenderNI4NI.java | 189 ++ src/main/java/com/hbm/util/ColorUtil.java | 24 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/models/weapons/n_i_4_n_i.obj | 2082 +++++++++++++++++ .../textures/models/trinkets/chip_gold.png | Bin 0 -> 1817 bytes .../hbm/textures/models/weapons/n_i_4_n_i.png | Bin 0 -> 3361 bytes .../models/weapons/n_i_4_n_i_greyscale.png | Bin 0 -> 3346 bytes 22 files changed, 2765 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityCoin.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderCoin.java create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java create mode 100644 src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj create mode 100644 src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 324c67a97..5f50d8f1a 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -205,6 +205,7 @@ public class EntityMappings { addEntity(EntityFallingBlockNT.class, "entity_falling_block_nt", 1000); addEntity(EntityBoatRubber.class, "entity_rubber_boat", 250, false); addEntity(EntityMissileStealth.class, "entity_missile_stealth", 1000); + addEntity(EntityCoin.class, "entity_coin", 1000); addEntity(EntityItemWaste.class, "entity_item_waste", 100); addEntity(EntityItemBuoyant.class, "entity_item_buoyant", 100); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java index 036971822..b14a5f80b 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java @@ -2,14 +2,19 @@ package com.hbm.entity.projectile; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -144,9 +149,30 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.worldObj.isRemote && this.doesImpactEntities()) { Entity hitEntity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); double nearest = 0.0D; MovingObjectPosition nonPenImpact = null; + MovingObjectPosition coinHit = null; + + double closestCoin = 0; + EntityCoin hitCoin = null; + + for(Entity entity : list) { + if(entity.isDead) continue; + if(entity instanceof EntityCoin) { + double hitbox = 0.3F; + AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); + MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); + if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + if(closestCoin == 0 || dist < closestCoin) { + closestCoin = dist; + hitCoin = (EntityCoin) entity; + coinHit = hitMop; + } + } + } + } for(int j = 0; j < list.size(); ++j) { Entity entity = (Entity) list.get(j); @@ -158,13 +184,14 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + // if penetration is enabled, run impact for all intersecting entities if(this.doesPenetrate()) { - this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + if(hitCoin == null || dist < closestCoin) { + this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + } } else { - - double dist = pos.distanceTo(hitMop.hitVec); - if(dist < nearest || nearest == 0.0D) { hitEntity = entity; nearest = dist; @@ -179,6 +206,86 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.doesPenetrate() && hitEntity != null) { mop = new MovingObjectPosition(hitEntity, nonPenImpact.hitVec); } + + if(hitCoin != null) { + Vec3 vec = Vec3.createVectorHelper(coinHit.hitVec.xCoord - posX, coinHit.hitVec.yCoord - posY, coinHit.hitVec.zCoord - posZ); + this.beamLength = vec.lengthVector(); + + double range = 50; + List targets = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord).expand(range, range, range)); + Entity nearestCoin = null; + Entity nearestPlayer = null; + Entity nearestMob = null; + Entity nearestOther = null; + double coinDist = 0; + double playerDist = 0; + double mobDist = 0; + double otherDist = 0; + + hitCoin.setDead(); + + // well i mean we could just uuse a single var for all variants and then overwrite stuff + // when we run into things with higher priority. however i can't be assed fuck off + for(Entity entity : targets) { + if(entity == this.getThrower()) continue; + if(entity.isDead) continue; + double dist = entity.getDistanceToEntity(hitCoin); + if(dist > range) continue; + + if(entity instanceof EntityCoin) { + if(coinDist == 0 || dist < coinDist) { + coinDist = dist; + nearestCoin = entity; + } + } else if(entity instanceof EntityPlayer) { + if(playerDist == 0 || dist < playerDist) { + playerDist = dist; + nearestPlayer = entity; + } + } else if(entity instanceof EntityMob) { + if(mobDist == 0 || dist < mobDist) { + mobDist = dist; + nearestMob = entity; + } + } else if(entity instanceof EntityLivingBase) { + if(otherDist == 0 || dist < otherDist) { + otherDist = dist; + nearestOther = entity; + } + } + } + + // ternary of shame + Entity target = nearestCoin != null ? nearestCoin : + nearestPlayer != null ? nearestPlayer : + nearestMob != null ? nearestMob : + nearestOther != null ? nearestOther : null; + + if(target != null) { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + Vec3 delta = Vec3.createVectorHelper(target.posX - newBeam.posX, (target.posY + target.height / 2D) - newBeam.posY, target.posZ - newBeam.posZ); + newBeam.setRotationsFromVector(delta); + newBeam.performHitscanExternal(delta.lengthVector()); + worldObj.spawnEntityInWorld(newBeam); + } else { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + newBeam.setRotationsFromVector(Vec3.createVectorHelper(rand.nextGaussian() * 0.5, -1, rand.nextGaussian() * 0.5)); + newBeam.performHitscanExternal(100); + worldObj.spawnEntityInWorld(newBeam); + } + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "largeexplode"); + data.setFloat("size", 1.5F); + data.setByte("count", (byte)1); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord), new TargetPoint(worldObj.provider.dimensionId, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, 100)); + + + return; + } } if(mop != null) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityCoin.java b/src/main/java/com/hbm/entity/projectile/EntityCoin.java new file mode 100644 index 000000000..15b1c6a33 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityCoin.java @@ -0,0 +1,51 @@ +package com.hbm.entity.projectile; + +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class EntityCoin extends EntityThrowableInterp { + + public EntityCoin(World world) { + super(world); + this.setSize(1F, 1F); + this.yOffset = 0.5F; + } + + @Override + public void onUpdate() { + super.onUpdate(); + } + + public void setPosition(double x, double y, double z) { + this.posX = x; + this.posY = y; + this.posZ = z; + float f = this.width / 2.0F; + this.boundingBox.setBounds(x - f, y - this.yOffset + this.ySize, z - f, x + f, y - this.yOffset + this.ySize + this.height, z + f); + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + if(mop.typeOfHit == mop.typeOfHit.BLOCK) this.setDead(); + } + + @Override + protected float getAirDrag() { + return 1F; + } + + @Override + public double getGravityVelocity() { + return 0.02D; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canAttackWithItem() { + return true; + } +} diff --git a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java index 5698bebed..3245629e6 100644 --- a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java +++ b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java @@ -1,7 +1,6 @@ package com.hbm.handler.ae2; import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; -import com.hbm.tileentity.TileEntityProxyCombo; import cpw.mods.fml.common.Optional; @@ -14,47 +13,47 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import net.minecraft.item.ItemStack; -@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2")}) +@Optional.InterfaceList({ @Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2") }) public class ArcFurnaceLargeMEInventory implements IMEInventory { - private TileEntityMachineArcFurnaceLarge afl; + private TileEntityMachineArcFurnaceLarge afl; - public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { - this.afl = afl; - } + public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { + this.afl = afl; + } - @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { - ItemStack is = input.getItemStack(); - is = afl.distributeInput(is, type == Actionable.MODULATE); + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack is = input.getItemStack(); + is = afl.distributeInput(is, type == Actionable.MODULATE); if(is == null) return null; - return AEApi.instance().storage().createItemStack(is); - } + return AEApi.instance().storage().createItemStack(is); + } - @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { ItemStack is = request.getItemStack(); is = afl.collectRequested(is, mode == Actionable.MODULATE); if(is == null) return null; return AEApi.instance().storage().createItemStack(is); - } + } - @Override - public IItemList getAvailableItems(IItemList out) { - ItemStack is; + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack is; for(int i = 0; i < 25; i++) { is = afl.getAvailableItemFromSlot(i); - if(is != null) out.add(AEApi.instance().storage().createItemStack(is)); + if(is != null) + out.add(AEApi.instance().storage().createItemStack(is)); } - return out; - } - - @Override - public StorageChannel getChannel() { - return StorageChannel.ITEMS; - } + return out; + } + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8a8c42675..0025e1f51 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1476,7 +1476,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; - public static Item gun_n_i_4_n_i; // we GET THERE when we GET THERE + public static Item gun_n_i_4_n_i; public static Item gun_charge_thrower; @@ -6400,6 +6400,7 @@ public class ModItems { GameRegistry.registerItem(gun_aberrator_eott, gun_aberrator_eott.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.getUnlocalizedName()); + GameRegistry.registerItem(gun_n_i_4_n_i, gun_n_i_4_n_i.getUnlocalizedName()); GameRegistry.registerItem(gun_fireext, gun_fireext.getUnlocalizedName()); GameRegistry.registerItem(gun_charge_thrower, gun_charge_thrower.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index c43550972..f950c9590 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -19,6 +19,7 @@ import com.hbm.items.IKeybindReceiver; import com.hbm.items.armor.ArmorTrenchmaster; import com.hbm.items.weapon.sedna.hud.IHUDComponent; import com.hbm.items.weapon.sedna.mags.IMagazine; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -173,7 +174,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I GunConfig config = getConfig(stack, i); for(Receiver rec : config.getReceivers(stack)) { IMagazine mag = rec.getMagazine(stack); - list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + if(!(mag instanceof MagazineInfinite)) { + list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + } float dmg = rec.getBaseDamage(stack); list.add(I18nUtil.resolveKey("gui.weapon.baseDamage") + ": " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index dfa406299..acca45ca7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -101,6 +101,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_charge_thrower, new ItemRenderChargeThrower()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_n_i_4_n_i, new ItemRenderNI4NI()); //PROJECTILES ammo_debug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); @@ -226,6 +227,8 @@ public class GunFactoryClient { p35800.setRendererBeam(LegoClient.RENDER_CRACKLE); p35800_bl.setRendererBeam(LegoClient.RENDER_BLACK_LIGHTNING); + + ni4ni_arc.setRendererBeam(LegoClient.RENDER_NI4NI_BOLT); ct_hook.setRenderer(LegoClient.RENDER_CT_HOOK); ct_mortar.setRenderer(LegoClient.RENDER_CT_MORTAR); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 0b835d173..a2bf670d2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -397,6 +397,25 @@ public class LegoClient { GL11.glPopMatrix(); RenderArcFurnace.fullbright(false); }; + + public static BiConsumer RENDER_NI4NI_BOLT = (bullet, interp) -> { + + RenderArcFurnace.fullbright(true); + double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + + GL11.glPushMatrix(); + GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); + GL11.glRotatef(-bullet.rotationPitch - 90, 1F, 0, 0); + + double scale = 5D; + GL11.glScaled(age * scale, 1, age * scale); + GL11.glTranslated(0, bullet.beamLength, 0); + GL11.glRotatef(-90, 0, 0, 1); + renderBulletStandard(Tessellator.instance, 0xAAD2E5, 0xffffff, bullet.beamLength, true); + + GL11.glPopMatrix(); + RenderArcFurnace.fullbright(false); + }; public static BiConsumer RENDER_LASER_RED = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x80, 0x15, 0x15); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java index 7f8bfa5a9..86905b000 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java @@ -5,6 +5,7 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.entity.projectile.EntityCoin; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -14,7 +15,9 @@ import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; import com.hbm.items.weapon.sedna.mags.MagazineBelt; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; import com.hbm.main.MainRegistry; import com.hbm.render.anim.BusAnimation; @@ -22,11 +25,13 @@ import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.util.DamageResistanceHandler.DamageClass; +import com.hbm.util.Vec3NT; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; @@ -41,6 +46,8 @@ public class XFactoryAccelerator { public static BulletConfig coil_tungsten; public static BulletConfig coil_ferrouranium; + public static BulletConfig ni4ni_arc; + public static Consumer LAMBDA_UPDATE_TUNGSTEN = (entity) -> {breakInPath(entity, 1.25F); }; public static Consumer LAMBDA_UPDATE_FERRO = (entity) -> { breakInPath(entity, 2.5F); }; @@ -89,6 +96,9 @@ public class XFactoryAccelerator { .setOnUpdate(LAMBDA_UPDATE_TUNGSTEN); coil_ferrouranium = new BulletConfig().setItem(EnumAmmo.COIL_FERROURANIUM).setVel(7.5F).setLife(50).setDoesPenetrate(true).setDamageFalloffByPen(false).setSpectral(true) .setOnUpdate(LAMBDA_UPDATE_FERRO); + + ni4ni_arc = new BulletConfig().setupDamageClass(DamageClass.PHYSICAL).setBeam().setLife(5).setThresholdNegation(10F).setArmorPiercing(0.2F).setRenderRotations(false).setDoesPenetrate(false) + .setOnBeamImpact(BulletConfig.LAMBDA_BEAM_HIT); tauChargeMag.addConfigs(tau_uranium_charge); @@ -118,6 +128,18 @@ public class XFactoryAccelerator { .setupStandardConfiguration() .anim(LAMBDA_COILGUN_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) ).setUnlocalizedName("gun_coilgun"); + + ModItems.gun_n_i_4_n_i = new ItemGunNI4NI(WeaponQuality.SPECIAL, new GunConfig() + .dura(0).draw(5).inspect(39).crosshair(Crosshair.CIRCLE) + .rec(new Receiver(0) + .dmg(35F).delay(10).sound("hbm:weapon.coilgunShoot", 1.0F, 1.0F) + .mag(new MagazineInfinite(ni4ni_arc)) + .offset(0.75, -0.0625, -0.1875D) + .setupStandardFire().fire(Lego.LAMBDA_NOWEAR_FIRE)) + .setupStandardConfiguration() + .ps(LAMBDA_NI4NI_SECONDARY_PRESS) + .anim(LAMBDA_NI4NI_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) + ).setUnlocalizedName("gun_n_i_4_n_i"); } public static BiConsumer LAMBDA_TAU_PRIMARY_RELEASE = (stack, ctx) -> { @@ -163,6 +185,27 @@ public class XFactoryAccelerator { } }; + public static BiConsumer LAMBDA_NI4NI_SECONDARY_PRESS = (stack, ctx) -> { + if(ctx.getPlayer() == null) return; + EntityPlayer player = ctx.getPlayer(); + + if(ItemGunNI4NI.getCoinCount(stack) > 0) { + Vec3NT vec = new Vec3NT(player.getLookVec()).multiply(0.8D); + EntityCoin coin = new EntityCoin(player.worldObj); + coin.setPosition(player.posX, player.posY + player.getEyeHeight() - coin.yOffset - 0.125, player.posZ); + coin.motionX = vec.xCoord; + coin.motionY = vec.yCoord + 0.5; + coin.motionZ = vec.zCoord; + coin.rotationYaw = player.rotationYaw; + coin.setThrower(player); + player.worldObj.spawnEntityInWorld(coin); + + player.worldObj.playSoundAtEntity(player, "random.orb", 1.0F, 1F + player.getRNG().nextFloat() * 0.25F); + + ItemGunNI4NI.setCoinCount(stack, ItemGunNI4NI.getCoinCount(stack) - 1); + } + }; + public static BiConsumer LAMBDA_RECOIL_TAU = (stack, ctx) -> { }; public static BiConsumer LAMBDA_RECOIL_COILGUN = (stack, ctx) -> { @@ -196,4 +239,20 @@ public class XFactoryAccelerator { if(type == AnimType.RELOAD) return new BusAnimation().addBus("RELOAD", new BusAnimationSequence().addPos(1, 0, 0, 250).addPos(1, 0, 0, 500).addPos(0, 0, 0, 250)); return null; }; + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_NI4NI_ANIMS = (stack, type) -> { + switch(type) { + case EQUIP: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 2, 0, 0, 500)); + case CYCLE: + boolean aiming = ItemGunBaseNT.getIsAiming(stack); + return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(aiming ? -5 : -30, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("DRUM", new BusAnimationSequence().hold(50).addPos(0, 0, 120, 300, IType.SIN_FULL)); + case INSPECT: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 3, 0, 0, 750).hold(100).addPos(0, 0, 0, 750)); + } + + return null; + }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java new file mode 100644 index 000000000..71619f721 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java @@ -0,0 +1,110 @@ +package com.hbm.items.weapon.sedna.impl; + +import java.util.List; + +import com.hbm.items.ICustomizable; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.util.ChatBuilder; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemGunNI4NI extends ItemGunBaseNT implements ICustomizable { + + public ItemGunNI4NI(WeaponQuality quality, GunConfig... cfg) { + super(quality, cfg); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { + super.onUpdate(stack, world, entity, slot, isHeld); + + if(!world.isRemote) { + if(this.getCoinCount(stack) < 4) { + this.setCoinCharge(stack, this.getCoinCharge(stack) + 1); + + if(this.getCoinCharge(stack) >= 80) { + this.setCoinCharge(stack, 0); + int newCount = this.getCoinCount(stack) + 1; + this.setCoinCount(stack, newCount); + + if(isHeld) { + world.playSoundAtEntity(entity, "hbm:item.techBoop", 1.0F, 1.25F + newCount * 0.125F); + } + } + } + } + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add("Now, don't get the wrong idea."); + list.add("I " + EnumChatFormatting.RED + "fucking hate " + EnumChatFormatting.GRAY + "this game."); + list.add("I didn't do this for you, I did it for sea."); + super.addInformation(stack, player, list, ext); + } + + @Override + public void customize(EntityPlayer player, ItemStack stack, String... args) { + + if(args.length == 0) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Colors reset!").color(EnumChatFormatting.GREEN).flush()); + return; + } + + if(args.length != 3) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Requires three hexadecimal colors!").color(EnumChatFormatting.RED).flush()); + return; + } + + try { + int dark = Integer.parseInt(args[0], 16); + int light = Integer.parseInt(args[1], 16); + int grip = Integer.parseInt(args[2], 16); + + if(dark < 0 || dark > 0xffffff || light < 0 || light > 0xffffff || grip < 0 || grip > 0xffffff) { + player.addChatComponentMessage(ChatBuilder.start("Colors must range from 0 to FFFFFF!").color(EnumChatFormatting.RED).flush()); + return; + } + + setColors(stack, dark, light, grip); + player.addChatComponentMessage(ChatBuilder.start("Colors set!").color(EnumChatFormatting.GREEN).flush()); + + } catch(Throwable ex) { + player.addChatComponentMessage(ChatBuilder.start(ex.getLocalizedMessage()).color(EnumChatFormatting.RED).flush()); + } + } + + public static void resetColors(ItemStack stack) { + if(!stack.hasTagCompound()) return; + stack.stackTagCompound.removeTag("colors"); + } + + public static void setColors(ItemStack stack, int dark, int light, int grip) { + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setIntArray("colors", new int[] {dark, light, grip}); + } + + public static int[] getColors(ItemStack stack) { + if(!stack.hasTagCompound() || !stack.stackTagCompound.hasKey("colors")) return null; + int[] colors = stack.stackTagCompound.getIntArray("colors"); + if(colors.length != 3) return null; + return colors; + } + + public static final String KEY_COIN_COUNT = "coincount"; + public static final String KEY_COIN_CHARGE = "coincharge"; + public static int getCoinCount(ItemStack stack) { return getValueInt(stack, KEY_COIN_COUNT); } + public static void setCoinCount(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_COUNT, value); } + public static int getCoinCharge(ItemStack stack) { return getValueInt(stack, KEY_COIN_CHARGE); } + public static void setCoinCharge(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_CHARGE, value); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java new file mode 100644 index 000000000..263d4134b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java @@ -0,0 +1,39 @@ +package com.hbm.items.weapon.sedna.mags; + +import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.particle.SpentCasing; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class MagazineInfinite implements IMagazine { + + public BulletConfig type; + + public MagazineInfinite(BulletConfig type) { + this.type = type; + } + + @Override + public Object getType(ItemStack stack, IInventory inventory) { + return this.type; + } + + @Override public void setType(ItemStack stack, Object type) { } + @Override public int getCapacity(ItemStack stack) { return 9999; } + @Override public int getAmount(ItemStack stack, IInventory inventory) { return 9999; } + @Override public void setAmount(ItemStack stack, int amount) { } + @Override public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) { } + @Override public boolean canReload(ItemStack stack, IInventory inventory) { return false; } + @Override public void initNewType(ItemStack stack, IInventory inventory) { } + @Override public void reloadAction(ItemStack stack, IInventory inventory) { } + @Override public ItemStack getIconForHUD(ItemStack stack, EntityPlayer player) { return new ItemStack(ModItems.nothing); } + @Override public String reportAmmoStateForHUD(ItemStack stack, EntityPlayer player) { return "∞"; } + @Override public SpentCasing getCasing(ItemStack stack, IInventory inventory) { return this.type.casing; } + @Override public void setAmountBeforeReload(ItemStack stack, int amount) { } + @Override public int getAmountBeforeReload(ItemStack stack) { return 9999; } + @Override public void setAmountAfterReload(ItemStack stack, int amount) { } + @Override public int getAmountAfterReload(ItemStack stack) { return 9999; } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index ef36a2084..711e5cbd6 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -619,6 +619,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryRocket.class, new RenderArtilleryRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); + RenderingRegistry.registerEntityRenderingHandler(EntityCoin.class, new RenderCoin()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); RenderingRegistry.registerEntityRenderingHandler(EntityMist.class, new RenderMist()); RenderingRegistry.registerEntityRenderingHandler(EntityFireLingering.class, new RenderMist()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index bc109ad26..8f51419f4 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -907,6 +907,7 @@ public class ResourceManager { public static final IModelCustom aberrator = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/aberrator.obj")).asVBO(); public static final IModelCustom mas36 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/mas36.obj")).asVBO(); public static final IModelCustom charge_thrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/charge_thrower.obj")).asVBO(); + public static final IModelCustom n_i_4_n_i = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/n_i_4_n_i.obj")).asVBO(); public static final HashMap spas_12_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/spas12.json")); public static final HashMap congolake_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/congolake.json")); @@ -1044,6 +1045,8 @@ public class ResourceManager { public static final ResourceLocation charge_thrower_hook_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_hook.png"); public static final ResourceLocation charge_thrower_mortar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_mortar.png"); public static final ResourceLocation charge_thrower_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_rocket.png"); + public static final ResourceLocation n_i_4_n_i_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i.png"); + public static final ResourceLocation n_i_4_n_i_greyscale_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i_greyscale.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java new file mode 100644 index 000000000..9948c3573 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.render.loader.HFRWavefrontObject; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelCustom; + +public class RenderCoin extends Render { + + public static final IModelCustom coin = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/chip.obj")).asVBO(); + public static final ResourceLocation coin_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/chip_gold.png"); + + @Override + public void doRender(Entity coin, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(coin.prevRotationYaw + (coin.rotationYaw - coin.prevRotationYaw) * f1 - 90.0F, 0.0F, -1.0F, 0.0F); + GL11.glRotated((coin.ticksExisted + f1) * 45, 0, 0, 1); + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + + this.bindEntityTexture(coin); + this.coin.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return coin_tex; + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java new file mode 100644 index 000000000..ce4f8a846 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java @@ -0,0 +1,189 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; +import com.hbm.render.tileentity.RenderArcFurnace; +import com.hbm.util.ColorUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderNI4NI extends ItemRenderWeaponBase { + + @Override + protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } + + @Override + public float getViewFOV(ItemStack stack, float fov) { + float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; + return fov * (1 - aimingProgress * 0.33F); + } + + @Override + public void setupFirstPerson(ItemStack stack) { + GL11.glTranslated(0, 0, 1); + + float offset = 0.8F; + standardAimingTransform(stack, + -1.0F * offset, -1F * offset, 1F * offset, + 0, -5 / 8D, 0.125); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + double scale = 0.3125D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] drum = HbmAnimations.getRelevantTransformation("DRUM"); + + GL11.glTranslated(0, 0, -2.25); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, 0, 2.25); + + GL11.glTranslated(0, -1, -6); + GL11.glRotated(recoil[0], 1, 0, 0); + GL11.glTranslated(0, 1, 6); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + GL11.glPushMatrix(); + + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.1875D, 0); + GL11.glRotated(drum[2], 0, 0, 1); + GL11.glTranslated(0, -1.1875D, 0); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + RenderArcFurnace.fullbright(true); + GL11.glColor3f(1F, 1F, 1F); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + RenderArcFurnace.fullbright(false); + GL11.glPopMatrix(); + + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + int coinCount = ItemGunNI4NI.getCoinCount(stack); + if(coinCount > 3) ResourceManager.n_i_4_n_i.renderPart("Coin1"); + if(coinCount > 2) ResourceManager.n_i_4_n_i.renderPart("Coin2"); + if(coinCount > 1) ResourceManager.n_i_4_n_i.renderPart("Coin3"); + if(coinCount > 0) ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + RenderArcFurnace.fullbright(false); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 4); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + GL11.glScaled(0.125, 0.125, 0.125); + this.renderLaserFlash(gun.lastShot[0], 75, 7.5, 0xFFFFFF); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, 0.25, 3); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + super.setupInv(stack); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(0, 0, 0); + } + + @Override + public void setupModTable(ItemStack stack) { + double scale = -15D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, -0.5, 0); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + GL11.glColor3f(1F, 1F, 1F); + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + ResourceManager.n_i_4_n_i.renderPart("Coin1"); + ResourceManager.n_i_4_n_i.renderPart("Coin2"); + ResourceManager.n_i_4_n_i.renderPart("Coin3"); + ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glColor3f(1F, 1F, 1F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + RenderArcFurnace.fullbright(false); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index c863c5d02..28b76c6ab 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -70,6 +70,30 @@ public class ColorUtil { return 0xFFFFFF; } } + + public static int ir(int color) { + return (color & 0xff0000) >> 16; + } + + public static int ig(int color) { + return (color & 0x00ff00) >> 8; + } + + public static int ib(int color) { + return (color & 0x0000ff) >> 0; + } + + public static float fr(int color) { + return ir(color) / 255F; + } + + public static float fg(int color) { + return ig(color) / 255F; + } + + public static float fb(int color) { + return ib(color) / 255F; + } @SideOnly(Side.CLIENT) public static int getMedianBrightnessColorFromStack(ItemStack stack) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 037898b56..b59ad8b12 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2167,6 +2167,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Doppelete Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Raketenwerfer +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Bündelrevolver item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Vierfachraketenwerfer diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c84185573..a5f161efb 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3009,6 +3009,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Dual Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Missile Launcher +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Pepperbox item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Quad Rocket Launcher diff --git a/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj new file mode 100644 index 000000000..3970858be --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj @@ -0,0 +1,2082 @@ +# Blender v2.79 (sub 0) OBJ File: 'n_i_4_n_i.blend' +# www.blender.org +o Barrel +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +vt 0.000000 0.283342 +vt 0.003261 0.276923 +vt 0.029348 0.276923 +vt 0.032609 0.283342 +vt 0.032609 0.455120 +vt 0.029348 0.461538 +vt 0.003261 0.461538 +vt 0.000000 0.455120 +vn 0.0000 0.0000 1.0000 +s off +f 1/1/1 5/2/1 6/3/1 +f 6/3/1 2/4/1 1/1/1 +f 2/4/1 4/5/1 1/1/1 +f 4/5/1 8/6/1 7/7/1 +f 7/7/1 3/8/1 4/5/1 +f 3/8/1 1/1/1 4/5/1 +o Coin4 +v -0.093750 1.637782 -2.619801 +v -0.143468 1.652344 -2.605239 +v -0.164062 1.687500 -2.570082 +v -0.143468 1.722656 -2.534926 +v -0.093750 1.737218 -2.520364 +v -0.044032 1.722656 -2.534926 +v -0.023438 1.687500 -2.570082 +v -0.044032 1.652344 -2.605239 +vt 0.603153 0.499831 +vt 0.456926 0.499831 +vt 0.603153 0.000168 +vt 0.353527 0.353482 +vt 0.353528 0.146514 +vt 0.456926 0.000168 +vt 0.706551 0.146516 +vt 0.706551 0.353483 +vn -0.0000 0.7071 -0.7071 +s off +f 16/9/2 9/10/2 13/11/2 +f 9/10/2 10/12/2 13/11/2 +f 10/12/2 11/13/2 13/11/2 +f 11/13/2 12/14/2 13/11/2 +f 13/11/2 14/15/2 15/16/2 +f 15/16/2 16/9/2 13/11/2 +o Coin3 +v 0.093750 1.637782 -2.619801 +v 0.044032 1.652344 -2.605239 +v 0.023438 1.687500 -2.570082 +v 0.044032 1.722656 -2.534926 +v 0.093750 1.737218 -2.520364 +v 0.143468 1.722656 -2.534926 +v 0.164062 1.687500 -2.570082 +v 0.143468 1.652344 -2.605239 +vt 0.249793 0.999831 +vt 0.103566 0.999831 +vt 0.249793 0.500168 +vt 0.000168 0.853484 +vt 0.000168 0.646516 +vt 0.103566 0.500168 +vt 0.353191 0.646516 +vt 0.353191 0.853484 +vn -0.0000 0.7071 -0.7071 +s off +f 24/17/3 17/18/3 21/19/3 +f 17/18/3 18/20/3 21/19/3 +f 18/20/3 19/21/3 21/19/3 +f 19/21/3 20/22/3 21/19/3 +f 21/19/3 22/23/3 23/24/3 +f 23/24/3 24/17/3 21/19/3 +o Coin2 +v -0.093750 1.770364 -2.487219 +v -0.143468 1.784926 -2.472656 +v -0.164062 1.820082 -2.437500 +v -0.143468 1.855239 -2.402344 +v -0.093750 1.869801 -2.387782 +v -0.044032 1.855239 -2.402344 +v -0.023438 1.820082 -2.437500 +v -0.044032 1.784926 -2.472656 +vt 0.353191 0.353483 +vt 0.249794 0.499832 +vt 0.103566 0.000168 +vt 0.103566 0.499832 +vt 0.000168 0.353484 +vt 0.000168 0.146517 +vt 0.249794 0.000168 +vt 0.353191 0.146516 +vn 0.0000 0.7071 -0.7071 +s off +f 32/25/4 25/26/4 29/27/4 +f 25/26/4 26/28/4 27/29/4 +f 27/29/4 28/30/4 25/26/4 +f 28/30/4 29/27/4 25/26/4 +f 29/27/4 30/31/4 31/32/4 +f 31/32/4 32/25/4 29/27/4 +o Coin1 +v 0.093750 1.770364 -2.487219 +v 0.044032 1.784926 -2.472656 +v 0.023438 1.820082 -2.437500 +v 0.044032 1.855239 -2.402344 +v 0.093750 1.869801 -2.387782 +v 0.143468 1.855239 -2.402344 +v 0.164062 1.820082 -2.437500 +v 0.143468 1.784926 -2.472656 +vt 0.706549 0.853483 +vt 0.603152 0.999832 +vt 0.456925 0.500169 +vt 0.456925 0.999831 +vt 0.353527 0.853484 +vt 0.353527 0.646516 +vt 0.603152 0.500168 +vt 0.706550 0.646517 +vn 0.0000 0.7071 -0.7071 +s off +f 40/33/5 33/34/5 37/35/5 +f 33/34/5 34/36/5 37/35/5 +f 34/36/5 35/37/5 37/35/5 +f 35/37/5 36/38/5 37/35/5 +f 37/35/5 38/39/5 39/40/5 +f 39/40/5 40/33/5 37/35/5 +o Grip +v -0.312500 0.500000 -2.000000 +v 0.312500 0.500000 -2.000000 +v -0.312500 1.250000 -3.125000 +v 0.312500 1.250000 -3.125000 +v -0.156250 1.250000 -3.375000 +v 0.156250 1.250000 -3.375000 +v -0.156250 1.000000 -3.375000 +v 0.156250 1.000000 -3.375000 +v -0.187500 0.625000 -3.000000 +v 0.187500 0.625000 -3.000000 +v -0.187500 0.250000 -1.750000 +v 0.187500 0.250000 -1.750000 +v -0.187500 -1.250000 -2.500000 +v 0.187500 -1.250000 -2.500000 +v -0.187500 -2.000000 -2.500000 +v 0.187500 -2.000000 -2.500000 +v -0.187500 -1.687500 -4.000000 +v 0.187500 -1.687500 -4.000000 +v 0.312500 -1.125000 -2.875000 +v 0.312500 -1.625000 -2.875000 +v 0.312500 -1.500000 -3.625000 +v 0.312500 0.375000 -2.750000 +v -0.312500 -1.125000 -2.875000 +v -0.312500 -1.625000 -2.875000 +v -0.312500 -1.500000 -3.625000 +v -0.312500 0.375000 -2.750000 +vt 0.788043 0.446154 +vt 0.885870 0.523077 +vt 0.788043 0.523077 +vt 0.885870 0.446154 +vt 0.907609 0.503846 +vt 0.964674 0.446154 +vt 0.991848 0.415385 +vt 0.991848 0.446154 +vt 0.964674 0.415385 +vt 0.994565 0.369231 +vt 0.766304 0.461538 +vt 0.733696 0.323077 +vt 0.766304 0.138462 +vt 0.766304 0.323077 +vt 0.733696 0.138462 +vt 0.766304 0.046154 +vt 0.831522 0.000000 +vt 0.961957 0.046154 +vt 0.831522 0.046154 +vt 0.961957 0.369231 +vt 0.994565 0.084615 +vt 0.961957 0.084615 +vt 0.864130 0.092308 +vt 0.929348 0.107692 +vt 0.864130 0.146154 +vt 0.788043 0.353846 +vt 0.864130 0.092308 +vt 0.831522 0.138462 +vt 0.961957 0.084615 +vt 0.929348 0.107692 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 0.956522 0.338462 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 1.000000 0.338462 +vt 0.831522 0.138462 +vt 0.864130 0.146154 +vt 0.766304 0.323077 +vt 0.788043 0.353846 +vt 0.885870 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.465385 +vt 0.766304 0.507692 +vt 0.733696 0.046154 +vt 0.961957 0.000000 +vt 0.831522 0.046154 +vn 0.0000 0.8321 0.5547 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.9790 -0.2040 +vn 0.0000 0.3969 -0.9179 +vn -0.8920 -0.4460 -0.0743 +vn 0.9381 -0.1642 0.3049 +vn 0.9487 0.0000 0.3162 +vn 0.9186 -0.3868 -0.0806 +vn 0.9360 0.1489 -0.3191 +vn 1.0000 0.0000 0.0000 +vn -0.9360 0.1489 -0.3191 +vn -0.9487 0.0000 0.3162 +vn -0.9381 -0.1642 0.3049 +vn -1.0000 0.0000 0.0000 +vn 0.8480 0.0000 -0.5300 +vn 0.9029 -0.1693 -0.3950 +vn -0.9029 -0.1693 -0.3950 +vn -0.8480 0.0000 -0.5300 +vn -0.9186 -0.3868 -0.0806 +vn 0.9526 -0.1361 0.2722 +vn 0.8920 -0.4460 -0.0743 +vn 0.9073 0.1669 -0.3859 +vn -0.9073 0.1669 -0.3859 +vn -0.9526 -0.1361 0.2722 +s off +f 42/41/6 43/42/6 41/43/6 +f 44/44/7 45/45/7 43/42/7 +f 46/46/8 47/47/8 45/48/8 +f 48/49/9 49/50/9 47/47/9 +f 41/43/10 52/51/10 42/41/10 +f 51/52/11 54/53/11 52/54/11 +f 53/55/12 56/56/12 54/53/12 +f 55/57/13 58/58/13 56/59/13 +f 50/60/14 57/61/14 49/50/14 +f 57/62/15 64/63/15 65/64/15 +f 52/54/16 59/65/16 42/66/16 +f 60/67/17 54/68/17 56/59/17 +f 58/69/18 60/67/18 56/59/18 +f 61/70/19 50/71/19 62/72/19 +f 60/67/20 61/70/20 59/65/20 +f 59/65/20 62/72/20 42/66/20 +f 50/60/9 48/49/9 62/73/9 +f 42/66/20 62/72/20 44/44/20 +f 49/74/21 65/64/21 66/75/21 +f 47/47/9 49/50/9 66/76/9 +f 64/63/22 53/77/22 63/78/22 +f 63/78/23 51/79/23 41/80/23 +f 64/63/24 63/78/24 65/64/24 +f 63/78/24 66/75/24 65/64/24 +f 41/80/24 43/81/24 66/75/24 +f 44/44/25 48/82/25 46/83/25 +f 44/44/26 62/72/26 48/82/26 +f 66/75/27 43/81/27 47/84/27 +f 47/84/28 43/81/28 45/85/28 +f 42/41/6 44/44/6 43/42/6 +f 44/44/7 46/86/7 45/45/7 +f 46/46/8 48/49/8 47/47/8 +f 48/49/9 50/60/9 49/50/9 +f 41/43/10 51/87/10 52/51/10 +f 51/52/11 53/55/11 54/53/11 +f 53/55/12 55/88/12 56/56/12 +f 55/57/13 57/89/13 58/58/13 +f 50/60/14 58/69/14 57/61/14 +f 57/62/29 55/90/29 64/63/29 +f 52/54/30 54/68/30 59/65/30 +f 60/67/17 59/65/17 54/68/17 +f 58/69/31 61/70/31 60/67/31 +f 61/70/32 58/69/32 50/71/32 +f 59/65/20 61/70/20 62/72/20 +f 49/74/33 57/62/33 65/64/33 +f 64/63/22 55/90/22 53/77/22 +f 63/78/34 53/77/34 51/79/34 +f 63/78/24 41/80/24 66/75/24 +o FrameLight +v -0.437500 0.500000 -0.250000 +v -0.375000 1.000000 -0.250000 +v 0.437500 0.875000 -0.250000 +v 0.437500 0.500000 -0.250000 +v 0.375000 1.000000 -0.250000 +v -0.437500 0.875000 2.500000 +v -0.437500 0.500000 2.500000 +v -0.375000 1.500000 -0.250000 +v 0.375000 1.500000 -0.250000 +v -0.187500 1.687500 -0.250000 +v 0.187500 1.687500 -0.250000 +v -0.375000 1.500000 3.250000 +v -0.375000 1.375000 3.250000 +v -0.375000 1.375000 2.875000 +v -0.375000 1.000000 2.500000 +v 0.187500 1.625000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.312500 1.500000 3.250000 +v 0.437500 0.875000 2.500000 +v 0.437500 0.500000 2.500000 +v 0.375000 1.500000 3.250000 +v 0.375000 1.375000 3.250000 +v 0.375000 1.375000 2.875000 +v 0.375000 1.000000 2.500000 +v -0.187500 1.687500 3.250000 +v 0.187500 1.687500 3.250000 +v 0.312500 1.375000 3.250000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 -0.250000 +v 0.125000 0.125000 -0.750000 +v -0.125000 0.125000 -0.750000 +v 0.125000 -0.375000 -0.750000 +v -0.125000 -0.375000 -0.750000 +v 0.125000 -0.375000 -2.125000 +v -0.125000 -0.375000 -2.125000 +v 0.125000 -0.250000 -2.125000 +v -0.125000 -0.250000 -2.125000 +v 0.125000 -0.250000 -1.000000 +v -0.125000 -0.250000 -1.000000 +v 0.125000 0.125000 -0.875000 +v -0.125000 0.125000 -0.875000 +v 0.000000 1.500000 -2.625000 +v -0.132583 1.445083 -2.625000 +v -0.187500 1.312500 -2.625000 +v -0.132583 1.179917 -2.625000 +v 0.000000 1.125000 -2.625000 +v 0.132583 1.179917 -2.625000 +v 0.187500 1.312500 -2.625000 +v 0.132583 1.445083 -2.625000 +v 0.000000 1.500000 -3.125000 +v -0.132583 1.445083 -3.125000 +v -0.187500 1.312500 -3.125000 +v -0.132583 1.179917 -3.125000 +v 0.000000 1.125000 -3.125000 +v 0.132583 1.179917 -3.125000 +v 0.187500 1.312500 -3.125000 +v 0.132583 1.445083 -3.125000 +v 0.000000 1.453125 -3.125000 +v -0.099437 1.411937 -3.125000 +v -0.140625 1.312500 -3.125000 +v -0.099437 1.213063 -3.125000 +v 0.000000 1.171875 -3.125000 +v 0.099437 1.213063 -3.125000 +v 0.140625 1.312500 -3.125000 +v 0.099437 1.411937 -3.125000 +v -0.099437 1.411937 -3.250000 +v 0.000000 1.453125 -3.250000 +v -0.140625 1.312500 -3.250000 +v -0.099437 1.213063 -3.250000 +v 0.000000 1.171875 -3.250000 +v 0.099437 1.213063 -3.250000 +v 0.140625 1.312500 -3.250000 +v 0.099437 1.411937 -3.250000 +v -0.250000 1.864277 -2.260723 +v 0.250000 1.864277 -2.260723 +v -0.250000 1.510723 -2.614277 +v 0.250000 1.510723 -2.614277 +v -0.250000 1.554917 -2.658471 +v -0.250000 1.908471 -2.304918 +v 0.250000 1.908471 -2.304918 +v 0.250000 1.554917 -2.658471 +v 0.125000 -0.187500 -1.625000 +v -0.125000 -0.187500 -1.625000 +v 0.125000 -0.187500 -1.750000 +v -0.125000 -0.187500 -1.750000 +v 0.125000 -0.062500 -1.687500 +v -0.125000 -0.062500 -1.687500 +v 0.125000 -0.062500 -1.812500 +v -0.125000 -0.062500 -1.812500 +v 0.125000 0.125000 -1.687500 +v -0.125000 0.125000 -1.687500 +v 0.125000 0.125000 -1.812500 +v -0.125000 0.125000 -1.812500 +v 0.062500 -0.062500 -1.812500 +v -0.062500 -0.062500 -1.812500 +v 0.062500 -0.062500 -1.937500 +v -0.062500 -0.062500 -1.937500 +v 0.062500 0.125000 -1.812500 +v -0.062500 0.125000 -1.812500 +v -0.312500 0.375000 -0.250000 +v -0.437500 0.875000 -0.250000 +vt 0.516304 0.346154 +vt 0.277174 0.323077 +vt 0.516304 0.323077 +vt 0.277174 0.392308 +vt 0.271739 0.407692 +vt 0.266304 0.407692 +vt 0.277174 0.653846 +vt 0.516304 0.700000 +vt 0.277174 0.700000 +vt 0.277174 0.638462 +vt 0.516304 0.653846 +vt 0.277174 0.346154 +vt 0.516304 0.392308 +vt 0.195652 0.569231 +vt 0.206522 0.546154 +vt 0.211957 0.546154 +vt 0.184783 0.569231 +vt 0.195652 0.561538 +vt 0.152174 0.561538 +vt 0.184783 0.561538 +vt 0.152174 0.569231 +vt 0.119565 0.561538 +vt 0.516304 0.576923 +vt 0.244565 0.592308 +vt 0.195652 0.484615 +vt 0.184783 0.476923 +vt 0.195652 0.476923 +vt 0.586957 0.469231 +vt 0.630435 0.484615 +vt 0.630435 0.561538 +vt 0.119565 0.476923 +vt 0.152174 0.484615 +vt 0.119565 0.484615 +vt 0.206522 0.500000 +vt 0.266304 0.638462 +vt 0.271739 0.638462 +vt 0.152174 0.476923 +vt 0.184783 0.484615 +vt 0.516304 0.723077 +vt 0.277174 0.723077 +vt 0.211957 0.500000 +vt 0.043478 0.876923 +vt 0.000000 0.907692 +vt 0.000000 0.876923 +vt 0.163043 0.876923 +vt 0.043478 0.907692 +vt 0.032609 1.000000 +vt 0.130435 0.969231 +vt 0.130435 1.000000 +vt -0.000000 1.000000 +vt 0.032609 0.969231 +vt 0.065217 0.861538 +vt 0.163043 0.861538 +vt 0.043478 0.815385 +vt 0.163043 0.907692 +vt 0.065217 0.923077 +vt 0.043478 0.969231 +vt 0.054348 0.969231 +vt 0.951314 0.546154 +vt 0.967391 0.523398 +vt 0.983469 0.546154 +vt 0.980467 0.573800 +vt 0.983633 0.584615 +vt 0.962020 0.584615 +vt 0.913043 0.515385 +vt 0.956522 0.453846 +vt 0.956522 0.515385 +vt 0.956522 0.446154 +vt 0.913043 0.453846 +vt 0.913043 0.446154 +vt 0.913043 0.523077 +vt 0.956522 0.523077 +vt 0.907609 0.453846 +vt 0.907609 0.515385 +vt 0.961957 0.453846 +vt 0.711957 0.630769 +vt 0.733696 0.646154 +vt 0.711957 0.646154 +vt 0.744565 0.669231 +vt 0.733696 0.692308 +vt 0.733696 0.669231 +vt 0.744565 0.646154 +vt 0.766304 0.646154 +vt 0.777174 0.669231 +vt 0.766304 0.669231 +vt 0.722826 0.715385 +vt 0.711957 0.730769 +vt 0.711957 0.715385 +vt 0.766304 0.692308 +vt 0.722826 0.730769 +vt 0.711957 0.753846 +vt 0.711957 0.692308 +vt 0.516304 0.546154 +vt 0.211957 0.469231 +vt 0.516304 0.500000 +vt 0.244565 0.453846 +vt 0.277174 0.407692 +vt 0.516304 0.469231 +vt 0.516304 0.407692 +vt 0.211957 0.576923 +vt 0.266304 0.330769 +vt 0.516304 0.638462 +vt 0.119565 0.569231 +vt 0.211957 0.592308 +vt 0.576087 0.569231 +vt 0.532609 0.569231 +vt 0.576087 0.476923 +vt 0.532609 0.476923 +vt 0.586957 0.576923 +vt 0.619565 0.469231 +vt 0.619565 0.576923 +vt 0.266304 0.715385 +vt -0.000000 0.969231 +vt 0.054348 0.815385 +vt 0.163043 0.923077 +vt 0.978760 0.562245 +vt 0.967391 0.568910 +vt 0.956023 0.562245 +vt 0.956023 0.530063 +vt 0.978760 0.530063 +vt 0.980467 0.595431 +vt 0.972826 0.599910 +vt 0.965185 0.595431 +vt 0.965185 0.573800 +vt 0.972826 0.569320 +vt 0.961957 0.515385 +vt 0.733696 0.630769 +vt 0.744565 0.692308 +vt 0.777174 0.646154 +vt 0.777174 0.692308 +vt 0.211957 0.453846 +vt 0.951087 0.584615 +vt 0.907609 0.600000 +vt 0.907609 0.584615 +vt 0.951087 0.569231 +vt 0.907609 0.569231 +vt 0.951087 0.538462 +vt 0.907609 0.553846 +vt 0.907609 0.538462 +vt 0.951087 0.630769 +vt 0.907609 0.646154 +vt 0.907609 0.630769 +vt 0.951087 0.600000 +vt 0.907609 0.615385 +vt 0.951087 0.553846 +vt 0.951087 0.523077 +vt 0.907609 0.523077 +vt 0.951087 0.615385 +vt 0.983696 0.569231 +vt 0.994565 0.584615 +vt 0.983696 0.584615 +vt 0.983696 0.538462 +vt 0.994565 0.553846 +vt 0.983696 0.553846 +vt 0.983696 0.630769 +vt 0.994565 0.646154 +vt 0.983696 0.646154 +vt 0.983696 0.600000 +vt 0.994565 0.615385 +vt 0.983696 0.615385 +vt 0.994565 0.569231 +vt 0.983696 0.523077 +vt 0.994565 0.538462 +vt 0.994565 0.630769 +vt 0.994565 0.600000 +vt 0.711957 0.669231 +vt 0.711957 0.692308 +vt 0.951087 0.646154 +vt 0.994565 0.523077 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8944 0.4472 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.8944 0.4472 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn 0.0000 -0.2298 -0.9732 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.2298 0.9732 +s off +f 70/91/35 100/92/35 102/93/35 +f 86/94/36 91/95/36 98/96/36 +f 72/97/37 67/98/37 73/99/37 +f 81/100/38 174/101/38 72/97/38 +f 87/102/39 69/103/39 86/94/39 +f 78/104/36 83/105/36 92/106/36 +f 79/107/36 85/108/36 78/104/36 +f 79/107/40 97/109/40 95/110/40 +f 80/111/41 99/112/41 97/109/41 +f 74/113/37 81/100/37 80/114/37 +f 84/115/36 89/116/36 88/117/36 +f 69/118/42 102/119/42 173/120/42 +f 91/121/41 96/122/41 98/123/41 +f 82/124/36 92/106/36 83/105/36 +f 99/125/36 81/126/36 72/97/36 +f 90/127/40 94/128/40 96/122/40 +f 73/99/43 173/129/43 101/130/43 +f 82/124/36 88/117/36 93/131/36 +f 106/132/36 103/133/36 104/134/36 +f 108/135/40 105/136/40 106/132/40 +f 112/137/44 109/138/44 110/139/44 +f 114/140/45 111/141/45 112/137/45 +f 108/135/37 112/142/37 110/143/37 +f 104/144/37 112/142/37 106/132/37 +f 107/145/39 111/146/39 105/136/39 +f 103/147/39 111/146/39 113/148/39 +f 129/149/42 127/150/42 125/151/42 +f 142/152/42 141/153/42 145/154/42 +f 153/155/46 151/156/46 152/157/46 +f 149/158/47 154/159/47 150/160/47 +f 148/161/48 152/157/48 147/162/48 +f 150/163/39 153/155/39 148/164/39 +f 149/165/37 152/157/37 151/156/37 +f 158/166/40 155/167/40 156/168/40 +f 161/169/39 163/170/39 159/171/39 +f 157/172/39 159/171/39 155/167/39 +f 158/173/37 160/174/37 162/175/37 +f 170/176/40 167/177/40 168/178/40 +f 160/174/37 166/179/37 162/175/37 +f 169/180/39 171/181/39 167/177/39 +f 170/176/37 168/178/37 172/182/37 +f 93/131/44 76/183/44 92/106/44 +f 88/184/49 77/185/49 93/131/49 +f 90/186/39 91/187/39 75/188/39 +f 86/94/50 71/189/50 91/187/50 +f 92/106/51 74/113/51 78/190/51 +f 70/91/35 87/102/35 100/92/35 +f 98/96/36 100/191/36 87/102/36 +f 87/102/36 86/94/36 98/96/36 +f 72/97/37 174/101/37 67/98/37 +f 81/100/38 68/192/38 174/101/38 +f 87/102/39 70/91/39 69/103/39 +f 78/104/36 85/108/36 83/105/36 +f 79/107/36 95/110/36 85/108/36 +f 79/107/40 80/111/40 97/109/40 +f 80/111/41 81/193/41 99/112/41 +f 79/194/37 78/190/37 80/114/37 +f 78/190/37 74/113/37 80/114/37 +f 74/113/37 68/192/37 81/100/37 +f 84/115/36 94/128/36 89/116/36 +f 68/195/42 74/196/42 71/197/42 +f 74/196/42 76/183/42 75/198/42 +f 71/197/42 74/196/42 75/198/42 +f 76/183/42 77/185/42 75/198/42 +f 71/197/42 69/118/42 174/199/42 +f 69/118/42 70/200/42 102/119/42 +f 67/201/42 174/199/42 173/120/42 +f 174/199/42 68/195/42 71/197/42 +f 173/120/42 174/199/42 69/118/42 +f 91/121/41 90/127/41 96/122/41 +f 82/124/36 93/131/36 92/106/36 +f 72/97/36 73/99/36 101/202/36 +f 101/202/36 99/125/36 72/97/36 +f 90/127/40 89/116/40 94/128/40 +f 73/99/43 67/98/43 173/129/43 +f 82/124/36 84/115/36 88/117/36 +f 106/132/36 105/136/36 103/133/36 +f 108/135/40 107/145/40 105/136/40 +f 112/137/44 111/141/44 109/138/44 +f 114/140/45 113/203/45 111/141/45 +f 108/135/37 106/132/37 112/142/37 +f 104/144/37 114/204/37 112/142/37 +f 107/145/39 109/205/39 111/146/39 +f 103/147/39 105/136/39 111/146/39 +f 125/151/42 124/206/42 123/207/42 +f 123/207/42 130/208/42 129/149/42 +f 129/149/42 128/209/42 127/150/42 +f 127/150/42 126/210/42 125/151/42 +f 125/151/42 123/207/42 129/149/42 +f 141/153/42 139/211/42 145/154/42 +f 139/211/42 140/212/42 145/154/42 +f 140/212/42 146/213/42 145/154/42 +f 145/154/42 144/214/42 143/215/42 +f 143/215/42 142/152/42 145/154/42 +f 153/155/46 154/159/46 151/156/46 +f 149/158/47 151/156/47 154/159/47 +f 148/161/48 153/155/48 152/157/48 +f 150/163/39 154/159/39 153/155/39 +f 149/165/37 147/216/37 152/157/37 +f 158/166/40 157/217/40 155/167/40 +f 161/169/39 165/218/39 163/170/39 +f 157/172/39 161/169/39 159/171/39 +f 158/173/37 156/219/37 160/174/37 +f 170/176/40 169/180/40 167/177/40 +f 160/174/37 164/220/37 166/179/37 +f 93/131/44 77/185/44 76/183/44 +f 88/184/49 75/188/49 77/185/49 +f 71/189/39 75/188/39 91/187/39 +f 75/188/39 88/184/39 90/186/39 +f 88/184/39 89/221/39 90/186/39 +f 86/94/50 69/103/50 71/189/50 +f 92/106/51 76/183/51 74/113/51 +s 1 +f 123/222/44 116/223/51 115/224/44 +f 130/225/49 115/224/44 122/226/49 +f 128/227/35 121/228/39 120/229/35 +f 126/230/43 119/231/40 118/232/43 +f 124/233/51 117/234/37 116/223/51 +f 129/235/39 122/226/49 121/228/39 +f 127/236/40 120/229/35 119/237/40 +f 125/238/37 118/232/43 117/234/37 +f 138/239/49 140/240/44 131/241/44 +f 136/242/35 145/243/39 137/244/39 +f 134/245/43 143/246/40 135/247/40 +f 132/248/51 141/249/37 133/250/37 +f 137/244/39 146/251/49 138/239/49 +f 135/252/40 144/253/35 136/242/35 +f 133/250/37 142/254/43 134/245/43 +f 131/241/44 139/255/51 132/248/51 +f 158/173/52 161/169/53 157/172/52 +f 155/167/54 160/256/55 156/168/54 +f 162/175/53 165/218/42 161/169/53 +f 159/171/55 164/257/36 160/256/55 +f 123/222/44 124/233/51 116/223/51 +f 130/225/49 123/222/44 115/224/44 +f 128/227/35 129/235/39 121/228/39 +f 126/230/43 127/258/40 119/231/40 +f 124/233/51 125/238/37 117/234/37 +f 129/235/39 130/225/49 122/226/49 +f 127/236/40 128/227/35 120/229/35 +f 125/238/37 126/230/43 118/232/43 +f 138/239/49 146/251/49 140/240/44 +f 136/242/35 144/253/35 145/243/39 +f 134/245/43 142/254/43 143/246/40 +f 132/248/51 139/255/51 141/249/37 +f 137/244/39 145/243/39 146/251/49 +f 135/252/40 143/259/40 144/253/35 +f 133/250/37 141/249/37 142/254/43 +f 131/241/44 140/240/44 139/255/51 +f 158/173/52 162/175/53 161/169/53 +f 155/167/54 159/171/55 160/256/55 +f 162/175/53 166/179/42 165/218/42 +f 159/171/55 163/170/36 164/257/36 +o Cylinder +v 0.000000 1.750000 -0.500000 +v -0.281250 1.674639 -0.500000 +v -0.487139 1.468750 -0.500000 +v -0.562500 1.187500 -0.500000 +v -0.487139 0.906250 -0.500000 +v -0.281250 0.700361 -0.500000 +v 0.000000 0.625000 -0.500000 +v 0.281250 0.700361 -0.500000 +v 0.487139 0.906250 -0.500000 +v 0.562500 1.187500 -0.500000 +v 0.487139 1.468750 -0.500000 +v 0.281250 1.674639 -0.500000 +v 0.000000 1.750000 -2.000000 +v -0.281250 1.674639 -2.000000 +v -0.487139 1.468750 -2.000000 +v -0.562500 1.187500 -2.000000 +v -0.487139 0.906250 -2.000000 +v -0.281250 0.700361 -2.000000 +v 0.000000 0.625000 -2.000000 +v 0.281250 0.700361 -2.000000 +v 0.487139 0.906250 -2.000000 +v 0.562500 1.187500 -2.000000 +v 0.487139 1.468750 -2.000000 +v 0.281250 1.674639 -2.000000 +v 0.000000 1.625000 -0.375000 +v -0.218750 1.566386 -0.375000 +v -0.378886 1.406250 -0.375000 +v -0.437500 1.187500 -0.375000 +v -0.378886 0.968750 -0.375000 +v -0.218750 0.808614 -0.375000 +v 0.000000 0.750000 -0.375000 +v 0.218750 0.808614 -0.375000 +v 0.378886 0.968750 -0.375000 +v 0.437500 1.187500 -0.375000 +v 0.378886 1.406250 -0.375000 +v 0.218750 1.566386 -0.375000 +v 0.000000 1.187500 -2.000000 +vt 0.663043 0.269231 +vt 0.711957 0.269231 +vt 0.663043 0.307692 +vt 0.663043 0.192308 +vt 0.711957 0.192308 +vt 0.663043 0.230769 +vt 0.663043 0.115385 +vt 0.711957 0.115385 +vt 0.663043 0.153846 +vt 0.663043 0.038462 +vt 0.711957 0.038462 +vt 0.663043 0.076923 +vt 0.663043 0.423077 +vt 0.711957 0.423077 +vt 0.663043 0.461538 +vt 0.663043 0.346154 +vt 0.711957 0.346154 +vt 0.663043 0.384615 +vt 0.663043 -0.000000 +vt 0.532609 0.230769 +vt 0.532609 0.192308 +vt 0.532609 0.307692 +vt 0.532609 0.269231 +vt 0.532609 0.115385 +vt 0.532609 0.076923 +vt 0.532609 0.461538 +vt 0.532609 0.423077 +vt 0.532609 0.346154 +vt 0.532609 0.153846 +vt 0.532609 0.038462 +vt 0.532609 0.000000 +vt 0.532609 0.384615 +vt 0.516304 0.146154 +vt 0.516304 0.115385 +vt 0.516304 0.161538 +vt 0.516304 0.192308 +vt 0.516304 0.238462 +vt 0.516304 0.269231 +vt 0.516304 0.315385 +vt 0.516304 0.346154 +vt 0.516304 0.392308 +vt 0.516304 0.423077 +vt 0.516304 0.007692 +vt 0.516304 0.038462 +vt 0.516304 0.084615 +vt 0.516304 0.223077 +vt 0.516304 0.300000 +vt 0.516304 0.376923 +vt 0.516304 0.453846 +vt 0.516304 0.069231 +vn 0.0000 -0.0000 -1.0000 +vn 0.5000 0.8660 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -0.8660 -0.5000 0.0000 +vn 0.7071 -0.0000 0.7071 +vn 0.6124 0.3536 0.7071 +vn 0.3536 0.6124 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.3536 0.6124 0.7071 +vn -0.6124 0.3536 0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.6124 -0.3536 0.7071 +vn -0.3536 -0.6124 0.7071 +vn -0.0000 -0.7071 0.7071 +vn 0.3536 -0.6124 0.7071 +vn 0.6124 -0.3536 0.7071 +s off +f 188/260/56 211/261/56 189/262/56 +f 198/263/56 211/264/56 187/265/56 +f 196/266/56 211/267/56 197/268/56 +f 194/269/56 211/270/56 195/271/56 +f 192/272/56 211/273/56 193/274/56 +f 190/275/56 211/276/56 191/277/56 +f 188/260/56 187/265/56 211/261/56 +f 198/263/56 197/268/56 211/264/56 +f 196/266/56 195/271/56 211/267/56 +f 194/269/56 193/278/56 211/270/56 +f 192/272/56 191/277/56 211/273/56 +f 190/275/56 189/262/56 211/276/56 +s 1 +f 198/263/57 175/279/58 186/280/57 +f 188/260/59 177/281/60 176/282/59 +f 195/271/61 184/283/62 183/284/61 +f 192/272/63 181/285/64 180/286/63 +f 189/262/60 178/287/65 177/281/60 +f 196/266/62 185/288/66 184/283/62 +f 193/278/64 182/289/67 181/290/64 +f 190/275/65 179/291/68 178/287/65 +f 197/268/66 186/280/57 185/288/66 +f 187/265/58 176/282/59 175/279/58 +f 194/269/67 183/284/61 182/289/67 +f 191/277/68 180/286/63 179/291/68 +f 184/283/69 209/292/70 208/293/69 +f 186/280/71 209/294/70 185/288/70 +f 175/279/72 210/295/71 186/280/71 +f 176/282/73 199/296/72 175/279/72 +f 177/281/74 200/297/73 176/282/73 +f 178/287/75 201/298/74 177/281/74 +f 179/291/76 202/299/75 178/287/75 +f 180/286/77 203/300/76 179/291/76 +f 181/285/78 204/301/77 180/286/77 +f 182/289/79 205/302/78 181/290/78 +f 183/284/80 206/303/79 182/289/79 +f 183/284/80 208/293/69 207/304/80 +f 198/263/57 187/265/58 175/279/58 +f 188/260/59 189/262/60 177/281/60 +f 195/271/61 196/266/62 184/283/62 +f 192/272/63 193/274/64 181/285/64 +f 189/262/60 190/275/65 178/287/65 +f 196/266/62 197/268/66 185/288/66 +f 193/278/64 194/269/67 182/289/67 +f 190/275/65 191/277/68 179/291/68 +f 197/268/66 198/263/57 186/280/57 +f 187/265/58 188/260/59 176/282/59 +f 194/269/67 195/271/61 183/284/61 +f 191/277/68 192/272/63 180/286/63 +f 184/283/69 185/288/70 209/292/70 +f 186/280/71 210/295/71 209/294/70 +f 175/279/72 199/305/72 210/295/71 +f 176/282/73 200/297/73 199/296/72 +f 177/281/74 201/306/74 200/297/73 +f 178/287/75 202/299/75 201/298/74 +f 179/291/76 203/307/76 202/299/75 +f 180/286/77 204/301/77 203/300/76 +f 181/285/78 205/308/78 204/301/77 +f 182/289/79 206/303/79 205/302/78 +f 183/284/80 207/309/80 206/303/79 +f 183/284/80 184/283/69 208/293/69 +o CylinderHighlights +v 0.375000 1.281250 -2.031250 +v 0.308709 1.253791 -2.031250 +v 0.281250 1.187500 -2.031250 +v 0.308709 1.121209 -2.031250 +v 0.375000 1.093750 -2.031250 +v 0.441291 1.121209 -2.031250 +v 0.468750 1.187500 -2.031250 +v 0.441291 1.253791 -2.031250 +v 0.278055 0.838476 -2.031250 +v 0.234375 0.781550 -2.031250 +v 0.163236 0.772185 -2.031250 +v 0.106310 0.815865 -2.031250 +v 0.096944 0.887005 -2.031250 +v 0.140625 0.943930 -2.031250 +v 0.211764 0.953296 -2.031250 +v 0.268690 0.909615 -2.031250 +v -0.441291 1.121209 -2.031250 +v -0.468750 1.187500 -2.031250 +v -0.441291 1.253791 -2.031250 +v -0.375000 1.281250 -2.031250 +v -0.308709 1.253791 -2.031250 +v -0.281250 1.187500 -2.031250 +v -0.308709 1.121209 -2.031250 +v -0.375000 1.093750 -2.031250 +v -0.278055 1.536524 -2.031250 +v -0.234375 1.593450 -2.031250 +v -0.163236 1.602815 -2.031250 +v -0.106310 1.559135 -2.031250 +v -0.096944 1.487995 -2.031250 +v -0.140625 1.431070 -2.031250 +v -0.211764 1.421704 -2.031250 +v -0.268690 1.465385 -2.031250 +v -0.163236 0.772185 -2.031250 +v -0.234375 0.781551 -2.031250 +v -0.278056 0.838476 -2.031250 +v -0.268690 0.909616 -2.031250 +v -0.211764 0.953296 -2.031250 +v -0.140625 0.943931 -2.031250 +v -0.096945 0.887005 -2.031250 +v -0.106310 0.815866 -2.031250 +v 0.163236 1.602815 -2.031250 +v 0.234375 1.593449 -2.031250 +v 0.278056 1.536524 -2.031250 +v 0.268690 1.465384 -2.031250 +v 0.211764 1.421704 -2.031250 +v 0.140625 1.431069 -2.031250 +v 0.096945 1.487995 -2.031250 +v 0.106310 1.559134 -2.031250 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.220109 0.592421 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vn 0.0000 0.0000 -1.0000 +s off +f 218/310/81 216/311/81 214/312/81 +f 221/313/81 223/314/81 225/315/81 +f 229/316/81 231/317/81 233/318/81 +f 243/319/81 237/320/81 239/321/81 +f 249/322/81 251/323/81 245/324/81 +f 259/325/81 253/326/81 255/327/81 +f 214/312/81 213/328/81 212/329/81 +f 212/329/81 219/330/81 218/310/81 +f 218/310/81 217/331/81 216/311/81 +f 216/311/81 215/332/81 214/312/81 +f 214/312/81 212/329/81 218/310/81 +f 225/315/81 226/333/81 227/334/81 +f 227/334/81 220/335/81 221/313/81 +f 221/313/81 222/336/81 223/314/81 +f 223/314/81 224/337/81 225/315/81 +f 225/315/81 227/334/81 221/313/81 +f 233/318/81 234/338/81 235/339/81 +f 235/339/81 228/340/81 229/316/81 +f 229/316/81 230/341/81 231/317/81 +f 231/317/81 232/342/81 233/318/81 +f 233/318/81 235/339/81 229/316/81 +f 241/343/81 242/344/81 243/319/81 +f 243/319/81 236/345/81 237/320/81 +f 237/320/81 238/346/81 239/321/81 +f 239/321/81 240/347/81 241/343/81 +f 241/343/81 243/319/81 239/321/81 +f 249/322/81 250/348/81 251/323/81 +f 251/323/81 244/349/81 245/324/81 +f 245/324/81 246/350/81 247/351/81 +f 247/351/81 248/352/81 245/324/81 +f 248/352/81 249/322/81 245/324/81 +f 257/353/81 258/354/81 259/325/81 +f 259/325/81 252/355/81 253/326/81 +f 253/326/81 254/356/81 255/327/81 +f 255/327/81 256/357/81 257/353/81 +f 257/353/81 259/325/81 255/327/81 +o FrameDark +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.312500 0.000000 -0.500000 +v 0.312500 0.000000 -0.500000 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.187500 -0.125000 -0.500000 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v 0.187500 -0.125000 -0.500000 +v -0.312500 0.375000 -0.250000 +v 0.312500 0.375000 -0.250000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 3.250000 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +v 0.437500 0.875000 0.562500 +v 0.437500 0.875000 0.437500 +v -0.312500 1.500000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v 0.437500 0.500000 0.437500 +v 0.437500 0.500000 0.562500 +v -0.312500 0.375000 -0.500000 +v 0.312500 0.375000 -0.500000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v -0.187500 2.000000 4.000000 +v 0.187500 2.000000 4.000000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v -0.187500 2.000000 3.500000 +v 0.187500 2.000000 3.500000 +v 0.312500 1.500000 4.000000 +v 0.312500 0.000000 4.000000 +v -0.312500 0.000000 4.000000 +v -0.312500 1.500000 4.000000 +v -0.187500 -0.125000 4.000000 +v 0.187500 -0.125000 4.000000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v 0.250000 1.474112 4.062500 +v 0.250000 0.025888 4.062500 +v -0.250000 0.025888 4.062500 +v -0.250000 1.474112 4.062500 +v -0.161612 -0.062500 4.062500 +v 0.161612 -0.062500 4.062500 +v -0.161612 1.562500 4.062500 +v 0.161612 1.562500 4.062500 +v 0.312500 0.000000 3.125000 +v 0.312500 0.375000 3.125000 +v 0.312500 0.000000 2.812500 +v 0.312500 0.375000 2.750000 +v -0.312500 0.000000 2.812500 +v 0.312500 0.187500 2.375000 +v -0.375000 0.000000 3.062500 +v 0.312500 0.187500 0.750000 +v 0.312500 0.000000 0.625000 +v 0.312500 0.187500 0.625000 +v 0.312500 0.375000 0.562500 +v 0.312500 0.375000 0.437500 +v 0.375000 1.000000 0.562500 +v 0.375000 1.000000 0.437500 +v 0.375000 1.500000 0.562500 +v 0.375000 1.500000 0.437500 +v 0.187500 1.687500 0.562500 +v 0.187500 1.687500 0.437500 +v -0.437500 0.875000 0.562500 +v -0.437500 0.875000 0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.562500 +v -0.312500 0.000000 3.125000 +v -0.312500 0.375000 3.125000 +v -0.187500 -0.125000 2.812500 +v -0.312500 0.375000 2.750000 +v 0.187500 -0.125000 2.812500 +v -0.312500 0.187500 2.375000 +v -0.375000 0.000000 2.812500 +v -0.312500 0.187500 0.750000 +v -0.312500 0.000000 0.625000 +v -0.312500 0.187500 0.625000 +v -0.312500 0.375000 0.562500 +v -0.312500 0.375000 0.437500 +v -0.375000 1.000000 0.562500 +v -0.375000 1.000000 0.437500 +v -0.375000 1.500000 0.562500 +v -0.375000 1.500000 0.437500 +v -0.187500 1.687500 0.562500 +v -0.187500 1.687500 0.437500 +v 0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.437500 +v -0.187500 1.750000 0.562500 +v -0.187500 1.750000 0.437500 +v 0.500000 0.875000 0.562500 +v 0.500000 0.875000 0.437500 +v 0.500000 0.500000 0.437500 +v 0.500000 0.500000 0.562500 +v 0.375000 0.000000 3.125000 +v 0.375000 0.375000 3.125000 +v 0.187500 -0.125000 3.062500 +v 0.375000 0.375000 2.750000 +v -0.187500 -0.125000 3.062500 +v 0.375000 0.187500 2.375000 +v 0.375000 0.000000 3.062500 +v 0.375000 0.187500 0.750000 +v 0.375000 0.000000 0.625000 +v 0.375000 0.187500 0.625000 +v 0.375000 0.375000 0.562500 +v 0.375000 0.375000 0.437500 +v 0.437500 1.000000 0.562500 +v 0.437500 1.000000 0.437500 +v 0.437500 1.500000 0.562500 +v 0.437500 1.500000 0.437500 +v -0.500000 0.875000 0.562500 +v -0.500000 0.875000 0.437500 +v -0.500000 0.500000 0.437500 +v -0.500000 0.500000 0.562500 +v -0.375000 0.000000 3.125000 +v -0.375000 0.375000 3.125000 +v -0.312500 0.000000 3.062500 +v -0.375000 0.375000 2.750000 +v 0.312500 0.000000 3.062500 +v -0.375000 0.187500 2.375000 +v 0.375000 0.000000 2.812500 +v -0.375000 0.187500 0.750000 +v -0.375000 0.000000 0.625000 +v -0.375000 0.187500 0.625000 +v -0.375000 0.375000 0.562500 +v -0.375000 0.375000 0.437500 +v -0.437500 1.000000 0.562500 +v -0.437500 1.000000 0.437500 +v -0.437500 1.500000 0.562500 +v -0.437500 1.500000 0.437500 +v -0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 3.062500 +v -0.187500 -0.187500 3.062500 +v -0.187500 -0.250000 2.812500 +v -0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 2.812500 +v -0.250000 1.750000 -0.250000 +v 0.250000 1.750000 -0.250000 +v -0.437500 1.375000 -0.250000 +v 0.437500 1.375000 -0.250000 +v -0.437500 0.750000 -0.250000 +v 0.437500 0.750000 -0.250000 +v -0.250000 0.375000 -0.250000 +v 0.250000 0.375000 -0.250000 +v 0.250000 1.750000 -0.375000 +v -0.250000 1.750000 -0.375000 +v 0.437500 1.375000 -0.375000 +v -0.437500 1.375000 -0.375000 +v 0.437500 0.750000 -0.375000 +v -0.437500 0.750000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.625000 -0.375000 +v 0.250000 0.625000 -0.375000 +v 0.250000 0.375000 -2.000000 +v -0.250000 0.375000 -2.000000 +v 0.250000 0.625000 -2.000000 +v -0.250000 0.625000 -2.000000 +v 0.125000 0.125000 -0.375000 +v -0.125000 0.125000 -0.375000 +v 0.125000 0.125000 -2.000000 +v -0.125000 0.125000 -2.000000 +v 0.187500 -0.125000 -0.500000 +v -0.187500 -0.125000 -0.500000 +v 0.187500 -0.125000 1.500000 +v -0.187500 -0.125000 1.500000 +v 0.187500 -0.312500 -0.750000 +v -0.187500 -0.312500 -0.750000 +v 0.187500 -0.312500 1.125000 +v -0.187500 -0.312500 1.125000 +v 0.187500 0.250000 -0.500000 +v -0.187500 0.250000 -0.500000 +v 0.187500 0.250000 -0.750000 +v -0.187500 0.250000 -0.750000 +v -0.250000 1.875000 -2.000000 +v 0.250000 1.875000 -2.000000 +v -0.437500 1.500000 -2.000000 +v 0.437500 1.500000 -2.000000 +v -0.437500 0.875000 -2.000000 +v 0.437500 0.875000 -2.000000 +v -0.250000 0.500000 -2.000000 +v 0.250000 0.500000 -2.000000 +v 0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.125000 +v 0.437500 1.500000 -2.125000 +v -0.437500 1.500000 -2.125000 +v 0.437500 0.875000 -2.125000 +v -0.437500 0.875000 -2.125000 +v -0.250000 0.500000 -2.125000 +v 0.250000 0.500000 -2.125000 +v -0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.562500 +v -0.187500 1.750000 -2.000000 +v 0.187500 1.750000 -2.000000 +v -0.187500 1.875000 -2.000000 +v -0.187500 1.875000 0.312500 +v 0.187500 1.875000 0.312500 +v 0.187500 1.875000 -2.000000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v 0.187500 2.000000 -2.125000 +v 0.187500 2.000000 -2.250000 +v 0.125000 2.000000 -2.125000 +v 0.125000 2.000000 -2.250000 +v 0.125000 1.875000 -2.125000 +v 0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.250000 +v -0.187500 2.000000 -2.125000 +v -0.187500 2.000000 -2.250000 +v -0.125000 2.000000 -2.125000 +v -0.125000 2.000000 -2.250000 +v -0.125000 1.875000 -2.125000 +v -0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v -0.250000 1.875000 -2.250000 +v 0.250000 1.500000 -2.625000 +v -0.250000 1.500000 -2.625000 +v 0.250000 1.375000 -3.125000 +v -0.250000 1.375000 -3.125000 +v 0.250000 1.250000 -3.125000 +v -0.250000 1.250000 -3.125000 +v 0.187500 1.500000 -2.625000 +v 0.187500 1.375000 -3.125000 +v 0.187500 1.250000 -3.125000 +v -0.187500 1.500000 -2.625000 +v -0.187500 1.375000 -3.125000 +v -0.187500 1.250000 -3.125000 +v 0.187500 1.250000 -2.625000 +v -0.187500 1.250000 -2.625000 +v 0.250000 0.562500 -2.125000 +v -0.250000 0.562500 -2.125000 +v 0.437500 1.375000 -2.000000 +v 0.312500 1.250000 -2.000000 +v 0.312500 1.125000 -2.000000 +v 0.437500 1.000000 -2.000000 +v 0.437500 1.375000 -2.125000 +v 0.312500 1.250000 -2.125000 +v 0.312500 1.125000 -2.125000 +v 0.437500 1.000000 -2.125000 +vt 0.445652 0.207692 +vt 0.054348 0.253846 +vt 0.054348 0.207692 +vt 0.054348 0.276923 +vt 0.445652 0.253846 +vt 0.445652 0.276923 +vt 0.445652 0.184615 +vt 0.054348 0.184615 +vt 0.054348 0.461538 +vt 0.119565 0.484615 +vt 0.054348 0.484615 +vt 0.054348 0.530769 +vt 0.119565 0.553846 +vt 0.054348 0.553846 +vt 0.119565 0.530769 +vt 0.510870 0.269231 +vt 0.489130 0.192308 +vt 0.510870 0.192308 +vt 0.184783 0.323077 +vt 0.119565 0.446154 +vt 0.119565 0.015385 +vt 0.184783 0.061538 +vt 0.184783 0.138462 +vt 0.032609 0.600000 +vt 0.000000 0.646154 +vt -0.000000 0.600000 +vt 0.076087 0.646154 +vt 0.032609 0.692308 +vt 0.032609 0.646154 +vt 0.032609 0.553846 +vt 0.076087 0.600000 +vt 0.108696 0.646154 +vt 0.728261 0.261538 +vt 0.733696 0.215385 +vt 0.733696 0.261538 +vt 0.717391 0.215385 +vt 0.711957 0.261538 +vt 0.711957 0.215385 +vt 0.293478 0.007692 +vt 0.288043 0.053846 +vt 0.288043 0.007692 +vt 0.717391 -0.000000 +vt 0.711957 0.023077 +vt 0.711957 0.000000 +vt 0.728261 0.169231 +vt 0.733696 0.107692 +vt 0.733696 0.169231 +vt 0.717391 0.023077 +vt 0.711957 0.046154 +vt 0.358696 0.030769 +vt 0.500000 0.038462 +vt 0.358696 0.038462 +vt 0.717391 0.107692 +vt 0.711957 0.169231 +vt 0.711957 0.107692 +vt 0.293478 0.053846 +vt 0.326087 0.061538 +vt 0.293478 0.061538 +vt 0.728261 -0.000000 +vt 0.717391 0.046154 +vt 0.711957 0.092308 +vt 0.510870 0.030769 +vt 0.516304 0.007692 +vt 0.516304 0.030769 +vt 0.733696 0.046154 +vt 0.728261 0.023077 +vt 0.733696 0.023077 +vt 0.293478 0.115385 +vt 0.326087 0.069231 +vt 0.358696 0.092308 +vt 0.728261 0.092308 +vt 0.733696 0.092308 +vt 0.326087 0.053846 +vt 0.358696 0.061538 +vt 0.728261 0.107692 +vt 0.728261 0.476923 +vt 0.733696 0.453846 +vt 0.733696 0.476923 +vt 0.717391 0.169231 +vt 0.711957 0.207692 +vt 0.711957 0.176923 +vt 0.733696 0.207692 +vt 0.733696 0.176923 +vt 0.510870 0.007692 +vt 0.293478 0.000000 +vt 0.510870 -0.000000 +vt 0.717391 0.453846 +vt 0.711957 0.476923 +vt 0.711957 0.453846 +vt 0.711957 0.430769 +vt 0.728261 0.430769 +vt 0.733696 0.384615 +vt 0.733696 0.430769 +vt 0.358696 0.069231 +vt 0.326087 0.061538 +vt 0.358696 0.061538 +vt 0.728261 0.369231 +vt 0.733696 0.369231 +vt 0.293478 0.123077 +vt 0.510870 0.115385 +vt 0.510870 0.123077 +vt 0.717391 0.369231 +vt 0.711957 0.384615 +vt 0.711957 0.369231 +vt 0.728261 0.453846 +vt 0.293478 0.069231 +vt 0.288043 0.115385 +vt 0.288043 0.069231 +vt 0.733696 0.307692 +vt 0.717391 0.384615 +vt 0.500000 0.092308 +vt 0.358696 0.084615 +vt 0.500000 0.084615 +vt 0.717391 0.307692 +vt 0.711957 0.307692 +vt 0.293478 0.061538 +vt 0.516304 0.092308 +vt 0.516304 0.115385 +vt 0.711957 0.269231 +vt 0.711957 0.300000 +vt 0.728261 0.307692 +vt 0.733696 0.269231 +vt 0.733696 0.300000 +vt 0.728261 0.384615 +vt 0.717391 0.261538 +vt 0.728261 0.215385 +vt 0.717391 0.092308 +vt 0.728261 0.046154 +vt 0.679348 0.523077 +vt 0.701087 0.492308 +vt 0.701087 0.523077 +vt 0.706522 0.484615 +vt 0.706522 0.476923 +vt 0.739130 0.476923 +vt 0.684783 0.484615 +vt 0.695652 0.484615 +vt 0.684783 0.530769 +vt 0.695652 0.530769 +vt 0.760870 0.484615 +vt 0.744565 0.492308 +vt 0.750000 0.484615 +vt 0.744565 0.523077 +vt 0.760870 0.530769 +vt 0.750000 0.530769 +vt 0.766304 0.492308 +vt 0.739130 0.492308 +vt 0.706522 0.523077 +vt 0.706522 0.492308 +vt 0.739130 0.530769 +vt 0.739130 0.538462 +vt 0.706522 0.538462 +vt 0.222826 0.861538 +vt 0.282609 0.907692 +vt 0.239130 0.907692 +vt 0.239130 0.738462 +vt 0.298913 0.784615 +vt 0.222826 0.784615 +vt 0.298913 0.861538 +vt 0.326087 0.907692 +vt 0.385870 0.861538 +vt 0.369565 0.907692 +vt 0.309783 0.784615 +vt 0.369565 0.738462 +vt 0.385870 0.784615 +vt 0.309783 0.861538 +vt 0.326087 0.923077 +vt 0.369565 0.923077 +vt 0.396739 0.907692 +vt 0.396739 0.861538 +vt 0.396739 0.784615 +vt 0.298913 0.738462 +vt 0.309783 0.907692 +vt 0.298913 0.907692 +vt 0.369565 0.723077 +vt 0.326087 0.738462 +vt 0.326087 0.723077 +vt 0.385870 0.738462 +vt 0.396739 0.738462 +vt 0.570652 0.730769 +vt 0.711957 0.761538 +vt 0.570652 0.761538 +vt 0.570652 0.638462 +vt 0.711957 0.607692 +vt 0.711957 0.638462 +vt 0.711957 0.669231 +vt 0.570652 0.669231 +vt 0.711957 0.730769 +vt 0.570652 0.576923 +vt 0.570652 0.607692 +vt 0.570652 0.792308 +vt 0.766304 0.861538 +vt 0.603261 0.815385 +vt 0.766304 0.815385 +vt 0.570652 0.815385 +vt 0.603261 0.861538 +vt 0.570652 0.861538 +vt 0.744565 0.792308 +vt 0.570652 0.792308 +vt 0.815217 0.861538 +vt 0.744565 0.884615 +vt 0.766304 0.746154 +vt 0.766304 0.930769 +vt 0.744565 0.930769 +vt 0.396739 0.861538 +vt 0.456522 0.907692 +vt 0.413043 0.907692 +vt 0.413043 0.738462 +vt 0.472826 0.784615 +vt 0.396739 0.784615 +vt 0.461957 0.815385 +vt 0.461957 0.830769 +vt 0.500000 0.907692 +vt 0.559783 0.861538 +vt 0.543478 0.907692 +vt 0.483696 0.784615 +vt 0.543478 0.738462 +vt 0.559783 0.784615 +vt 0.494565 0.830769 +vt 0.494565 0.815385 +vt 0.500000 0.923077 +vt 0.543478 0.923077 +vt 0.570652 0.907692 +vt 0.570652 0.861538 +vt 0.570652 0.784615 +vt 0.472826 0.738462 +vt 0.472826 0.861538 +vt 0.483696 0.907692 +vt 0.472826 0.907692 +vt 0.543478 0.723077 +vt 0.500000 0.738462 +vt 0.500000 0.723077 +vt 0.483696 0.800000 +vt 0.472826 0.800000 +vt 0.559783 0.738462 +vt 0.570652 0.738462 +vt 0.222826 0.692308 +vt -0.000000 0.738462 +vt -0.000000 0.692308 +vt 0.021739 0.753846 +vt 0.222826 0.800000 +vt 0.021739 0.800000 +vt 0.222826 0.738462 +vt 0.222826 0.815385 +vt 0.000000 0.753846 +vt 0.000000 0.800000 +vt 0.804348 0.646154 +vt 0.793478 0.630769 +vt 0.804348 0.630769 +vt 0.804348 0.653846 +vt 0.793478 0.646154 +vt 0.804348 0.669231 +vt 0.793478 0.653846 +vt 0.782609 0.653846 +vt 0.782609 0.638462 +vt 0.815217 0.653846 +vt 0.793478 0.707692 +vt 0.804348 0.692308 +vt 0.804348 0.707692 +vt 0.793478 0.692308 +vt 0.804348 0.684615 +vt 0.793478 0.684615 +vt 0.804348 0.669231 +vt 0.782609 0.684615 +vt 0.782609 0.700000 +vt 0.815217 0.684615 +vt 0.815217 0.700000 +vt 0.815110 0.687200 +vt 0.826087 0.746154 +vt 0.815217 0.746154 +vt 0.858696 0.692308 +vt 0.902174 0.684615 +vt 0.902174 0.692308 +vt 0.907609 0.607692 +vt 0.902174 0.623077 +vt 0.902174 0.607692 +vt 0.902174 0.738462 +vt 0.858696 0.746154 +vt 0.858696 0.738462 +vt 0.902174 0.807692 +vt 0.907609 0.823077 +vt 0.902174 0.823077 +vt 0.826087 0.684615 +vt 0.815217 0.600000 +vt 0.771739 0.553846 +vt 0.815217 0.553846 +vt 0.771739 0.600000 +vt 0.815217 0.615385 +vt 0.771739 0.630769 +vt 0.750000 0.553846 +vt 0.750000 0.600000 +vt 0.815217 0.538462 +vt 0.771739 0.523077 +vt 0.858696 0.638462 +vt 0.858696 0.792308 +vt 0.815217 0.907692 +vt 0.472826 0.846154 +vt 0.483696 0.861538 +vt 0.472826 0.830769 +vt 0.483696 0.846154 +vt 0.472826 0.815385 +vt 0.483696 0.830769 +vt 0.483696 0.815385 +vt 0.456522 0.269231 +vt 0.733696 -0.000000 +vt 0.119565 0.461538 +vt 0.489130 0.269231 +vt 0.445652 0.323077 +vt 0.423913 0.323077 +vt 0.184783 0.400000 +vt 0.152174 0.446154 +vt 0.054348 0.000000 +vt 0.119565 -0.000000 +vt 0.152174 0.015385 +vt 0.445652 0.138462 +vt 0.423913 0.138462 +vt 0.097826 0.692308 +vt 0.097826 0.553846 +vt 0.108696 0.600000 +vt 0.500000 0.030769 +vt 0.510870 0.092308 +vt 0.358696 0.053846 +vt 0.717391 0.476923 +vt 0.717391 0.430769 +vt 0.679348 0.492308 +vt 0.739130 0.484615 +vt 0.766304 0.523077 +vt 0.739130 0.523077 +vt 0.706522 0.530769 +vt 0.282609 0.738462 +vt 0.385870 0.907692 +vt 0.309783 0.738462 +vt 0.711957 0.576923 +vt 0.711957 0.792308 +vt 0.815217 0.815385 +vt 0.570652 0.884615 +vt 0.744565 0.746154 +vt 0.456522 0.738462 +vt 0.559783 0.907692 +vt 0.483696 0.738462 +vt 0.222826 0.753846 +vt -0.000000 0.815385 +vt 0.793478 0.669231 +vt 0.815217 0.638462 +vt 0.793478 0.669231 +vt 0.858696 0.684615 +vt 0.907609 0.623077 +vt 0.902174 0.746154 +vt 0.907609 0.807692 +vt 0.815217 0.523077 +vt 0.456522 0.192308 +vt 0.043478 0.276923 +vt 0.043478 0.461538 +vt 0.043478 -0.000000 +vt 0.043478 0.184615 +vt 0.043478 0.253846 +vt 0.043478 0.207692 +vt 0.043478 0.484615 +vt 0.043478 0.530769 +vt 0.043478 0.553846 +vt 0.032609 0.276923 +vt 0.032609 0.461538 +vt 0.032609 0.000000 +vt 0.032609 0.184615 +vt 0.032609 0.207692 +vt 0.032609 0.253846 +vt 0.032609 0.530769 +vt 0.032609 0.553846 +vt 0.032609 0.484615 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.5547 -0.8321 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.7071 -0.7071 +vn -0.8944 0.4472 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.8944 -0.4472 0.0000 +vn -0.8944 -0.4472 0.0000 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.9701 -0.2425 +vn 0.0000 0.7071 -0.7071 +vn 0.6269 -0.2597 0.7345 +vn 0.6269 0.2597 0.7345 +vn -0.6269 0.2597 0.7345 +vn -0.6269 -0.2597 0.7345 +vn 0.2597 -0.6269 0.7345 +vn -0.2597 -0.6269 0.7345 +vn 0.2597 0.6269 0.7345 +vn -0.2597 0.6269 0.7345 +vn -0.8125 0.3366 0.4760 +vn -0.8125 -0.3366 0.4760 +vn 0.8125 -0.3366 0.4760 +vn 0.8125 0.3366 0.4760 +vn 0.3366 0.8125 0.4760 +vn -0.3366 0.8125 0.4760 +vn 0.3366 -0.8125 0.4760 +vn -0.3366 -0.8125 0.4760 +s off +f 266/358/82 305/359/82 304/360/82 +f 301/361/83 269/362/83 263/363/83 +f 262/364/84 304/360/84 302/365/84 +f 300/366/85 287/367/85 307/368/85 +f 306/369/86 284/370/86 303/371/86 +f 307/368/87 286/372/87 306/369/87 +f 271/373/87 290/374/87 270/375/87 +f 273/376/88 279/377/88 301/361/88 +f 278/378/89 274/379/89 272/380/89 +f 295/381/90 292/382/90 293/383/90 +f 298/384/89 292/385/89 294/386/89 +f 293/387/88 299/388/88 295/381/88 +f 299/388/87 294/386/87 295/381/87 +f 299/388/91 296/389/91 298/384/91 +f 359/390/92 333/391/92 355/392/92 +f 356/393/90 354/394/90 332/395/90 +f 364/396/90 317/397/90 316/398/90 +f 371/399/93 326/400/93 323/401/93 +f 379/402/92 329/403/92 331/404/92 +f 374/405/90 289/406/90 326/400/90 +f 369/407/87 323/408/87 321/409/87 +f 376/410/90 330/411/90 328/412/90 +f 365/413/87 319/414/87 317/415/87 +f 373/416/88 374/405/88 371/399/88 +f 363/417/90 282/418/90 289/406/90 +f 373/419/92 324/420/92 325/421/92 +f 288/422/92 375/423/92 327/424/92 +f 384/425/89 387/426/89 389/427/89 +f 361/428/92 288/422/92 283/429/92 +f 367/430/94 321/431/94 319/414/94 +f 377/432/92 283/429/92 329/403/92 +f 364/396/88 369/407/88 367/430/88 +f 282/418/90 376/410/90 328/412/90 +f 393/433/95 349/434/95 347/435/95 +f 378/436/90 332/437/90 330/438/90 +f 333/439/92 379/402/92 331/440/92 +f 372/441/82 316/442/82 324/443/82 +f 394/444/93 345/445/93 348/446/93 +f 337/447/90 394/444/90 348/446/90 +f 382/448/92 335/449/92 336/450/92 +f 389/451/94 341/452/94 343/453/94 +f 335/449/92 397/454/92 351/455/92 +f 338/456/82 392/457/82 346/458/82 +f 396/459/90 334/460/90 350/461/90 +f 395/462/92 336/450/92 349/434/92 +f 385/463/90 338/464/90 339/465/90 +f 397/454/92 353/466/92 351/455/92 +f 380/467/90 337/447/90 334/460/90 +f 391/468/87 343/469/87 345/470/87 +f 398/471/90 350/461/90 352/472/90 +f 387/426/87 339/473/87 341/452/87 +f 392/457/92 347/474/92 346/475/92 +f 354/476/90 398/471/90 352/477/90 +f 399/478/92 355/479/92 353/480/92 +f 394/444/84 382/448/84 395/462/84 +f 382/448/89 380/467/89 381/481/89 +f 381/481/96 396/459/96 397/454/96 +f 399/478/89 396/459/89 398/471/89 +f 398/471/86 359/390/86 399/478/86 +f 356/393/87 359/390/87 358/482/87 +f 356/393/85 379/402/85 357/483/85 +f 379/402/88 376/410/88 377/432/88 +f 360/484/97 377/432/97 376/410/97 +f 362/485/88 360/484/88 363/417/88 +f 363/417/83 375/423/83 362/485/83 +f 393/433/89 394/444/89 395/462/89 +f 322/486/84 400/487/84 403/488/84 +f 400/489/92 340/490/92 342/491/92 +f 400/487/92 320/492/92 340/493/92 +f 386/494/90 403/488/90 368/495/90 +f 318/496/92 401/497/92 342/498/92 +f 402/499/90 388/500/90 366/501/90 +f 390/502/83 402/499/83 401/497/83 +f 407/503/82 405/504/82 404/505/82 +f 400/487/89 405/504/89 403/488/89 +f 402/499/88 407/503/88 401/497/88 +f 402/506/90 366/507/90 368/508/90 +f 410/509/90 409/510/90 408/511/90 +f 414/512/90 413/513/90 412/514/90 +f 412/514/90 411/515/90 410/509/90 +f 416/516/92 419/517/92 417/518/92 +f 420/519/92 422/520/92 421/521/92 +f 418/522/92 421/521/92 419/517/92 +f 409/523/87 417/518/87 408/524/87 +f 408/525/96 419/517/96 410/526/96 +f 410/526/89 421/521/89 412/527/89 +f 415/528/98 420/519/98 413/513/98 +f 411/515/97 416/529/97 409/530/97 +f 414/531/82 423/532/82 415/533/82 +f 413/513/88 418/522/88 411/515/88 +f 412/527/99 422/534/99 414/535/99 +f 426/536/89 429/537/89 424/538/89 +f 425/539/98 434/540/98 428/541/98 +f 425/539/88 430/542/88 427/543/88 +f 427/543/87 431/544/87 426/536/87 +f 433/545/82 434/540/82 432/546/82 +f 429/537/99 433/547/99 424/538/99 +f 440/548/82 443/549/82 441/550/82 +f 439/551/100 442/552/100 438/553/100 +f 437/554/89 443/549/89 439/555/89 +f 441/550/92 446/556/92 440/548/92 +f 436/557/88 442/552/88 440/548/88 +f 437/554/89 447/558/89 441/550/89 +f 436/557/88 446/559/88 444/560/88 +f 450/561/90 449/562/90 448/563/90 +f 454/564/90 453/565/90 452/566/90 +f 452/566/90 510/567/90 509/568/90 +f 456/569/92 459/570/92 457/571/92 +f 460/572/92 462/573/92 461/574/92 +f 513/575/92 514/576/92 461/574/92 +f 449/577/87 457/571/87 448/578/87 +f 448/579/96 459/570/96 450/580/96 +f 450/580/89 461/574/89 452/581/89 +f 455/582/98 460/572/98 453/565/98 +f 451/583/97 456/584/97 449/585/97 +f 454/586/82 463/587/82 455/588/82 +f 453/565/88 515/589/88 511/590/88 +f 452/581/99 462/591/99 454/592/99 +f 466/593/82 465/594/82 464/595/82 +f 470/596/87 468/597/87 469/598/87 +f 467/599/88 470/596/88 465/594/88 +f 466/600/89 469/598/89 468/597/89 +f 465/601/101 469/598/101 464/602/101 +f 475/603/97 472/604/97 473/605/97 +f 477/606/87 474/607/87 475/603/87 +f 479/608/89 476/609/89 477/606/89 +f 474/607/90 478/610/90 472/611/90 +f 475/603/92 479/612/92 477/606/92 +f 480/613/96 483/614/96 481/615/96 +f 482/616/87 485/617/87 483/614/87 +f 484/618/88 487/619/88 485/617/88 +f 486/620/90 482/616/90 480/621/90 +f 483/614/92 487/622/92 481/623/92 +f 489/624/87 491/625/87 488/626/87 +f 498/627/102 494/628/102 499/629/102 +f 500/630/92 494/631/92 496/632/92 +f 502/633/102 493/634/102 501/635/102 +f 495/636/92 503/637/92 497/638/92 +f 490/639/103 498/627/103 501/635/103 +f 503/640/87 504/641/87 500/642/87 +f 505/643/88 502/644/88 501/645/88 +f 498/646/92 505/643/92 501/647/92 +f 499/648/89 504/641/89 498/649/89 +f 496/632/88 494/631/88 492/650/88 +f 493/651/89 497/638/89 507/652/89 +f 508/653/88 458/654/88 451/583/88 +f 509/655/83 512/656/83 508/653/83 +f 510/657/88 513/658/88 509/655/88 +f 511/590/85 514/659/85 510/657/85 +f 290/374/92 263/660/92 266/358/92 +f 375/423/95 325/661/95 327/424/95 +f 266/358/82 269/362/82 305/359/82 +f 301/361/83 305/359/83 269/362/83 +f 262/364/84 266/358/84 304/360/84 +f 300/366/85 285/662/85 287/367/85 +f 306/369/86 286/372/86 284/370/86 +f 307/368/87 287/367/87 286/372/87 +f 271/373/87 291/663/87 290/374/87 +f 301/361/88 263/363/88 273/376/88 +f 263/363/88 291/664/88 271/665/88 +f 271/665/88 273/376/88 263/363/88 +f 285/662/88 300/366/88 279/377/88 +f 300/366/88 301/361/88 279/377/88 +f 275/666/88 277/667/88 279/377/88 +f 273/376/88 275/666/88 279/377/88 +f 302/365/89 303/668/89 278/378/89 +f 303/668/89 284/669/89 278/378/89 +f 278/378/89 276/670/89 274/379/89 +f 290/671/89 262/364/89 270/672/89 +f 262/364/89 302/365/89 272/380/89 +f 270/672/89 262/364/89 272/380/89 +f 302/365/89 278/378/89 272/380/89 +f 295/381/90 294/386/90 292/382/90 +f 298/384/89 296/673/89 292/385/89 +f 293/387/88 297/674/88 299/388/88 +f 299/388/87 298/384/87 294/386/87 +f 299/388/91 297/675/91 296/389/91 +f 359/390/92 357/483/92 333/391/92 +f 356/393/90 358/482/90 354/394/90 +f 364/396/90 365/413/90 317/397/90 +f 371/399/93 374/405/93 326/400/93 +f 379/402/92 377/432/92 329/403/92 +f 374/405/90 363/417/90 289/406/90 +f 369/407/87 371/676/87 323/408/87 +f 376/410/90 378/436/90 330/411/90 +f 365/413/87 367/430/87 319/414/87 +f 373/416/88 375/423/88 374/405/88 +f 363/417/90 360/484/90 282/418/90 +f 373/419/92 372/441/92 324/420/92 +f 288/422/92 362/485/92 375/423/92 +f 384/425/89 385/463/89 387/426/89 +f 389/427/89 391/468/89 392/457/89 +f 391/468/89 393/677/89 392/457/89 +f 389/427/89 392/457/89 384/425/89 +f 361/428/92 362/485/92 288/422/92 +f 367/430/94 369/678/94 321/431/94 +f 377/432/92 361/428/92 283/429/92 +f 364/396/88 372/441/88 369/407/88 +f 372/441/88 373/419/88 371/676/88 +f 371/676/88 369/407/88 372/441/88 +f 367/430/88 365/413/88 364/396/88 +f 282/418/90 360/484/90 376/410/90 +f 393/433/95 395/462/95 349/434/95 +f 378/436/90 356/393/90 332/437/90 +f 333/439/92 357/483/92 379/402/92 +f 372/441/82 364/396/82 316/442/82 +f 394/444/93 391/679/93 345/445/93 +f 337/447/90 383/680/90 394/444/90 +f 382/448/92 381/481/92 335/449/92 +f 389/451/94 387/426/94 341/452/94 +f 335/449/92 381/481/92 397/454/92 +f 338/456/82 384/425/82 392/457/82 +f 396/459/90 380/467/90 334/460/90 +f 395/462/92 382/448/92 336/450/92 +f 385/463/90 384/425/90 338/464/90 +f 397/454/92 399/478/92 353/466/92 +f 380/467/90 383/680/90 337/447/90 +f 391/468/87 389/427/87 343/469/87 +f 398/471/90 396/459/90 350/461/90 +f 387/426/87 385/463/87 339/473/87 +f 392/457/92 393/677/92 347/474/92 +f 354/476/90 358/482/90 398/471/90 +f 399/478/92 359/390/92 355/479/92 +f 394/444/84 383/680/84 382/448/84 +f 382/448/89 383/680/89 380/467/89 +f 381/481/96 380/467/96 396/459/96 +f 399/478/89 397/454/89 396/459/89 +f 398/471/86 358/482/86 359/390/86 +f 356/393/87 357/483/87 359/390/87 +f 356/393/85 378/436/85 379/402/85 +f 379/402/88 378/436/88 376/410/88 +f 360/484/97 361/428/97 377/432/97 +f 362/485/88 361/428/88 360/484/88 +f 363/417/83 374/405/83 375/423/83 +f 393/433/89 391/679/89 394/444/89 +f 322/486/84 344/681/84 400/487/84 +f 342/491/92 401/682/92 400/489/92 +f 401/682/92 407/503/92 400/489/92 +f 407/503/92 404/505/92 400/489/92 +f 400/487/92 344/681/92 320/492/92 +f 386/494/90 322/486/90 403/488/90 +f 318/496/92 390/502/92 401/497/92 +f 402/499/90 370/683/90 388/500/90 +f 390/502/83 370/683/83 402/499/83 +f 407/503/82 406/684/82 405/504/82 +f 400/487/89 404/505/89 405/504/89 +f 402/499/88 406/684/88 407/503/88 +f 368/508/90 403/685/90 402/506/90 +f 403/685/90 405/504/90 402/506/90 +f 405/504/90 406/684/90 402/506/90 +f 410/509/90 411/515/90 409/510/90 +f 414/512/90 415/686/90 413/513/90 +f 412/514/90 413/513/90 411/515/90 +f 416/516/92 418/522/92 419/517/92 +f 420/519/92 423/532/92 422/520/92 +f 418/522/92 420/519/92 421/521/92 +f 409/523/87 416/516/87 417/518/87 +f 408/525/96 417/687/96 419/517/96 +f 410/526/89 419/517/89 421/521/89 +f 415/528/98 423/688/98 420/519/98 +f 411/515/97 418/522/97 416/529/97 +f 414/531/82 422/520/82 423/532/82 +f 413/513/88 420/519/88 418/522/88 +f 412/527/99 421/521/99 422/534/99 +f 426/536/89 431/544/89 429/537/89 +f 425/539/98 432/546/98 434/540/98 +f 425/539/88 428/541/88 430/542/88 +f 427/543/87 430/542/87 431/544/87 +f 433/545/82 435/689/82 434/540/82 +f 429/537/99 435/690/99 433/547/99 +f 440/548/82 442/552/82 443/549/82 +f 439/551/100 443/549/100 442/552/100 +f 437/554/89 441/550/89 443/549/89 +f 441/550/92 447/691/92 446/556/92 +f 436/557/88 438/692/88 442/552/88 +f 437/554/89 445/693/89 447/558/89 +f 436/557/88 440/548/88 446/559/88 +f 450/561/90 451/583/90 449/562/90 +f 454/564/90 455/694/90 453/565/90 +f 451/583/90 450/561/90 509/568/90 +f 450/561/90 452/566/90 509/568/90 +f 452/566/90 453/565/90 510/567/90 +f 453/565/90 511/590/90 510/567/90 +f 508/653/90 451/583/90 509/568/90 +f 456/569/92 458/654/92 459/570/92 +f 460/572/92 463/587/92 462/573/92 +f 461/574/92 459/570/92 513/575/92 +f 459/570/92 458/654/92 513/575/92 +f 458/654/92 512/656/92 513/575/92 +f 514/576/92 515/589/92 460/572/92 +f 514/576/92 460/572/92 461/574/92 +f 449/577/87 456/569/87 457/571/87 +f 448/579/96 457/695/96 459/570/96 +f 450/580/89 459/570/89 461/574/89 +f 455/582/98 463/696/98 460/572/98 +f 451/583/97 458/654/97 456/584/97 +f 454/586/82 462/573/82 463/587/82 +f 453/565/88 460/572/88 515/589/88 +f 452/581/99 461/574/99 462/591/99 +f 466/593/82 467/599/82 465/594/82 +f 470/596/87 471/697/87 468/597/87 +f 467/599/88 471/697/88 470/596/88 +f 466/600/89 464/698/89 469/598/89 +f 465/601/101 470/596/101 469/598/101 +f 475/603/97 474/607/97 472/604/97 +f 477/606/87 476/609/87 474/607/87 +f 479/608/89 478/699/89 476/609/89 +f 474/607/90 476/609/90 478/610/90 +f 475/603/92 473/700/92 479/612/92 +f 480/613/96 482/616/96 483/614/96 +f 482/616/87 484/618/87 485/617/87 +f 484/618/88 486/701/88 487/619/88 +f 486/620/90 484/618/90 482/616/90 +f 483/614/92 485/617/92 487/622/92 +f 489/624/87 490/639/87 491/625/87 +f 498/627/102 492/702/102 494/628/102 +f 500/630/92 499/703/92 494/631/92 +f 502/633/102 495/704/102 493/634/102 +f 495/636/92 502/705/92 503/637/92 +f 493/634/103 491/625/103 501/635/103 +f 491/625/103 490/639/103 501/635/103 +f 490/639/103 492/702/103 498/627/103 +f 503/640/87 505/643/87 504/641/87 +f 505/643/88 503/640/88 502/644/88 +f 498/646/92 504/641/92 505/643/92 +f 499/648/89 500/642/89 504/641/89 +f 490/639/88 489/624/88 492/650/88 +f 489/624/88 506/706/88 492/650/88 +f 506/706/88 496/632/88 492/650/88 +f 488/626/89 491/625/89 493/651/89 +f 493/651/89 495/636/89 497/638/89 +f 507/652/89 488/626/89 493/651/89 +f 508/653/88 512/656/88 458/654/88 +f 509/655/83 513/658/83 512/656/83 +f 510/657/88 514/659/88 513/658/88 +f 511/590/85 515/589/85 514/659/85 +f 266/358/92 262/707/92 290/374/92 +f 290/374/92 291/663/92 263/660/92 +f 263/660/92 269/362/92 266/358/92 +f 375/423/95 373/416/95 325/661/95 +s 1 +f 309/708/104 300/366/105 308/709/105 +f 311/710/106 302/365/107 310/711/107 +f 313/712/108 304/360/109 305/359/108 +f 312/713/109 302/365/107 304/360/109 +f 309/708/104 305/359/108 301/361/104 +f 315/714/110 306/369/111 314/715/111 +f 314/715/111 303/371/106 311/716/106 +f 308/709/105 307/368/110 315/714/110 +f 261/717/112 308/709/113 265/718/113 +f 264/719/114 310/711/115 260/720/115 +f 267/721/116 313/712/117 268/722/117 +f 260/720/115 312/713/116 267/721/116 +f 268/722/117 309/708/112 261/717/112 +f 280/723/118 315/714/119 314/715/118 +f 264/724/114 314/715/118 311/716/114 +f 265/718/113 315/714/119 281/725/119 +f 309/708/104 301/361/104 300/366/105 +f 311/710/106 303/668/106 302/365/107 +f 313/712/108 312/713/109 304/360/109 +f 312/713/109 310/711/107 302/365/107 +f 309/708/104 313/712/108 305/359/108 +f 315/714/110 307/368/110 306/369/111 +f 314/715/111 306/369/111 303/371/106 +f 308/709/105 300/366/105 307/368/110 +f 261/717/112 309/708/112 308/709/113 +f 264/719/114 311/710/114 310/711/115 +f 267/721/116 312/713/116 313/712/117 +f 260/720/115 310/711/115 312/713/116 +f 268/722/117 313/712/117 309/708/112 +f 280/723/118 281/725/119 315/714/119 +f 264/724/114 280/723/118 314/715/118 +f 265/718/113 308/709/113 315/714/119 diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png b/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..d70ec8952d0e8e1359c5752c89a2bb0370bcc58e GIT binary patch literal 1817 zcmV+!2j=*RP)qi^Yw5CNLnlw#n z)1)tLV*1vHCVlszeQa8r^ufgRrS?Is#*bRtVpVJrP_TfA2&{-~5Lgj*@6Nrq59=h2Y=ggbYPj#?n^M1K;^-v}y(2nQ0+g;K zC|!~I9fR8g+WHx~2KC6=P89Vq7ijBe`1)ncxkNj$V(BehJh|S{oXwQesl< zenmDmIb+~dn`X)V83TL|(|?L0M1UYO@oPsAmwOokTI_8t9=ZVxkN*z^xNtp)3;zaj z-)BO%kPwAY2{1NkU^ZaJJtsJQMT5((U|X%2IKd^rkLUd88PO5Y=J$6VX8b0G#&uMe z#5SvENXPW7iH0>)$bkx%$xGY>OwgVWgc6^=k=V*m^7GBRIxau<-YVR4_u7kgP=R~N__To$@6%r3*GvpQ_It*F zzq&Nc2Kdq#A&Jo8^8sAB!9N>eCm?3MOYv+?`k`jBWtyN>qIOrqg;~ zyv72+TMc#$-_zlp7L!ym2Kd5f0dd+?3DAE>$JJX5^%d5JA|!leyA(85r!RedlJnix zkI;lw8U;&<&{&WRgjm0d<1*PdYoK#LN1sQ>=!6l;2hs&0p&0PN>rTs8Z15-2e^?y1CPbtt)W#c|8NLqmJPxvwT#9p1wfrqKD5OYwHwCOGfcb`HSzNe$5 zD+u2#Ujdc007c6d$33@q+QgZ54F^v6apat_t`PMK)!3F5os zehiGpPNQRy^iawRRoJNfYwa-M_*1lupt30W<8w=MnU|HA0EC1NI8%+ouAp&U8Z*JN zLN%eQu<}9`pY3*GeQD}0Hgp51Tt!e@o<;#Su2zxlQsRo>uq$XMJNHoxc|>FI1yO&dEM!N2Z@U9K>TIx4!0lA9tuFQy?t0lCxlE-rO0$|z&jQHAY^NeO-MeH zvb#YZ{=U7mUh-f3-M9Q}QKK{mvi}>3}H_!bNhj7qx@~88wCJH4<^5M!xViat_>Mb0AK?CM@d8*G6)GE;QLLC0jEy_Tec+rO#X5) zee)nxfY~|V(xt?o`Q+$c^nY`RzjF?R3Xsm{M3E7oeLqYdBii?eqCbxS?fYSF`a;f5 zKy}G8AiICUSZEe_Uo9nd2c%bnBR|MZ zgro}~n~VUm4UkPn0NDn}CL@4s17wpCK(+z0$p|3Z0NMNpWTAx+uN`!=00000NkvXX Hu0mjfly^)+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2844eee414e007ed9aa81bf13bb9993e6aaef6 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..5d544cf1e183cd0c423a5dcae6969519960d7b4a GIT binary patch literal 3346 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 literal 0 HcmV?d00001