From 9f0fd19ef88de13ab9a16e610f781dff9018a403 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 20 Mar 2025 22:57:39 +0100 Subject: [PATCH] the good shit --- .../container/ContainerWeaponTable.java | 1 + .../com/hbm/items/weapon/sedna/Receiver.java | 4 +- .../weapon/sedna/factory/Orchestras.java | 5 +- .../weapon/sedna/factory/XFactory44.java | 1 + .../weapon/sedna/mods/WeapnModG3SawedOff.java | 33 ++++++++ .../weapon/sedna/mods/WeaponModChoke.java | 19 +++++ .../weapon/sedna/mods/WeaponModGreasegun.java | 50 +++++++++++ .../sedna/mods/WeaponModMASBayonet.java | 78 ++++++++++++++++++ .../weapon/sedna/mods/WeaponModManager.java | 34 ++++++++ .../sedna/mods/WeaponModMinigunSpeedup.java | 19 +++++ .../mods/WeaponModPanzerschreckSawedOff.java | 49 +++++++++++ .../sedna/mods/WeaponModPolymerFurniture.java | 27 ++++++ .../weapon/sedna/mods/WeaponModSawedOff.java | 30 +++++++ .../weapon/sedna/mods/WeaponModScope.java | 23 ++++++ .../sedna/mods/WeaponModShredderSpeedup.java | 19 +++++ .../weapon/sedna/mods/WeaponModSilencer.java | 22 +++++ .../weapon/sedna/mods/WeaponModSlowdown.java | 19 +++++ .../java/com/hbm/main/ResourceManager.java | 3 + .../weapon/sedna/ItemRenderDoubleBarrel.java | 3 +- .../item/weapon/sedna/ItemRenderG3.java | 38 +++++++-- .../weapon/sedna/ItemRenderGreasegun.java | 9 +- .../weapon/sedna/ItemRenderHeavyRevolver.java | 9 +- .../item/weapon/sedna/ItemRenderMAS36.java | 41 ++++++--- .../item/weapon/sedna/ItemRenderMaresleg.java | 3 +- .../weapon/sedna/ItemRenderPanzerschreck.java | 9 +- .../item/weapon/sedna/ItemRenderUzi.java | 70 ++++++++++++---- .../weapon/sedna/ItemRenderUziAkimbo.java | 67 ++++++++++----- .../assets/hbm/sounds/weapon/fire/stab1.ogg | Bin 0 -> 9065 bytes .../assets/hbm/sounds/weapon/fire/stab2.ogg | Bin 0 -> 7728 bytes .../{g3_polymer.png => g3_polymer_green.png} | Bin .../hbm/textures/models/weapons/uzi.png | Bin 5161 -> 5107 bytes 31 files changed, 611 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeapnModG3SawedOff.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModChoke.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModGreasegun.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMASBayonet.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMinigunSpeedup.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPanzerschreckSawedOff.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPolymerFurniture.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSawedOff.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModScope.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModShredderSpeedup.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSilencer.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSlowdown.java create mode 100644 src/main/resources/assets/hbm/sounds/weapon/fire/stab1.ogg create mode 100644 src/main/resources/assets/hbm/sounds/weapon/fire/stab2.ogg rename src/main/resources/assets/hbm/textures/models/weapons/{g3_polymer.png => g3_polymer_green.png} (100%) diff --git a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java index 4196b792c..d4528cac9 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java @@ -85,6 +85,7 @@ public class ContainerWeaponTable extends Container { public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { if(mode == 999_999) { + if(player.worldObj.isRemote) return null; ItemStack stack = gun.getStackInSlot(0); if(stack != null && stack.getItem() instanceof ItemGunBaseNT) { int configs = ((ItemGunBaseNT) stack.getItem()).getConfigCount(); diff --git a/src/main/java/com/hbm/items/weapon/sedna/Receiver.java b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java index b87515a1a..ab9b74f83 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/Receiver.java +++ b/src/main/java/com/hbm/items/weapon/sedna/Receiver.java @@ -23,7 +23,7 @@ public class Receiver { public static final String I_DELAYAFTERFIRE = "I_DELAYAFTERFIRE"; public static final String I_DELAYAFTERDRYFIRE = "I_DELAYAFTERDRYFIRE"; public static final String I_ROUNDSPERCYCLE = "I_ROUNDSPERCYCLE"; - public static final String F_SPRADINNATE = "F_SPRADINNATE"; + public static final String F_SPREADINNATE = "F_SPREADINNATE"; public static final String F_SPREADAMMO = "F_SPREADAMMO"; public static final String F_SPREADHIPFIRE = "F_SPREADHIPFIRE"; public static final String F_SPREADDURABILITY = "F_SPREADDURABILITY"; @@ -90,7 +90,7 @@ public class Receiver { public int getDelayAfterFire(ItemStack stack) { return WeaponModManager.eval(this.delayAfterFire_DNA, stack, I_DELAYAFTERFIRE, this, parent.index); } public int getDelayAfterDryFire(ItemStack stack) { return WeaponModManager.eval(this.delayAfterDryFire_DNA, stack, I_DELAYAFTERDRYFIRE, this, parent.index); } public int getRoundsPerCycle(ItemStack stack) { return WeaponModManager.eval(this.roundsPerCycle_DNA, stack, I_ROUNDSPERCYCLE, this, parent.index); } - public float getInnateSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadInnate_DNA, stack, F_SPRADINNATE, this, parent.index); } + public float getInnateSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadInnate_DNA, stack, F_SPREADINNATE, this, parent.index); } public float getAmmoSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadMultAmmo_DNA, stack, F_SPREADAMMO, this, parent.index); } public float getHipfireSpread(ItemStack stack) { return WeaponModManager.eval(this.spreadPenaltyHipfire_DNA, stack, F_SPREADHIPFIRE, this, parent.index); } public float getDurabilitySpread(ItemStack stack) { return WeaponModManager.eval(this.spreadDurability_DNA, stack, F_SPREADDURABILITY, this, parent.index); } 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 626338018..777748869 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 @@ -9,6 +9,7 @@ import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.impl.ItemGunStinger; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.mags.IMagazine; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; @@ -922,7 +923,7 @@ public class Orchestras { 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.5, aiming ? -0.125 : -0.25, aiming ? -0.25 : -0.5D, 0, 0.18, -0.12, 0.01, (float)entity.getRNG().nextGaussian() * 15F, (float)entity.getRNG().nextGaussian() * 15F, casing.getName()); } - if(timer == 1) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverSpin", 1F, 0.75F); + if(timer == (WeaponModManager.hasUpgrade(stack, 0, 207) ? 3 : 1)) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverSpin", 1F, 0.75F); } if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.75F); @@ -1312,7 +1313,7 @@ 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); + boolean aiming = ItemGunBaseNT.getIsAiming(stack) && !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_SCOPE); if(type == AnimType.EQUIP) { if(timer == 10) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.openLatch", 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 11bb0b7dc..2855016ec 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 @@ -150,6 +150,7 @@ public class XFactory44 { public static BiConsumer SMACK_A_FUCKER = (stack, ctx) -> { if(ItemGunBaseNT.getState(stack, ctx.configIndex) == GunState.IDLE || ItemGunBaseNT.getLastAnim(stack, ctx.configIndex) == AnimType.CYCLE) { + ItemGunBaseNT.setIsAiming(stack, false); ItemGunBaseNT.setState(stack, ctx.configIndex, GunState.DRAWING); ItemGunBaseNT.setTimer(stack, ctx.configIndex, ctx.config.getInspectDuration(stack)); ItemGunBaseNT.playAnimation(ctx.getPlayer(), stack, AnimType.INSPECT, ctx.configIndex); diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeapnModG3SawedOff.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeapnModG3SawedOff.java new file mode 100644 index 000000000..ce7a202e6 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeapnModG3SawedOff.java @@ -0,0 +1,33 @@ +package com.hbm.items.weapon.sedna.mods; + +import java.util.function.BiFunction; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.factory.XFactory556mm; +import com.hbm.render.anim.BusAnimation; +import com.hbm.render.anim.BusAnimationSequence; +import com.hbm.render.anim.BusAnimationKeyframe.IType; +import com.hbm.render.anim.HbmAnimations.AnimType; + +import net.minecraft.item.ItemStack; + +public class WeapnModG3SawedOff extends WeaponModBase { + + public WeapnModG3SawedOff(int id) { + super(id, "SHIELD"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.I_DRAWDURATION) return cast(5, base); + if(key == GunConfig.FUN_ANIMNATIONS) return (T) LAMBDA_G3_ANIMS; + return base; + } + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_G3_ANIMS = (stack, type) -> { + switch(type) { + case EQUIP: return new BusAnimation().addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 250, IType.SIN_FULL)); + } + return XFactory556mm.LAMBDA_G3_ANIMS.apply(stack, type); + }; +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModChoke.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModChoke.java new file mode 100644 index 000000000..85820fa4a --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModChoke.java @@ -0,0 +1,19 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModChoke extends WeaponModBase { + + public WeaponModChoke(int id) { + super(id, "BARREL"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_SPREADAMMO) { return cast((Float) base * 0.5F, base); } + + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModGreasegun.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModGreasegun.java new file mode 100644 index 000000000..60ffeff59 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModGreasegun.java @@ -0,0 +1,50 @@ +package com.hbm.items.weapon.sedna.mods; + +import java.util.function.BiConsumer; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; +import com.hbm.items.weapon.sedna.factory.Orchestras; +import com.hbm.particle.SpentCasing; +import com.hbm.particle.helper.CasingCreator; +import com.hbm.render.anim.HbmAnimations.AnimType; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public class WeaponModGreasegun extends WeaponModBase { + + public WeaponModGreasegun(int id) { + super(id, "FURNITURE"); + this.setPriority(PRIORITY_ADDITIVE); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.F_DURABILITY) return cast((Float) base * 3F, base); + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base + 2F, base); + if(key == Receiver.F_SPREADINNATE) return cast(0F, base); + if(key == Receiver.I_DELAYAFTERFIRE) return cast((Integer) base / 2, base); + if(key == GunConfig.CON_ORCHESTRA) return (T) ORCHESTRA_GREASEGUN; + return base; + } + + public static BiConsumer ORCHESTRA_GREASEGUN = (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.55, aiming ? 0 : -0.125, aiming ? 0 : -0.25D, 0, 0.18, -0.12, 0.01, -7.5F + (float)entity.getRNG().nextGaussian() * 5F, 12F + (float)entity.getRNG().nextGaussian() * 5F, casing.getName()); + } + return; + } + Orchestras.ORCHESTRA_GREASEGUN.accept(stack, ctx); + }; +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMASBayonet.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMASBayonet.java new file mode 100644 index 000000000..74c14c653 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMASBayonet.java @@ -0,0 +1,78 @@ +package com.hbm.items.weapon.sedna.mods; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; +import com.hbm.items.weapon.sedna.factory.Orchestras; +import com.hbm.items.weapon.sedna.factory.XFactory44; +import com.hbm.items.weapon.sedna.factory.XFactory762mm; +import com.hbm.render.anim.BusAnimation; +import com.hbm.render.anim.BusAnimationSequence; +import com.hbm.render.anim.BusAnimationKeyframe.IType; +import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.util.EntityDamageUtil; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; + +public class WeaponModMASBayonet extends WeaponModBase { + + public WeaponModMASBayonet(int id) { + super(id, "BAYONET"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.FUN_ANIMNATIONS) return (T) LAMBDA_MAS36_ANIMS; + if(key == GunConfig.I_INSPECTDURATION) return cast(30, base); + if(key == GunConfig.CON_ONPRESSSECONDARY) return (T) XFactory44.SMACK_A_FUCKER; + if(key == GunConfig.CON_ORCHESTRA) return (T) ORCHESTRA_MAS36; + if(key == GunConfig.I_INSPECTCANCEL) return cast(false, base); + return base; + } + + public static BiConsumer ORCHESTRA_MAS36 = (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); + + if(type == AnimType.INSPECT) { + + if(timer == 15 && ctx.getPlayer() != null) { + MovingObjectPosition mop = EntityDamageUtil.getMouseOver(ctx.getPlayer(), 3.0D); + if(mop != null) { + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + float damage = 10F; + mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage(ctx.getPlayer()), damage); + mop.entityHit.motionX *= 2; + mop.entityHit.motionZ *= 2; + entity.worldObj.playSoundAtEntity(mop.entityHit, "hbm:weapon.fire.stab", 1F, 0.9F + entity.getRNG().nextFloat() * 0.2F); + } + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + Block b = entity.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); + entity.worldObj.playSoundEffect(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, b.stepSound.getStepResourcePath(), 2F, 0.9F + entity.getRNG().nextFloat() * 0.2F); + } + } + } + return; + } + + Orchestras.ORCHESTRA_MAS36.accept(stack, ctx); + }; + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_MAS36_ANIMS = (stack, type) -> { + switch(type) { + case INSPECT: return new BusAnimation() + .addBus("STAB", new BusAnimationSequence().addPos(0, 1, -2, 250, IType.SIN_DOWN).hold(250).addPos(0, 1, 5, 250, IType.SIN_UP).hold(250).addPos(0, 0, 0, 500, IType.SIN_FULL)); + } + + return XFactory762mm.LAMBDA_MAS36_ANIMS.apply(stack, type); + }; +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index 066b55969..0ddc74d47 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -112,7 +112,32 @@ public class WeaponModManager { 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_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_g3}, new WeaponModSilencer(ID_SILENCER)); + new WeaponModDefinition(EnumModSpecial.SCOPE).addMod(new Item[] {ModItems.gun_heavy_revolver, ModItems.gun_g3, ModItems.gun_mas36}, new WeaponModScope(ID_SCOPE)); + new WeaponModDefinition(EnumModSpecial.SAW) + .addMod(new Item[] {ModItems.gun_maresleg, ModItems.gun_double_barrel}, new WeaponModSawedOff(ID_SAWED_OFF)) + .addMod(ModItems.gun_panzerschreck, new WeaponModPanzerschreckSawedOff(ID_NO_SHIELD)) + .addMod(ModItems.gun_g3, new WeapnModG3SawedOff(ID_NO_STOCK)); + new WeaponModDefinition(EnumModSpecial.GREASEGUN).addMod(ModItems.gun_greasegun, new WeaponModGreasegun(ID_GREASEGUN_CLEAN)); + new WeaponModDefinition(EnumModSpecial.SLOWDOWN).addMod(ModItems.gun_minigun, new WeaponModSlowdown(207)); + new WeaponModDefinition(EnumModSpecial.SPEEDUP) + .addMod(ModItems.gun_minigun, new WeaponModMinigunSpeedup(208)) + .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); + new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12}, new WeaponModChoke(210)); + new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); + new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); + new WeaponModDefinition(EnumModSpecial.BAYONET).addMod(ModItems.gun_mas36, new WeaponModMASBayonet(ID_MAS_BAYONET)); } + + public static final int ID_SILENCER = 201; + public static final int ID_SCOPE = 202; + public static final int ID_SAWED_OFF = 203; + public static final int ID_NO_SHIELD = 204; + public static final int ID_NO_STOCK = 205; + public static final int ID_GREASEGUN_CLEAN = 206; + public static final int ID_FURNITURE_GREEN = 211; + public static final int ID_FURNITURE_BLACK = 212; + public static final int ID_MAS_BAYONET = 213; public static ItemStack[] getUpgradeItems(ItemStack stack, int cfg) { if(!stack.hasTagCompound()) return new ItemStack[0]; @@ -129,6 +154,15 @@ public class WeaponModManager { return mods; } + public static boolean hasUpgrade(ItemStack stack, int cfg, int id) { + if(!stack.hasTagCompound()) return false; + int[] modIds = stack.stackTagCompound.getIntArray(KEY_MOD_LIST + cfg); + for(int i = 0; i < modIds.length; i++) { + if(modIds[i] == id) return true; + } + return false; + } + /** Installs the supplied mods to the gun */ public static void install(ItemStack stack, int cfg, ItemStack... mods) { List toInstall = new ArrayList(); diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMinigunSpeedup.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMinigunSpeedup.java new file mode 100644 index 000000000..131c4cb9a --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModMinigunSpeedup.java @@ -0,0 +1,19 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModMinigunSpeedup extends WeaponModBase { + + public WeaponModMinigunSpeedup(int id) { + super(id, "SPEED"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.I_ROUNDSPERCYCLE) return cast((Integer) base * 3, base); + if(key == Receiver.F_SPREADINNATE) return cast((Float) base * 1.5F, base); + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPanzerschreckSawedOff.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPanzerschreckSawedOff.java new file mode 100644 index 000000000..7e45dfaa6 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPanzerschreckSawedOff.java @@ -0,0 +1,49 @@ +package com.hbm.items.weapon.sedna.mods; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; + +import com.hbm.extprop.HbmLivingProps; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; +import com.hbm.items.weapon.sedna.factory.Lego; +import com.hbm.items.weapon.sedna.factory.XFactoryRocket; +import com.hbm.render.anim.BusAnimation; +import com.hbm.render.anim.BusAnimationSequence; +import com.hbm.render.anim.BusAnimationKeyframe.IType; +import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.util.EntityDamageUtil; +import com.hbm.util.DamageResistanceHandler.DamageClass; + +import net.minecraft.item.ItemStack; + +public class WeaponModPanzerschreckSawedOff extends WeaponModBase { + + public WeaponModPanzerschreckSawedOff(int id) { + super(id, "SHIELD"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.I_DRAWDURATION) return cast(5, base); + if(key == Receiver.CON_ONFIRE) { return (T) LAMBDA_FIRE; } + return base; + } + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_PANZERSCHRECK_ANIMS = (stack, type) -> { + switch(type) { + case EQUIP: return new BusAnimation().addBus("EQUIP", new BusAnimationSequence().addPos(60, 0, 0, 0).addPos(0, 0, 0, 250, IType.SIN_DOWN)); + } + return XFactoryRocket.LAMBDA_PANZERSCHRECK_ANIMS.apply(stack, type); + }; + + public static BiConsumer LAMBDA_FIRE = (stack, ctx) -> { + Lego.LAMBDA_STANDARD_FIRE.accept(stack, ctx); + if(ctx.entity != null) { + HbmLivingProps.getData(ctx.entity).fire += 100; + EntityDamageUtil.attackEntityFromNT(ctx.entity, BulletConfig.getDamage(ctx.entity, ctx.entity, DamageClass.FIRE), 4F, true, false, 0F, 0F, 0F); + } + }; +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPolymerFurniture.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPolymerFurniture.java new file mode 100644 index 000000000..5961dfe2c --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModPolymerFurniture.java @@ -0,0 +1,27 @@ +package com.hbm.items.weapon.sedna.mods; + +import java.util.function.BiConsumer; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; + +import net.minecraft.item.ItemStack; + +public class WeaponModPolymerFurniture extends WeaponModBase { + + public WeaponModPolymerFurniture(int id) { + super(id, "FURNITURE"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.CON_ONRECOIL) return (T) LAMBDA_RECOIL_G3; + return base; + } + + public static BiConsumer LAMBDA_RECOIL_G3 = (stack, ctx) -> { + ItemGunBaseNT.setupRecoil((float) (ctx.getPlayer().getRNG().nextGaussian() * 0.125), (float) (ctx.getPlayer().getRNG().nextGaussian() * 0.125)); + }; + +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSawedOff.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSawedOff.java new file mode 100644 index 000000000..95f9b5f23 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSawedOff.java @@ -0,0 +1,30 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.factory.XFactory12ga; + +import net.minecraft.item.ItemStack; + +public class WeaponModSawedOff extends WeaponModBase { + + public WeaponModSawedOff(int id) { + super(id, "BARREL"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + + if(key == Receiver.F_SPREADINNATE) { return cast(Math.max(0.025F, (Float) base), base); } + if(key == Receiver.F_SPREADAMMO) { return cast((Float) base * 1.5F, base); } + if(key == Receiver.F_BASEDAMAGE) { return cast((Float) base * 1.35F, base); } + + if(gun.getItem() == ModItems.gun_maresleg) { + if(key == GunConfig.FUN_ANIMNATIONS) return (T) XFactory12ga.LAMBDA_MARESLEG_SHORT_ANIMS; + if(key == GunConfig.I_DRAWDURATION) return cast(5, base); + } + + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModScope.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModScope.java new file mode 100644 index 000000000..e9e0abcbb --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModScope.java @@ -0,0 +1,23 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.factory.XFactory44; + +import net.minecraft.item.ItemStack; + +public class WeaponModScope extends WeaponModBase { + + public WeaponModScope(int id) { + super(id, "SCOPE"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + + if(key == GunConfig.O_SCOPETEXTURE) { + return (T) XFactory44.scope_lilmac; + } + + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModShredderSpeedup.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModShredderSpeedup.java new file mode 100644 index 000000000..fd34cb64b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModShredderSpeedup.java @@ -0,0 +1,19 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModShredderSpeedup extends WeaponModBase { + + public WeaponModShredderSpeedup(int id) { + super(id, "SPEED"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.I_DELAYAFTERFIRE) return cast((Integer) base / 2, base); + if(key == Receiver.I_DELAYAFTERDRYFIRE) return cast((Integer) base / 2, base); + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSilencer.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSilencer.java new file mode 100644 index 000000000..49c413883 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSilencer.java @@ -0,0 +1,22 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModSilencer extends WeaponModBase { + + public WeaponModSilencer(int id) { + super(id, "SILENCER"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + + if(key == Receiver.S_FIRESOUND) { + return (T) "hbm:weapon.fire.silenced"; + } + + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSlowdown.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSlowdown.java new file mode 100644 index 000000000..bb1919dd7 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModSlowdown.java @@ -0,0 +1,19 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModSlowdown extends WeaponModBase { + + public WeaponModSlowdown(int id) { + super(id, "SPEED"); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.I_DELAYAFTERFIRE) return cast((Integer) base * 2, base); + if(key == Receiver.F_SPREADINNATE) return cast(0F, base); + return base; + } +} diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index d0829625e..3b90bdf37 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -942,6 +942,7 @@ public class ResourceManager { public static final ResourceLocation henry_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/henry.png"); public static final ResourceLocation henry_lincoln_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/henry_lincoln.png"); public static final ResourceLocation greasegun_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/greasegun.png"); + public static final ResourceLocation greasegun_clean_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/greasegun_clean.png"); public static final ResourceLocation maresleg_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/maresleg.png"); public static final ResourceLocation maresleg_broken_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/maresleg_broken.png"); public static final ResourceLocation flaregun_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/flaregun.png"); @@ -959,6 +960,8 @@ public class ResourceManager { public static final ResourceLocation uzi_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi.png"); public static final ResourceLocation panzerschreck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/panzerschreck.png"); public static final ResourceLocation g3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3.png"); + public static final ResourceLocation g3_green_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_polymer_green.png"); + public static final ResourceLocation g3_black_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_polymer_black.png"); public static final ResourceLocation shredder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder.png"); public static final ResourceLocation shredder_orig_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder_orig.png"); public static final ResourceLocation sexy_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java index 1b5612bc4..1102a81c6 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderDoubleBarrel.java @@ -4,6 +4,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -172,6 +173,6 @@ public class ItemRenderDoubleBarrel extends ItemRenderWeaponBase { } public boolean isSawedOff(ItemStack stack) { - return stack.getItem() == ModItems.gun_double_barrel_sacred_dragon; + return stack.getItem() == ModItems.gun_double_barrel_sacred_dragon || WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_SAWED_OFF); } } 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 e5e34b83d..c68b2c560 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 @@ -3,11 +3,13 @@ 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.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; public class ItemRenderG3 extends ItemRenderWeaponBase { @@ -34,7 +36,7 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { public void renderFirstPerson(ItemStack stack) { ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.g3_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(getTexture(stack)); double scale = 0.375D; GL11.glScaled(scale, scale, scale); @@ -60,7 +62,7 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.g3.renderPart("Rifle"); - ResourceManager.g3.renderPart("Stock"); + if(hasStock(stack)) ResourceManager.g3.renderPart("Stock"); ResourceManager.g3.renderPart("Flash_Hider"); ResourceManager.g3.renderPart("Trigger_Rifle.002"); @@ -122,11 +124,19 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { @Override public void setupInv(ItemStack stack) { super.setupInv(stack); - double scale = 0.875D; - GL11.glScaled(scale, scale, scale); - GL11.glRotated(25, 1, 0, 0); - GL11.glRotated(45, 0, 1, 0); - GL11.glTranslated(-0.5, 0.5, 0); + if(hasStock(stack)) { + double scale = 0.875D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(-0.5, 0.5, 0); + } else { + double scale = 1.125D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(2.5, 0.5, 0); + } } @Override @@ -142,9 +152,9 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.g3_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(getTexture(stack)); ResourceManager.g3.renderPart("Rifle"); - ResourceManager.g3.renderPart("Stock"); + if(hasStock(stack)) ResourceManager.g3.renderPart("Stock"); ResourceManager.g3.renderPart("Magazine"); ResourceManager.g3.renderPart("Flash_Hider"); ResourceManager.g3.renderPart("Bolt"); @@ -159,4 +169,14 @@ public class ItemRenderG3 extends ItemRenderWeaponBase { GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean hasStock(ItemStack stack) { + return !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_NO_STOCK); + } + + public ResourceLocation getTexture(ItemStack stack) { + if(WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_FURNITURE_GREEN)) return ResourceManager.g3_green_tex; + if(WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_FURNITURE_BLACK)) return ResourceManager.g3_black_tex; + return ResourceManager.g3_tex; + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderGreasegun.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderGreasegun.java index cc488ab5f..dbbe9a7c9 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderGreasegun.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderGreasegun.java @@ -3,6 +3,7 @@ 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.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -34,7 +35,7 @@ public class ItemRenderGreasegun extends ItemRenderWeaponBase { public void renderFirstPerson(ItemStack stack) { ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.greasegun_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isRefurbished(stack) ? ResourceManager.greasegun_clean_tex : ResourceManager.greasegun_tex); double scale = 0.375D; GL11.glScaled(scale, scale, scale); @@ -146,8 +147,12 @@ public class ItemRenderGreasegun extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.greasegun_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isRefurbished(stack) ? ResourceManager.greasegun_clean_tex : ResourceManager.greasegun_tex); ResourceManager.greasegun.renderAll(); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean isRefurbished(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_GREASEGUN_CLEAN); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderHeavyRevolver.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderHeavyRevolver.java index 55020e68b..2cf24c68e 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderHeavyRevolver.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderHeavyRevolver.java @@ -4,6 +4,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -116,12 +117,6 @@ public class ItemRenderHeavyRevolver extends ItemRenderWeaponBase { GL11.glTranslated(0.125, 2.5, 0); this.renderGapFlash(gun.lastShot[0]); GL11.glPopMatrix(); - - GL11.glPushMatrix(); - GL11.glTranslated(-9.5, 2.5, 0); - GL11.glRotated(90 * gun.shotRand, 1, 0, 0); - //this.renderMuzzleFlash(gun.lastShot); - GL11.glPopMatrix(); } @Override @@ -181,6 +176,6 @@ public class ItemRenderHeavyRevolver extends ItemRenderWeaponBase { } public boolean isScoped(ItemStack stack) { - return stack.getItem() == ModItems.gun_heavy_revolver_lilmac; + return stack.getItem() == ModItems.gun_heavy_revolver_lilmac || WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_SCOPE); } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java index 5ff2805ca..b43620e10 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java @@ -5,6 +5,7 @@ import java.nio.DoubleBuffer; import org.lwjgl.opengl.GL11; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -20,7 +21,7 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { @Override public float getViewFOV(ItemStack stack, float fov) { float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; - return fov * (1 - aimingProgress * 0.33F); + return fov * (1 - aimingProgress * (isScoped(stack) ? 0.66F : 0.33F)); } @Override @@ -28,18 +29,24 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { GL11.glTranslated(0, 0, 0.875); float offset = 0.8F; - standardAimingTransform(stack, + + if(isScoped(stack)) { + standardAimingTransform(stack, -1.5F * offset, -1.25F * offset, 1.75F * offset, - 0, -4.6825 / 8D, 0.75); - /*standardAimingTransform(stack, - -1.5F * offset, -1.25F * offset, 1.75F * offset, - -0.2, -5.875 / 8D, 1.125);*/ + -0.2, -5.875 / 8D, 1.125); + } else { + standardAimingTransform(stack, + -1.5F * offset, -1.25F * offset, 1.75F * offset, + 0, -4.6825 / 8D, 0.75); + } } private static DoubleBuffer buf = null; @Override public void renderFirstPerson(ItemStack stack) { + boolean isScoped = isScoped(stack); + if(isScoped && ItemGunBaseNT.prevAimingProgress == 1 && ItemGunBaseNT.aimingProgress == 1) return; if(buf == null) buf = GLAllocation.createDirectByteBuffer(8*4).asDoubleBuffer(); ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); @@ -57,16 +64,20 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { double[] showClip = HbmAnimations.getRelevantTransformation("SHOW_CLIP"); double[] clip = HbmAnimations.getRelevantTransformation("CLIP"); double[] bullets = HbmAnimations.getRelevantTransformation("BULLETS"); + double[] stab = HbmAnimations.getRelevantTransformation("STAB"); GL11.glTranslated(0, -3, -3); GL11.glRotated(equip[0], 1, 0, 0); GL11.glRotated(lift[0], 1, 0, 0); GL11.glTranslated(0, 3, 3); + + GL11.glTranslated(stab[0], stab[1], stab[2]); GL11.glTranslated(0, 0, recoil[2]); GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.mas36.renderPart("Gun"); + if(hasBayonet(stack)) ResourceManager.mas36.renderPart("Bayonet"); GL11.glPushMatrix(); GL11.glTranslated(0, 0.3125, -2.125); @@ -88,7 +99,7 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { ResourceManager.mas36.renderPart("Bullet"); GL11.glPopMatrix(); - //ResourceManager.mas36.renderPart("Scope"); + if(isScoped) ResourceManager.mas36.renderPart("Scope"); if(showClip[0] != 0) { GL11.glPushMatrix(); @@ -161,8 +172,8 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { ResourceManager.mas36.renderPart("Gun"); ResourceManager.mas36.renderPart("Stock"); ResourceManager.mas36.renderPart("Bolt"); - //ResourceManager.mas36.renderPart("Scope"); - //ResourceManager.mas36.renderPart("Bayonet"); + if(isScoped(stack)) ResourceManager.mas36.renderPart("Scope"); + if(hasBayonet(stack)) ResourceManager.mas36.renderPart("Bayonet"); GL11.glShadeModel(GL11.GL_FLAT); } @@ -175,9 +186,17 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { ResourceManager.mas36.renderPart("Gun"); ResourceManager.mas36.renderPart("Stock"); ResourceManager.mas36.renderPart("Bolt"); - //ResourceManager.mas36.renderPart("Scope"); + if(isScoped(stack)) ResourceManager.mas36.renderPart("Scope"); GL11.glTranslated(0, -1, -6); - //ResourceManager.mas36.renderPart("Bayonet"); + if(hasBayonet(stack)) ResourceManager.mas36.renderPart("Bayonet"); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean isScoped(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_SCOPE); + } + + public boolean hasBayonet(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_MAS_BAYONET); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMaresleg.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMaresleg.java index e8dfaa091..c6de5ba6c 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMaresleg.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMaresleg.java @@ -4,6 +4,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -170,6 +171,6 @@ public class ItemRenderMaresleg extends ItemRenderWeaponBase { } public boolean getShort(ItemStack stack) { - return stack.getItem() == ModItems.gun_maresleg_broken; + return stack.getItem() == ModItems.gun_maresleg_broken || WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_SAWED_OFF); } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPanzerschreck.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPanzerschreck.java index 6ad4374c6..4d65f4323 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPanzerschreck.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPanzerschreck.java @@ -3,6 +3,7 @@ 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.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -53,7 +54,7 @@ public class ItemRenderPanzerschreck extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.panzerschreck.renderPart("Tube"); - ResourceManager.panzerschreck.renderPart("Shield"); + if(hasShield(stack)) ResourceManager.panzerschreck.renderPart("Shield"); GL11.glPushMatrix(); GL11.glTranslated(rocket[0], rocket[1], rocket[2]); @@ -104,7 +105,11 @@ public class ItemRenderPanzerschreck extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.panzerschreck_tex); ResourceManager.panzerschreck.renderPart("Tube"); - ResourceManager.panzerschreck.renderPart("Shield"); + if(hasShield(stack)) ResourceManager.panzerschreck.renderPart("Shield"); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean hasShield(ItemStack stack) { + return !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_NO_SHIELD); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java index d2bcd93ae..4752e9443 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java @@ -3,6 +3,7 @@ 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.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -65,6 +66,9 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.uzi.renderPart("Gun"); + boolean silenced = hasSilencer(stack, 0); + if(silenced) ResourceManager.uzi.renderPart("Silencer"); + GL11.glPushMatrix(); GL11.glTranslated(0, 0.3125D, -5.75); GL11.glRotated(180 - stockFront[0], 1, 0, 0); @@ -88,23 +92,25 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { if(bullet[0] == 1) ResourceManager.uzi.renderPart("Bullet"); GL11.glPopMatrix(); - double smokeScale = 0.5; - - GL11.glPushMatrix(); - GL11.glTranslated(0, 0.75, 8.5); - 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, 0.75, 8.5); - GL11.glRotated(90, 0, 1, 0); - GL11.glRotated(90 * gun.shotRand, 1, 0, 0); - this.renderMuzzleFlash(gun.lastShot[0], 75, 7.5); - GL11.glPopMatrix(); + if(!silenced) { + double smokeScale = 0.5; + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 8.5); + 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, 0.75, 8.5); + 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 @@ -133,7 +139,7 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { } @Override - public void renderOther(ItemStack stack, ItemRenderType type) { + public void renderModTable(ItemStack stack, int index) { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); @@ -143,6 +149,34 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(hasSilencer(stack, index)) ResourceManager.uzi.renderPart("Silencer"); GL11.glShadeModel(GL11.GL_FLAT); } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + GL11.glEnable(GL11.GL_LIGHTING); + + boolean silenced = hasSilencer(stack, 0); + + if(silenced) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -4); + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + ResourceManager.uzi.renderPart("Gun"); + ResourceManager.uzi.renderPart("StockBack"); + ResourceManager.uzi.renderPart("StockFront"); + ResourceManager.uzi.renderPart("Slide"); + ResourceManager.uzi.renderPart("Magazine"); + if(silenced) ResourceManager.uzi.renderPart("Silencer"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + public boolean hasSilencer(ItemStack stack, int cfg) { + return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java index fa98585e3..68ab84b23 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java @@ -3,6 +3,7 @@ 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.WeaponModManager; import com.hbm.main.ResourceManager; import com.hbm.render.anim.HbmAnimations; @@ -56,7 +57,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { double[] speen = HbmAnimations.getRelevantTransformation("SPEEN", index); GL11.glTranslated(yeet[0], yeet[1], yeet[2]); - GL11.glRotated(speen[0], 0, 0, 1); + GL11.glRotated(speen[0], 0, 0, i); GL11.glTranslated(0, -2, -4); GL11.glRotated(equip[0], 1, 0, 0); @@ -70,6 +71,9 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); ResourceManager.uzi.renderPart(index == 0 ? "GunMirror" : "Gun"); + + boolean silenced = hasSilencer(stack, index); + if(silenced) ResourceManager.uzi.renderPart("Silencer"); GL11.glPushMatrix(); GL11.glTranslated(0, 0.3125D, -5.75); @@ -93,24 +97,26 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { ResourceManager.uzi.renderPart("Magazine"); if(bullet[0] == 1) ResourceManager.uzi.renderPart("Bullet"); GL11.glPopMatrix(); - - double smokeScale = 0.5; - GL11.glPushMatrix(); - GL11.glTranslated(0, 0.75, 8.5); - 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); - - GL11.glPushMatrix(); - GL11.glTranslated(0, 0.75, 8.5); - GL11.glRotated(90, 0, 1, 0); - GL11.glRotated(90 * gun.shotRand, 1, 0, 0); - this.renderMuzzleFlash(gun.lastShot[index], 75, 7.5); - GL11.glPopMatrix(); + if(!silenced) { + double smokeScale = 0.5; + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 8.5); + 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); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 8.5); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + this.renderMuzzleFlash(gun.lastShot[index], 75, 7.5); + GL11.glPopMatrix(); + } GL11.glPopMatrix(); } @@ -156,6 +162,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(hasSilencer(stack, 1)) ResourceManager.uzi.renderPart("Silencer"); GL11.glShadeModel(GL11.GL_FLAT); } @@ -169,6 +176,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(hasSilencer(stack, 0)) ResourceManager.uzi.renderPart("Silencer"); GL11.glShadeModel(GL11.GL_FLAT); } @@ -178,11 +186,12 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_SMOOTH); Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); - ResourceManager.uzi.renderPart(index == 1 ? "GunMirror" : "Gun"); + ResourceManager.uzi.renderPart(index == 0 ? "GunMirror" : "Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(hasSilencer(stack, index)) ResourceManager.uzi.renderPart("Silencer"); GL11.glShadeModel(GL11.GL_FLAT); } @@ -191,6 +200,10 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + + boolean silencer0 = hasSilencer(stack, 1); + boolean silencer1 = hasSilencer(stack, 0); + boolean anySilenced = silencer0 || silencer1; GL11.glPushMatrix(); GL11.glRotated(225, 0, 0, 1); @@ -198,11 +211,17 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glRotated(25, 1, 0, 0); GL11.glRotated(45, 0, 1, 0); GL11.glTranslated(0, 1, 0); + if(anySilenced) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -4); + } ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(silencer0) ResourceManager.uzi.renderPart("Silencer"); GL11.glPopMatrix(); GL11.glTranslated(0, 0, 5); @@ -214,13 +233,23 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glRotated(25, 1, 0, 0); GL11.glRotated(-45, 0, 1, 0); GL11.glTranslated(0, 1, 0); + if(anySilenced) { + double scale = 0.625D; + GL11.glScaled(scale, scale, scale); + GL11.glTranslated(0, 0, -4); + } ResourceManager.uzi.renderPart("GunMirror"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); ResourceManager.uzi.renderPart("Slide"); ResourceManager.uzi.renderPart("Magazine"); + if(silencer1) ResourceManager.uzi.renderPart("Silencer"); GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); } + + public boolean hasSilencer(ItemStack stack, int cfg) { + return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); + } } diff --git a/src/main/resources/assets/hbm/sounds/weapon/fire/stab1.ogg b/src/main/resources/assets/hbm/sounds/weapon/fire/stab1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..da9f6bcc33ef595ac0601fa4c7978b5eb60e1ad1 GIT binary patch literal 9065 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/weapon/fire/stab2.ogg b/src/main/resources/assets/hbm/sounds/weapon/fire/stab2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..03f51118bde77efb4842bf061bb619d73af300e8 GIT binary patch literal 7728 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 WWPFZ%@r1W3M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/g3_polymer.png b/src/main/resources/assets/hbm/textures/models/weapons/g3_polymer_green.png similarity index 100% rename from src/main/resources/assets/hbm/textures/models/weapons/g3_polymer.png rename to src/main/resources/assets/hbm/textures/models/weapons/g3_polymer_green.png diff --git a/src/main/resources/assets/hbm/textures/models/weapons/uzi.png b/src/main/resources/assets/hbm/textures/models/weapons/uzi.png index ad691a7e964cb66c663304bbd0a97bc1f8517a21..0afe8123d3fe38c395b5a5e9c8af3e733f57dd0b 100644 GIT binary patch literal 5107 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 Y^U$4VwFj;l0Rj|cWMHCSrsqufA0Zjo`~Uy| literal 5161 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