From bb02b701629e9a6e915cd522e1d788632479c363 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 7 Apr 2026 23:02:56 +0200 Subject: [PATCH] 'nade 'mations --- .../grenade/EntityGrenadeUniversal.java | 5 +- .../items/weapon/grenade/ItemGrenadeFuze.java | 2 +- .../weapon/grenade/ItemGrenadeShell.java | 6 +- .../weapon/grenade/ItemGrenadeUniversal.java | 67 +++++++++++++++++- src/main/java/com/hbm/main/NTMSounds.java | 1 + .../hbm/render/item/ItemRenderGrenade.java | 55 +++++++++++--- src/main/resources/assets/hbm/sounds.json | 1 + .../hbm/sounds/weapon/reload/grenadeTech.ogg | Bin 0 -> 13694 bytes 8 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/weapon/reload/grenadeTech.ogg diff --git a/src/main/java/com/hbm/entity/grenade/EntityGrenadeUniversal.java b/src/main/java/com/hbm/entity/grenade/EntityGrenadeUniversal.java index 3eddeb922..dfadd69c0 100644 --- a/src/main/java/com/hbm/entity/grenade/EntityGrenadeUniversal.java +++ b/src/main/java/com/hbm/entity/grenade/EntityGrenadeUniversal.java @@ -56,9 +56,8 @@ public class EntityGrenadeUniversal extends EntityThrowableInterp { EnumGrenadeShell shell = ItemGrenadeUniversal.getShell(grenade); - Vec3NT yeet = new Vec3NT(thrower.getLookVec()).normalizeSelf().multiply(shell.getYeetForce()); - this.addVelocity(yeet.xCoord, yeet.yCoord, yeet.zCoord); - this.setThrowableHeading(yeet.xCoord, yeet.yCoord, yeet.zCoord, 1, 0); + Vec3NT yeet = new Vec3NT(thrower.getLookVec()).normalizeSelf(); + this.setThrowableHeading(yeet.xCoord, yeet.yCoord, yeet.zCoord, (float) shell.getYeetForce(), 0); } @Override diff --git a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeFuze.java b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeFuze.java index 12ecdfec0..d1448f6cd 100644 --- a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeFuze.java +++ b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeFuze.java @@ -45,7 +45,7 @@ public class ItemGrenadeFuze extends ItemEnumMulti { }; }; public static Consumer FUZE_AIRBURST = (grenade) -> { - if(grenade.getTimer() >= 40) { + if(grenade.getTimer() >= 30) { Vec3NT start = new Vec3NT(grenade); Vec3NT end = new Vec3NT(grenade).add(0, -10, 0); MovingObjectPosition mop = grenade.worldObj.func_147447_a(start, end, false, false, true); diff --git a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeShell.java b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeShell.java index 527c7097a..f05da1d46 100644 --- a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeShell.java +++ b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeShell.java @@ -30,9 +30,9 @@ public class ItemGrenadeShell extends ItemEnumMulti { } public static enum EnumGrenadeShell { - FRAG(4, 20, 0.5D, 1D), // bonus fragmentation - STICK(4, 20, 0.25D, 1.5D), // thrown farther - TECH(2, 20, 0.5D, 1D), // casing with electronics for EMP/plasma + FRAG(4, 30, 0.5D, 1D), // bonus fragmentation + STICK(4, 43, 0.25D, 1.5D), // thrown farther + TECH(2, 30, 0.5D, 1D), // casing with electronics for EMP/plasma NUKE(1, 20, 0.25D, 1.5D); // nuka grenade casing for high yield grenades private int stackLimit; diff --git a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeUniversal.java b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeUniversal.java index 7aa4cfa79..dbf065e1a 100644 --- a/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeUniversal.java +++ b/src/main/java/com/hbm/items/weapon/grenade/ItemGrenadeUniversal.java @@ -5,6 +5,7 @@ import java.util.Locale; import com.hbm.entity.grenade.EntityGrenadeUniversal; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.items.IAnimatedItem; import com.hbm.items.IEquipReceiver; import com.hbm.items.ModItems; import com.hbm.items.weapon.grenade.ItemGrenadeExtra.EnumGrenadeExtra; @@ -12,6 +13,13 @@ import com.hbm.items.weapon.grenade.ItemGrenadeFilling.EnumGrenadeFilling; import com.hbm.items.weapon.grenade.ItemGrenadeFuze.EnumGrenadeFuze; import com.hbm.items.weapon.grenade.ItemGrenadeShell.EnumGrenadeShell; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.main.NTMSounds; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.HbmAnimationPacket; +import com.hbm.render.anim.AnimationEnums.GunAnimation; +import com.hbm.render.anim.BusAnimationKeyframe.IType; +import com.hbm.render.anim.BusAnimation; +import com.hbm.render.anim.BusAnimationSequence; import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; @@ -20,12 +28,13 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ItemGrenadeUniversal extends Item implements IEquipReceiver { +public class ItemGrenadeUniversal extends Item implements IEquipReceiver, IAnimatedItem { /* * __________ @@ -61,6 +70,10 @@ public class ItemGrenadeUniversal extends Item implements IEquipReceiver { @Override public void onEquip(EntityPlayer player, ItemStack stack) { HbmPlayerProps.getData(player).grenadeDeployment = 0; + + if(player instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new HbmAnimationPacket(GunAnimation.EQUIP.ordinal(), 0), (EntityPlayerMP) player); + } } @Override @@ -72,7 +85,7 @@ public class ItemGrenadeUniversal extends Item implements IEquipReceiver { EntityGrenadeUniversal grenade = new EntityGrenadeUniversal(world, player, stack); world.spawnEntityInWorld(grenade); } - stack.stackSize--; + if(!player.capabilities.isCreativeMode) stack.stackSize--; if(stack.stackSize > 0) this.onEquip(player, stack); } @@ -92,6 +105,18 @@ public class ItemGrenadeUniversal extends Item implements IEquipReceiver { this.onEquip(player, stack); } else if(isHeld) { HbmPlayerProps.getData(player).grenadeDeployment++; + int deployment = HbmPlayerProps.getData(player).grenadeDeployment; + EnumGrenadeShell shell = this.getShell(stack); + if(shell == EnumGrenadeShell.FRAG && deployment == 18) { + world.playSoundAtEntity(player, NTMSounds.GUN_REVOLVER_COCK, 1F, 1F); + } + if(shell == EnumGrenadeShell.STICK) { + if(deployment == 16) world.playSoundAtEntity(player, NTMSounds.GUN_BOLT_OPEN, 1F, 1.25F); + if(deployment == 25) world.playSoundAtEntity(player, NTMSounds.GUN_BOLT_OPEN, 1F, 1.25F); + } + if(shell == EnumGrenadeShell.TECH && deployment == 18) { + world.playSoundAtEntity(player, NTMSounds.GRENADE_TECH, 1F, 1F); + } } } @@ -156,4 +181,42 @@ public class ItemGrenadeUniversal extends Item implements IEquipReceiver { EnumGrenadeExtra extra = this.getExtra(stack); if(extra != null) list.add("item.grenade_universal.extra." + extra.name().toLowerCase(Locale.US)); } + + @Override + public BusAnimation getAnimation(Enum type, ItemStack stack) { + if(type != GunAnimation.EQUIP) return null; + EnumGrenadeShell shell = this.getShell(stack); + + if(shell == EnumGrenadeShell.FRAG) { + return new BusAnimation() + .addBus("BODYMOVE", new BusAnimationSequence().setPos(0, -5, 0).addPos(0, -3, 0, 350).addPos(0, 0, 0, 350, IType.SIN_DOWN)) + .addBus("BODYTURN", new BusAnimationSequence().addPos(0, 0, 45, 350).addPos(0, 0, -15, 350, IType.SIN_DOWN).hold(200).addPos(0, 0, -20, 100, IType.SIN_DOWN).addPos(0, 0, 0, 500, IType.SIN_FULL)) + .addBus("RINGMOVE", new BusAnimationSequence().hold(900).addPos(0, 0, 1, 150).addPos(0, -3, 3, 300)) + .addBus("RINGTURN", new BusAnimationSequence().hold(900).addPos(0, 0, 45, 300)) + .addBus("RENDERRING", new BusAnimationSequence().setPos(1, 1, 1).hold(1350).setPos(0, 0, 0)); + } + + if(shell == EnumGrenadeShell.STICK) { + return new BusAnimation() + .addBus("BODYMOVE", new BusAnimationSequence().setPos(0, -7, 0).addPos(0, 3, 0, 750, IType.SIN_DOWN).holdUntil(1900).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("BODYTURN", new BusAnimationSequence().setPos(0, 0, 90).addPos(0, 0, -45, 750, IType.SIN_DOWN).holdUntil(1900).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("CAPMOVE", new BusAnimationSequence().hold(800).addPos(0, -0.25, 0, 200, IType.SIN_FULL).hold(250).addPos(0, -0.5, 0, 200, IType.SIN_FULL).addPos(2, -5, 0, 350, IType.SIN_UP)) + .addBus("CAPTURN", new BusAnimationSequence().hold(800).addPos(0, 360, 0, 200, IType.SIN_FULL).hold(250).addPos(0, 360 * 2, 0, 200, IType.SIN_FULL)) + .addBus("RENDERCAP", new BusAnimationSequence().setPos(1, 1, 1).hold(2100).setPos(0, 0, 0)); + } + + if(shell == EnumGrenadeShell.TECH) { + return new BusAnimation() + .addBus("BODYMOVE", new BusAnimationSequence().setPos(0, -5, 0).addPos(0, -3, 0, 350).addPos(0, 0, 0, 350, IType.SIN_DOWN)) + .addBus("BODYTURN", new BusAnimationSequence().addPos(0, 0, 45, 350).addPos(0, 0, -15, 350, IType.SIN_DOWN).hold(200).addPos(0, 0, -20, 100, IType.SIN_DOWN).addPos(0, 0, 0, 500, IType.SIN_FULL)) + .addBus("RINGMOVE", new BusAnimationSequence().hold(900).addPos(0, 0, 1, 150).addPos(0, -3, 3, 300)) + .addBus("RINGTURN", new BusAnimationSequence().hold(900).addPos(0, 0, 45, 300)) + .addBus("RENDERRING", new BusAnimationSequence().setPos(1, 1, 1).hold(1350).setPos(0, 0, 0)); + } + + return null; + } + + @Override public boolean shouldPlayerModelAim(ItemStack stack) { return false; } + @Override public Class getEnum() { return GunAnimation.class; } } diff --git a/src/main/java/com/hbm/main/NTMSounds.java b/src/main/java/com/hbm/main/NTMSounds.java index f18c91761..995273d7a 100644 --- a/src/main/java/com/hbm/main/NTMSounds.java +++ b/src/main/java/com/hbm/main/NTMSounds.java @@ -34,6 +34,7 @@ public class NTMSounds { public static final String GUN_LATCH_OPEN = "hbm:weapon.reload.openLatch"; public static final String GUN_VALVE = "hbm:weapon.reload.pressureValve"; public static final String GUN_FATMAN_RELOAD = "hbm:weapon.reload.fatmanFull"; + public static final String GRENADE_TECH = "hbm:weapon.reload.grenadeTech"; /// FOLEY /// public static final String GUN_WHACK = "hbm:weapon.foley.gunWhack"; diff --git a/src/main/java/com/hbm/render/item/ItemRenderGrenade.java b/src/main/java/com/hbm/render/item/ItemRenderGrenade.java index 51ccc340e..beab5be6e 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderGrenade.java +++ b/src/main/java/com/hbm/render/item/ItemRenderGrenade.java @@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.weapon.grenade.ItemGrenadeUniversal; import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; import com.hbm.render.tileentity.RenderArcFurnace; import com.hbm.util.ColorUtil; @@ -79,25 +80,63 @@ public class ItemRenderGrenade implements IItemRenderer { GL11.glRotated(180, 0, -1, 0); if(shell == EnumGrenadeShell.FRAG) { + double[] bodyMove = HbmAnimations.getRelevantTransformation("BODYMOVE"); + double[] bodyTurn = HbmAnimations.getRelevantTransformation("BODYTURN"); + double[] ringMove = HbmAnimations.getRelevantTransformation("RINGMOVE"); + double[] ringTurn = HbmAnimations.getRelevantTransformation("RINGTURN"); + double[] renderRing = HbmAnimations.getRelevantTransformation("RENDERRING"); + GL11.glTranslated(bodyMove[0], bodyMove[1], bodyMove[2]); + GL11.glRotated(bodyTurn[2], 1, 0, 0); renderFragBody(stack); Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_frag_tex); ResourceManager.grenades.renderPart("FragSpoon"); - ResourceManager.grenades.renderPart("FragRing"); + if(renderRing[0] != 0) { + GL11.glTranslated(ringMove[0], ringMove[1], ringMove[2]); + GL11.glRotated(ringTurn[2], 1, 0, 0); + ResourceManager.grenades.renderPart("FragRing"); + } } if(shell == EnumGrenadeShell.STICK) { + double[] bodyMove = HbmAnimations.getRelevantTransformation("BODYMOVE"); + double[] bodyTurn = HbmAnimations.getRelevantTransformation("BODYTURN"); + double[] capMove = HbmAnimations.getRelevantTransformation("CAPMOVE"); + double[] capTurn = HbmAnimations.getRelevantTransformation("CAPTURN"); + double[] renderCap = HbmAnimations.getRelevantTransformation("RENDERCAP"); + GL11.glTranslated(bodyMove[0], bodyMove[1], bodyMove[2]); + GL11.glRotated(bodyTurn[2], 0, 0, 1); renderStickBody(stack); - EnumGrenadeFilling filling = ItemGrenadeUniversal.getFilling(stack); - GL11.glColor3f(ColorUtil.fr(filling.bodyColor), ColorUtil.fg(filling.bodyColor), ColorUtil.fb(filling.bodyColor)); - bind(ResourceManager.grenade_stick_body_tex); - ResourceManager.grenades.renderPart("StickCap"); - GL11.glColor3f(1F, 1F, 1F); + if(renderCap[0] != 0) { + GL11.glTranslated(capMove[0], capMove[1], capMove[2]); + GL11.glRotated(capTurn[1], 0, 1, 0); + EnumGrenadeFilling filling = ItemGrenadeUniversal.getFilling(stack); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + bind(ResourceManager.grenade_stick_tex); + ResourceManager.grenades.renderPart("StickCap"); + GL11.glColor3f(ColorUtil.fr(filling.bodyColor), ColorUtil.fg(filling.bodyColor), ColorUtil.fb(filling.bodyColor)); + bind(ResourceManager.grenade_stick_body_tex); + ResourceManager.grenades.renderPart("StickCap"); + GL11.glColor3f(1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } } if(shell == EnumGrenadeShell.TECH) { + double[] bodyMove = HbmAnimations.getRelevantTransformation("BODYMOVE"); + double[] bodyTurn = HbmAnimations.getRelevantTransformation("BODYTURN"); + double[] ringMove = HbmAnimations.getRelevantTransformation("RINGMOVE"); + double[] ringTurn = HbmAnimations.getRelevantTransformation("RINGTURN"); + double[] renderRing = HbmAnimations.getRelevantTransformation("RENDERRING"); + GL11.glTranslated(bodyMove[0], bodyMove[1], bodyMove[2]); + GL11.glRotated(bodyTurn[2], 1, 0, 0); renderTechBody(stack); - Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_tech_tex); - ResourceManager.grenades.renderPart("TechRing"); + if(renderRing[0] != 0) { + GL11.glTranslated(ringMove[0], ringMove[1], ringMove[2]); + GL11.glRotated(ringTurn[2], 1, 0, 0); + Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_tech_tex); + ResourceManager.grenades.renderPart("TechRing"); + } } if(shell == EnumGrenadeShell.NUKE) { diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index c536953dd..c9c2ab6c5 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -294,6 +294,7 @@ "weapon.reload.impact": {"category": "player", "sounds": ["weapon/reload/impact1", "weapon/reload/impact2", "weapon/reload/impact3"]}, "weapon.reload.fatmanFull": {"category": "player", "sounds": ["weapon/reload/fatmanFull"]}, "weapon.reload.screw": {"category": "player", "sounds": ["weapon/reload/screw"]}, + "weapon.reload.grenadeTech": {"category": "player", "sounds": ["weapon/reload/grenadeTech"]}, "weapon.foley.gunWhack": {"category": "player", "sounds": ["weapon/foley/gunWhack", "weapon/foley/gunWhack2"]}, diff --git a/src/main/resources/assets/hbm/sounds/weapon/reload/grenadeTech.ogg b/src/main/resources/assets/hbm/sounds/weapon/reload/grenadeTech.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e391388b848509f2f1770c057f94dcc246921a83 GIT binary patch literal 13694 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 C`F1e? literal 0 HcmV?d00001