From f4e43ce829fa82ff91096fdebf867364e1ba52a6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 23 Feb 2026 12:14:32 +0100 Subject: [PATCH] dornan can now bitch slap you --- changelog | 1 + .../java/com/hbm/items/armor/ArmorRPA.java | 11 +- .../com/hbm/items/armor/ArmorRPAMelee.java | 128 ++++++++++++++++++ .../machine/TileEntityPWRController.java | 2 +- .../hbm/textures/armor/gold_layer_1.png | Bin 1161 -> 0 bytes .../hbm/textures/armor/gold_layer_2.png | Bin 671 -> 0 bytes .../hbm/textures/armor/iron_layer_1.png | Bin 1096 -> 0 bytes .../hbm/textures/armor/iron_layer_2.png | Bin 649 -> 0 bytes .../assets/hbm/textures/armor/rpa_arm.png | Bin 968 -> 1046 bytes 9 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/items/armor/ArmorRPAMelee.java delete mode 100644 src/main/resources/assets/hbm/textures/armor/gold_layer_1.png delete mode 100644 src/main/resources/assets/hbm/textures/armor/gold_layer_2.png delete mode 100644 src/main/resources/assets/hbm/textures/armor/iron_layer_1.png delete mode 100644 src/main/resources/assets/hbm/textures/armor/iron_layer_2.png diff --git a/changelog b/changelog index d3dc84d3d..786bd11d7 100644 --- a/changelog +++ b/changelog @@ -34,6 +34,7 @@ * Due to repeated complaints, power armor sounds are now generally more quiet, with 25% volume for steps and 50% volume for jumping and landing * Reduced mask man's projectile resistance from 75% to 50% * Reduced maskman's resistance to damage above 50 from 75% to 50% +* Remnants power armor can now use the melee controller, allowing Sergeant Arch Dornan to beat the snot out of people # Fixed * Fixed proxy tiles that do not use electricity at all visually connecting to cables diff --git a/src/main/java/com/hbm/items/armor/ArmorRPA.java b/src/main/java/com/hbm/items/armor/ArmorRPA.java index 718f62f2d..0a5c4eeab 100644 --- a/src/main/java/com/hbm/items/armor/ArmorRPA.java +++ b/src/main/java/com/hbm/items/armor/ArmorRPA.java @@ -11,11 +11,12 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.client.IItemRenderer; -public class ArmorRPA extends ArmorFSBPowered implements IItemRendererProvider { +public class ArmorRPA extends ArmorFSBPowered implements IItemRendererProvider, IPAWeaponsProvider { public ArmorRPA(ArmorMaterial material, int slot, String texture, long maxPower, long chargeRate, long consumption, long drain) { super(material, slot, texture, maxPower, chargeRate, consumption, drain); @@ -52,4 +53,12 @@ public class ArmorRPA extends ArmorFSBPowered implements IItemRendererProvider { "Head", "Body,Fan,Glow", "LeftArm", "RightArm", "LeftLeg", "RightLeg", "LeftBoot", "RightBoot"); }}; } + + public static final ArmorRPAMelee meleeComponent = new ArmorRPAMelee(); + + @Override + public IPAMelee getMeleeComponent(EntityPlayer entity) { + if(this.hasFSBArmorIgnoreCharge(entity)) return meleeComponent; + return null; + } } diff --git a/src/main/java/com/hbm/items/armor/ArmorRPAMelee.java b/src/main/java/com/hbm/items/armor/ArmorRPAMelee.java new file mode 100644 index 000000000..c047cdf43 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ArmorRPAMelee.java @@ -0,0 +1,128 @@ +package com.hbm.items.armor; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; +import com.hbm.items.weapon.sedna.factory.ConfettiUtil; +import com.hbm.items.weapon.sedna.factory.XFactoryPA; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.BusAnimation; +import com.hbm.render.anim.BusAnimationSequence; +import com.hbm.render.anim.HbmAnimations; +import com.hbm.render.anim.AnimationEnums.GunAnimation; +import com.hbm.render.anim.BusAnimationKeyframe.IType; +import com.hbm.util.EntityDamageUtil; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; + +public class ArmorRPAMelee implements IPAMelee { + + @Override public void clickPrimary(ItemStack stack, LambdaContext ctx) { XFactoryPA.doSwing(stack, ctx, GunAnimation.CYCLE, 14); } + @Override public void clickSecondary(ItemStack stack, LambdaContext ctx) { XFactoryPA.doSwing(stack, ctx, GunAnimation.ALT_CYCLE, 20); } + + @Override + public void orchestra(ItemStack stack, LambdaContext ctx) { + EntityLivingBase entity = ctx.entity; + if(entity.worldObj.isRemote) return; + GunAnimation type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); + int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + + boolean swings = type == GunAnimation.CYCLE && (timer == 3 || timer == 9); + boolean slap = type == GunAnimation.ALT_CYCLE && timer == 3; + + if((swings || slap) && ctx.getPlayer() != null) { + MovingObjectPosition mop = EntityDamageUtil.getMouseOver(ctx.getPlayer(), 3.0D); + + if(mop != null) { + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + float damage = swings ? 15F : 35F; + float knockback = swings ? 0F : 1.5F; + float dt = swings ? 5F : 15F; + float pierce = swings ? 0.1F : 0.25F; + + if(mop.entityHit instanceof EntityLivingBase) { + EntityLivingBase living = (EntityLivingBase) mop.entityHit; + if(living.getMaxHealth() >= 100) damage *= 2.5; + EntityDamageUtil.attackEntityFromNT((EntityLivingBase) mop.entityHit, DamageSource.causePlayerDamage(ctx.getPlayer()), damage, true, false, knockback, dt, pierce); + if(living.getRNG().nextInt(slap ? 3 : 10) == 0 && !living.isEntityAlive()) ConfettiUtil.gib(living); + } else { + mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage(ctx.getPlayer()), damage); + } + + entity.worldObj.playSoundAtEntity(mop.entityHit, "hbm:weapon.fire.smack", 1F, 0.9F + entity.getRNG().nextFloat() * 0.2F); + } + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + Block b = entity.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); + entity.worldObj.playSoundEffect(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, b.stepSound.getStepResourcePath(), 2F, 0.9F + entity.getRNG().nextFloat() * 0.2F); + } + } + } + } + + @Override + public BusAnimation playAnim(ItemStack stack, GunAnimation type) { + if(type == GunAnimation.EQUIP) return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().setPos(-1, 0, 0).addPos(0, 0, 0, 250, IType.SIN_DOWN)); + if(type == GunAnimation.CYCLE) return new BusAnimation() + .addBus("SWINGRIGHT", new BusAnimationSequence().addPos(1, 0, 0, 150, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SWINGLEFT", new BusAnimationSequence().addPos(0, 0, 0, 300).addPos(1, 0, 0, 150, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL)); + if(type == GunAnimation.ALT_CYCLE) return new BusAnimation() + .addBus("SLAPTURN", new BusAnimationSequence().addPos(1, 0, 0, 250, IType.LINEAR).hold(150).addPos(0, 0, 0, 350, IType.LINEAR)) + .addBus("SLAP", new BusAnimationSequence().hold(250).addPos(1, 0, 0, 150, IType.SIN_DOWN).addPos(0, 0, 0, 350, IType.SIN_FULL)); + + return null; + } + + @Override public void setupFirstPerson(ItemStack stack) { } + + @Override + public void renderFirstPerson(ItemStack stack) { + Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.rpa_arm); + + GL11.glTranslated(0, -1.5, 0.5); + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double swingRight = HbmAnimations.getRelevantTransformation("SWINGRIGHT")[0]; + double swingLeft = HbmAnimations.getRelevantTransformation("SWINGLEFT")[0]; + double slapTurn = HbmAnimations.getRelevantTransformation("SLAPTURN")[0]; + double slap = HbmAnimations.getRelevantTransformation("SLAP")[0]; + + double forwardTilt = 60 - 60 * equip[0]; + double offsetOutward = 3; + double roll = 60; + + GL11.glPushMatrix(); + + GL11.glTranslated(-12 * swingLeft + 2 * slapTurn - 5 * slap, 6 * slap, 5 * swingLeft + 8 * slap); + GL11.glRotated(forwardTilt - swingRight * 20, 1, 0, 0); + + GL11.glTranslated(offsetOutward, 0, 0); + GL11.glTranslated(6, 8, 0); + GL11.glRotated(60 * swingLeft + 45 * slap, 0, 0, 1); + GL11.glRotated(roll + 15 * swingLeft + 45 * slapTurn, 0, 1, 0); + GL11.glTranslated(-6, -8, 0); + ResourceManager.armor_remnant.renderPart("LeftArm"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + + GL11.glTranslated(12 * swingRight - 2 * slapTurn + 5 * slap, 6 * slap, 5 * swingRight + 8 * slap); + GL11.glRotated(forwardTilt - swingLeft * 20, 1, 0, 0); + + GL11.glTranslated(-offsetOutward, 0, 0); + GL11.glTranslated(-6, 8, 0); + GL11.glRotated(-60 * swingRight - 45 * slap, 0, 0, 1); + GL11.glRotated(-roll - 15 * swingRight - 45 * slapTurn, 0, 1, 0); + GL11.glTranslated(6, -8, 0); + ResourceManager.armor_remnant.renderPart("RightArm"); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index f9fa32b7a..77f09a111 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -191,7 +191,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG BlockPos portPos = pos.offset(dir); if(tanks[1].getFill() > 0) this.tryProvide(tanks[1], worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); - if(worldObj.getTotalWorldTime() % 20 == 0) this.trySubscribe(tanks[0].getTankType(), worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); + this.trySubscribe(tanks[0].getTankType(), worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); } } diff --git a/src/main/resources/assets/hbm/textures/armor/gold_layer_1.png b/src/main/resources/assets/hbm/textures/armor/gold_layer_1.png deleted file mode 100644 index 6802e06f2714214603c84b65ec5ae8848f19c2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmV;41a|w0P)#)v9<7-mazHXYKUs zQzz}eUQLJZ*V6IVZaR3kmKdvAzwqM_TYj!Cw$jDvX1W?}35lNP$}Xrf+GCp!FUJprH!%o$jpPe-*&e!)diJdg%TBs}+3@Ual-Y0DI5d2|cIb z=Z9aqa&Hg|p|s)WjtD;b*eQO;*wKd~9-z;SwfrV#7`#|XKc2MpW)J$=m$%QG3jiVP z`svHc+ucE=$LYuLVg1hs;RV7NnlP{TI@<^UD#sC8AM4l)RRXA)yGgjhGaiSZkA{)6 zwTDyYC~x;${2dLl9=l+|`3X>9 z2U2pW(U>!H0P4Pg!9@zN9{_Q>y)MaFia5dmBN?cVJxATZ|KI%S zsMB51`Okf1Bnf&Q|Ifck2zuN?pg;xIVJ z0HR#MLFC}7^-($wOuF diff --git a/src/main/resources/assets/hbm/textures/armor/gold_layer_2.png b/src/main/resources/assets/hbm/textures/armor/gold_layer_2.png deleted file mode 100644 index a7cf8351544f9952e0348c0fa576b15535ff848e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmV;Q0$}}#P)pHK}keGRA@u(m-|XWK@i4$jZ%+y-~SPU zh@yz1h$4z23e8Junr2?6{f&-9|4P#F%);W%IkU3gH#6VtNu_)^1I~am;0!ne&VV!E z3^)VMfHU9>I0Mc=;u+}OM$&)G%g0MWM$Mumj*$2JoG@mSia%j`L`W~6nNk=|WSKHJ4b{XZ|jcW)vsgU)rNKJAOFPJGb^bRzZy0cPAS z$z)hou-L54?p#GO8I)yMF9>VMz<=B+sU3R)00E%cxT4^QJnQ+iqHDE-AY$W7R($mX z0bvjRu_u6(Cfa}|`T)iTpq59NL>th&f4j`ebX3*}8L=k-ASk{?98j9#VFH%ghY;SQ z4b(nlkrn7g>gib8!FQf9xC^(HOe}a6k@5R5_F>K42P0i)Vo4a2&S(kW;eov#Yb+ z8}z|)SVtj?$S!;sloe~+|9g*#^1s&@qDXcC2r%|70brh~zJ!Uc7y;U4LIzP{5Y9k! z@i+Zp&qgv}U52$}0vOW_BLrQs(y}f?)~xOo^QvZ(YR*!FtR3@T)`iwR-=FWNge-D^ zv5ORuq-+393k4(@qHQ%qmuJ*G1hStj!XH}+33C(QBHxMOOpWs%NJIbt002ovPDHLk FV1oSeC7}QS diff --git a/src/main/resources/assets/hbm/textures/armor/iron_layer_1.png b/src/main/resources/assets/hbm/textures/armor/iron_layer_1.png deleted file mode 100644 index 6da6e8408d3f28dfe3a261e2011b902ae8854ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1096 zcmV-O1h@N%P)PbXFRA@u(*@sRmF%Sh%{{M%N=r#0C zLT>`T!%xT3MJvQhgv4$Vf+Z`v>o#-e&Uoz1&5bBqTU%v$dAaQE?Ujv}lmY?Z{r$b%-{02?fU~o+%7Rhjr@lP^ zu=vf*O;!Hl;-Xw$UY3Q0h2Iar=H}*y;#XH!rQh#Y>kkHl*@yv@eSCZ@d>;!`&%Vt} z5RBhrfXWqoJ3T%9{VpKVv$QJc@%#1l_4>ZHwl@6$tgNgQey-Z*4-O9M_C{HXs{8x< zRpH&;-TJI;XJ@D81HPpi>sijQy1H5x7Z>ZVIea&-->f$g08%W4UyJhD?kJgd-vvI= z|NQ*C2E!_ zLV}}b%3@RiG&YKBvz21U*a4s<;RG}SQVKO$pVCd5QWVW2w7#J;HUN`iY5?$!)$`37 zDzL0Eb^s`uAh)!%G*lpzMd@KeQ&_*m3Uk{^)g)4sSM?b?0Bs8paIrxA0L013NoCGV z(29Whjv0lb!P2*EKxw0cf?g>2SY(WUO$q|^sNv~yu-dVTV-#iXf%JcJc z9m~Rs^!fPsxLP*=hCOM|{LS~)89<0!k`N#YqoVv@$te;*sGEaR+(sVJC za)X0%tQvo$EQ##IBg%pHD@jB_RA@u(*XeFzF$@LZzW)m$ma^|_ z5tNo)JV{1hG_FSTw;D8*M6yWkbx_W+eVqI9Qbu8*Fi;pM3={?m1BHRYKw+RTP#7o- z6b1?dPtU+;G)lACEG?JIv|g{%(-AV6Op7ndpU;zQ z`0)g^TCLP>x6^n$PMggp*Z*R%$l!;=VJ?HgV32*f-EKC%^np%1JVC&`zrUx?&(93j z+C0|%em{MDe5ALxw`7hC{@d*~uOFTOAOJcX4jG)to1adnJZA*any;+b?RI$&|A!|) zN{cqoq7Se&fXai3HqhSpdcCyY@3SG};Ryiba=Cm(94O!!uxcM6GJrOyePqcBdhzfC z0IbG=l+xBn`ExD$1P>X_W;4G-+K(VWyAw@O1&Eo8^y}+uR(*io3uHj7y|35nkDmcR ziRSHg%e_Ck0)Qf3sZ?@%WY$q4(FJIR%+V!~Q>|9>Z)6kyPN$Ovv{tL-xo)Gp=t~H% zbGU!_pE$=|G$!r<4(MQ_>QJHhz%&|-uY)?A!%nBuOcuYmI>)^sKlnYOqsSuJ#m7)q z=CS|pJt4~fy~c>5>;MRu_?7_JGy1~lN)X_k3{qkUH;69(&>ws5k^$dkSQY>inh}K1 zmH4KJE+cE=UU5F3bE+dHG$`7!|B5d3-ShqP{Yoez2TWX~L{cdMt%U+9L->oXXKEgS j_RAvv)_mDLzD0fksv*FCYGN$y00000NkvXXu0mjf%aJI` diff --git a/src/main/resources/assets/hbm/textures/armor/rpa_arm.png b/src/main/resources/assets/hbm/textures/armor/rpa_arm.png index cbaa905600c0352d7cea009692c64229fa55a4c8..95ab0ffea3f6f482bd962d6e127bd3b9801e3775 100644 GIT binary patch delta 1023 zcmV#PiHwKEDf<&+!u%eZM!$ z>W!W`JsB%~kU#+PA_a*9;P9Ycqbl*7RaF&W%xl9EW=&t0vSZ!vCsg7BRfmT>=QcKf zdd`gwS7PPE7=Hi{@DaV)lCpEGaU}41;sS}pNDEbAaQoIxZkQanK&=bsPr|boZ(#K3 zi0}TIz8)x2W*+oyvmGlRRaIc*&;T$7u<`pJ7=~$IlPz8{WadGJ8MkdP?ILCvW@LL< zQB)#X-9uzn#L`5zf(8I+)N8%1gL*B7h(^5@N~9nXFMndy;UUi^LRDD2O;v!gPIIrS zihbT0&%FQm38v1T^5orpJ}6ks%!87MgA~TVFga8Q`(4ev>%e*MZl`gUEw|K|RQMAnQ$->Se;U{6*HAFxATh0|1zxpN~`z&CSh~-ji6jII>?l zs(+|Og91ea5(vRl#0WRqkFSflT91=AJG4Fsu|w;F5Ia;!BalD{BoG1#gg~Dn6{rlx`}N>({-lC`X!+16A6DDEYjPsaYga!b1WfzsArw=0b9}8fu zK+(|vI?ZGh(tLAy!R0}+u|yhWJ+IiUSeQU7Y*1EYC=Nm(fe=U_1QG~=1VSKz5J(^d t5(t3=LP%^psH`M99#lpW84oHm{{gOtt}AR!&eZ?_002ovPDHLkV1g;0&C>t? literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^9zYz z7*Y}UcBWz96$cTQS{6Nr4h2Q`s6vJyfu^Zq(;7Mi1saZUsZ6jq;G)73)4)7oLLr-y zUh=ou@r&brPrrLVIda+W>0eCB*6+R+dRy*%#q4PF{4KspH{-ds%4EDrpB-$^^KH6Q zE`QSF*`fA6yY`FR)!#M6)NI*h_wUiiZoX{(cD7r6+4=eR_eb$toeitHl%3T2%^+;T z39Um;{LeS})$yu4Fq|{rHs}7kd3;PtKhDeF-#kO-l-1AV9o0qY4W)N>Pk-)S`0>^K z)yFJ28u!=!opkgS>(fj8Z(O;m{{M>HuB+{-XRfI05ocfj%V1Y;=#o;N)VY5QpR7}O zz3HRE^choBPM952UDI+e$8l#w{vNp{JZsc$9^0{9VG2a0)RM&KAMT4ysqS2w_}m~& zpy|1Y$n+c6xK7173cZrJF?&mjlcUChcrPox^|69J*G{fy{P(LkaeL*-EBcLZo7Zuu zy?%0if&7hb5ta2)kGlk7!g{ALrL5WiUTejEa8QI;O^eejPKY;En4+lqwfmHwyNOs5 z=ap{?JzQRSMo zV4}5S)$A`y#f9mb7ni@Rzwqgh-G<7WtNgb&r5vbIKI8c8k$%`Be-W1kvak)m(t+jC zj?q<3+fC=EZNI&hQ5|UK&f33G(Z;{->#yrS|9-3KV$*`iwbxp%9Z208B^>2EZ%v!- zmk+;EOmh~tUtj#U?*2K)<f286nEx-X8CdCvjS7iqfRA8yFdX{ zTqv##w)fYaji&Q8IvD2fIKuIvv;Mb_0ITnXH*)j0m@f9u-?7HibRp30$yrX>4>qY? z1-Za?73bQ<)3ZW^qnM|go@~A~MO%9d`&P~HunhjJ;B{**$X!_$6S>fKh40QyPSpXk xi&9&^Eiij}itDXo?y0Gww@A{!6?*v(>xmDR0$)^D*8y`KgQu&X%Q~loCIBeGs5t-t