From fd684dbf8fb20a7323492ed5932d83df19423b9d Mon Sep 17 00:00:00 2001 From: HbmMods Date: Thu, 7 Jun 2018 17:32:27 +0200 Subject: [PATCH] B93 MOD, mk4 enhancements, bomb potion effect, new cloud renderer --- assets/hbm/lang/de_DE.lang | 2 + assets/hbm/lang/en_US.lang | 2 + assets/hbm/sounds.json | 1 + assets/hbm/sounds/weapon/laserBang1.ogg | Bin 0 -> 11327 bytes assets/hbm/sounds/weapon/laserBang2.ogg | Bin 0 -> 8855 bytes assets/hbm/sounds/weapon/laserBang3.ogg | Bin 0 -> 8305 bytes assets/hbm/textures/gui/potions.png | Bin 1389 -> 1573 bytes assets/hbm/textures/items/gun_b93.png | Bin 0 -> 297 bytes .../textures/models/selenium_engine_body.png | Bin 0 -> 5320 bytes .../models/selenium_engine_piston.png | Bin 0 -> 6343 bytes .../textures/models/selenium_engine_rotor.png | Bin 0 -> 2229 bytes com/hbm/blocks/bomb/NukeBoy.java | 6 +- com/hbm/blocks/test/TestEventTester.java | 9 +- com/hbm/entity/effect/EntityFalloutRain.java | 12 +- .../entity/effect/EntityNukeCloudSmall.java | 10 + .../entity/logic/EntityNukeExplosionMK4.java | 4 +- com/hbm/entity/particle/EntityBSmokeFX.java | 3 - com/hbm/entity/particle/EntityDSmokeFX.java | 3 - com/hbm/entity/particle/EntityModFX.java | 4 +- com/hbm/entity/particle/EntitySSmokeFX.java | 3 - com/hbm/entity/particle/EntitySmokeFX.java | 3 - com/hbm/entity/projectile/EntityModBeam.java | 602 ++++++++++++++++++ com/hbm/explosion/ExplosionNukeGeneric.java | 6 +- com/hbm/explosion/ExplosionNukeRay.java | 8 +- .../explosion/NukeEnvironmentalEffect.java | 111 ++++ com/hbm/inventory/gui/GUIMachineSelenium.java | 2 +- com/hbm/items/ModItems.java | 2 +- com/hbm/items/weapon/GunB93.java | 284 +++++++++ com/hbm/lib/ModDamageSource.java | 1 + com/hbm/main/ClientProxy.java | 7 +- com/hbm/main/CraftingManager.java | 4 +- com/hbm/main/MainRegistry.java | 4 +- com/hbm/main/ResourceManager.java | 5 + com/hbm/potion/PotionEffectBang.java | 56 ++ com/hbm/render/entity/MultiCloudRenderer.java | 145 +++++ com/hbm/render/entity/RenderBeam6.java | 82 +++ com/hbm/render/tileentity/RenderSelenium.java | 11 +- .../tileentity/machine/TileEntityAMSBase.java | 37 +- .../machine/TileEntityAMSEmitter.java | 3 + .../machine/TileEntityAMSLimiter.java | 3 + 40 files changed, 1386 insertions(+), 49 deletions(-) create mode 100644 assets/hbm/sounds/weapon/laserBang1.ogg create mode 100644 assets/hbm/sounds/weapon/laserBang2.ogg create mode 100644 assets/hbm/sounds/weapon/laserBang3.ogg create mode 100644 assets/hbm/textures/items/gun_b93.png create mode 100644 assets/hbm/textures/models/selenium_engine_body.png create mode 100644 assets/hbm/textures/models/selenium_engine_piston.png create mode 100644 assets/hbm/textures/models/selenium_engine_rotor.png create mode 100644 com/hbm/entity/projectile/EntityModBeam.java create mode 100644 com/hbm/explosion/NukeEnvironmentalEffect.java create mode 100644 com/hbm/items/weapon/GunB93.java create mode 100644 com/hbm/potion/PotionEffectBang.java create mode 100644 com/hbm/render/entity/MultiCloudRenderer.java create mode 100644 com/hbm/render/entity/RenderBeam6.java diff --git a/assets/hbm/lang/de_DE.lang b/assets/hbm/lang/de_DE.lang index 00a2ee037..4b5ffdf44 100644 --- a/assets/hbm/lang/de_DE.lang +++ b/assets/hbm/lang/de_DE.lang @@ -33,6 +33,7 @@ achievement.FOEQ.desc=Sende ein Relais in den Mars-...ich meine Duna-Orbit. potion.hbm_taint=Verdorben potion.hbm_taint_boost=Verdorbenes Herz potion.hbm_radiation=Strahlenkrankheit +potion.hbm_bang=! ! ! hbmfluid.none=Nichts hbmfluid.water=Wasser @@ -160,6 +161,7 @@ death.attack.boxcar=%1$s wurde von einem fallenden Güterwagon zermatscht. Autsc death.attack.broadcast=%1$s wurde das Gehirn geschmolzen. death.attack.ams=%1$s wurde in tödlichen Teilchen gebadet, die von der Menschheit erst benannt werden müssen. death.attack.amsCore=%1$s wurde vom Feuer einer Singularität verdampft. +death.attack.bang=%1$s wurde in mundgerechte Stücke zerfetzt. item.redstone_sword.name=Redstoneschwert item.big_sword.name=Großes Schwert diff --git a/assets/hbm/lang/en_US.lang b/assets/hbm/lang/en_US.lang index 228f950e7..01f68c050 100644 --- a/assets/hbm/lang/en_US.lang +++ b/assets/hbm/lang/en_US.lang @@ -33,6 +33,7 @@ achievement.FOEQ.desc=Send a relay into martian...I mean dunaian orbit. potion.hbm_taint=Tainted potion.hbm_taint_boost=Tainted Heart potion.hbm_radiation=Radiation Sickness +potion.hbm_bang=! ! ! hbmfluid.none=None hbmfluid.water=Water @@ -160,6 +161,7 @@ death.attack.boxcar=%1$s was smushed by a falling boxcar. Oh well. death.attack.broadcast=%1$s got their brain melted. death.attack.ams=%1$s was bathed in deadly particles that have yet to be named by human science. death.attack.amsCore=%1$s was vaporized in the fire of a singularity. +death.attack.bang=%1$s was blasted into bite-sized pieces. item.redstone_sword.name=Redstone Sword item.big_sword.name=Great Sword diff --git a/assets/hbm/sounds.json b/assets/hbm/sounds.json index c750727a9..4c54ca7a4 100644 --- a/assets/hbm/sounds.json +++ b/assets/hbm/sounds.json @@ -67,6 +67,7 @@ "weapon.ciwsFiringLoop": {"category": "player", "sounds": [{"name": "weapon/ciwsFiringLoop", "stream": false}]}, "weapon.ciwsSpinup": {"category": "player", "sounds": [{"name": "weapon/ciwsSpinup", "stream": false}]}, "weapon.ciwsSpindown": {"category": "player", "sounds": [{"name": "weapon/ciwsSpindown", "stream": false}]}, + "weapon.laserBang": {"category": "player", "sounds": ["weapon/laserBang1", "weapon/laserBang2", "weapon/laserBang3"]}, "weapon.reloadTurret": {"category": "player", "sounds": [{"name": "weapon/reloadTurret", "stream": false}]}, "weapon.switchmode1": {"category": "player", "sounds": [{"name": "weapon/switchmode1", "stream": false}]}, diff --git a/assets/hbm/sounds/weapon/laserBang1.ogg b/assets/hbm/sounds/weapon/laserBang1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5d7c82007349b44ef2abb2a9b80129d9e648b341 GIT binary patch literal 11327 zcmch6c|4Tg+whsOFG;p2gbc=(q3mQ|#@blYSc;KdVJw9-B4tgCEkpL55|b^GHEU(h zmdKJl5vBCre4pR%d7t<5exA?s*K%GJW_2&7Ud%fupP%lnlF~KJe^$(QE2YEOylub9vyO0y=<#9v3qQjmiswTmw zUjgbZ@IAozR9rZOaym2lFdSm(IK;Pdh&kp$&CoyNjs_n!F^A}ndN)vu9QcYuEYK_W zKi~MyJFrL0bNB2R30X?*cxk zH!o<_eS1leb}Ecnqm~rZQwPmBVg*EFGhaBf1~dk0kaH|7A>rp|DFzq6&&jO5C0lxc>JQ zp3Pqh03854o!;EK-rSwuhg2PLn2!SR0ibz_TiZvxGvT}eMB|{=yKS3GvVLZlJ^v*H zXvksd#4AI!3t|P-NmSM!Ja6WN+>)wRG@xFyr2$ zgb-mYs7^sgjKCs^Xp9!h&$Gn#=7p!CqaWjq(ZYyC43?qzdIH)VQ2>b)&JF#(*f3~RVX7t?*-6CdA?Hax#tNOOzRaSFoW4xxJfcsWLLmvyB2ANoXVMVL zfW!c3pdUl_`*?Pk8VP!j$48-PPvDp}=#ckKF(stL0d@W2ump^LaeD$LCJB#Gq(l0# zU__DaR+uP>Jae3@#OMGfR-%Js9n%;=bdV?>#$rqB+O6=>7k1w&pfiXgipcW(5jUgq z;cNF2brmUqNsqYoF4Mmb}!;>GP&*eFzcDn43b z^gXr$TEi?_p%WXHQ2E0STY88psvJTkCEJ;)gsw{-36w0~vBOJhj7&zmNGuMy9T)A$ z#P`1$n+#(vpC`Gks&kR$c|~V=*H2^^yiH<{Ma4{Rag{i?+IQ?anZrN{0&54 zJeeaq=p1^Hk61#cNpm-q9)(b~FJ(oa1K?US4DdCFOPjj9jRJhefS~?XA)hlGjik*E zCu)cwEn@WFriLY;g!73QEG>czNi7YBk?zb3XTgdhs#(yk#l!)uNIp3k8-pZsXd;X6 zW3XcR)ydcr6xkBjmP+hZKteOn$nqo%wv;4huUr_y#3IQMpss^x_K5t01Zf7@{19Me zeG_t;N|2I4lq1?xvC)-~T8bcE9xcuZ&3MUyJDy!_1)<7g!9lBWTE`WWu@InO$f2D4 zgWLLsNhZ8d41nJtW>(11)jAUtO=5Y>Gygw{xKNi^&`e0El=&q3gN2nS(ds$eA1&Fd9Xj zjnY9b@}2JxX+IQp2Px4M38}NGG^8%3=mip<8BNDe#Gujq;TQ-NWU%l<13rBo!9fFU zNc*1+;Yc$5{PY?5{TRXG+>uM}BKfBbVlp}`gI4MWPX&3_$q~`9#UpX~ z+|Y)UpbaTKXQn@Pg${gy967XuRD3_zea^#J&WMRQ4DC@+xQA#v1VEt%0zk@`0EPQ- zX7tkG{*d{;5Fnd~QC#GM_J_=Xwu{UsLJ^t%&{uh|eI#8IEP5ZG1k`vT6=&4w*LN+q z?^U3c7#@@A;3g6sq9LomMAzx`s_P*;vXn%SWKNIGjBp}0T7f1J6MbQEIt*gvldyi3 zVar1oN^&TJzTqK*33vkotIax(`{;D;{hJ8dL+15!<#XbD6&7PKF(`fLUXS1i3|8e&0htIJ4qn7DOy9M8sjl{{Imn4@HrqSpL7?KwE|6 z@?RTa@V2G}*8KNP2bX0+KfP`k!=W(4DFC2X7s+>kWPyMZ3uHzjB&o+?81z@jUeR=r z13}XsH9SO&1|%*>aQ|u)|JCbOK;|bN0<`+|k%tP1%s&+HzsCKm_wVH9zhMX*)Sl)B zd@LR$d&Ji=uk*D>`T!+%S#0yG>+3-;db;}hdivTrdIo5; zp1xk5?zd9ck{1VifB)ig=c@KL89uIkUz92R;LWjEio18oUuGz#zVK;g&ZBqVVhexR zCj6cJ9WV}*@IIcFxgM!p^|zZ8*RRzgsv0)U@;+&l{LP0|>o#7lv6jpl_@a1jb)3pT z(n#ddhS2fB{bJhNzkDA@H$)j*D2ZIsZhBd;-<5G8O|tIOJ!ct0p-`qak)1tt<<28L zi%|P$b}RXwa|C6PbIG7u^Uvj)bZ~uXvVVJWtW@>G7mvr%tW`1k^+|3V5}*BF%+D>R zCaOJ<@cYd$C>nrS%n+J(?+fdzF>{L%*cD|mW7)giuo{EV!cyOklnA8St-)8amMNr@ zDW?5t-m8U|z7I5d6qho8O(VxbQ%u5mZt0;#pI2L8l4^va==OW0R9j{23inEC9H;Ey zw-1}t6#>_`dsz`W3}fy0ubeUR z#c<1Zi7dlp65~8>&R0J=M^UExa$jDx;h2la>W<~?(1D|ev71$~nOxhsWJ!MIwa9_Q zj**)8tqz5jKAP_3=q2xH579aH!JOz5ogI=7h*Fx zWCn1axcN!+9aVAJ>&yb!K zhpksNR|4TfB9ObBs#b$Iz4N}hS!Ns`}2fgW$zst z#Wu4$flZQ(t$jTnp4b(I*}|h%vhdyVaZ-uqFai`)UZ{>*wzq zEmDRU)l7;FD&Y14XDr60#?jp$o1zlD{;tOs+|sU$^6rq#j~%azo$WNLDnI+y&6~c- zkQG2A`>wAVtEtGC5^7yc_7&Y_ePz$9*uM2L-jF@hd7)bJ#+g3mud%dc$Dj64*V*m| z+01(Ii`Jjb{1%t~VXva-yFbFhgwWxmPL)YwjiK0sIlGQtWCdB|UP=vJ)=6uQ9hVfZ zteqa)OkC~#PbYfN?6>VQ(XPT-`3K^Gf(5t3$@?#*>dq?QK3#fs)(B(xgQqW66wuJ> z-TRWvfzI^f%Jg7O%{@meZ_r?Q1ynPc`hd3Xxs5kzmLlKx5^6ptqR+-MHqp@Oh01%H zkRT^VrwEjq;PzG=o-2f9%2^{H|)=Wtk4f(Rzh8Um5?%V(LeV zcNAKSOgVY#=9X2wr0uldJcWU_anh}?)yjb<^zv=L$0%j0>&3O59H#U1SV>H=GM3xF zy;@ga`!=@XT%;O}R6w%kz$z?>;0U z3RUy-A7@u{kAXF3{0(l>xo)G(c6~We{+He}Ha`s^dOH zJ7`xS4DD`e9+%G*!)ua&9XBf{2vJMIQ<#?tfwH>6`bopWUo8&ITP#l-T7^BY_B!aU zPo)2TuMkLgyj9ZjV#`8Nl@x7F19k3gi{W% zJt<%_-}|~!)*bflq-MwD6y-eV(yi8m-?;0ydg&FmC?GOSAao(&>bdh46|t~g#b(RN zSDBFviWPfBMn*J1)euJs4%Ct|EStS#!Rl_)jmMJv$y{aP=VG{rK2l4>-l$xxs-0ye zb*{Zvy}Bcun09=-iUTEYK@!xJ5aZu|`BA8r9mdOj7S!@(jW<48gAv>~!Axs@Yw-{+ zO7_%A`@zrdZ`aCJrc&KwoCPgYWb?oBPhL!ln5t1bQ%Vyqan7Yn%4Q>7#^A--?;(*l z0q<`CS}%3AVdqjwW==z3h$;#=L5YK6Po>T&sj zeSfCDyLVsvVy`7jdb0tuMchwM~i!wN;I&$n_jBvSkKsD zYGsDc$A~NZW_c_B_4x1guX1;^YC`REsVLi?t!3v;z2{>L%{~Zo1*+nZma3~I*}l^S zgkA+;6D%Wo5 zNn`3cjqc2h1JHGN? zyq`ZT_O%5m^mpR!^m7l*?TS!m_{V-3u!t@4OGs}25J{(=ttIYL(ecWBA2uy^HiBZ0 zVt9QA4F_U4w&tg$7cDrMs@#pmqkgf=1=db^-m%UdPKms#q$M@}dt^#Zfo;)qAbiq8 zs}@+~2lDos$333&goBWk7Wk2U{842A=A1Nyj#Y{ml}lf&U~7+A-?==4IoI!7xXLTP z<(@~Fn>N(DeELkhDtxUghBxVWCVj*$qqXyQ_GiufRSnJ1p$t0eNwzm#VQ`{sA+URT zCM{vBHv8pI+SA?=Ei6LtZ&`; zdqEH!FyJ1xQk{5SN~5k+|2VW-7IDH8vFax3e8Q-~1un zrXIv}8wB<%kTX*x51jqD1zN{v4d9UE&9qvmFs9c>-Hrpn3>fIxXcXUhe3s2`sjEoV zy5Op5qmOK)!xf+NxE^H@&cev|z41kbek;~r6nPbN&)Ji=>Te~i`IR512wBNtJT$V` zIv{IS9*o72jQww7ClsD%{A#-zL}znvfN=&U(Dj=;X*FDeZptM&_{Gf=qb=(9^DLj0 zEHhdLpIA=DO#OmqrngXnkmj$`KS9YX@VfMCF6)%La)7A)@z|KAXd?ju>nMjp)1Xh> zKQw$zbKL@s-r9X%8=74c!5}BrPOJ@I$GZMK$qx>?6Br?tChuRR1Z!&XD8ov`Kw8`6y+_&cveu$&1=1DBER998k+1m1&Y*!8Mgj-> z4lM+RyxehHG4OnuhXw@MaHb%>WgCCfu6)5TeIxu%aVUpMs-`eP0K@TuJ|)z2*p5PM zQsII%yLI`iUBxOxGnM)8%gmr@UjveUUe>bhCq`iE%MDuAKIy9r&^1N9K&po2r;mL3 zsTh-$?6iU6vK4&z;Bok-mQIPGPH~BE_u7imgWGJy^{#&^$h5pYa5&_LmK(+CK$I*6 z;i}l;VsDzFwtYpX#(YXjSZ`8Yc4l_k&j;Hk?zWtt%N+Xp_+uCcn8xCtj67+3@^M_w z3~nz|)&L9XX@Nqh+4GM(${_W$-7&3;Gw7olkbF@fM%x z7_FKiS#Eo@yte(cocg4o? zSMyCg&#?1yo3((=!klH>cU-`uoeRvo#)?NgUM{n?VZgN(22_SW&uSO1sP_NLdAT+;C>sMlz4JFPk>@RKc1~YwCnDP?k(LT!0bQQXD0WV4!J50Np~BU^?${3@(bG zA^0xkQX6HAonMO{;TFsrtSV9T55oEP2=%+LHYQ#(I4BdEYNq~^&88Xu+fd3)iQ>K} zapJ&ZFGV3_zl9o-o7*mQSJ3_(uIBZsQo6Ku(%8WIJmbsJ7bWrmr8YCuls{*#51Tg6 zcfaGkVV$H|FDF#UYajfplAtllgRQq+^*era<3O4E=09&7pi3>_xheNcTFXFRS4-Of zZLF)K2i+xTX=&=IYijFj>geg~qm9*dw6%3Kb+xrMF(!ICM*6yFSBEA8jUx}zNMS0? z1YX~*AGDtnAFB(p?_>B@M*i^O<_?STrTU4ZQiYh5PH(dA^r#r5bj0!nwH9mJ+zwDp?{P@4N_U^R2DW zBaMcuZ+K`w8Fu0?pFlCZjVW^B-1Er41XN4mdCgRpOm`|4g@8yjHK+|vK|MR$AK6#r zWWbS?7a9G99Dn)IS^vv12ul%n>%Q-<`j^oWj`ucPt>wT*m*I@cicc6RHN&iQ_ zcdD0XL*-5krm0v^O$W|GdCW}Nt{n`puz)sIe+u09CRN6aZvGPVE>^WR~xP@$kW&HQt@& z+L$EWFV>^WGVRI|2o@*li93Oo-AVQw)ZtnML3a+e9fB{wn&@Xafoc|+Y(@y2K*N4* zjBoNe-F2#w|F*R~VypUh@z*02m0ME`3hm}&IOF=kw!vi+LJ(oP+VlCNvo=49f1M5; z@V_yauhBRK00*xUoDm#%iLHQ*^{T-pU*4<|9%`Fl_hFjLTGoRd?AzEM4wep9=c-hDEm;9C7vihC4|za&;XLRMJ9 zTd7z~cc#~$q@_ay(8U#gS(_->$*JpGo@ZROLN^##{yn#OZLty-4i{@rRo5SRnZ z+bdUA{Qj(;XE4sQTt5ZRSnTg(P3qORzdkf!p~W5$?)R-f+RXo@oJ{>m3BzxSjq?^> zC1-9Ph#v&zSV2c2;X7+_-~@E=P{?{SjJcRuT_+RkZet(*G;4?-!A7sMT?$S0XL ziRB^G&YRFA*eCY~Q0uyvDo~r$ZDj@X=hMlzUb#7zUe{ytjE+v6*Ij@T@XnC@{E;kC zFJM`9-A?E9m1uM=slykNL}Kp;E@z)zsI#@TySf0UDZf*$C336GH5V~2xyI4NgD{L= zLRiQ&jl-$I-K_cs)jI$X9e|W~mxSzoe{PP&O6Z)XM9Yq0x5(UZDSx1UszT5+|? zeKxm^7_;TAy%e!lKX;?CQ0!cwW6@Np zgH@Un^@ZO~SFGzY_puD#^$0!h1=0C5Wh>DX_!l z&_W368dv;b;2sKW-d>bJtn<6|R%;`KLPkCXE=!m%)za-c347F;<99zR%X*%q#Z2&t zs1DBr;~$R=p+tC3ZP5zeA`IRwlmIC+VAE#gc(~A4oA0R!H@PH2o=gODn^TY5O?F-6 zXVtw~a`oUmc@(zTo)LenEXI=>O^XVdyl(*P6rm7)amHi)3>7ey76V^8n=9YWDv&H} zQ*K3z>pomdpP~HWm{3xgL)n2yc+E<&@+Vq4D*xWYl-tL0#nc-rtc08P7CbXRNQnR~ zbjbDladD#+c)fr(8}rEZOOW3bOsqw;rc&Oi{Ao9l(>qR@jBh)M)x9edFPVA9+uZlA zSCj^7O5gv}`Gt;y+XHZ5JVTn^H*W?+X_(r%=RkG;X@N@lmAj4GMdx2@-;rO*nhtEA zxnTBWYP>j*qEq%uNy-nS9`|$$R)#L=Fyw=0lp$C+AYAl{gD${e0L>*r`0*NMd(-xz z^2r^0gYw@D!|mg|3;o^nsx9?n<>o|734k+LPX(| zK+daw+SOj|!%Mi@?(6TyGI}GQ+waV!nyt;N7jAh4n5m^`ZSyjf(|sntQ76zUFxHz@ z+kf0lGeDMpJ6T^|w0qe0zAMvTHp7r9QC~Ao_4Q^_qWJLV6>RF$3I5<$4r3KT?w|7H+zz70W zNJ3@PM!nBKq=ZteX<)DH%xh&&*+@{8RFhP}e9xHT7}tA^kRP)9^|sH2Gj^V{SMrY& z1Wc!ALjd4i{>%nWxfnGKQj74=@ZTw{@O+1_6-sYJ_{wrmZbe_T0M4YL4cQ4h&#^~AK>HB$|9(}~#egNF;F=LV zHSTOoPUs5~$xuZwPAz-A+(~UeWB#Xx*KJ0Ld4g#S!8a9)01Q};@`!Qg!bN0I<)^poQG6#r)JaEvX_FPt)$cfHsb zcJ{jPz~5zmyua+hAk*YLbeVU^x^QC>{C#3Wu8dskAOpiEdXvv8^97s+fpZ`0&73JK z9WDGl3P!{=dN@B(e{yr&$B2{tHVdGCxk3V47}*Zp-HyK?5J{s0s)>pYk4*yI$(2^~ zlB%ue4X~}OEX4a!dQozYj_99Dp&_Tzw6ldg5&XiqW?IvY6N|r5Lhiii*&}Zk>`B3m z1K0juM~B_0IMbK8%+${poad zg3}_rdS0cLsG7w7%__j}vPtz2&CB)l7dxwr8^||qKA$~r@OD=|9BkIl_8a`j1M=k& zd3>(AzTUUYto`JdQI&30GPv~*>pVA|o!UI91F}ZCYLp{~Ta=ReaBw>&@{@x3&9!pG zwQS9+#&cQn8#AFHdDPQiBenQ17>kz6RdB$^dMWN@O<}A?v)P&{Dw$x&L!}_b8Ny7y_&mz z6>F7xZxG{OFAOpjw&0MvsB8Rt8vrO9HB?o-l!PTtwKz|CpR(7giN<{x`pSqHD>Aw) z(bMCy`)A#hiK;_|b67g?oP}o=O7q~xi*xX%k4UM`W7AoFero~*j4bWF8|}smw{L$@ zieS0m$@I65RL$7dC9zpBvhe-lm9F}MU8~G3r|Je}I?&4AZDOPg8e zc{97Z0E_thdRJ!y0uOii!&3d1cbdnFgp6XY#0EM#+;x4g#{DyXGaxnTYL-6oN`vtO zY`grN=Dw;hPtC%1$MdIc0=KydSpk%pKRuyQC zw|O>)AadAQ>Dqd943 z6mBtofs38A`bIz|E;Xo4ZrK(YTHebQy+@W%DSE<8}+ngIi;%Zn%}~Uu)Aei&9eERN9}7diRimW?(f>IwfRed?j+6E3Uz5evRbD}EZF9@FO9EUnmuef9)++Gzp)W^ OSV%pr-$E!)()=IIUl(Km literal 0 HcmV?d00001 diff --git a/assets/hbm/sounds/weapon/laserBang2.ogg b/assets/hbm/sounds/weapon/laserBang2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a97420f500c7e1bc1af6e89e9e494fdda40ec106 GIT binary patch literal 8855 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 vdA`Qs3%edpN`RyZC-Y61TPjmv~j literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/gui/potions.png b/assets/hbm/textures/gui/potions.png index 5133b4a2598304dc090c4b5a534c40c7f00f9304..6bbd7a9ef5c0845c0f282c04a92a39039e85f7e8 100644 GIT binary patch delta 1363 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 literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/models/selenium_engine_body.png b/assets/hbm/textures/models/selenium_engine_body.png new file mode 100644 index 0000000000000000000000000000000000000000..22dc10490ff78fe4cc36537a1aa56cbe2aef7faa GIT binary patch literal 5320 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 literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/models/selenium_engine_piston.png b/assets/hbm/textures/models/selenium_engine_piston.png new file mode 100644 index 0000000000000000000000000000000000000000..ca96a1bb1c22f94e8dac9e362e66901cfeb45732 GIT binary patch literal 6343 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 literal 0 HcmV?d00001 diff --git a/assets/hbm/textures/models/selenium_engine_rotor.png b/assets/hbm/textures/models/selenium_engine_rotor.png new file mode 100644 index 0000000000000000000000000000000000000000..d97da35981bb74312377b3c8402e6dd945b5a1c2 GIT binary patch literal 2229 zcmV;m2uk;fP)00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00<>XL_t(&Lw%W9a@;TsMCYQ8xBK5AP_^pm zxk1|>E{;S3=mi+Yd3}6*yuZKm`}6a2*7-O;e4ItrUteGId)C>&=70bGWdpC~32(FD zWA+d{&u4!E=4~EMx+LO>3;zE8ejVRA3PBSNBvlP@kNByc(m~4t4CW4;)M+Gh5|%5!is=EM$+#N=X37k*Jz=(!E?dxvhXVaMC)Od+14m_zIk? zi3t(_M~4%IMjAt$r1Y-O91P}tqsQ?bof z66NCspjgit)0Q=92;>FHJPm87Td0VLc2u)y!!6X84S|v0iM$(Q%av$!DHy1878d~P;vB_C zOoFmCbN3j?W~;PCCp+eMdE-VZPc3i|1$2Uu1A^5$xCPv7H!R z(c#$2#_S%or2`0w3EfevipmCr?8Eyr>lAdd@RI)$&??T z$r@mL*qikLKfS{bk&FwY^$qOGZ*xlUR@xZ~|T zhTs08s8V*_p`2DG;AX_8nyM}Zpp(j|c#B>%)LCPun!0h!9)Cq7LXa0t1%nN^=u!YD z5XemXZNk~;IM_I0=s0!==+;bRo0)(}3dj=kR-iiFW++mtf+R+L>pAOu3D%{93e0yM zOu6nNyi{nPFS44Owi;`AvRq~^&&_?P`J>h<2<}`!jSaxe^Gg9wi$lKdno_liCoIyIHb-K`T|7o#0Z$6?%xS?rE zVt?&>Zj|+r@i)s+Zp;}l&`(G4DvQbf{8^WQu*E=Su^pVgL3_Ve-JpQ8CzLPshdE2F8UMqU-D#z4AprZbZg|BmRt8v^(=}ytcJg%rNXmG|sF|zlR{;1X0|D-; zqL7b7v+IlvVDm6@X?xF!P(BY+*z+G8B^)M8T!_J}+m!R9C~%h(kZ9JN(zDHigMo}O zc1pVcO`J`eGpiqjcB-9iz)nxOmYT4$NYbiu1Muy`cbt0)`8~f08!p#i}KDY-4#pSFSiRMI}SNByS zhH-8Tz%)2!$|?5PDwdw^Op5uzdpz-1zULLPTLrB<>ubzc5|1lxAomi zcoO>&7U_!q>XzAm_dsQ`Mg+Ab40ZR0JwPe;H>|@HgT(1@^^xK{{PEZ6-{2lO#@s$d zW!3J*D9u1+h%iX-Pt3`f*{oeX;3-r+hl%;eZd`;Eo-Jk_p>1p0ApKT-j1=Ww>t-G) z^|26)0*M2;EKn}}4fh~K^o$Gl4^G>tJTQzTz5bij33yE*nBGlXO@s6X!}>@b>5Yvz zOnQGCICx^#S1reX^Z>O&yjusdaY7la$TpFahKmMD&W3p1bBT`xw=;dC=G0}O0P>}v z+-8Z~03KEelCp~IJS2YIP+V&|xOxm!HYx-?7K&?`Vvfsh^KoPjqi3h*2{y3h7zu8e z@~xd|X73(AdMG4;$8enE%{IxlAI3G#<0Pnb@!Kx6P$lf_ye(A1)kF$59>Qx0;&D-~ zv-OiWl!LPTNjz-L8C;)KkOZ65ULz4Hl5V;+z ztnB-e0a$@5rHCl4%(wM4JgPUg%5qt#P`Y1%VX6v1%{$b~HgietENoi$32XNlmF#qv zg(_=3aYSm$LoOo;fDw z*kNoyE1uL@pz=kw&x1*xAMCW5+2mp(Ke{y6?8keTf{BXqrd9wTm!qow3A%U&<00000NkvXXu0mjf DZ($&k literal 0 HcmV?d00001 diff --git a/com/hbm/blocks/bomb/NukeBoy.java b/com/hbm/blocks/bomb/NukeBoy.java index 08d7b6e2e..d3ec2ac36 100644 --- a/com/hbm/blocks/bomb/NukeBoy.java +++ b/com/hbm/blocks/bomb/NukeBoy.java @@ -152,11 +152,7 @@ public class NukeBoy extends BlockContainer implements IBomb { // ExplosionNukeAdvanced.mush(world, x, y, z); if (MainRegistry.enableNukeClouds) { - EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(world, 1000, MainRegistry.boyRadius * 0.005F); - entity2.posX = x; - entity2.posY = y; - entity2.posZ = z; - world.spawnEntityInWorld(entity2); + world.spawnEntityInWorld(EntityNukeCloudSmall.statFac(world, x, y, z, MainRegistry.boyRadius)); } else { EntityNukeCloudSmall entity2 = new EntityNukeCloudNoShroom(world, 3000); entity2.posX = x; diff --git a/com/hbm/blocks/test/TestEventTester.java b/com/hbm/blocks/test/TestEventTester.java index 3a9016ec0..6d108f92b 100644 --- a/com/hbm/blocks/test/TestEventTester.java +++ b/com/hbm/blocks/test/TestEventTester.java @@ -16,6 +16,7 @@ import com.hbm.explosion.ExplosionNukeRay; import com.hbm.explosion.ExplosionNukeRay.FloatTriplet; import com.hbm.main.MainRegistry; import com.hbm.main.ModEventHandler; +import com.hbm.potion.PotionEffectBang; import com.hbm.potion.PotionEffectTaint; import com.hbm.saveddata.SatelliteSaveStructure; import com.hbm.saveddata.SatelliteSavedData; @@ -25,6 +26,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentProtection; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -256,8 +258,11 @@ public class TestEventTester extends Block { data.markDirty(); }*/ - if(!worldObj.isRemote) - buildEvent(worldObj, par2, par3, par4, 30); + + /*if(!worldObj.isRemote) + buildEvent(worldObj, par2, par3, par4, 30);*/ + + ((EntityLivingBase)par5EntityPlayer).addPotionEffect(new PotionEffect(PotionEffectBang.instance.id, 100, 0)); return true; } diff --git a/com/hbm/entity/effect/EntityFalloutRain.java b/com/hbm/entity/effect/EntityFalloutRain.java index e09d7243b..dc5a51d56 100644 --- a/com/hbm/entity/effect/EntityFalloutRain.java +++ b/com/hbm/entity/effect/EntityFalloutRain.java @@ -1,6 +1,7 @@ package com.hbm.entity.effect; import com.hbm.blocks.ModBlocks; +import com.hbm.explosion.NukeEnvironmentalEffect; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; @@ -46,8 +47,15 @@ public class EntityFalloutRain extends Entity { double dist = Math.sqrt(Math.pow(posX - x, 2) + Math.pow(posZ - z, 2)); - if(dist <= getScale() && worldObj.getBlock(x, y, z) == Blocks.grass) - worldObj.setBlock(x, y, z, ModBlocks.waste_earth); + if(dist <= getScale()) { + + if(rand.nextInt(50) == 0) { + NukeEnvironmentalEffect.applyStandardAOE(worldObj, x, y, z, 5, 3); + + } else if(worldObj.getBlock(x, y, z) == Blocks.grass) { + worldObj.setBlock(x, y, z, ModBlocks.waste_earth); + } + } } } diff --git a/com/hbm/entity/effect/EntityNukeCloudSmall.java b/com/hbm/entity/effect/EntityNukeCloudSmall.java index 6937cc07c..632b1c966 100644 --- a/com/hbm/entity/effect/EntityNukeCloudSmall.java +++ b/com/hbm/entity/effect/EntityNukeCloudSmall.java @@ -78,5 +78,15 @@ public class EntityNukeCloudSmall extends Entity { p_70014_1_.setFloat("scale", this.dataWatcher.getWatchableObjectFloat(18)); } + + public static EntityNukeCloudSmall statFac(World world, double x, double y, double z, float radius) { + + EntityNukeCloudSmall cloud = new EntityNukeCloudSmall(world, (int)radius * 5, radius * 0.005F); + cloud.posX = x; + cloud.posY = y; + cloud.posZ = z; + + return cloud; + } } diff --git a/com/hbm/entity/logic/EntityNukeExplosionMK4.java b/com/hbm/entity/logic/EntityNukeExplosionMK4.java index d4b4ec132..9d6f3be7e 100644 --- a/com/hbm/entity/logic/EntityNukeExplosionMK4.java +++ b/com/hbm/entity/logic/EntityNukeExplosionMK4.java @@ -50,11 +50,11 @@ public class EntityNukeExplosionMK4 extends Entity { if(explosion == null) { explosion = new ExplosionNukeRay(worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, this.strength, this.count, this.speed, this.length); - if(!worldObj.isRemote) + /*if(!worldObj.isRemote) for(int x = (int) (posX - 1); x <= (int) (posX + 1); x++) for(int y = (int) (posY - 1); y <= (int) (posY + 1); y++) for(int z = (int) (posZ - 1); z <= (int) (posZ + 1); z++) - worldObj.setBlock(x, y, z, Blocks.air); + worldObj.setBlock(x, y, z, Blocks.air);*/ } //if(explosion.getStoredSize() < count / length) { diff --git a/com/hbm/entity/particle/EntityBSmokeFX.java b/com/hbm/entity/particle/EntityBSmokeFX.java index 3c293822a..372af265d 100644 --- a/com/hbm/entity/particle/EntityBSmokeFX.java +++ b/com/hbm/entity/particle/EntityBSmokeFX.java @@ -6,9 +6,6 @@ import net.minecraft.world.World; public class EntityBSmokeFX extends EntityModFX { - float smokeParticleScale; - public int particleAge; - public int maxAge; private static final String __OBFID = "CL_00000924"; public EntityBSmokeFX(World world) { diff --git a/com/hbm/entity/particle/EntityDSmokeFX.java b/com/hbm/entity/particle/EntityDSmokeFX.java index 63b17cc45..a85245e6c 100644 --- a/com/hbm/entity/particle/EntityDSmokeFX.java +++ b/com/hbm/entity/particle/EntityDSmokeFX.java @@ -4,9 +4,6 @@ import net.minecraft.world.World; public class EntityDSmokeFX extends EntityModFX { - float smokeParticleScale; - public int particleAge; - public int maxAge; private static final String __OBFID = "CL_00000924"; public EntityDSmokeFX(World world) { diff --git a/com/hbm/entity/particle/EntityModFX.java b/com/hbm/entity/particle/EntityModFX.java index 345cc113d..e416965d4 100644 --- a/com/hbm/entity/particle/EntityModFX.java +++ b/com/hbm/entity/particle/EntityModFX.java @@ -15,7 +15,6 @@ public class EntityModFX extends Entity public int particleTextureIndexY; public float particleTextureJitterX; public float particleTextureJitterY; - public int particleAge; public int particleMaxAge; public float particleScale; public float particleGravity; @@ -33,6 +32,9 @@ public class EntityModFX extends Entity public static double interpPosY; public static double interpPosZ; public static final String __OBFID = "CL_00000914"; + float smokeParticleScale; + public int particleAge; + public int maxAge; public EntityModFX(World world) { super(world); diff --git a/com/hbm/entity/particle/EntitySSmokeFX.java b/com/hbm/entity/particle/EntitySSmokeFX.java index 7b93f528d..1b0d87995 100644 --- a/com/hbm/entity/particle/EntitySSmokeFX.java +++ b/com/hbm/entity/particle/EntitySSmokeFX.java @@ -6,9 +6,6 @@ import net.minecraft.world.World; public class EntitySSmokeFX extends EntityModFX { - float smokeParticleScale; - public int particleAge; - public int maxAge; private static final String __OBFID = "CL_00000924"; public EntitySSmokeFX(World world) { diff --git a/com/hbm/entity/particle/EntitySmokeFX.java b/com/hbm/entity/particle/EntitySmokeFX.java index dd4ff0ee5..8ec8d32e9 100644 --- a/com/hbm/entity/particle/EntitySmokeFX.java +++ b/com/hbm/entity/particle/EntitySmokeFX.java @@ -6,9 +6,6 @@ import net.minecraft.world.World; public class EntitySmokeFX extends EntityModFX { - float smokeParticleScale; - public int particleAge; - public int maxAge; private static final String __OBFID = "CL_00000924"; public EntitySmokeFX(World world) { diff --git a/com/hbm/entity/projectile/EntityModBeam.java b/com/hbm/entity/projectile/EntityModBeam.java new file mode 100644 index 000000000..0b0a7480d --- /dev/null +++ b/com/hbm/entity/projectile/EntityModBeam.java @@ -0,0 +1,602 @@ +package com.hbm.entity.projectile; + +import java.util.List; + +import com.hbm.entity.effect.EntityBlackHole; +import com.hbm.entity.effect.EntityCloudFleija; +import com.hbm.entity.effect.EntityCloudFleijaRainbow; +import com.hbm.entity.effect.EntityNukeCloudSmall; +import com.hbm.entity.effect.EntityRagingVortex; +import com.hbm.entity.effect.EntityVortex; +import com.hbm.entity.grenade.EntityGrenadeZOMG; +import com.hbm.entity.logic.EntityNukeExplosionMK3; +import com.hbm.entity.logic.EntityNukeExplosionMK4; +import com.hbm.explosion.ExplosionChaos; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.explosion.ExplosionThermo; +import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; +import com.hbm.main.MainRegistry; +import com.hbm.potion.PotionEffectBang; + +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.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S2BPacketChangeGameState; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class EntityModBeam extends Entity implements IProjectile +{ + private int field_145791_d = -1; + private int field_145792_e = -1; + private int field_145789_f = -1; + public double gravity = 0.0D; + private Block field_145790_g; + private int inData; + private boolean inGround; + /** 1 if the player can pick up the arrow */ + public int canBePickedUp; + /** Seems to be some sort of timer for animating an arrow. */ + public int arrowShake; + /** The owner of this arrow. */ + public Entity shootingEntity; + private int ticksInGround; + private int ticksInAir; + private double damage = 2.0D; + /** The amount of knockback an arrow applies when it hits a mob. */ + private int knockbackStrength; + private static final String __OBFID = "CL_00001715"; + public int mode = 0; + + + public EntityModBeam(World p_i1753_1_) + { + super(p_i1753_1_); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + } + + public EntityModBeam(World p_i1754_1_, double p_i1754_2_, double p_i1754_4_, double p_i1754_6_) + { + super(p_i1754_1_); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + this.setPosition(p_i1754_2_, p_i1754_4_, p_i1754_6_); + this.yOffset = 0.0F; + } + + public EntityModBeam(World p_i1755_1_, EntityLivingBase p_i1755_2_, EntityLivingBase p_i1755_3_, float p_i1755_4_, float p_i1755_5_) + { + super(p_i1755_1_); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = p_i1755_2_; + + if (p_i1755_2_ instanceof EntityPlayer) + { + this.canBePickedUp = 1; + } + + this.posY = p_i1755_2_.posY + p_i1755_2_.getEyeHeight() - 0.10000000149011612D; + double d0 = p_i1755_3_.posX - p_i1755_2_.posX; + double d1 = p_i1755_3_.boundingBox.minY + p_i1755_3_.height / 3.0F - this.posY; + double d2 = p_i1755_3_.posZ - p_i1755_2_.posZ; + double d3 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); + + if (d3 >= 1.0E-7D) + { + float f2 = (float)(Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; + float f3 = (float)(-(Math.atan2(d1, d3) * 180.0D / Math.PI)); + double d4 = d0 / d3; + double d5 = d2 / d3; + this.setLocationAndAngles(p_i1755_2_.posX + d4, this.posY, p_i1755_2_.posZ + d5, f2, f3); + this.yOffset = 0.0F; + float f4 = (float)d3 * 0.2F; + this.setThrowableHeading(d0, d1 + f4, d2, p_i1755_4_, p_i1755_5_); + } + } + + public EntityModBeam(World p_i1756_1_, EntityLivingBase p_i1756_2_, float p_i1756_3_, int dmgMin, int dmgMax, EntityGrenadeZOMG grenade) { + super(p_i1756_1_); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = p_i1756_2_; + + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(grenade.posX, grenade.posY + grenade.getEyeHeight(), grenade.posZ, + grenade.rotationYaw, grenade.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F); + } + + public EntityModBeam(World p_i1756_1_, EntityLivingBase p_i1756_2_, float p_i1756_3_) + { + super(p_i1756_1_); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = p_i1756_2_; + + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(p_i1756_2_.posX, p_i1756_2_.posY + p_i1756_2_.getEyeHeight(), p_i1756_2_.posZ, p_i1756_2_.rotationYaw, p_i1756_2_.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI)); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, p_i1756_3_ * 1.5F, 1.0F); + } + + public EntityModBeam(World world, int x, int y, int z, double mx, double my, double mz, double grav) { + super(world); + this.posX = x + 0.5F; + this.posY = y + 0.5F; + this.posZ = z + 0.5F; + + this.motionX = mx; + this.motionY = my; + this.motionZ = mz; + + this.gravity = grav; + } + + @Override + protected void entityInit() + { + this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. + */ + @Override + public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, float p_70186_8_) + { + float f2 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_3_ * p_70186_3_ + p_70186_5_ * p_70186_5_); + p_70186_1_ /= f2; + p_70186_3_ /= f2; + p_70186_5_ /= f2; + p_70186_1_ += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.002499999832361937D * p_70186_8_; + p_70186_3_ += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.002499999832361937D * p_70186_8_; + p_70186_5_ += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.002499999832361937D * p_70186_8_; + p_70186_1_ *= p_70186_7_; + p_70186_3_ *= p_70186_7_; + p_70186_5_ *= p_70186_7_; + this.motionX = p_70186_1_; + this.motionY = p_70186_3_; + this.motionZ = p_70186_5_; + float f3 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_5_ * p_70186_5_); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70186_1_, p_70186_5_) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70186_3_, f3) * 180.0D / Math.PI); + this.ticksInGround = 0; + } + + /** + * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, + * posY, posZ, yaw, pitch + */ + @Override + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double p_70056_1_, double p_70056_3_, double p_70056_5_, float p_70056_7_, float p_70056_8_, int p_70056_9_) + { + this.setPosition(p_70056_1_, p_70056_3_, p_70056_5_); + this.setRotation(p_70056_7_, p_70056_8_); + } + + /** + * Sets the velocity to the args. Args: x, y, z + */ + @Override + @SideOnly(Side.CLIENT) + public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) + { + this.motionX = p_70016_1_; + this.motionY = p_70016_3_; + this.motionZ = p_70016_5_; + + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) + { + float f = MathHelper.sqrt_double(p_70016_1_ * p_70016_1_ + p_70016_5_ * p_70016_5_); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70016_1_, p_70016_5_) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70016_3_, f) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); + this.ticksInGround = 0; + } + } + + /** + * Called to update the entity's position/logic. + */ + //@Override + @Override + public void onUpdate() + { + super.onUpdate(); + + if(this.ticksExisted > 100) + this.setDead(); + + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) + { + float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + //this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); + } + + Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + + if (block.getMaterial() != Material.air) + { + block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.setDead(); + explode(); + } + + if (this.arrowShake > 0) + { + --this.arrowShake; + } + else + { + ++this.ticksInAir; + Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); + vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if (movingobjectposition != null) + { + vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + int i; + float f1; + + for (i = 0; i < list.size(); ++i) + { + Entity entity1 = (Entity)list.get(i); + + if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) + { + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f1, f1, f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); + + if (movingobjectposition1 != null) + { + double d1 = vec31.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) + { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) + { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) + { + EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; + + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) + { + movingobjectposition = null; + } + } + + float f2; + float f4; + + if (movingobjectposition != null) + { + if (movingobjectposition.entityHit != null) + { + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + int k = MathHelper.ceiling_double_int(f2 * this.damage); + + if (this.getIsCritical()) + { + k += this.rand.nextInt(k / 2 + 2); + } + + if(movingobjectposition.entityHit instanceof EntityLivingBase) { + ((EntityLivingBase)movingobjectposition.entityHit).addPotionEffect(new PotionEffect(PotionEffectBang.instance.id, 60, 0)); + } else { + explode(); + } + + this.setDead(); + } + else + { + this.field_145791_d = movingobjectposition.blockX; + this.field_145792_e = movingobjectposition.blockY; + this.field_145789_f = movingobjectposition.blockZ; + this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + float f3 = 0.99F; + f1 = 0.05F; + + if (this.isInWater()) + { + this.setDead(); + explode(); + } + + if (this.isWet()) + { + this.extinguish(); + } + + this.setPosition(this.posX, this.posY, this.posZ); + this.func_145775_I(); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound p_70014_1_) + { + p_70014_1_.setShort("xTile", (short)this.field_145791_d); + p_70014_1_.setShort("yTile", (short)this.field_145792_e); + p_70014_1_.setShort("zTile", (short)this.field_145789_f); + p_70014_1_.setShort("life", (short)this.ticksInGround); + p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145790_g)); + p_70014_1_.setByte("inData", (byte)this.inData); + p_70014_1_.setByte("shake", (byte)this.arrowShake); + p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); + p_70014_1_.setByte("pickup", (byte)this.canBePickedUp); + p_70014_1_.setDouble("damage", this.damage); + p_70014_1_.setInteger("mode", this.mode); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound p_70037_1_) + { + this.field_145791_d = p_70037_1_.getShort("xTile"); + this.field_145792_e = p_70037_1_.getShort("yTile"); + this.field_145789_f = p_70037_1_.getShort("zTile"); + this.ticksInGround = p_70037_1_.getShort("life"); + this.field_145790_g = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); + this.inData = p_70037_1_.getByte("inData") & 255; + this.arrowShake = p_70037_1_.getByte("shake") & 255; + this.inGround = p_70037_1_.getByte("inGround") == 1; + this.mode = p_70037_1_.getInteger("mode"); + + if (p_70037_1_.hasKey("damage", 99)) + { + this.damage = p_70037_1_.getDouble("damage"); + } + + if (p_70037_1_.hasKey("pickup", 99)) + { + this.canBePickedUp = p_70037_1_.getByte("pickup"); + } + else if (p_70037_1_.hasKey("player", 99)) + { + this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0; + } + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to + * prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() + { + return 0.0F; + } + + public void setDamage(double p_70239_1_) + { + this.damage = p_70239_1_; + } + + public double getDamage() + { + return this.damage; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + public void setKnockbackStrength(int p_70240_1_) + { + this.knockbackStrength = p_70240_1_; + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + @Override + public boolean canAttackWithItem() + { + return false; + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind it. + */ + public void setIsCritical(boolean p_70243_1_) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (p_70243_1_) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1))); + } + else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2))); + } + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind it. + */ + public boolean getIsCritical() + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + return (b0 & 1) != 0; + } + + private void explode() { + if(!worldObj.isRemote) { + + if(mode == 0) { + ExplosionLarge.explode(worldObj, posX, posY, posZ, 5, true, false, false); + } else if( mode == 1) { + ExplosionLarge.explodeFire(worldObj, posX, posY, posZ, 10, true, false, false); + } else if(mode == 2) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityNukeExplosionMK3 entity = new EntityNukeExplosionMK3(this.worldObj); + entity.posX = this.posX; + entity.posY = this.posY; + entity.posZ = this.posZ; + entity.destructionRange = 10; + entity.speed = 25; + entity.coefficient = 1.0F; + entity.waste = false; + + this.worldObj.spawnEntityInWorld(entity); + + EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(this.worldObj, 10); + cloud.posX = this.posX; + cloud.posY = this.posY; + cloud.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(cloud); + } else if(mode == 3) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityNukeExplosionMK3 entity = new EntityNukeExplosionMK3(this.worldObj); + entity.posX = this.posX; + entity.posY = this.posY; + entity.posZ = this.posZ; + entity.destructionRange = 20; + entity.speed = 25; + entity.coefficient = 1.0F; + entity.waste = false; + + this.worldObj.spawnEntityInWorld(entity); + + EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(this.worldObj, 20); + cloud.posX = this.posX; + cloud.posY = this.posY; + cloud.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(cloud); + } else if(mode == 4) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityVortex vortex = new EntityVortex(this.worldObj, 1F); + vortex.posX = this.posX; + vortex.posY = this.posY; + vortex.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(vortex); + } else if(mode == 5) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityVortex vortex = new EntityVortex(this.worldObj, 2.5F); + vortex.posX = this.posX; + vortex.posY = this.posY; + vortex.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(vortex); + } else if(mode == 6) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityRagingVortex vortex = new EntityRagingVortex(this.worldObj, 2.5F); + vortex.posX = this.posX; + vortex.posY = this.posY; + vortex.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(vortex); + } else if(mode == 7) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityRagingVortex vortex = new EntityRagingVortex(this.worldObj, 5F); + vortex.posX = this.posX; + vortex.posY = this.posY; + vortex.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(vortex); + } else if(mode == 8) { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + EntityBlackHole vortex = new EntityBlackHole(this.worldObj, 2F); + vortex.posX = this.posX; + vortex.posY = this.posY; + vortex.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(vortex); + } else { + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, + "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + + this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(worldObj, MainRegistry.gadgetRadius, posX, posY, posZ)); + this.worldObj.spawnEntityInWorld(EntityNukeCloudSmall.statFac(worldObj, posX, posY, posZ, MainRegistry.gadgetRadius)); + } + } + } +} diff --git a/com/hbm/explosion/ExplosionNukeGeneric.java b/com/hbm/explosion/ExplosionNukeGeneric.java index bc29cb716..23f5e16b5 100644 --- a/com/hbm/explosion/ExplosionNukeGeneric.java +++ b/com/hbm/explosion/ExplosionNukeGeneric.java @@ -170,9 +170,9 @@ public class ExplosionNukeGeneric { entity.attackEntityFrom(ModDamageSource.nuclearBlast, 10F); entity.setFire(5); double d8 = EnchantmentProtection.func_92092_a(entity, d11); - entity.motionX += d5 * d8; - entity.motionY += d6 * d8; - entity.motionZ += d7 * d8; + entity.motionX += d5 * d8 * 0.2D; + entity.motionY += d6 * d8 * 0.2D; + entity.motionZ += d7 * d8 * 0.2D; } } } diff --git a/com/hbm/explosion/ExplosionNukeRay.java b/com/hbm/explosion/ExplosionNukeRay.java index 843b7f148..5c93f0a64 100644 --- a/com/hbm/explosion/ExplosionNukeRay.java +++ b/com/hbm/explosion/ExplosionNukeRay.java @@ -103,11 +103,15 @@ public class ExplosionNukeRay { public void processTip(int count) { int processedBlocks = 0; + int braker = 0; for(int l = 0; l < Integer.MAX_VALUE; l++) { - + if(processedBlocks >= count) return; + + if(braker >= count * 50) + return; if(l > affectedBlocks.size() - 1) break; @@ -137,6 +141,8 @@ public class ExplosionNukeRay { world.setBlock(x0, y0, z0, Blocks.air); processedBlocks++; } + + braker++; } affectedBlocks.remove(in); diff --git a/com/hbm/explosion/NukeEnvironmentalEffect.java b/com/hbm/explosion/NukeEnvironmentalEffect.java new file mode 100644 index 000000000..34bc0d643 --- /dev/null +++ b/com/hbm/explosion/NukeEnvironmentalEffect.java @@ -0,0 +1,111 @@ +package com.hbm.explosion; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +public class NukeEnvironmentalEffect { + + static Random rand = new Random(); + + /** + * Area of effect radiation effect. j > 0 for jagged edges of the spherical area. Args: world, x, y, z, radius, outer radius with random chance. + */ + public static void applyStandardAOE(World world, int x, int y, int z, int r, int j) { + + 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 + rand.nextInt(j)) { + applyStandardEffect(world, X, Y, Z); + } + } + } + } + } + + public static void applyStandardEffect(World world, int x, int y, int z) { + int chance = 100; + Block b = null; + int meta = 0; + + Block in = world.getBlock(x, y, z); + int inMeta = world.getBlockMetadata(x, y, z); + + if(in == Blocks.air) + return; + + //Task done by fallout effect entity. + /*if(in == Blocks.grass) { + b = ModBlocks.waste_earth; + + } else */ + + if(in == Blocks.sand) { + + if(inMeta == 1) + b = ModBlocks.waste_trinitite_red; + else + b = ModBlocks.waste_trinitite; + + chance = 20; + + } else if(in == Blocks.mycelium) { + b = ModBlocks.waste_mycelium; + + } else if(in == Blocks.log || in == Blocks.log2) { + b = ModBlocks.waste_log; + + } else if(in == Blocks.planks) { + b = ModBlocks.waste_planks; + + } else if(in == Blocks.mossy_cobblestone) { + b = ModBlocks.ore_oil; + chance = 50; + + } else if(in == Blocks.coal_ore) { + b = Blocks.diamond_ore; + chance = 10; + } else if(in == ModBlocks.ore_uranium) { + b = ModBlocks.ore_schrabidium; + chance = 10; + + } else if(in == ModBlocks.ore_nether_uranium) { + b = ModBlocks.ore_nether_schrabidium; + chance = 10; + + } else if(in == ModBlocks.ore_nether_plutonium) { + b = ModBlocks.ore_nether_schrabidium; + chance = 25; + + } else if(in == Blocks.brown_mushroom_block && inMeta == 10) { + b = ModBlocks.waste_planks; + + } else if(in == Blocks.red_mushroom_block && inMeta == 10) { + b = ModBlocks.waste_planks; + + } else if(in == Blocks.end_stone) { + b = ModBlocks.ore_tikite; + chance = 1; + + } else if(in == Blocks.clay) { + b = Blocks.hardened_clay; + } + + if(b != null && rand.nextInt(1000) < chance) + world.setBlock(x, y, z, b, meta, 2); + } + +} diff --git a/com/hbm/inventory/gui/GUIMachineSelenium.java b/com/hbm/inventory/gui/GUIMachineSelenium.java index f379892bd..d722ad6b1 100644 --- a/com/hbm/inventory/gui/GUIMachineSelenium.java +++ b/com/hbm/inventory/gui/GUIMachineSelenium.java @@ -44,7 +44,7 @@ public class GUIMachineSelenium extends GuiInfoContainer { " Biofuel (200 HE/t)", " NITAN Superfuel (2500 HE/t)", "(These numbers are base values,", - "actual consumption is based", + "actual output is based", "on piston count)" }; this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); diff --git a/com/hbm/items/ModItems.java b/com/hbm/items/ModItems.java index 0428af94a..8371b7eb7 100644 --- a/com/hbm/items/ModItems.java +++ b/com/hbm/items/ModItems.java @@ -1903,7 +1903,7 @@ public class ModItems { gun_bolt_action_green = new GunBoltAction().setUnlocalizedName("gun_bolt_action_green").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_bolt_action_green"); gun_b92_ammo = new GunB92Cell().setUnlocalizedName("gun_b92_ammo").setMaxStackSize(1).setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b92_ammo_alt"); gun_b92 = new GunB92().setUnlocalizedName("gun_b92").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b92"); - gun_b93 = new GunB92().setUnlocalizedName("gun_b93").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b93"); + gun_b93 = new GunB93().setUnlocalizedName("gun_b93").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b93"); gun_xvl1456_ammo = new Item().setUnlocalizedName("gun_xvl1456_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_xvl1456_ammo"); gun_xvl1456 = new GunXVL1456().setUnlocalizedName("gun_xvl1456").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_xvl1456"); gun_osipr_ammo = new Item().setUnlocalizedName("gun_osipr_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_osipr_ammo"); diff --git a/com/hbm/items/weapon/GunB93.java b/com/hbm/items/weapon/GunB93.java new file mode 100644 index 000000000..36ba6293a --- /dev/null +++ b/com/hbm/items/weapon/GunB93.java @@ -0,0 +1,284 @@ +package com.hbm.items.weapon; + +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Multimap; +import com.hbm.entity.effect.EntityCloudFleijaRainbow; +import com.hbm.entity.logic.EntityNukeExplosionMK3; +import com.hbm.entity.projectile.EntityBullet; +import com.hbm.entity.projectile.EntityExplosiveBeam; +import com.hbm.entity.projectile.EntityModBeam; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import net.minecraftforge.event.entity.player.ArrowNockEvent; + +public class GunB93 extends Item { + + Random rand = new Random(); + + public int dmgMin = 16; + public int dmgMax = 28; + + public GunB93() { + + this.maxStackSize = 1; + } + + @Override + public void onPlayerStoppedUsing(ItemStack p_77615_1_, World p_77615_2_, EntityPlayer p_77615_3_, int p_77615_4_) { + if (!p_77615_3_.isSneaking()) { + int j = this.getMaxItemUseDuration(p_77615_1_) - p_77615_4_; + + ArrowLooseEvent event = new ArrowLooseEvent(p_77615_3_, p_77615_1_, j); + MinecraftForge.EVENT_BUS.post(event); + j = event.charge; + + boolean flag = true; + + if (flag) { + float f = j / 20.0F; + f = (f * f + f * 2.0F) / 3.0F; + + if (j < 10.0D) { + return; + } + + if (j > 10.0F) { + f = 10.0F; + } + + if (!p_77615_2_.isRemote) { + + EntityModBeam entityarrow1; + entityarrow1 = new EntityModBeam(p_77615_2_, p_77615_3_, 3.0F); + entityarrow1.mode = getPower(p_77615_1_) - 1; + p_77615_1_.damageItem(1, p_77615_3_); + + p_77615_2_.spawnEntityInWorld(entityarrow1); + + p_77615_2_.playSoundAtEntity(p_77615_3_, "hbm:weapon.sparkShoot", 5.0F, 1.0F); + } + + setAnim(p_77615_1_, 1); + setPower(p_77615_1_, 0); + } + } else { + } + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int i, boolean b) { + int j = getAnim(stack); + + if (j > 0) { + if (j < 30) + setAnim(stack, j + 1); + else + setAnim(stack, 0); + + if (j == 15) { + world.playSoundAtEntity(entity, "hbm:weapon.b92Reload", 2F, 0.9F); + setPower(stack, getPower(stack) + 1); + + if(getPower(stack) > 10) { + + setPower(stack, 0); + + if(!world.isRemote) { + world.playSoundEffect(entity.posX, entity.posY, entity.posZ, + "random.explode", 100.0f, world.rand.nextFloat() * 0.1F + 0.9F); + + EntityNukeExplosionMK3 exp = new EntityNukeExplosionMK3(world); + exp.posX = entity.posX; + exp.posY = entity.posY; + exp.posZ = entity.posZ; + exp.destructionRange = 50; + exp.speed = 25; + exp.coefficient = 1.0F; + exp.waste = false; + + world.spawnEntityInWorld(exp); + + EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(world, 50); + cloud.posX = entity.posX; + cloud.posY = entity.posY; + cloud.posZ = entity.posZ; + world.spawnEntityInWorld(cloud); + } + } + } + } + + } + + @Override + public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_) { + return p_77654_1_; + } + + /** + * How long it takes to use or consume an item + */ + @Override + public int getMaxItemUseDuration(ItemStack p_77626_1_) { + return 72000; + } + + /** + * returns the action that specifies what animation to play when the items + * is being used + */ + @Override + public EnumAction getItemUseAction(ItemStack p_77661_1_) { + return EnumAction.bow; + } + + /** + * Called whenever this item is equipped and the right mouse button is + * pressed. Args: itemStack, world, entityPlayer + */ + @Override + public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { + if (!p_77659_3_.isSneaking() && getPower(p_77659_1_) > 0) { + ArrowNockEvent event = new ArrowNockEvent(p_77659_3_, p_77659_1_); + MinecraftForge.EVENT_BUS.post(event); + + if (this.getAnim(p_77659_1_) == 0) + p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); + } else { + if (getAnim(p_77659_1_) == 0) { + setAnim(p_77659_1_, 1); + } + } + + return p_77659_1_; + } + + /** + * Return the enchantability factor of the item, most of the time is based + * on material. + */ + @Override + public int getItemEnchantability() { + return 1; + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + + list.add("[LEGENDARY WEAPON]"); + } + + @Override + public Multimap getItemAttributeModifiers() { + Multimap multimap = super.getItemAttributeModifiers(); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", 3.5, 0)); + return multimap; + } + + private static int getAnim(ItemStack stack) { + if (stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + return 0; + } + + return stack.stackTagCompound.getInteger("animation"); + + } + + private static void setAnim(ItemStack stack, int i) { + if (stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("animation", i); + + } + + private static int getPower(ItemStack stack) { + if (stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + return 0; + } + + return stack.stackTagCompound.getInteger("energy"); + + } + + private static void setPower(ItemStack stack, int i) { + if (stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("energy", i); + + } + + public static float getRotationFromAnim(ItemStack stack) { + float rad = 0.0174533F; + rad *= 7.5F; + int i = getAnim(stack); + + if (i < 10) + return 0; + i -= 10; + + if (i < 6) + return rad * i; + if (i > 14) + return rad * (5 - (i - 15)); + return rad * 5; + } + + public static float getOffsetFromAnim(ItemStack stack) { + float i = getAnim(stack); + + if (i < 10) + return 0; + i -= 10; + + if (i < 10) + return i / 10; + else + return 2 - (i / 10); + } + + public static float getTransFromAnim(ItemStack stack) { + float i = getAnim(stack); + + if (i < 10) + return 0; + i -= 10; + + if (i > 4 && i < 10) + return (i - 5) * 0.05F; + + if (i > 9 && i < 15) + return (10 * 0.05F) - ((i - 5) * 0.05F); + + return 0; + } + + @Override + public EnumRarity getRarity(ItemStack p_77613_1_) { + + return EnumRarity.uncommon; + } +} diff --git a/com/hbm/lib/ModDamageSource.java b/com/hbm/lib/ModDamageSource.java index 1e01d3b98..0f85a72ad 100644 --- a/com/hbm/lib/ModDamageSource.java +++ b/com/hbm/lib/ModDamageSource.java @@ -36,6 +36,7 @@ public class ModDamageSource extends DamageSource { public static DamageSource ams = (new DamageSource("ams")).setDamageIsAbsolute().setDamageBypassesArmor(); public static DamageSource amsCore = (new DamageSource("amsCore")).setDamageIsAbsolute().setDamageBypassesArmor(); public static DamageSource broadcast = (new DamageSource("broadcast")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static DamageSource bang = (new DamageSource("bang")).setDamageIsAbsolute().setDamageBypassesArmor(); public ModDamageSource(String p_i1566_1_) { super(p_i1566_1_); diff --git a/com/hbm/main/ClientProxy.java b/com/hbm/main/ClientProxy.java index c88fddf3e..069205f72 100644 --- a/com/hbm/main/ClientProxy.java +++ b/com/hbm/main/ClientProxy.java @@ -231,6 +231,7 @@ public class ClientProxy extends ServerProxy RenderingRegistry.registerEntityRenderingHandler(EntityMinerBeam.class, new RenderBeam3()); RenderingRegistry.registerEntityRenderingHandler(EntitySparkBeam.class, new RenderBeam4()); RenderingRegistry.registerEntityRenderingHandler(EntityExplosiveBeam.class, new RenderBeam5()); + RenderingRegistry.registerEntityRenderingHandler(EntityModBeam.class, new RenderBeam6()); RenderingRegistry.registerEntityRenderingHandler(EntityLN2.class, new RenderLN2(ModItems.energy_ball)); RenderingRegistry.registerEntityRenderingHandler(EntityLaser.class, new RenderLaser()); @@ -314,9 +315,9 @@ public class ClientProxy extends ServerProxy RenderingRegistry.registerEntityRenderingHandler(EntityShrapnel.class, new RenderShrapnel()); RenderingRegistry.registerEntityRenderingHandler(EntityOilSpill.class, new RenderEmpty()); - RenderingRegistry.registerEntityRenderingHandler(EntitySmokeFX.class, new ModEffectRenderer(ModItems.nuclear_waste)); - RenderingRegistry.registerEntityRenderingHandler(EntityBSmokeFX.class, new BSmokeRenderer(ModItems.nuclear_waste)); - RenderingRegistry.registerEntityRenderingHandler(EntityDSmokeFX.class, new DSmokeRenderer(ModItems.nuclear_waste)); + RenderingRegistry.registerEntityRenderingHandler(EntitySmokeFX.class, new MultiCloudRenderer(new Item[] { ModItems.smoke1, ModItems.smoke2, ModItems.smoke3, ModItems.smoke4, ModItems.smoke5, ModItems.smoke6, ModItems.smoke7, ModItems.smoke8 })); + RenderingRegistry.registerEntityRenderingHandler(EntityBSmokeFX.class, new MultiCloudRenderer(new Item[] { ModItems.b_smoke1, ModItems.b_smoke2, ModItems.b_smoke3, ModItems.b_smoke4, ModItems.b_smoke5, ModItems.b_smoke6, ModItems.b_smoke7, ModItems.b_smoke8 })); + RenderingRegistry.registerEntityRenderingHandler(EntityDSmokeFX.class, new MultiCloudRenderer(new Item[] { ModItems.d_smoke1, ModItems.d_smoke2, ModItems.d_smoke3, ModItems.d_smoke4, ModItems.d_smoke5, ModItems.d_smoke6, ModItems.d_smoke7, ModItems.d_smoke8 })); RenderingRegistry.registerEntityRenderingHandler(EntitySSmokeFX.class, new SSmokeRenderer(ModItems.nuclear_waste)); RenderingRegistry.registerEntityRenderingHandler(EntityOilSpillFX.class, new SpillRenderer(ModItems.nuclear_waste)); RenderingRegistry.registerEntityRenderingHandler(EntityGasFX.class, new GasRenderer(ModItems.nuclear_waste)); diff --git a/com/hbm/main/CraftingManager.java b/com/hbm/main/CraftingManager.java index 3d4f896b9..15b89cb56 100644 --- a/com/hbm/main/CraftingManager.java +++ b/com/hbm/main/CraftingManager.java @@ -927,8 +927,8 @@ public class CraftingManager { GameRegistry.addRecipe(new ShapedOreRecipe(ItemBattery.getFullBattery(ModItems.battery_su_l), new Object[] { " W ", "RPR", "CPC", 'W', ModItems.wire_copper, 'P', Items.paper, 'R', "dustRedstone", 'C', "dustCoal" })); GameRegistry.addShapelessRecipe(ItemBattery.getFullBattery(ModItems.battery_potato), new Object[] { Items.potato, ModItems.wire_aluminium, ModItems.wire_copper }); GameRegistry.addRecipe(new ShapelessOreRecipe(ItemBattery.getFullBattery(ModItems.battery_potatos), new Object[] { ItemBattery.getFullBattery(ModItems.battery_potato), ModItems.turret_chip, "dustRedstone" })); - GameRegistry.addRecipe(new ShapedOreRecipe(ItemBattery.getFullBattery(ModItems.battery_steam), new Object[] { "PMP", "ISI", "PCP", 'P', "plateCopper", 'M', ModItems.motor, 'C', ModItems.coil_tungsten, 'S', new ItemStack(ModItems.fluid_tank_full, 1, FluidType.WATER.getID()), 'I', ModItems.plate_polymer })); - GameRegistry.addRecipe(new ShapedOreRecipe(ItemBattery.getFullBattery(ModItems.battery_steam_large), new Object[] { "MPM", "ISI", "CPC", 'P', ModItems.board_copper, 'M', ModItems.motor, 'C', ModItems.coil_tungsten, 'S', new ItemStack(ModItems.fluid_barrel_full, 1, FluidType.WATER.getID()), 'I', "ingotPolymer" })); + GameRegistry.addRecipe(new ShapedOreRecipe(ItemBattery.getEmptyBattery(ModItems.battery_steam), new Object[] { "PMP", "ISI", "PCP", 'P', "plateCopper", 'M', ModItems.motor, 'C', ModItems.coil_tungsten, 'S', new ItemStack(ModItems.fluid_tank_full, 1, FluidType.WATER.getID()), 'I', ModItems.plate_polymer })); + GameRegistry.addRecipe(new ShapedOreRecipe(ItemBattery.getEmptyBattery(ModItems.battery_steam_large), new Object[] { "MPM", "ISI", "CPC", 'P', ModItems.board_copper, 'M', ModItems.motor, 'C', ModItems.coil_tungsten, 'S', new ItemStack(ModItems.fluid_barrel_full, 1, FluidType.WATER.getID()), 'I', "ingotPolymer" })); GameRegistry.addRecipe(new ItemStack(ModItems.schrabidium_helmet, 1), new Object[] { "EEE", "E E", 'E', ModItems.ingot_schrabidium }); GameRegistry.addRecipe(new ItemStack(ModItems.schrabidium_plate, 1), new Object[] { "E E", "EEE", "EEE", 'E', ModItems.ingot_schrabidium }); diff --git a/com/hbm/main/MainRegistry.java b/com/hbm/main/MainRegistry.java index 32139aef6..043946bc9 100644 --- a/com/hbm/main/MainRegistry.java +++ b/com/hbm/main/MainRegistry.java @@ -147,6 +147,7 @@ import com.hbm.entity.projectile.EntityMeteor; import com.hbm.entity.projectile.EntityMinerBeam; import com.hbm.entity.projectile.EntityMiniMIRV; import com.hbm.entity.projectile.EntityMiniNuke; +import com.hbm.entity.projectile.EntityModBeam; import com.hbm.entity.projectile.EntityNightmareBlast; import com.hbm.entity.projectile.EntityOilSpill; import com.hbm.entity.projectile.EntityPlasmaBeam; @@ -743,6 +744,7 @@ public class MainRegistry EntityRegistry.registerModEntity(EntityRagingVortex.class, "entity_raging_vortex", 96, this, 250, 1, true); EntityRegistry.registerModEntity(EntityCarrier.class, "entity_missile_carrier", 97, this, 1000, 1, true); EntityRegistry.registerModEntity(EntityBooster.class, "entity_missile_booster", 98, this, 1000, 1, true); + EntityRegistry.registerModEntity(EntityModBeam.class, "entity_beam_bang", 99, this, 1000, 1, true); EntityRegistry.registerGlobalEntityID(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", EntityRegistry.findGlobalUniqueEntityId(), 0x204131, 0x75CE00); EntityRegistry.registerGlobalEntityID(EntityHunterChopper.class, "entity_mob_hunter_chopper", EntityRegistry.findGlobalUniqueEntityId(), 0x000020, 0x2D2D72); @@ -1299,7 +1301,7 @@ public class MainRegistry enableMeteorStrikes = config.get(Configuration.CATEGORY_GENERAL, "1.09_enableMeteorStrikes", true).getBoolean(true); enableMeteorShowers = config.get(Configuration.CATEGORY_GENERAL, "1.10_enableMeteorShowers", true).getBoolean(true); enableMeteorTails = config.get(Configuration.CATEGORY_GENERAL, "1.11_enableMeteorTails", true).getBoolean(true); - enableSpecialMeteors = config.get(Configuration.CATEGORY_GENERAL, "1.12_enableSpecialMeteors", true).getBoolean(true); + enableSpecialMeteors = config.get(Configuration.CATEGORY_GENERAL, "1.12_enableSpecialMeteors", false).getBoolean(false); Property PuraniumSpawn = config.get(Configuration.CATEGORY_GENERAL, "2.00_uraniumSpawnrate", 7); PuraniumSpawn.comment = "Ammount of uranium ore veins per chunk"; diff --git a/com/hbm/main/ResourceManager.java b/com/hbm/main/ResourceManager.java index a4b98a339..97ab999ae 100644 --- a/com/hbm/main/ResourceManager.java +++ b/com/hbm/main/ResourceManager.java @@ -127,6 +127,11 @@ public class ResourceManager { public static final ResourceLocation turbofan_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turbofan_body.png"); public static final ResourceLocation turbofan_blades_tex = new ResourceLocation(RefStrings.MODID, "textures/models/turbofan_blades.png"); + //Selenium Engine + public static final ResourceLocation selenium_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/selenium_engine_body.png"); + public static final ResourceLocation selenium_piston_tex = new ResourceLocation(RefStrings.MODID, "textures/models/selenium_engine_piston.png"); + public static final ResourceLocation selenium_rotor_tex = new ResourceLocation(RefStrings.MODID, "textures/models/selenium_engine_rotor.png"); + //Press public static final ResourceLocation press_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/press_body.png"); public static final ResourceLocation press_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/press_head.png"); diff --git a/com/hbm/potion/PotionEffectBang.java b/com/hbm/potion/PotionEffectBang.java new file mode 100644 index 000000000..c9bf8a15c --- /dev/null +++ b/com/hbm/potion/PotionEffectBang.java @@ -0,0 +1,56 @@ +package com.hbm.potion; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.bomb.BlockTaint; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.lib.Library; +import com.hbm.lib.ModDamageSource; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ResourceLocation; + +public class PotionEffectBang extends Potion { + + public static PotionEffectBang instance = new PotionEffectBang(Library.getFirstNullIndex(1, Potion.potionTypes), true, 1118481); + Random rand = new Random(); + + public PotionEffectBang(int p_i1573_1_, boolean p_i1573_2_, int p_i1573_3_) { + super(p_i1573_1_, p_i1573_2_, p_i1573_3_); + this.setPotionName("potion.hbm_bang"); + this.setIconIndex(3, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public int getStatusIconIndex() { + ResourceLocation loc = new ResourceLocation("hbm","textures/gui/potions.png"); + Minecraft.getMinecraft().renderEngine.bindTexture(loc); + return super.getStatusIconIndex(); + } + + + public void performEffect(EntityLivingBase entity, int level) + { + entity.attackEntityFrom(ModDamageSource.bang, 1000); + entity.setHealth(0.0F); + entity.setDead(); + + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "hbm:weapon.laserBang", 100.0F, 1.0F); + //entity.worldObj.spawnParticle("hugeexplosion", entity.posX, entity.posY, entity.posZ, 0, 0, 0); + ExplosionLarge.spawnParticles(entity.worldObj, entity.posX, entity.posY, entity.posZ, 10); + } + + public boolean isReady(int par1, int par2) + { + return par1 <= 10; + } + +} diff --git a/com/hbm/render/entity/MultiCloudRenderer.java b/com/hbm/render/entity/MultiCloudRenderer.java new file mode 100644 index 000000000..b95e95e60 --- /dev/null +++ b/com/hbm/render/entity/MultiCloudRenderer.java @@ -0,0 +1,145 @@ +package com.hbm.render.entity; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.entity.particle.EntityBSmokeFX; +import com.hbm.entity.particle.EntityModFX; +import com.hbm.items.ModItems; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; + +public class MultiCloudRenderer extends Render { + private Item[] field_94151_a; + private int field_94150_f; + private static final String __OBFID = "CL_00001008"; + + public MultiCloudRenderer(Item[] p_i1259_1_, int p_i1259_2_) { + this.field_94151_a = p_i1259_1_; + this.field_94150_f = p_i1259_2_; + } + + public MultiCloudRenderer(Item[] p_i1260_1_) { + this(p_i1260_1_, 0); + } + + /** + * Actually renders the given argument. This is a synthetic bridge method, + * always casting down its argument and then handing it off to a worker + * function which does the actual work. In all probabilty, the class Render + * is generic (Render= fx.maxAge / 8 * 7) { + item = field_94151_a[7]; + } + + if (fx.particleAge < fx.maxAge / 8 * 7 && fx.particleAge >= fx.maxAge / 8 * 6) { + item = field_94151_a[6]; + } + + if (fx.particleAge < fx.maxAge / 8 * 6 && fx.particleAge >= fx.maxAge / 8 * 5) { + item = field_94151_a[5]; + } + + if (fx.particleAge < fx.maxAge / 8 * 5 && fx.particleAge >= fx.maxAge / 8 * 4) { + item = field_94151_a[4]; + } + + if (fx.particleAge < fx.maxAge / 8 * 4 && fx.particleAge >= fx.maxAge / 8 * 3) { + item = field_94151_a[3]; + } + + if (fx.particleAge < fx.maxAge / 8 * 3 && fx.particleAge >= fx.maxAge / 8 * 2) { + item = field_94151_a[2]; + } + + if (fx.particleAge < fx.maxAge / 8 * 2 && fx.particleAge >= fx.maxAge / 8 * 1) { + item = field_94151_a[1]; + } + + if (fx.particleAge < fx.maxAge / 8 && fx.particleAge >= 0) { + item = field_94151_a[0]; + } + + IIcon iicon = item.getIconFromDamage(field_94150_f); + + if (iicon != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(0.5F, 0.5F, 0.5F); + GL11.glScalef(7.5F, 7.5F, 7.5F); + + Random rand = new Random(100); + + for(int i = 0; i < 5; i++) { + + double dX = (rand.nextGaussian() - 1D) * 0.15D; + double dY = (rand.nextGaussian() - 1D) * 0.15D; + double dZ = (rand.nextGaussian() - 1D) * 0.15D; + double size = rand.nextDouble() * 0.5D + 0.25D; + + GL11.glTranslatef((float) dX, (float) dY, (float) dZ); + GL11.glScaled(size, size, size); + + GL11.glPushMatrix(); + this.bindEntityTexture(p_76986_1_); + Tessellator tessellator = Tessellator.instance; + this.func_77026_a(tessellator, iicon); + GL11.glPopMatrix(); + + GL11.glScaled(1/size, 1/size, 1/size); + GL11.glTranslatef((float) -dX, (float) -dY, (float) -dZ); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + } + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called + * unless you call Render.bindEntityTexture. + */ + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return TextureMap.locationItemsTexture; + } + + private void func_77026_a(Tessellator p_77026_1_, IIcon p_77026_2_) { + float f = p_77026_2_.getMinU(); + float f1 = p_77026_2_.getMaxU(); + float f2 = p_77026_2_.getMinV(); + float f3 = p_77026_2_.getMaxV(); + float f4 = 1.0F; + float f5 = 0.5F; + float f6 = 0.25F; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + p_77026_1_.startDrawingQuads(); + p_77026_1_.setNormal(0.0F, 1.0F, 0.0F); + p_77026_1_.addVertexWithUV(0.0F - f5, 0.0F - f6, 0.0D, f, f3); + p_77026_1_.addVertexWithUV(f4 - f5, 0.0F - f6, 0.0D, f1, f3); + p_77026_1_.addVertexWithUV(f4 - f5, f4 - f6, 0.0D, f1, f2); + p_77026_1_.addVertexWithUV(0.0F - f5, f4 - f6, 0.0D, f, f2); + p_77026_1_.draw(); + } +} diff --git a/com/hbm/render/entity/RenderBeam6.java b/com/hbm/render/entity/RenderBeam6.java new file mode 100644 index 000000000..0994c124a --- /dev/null +++ b/com/hbm/render/entity/RenderBeam6.java @@ -0,0 +1,82 @@ +package com.hbm.render.entity; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderBeam6 extends Render { + + Random rand = new Random(); + + @Override + public void doRender(Entity rocket, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + //float radius = 0.12F; + //float radius = 0.06F; + float radius = 0.175F; + int distance = 2; + Tessellator tessellator = Tessellator.instance; + + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glTranslatef((float) x, (float) y, (float) z); + + GL11.glRotatef(rocket.rotationYaw, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-rocket.rotationPitch, 1.0F, 0.0F, 0.0F); + + boolean red = System.currentTimeMillis() % 250 < 124; + boolean green = false; + boolean blue = !red; + + for (float o = 0; o <= radius; o += radius / 8) { + float color = 1f - (o * 8.333f); + if (color < 0) + color = 0; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(red ? 1 : color, green ? 1 : color, blue ? 1 : color, 1f); + tessellator.addVertex(0 + o, 0 - o, 0); + tessellator.addVertex(0 + o, 0 + o, 0); + tessellator.addVertex(0 + o, 0 + o, 0 + distance); + tessellator.addVertex(0 + o, 0 - o, 0 + distance); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(red ? 1 : color, green ? 1 : color, blue ? 1 : color, 1f); + tessellator.addVertex(0 - o, 0 - o, 0); + tessellator.addVertex(0 + o, 0 - o, 0); + tessellator.addVertex(0 + o, 0 - o, 0 + distance); + tessellator.addVertex(0 - o, 0 - o, 0 + distance); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(red ? 1 : color, green ? 1 : color, blue ? 1 : color, 1f); + tessellator.addVertex(0 - o, 0 + o, 0); + tessellator.addVertex(0 - o, 0 - o, 0); + tessellator.addVertex(0 - o, 0 - o, 0 + distance); + tessellator.addVertex(0 - o, 0 + o, 0 + distance); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(red ? 1 : color, green ? 1 : color, blue ? 1 : color, 1f); + tessellator.addVertex(0 + o, 0 + o, 0); + tessellator.addVertex(0 - o, 0 + o, 0); + tessellator.addVertex(0 - o, 0 + o, 0 + distance); + tessellator.addVertex(0 + o, 0 + o, 0 + distance); + tessellator.draw(); + } + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return new ResourceLocation(RefStrings.MODID + ":textures/models/PlasmaBeam.png"); + } +} diff --git a/com/hbm/render/tileentity/RenderSelenium.java b/com/hbm/render/tileentity/RenderSelenium.java index 3c3a0eb6c..fbce8da1a 100644 --- a/com/hbm/render/tileentity/RenderSelenium.java +++ b/com/hbm/render/tileentity/RenderSelenium.java @@ -33,7 +33,7 @@ public class RenderSelenium extends TileEntitySpecialRenderer { GL11.glRotatef(0, 0F, 1F, 0F); break; } - bindTexture(ResourceManager.universal); + bindTexture(ResourceManager.selenium_body_tex); ResourceManager.selenium_body.renderAll(); GL11.glTranslated(0.0D, 1.0D, 0.0D); @@ -41,14 +41,17 @@ public class RenderSelenium extends TileEntitySpecialRenderer { int count = ((TileEntityMachineSeleniumEngine)tileEntity).pistonCount; float rot = 360F / count; - + + bindTexture(ResourceManager.selenium_piston_tex); for(int i = 0; i < count; i++) { ResourceManager.selenium_piston.renderAll(); GL11.glRotatef(rot, 0, 0, 1); } - GL11.glRotatef((System.currentTimeMillis() / 10) % 360, 0F, 0F, -1F); - + if(count > 2 && ((TileEntityMachineSeleniumEngine)tileEntity).hasAcceptableFuel() && ((TileEntityMachineSeleniumEngine)tileEntity).tank.getFill() > 0) + GL11.glRotatef((System.currentTimeMillis() / 2) % 360, 0F, 0F, -1F); + + bindTexture(ResourceManager.selenium_rotor_tex); ResourceManager.selenium_rotor.renderAll(); GL11.glPopMatrix(); diff --git a/com/hbm/tileentity/machine/TileEntityAMSBase.java b/com/hbm/tileentity/machine/TileEntityAMSBase.java index 12dabf501..506c54e66 100644 --- a/com/hbm/tileentity/machine/TileEntityAMSBase.java +++ b/com/hbm/tileentity/machine/TileEntityAMSBase.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.entity.effect.EntityCloudFleijaRainbow; +import com.hbm.entity.logic.EntityNukeExplosionMK4; import com.hbm.entity.particle.EntityGasFlameFX; import com.hbm.explosion.ExplosionLarge; import com.hbm.handler.FluidTypeHandler.FluidType; @@ -69,8 +71,8 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS public TileEntityAMSBase() { slots = new ItemStack[16]; tanks = new FluidTank[4]; - tanks[0] = new FluidTank(FluidType.WATER, 8000, 0); - tanks[1] = new FluidTank(FluidType.COOLANT, 8000, 1); + tanks[0] = new FluidTank(FluidType.COOLANT, 8000, 0); + tanks[1] = new FluidTank(FluidType.CRYOGEL, 8000, 1); tanks[2] = new FluidTank(FluidType.DEUTERIUM, 8000, 2); tanks[3] = new FluidTank(FluidType.TRITIUM, 8000, 3); } @@ -243,6 +245,9 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS if (!worldObj.isRemote) { + for(int i = 0; i < tanks.length; i++) + tanks[i].setFill(tanks[i].getMaxFill()); + if(!locked) { age++; @@ -323,7 +328,7 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS if(slots[8] != null && slots[9] != null && slots[10] != null && slots[11] != null && slots[12] != null && slots[8].getItem() instanceof ItemCatalyst && slots[9].getItem() instanceof ItemCatalyst && slots[10].getItem() instanceof ItemCatalyst && slots[11].getItem() instanceof ItemCatalyst && - slots[12].getItem() instanceof ItemAMSCore && hasResonators()) { + slots[12].getItem() instanceof ItemAMSCore && hasResonators() && efficiency > 0) { int a = ((ItemCatalyst)slots[8].getItem()).getColor(); int b = ((ItemCatalyst)slots[9].getItem()).getColor(); int c = ((ItemCatalyst)slots[10].getItem()).getColor(); @@ -356,7 +361,7 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS if(this.getFuelPower(tanks[2].getTankType()) > 0 && this.getFuelPower(tanks[3].getTankType()) > 0 && tanks[2].getFill() > 0 && tanks[3].getFill() > 0) { - power += (powerBase * powerMod * gauss(1, (heat - (maxHeat / 2)) / maxHeat)); + power += (powerBase * powerMod * gauss(1, (heat - (maxHeat / 2)) / maxHeat)) / 1000 * getFuelPower(tanks[2].getTankType()) * getFuelPower(tanks[3].getTankType()); heat += (heatBase * heatMod) / (float)(this.field / 100F); tanks[2].setFill((int)(tanks[2].getFill() - fuelBase * fuelMod)); tanks[3].setFill((int)(tanks[3].getFill() - fuelBase * fuelMod)); @@ -372,7 +377,7 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS heat = maxHeat; } - if(field < 2) + if(field <= 0) explode(); } } @@ -437,7 +442,21 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS } private void explode() { - + if(!worldObj.isRemote) { + + for(int i = 0; i < 10; i++) { + + EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(this.worldObj, 100); + cloud.posX = xCoord + rand.nextInt(201) - 100; + cloud.posY = yCoord + rand.nextInt(201) - 100; + cloud.posZ = zCoord + rand.nextInt(201) - 100; + this.worldObj.spawnEntityInWorld(cloud); + } + + int radius = (int)(100 + (double)(tanks[2].getFill() + tanks[3].getFill()) / 16000D * 150); + + worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFacExperimental(worldObj, 10, xCoord, yCoord, zCoord)); + } } private int getCoolingStrength(FluidType type) { @@ -458,9 +477,9 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS private int getFuelPower(FluidType type) { switch(type) { case DEUTERIUM: - return 50000; + return 50; case TRITIUM: - return 75000; + return 75; default: return 0; } @@ -538,7 +557,7 @@ public class TileEntityAMSBase extends TileEntity implements ISidedInventory, IS } - return false; + return true; } @Override diff --git a/com/hbm/tileentity/machine/TileEntityAMSEmitter.java b/com/hbm/tileentity/machine/TileEntityAMSEmitter.java index 0c66dcd25..a111636c8 100644 --- a/com/hbm/tileentity/machine/TileEntityAMSEmitter.java +++ b/com/hbm/tileentity/machine/TileEntityAMSEmitter.java @@ -328,6 +328,9 @@ public class TileEntityAMSEmitter extends TileEntity implements ISidedInventory, warning = 3; } + tank.setTankType(FluidType.CRYOGEL); + tank.setFill(tank.getMaxFill()); + PacketDispatcher.wrapper.sendToAll(new AuxElectricityPacket(xCoord, yCoord, zCoord, power)); PacketDispatcher.wrapper.sendToAll(new AuxGaugePacket(xCoord, yCoord, zCoord, locked ? 1 : 0, 0)); PacketDispatcher.wrapper.sendToAll(new AuxGaugePacket(xCoord, yCoord, zCoord, efficiency, 1)); diff --git a/com/hbm/tileentity/machine/TileEntityAMSLimiter.java b/com/hbm/tileentity/machine/TileEntityAMSLimiter.java index d7179850f..912d78add 100644 --- a/com/hbm/tileentity/machine/TileEntityAMSLimiter.java +++ b/com/hbm/tileentity/machine/TileEntityAMSLimiter.java @@ -345,6 +345,9 @@ public class TileEntityAMSLimiter extends TileEntity implements ISidedInventory, power = 0; warning = 3; } + + tank.setTankType(FluidType.CRYOGEL); + tank.setFill(tank.getMaxFill()); PacketDispatcher.wrapper.sendToAll(new AuxElectricityPacket(xCoord, yCoord, zCoord, power)); PacketDispatcher.wrapper.sendToAll(new AuxGaugePacket(xCoord, yCoord, zCoord, locked ? 1 : 0, 0));