From a2c06ce752c44ec2f97f9d56700224b33b75f3fb Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 9 Feb 2026 22:47:41 +0100 Subject: [PATCH] goober johnson --- .../java/com/hbm/crafting/WeaponRecipes.java | 1 + src/main/java/com/hbm/items/ModItems.java | 2 + .../sedna/factory/GunFactoryClient.java | 2 + .../weapon/sedna/factory/Orchestras.java | 37 ++++ .../weapon/sedna/factory/XFactory22lr.java | 59 ++++- .../sedna/hud/HUDComponentAmmoCounter.java | 2 +- .../weapon/sedna/mods/XWeaponModManager.java | 6 +- .../java/com/hbm/main/ResourceManager.java | 2 + .../item/weapon/sedna/ItemRenderStarF.java | 209 ++++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + src/main/resources/assets/hbm/sounds.json | 1 + .../hbm/sounds/weapon/fire/pistolLight.ogg | Bin 0 -> 10865 bytes 13 files changed, 320 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java create mode 100644 src/main/resources/assets/hbm/sounds/weapon/fire/pistolLight.ogg diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index e597fec39..e55644712 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -77,6 +77,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_uzi_akimbo, 1), new Object[] { "UMU", 'U', ModItems.gun_uzi, 'M', WEAPONSTEEL.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_spas12, 1), new Object[] { "BRM", "BGS", 'B', DESH.lightBarrel(), 'R', DESH.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', ANY_PLASTIC.grip(), 'S', DESH.stock() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_panzerschreck, 1), new Object[] { "BBB", "PGM", 'B', DESH.heavyBarrel(), 'P', STEEL.plateCast(), 'G', DESH.grip(), 'M', GUNMETAL.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_star_f, 1), new Object[] { "BRM", " G", 'B', WEAPONSTEEL.lightBarrel(), 'R', WEAPONSTEEL.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_g3, 1), new Object[] { "BRM", "WGS", 'B', WEAPONSTEEL.lightBarrel(), 'R', WEAPONSTEEL.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'W', WOOD.grip(), 'G', RUBBER.grip(), 'S', WOOD.stock() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_g3_zebra, 1), new Object[] { " M ", "MPM", " M ", 'M', BIGMT.mechanism(), 'P', ModItems.gun_g3 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_stinger, 1), new Object[] { "BBB", "PGM", 'B', WEAPONSTEEL.heavyBarrel(), 'P', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'G', WEAPONSTEEL.grip(), 'M', WEAPONSTEEL.mechanism() }); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index aee8db4f7..1067d8620 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1406,6 +1406,7 @@ public class ModItems { public static Item gun_uzi_akimbo; public static Item gun_spas12; public static Item gun_panzerschreck; + public static Item gun_star_f; public static Item gun_g3; public static Item gun_g3_zebra; public static Item gun_stinger; @@ -6283,6 +6284,7 @@ public class ModItems { GameRegistry.registerItem(gun_uzi_akimbo, gun_uzi_akimbo.getUnlocalizedName()); GameRegistry.registerItem(gun_spas12, gun_spas12.getUnlocalizedName()); GameRegistry.registerItem(gun_panzerschreck, gun_panzerschreck.getUnlocalizedName()); + GameRegistry.registerItem(gun_star_f, gun_star_f.getUnlocalizedName()); GameRegistry.registerItem(gun_g3, gun_g3.getUnlocalizedName()); GameRegistry.registerItem(gun_g3_zebra, gun_g3_zebra.getUnlocalizedName()); GameRegistry.registerItem(gun_stinger, gun_stinger.getUnlocalizedName()); 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 cf9acc152..1621f0d08 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 @@ -66,6 +66,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_uzi_akimbo, new ItemRenderUziAkimbo()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_spas12, new ItemRenderSPAS12()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_panzerschreck, new ItemRenderPanzerschreck()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_star_f, new ItemRenderStarF()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_g3, new ItemRenderG3(ResourceManager.g3_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_g3_zebra, new ItemRenderG3(ResourceManager.g3_zebra_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_stinger, new ItemRenderStinger()); @@ -263,6 +264,7 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_uzi) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_spas12) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_panzerschreck) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_star_f) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_g3) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_g3_zebra) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_stinger) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); 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 61d19e644..c729c1982 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 @@ -765,6 +765,43 @@ public class Orchestras { } }; + public static BiConsumer ORCHESTRA_STAR_F = (stack, 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 aiming = ItemGunBaseNT.getIsAiming(stack); + + if(type == GunAnimation.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, 0.3125, aiming ? 0 : -0.125, aiming ? 0 : -0.1875D, 0, 0.18, -0.12, 0.01, (float)entity.getRNG().nextGaussian() * 5F, 12.5F + (float)entity.getRNG().nextFloat() * 5F, casing.getName()); + PacketDispatcher.wrapper.sendToAllAround(new MuzzleFlashPacket(entity), new TargetPoint(entity.worldObj.provider.dimensionId, entity.posX, entity.posY, entity.posZ, 100)); + } + } + if(type == GunAnimation.CYCLE_DRY) { + if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.9F); + if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 1.1F); + + } + if(type == GunAnimation.RELOAD) { + if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); + if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); + if(timer == 22) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1.1F); + } + if(type == GunAnimation.JAMMED) { + if(timer == 15) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); + if(timer == 19) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1.1F); + if(timer == 23) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); + if(timer == 27) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1.1F); + } + if(type == GunAnimation.INSPECT) { + if(timer == 7) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1.1F); + } + }; + public static BiConsumer ORCHESTRA_G3 = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java index 718892761..5bffc24ae 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.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.MagazineFullReload; import com.hbm.items.weapon.sedna.mods.XWeaponModManager; +import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; @@ -54,11 +55,23 @@ public class XFactory22lr { .setupStandardFire().recoil(LAMBDA_RECOIL_AM180)) .setupStandardConfiguration() .anim(LAMBDA_AM180_ANIMS).orchestra(Orchestras.ORCHESTRA_AM180) - ).setDefaultAmmo(EnumAmmo.P22_SP, 35).setNameMutator(LAMBDA_NAME_AM180) + ).setDefaultAmmo(EnumAmmo.P22_SP, 35).setNameMutator(LAMBDA_NAME_SILENCED) .setUnlocalizedName("gun_am180"); + + ModItems.gun_star_f = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() + .dura(15 * 25).draw(15).inspect(38).crosshair(Crosshair.CIRCLE).smoke(LAMBDA_SMOKE) + .rec(new Receiver(0) + .dmg(12.5F).delay(5).dry(17).spread(0.01F).reload(40).jam(32).sound("hbm:weapon.fire.pistolLight", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 15).addConfigs(p22_sp, p22_fmj, p22_jhp, p22_ap)) + .offset(1, -0.0625 * 1.5, -0.1875D) + .setupStandardFire().recoil(LAMBDA_RECOIL_STAR_F)) + .setupStandardConfiguration() + .anim(LAMBDA_STAR_F_ANIMS).orchestra(Orchestras.ORCHESTRA_STAR_F) + ).setDefaultAmmo(EnumAmmo.P22_SP, 15).setNameMutator(LAMBDA_NAME_SILENCED) + .setUnlocalizedName("gun_star_f"); } - public static Function LAMBDA_NAME_AM180 = (stack) -> { + public static Function LAMBDA_NAME_SILENCED = (stack) -> { if(XWeaponModManager.hasUpgrade(stack, 0, XWeaponModManager.ID_SILENCER)) return stack.getUnlocalizedName() + "_silenced"; return null; }; @@ -71,6 +84,10 @@ public class XFactory22lr { ItemGunBaseNT.setupRecoil((float) (ctx.getPlayer().getRNG().nextGaussian() * 0.25), (float) (ctx.getPlayer().getRNG().nextGaussian() * 0.25)); }; + public static BiConsumer LAMBDA_RECOIL_STAR_F = (stack, ctx) -> { + ItemGunBaseNT.setupRecoil(2.5F, (float) (ctx.getPlayer().getRNG().nextGaussian() * 0.5)); + }; + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_AM180_ANIMS = (stack, type) -> { if(ClientConfig.GUN_ANIMS_LEGACY.get()) { switch(type) { @@ -109,4 +126,42 @@ public class XFactory22lr { return null; }; + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_STAR_F_ANIMS = (stack, type) -> { + int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory); + switch(type) { + case EQUIP: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_DOWN)); + case CYCLE: return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.125 : -0.5, 15, IType.SIN_DOWN).addPos(0, 0, 0, 35, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.5 : -1, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_UP)) + .addBus("HAMMER", new BusAnimationSequence().addPos(1, 0, 0, 50, IType.SIN_UP).addPos(0, 0, 0, 50, IType.SIN_DOWN)) + .addBus("BULLET", ammo <= 1 ? new BusAnimationSequence().setPos(100, 0, 0) : new BusAnimationSequence().addPos(0, 0, 0, 90).addPos(0, 0.5, 2.25, 50)); + case CYCLE_DRY: return new BusAnimation() + .addBus("HAMMER", new BusAnimationSequence().addPos(1, 0, 0, 50, IType.SIN_UP).hold(450).addPos(0, 0, 0, 50, IType.SIN_DOWN)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.5 : -1, 100, IType.SIN_FULL).hold(100).addPos(0, 0, 0, 75, IType.SIN_UP)) + .addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 600).addPos(-3, 0, 0, 175, IType.SIN_DOWN).addPos(0, 0, 0, 100, IType.SIN_FULL)) + .addBus("BULLET", new BusAnimationSequence().setPos(100, 0, 0)); + case RELOAD: + return new BusAnimation() + .addBus("TILT", new BusAnimationSequence().addPos(-30, 0, 0, 250, IType.SIN_FULL).hold(1500).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -1, 100, IType.SIN_FULL).hold(1125).addPos(0, 0, 0, 100, IType.SIN_UP)) + .addBus("MAG", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, -7, -1.5, 300, IType.SIN_UP).hold(400).addPos(0, 0, 0, 300, IType.SIN_UP)) + .addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(3, 0, 0, 750, IType.SIN_FULL).addPos(-3, 0, 0, 50, IType.SIN_DOWN).addPos(0, 0, 0, 100, IType.SIN_FULL)) + .addBus("TURN", new BusAnimationSequence().addPos(0, 0, 0, 200).addPos(0, 0, 15, 300, IType.SIN_FULL).hold(900).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("BULLET", new BusAnimationSequence().setPos(ammo <= 1 ? 100 : 0, 0, 0).hold(750).setPos(0, 0, 0).hold(750).addPos(0, 0.5, 2.25, 50)); + case JAMMED: return new BusAnimation() + .addBus("TILT", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(-30, 0, 0, 150, IType.SIN_FULL).hold(800).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("TURN", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(0, 0, 25, 150, IType.SIN_FULL).hold(800).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 750).addPos(0, 0, -0.5, 100, IType.SIN_FULL).hold(100).addPos(0, 0, 0, 100, IType.SIN_UP).hold(100).addPos(0, 0, -0.5, 100, IType.SIN_FULL).hold(100).addPos(0, 0, 0, 100, IType.SIN_UP)) + .addBus("BULLET", new BusAnimationSequence().setPos(0, 0.5, 2.25).hold(750).addPos(0, 0.5, 1.25, 100, IType.SIN_FULL).hold(100).addPos(0, 0.5, 2.25, 100, IType.SIN_UP).hold(100).addPos(0, 0.5, 1.25, 100, IType.SIN_FULL).hold(100).addPos(0, 0.5, 2.25, 100, IType.SIN_UP)); + case INSPECT: return new BusAnimation() + .addBus("TILT", new BusAnimationSequence().addPos(-30, 0, 0, 250, IType.SIN_FULL).hold(1500).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("TURN", new BusAnimationSequence().addPos(0, 0, 25, 250, IType.SIN_FULL).hold(1500).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, 0, -0.5, 100, IType.SIN_FULL).hold(1125).addPos(0, 0, 0, 100, IType.SIN_UP)) + .addBus("BULLET", ammo <= 1 ? new BusAnimationSequence().setPos(100, 0, 0) : new BusAnimationSequence().setPos(0, 0.5, 2.25).hold(350).addPos(0, 0.5, 1.25, 100, IType.SIN_FULL).hold(1125).addPos(0, 0.5, 2.25, 100, IType.SIN_UP)); + } + + return null; + }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/hud/HUDComponentAmmoCounter.java b/src/main/java/com/hbm/items/weapon/sedna/hud/HUDComponentAmmoCounter.java index 63d1ac9a0..f36444ca8 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/hud/HUDComponentAmmoCounter.java +++ b/src/main/java/com/hbm/items/weapon/sedna/hud/HUDComponentAmmoCounter.java @@ -41,7 +41,7 @@ public class HUDComponentAmmoCounter implements IHUDComponent { @Override public int getComponentHeight(EntityPlayer player, ItemStack stack){ - return 19; + return 17; } @Override diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java index 25a561aa4..83c48e148 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java @@ -91,6 +91,7 @@ public class XWeaponModManager { ModItems.gun_spas12, ModItems.gun_panzerschreck }; Item[] wsteelGuns = new Item[] { + ModItems.gun_star_f, ModItems.gun_g3, ModItems.gun_g3_zebra, ModItems.gun_stinger, ModItems.gun_chemthrower }; @@ -130,7 +131,7 @@ public class XWeaponModManager { new WeaponModDefinition(EnumModGeneric.BRONZE_DURA).addMod(bronzeGuns, new WeaponModGenericDurability(117)); new WeaponModDefinition(EnumModSpecial.SPEEDLOADER).addMod(ModItems.gun_liberator, new WeaponModLiberatorSpeedloader(200)); - new WeaponModDefinition(EnumModSpecial.SILENCER).addMod(new Item[] {ModItems.gun_am180, ModItems.gun_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_g3, ModItems.gun_amat}, new WeaponModSilencer(ID_SILENCER)); + new WeaponModDefinition(EnumModSpecial.SILENCER).addMod(new Item[] {ModItems.gun_am180, ModItems.gun_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_star_f, ModItems.gun_g3, ModItems.gun_amat}, new WeaponModSilencer(ID_SILENCER)); new WeaponModDefinition(EnumModSpecial.SCOPE).addMod(new Item[] {ModItems.gun_heavy_revolver, ModItems.gun_g3, ModItems.gun_mas36, ModItems.gun_charge_thrower}, new WeaponModScope(ID_SCOPE)); new WeaponModDefinition(EnumModSpecial.SAW) .addMod(new Item[] {ModItems.gun_maresleg, ModItems.gun_double_barrel}, new WeaponModSawedOff(ID_SAWED_OFF)) @@ -176,7 +177,8 @@ public class XWeaponModManager { BulletConfig[] r762 = new BulletConfig[] {XFactory762mm.r762_sp, XFactory762mm.r762_fmj, XFactory762mm.r762_jhp, XFactory762mm.r762_ap, XFactory762mm.r762_du, XFactory762mm.r762_he}; BulletConfig[] bmg50 = new BulletConfig[] {XFactory50.bmg50_sp, XFactory50.bmg50_fmj, XFactory50.bmg50_jhp, XFactory50.bmg50_ap, XFactory50.bmg50_du, XFactory50.bmg50_he}; new WeaponModDefinition(EnumModCaliber.P9) - .addMod(ModItems.gun_henry, new WeaponModCaliber(300, 28, 10F, p9)); + .addMod(ModItems.gun_henry, new WeaponModCaliber(300, 28, 10F, p9)) + .addMod(ModItems.gun_star_f, new WeaponModCaliber(301, 12, 15F, p9)); new WeaponModDefinition(EnumModCaliber.P45) .addMod(ModItems.gun_henry, new WeaponModCaliber(310, 28, 10F, p45)) .addMod(ModItems.gun_greasegun, new WeaponModCaliber(311, 24, 3F, p45)) diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index f67415062..669eaa662 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -913,6 +913,7 @@ public class ResourceManager { public static final IModelCustom uzi = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/uzi.obj")).asVBO(); public static final IModelCustom spas_12 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/spas-12.obj")).asVBO(); public static final IModelCustom panzerschreck = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/panzerschreck.obj")).asVBO(); + public static final IModelCustom star_f = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/star_f.obj")).asVBO(); public static final IModelCustom g3 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/g3.obj")).asVBO(); public static final IModelCustom stinger = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/stinger.obj")).asVBO(); public static final IModelCustom chemthrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chemthrower.obj")).asVBO(); @@ -1037,6 +1038,7 @@ public class ResourceManager { public static final ResourceLocation uzi_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi.png"); public static final ResourceLocation uzi_saturnite_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi_saturnite.png"); public static final ResourceLocation panzerschreck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/panzerschreck.png"); + public static final ResourceLocation star_f_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/star_f.png"); public static final ResourceLocation g3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3.png"); public static final ResourceLocation g3_zebra_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_zebra.png"); public static final ResourceLocation g3_green_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_polymer_green.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java new file mode 100644 index 000000000..93c4a6d90 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java @@ -0,0 +1,209 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.XWeaponModManager; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public class ItemRenderStarF extends ItemRenderWeaponBase { + + @Override + protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } + + @Override + public float getViewFOV(ItemStack stack, float fov) { + float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; + return fov * (1 - aimingProgress * 0.33F); + } + + @Override + public void setupFirstPerson(ItemStack stack) { + GL11.glTranslated(0, 0, 0.875); + + float offset = 0.8F; + standardAimingTransform(stack, + -1.75F * offset, -1.75F * offset, 2.5F * offset, + 0, -7.625 / 8D, 1); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.star_f_tex); + double scale = 0.25D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] hammer = HbmAnimations.getRelevantTransformation("HAMMER"); + double[] tilt = HbmAnimations.getRelevantTransformation("TILT"); + double[] turn = HbmAnimations.getRelevantTransformation("TURN"); + double[] mag = HbmAnimations.getRelevantTransformation("MAG"); + double[] bullet = HbmAnimations.getRelevantTransformation("BULLET"); + double[] slide = HbmAnimations.getRelevantTransformation("SLIDE"); + + GL11.glTranslated(0, -2, -8); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, 2, 8); + + GL11.glTranslated(0, 1, -3); + GL11.glRotated(turn[2], 0, 0, 1); + GL11.glRotated(tilt[0], 1, 0, 0); + GL11.glTranslated(0, -1, 3); + + GL11.glTranslated(0, 0, recoil[2]); + + GL11.glShadeModel(GL11.GL_SMOOTH); + ResourceManager.star_f.renderPart("Gun"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.75, -4.25); + GL11.glRotated(60 * (hammer[0] - 1), 1, 0, 0); + GL11.glTranslated(0, -1.75, 4.25); + ResourceManager.star_f.renderPart("Hammer"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, slide[2] * 2.3125); + ResourceManager.star_f.renderPart("Slide"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(mag[0], mag[1], mag[2]); + ResourceManager.star_f.renderPart("Mag"); + GL11.glTranslated(bullet[0], bullet[1], bullet[2]); + ResourceManager.star_f.renderPart("Bullet"); + GL11.glPopMatrix(); + + if(hasSilencer(stack)) { + GL11.glPushMatrix(); + GL11.glTranslated(0, 2.375, -0.25); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + ResourceManager.uzi.renderPart("Silencer"); + GL11.glPopMatrix(); + + } else { + double smokeScale = 0.5; + + GL11.glPushMatrix(); + GL11.glTranslated(0, 3, 6.125); + GL11.glRotated(90, 0, 1, 0); + GL11.glScaled(smokeScale, smokeScale, smokeScale); + this.renderSmokeNodes(gun.getConfig(stack, 0).smokeNodes, 0.75D); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 3, 6.125); + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + this.renderMuzzleFlash(gun.lastShot[0], 75, 7.5); + GL11.glPopMatrix(); + } + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, -0.25, 1.75); + double scale = 0.75D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + super.setupInv(stack); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(-1, -0.5, 0); + } + + @Override + public void setupModTable(ItemStack stack) { + double scale = -6.25D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, -0.25, -5); + } + + @Override + public void renderModTable(ItemStack stack, int index) { + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.star_f_tex); + ResourceManager.star_f.renderPart("Gun"); + ResourceManager.star_f.renderPart("Slide"); + ResourceManager.star_f.renderPart("Mag"); + ResourceManager.star_f.renderPart("Hammer"); + if(hasSilencer(stack)) { + GL11.glTranslated(0, 2.375, -0.25); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + ResourceManager.uzi.renderPart("Silencer"); + } + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type, Object... data) { + GL11.glEnable(GL11.GL_LIGHTING); + + boolean silenced = hasSilencer(stack); + + if(silenced && type == ItemRenderType.INVENTORY) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -6); + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.star_f_tex); + ResourceManager.star_f.renderPart("Gun"); + ResourceManager.star_f.renderPart("Slide"); + ResourceManager.star_f.renderPart("Mag"); + ResourceManager.star_f.renderPart("Hammer"); + if(silenced) { + GL11.glTranslated(0, 2.375, -0.25); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + ResourceManager.uzi.renderPart("Silencer"); + } + GL11.glShadeModel(GL11.GL_FLAT); + + if(type == ItemRenderType.EQUIPPED && !silenced) { + EntityLivingBase ent = (EntityLivingBase) data[1]; + long shot; + double shotRand = 0; + if(ent == Minecraft.getMinecraft().thePlayer) { + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + shot = gun.lastShot[0]; + shotRand = gun.shotRand; + } else { + shot = ItemRenderWeaponBase.flashMap.getOrDefault(ent, (long) -1); + if(shot < 0) return; + } + + GL11.glPushMatrix(); + GL11.glTranslated(0, 3, 6.25); + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * shotRand, 1, 0, 0); + this.renderMuzzleFlash(shot, 75, 7.5); + GL11.glPopMatrix(); + } + } + + public boolean hasSilencer(ItemStack stack) { + return XWeaponModManager.hasUpgrade(stack, 0, XWeaponModManager.ID_SILENCER); + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 8163182e4..8b6106312 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2224,6 +2224,8 @@ item.gun_pepperbox.name=Bündelrevolver item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Vierfachraketenwerfer item.gun_spas12.name=SPAS-12 +item.gun_star_f.name=Sportpistole +item.gun_star_f_silenced.name=Schallgedämpfte Pistole item.gun_stg77.name=StG 77 item.gun_stinger.name=FIM-92 Stinger item.gun_tau.name=Taukanone diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c1061eeb1..b6cae06c5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3067,6 +3067,8 @@ item.gun_pepperbox.name=Pepperbox item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Quad Rocket Launcher item.gun_spas12.name=SPAS-12 +item.gun_star_f.name=Target Pistol +item.gun_star_f_silenced.name=Silenced Pistol item.gun_stg77.name=StG 77 item.gun_stinger.name=FIM-92 Stinger item.gun_tau.name=Tau Cannon diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 9b2f9d8a7..c9b6efc3a 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -263,6 +263,7 @@ "weapon.fire.stab": {"category": "player", "sounds": ["weapon/fire/stab1", "weapon/fire/stab2"]}, "weapon.fire.grenade": {"category": "player", "sounds": ["weapon/fire/grenade"]}, "weapon.fire.amat": {"category": "player", "sounds": ["weapon/fire/amat"]}, + "weapon.fire.pistolLight": {"category": "player", "sounds": ["weapon/fire/pistolLight"]}, "weapon.reload.boltClose": {"category": "player", "sounds": ["weapon/reload/boltClose"]}, "weapon.reload.boltOpen": {"category": "player", "sounds": ["weapon/reload/boltOpen"]}, diff --git a/src/main/resources/assets/hbm/sounds/weapon/fire/pistolLight.ogg b/src/main/resources/assets/hbm/sounds/weapon/fire/pistolLight.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ba9b6975e158181961913fff69bca1d2ba20bbf6 GIT binary patch literal 10865 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 T=YmFDl#znJdW|U%*AVzWfOYed literal 0 HcmV?d00001