From a56397c8c7cd0ebd606127543c7d0727f1a20ff9 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 27 Jan 2026 21:43:59 +0100 Subject: [PATCH] the uhhhhhh the fuckin uhhhhhhh --- changelog | 2 ++ .../com/hbm/particle/ParticleSpentCasing.java | 29 ++++++++++++----- .../java/com/hbm/particle/SpentCasing.java | 2 ++ .../hbm/particle/helper/CasingCreator.java | 28 ++++++++++++++++ .../turret/TileEntityTurretArty.java | 30 +++++++----------- .../turret/TileEntityTurretJeremy.java | 29 ++++++++++++----- .../turret/TileEntityTurretSentry.java | 2 +- .../assets/hbm/manual/weapon/express.json | 2 +- .../assets/hbm/manual/weapon/slug.json | 2 +- src/main/resources/assets/hbm/sounds.json | 1 + .../hbm/sounds/weapon/casing/large1.ogg | Bin 0 -> 6416 bytes .../hbm/sounds/weapon/casing/large2.ogg | Bin 0 -> 6322 bytes .../hbm/sounds/weapon/casing/large3.ogg | Bin 0 -> 6747 bytes 13 files changed, 90 insertions(+), 37 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/weapon/casing/large1.ogg create mode 100644 src/main/resources/assets/hbm/sounds/weapon/casing/large2.ogg create mode 100644 src/main/resources/assets/hbm/sounds/weapon/casing/large3.ogg diff --git a/changelog b/changelog index eb8fac849..e00fab8cc 100644 --- a/changelog +++ b/changelog @@ -32,3 +32,5 @@ * Fixed audio problems with guns * Fixed third person muzzleflash on the miniguns clipping the barrel * Fixed arc furnace IO slots stacking items with incompatible NBT +* Fixed a bounding box issue with casing particles, causing them to slide sideways on the first tick, making trajectories weird +* Fixed some turrets not using the more modern casing spawner system which allows casings to have a smoke trail diff --git a/src/main/java/com/hbm/particle/ParticleSpentCasing.java b/src/main/java/com/hbm/particle/ParticleSpentCasing.java index ff443f550..30ed0782f 100644 --- a/src/main/java/com/hbm/particle/ParticleSpentCasing.java +++ b/src/main/java/com/hbm/particle/ParticleSpentCasing.java @@ -69,6 +69,9 @@ public class ParticleSpentCasing extends EntityFX { this.motionX = mx; this.motionY = my; this.motionZ = mz; + + // i am at a loss for words as to what the fuck is going on here, but this is needed, stop asking, fuck you + this.setPosition(x, y, z); particleGravity = 1F; } @@ -129,16 +132,26 @@ public class ParticleSpentCasing extends EntityFX { rotationPitch += momentumPitch; rotationYaw += momentumYaw; + + if(Math.abs(prevRotationPitch - rotationPitch) > 180) { + if(prevRotationPitch < rotationPitch) prevRotationPitch += 360; + if(prevRotationPitch > rotationPitch) prevRotationPitch -= 360; + } + + if(Math.abs(prevRotationYaw - rotationYaw) > 180) { + if(prevRotationYaw < rotationYaw) prevRotationYaw += 360; + if(prevRotationYaw > rotationYaw) prevRotationYaw -= 360; + } } public void moveEntity(double motionX, double motionY, double motionZ) { this.worldObj.theProfiler.startSection("move"); this.ySize *= 0.4F; - if (this.isInWeb) { + if(this.isInWeb) { this.isInWeb = false; motionX *= 0.25D; - motionY *= 0.05000000074505806D; + motionY *= 0.05D; motionZ *= 0.25D; this.motionX = 0.0D; this.motionY = 0.0D; @@ -152,7 +165,7 @@ public class ParticleSpentCasing extends EntityFX { List list = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(motionX, motionY, motionZ)); - for (int i = 0; i < list.size(); ++i) { + for(int i = 0; i < list.size(); ++i) { motionY = ((AxisAlignedBB)list.get(i)).calculateYOffset(this.boundingBox, motionY); } @@ -160,13 +173,13 @@ public class ParticleSpentCasing extends EntityFX { int j; - for (j = 0; j < list.size(); ++j) { + for(j = 0; j < list.size(); ++j) { motionX = ((AxisAlignedBB)list.get(j)).calculateXOffset(this.boundingBox, motionX); } this.boundingBox.offset(motionX, 0.0D, 0.0D); - for (j = 0; j < list.size(); ++j) { + for(j = 0; j < list.size(); ++j) { motionZ = ((AxisAlignedBB)list.get(j)).calculateZOffset(this.boundingBox, motionZ); } @@ -217,7 +230,7 @@ public class ParticleSpentCasing extends EntityFX { } if(this.config.getSound() != null && isCollidedVertically && Math.abs(initMoY) >= 0.2) { - MainRegistry.proxy.playSoundClient(posX, posY, posZ, this.config.getSound(), 0.5F, 1F + this.rand.nextFloat() * 0.2F); + MainRegistry.proxy.playSoundClient(posX, posY, posZ, this.config.getSound(), this.config.PLINK_LARGE.equals(this.config.getSound()) ? 1F : 0.5F, 1F + this.rand.nextFloat() * 0.2F); } this.worldObj.theProfiler.endSection(); @@ -267,8 +280,8 @@ public class ParticleSpentCasing extends EntityFX { GL11.glScalef(dScale, dScale, dScale); - GL11.glRotatef(180 - rotationYaw, 0, 1, 0); - GL11.glRotatef(-rotationPitch, 1, 0, 0); + GL11.glRotatef(180 - (float) BobMathUtil.interp(prevRotationYaw, rotationYaw, interp), 0, 1, 0); + GL11.glRotatef((float) -BobMathUtil.interp(prevRotationPitch, rotationPitch, interp), 1, 0, 0); GL11.glScalef(config.getScaleX(), config.getScaleY(), config.getScaleZ()); diff --git a/src/main/java/com/hbm/particle/SpentCasing.java b/src/main/java/com/hbm/particle/SpentCasing.java index 19302119c..b8b57dba7 100644 --- a/src/main/java/com/hbm/particle/SpentCasing.java +++ b/src/main/java/com/hbm/particle/SpentCasing.java @@ -46,6 +46,7 @@ public class SpentCasing implements Cloneable { public static final String PLINK_SHELL = "hbm:weapon.casing.shell"; public static final String PLINK_SMALL = "hbm:weapon.casing.small"; public static final String PLINK_MEDIUM = "hbm:weapon.casing.medium"; + public static final String PLINK_LARGE = "hbm:weapon.casing.large"; public SpentCasing(CasingType type) { this.type = type; @@ -73,6 +74,7 @@ public class SpentCasing implements Cloneable { this.scaleY = y; this.scaleZ = z; if(x * y * z >= 3 && this.type != CasingType.SHOTGUN) this.setSound(PLINK_MEDIUM); + if(x * y * z >= 100 && this.type != CasingType.SHOTGUN) this.setSound(PLINK_LARGE); return this; } diff --git a/src/main/java/com/hbm/particle/helper/CasingCreator.java b/src/main/java/com/hbm/particle/helper/CasingCreator.java index 51b8f3520..c2a89666f 100644 --- a/src/main/java/com/hbm/particle/helper/CasingCreator.java +++ b/src/main/java/com/hbm/particle/helper/CasingCreator.java @@ -32,6 +32,34 @@ public class CasingCreator implements IParticleCreator { composeEffect(world, player, frontOffset, heightOffset, sideOffset, frontMotion, heightMotion, sideMotion, motionVariance, 5F, 10F, casing, false, 0, 0, 0); } + public static void composeEffect(World world, double x, double y, double z, float yaw, float pitch, double frontMotion, double heightMotion, double sideMotion, double motionVariance, float mPitch, float mYaw, String casing, boolean smoking, int smokeLife, double smokeLift, int nodeLife) { + + Vec3 motion = Vec3.createVectorHelper(sideMotion, heightMotion, frontMotion); + motion.rotateAroundX(-pitch / 180F * (float) Math.PI); + motion.rotateAroundY(-yaw / 180F * (float) Math.PI); + + double mX = motion.xCoord + world.rand.nextGaussian() * motionVariance; + double mY = motion.yCoord + world.rand.nextGaussian() * motionVariance; + double mZ = motion.zCoord + world.rand.nextGaussian() * motionVariance; + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "casingNT"); + data.setDouble("mX", mX); + data.setDouble("mY", mY); + data.setDouble("mZ", mZ); + data.setFloat("yaw", yaw); + data.setFloat("pitch", pitch); + data.setFloat("mPitch", mPitch); + data.setFloat("mYaw", mYaw); + data.setString("name", casing); + data.setBoolean("smoking", smoking); + data.setInteger("smokeLife", smokeLife); + data.setDouble("smokeLift", smokeLift); + data.setInteger("nodeLife", nodeLife); + + IParticleCreator.sendPacket(world, x, y, z, 50, data); + } + public static void composeEffect(World world, EntityLivingBase player, double frontOffset, double heightOffset, double sideOffset, double frontMotion, double heightMotion, double sideMotion, double motionVariance, float mPitch, float mYaw, String casing, boolean smoking, int smokeLife, double smokeLift, int nodeLife) { if(player.isSneaking()) heightOffset -= 0.075F; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index c3cd4e131..1e9c91701 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import com.hbm.entity.projectile.EntityArtilleryShell; -import com.hbm.handler.CasingEjector; import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretArty; @@ -13,6 +12,7 @@ import com.hbm.items.weapon.ItemAmmoArty; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.particle.helper.CasingCreator; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.Optional; @@ -380,13 +380,6 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } } - protected static CasingEjector ejector = new CasingEjector().setMotion(0, 0.6, -1).setAngleRange(0.1F, 0.1F); - - @Override - protected CasingEjector getEjector() { - return ejector; - } - @Override protected Vec3 getCasingSpawnPos() { return this.getTurretPos(); @@ -439,18 +432,19 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen protected void spawnCasing() { if(cachedCasingConfig == null) return; - CasingEjector ej = getEjector(); Vec3 spawn = this.getCasingSpawnPos(); - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "casing"); - data.setFloat("pitch", (float) 0); - data.setFloat("yaw", (float) rotationYaw); - data.setBoolean("crouched", false); - data.setString("name", cachedCasingConfig.getName()); - if(ej != null) data.setInteger("ej", ej.getId()); - PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + float yaw = (float) Math.toDegrees(rotationYaw); + float pitch = (float) -Math.toDegrees(this.rotationPitch); + + CasingCreator.composeEffect(worldObj, + spawn.xCoord, spawn.yCoord, spawn.zCoord, + yaw, pitch, + -0.6, 0.3, 0, + 0.01, worldObj.rand.nextFloat() * 20F - 10F, 0, + cachedCasingConfig.getName(), + true, 200, 1, 20); + cachedCasingConfig = null; } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java index 48504f6e8..39fe4148f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java @@ -3,12 +3,12 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; import java.util.List; -import com.hbm.handler.CasingEjector; import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretJeremy; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactoryTurret; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.particle.helper.CasingCreator; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -111,6 +111,26 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { } } + @Override + protected void spawnCasing() { + + if(cachedCasingConfig == null) return; + + Vec3 spawn = this.getCasingSpawnPos(); + float yaw = (float) Math.toDegrees(rotationYaw); + float pitch = (float) -Math.toDegrees(this.rotationPitch); + + CasingCreator.composeEffect(worldObj, + spawn.xCoord, spawn.yCoord, spawn.zCoord, + yaw, pitch, + -0.2, -0.2, 0, + 0.01, -5, 0, + cachedCasingConfig.getName(), + true, 100, 0.5, 20); + + cachedCasingConfig = null; + } + @Override protected Vec3 getCasingSpawnPos() { @@ -122,13 +142,6 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { return Vec3.createVectorHelper(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord); } - protected static CasingEjector ejector = new CasingEjector().setAngleRange(0.01F, 0.01F).setMotion(0, 0, -0.2); - - @Override - protected CasingEjector getEjector() { - return ejector; - } - @Override public boolean usesCasings() { return true; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 90e7f326b..5af1640ec 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -209,7 +209,7 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG @Override protected CasingEjector getEjector() { - return ejector.setMotion(0.3, 0.6, 0); + return ejector.setMotion(0.2, 0.2, 0); } @Override diff --git a/src/main/resources/assets/hbm/manual/weapon/express.json b/src/main/resources/assets/hbm/manual/weapon/express.json index cc9cf2f9e..7c3547126 100644 --- a/src/main/resources/assets/hbm/manual/weapon/express.json +++ b/src/main/resources/assets/hbm/manual/weapon/express.json @@ -9,6 +9,6 @@ "en_US": "FMJ Express Bullet" }, "content": { - "en_US": "FMJ Express is a special type of full metal jacket ammo for revolver calibers. Express ammo has the same armor-pericing effects in addition to increased damage. Express projectiles can penetrate their targets, but unlike AP rounds, Express projectiles become weaker on every penetration. Due to the higher powder load in combination with the basic gunmetal casing, Express ammo causes the gun to wear faster." + "en_US": "FMJ Express is a special type of full metal jacket ammo for revolver calibers. Express ammo has the same armor-piercing effects in addition to increased damage. Express projectiles can penetrate their targets, but unlike AP rounds, Express projectiles become weaker on every penetration. Due to the higher powder load in combination with the basic gunmetal casing, Express ammo causes the gun to wear faster." } } diff --git a/src/main/resources/assets/hbm/manual/weapon/slug.json b/src/main/resources/assets/hbm/manual/weapon/slug.json index b5c848b2f..b736c7ae2 100644 --- a/src/main/resources/assets/hbm/manual/weapon/slug.json +++ b/src/main/resources/assets/hbm/manual/weapon/slug.json @@ -10,6 +10,6 @@ "en_US": "Slug" }, "content": { - "en_US": "A shell type that only holds a single large projectile. Unlike shot, slugs do not have inherent spread, deall the gun's full damage on hit, and have some armor-piercing properties." + "en_US": "A shell type that only holds a single large projectile. Unlike shot, slugs do not have inherent spread, deal the gun's full damage on hit, and have some armor-piercing properties." } } diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index e1e971d14..9b2f9d8a7 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -297,6 +297,7 @@ "weapon.casing.small": {"category": "player", "sounds": ["weapon/casing/small1", "weapon/casing/small2", "weapon/casing/small3"]}, "weapon.casing.medium": {"category": "player", "sounds": ["weapon/casing/medium1", "weapon/casing/medium2", "weapon/casing/medium3"]}, + "weapon.casing.large": {"category": "player", "sounds": ["weapon/casing/large1", "weapon/casing/large2", "weapon/casing/large3"]}, "weapon.casing.shell": {"category": "player", "sounds": ["weapon/casing/shell1", "weapon/casing/shell2", "weapon/casing/shell3"]}, "turret.chekhov_fire": {"category": "block", "sounds": [{"name": "turret/chekhov_fire", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/weapon/casing/large1.ogg b/src/main/resources/assets/hbm/sounds/weapon/casing/large1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..843da3b823984376b929fe237b3d6bd5aae00a4a GIT binary patch literal 6416 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/weapon/casing/large2.ogg b/src/main/resources/assets/hbm/sounds/weapon/casing/large2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9285f5ed58199970915cbb0b6164b51788e2fa8e GIT binary patch literal 6322 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 literal 0 HcmV?d00001