From 720fb07b0fe8813799541bc38bd7a1ea0f51d0a1 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 12 Feb 2026 21:25:41 +0100 Subject: [PATCH] brick by brick, suck my dick --- .../java/com/hbm/crafting/WeaponRecipes.java | 1 + src/main/java/com/hbm/items/ModItems.java | 2 + .../sedna/factory/GunFactoryClient.java | 3 + .../weapon/sedna/factory/Orchestras.java | 38 +++ .../weapon/sedna/factory/XFactory22lr.java | 23 +- .../weapon/sedna/mods/XWeaponModManager.java | 7 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../item/weapon/sedna/ItemRenderStarF.java | 43 ++- .../weapon/sedna/ItemRenderStarFAkimbo.java | 293 ++++++++++++++++++ .../TileEntityMachineIndustrialTurbine.java | 51 +++ src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/models/weapons/star_f.png | Bin 6659 -> 4602 bytes .../textures/models/weapons/star_f_elite.png | Bin 0 -> 4468 bytes 14 files changed, 436 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarFAkimbo.java create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/star_f_elite.png diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index e55644712..ef8d2b503 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -78,6 +78,7 @@ public class WeaponRecipes { 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_star_f_akimbo, 1), new Object[] { "UMU", 'U', ModItems.gun_star_f, 'M', BIGMT.mechanism() }); 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 1067d8620..1f364ce9b 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1407,6 +1407,7 @@ public class ModItems { public static Item gun_spas12; public static Item gun_panzerschreck; public static Item gun_star_f; + public static Item gun_star_f_akimbo; public static Item gun_g3; public static Item gun_g3_zebra; public static Item gun_stinger; @@ -6285,6 +6286,7 @@ public class ModItems { 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_star_f_akimbo, gun_star_f_akimbo.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 1621f0d08..2f280d990 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 @@ -67,6 +67,7 @@ public class GunFactoryClient { 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_star_f_akimbo, new ItemRenderStarFAkimbo()); 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()); @@ -307,6 +308,8 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_maresleg_akimbo) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_uzi_akimbo) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY_MIRROR, LegoClient.HUD_COMPONENT_AMMO_MIRROR); ((ItemGunBaseNT) ModItems.gun_uzi_akimbo) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_star_f_akimbo) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY_MIRROR, LegoClient.HUD_COMPONENT_AMMO_MIRROR); + ((ItemGunBaseNT) ModItems.gun_star_f_akimbo) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_minigun_dual) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY_MIRROR, LegoClient.HUD_COMPONENT_AMMO_MIRROR); ((ItemGunBaseNT) ModItems.gun_minigun_dual) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_aberrator_eott) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO_MIRROR); 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 c729c1982..c4c909308 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 @@ -802,6 +802,44 @@ public class Orchestras { } }; + public static BiConsumer ORCHESTRA_STAR_F_AKIMBO = (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) { + int side = ctx.configIndex == 0 ? -1 : 1; + 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 * side, 0, 0.18, -0.12 * side, 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 5bffc24ae..94f15dcd6 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 @@ -69,6 +69,27 @@ public class XFactory22lr { .anim(LAMBDA_STAR_F_ANIMS).orchestra(Orchestras.ORCHESTRA_STAR_F) ).setDefaultAmmo(EnumAmmo.P22_SP, 15).setNameMutator(LAMBDA_NAME_SILENCED) .setUnlocalizedName("gun_star_f"); + + ModItems.gun_star_f_akimbo = new ItemGunBaseNT(WeaponQuality.B_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.25D) + .setupStandardFire().recoil(LAMBDA_RECOIL_STAR_F)) + .pp(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) + .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + .anim(LAMBDA_STAR_F_ANIMS).orchestra(Orchestras.ORCHESTRA_STAR_F_AKIMBO), + 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(1, 15).addConfigs(p22_sp, p22_fmj, p22_jhp, p22_ap)) + .offset(1, -0.0625 * 1.5, -0.25D) + .setupStandardFire().recoil(LAMBDA_RECOIL_STAR_F)) + .ps(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) + .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + .anim(LAMBDA_STAR_F_ANIMS).orchestra(Orchestras.ORCHESTRA_STAR_F_AKIMBO) + ).setDefaultAmmo(EnumAmmo.P9_SP, 30).setUnlocalizedName("gun_star_f_akimbo"); } public static Function LAMBDA_NAME_SILENCED = (stack) -> { @@ -77,7 +98,7 @@ public class XFactory22lr { }; public static BiConsumer LAMBDA_SMOKE = (stack, ctx) -> { - Lego.handleStandardSmoke(ctx.entity, stack, 3000, 0.05D, 1.1D, 0); + Lego.handleStandardSmoke(ctx.entity, stack, 3000, 0.05D, 1.1D, ctx.configIndex); }; public static BiConsumer LAMBDA_RECOIL_AM180 = (stack, ctx) -> { 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 83c48e148..c65d4d64b 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,7 +91,7 @@ public class XWeaponModManager { ModItems.gun_spas12, ModItems.gun_panzerschreck }; Item[] wsteelGuns = new Item[] { - ModItems.gun_star_f, + ModItems.gun_star_f, ModItems.gun_star_f_akimbo, ModItems.gun_g3, ModItems.gun_g3_zebra, ModItems.gun_stinger, ModItems.gun_chemthrower }; @@ -131,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_star_f, 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_star_f_akimbo, 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)) @@ -178,7 +178,8 @@ public class XWeaponModManager { 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_star_f, new WeaponModCaliber(301, 12, 15F, p9)); + .addMod(ModItems.gun_star_f, new WeaponModCaliber(301, 12, 15F, p9)) + .addMod(ModItems.gun_star_f_akimbo, new WeaponModCaliber(302, 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 4f6444ddf..faa76ada0 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1041,6 +1041,7 @@ public class ResourceManager { 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 star_f_elite_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/star_f_elite.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 index 93c4a6d90..7f79b31ef 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarF.java @@ -141,18 +141,7 @@ public class ItemRenderStarF extends ItemRenderWeaponBase { 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); + renderStandardGun(stack); } @Override @@ -167,18 +156,7 @@ public class ItemRenderStarF extends ItemRenderWeaponBase { 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); + renderStandardGun(stack); if(type == ItemRenderType.EQUIPPED && !silenced) { EntityLivingBase ent = (EntityLivingBase) data[1]; @@ -206,4 +184,21 @@ public class ItemRenderStarF extends ItemRenderWeaponBase { public boolean hasSilencer(ItemStack stack) { return XWeaponModManager.hasUpgrade(stack, 0, XWeaponModManager.ID_SILENCER); } + + public void renderStandardGun(ItemStack stack) { + + 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"); + boolean silenced = hasSilencer(stack); + 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); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarFAkimbo.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarFAkimbo.java new file mode 100644 index 000000000..10687a6db --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderStarFAkimbo.java @@ -0,0 +1,293 @@ +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.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public class ItemRenderStarFAkimbo extends ItemRenderWeaponBase { + + @Override public boolean isAkimbo() { return true; } + + @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); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + + float offset = 0.8F; + + for(int i = -1; i <= 1; i += 2) { + int index = i == -1 ? 0 : 1; + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.star_f_elite_tex); + + GL11.glPushMatrix(); + standardAimingTransform(stack, -2F * offset * i, -1.75F * offset, 2.5F * offset, 0, -7.625 / 8D, 1); + + double scale = 0.25D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP", index); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL", index); + double[] hammer = HbmAnimations.getRelevantTransformation("HAMMER", index); + double[] tilt = HbmAnimations.getRelevantTransformation("TILT", index); + double[] turn = HbmAnimations.getRelevantTransformation("TURN", index); + double[] mag = HbmAnimations.getRelevantTransformation("MAG", index); + double[] bullet = HbmAnimations.getRelevantTransformation("BULLET", index); + double[] slide = HbmAnimations.getRelevantTransformation("SLIDE", index); + + 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] * i, 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, index)) { + 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, index).smokeNodes, 0.75D); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + renderMuzzleFlash(gun.shotRand, gun.lastShot[index]); + } + + 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 setupThirdPersonAkimbo(ItemStack stack) { + super.setupThirdPersonAkimbo(stack); + GL11.glTranslated(0, -0.25, 1.75); + double scale = 0.75D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glScaled(1, 1, -1); + GL11.glTranslated(8, 8, 0); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + @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 renderEquipped(ItemStack stack, Object... data) { + renderStandardGun(stack, 1); + if(!hasSilencer(stack, 1)) renderThirdPersonFlash((EntityLivingBase) data[1], stack, 1); + } + + @Override + public void renderEquippedAkimbo(ItemStack stack, EntityLivingBase ent) { + renderStandardGun(stack, 0); + if(!hasSilencer(stack, 0)) renderThirdPersonFlash(ent, stack, 0); + } + + @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_elite_tex); + ResourceManager.star_f.renderPart("Gun"); + ResourceManager.star_f.renderPart("Slide"); + ResourceManager.star_f.renderPart("Mag"); + ResourceManager.star_f.renderPart("Hammer"); + if(hasSilencer(stack, index)) { + 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 renderEntity(ItemStack stack) { + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + boolean anySilenced = hasSilencer(stack, 0) || hasSilencer(stack, 1); + + if(anySilenced) { + GL11.glScaled(0.75, 0.75, 0.75); + } + + GL11.glPushMatrix(); + GL11.glTranslated(-1, 1, 0); + renderStandardGun(stack, 1); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(1, 1, 0); + renderStandardGun(stack, 0); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type, Object... data) { + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + boolean anySilenced = hasSilencer(stack, 0) || hasSilencer(stack, 1); + + GL11.glPushMatrix(); + GL11.glRotated(225, 0, 0, 1); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(0.5, 0, 0); + if(anySilenced) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -4); + } + renderStandardGun(stack, 1); + GL11.glPopMatrix(); + + GL11.glTranslated(0, 0, 5); + + GL11.glPushMatrix(); + GL11.glRotated(225, 0, 0, 1); + GL11.glRotated(-90, 0, 1, 0); + GL11.glRotated(-90, 1, 0, 0); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(-45, 0, 1, 0); + GL11.glTranslated(-0.5, 0, 0); + if(anySilenced) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -4); + } + renderStandardGun(stack, 0); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + } + + public boolean hasSilencer(ItemStack stack, int cfg) { + return XWeaponModManager.hasUpgrade(stack, cfg, XWeaponModManager.ID_SILENCER); + } + + public void renderStandardGun(ItemStack stack, int index) { + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.star_f_elite_tex); + ResourceManager.star_f.renderPart("Gun"); + ResourceManager.star_f.renderPart("Slide"); + ResourceManager.star_f.renderPart("Mag"); + ResourceManager.star_f.renderPart("Hammer"); + boolean silenced = hasSilencer(stack, index); + 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); + } + + public void renderThirdPersonFlash(Entity ent, ItemStack stack, int config) { + + long shot; + double shotRand = 0; + if(ent == Minecraft.getMinecraft().thePlayer) { + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + shot = gun.lastShot[config]; + shotRand = gun.shotRand; + } else { + shot = ItemRenderWeaponBase.flashMap.getOrDefault(ent, (long) -1); + if(shot < 0) return; + } + + renderMuzzleFlash(shotRand, shot); + } + + public void renderMuzzleFlash(double shotRand, long shot) { + + GL11.glPushMatrix(); + GL11.glTranslated(0, 3, 6.125); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * shotRand, 1, 0, 0); + this.renderMuzzleFlash(shot, 75, 7.5); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java index cb0d6aafb..d124daadb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIndustrialTurbine.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import java.io.IOException; +import java.util.Random; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; @@ -10,6 +11,8 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.util.fauxpointtwelve.DirPos; @@ -31,6 +34,9 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im public static double ACCELERATION = 1D / 400D; public long lastPowerTarget = 0; + private AudioWrapper audio; + private float audioDesync; + @Override public String getConfigName() { return "steamturbineIndustrial"; @@ -55,6 +61,9 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im tanks = new FluidTank[2]; tanks[0] = new FluidTank(Fluids.STEAM, inputTankSize); tanks[1] = new FluidTank(Fluids.SPENTSTEAM, outputTankSize); + + Random rand = new Random(); + audioDesync = rand.nextFloat() * 0.05F; } // sets the power target so we know how much this steam type can theoretically make, and increments the spin based on actual throughput @@ -98,6 +107,28 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im this.lastRotor -= 360; this.rotor -= 360; } + + if(this.spin > 0 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 35) { + + float spinNum = (float) Math.min(1F, spin * 2); + float volume = this.getVolume(0.25F + spinNum * 0.75F); + float pitch = 0.5F + spinNum * 0.5F + this.audioDesync; + + if(audio == null) { + audio = MainRegistry.proxy.getLoopedSound("hbm:block.largeTurbineRunning", xCoord + 0.5F, yCoord + 0.5F, zCoord + 0.5F, volume, 20F, pitch, 20); + audio.startSound(); + } + + audio.keepAlive(); + audio.updatePitch(pitch); + audio.updateVolume(volume); + + } else { + if(audio != null) { + audio.stopSound(); + audio = null; + } + } } @Override @@ -117,6 +148,26 @@ public class TileEntityMachineIndustrialTurbine extends TileEntityTurbineBase im @Override public double getEfficiency() { return efficiency; } @Override public boolean doesResizeCompressor() { return true; } + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6c6cd6163..87a180b00 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2225,6 +2225,7 @@ 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_akimbo.name=Sportpistolen item.gun_star_f_silenced.name=Schallgedämpfte Pistole item.gun_stg77.name=StG 77 item.gun_stinger.name=FIM-92 Stinger diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ceda0768c..46b0ec7c6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3068,6 +3068,7 @@ 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_akimbo.name=Target Pistols item.gun_star_f_silenced.name=Silenced Pistol item.gun_stg77.name=StG 77 item.gun_stinger.name=FIM-92 Stinger diff --git a/src/main/resources/assets/hbm/textures/models/weapons/star_f.png b/src/main/resources/assets/hbm/textures/models/weapons/star_f.png index 097efbe833ac49fa97bda30e415eb8c2cd9c3d22..d4f55b7625db4e13b59ecd743e43a5a520aa8179 100644 GIT binary patch literal 4602 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 literal 6659 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 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/star_f_elite.png b/src/main/resources/assets/hbm/textures/models/weapons/star_f_elite.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2486120327a4624cdff6fe83d0a6c697d587d7 GIT binary patch literal 4468 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