From 98ed3fad91fc1067ce2d9a3a1a7fce6efd33e873 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 18 Nov 2024 23:22:15 +0100 Subject: [PATCH] more bolter crap, various fixes --- .../projectile/EntityBulletBeamBase.java | 4 +++ .../com/hbm/items/weapon/sedna/GunConfig.java | 21 +++++++----- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 3 ++ .../sedna/factory/GunFactoryClient.java | 5 +++ .../weapon/sedna/factory/Orchestras.java | 30 ++++++++++++++++++ .../weapon/sedna/factory/XFactory44.java | 6 +++- .../weapon/sedna/factory/XFactory75Bolt.java | 2 +- .../weapon/sedna/factory/XFactoryEnergy.java | 6 +++- .../com/hbm/main/ModEventHandlerClient.java | 10 ++++++ .../item/weapon/sedna/ItemRenderBolter.java | 2 +- .../item/weapon/sedna/ItemRenderG3.java | 2 +- .../assets/hbm/models/weapons/stg77.obj | 24 +++++++------- .../hbm/textures/models/weapons/stg77.png | Bin 5109 -> 5106 bytes 13 files changed, 90 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java index 1d4e2bfe9..aeee12735 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java @@ -188,8 +188,12 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa @Override public void writeSpawnData(ByteBuf buf) { buf.writeDouble(beamLength); + buf.writeFloat(rotationYaw); + buf.writeFloat(rotationPitch); } @Override public void readSpawnData(ByteBuf buf) { this.beamLength = buf.readDouble(); + this.rotationYaw = buf.readFloat(); + this.rotationPitch = buf.readFloat(); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java b/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java index 8b0e32701..90f21ddf5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java +++ b/src/main/java/com/hbm/items/weapon/sedna/GunConfig.java @@ -14,6 +14,7 @@ import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.HbmAnimations.AnimType; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; /** * Despite how complicated the GunConfig looks, it actually only exists to hold together a bunch of fields. Everything else is infrastructure for getting and setting. @@ -33,6 +34,7 @@ public class GunConfig { public static final String O_CROSSHAIR = "O_CROSSHAIR"; public static final String B_HIDECROSSHAIR = "B_HIDECROSSHAIR"; public static final String B_RELOADANIMATIONSEQUENTIAL = "B_RELOADANIMATIONSEQUENTIAL"; + public static final String O_SCOPETEXTURE = "O_SCOPETEXTURE"; public static final String CON_SMOKE = "CON_SMOKE"; public static final String CON_ORCHESTRA = "CON_ORCHESTRA"; public static final String CON_ONPRESSPRIMARY = "CON_ONPRESSPRIMARY"; @@ -58,6 +60,7 @@ public class GunConfig { protected Crosshair crosshair_DNA; protected boolean hideCrosshair_DNA = true; protected boolean reloadAnimationsSequential_DNA; + protected ResourceLocation scopeTexture_DNA; /** Handles smoke clientside */ protected BiConsumer smokeHandler_DNA; /** This piece only triggers during reloads, playing sounds depending on the reload's progress making reload sounds easier and synced to animations */ @@ -88,6 +91,7 @@ public class GunConfig { public Crosshair getCrosshair(ItemStack stack) { return WeaponUpgradeManager.eval(crosshair_DNA, stack, O_CROSSHAIR, this); } public boolean getHideCrosshair(ItemStack stack) { return WeaponUpgradeManager.eval(hideCrosshair_DNA, stack, B_HIDECROSSHAIR, this); } public boolean getReloadAnimSequential(ItemStack stack) { return WeaponUpgradeManager.eval(reloadAnimationsSequential_DNA, stack, B_RELOADANIMATIONSEQUENTIAL, this); } + public ResourceLocation getScopeTexture(ItemStack stack) { return WeaponUpgradeManager.eval(scopeTexture_DNA, stack, O_SCOPETEXTURE, this); } public BiConsumer getSmokeHandler(ItemStack stack) { return WeaponUpgradeManager.eval(smokeHandler_DNA, stack, CON_SMOKE, this); } public BiConsumer getOrchestra(ItemStack stack) { return WeaponUpgradeManager.eval(this.orchestra_DNA, stack, CON_ORCHESTRA, this); } @@ -108,14 +112,15 @@ public class GunConfig { /* SETTERS */ - public GunConfig rec(Receiver... receivers) { this.receivers_DNA = receivers; return this; } - public GunConfig dura(float dura) { this.durability_DNA = dura; return this; } - public GunConfig draw(int draw) { this.drawDuration_DNA = draw; return this; } - public GunConfig inspect(int inspect) { this.inspectDuration_DNA = inspect; return this; } - public GunConfig inspectCancel(boolean flag) { this.inspectCancel_DNA = flag; return this; } - public GunConfig crosshair(Crosshair crosshair) { this.crosshair_DNA = crosshair; return this; } - public GunConfig hideCrosshair(boolean flag) { this.hideCrosshair_DNA = flag; return this; } - public GunConfig reloadSequential(boolean flag) { this.reloadAnimationsSequential_DNA = flag; return this; } + public GunConfig rec(Receiver... receivers) { this.receivers_DNA = receivers; return this; } + public GunConfig dura(float dura) { this.durability_DNA = dura; return this; } + public GunConfig draw(int draw) { this.drawDuration_DNA = draw; return this; } + public GunConfig inspect(int inspect) { this.inspectDuration_DNA = inspect; return this; } + public GunConfig inspectCancel(boolean flag) { this.inspectCancel_DNA = flag; return this; } + public GunConfig crosshair(Crosshair crosshair) { this.crosshair_DNA = crosshair; return this; } + public GunConfig hideCrosshair(boolean flag) { this.hideCrosshair_DNA = flag; return this; } + public GunConfig reloadSequential(boolean flag) { this.reloadAnimationsSequential_DNA = flag; return this; } + public GunConfig scopeTexture(ResourceLocation tex) { this.scopeTexture_DNA = tex; return this; } public GunConfig smoke(BiConsumer smoke) { this.smokeHandler_DNA = smoke; return this; } public GunConfig orchestra(BiConsumer orchestra) { this.orchestra_DNA = orchestra; return this; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index c6a3acab4..a926de13b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -23,6 +23,7 @@ import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -343,6 +344,8 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei bottomOffset += component.getComponentHeight(player, stack); } } + + Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } public static class SmokeNode { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index ca70b95ca..09f753aa5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -8,6 +8,7 @@ import static com.hbm.items.weapon.sedna.factory.XFactory40mm.*; import static com.hbm.items.weapon.sedna.factory.XFactory44.*; import static com.hbm.items.weapon.sedna.factory.XFactory50.*; import static com.hbm.items.weapon.sedna.factory.XFactory556mm.*; +import static com.hbm.items.weapon.sedna.factory.XFactory75Bolt.*; import static com.hbm.items.weapon.sedna.factory.XFactory762mm.*; import static com.hbm.items.weapon.sedna.factory.XFactory9mm.*; import static com.hbm.items.weapon.sedna.factory.XFactoryAccelerator.*; @@ -120,6 +121,10 @@ public class GunFactoryClient { bmg50_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); bmg50_ap.setRenderer(LegoClient.RENDER_AP_BULLET); bmg50_du.setRenderer(LegoClient.RENDER_DU_BULLET); + + b75.setRenderer(LegoClient.RENDER_AP_BULLET); + b75_inc.setRenderer(LegoClient.RENDER_AP_BULLET); + b75_exp.setRenderer(LegoClient.RENDER_EXPRESS_BULLET); g12_bp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); g12_bp_magnum.setRenderer(LegoClient.RENDER_STANDARD_BULLET); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index b98d085bb..e029e28b5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -897,9 +897,14 @@ public class Orchestras { if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + boolean aiming = ItemGunBaseNT.getIsAiming(stack); if(ClientConfig.GUN_ANIMS_LEGACY.get()) { if(type == AnimType.CYCLE) { + if(timer == 0) { + SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, aiming ? 0.125 : 0.125, aiming ? -0.125 : -0.25, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, casing.getName()); + } if(timer == 40) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 0.25F, 1.25F); } if(type == AnimType.CYCLE_DRY) { @@ -922,6 +927,10 @@ public class Orchestras { } } else { if(type == AnimType.CYCLE) { + if(timer == 0) { + SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, aiming ? 0.125 : 0.25, aiming ? -0.125 : -0.25, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, casing.getName()); + } if(timer == 40) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 0.25F, 1.25F); } if(type == AnimType.CYCLE_DRY) { @@ -1121,4 +1130,25 @@ public class Orchestras { if(timer == 25) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.75F); } }; + + public static BiConsumer ORCHESTRA_BOLTER = (stack, ctx) -> { + EntityLivingBase entity = ctx.entity; + if(entity.worldObj.isRemote) return; + AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); + int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + boolean aiming = ItemGunBaseNT.getIsAiming(stack); + + if(type == AnimType.CYCLE) { + if(timer == 1) { + SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.5, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D, 0, 0.18, -0.12, 0.01, casing.getName()); + } + } + + if(type == AnimType.RELOAD) { + + if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); + if(timer == 26) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); + } + }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java index 32871feb9..48ad36d65 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory44.java @@ -15,6 +15,7 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; +import com.hbm.lib.RefStrings; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.render.anim.BusAnimation; @@ -23,9 +24,12 @@ import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; public class XFactory44 { + public static final ResourceLocation scope_lilmac = new ResourceLocation(RefStrings.MODID, "textures/misc/scope_44.png"); + public static BulletConfig m44_bp; public static BulletConfig m44_sp; public static BulletConfig m44_fmj; @@ -73,7 +77,7 @@ public class XFactory44 { .anim(LAMBDA_NOPIP_ANIMS).orchestra(Orchestras.ORCHESTRA_NOPIP) ).setUnlocalizedName("gun_heavy_revolver"); ModItems.gun_heavy_revolver_lilmac = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() - .dura(31_000).draw(10).inspect(23).crosshair(Crosshair.L_CLASSIC).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .dura(31_000).draw(10).inspect(23).crosshair(Crosshair.L_CLASSIC).scopeTexture(scope_lilmac).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(10F).delay(14).reload(46).jam(23).sound("hbm:weapon.44Shoot", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 6).addConfigs(m44_equestrian, m44_bp, m44_sp, m44_fmj, m44_jhp, m44_ap, m44_express)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java index 1bf7be2bc..5caea7441 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java @@ -45,7 +45,7 @@ public class XFactory75Bolt { .offset(1, -0.0625 * 2.5, -0.25D) .setupStandardFire().recoil(Lego.LAMBDA_STANDARD_RECOIL)) .setupStandardConfiguration() - .anim(LAMBDA_BOLTER_ANIMS).orchestra(Orchestras.ORCHESTRA_GREASEGUN) + .anim(LAMBDA_BOLTER_ANIMS).orchestra(Orchestras.ORCHESTRA_BOLTER) ).setUnlocalizedName("gun_bolter"); } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java index 58a345ae7..3b2104f0d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java @@ -17,6 +17,7 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; +import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -32,9 +33,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.ForgeDirection; public class XFactoryEnergy { + + public static final ResourceLocation scope_luna = new ResourceLocation(RefStrings.MODID, "textures/misc/scope_luna.png"); public static BulletConfig energy_tesla; public static BulletConfig energy_tesla_overcharge; @@ -107,7 +111,7 @@ public class XFactoryEnergy { ).setUnlocalizedName("gun_tesla_cannon"); ModItems.gun_lasrifle = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() - .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE) + .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).scopeTexture(scope_luna) .rec(new Receiver(0) .dmg(15F).delay(8).reload(44).jam(36).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 24).addConfigs(energy_las, energy_las_overcharge, energy_las_blacklightning)) diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index f7f641b3c..fbe716233 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -46,6 +46,7 @@ import com.hbm.items.machine.ItemDepletedFuel; import com.hbm.items.machine.ItemFluidDuct; import com.hbm.items.machine.ItemRBMKPellet; import com.hbm.items.weapon.ItemGunBase; +import com.hbm.items.weapon.sedna.GunConfig; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; @@ -360,6 +361,15 @@ public class ModEventHandlerClient { } } + if(held != null && held.getItem() instanceof ItemGunBaseNT && ItemGunBaseNT.aimingProgress == ItemGunBaseNT.prevAimingProgress && ItemGunBaseNT.aimingProgress == 1F && event.type == event.type.HOTBAR) { + ItemGunBaseNT gun = (ItemGunBaseNT) held.getItem(); + GunConfig cfg = gun.getConfig(held, 0); + if(cfg.getScopeTexture(held) != null) { + ScaledResolution resolution = event.resolution; + RenderScreenOverlay.renderScope(resolution, cfg.getScopeTexture(held)); + } + } + /// HANDLE FSB HUD /// ItemStack helmet = player.inventory.armorInventory[3]; diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderBolter.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderBolter.java index 4f97ce3c2..ba3af6235 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderBolter.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderBolter.java @@ -102,7 +102,7 @@ public class ItemRenderBolter extends ItemRenderWeaponBase { GL11.glScaled(scale, scale, scale); GL11.glRotated(25, 1, 0, 0); GL11.glRotated(45, 0, 1, 0); - GL11.glTranslated(-0.5, -0.5, 0); + GL11.glTranslated(-0.25, -0.5, 0); } @Override diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java index 34185f273..5edb45d39 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderG3.java @@ -27,7 +27,7 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { float offset = 0.8F; standardAimingTransform(stack, -1.25F * offset, -1F * offset, 2.75F * offset, - 0, -3.625 / 8D, 1.75); + 0, -3.5625 / 8D, 1.75); } @Override diff --git a/src/main/resources/assets/hbm/models/weapons/stg77.obj b/src/main/resources/assets/hbm/models/weapons/stg77.obj index 47582d957..decc89649 100644 --- a/src/main/resources/assets/hbm/models/weapons/stg77.obj +++ b/src/main/resources/assets/hbm/models/weapons/stg77.obj @@ -3411,9 +3411,9 @@ vt 0.170455 0.180723 vt 0.174242 0.144578 vt 0.136364 0.150602 vt 0.174242 0.192771 -vt 0.886904 0.951811 -vt 0.939394 0.807222 -vt 0.991884 0.951811 +vt 0.830355 0.927716 +vt 0.909091 0.710833 +vt 0.987826 0.927716 vt 0.640152 0.662651 vt 0.715909 0.662651 vt 0.753788 0.662651 @@ -3579,15 +3579,15 @@ vt 0.151515 0.536145 vt 0.189394 0.156627 vt 0.178030 0.180723 vt 0.136364 0.186747 -vt 0.969699 0.987093 -vt 0.939394 1.000007 -vt 0.909088 0.987093 -vt 0.878783 0.903614 -vt 0.886904 0.855418 -vt 0.909089 0.820136 -vt 0.969699 0.820136 -vt 0.991884 0.855418 -vt 1.000005 0.903614 +vt 0.954549 0.980639 +vt 0.909091 1.000011 +vt 0.863633 0.980639 +vt 0.818175 0.855421 +vt 0.830355 0.783127 +vt 0.863633 0.730204 +vt 0.954549 0.730204 +vt 0.987826 0.783127 +vt 1.000007 0.855422 vt 0.074559 0.941663 vt 0.075631 0.945782 vt 0.074559 0.949902 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/stg77.png b/src/main/resources/assets/hbm/textures/models/weapons/stg77.png index be34f16338d442dc89c6fa2ecc4796a4cb7636af..6bb0d2949ff4fa7fc8dedbcb64a7162e818ea054 100644 GIT binary patch delta 4557 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 rQQ~S&N)>VsemTgmf_S!3GBp-a}9%A0~@1iX~P8 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 LNkvXXu0mjf)V5Zl