From f74ce297f856a76de2e89d92d1d897bfcb261475 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 8 Feb 2025 23:19:33 +0100 Subject: [PATCH 1/2] chromatic aberration --- .../sedna/factory/GunFactoryClient.java | 5 + .../weapon/sedna/factory/LegoClient.java | 3 + .../weapon/sedna/factory/Orchestras.java | 19 ++ .../weapon/sedna/factory/XFactory35800.java | 45 +++- .../java/com/hbm/main/ResourceManager.java | 2 + .../weapon/sedna/ItemRenderAberrator.java | 240 ++++++++++++++++++ .../weapon/sedna/ItemRenderGreasegun.java | 1 - src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../{_yellowwood.obj => aberrator.obj} | 0 src/main/resources/assets/hbm/sounds.json | 1 + .../hbm/sounds/weapon/fire/aberrator.ogg | Bin 0 -> 25409 bytes .../textures/models/weapons/_yellowwood.png | Bin 2373 -> 0 bytes .../hbm/textures/models/weapons/aberrator.png | Bin 0 -> 3642 bytes 14 files changed, 314 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderAberrator.java rename src/main/resources/assets/hbm/models/weapons/{_yellowwood.obj => aberrator.obj} (100%) create mode 100644 src/main/resources/assets/hbm/sounds/weapon/fire/aberrator.ogg delete mode 100644 src/main/resources/assets/hbm/textures/models/weapons/_yellowwood.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/aberrator.png 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 600dfbd19..5dd8785c6 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 @@ -5,6 +5,7 @@ import static com.hbm.items.weapon.sedna.factory.XFactory10ga.*; import static com.hbm.items.weapon.sedna.factory.XFactory12ga.*; import static com.hbm.items.weapon.sedna.factory.XFactory22lr.*; import static com.hbm.items.weapon.sedna.factory.XFactory357.*; +import static com.hbm.items.weapon.sedna.factory.XFactory35800.*; import static com.hbm.items.weapon.sedna.factory.XFactory40mm.*; import static com.hbm.items.weapon.sedna.factory.XFactory44.*; import static com.hbm.items.weapon.sedna.factory.XFactory50.*; @@ -82,6 +83,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_hangman, new ItemRenderHangman()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_aberrator, new ItemRenderAberrator()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); //PROJECTILES @@ -189,6 +191,8 @@ public class GunFactoryClient { folly_sm.setRendererBeam(LegoClient.RENDER_FOLLY); folly_nuke.setRenderer(LegoClient.RENDER_BIG_NUKE); + + p35800.setRendererBeam(LegoClient.RENDER_LASER_WHITE); setRendererBulk(LegoClient.RENDER_GRENADE, shell_normal, shell_explosive, shell_ap, shell_du, shell_w9); //TODO: change the sabots @@ -236,6 +240,7 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_hangman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_bolter) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_folly) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_aberrator) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_double_barrel) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_double_barrel_sacred_dragon) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 10f124031..d59fc4960 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -328,6 +328,9 @@ public class LegoClient { public static BiConsumer RENDER_LASER_PURPLE = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x60, 0x15, 0x80); }; + public static BiConsumer RENDER_LASER_WHITE = (bullet, interp) -> { + renderStandardLaser(bullet, interp, 0x15, 0x15, 0x15); + }; public static void renderStandardLaser(EntityBulletBeamBase bullet, float interp, int r, int g, int b) { 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 998181543..04b141e9c 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 @@ -1284,5 +1284,24 @@ public class Orchestras { if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + boolean aiming = ItemGunBaseNT.getIsAiming(stack); + + if(type == AnimType.RELOAD) { + if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 0.75F); + if(timer == 32) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 0.75F); + if(timer == 42) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.75F); + } + + 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.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D, -0.075, 0.25, 0, 0.01, casing.getName()); + } + } + + if(type == AnimType.CYCLE_DRY) { + if(timer == 1) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.75F); + if(timer == 9) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.75F); + } }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java index 665562be5..0954416eb 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java @@ -11,9 +11,12 @@ import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; +import com.hbm.particle.SpentCasing; +import com.hbm.particle.SpentCasing.CasingType; 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.DamageResistanceHandler.DamageClass; import net.minecraft.item.ItemStack; @@ -23,21 +26,51 @@ public class XFactory35800 { public static void init() { - p35800 = new BulletConfig().setItem(EnumAmmoSecret.P35_800).setupDamageClass(DamageClass.LASER).setBeam().setSpread(0.0F).setLife(5).setRenderRotations(false).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT); + p35800 = new BulletConfig().setItem(EnumAmmoSecret.P35_800).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false) + .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT); ModItems.gun_aberrator = new ItemGunBaseNT(WeaponQuality.SECRET, new GunConfig() - .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE) + .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(50F).delay(8).reload(44).jam(36).sound("hbm:weapon.fire.laser", 1.0F, 1.0F) - .mag(new MagazineFullReload(0, 24).addConfigs(p35800)) + .dmg(50F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) .offset(0.75, -0.0625 * 1.5, -0.1875) - .setupStandardFire()) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE)) .setupStandardConfiguration() .anim(LAMBDA_ABERRATOR).orchestra(Orchestras.ORCHESTRA_ABERRATOR) ).setUnlocalizedName("gun_aberrator"); } @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_ABERRATOR = (stack, type) -> { + boolean aim = ItemGunBaseNT.getIsAiming(stack); + int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, null); + switch(type) { + case EQUIP: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(360, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)) + .addBus("RISE", new BusAnimationSequence().addPos(0, -3, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); + case CYCLE: return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(aim ? -15 : -25, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 500, IType.SIN_FULL)) + .addBus("SIGHT", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(aim ? 5 : 15, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(0, 0, -1.125, 50, IType.SIN_DOWN).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)) + .addBus(ammo <= 1 ? "NULL" : "BULLET", new BusAnimationSequence().addPos(0, 0, 0, 150).addPos(0, 0.375, 1.125, 150, IType.SIN_UP)) + .addBus("HAMMER", new BusAnimationSequence().addPos(45, 0, 0, 50).addPos(-45, 0, -1.125, 50, IType.SIN_DOWN).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)); + case CYCLE_DRY: return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 700).addPos(-5, 0, 0, 100, IType.SIN_FULL).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 550).addPos(0, 0, -1.125, 150, IType.SIN_FULL).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)) + .addBus("HAMMER", new BusAnimationSequence().addPos(45, 0, 0, 50).addPos(45, 0, 0, 500).addPos(-45, 0, -1.125, 150, IType.SIN_FULL).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)); + case RELOAD: return new BusAnimation() + .addBus("ROLL", new BusAnimationSequence().addPos(0, 0, 20, 150, IType.SIN_FULL).addPos(0, 0, 20, 50).addPos(0, 0, -45, 150, IType.SIN_UP).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("MAG", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, -2, 0, 0).addPos(-15, -5, 0, 350).addPos(-15, 0, 0, 0).addPos(-15, 0, 0, 700).addPos(3, 3, 0, 0).addPos(0, -2, 0, 250, IType.SIN_DOWN).addPos(0, -2, 0, 50).addPos(0, 0, 0, 150, IType.SIN_DOWN)) + .addBus("MAGROLL", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, 0, -180, 250).addPos(0, 0, 0, 0)) + .addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 750).addPos(5, 0, 0, 150, IType.SIN_FULL).addPos(-190, 0, 0, 500, IType.SIN_FULL).addPos(-190, 0, 0, 450).addPos(-360, 0, 0, 350, IType.SIN_DOWN).addPos(0, 0, 0, 0)) + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 2350).addPos(-5, 0, 0, 100, IType.SIN_FULL).addPos(0, 0, 0, 250, IType.SIN_FULL)) + .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 2200).addPos(0, 0, -1.125, 150, IType.SIN_FULL).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)) + .addBus("HAMMER", new BusAnimationSequence().addPos(0, 0, 0, 2250).addPos(-45, 0, -1.125, 100, IType.SIN_FULL).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP)) + .addBus("BULLET", new BusAnimationSequence().addPos(ammo > 0 ? 0 : -100, 0, 0, 0).addPos(ammo > 0 ? 0 : -100, 0, 0, 2400).addPos(0, 0, 0, 0).addPos(0, 0.375, 1.125, 150, IType.SIN_UP)); + case INSPECT: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 0).addPos(-720, 0, 0, 1000, IType.SIN_FULL).addPos(-720, 0, 0, 250).addPos(0, 0, 0, 1000, IType.SIN_FULL)); + } + return null; }; } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 010e5e9bf..2decbf76b 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -886,6 +886,7 @@ public class ResourceManager { public static final IModelCustom hangman = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/hangman.obj")).asVBO(); public static final IModelCustom folly = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/folly.obj")).asVBO(); public static final IModelCustom double_barrel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/sacred_dragon.obj")).asVBO(); + public static final IModelCustom aberrator = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/aberrator.obj")).asVBO(); public static final HashMap python_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/python.json")); public static final HashMap cursed_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/cursed.json")); @@ -1034,6 +1035,7 @@ public class ResourceManager { public static final ResourceLocation folly_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/moonlight.png"); public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel.png"); public static final ResourceLocation double_barrel_sacred_dragon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel_sacred_dragon.png"); + public static final ResourceLocation aberrator_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/aberrator.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderAberrator.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderAberrator.java new file mode 100644 index 000000000..307f6fe35 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderAberrator.java @@ -0,0 +1,240 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemRenderAberrator 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, 1); + + float offset = 0.8F; + standardAimingTransform(stack, + -1.0F * offset, -1.25F * offset, 1.25F * offset, + 0, -5.25 / 8D, 0.125); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.aberrator_tex); + double scale = 0.25D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double[] rise = HbmAnimations.getRelevantTransformation("RISE"); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] slide = HbmAnimations.getRelevantTransformation("SLIDE"); + double[] bullet = HbmAnimations.getRelevantTransformation("BULLET"); + double[] hammer = HbmAnimations.getRelevantTransformation("HAMMER"); + double[] roll = HbmAnimations.getRelevantTransformation("ROLL"); + double[] mag = HbmAnimations.getRelevantTransformation("MAG"); + double[] magroll = HbmAnimations.getRelevantTransformation("MAGROLL"); + double[] sight = HbmAnimations.getRelevantTransformation("SIGHT"); + + GL11.glTranslated(0, rise[1], 0); + + GL11.glTranslated(0, 1, -2.25); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, -1, 2.25); + + GL11.glTranslated(0, -1, -4); + GL11.glRotated(recoil[0], 1, 0, 0); + GL11.glTranslated(0, 1, 4); + + GL11.glTranslated(0, 1, 0); + GL11.glRotated(roll[2], 0, 0, 1); + GL11.glTranslated(0, -1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + ResourceManager.aberrator.renderPart("Gun"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2.4375, -1.9375); + GL11.glRotated(sight[0], 1, 0, 0); + GL11.glTranslated(0, -2.4375, 1.9375); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(mag[0], mag[1], mag[2]); + + GL11.glTranslated(0, 1, 0); + GL11.glRotated(magroll[2], 0, 0, 1); + GL11.glTranslated(0, -1, 0); + + ResourceManager.aberrator.renderPart("Magazine"); + GL11.glTranslated(bullet[0], bullet[1], bullet[2]); + ResourceManager.aberrator.renderPart("Bullet"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, slide[2]); + ResourceManager.aberrator.renderPart("Slide"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.25, -3.625); + GL11.glRotated(-45 + hammer[0], 1, 0, 0); + GL11.glTranslated(0, -1.25, 3.625); + ResourceManager.aberrator.renderPart("Hammer"); + GL11.glPopMatrix(); + + double smokeScale = 0.5; + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, 4); + GL11.glRotated(recoil[0], -1, 0, 0); + GL11.glRotated(roll[2], 0, 0, -1); + GL11.glRotated(90, 0, 1, 0); + GL11.glScaled(smokeScale, smokeScale, smokeScale); + this.renderSmokeNodes(gun.getConfig(stack, 0).smokeNodes, 0.5D); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, 4); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + GL11.glScaled(0.75, 0.75, 0.75); + this.renderMuzzleFlash(gun.lastShot[0], 75, 7.5); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, -1.5); + GL11.glScaled(0.5, 0.5, 0.5); + this.renderFireball(gun.lastShot[0]); + GL11.glPopMatrix(); + + Minecraft.getMinecraft().renderEngine.bindTexture(Minecraft.getMinecraft().getTextureManager().getResourceLocation(Items.golden_sword.getSpriteNumber())); + IIcon icon = Items.golden_sword.getIconFromDamage(0); + + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + float minU = icon.getMinU(); + float maxU = icon.getMaxU(); + float minV = icon.getMinV(); + float maxV = icon.getMaxV(); + GL11.glTranslated(0, 2, 4.5); + GL11.glRotated(roll[2], 0, 0, -1); + GL11.glRotated(recoil[0], -1, 0, 0); + GL11.glRotated(equip[0], -1, 0, 0); + GL11.glRotated(System.currentTimeMillis() / 50D % 360D, 0, 0, 1); + + float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; + aimingProgress = Math.min(1F, aimingProgress * 2); + + Tessellator tess = Tessellator.instance; + GL11.glPushMatrix(); + int amount = 16; + for(int i = 0; i < amount; i++) { + GL11.glPushMatrix(); + GL11.glTranslated(0, -1.5 - aimingProgress, 0); + GL11.glRotated(90 * aimingProgress, 1, 0, 0); + GL11.glRotated(-45, 0, 0, 1); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.addVertexWithUV(-0.5, -0.5F, -0.5, maxU, maxV); + tess.addVertexWithUV(0.5F, -0.5F, -0.5, minU, maxV); + tess.addVertexWithUV(0.5F, 0.5F, -0.5, minU, minV); + tess.addVertexWithUV(-0.5, 0.5F, -0.5, maxU, minV); + tess.draw(); + GL11.glPopMatrix(); + GL11.glRotated(360D / amount, 0, 0, 1); + } + GL11.glPopMatrix(); + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, -1, 4); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + super.setupInv(stack); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(-0.5,-1, 0); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.aberrator_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + public static void renderFireball(long lastShot) { + Tessellator tess = Tessellator.instance; + + int flash = 150; + + if(System.currentTimeMillis() - lastShot < flash) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glPushMatrix(); + + double fire = (System.currentTimeMillis() - lastShot) / (double) flash; + double height = 5 * fire; + double length = 10 * fire; + double offset = 1 * fire; + double lengthOffset = -1.125; + Minecraft.getMinecraft().renderEngine.bindTexture(flash_plume); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + + tess.addVertexWithUV(height, -offset, 0, 0, 1); + tess.addVertexWithUV(-height, -offset, 0, 1, 1); + tess.addVertexWithUV(-height, -offset + length, -lengthOffset, 1, 0); + tess.addVertexWithUV(height, -offset + length, -lengthOffset, 0 ,0); + + tess.addVertexWithUV(height, -offset, 0, 0, 1); + tess.addVertexWithUV(-height, -offset, 0, 1, 1); + tess.addVertexWithUV(-height, -offset + length, lengthOffset, 1, 0); + tess.addVertexWithUV(height, -offset + length, lengthOffset, 0 ,0); + + tess.draw(); + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_BLEND); + } + } +} 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 41c7f287d..a04e1de80 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 @@ -121,7 +121,6 @@ public class ItemRenderGreasegun extends ItemRenderWeaponBase { public void setupThirdPerson(ItemStack stack) { super.setupThirdPerson(stack); GL11.glTranslated(0, 1, 3); - } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index d9999ea1c..7e274fdf0 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1197,11 +1197,13 @@ item.ammo_shell.name=240mm Geschoss item.ammo_shell_apfsds_du.name=240mm APFSDS-DU item.ammo_shell_apfsds_t.name=240mm APFSDS-T item.ammo_shell_explosive.name=240mm HE-Geschoss +item.ammo_shell_w9.name=240mm W9-Atomgeschoss item.ammo_secret.bmg50_equestrian.name=.50 BMG Zerstörer item.ammo_secret.folly_nuke.name=Silberne Kugel, Atomar item.ammo_secret.folly_sm.name=Silberne Kugel item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel item.ammo_secret.m44_equestrian.name=.44 Magnum Schädelsprenger +item.ammo_secret.p35_800.name=.35-800 V9 item.ammo_standard.b75.name=.75 Bolzen item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv) item.ammo_standard.b75_inc.name=.75 Bolzen (Brand) @@ -2197,6 +2199,7 @@ item.grenade_smart.name=Smart-Granate item.grenade_strong.name=Verbesserte Handgranate item.grenade_tau.name=Taugranate item.grenade_zomg.name=Negativenergie-Paarvernichtungsgranate +item.gun_aberrator.name=Aberrator item.gun_am180.name=Schallgedämpfte Maschinenpistole item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto-Flinte diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e57d4d3c8..9c4e78f98 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1927,6 +1927,7 @@ item.ammo_secret.folly_nuke.name=Silver Bullet, Nuclear item.ammo_secret.folly_sm.name=Silver Bullet item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot item.ammo_secret.m44_equestrian.name=.44 Magnum Head-Exploder +item.ammo_secret.p35_800.name=.35-800 V9 item.ammo_standard.b75.name=.75 Bolt item.ammo_standard.b75_exp.name=.75 Bolt (Explosive) item.ammo_standard.b75_inc.name=.75 Bolt (Incendiary) @@ -3005,6 +3006,7 @@ item.grenade_tau.name=Tau Grenade item.grenade_zomg.name=Negative Energy Pair Annihilation Grenade item.glyphid_gland.name= Gland item.glyphid_gland_empty.name= Glyphid's Fluid Gland +item.gun_aberrator.name=Aberrator item.gun_am180.name=Silenced Submachine Gun item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto Shotgun diff --git a/src/main/resources/assets/hbm/models/weapons/_yellowwood.obj b/src/main/resources/assets/hbm/models/weapons/aberrator.obj similarity index 100% rename from src/main/resources/assets/hbm/models/weapons/_yellowwood.obj rename to src/main/resources/assets/hbm/models/weapons/aberrator.obj diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 7bb46ab65..46a6d1429 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -249,6 +249,7 @@ "weapon.fire.greaseGun": {"category": "player", "sounds": ["weapon/fire/greaseGun"]}, "weapon.fire.uzi": {"category": "player", "sounds": ["weapon/fire/uzi"]}, "weapon.fire.tesla": {"category": "player", "sounds": ["weapon/fire/tesla"]}, + "weapon.fire.aberrator": {"category": "player", "sounds": ["weapon/fire/aberrator"]}, "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/aberrator.ogg b/src/main/resources/assets/hbm/sounds/weapon/fire/aberrator.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e57ca00534449f432b657a4e5617bd19f42853aa GIT binary patch literal 25409 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 z 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

9aW@d8oYZ;K0 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/_yellowwood.png b/src/main/resources/assets/hbm/textures/models/weapons/_yellowwood.png deleted file mode 100644 index f8cdc0127a86b0577f1c4ccabc7102d8447ba237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 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%0D2`cUir2vO z2imG^#0Vt6KV-q%l(4ZpSJg(_j1%d+pC<%f7`o7Giq36H`2Id(1(7_`)Xz3i zHy6<`g2f|7bHqYx3Tw0Tbog4UA&bWKyRo1OCgT4k^!L{JXBZ@DdBiU*hN^XN=Spjt zoil%M57`f`Yuoz@H%0Q?eMZo(0ybTsin#e&9#znwl~6T+Tu3J2uwya-VHSFJ53~ys zNn&Gp0PKf5poOY+R>pA5*sfIxh#*|Bu{@mw3}k+esyXEYFCa|%*lZ)*vCT99uoqB} zcvQ)Tv8=;ba?nidLd#B{p-N(lujP^XP$y~Uk4_h-5V7p@1P&(^U#J2*J%~24Np3_E_18-rT-?+Q~?q5|uz&H1A#r1ix zvvgAdE5iWu_hHv;16h+erT-5Wyybx#A2p7-_V+l8$CNAP!Y-2*y#EX&3Z zW(o|5=leGMd}_HN`T)MT{1zBVo<71-jV#6LDD7N4lgXs9J)6yHaUVc4`o9oac6*dHCvW_TkBc z;0pF~y*Zd0yZ7QD+9TEZ+H437638rG@5R&Ce?8`YKpN z8DKUcB}WzHljPknUVN{tvZ)4 z+^R}jc8-{_ZhLQjN@f){=g1)OI52h#Z4$`Xpk);a!V?k?VGUWECL|uh8VZ&)A@LA| zCnO$%@Pwjm4p2W&_=3(ug2dy&*ab9p(J-jlMi8Em_ZQ~*FI576YLYAiq`8)*S35kawJR$KA)=*Qe35kawJfVPr161=~Lo1V$ zc$}b6HNivTaeyq(HDq~6JVXFuWx{XU9Me@s;yJSQUTv@Gb3YsY4}=)ob>e8kk^lez M07*qoM6N<$g5L)HF#rGn literal 0 HcmV?d00001 From 5341f5d255980009e2bd5e2504fd727f7517d6e3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 9 Feb 2025 18:38:30 +0100 Subject: [PATCH 2/2] EOTT --- changelog | 7 +- .../java/com/hbm/config/ClientConfig.java | 2 + .../java/com/hbm/items/ItemCustomLore.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 2 + .../sedna/factory/GunFactoryClient.java | 3 + .../weapon/sedna/factory/Orchestras.java | 4 +- .../weapon/sedna/factory/XFactory35800.java | 33 +- .../com/hbm/main/ModEventHandlerClient.java | 25 +- .../java/com/hbm/main/ResourceManager.java | 1 + .../hbm/render/anim/BusAnimationKeyframe.java | 4 +- .../item/weapon/sedna/ItemRenderEOTT.java | 281 ++++++++++++++++++ .../weapon/sedna/ItemRenderWeaponBase.java | 1 + .../TileEntityMachineRotaryFurnace.java | 13 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/models/weapons/aberrator.png | Bin 3642 -> 3642 bytes .../hbm/textures/models/weapons/eott.png | Bin 0 -> 3848 bytes 17 files changed, 370 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderEOTT.java create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/eott.png diff --git a/changelog b/changelog index cd7bbd560..9c2a128f4 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,12 @@ ## Changed * Particle detectors now print an error for when the recipe could not be completed +* Removed "no ore dict data" line from tooltips with extended view enabled +* Added a client config called `GUN_ANIMATION_SPEED` which allows the speed of gun animations to be changed + * Mostly for debugging, since it only applies to the bus animation system, things like smoke trails and muzzle flashes are unaffected ## Fixed * Fixed items being annihilated when shift clicking them into the particle source * Fixed packet optimization not allowing packets to be sent when the day night cycle is halted -* Fixed particle detectors not always using power when they should \ No newline at end of file +* Fixed particle detectors not always using power when they should +* Fixed rotary furnace voiding low pressure steam when dealing with input numbers not divisible by 100 +* Fixed state leak causing smoke from the right akimbo weapon to glow when the first one is fired \ No newline at end of file diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index 9165031d4..4d171cad7 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -32,6 +32,7 @@ public class ClientConfig { public static ConfigWrapper GUN_ANIMS_LEGACY = new ConfigWrapper(false); public static ConfigWrapper GUN_MODEL_FOV = new ConfigWrapper(false); public static ConfigWrapper GUN_VISUAL_RECOIL = new ConfigWrapper(true); + public static ConfigWrapper GUN_ANIMATION_SPEED = new ConfigWrapper(1D); public static ConfigWrapper ITEM_TOOLTIP_SHOW_OREDICT = new ConfigWrapper(true); public static ConfigWrapper ITEM_TOOLTIP_SHOW_CUSTOM_NUKE = new ConfigWrapper(true); public static ConfigWrapper MAIN_MENU_WACKY_SPLASHES = new ConfigWrapper(true); @@ -50,6 +51,7 @@ public class ClientConfig { configMap.put("GUN_ANIMS_LEGACY", GUN_ANIMS_LEGACY); configMap.put("GUN_MODEL_FOV", GUN_MODEL_FOV); configMap.put("GUN_VISUAL_RECOIL", GUN_VISUAL_RECOIL); + configMap.put("GUN_ANIMATION_SPEED", GUN_ANIMATION_SPEED); configMap.put("ITEM_TOOLTIP_SHOW_OREDICT", ITEM_TOOLTIP_SHOW_OREDICT); configMap.put("ITEM_TOOLTIP_SHOW_CUSTOM_NUKE", ITEM_TOOLTIP_SHOW_CUSTOM_NUKE); configMap.put("MAIN_MENU_WACKY_SPLASHES", MAIN_MENU_WACKY_SPLASHES); diff --git a/src/main/java/com/hbm/items/ItemCustomLore.java b/src/main/java/com/hbm/items/ItemCustomLore.java index 10cf5461b..f5ea42970 100644 --- a/src/main/java/com/hbm/items/ItemCustomLore.java +++ b/src/main/java/com/hbm/items/ItemCustomLore.java @@ -109,7 +109,7 @@ public class ItemCustomLore extends Item { @Override public String getItemStackDisplayName(ItemStack stack) { - if(stack.getItem() == ModItems.undefined && stack.getItemDamage() != 99) return ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(stack) + ".name")).trim(); + if(stack.getItem() != ModItems.undefined || stack.getItemDamage() != 99) return ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(stack) + ".name")).trim(); return name.getResult(); } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 2d5e828bc..a1e46e603 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1501,6 +1501,7 @@ public class ModItems { public static Item gun_bolter; public static Item gun_folly; public static Item gun_aberrator; + public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; @@ -6495,6 +6496,7 @@ public class ModItems { GameRegistry.registerItem(gun_bolter, gun_bolter.getUnlocalizedName()); GameRegistry.registerItem(gun_folly, gun_folly.getUnlocalizedName()); GameRegistry.registerItem(gun_aberrator, gun_aberrator.getUnlocalizedName()); + GameRegistry.registerItem(gun_aberrator_eott, gun_aberrator_eott.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.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 5dd8785c6..81daf1584 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 @@ -84,6 +84,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_aberrator, new ItemRenderAberrator()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_aberrator_eott, new ItemRenderEOTT()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); //PROJECTILES @@ -250,6 +251,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_aberrator_eott) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO_MIRROR); + ((ItemGunBaseNT) ModItems.gun_aberrator_eott) .getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_AMMO); } public static void setRendererBulk(BiConsumer renderer, BulletConfig... configs) { for(BulletConfig config : configs) config.setRenderer(renderer); } 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 04b141e9c..505818c44 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 @@ -3,6 +3,7 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import com.hbm.config.ClientConfig; +import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.impl.ItemGunStinger; @@ -1294,8 +1295,9 @@ public class Orchestras { if(type == AnimType.CYCLE) { if(timer == 1) { + int cba = (stack.getItem() == ModItems.gun_aberrator_eott && 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.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D, -0.075, 0.25, 0, 0.01, casing.getName()); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D * cba, -0.075, 0.25, 0, 0.01, casing.getName()); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java index 0954416eb..588f54b0d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java @@ -1,5 +1,6 @@ package com.hbm.items.weapon.sedna.factory; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import com.hbm.items.ModItems; @@ -8,6 +9,7 @@ import com.hbm.items.weapon.sedna.Crosshair; 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.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; @@ -30,16 +32,41 @@ public class XFactory35800 { .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT); ModItems.gun_aberrator = new ItemGunBaseNT(WeaponQuality.SECRET, new GunConfig() - .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(50F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) + .dmg(100F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) .offset(0.75, -0.0625 * 1.5, -0.1875) - .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE)) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .setupStandardConfiguration() .anim(LAMBDA_ABERRATOR).orchestra(Orchestras.ORCHESTRA_ABERRATOR) ).setUnlocalizedName("gun_aberrator"); + + ModItems.gun_aberrator_eott = new ItemGunBaseNT(WeaponQuality.SECRET, + new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) + .offset(0.75, -0.0625 * 1.5, 0.1875) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) + .pp(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) + .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + .anim(LAMBDA_ABERRATOR).orchestra(Orchestras.ORCHESTRA_ABERRATOR), + new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) + .mag(new MagazineFullReload(1, 5).addConfigs(p35800)) + .offset(0.75, -0.0625 * 1.5, -0.1875) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) + .ps(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) + .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + .anim(LAMBDA_ABERRATOR).orchestra(Orchestras.ORCHESTRA_ABERRATOR) + ).setUnlocalizedName("gun_aberrator_eott"); } + + public static BiConsumer LAMBDA_RECOIL_ABERRATOR = (stack, ctx) -> { + ItemGunBaseNT.setupRecoil(10, (float) (ctx.getPlayer().getRNG().nextGaussian() * 1.5)); + }; @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_ABERRATOR = (stack, type) -> { boolean aim = ItemGunBaseNT.getIsAiming(stack); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ce72c3279..3de42e1ca 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -160,6 +160,29 @@ public class ModEventHandlerClient { GL11.glDepthMask(true); return; } + + /*if(event.type == ElementType.CROSSHAIRS && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gun_aberrator) { + int width = event.resolution.getScaledWidth(); + int height = event.resolution.getScaledHeight(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, 1, 0); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.0F); + GL11.glDepthMask(false); + tess.startDrawingQuads(); + float intensity = 0.2F; + tess.setColorRGBA_F(intensity, intensity, intensity, 1F); + tess.addVertex(width, 0, 0); + tess.addVertex(0, 0, 0); + tess.addVertex(0, height, 0); + tess.addVertex(width, height, 0); + tess.draw(); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDepthMask(true); + }*/ /// HANDLE GUN OVERLAYS /// if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemHUD) { @@ -751,8 +774,6 @@ public class ModEventHandlerClient { for(String s : names) { list.add(EnumChatFormatting.AQUA + " -" + s); } - } else { - list.add(EnumChatFormatting.RED + "No Ore Dict data!"); } } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 2decbf76b..14974adb9 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1036,6 +1036,7 @@ public class ResourceManager { public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel.png"); public static final ResourceLocation double_barrel_sacred_dragon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel_sacred_dragon.png"); public static final ResourceLocation aberrator_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/aberrator.png"); + public static final ResourceLocation eott_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/eott.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); diff --git a/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java b/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java index 988a3f552..ce55f00e5 100644 --- a/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java +++ b/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java @@ -1,5 +1,7 @@ package com.hbm.render.anim; +import com.hbm.config.ClientConfig; + //"pieces" that make up a bus public class BusAnimationKeyframe { @@ -84,7 +86,7 @@ public class BusAnimationKeyframe { public BusAnimationKeyframe(double value, int duration) { this(); this.value = value; - this.duration = duration; + this.duration = (int) (duration / Math.max(0.001D, ClientConfig.GUN_ANIMATION_SPEED.get())); } public BusAnimationKeyframe(double value, int duration, IType interpolation) { diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderEOTT.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderEOTT.java new file mode 100644 index 000000000..66580d25c --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderEOTT.java @@ -0,0 +1,281 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; + +public class ItemRenderEOTT 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, 1); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + float offset = 0.8F; + + for(int i = -1; i <= 1; i += 2) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + int index = i == -1 ? 0 : 1; + + GL11.glPushMatrix(); + standardAimingTransform(stack, + -1.0F * offset * i, -1.25F * offset, 1.25F * offset, + 0, -5.25 / 8D, 0.125); + + double scale = 0.25D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP", index); + double[] rise = HbmAnimations.getRelevantTransformation("RISE", index); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL", index); + double[] slide = HbmAnimations.getRelevantTransformation("SLIDE", index); + double[] bullet = HbmAnimations.getRelevantTransformation("BULLET", index); + double[] hammer = HbmAnimations.getRelevantTransformation("HAMMER", index); + double[] roll = HbmAnimations.getRelevantTransformation("ROLL", index); + double[] mag = HbmAnimations.getRelevantTransformation("MAG", index); + double[] magroll = HbmAnimations.getRelevantTransformation("MAGROLL", index); + double[] sight = HbmAnimations.getRelevantTransformation("SIGHT", index); + + GL11.glTranslated(0, rise[1], 0); + + GL11.glTranslated(0, 1, -2.25); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, -1, 2.25); + + GL11.glTranslated(0, -1, -4); + GL11.glRotated(recoil[0], 1, 0, 0); + GL11.glTranslated(0, 1, 4); + + GL11.glTranslated(0, 1, 0); + GL11.glRotated(roll[2] * i, 0, 0, 1); + GL11.glTranslated(0, -1, 0); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + ResourceManager.aberrator.renderPart("Gun"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2.4375, -1.9375); + GL11.glRotated(sight[0], 1, 0, 0); + GL11.glTranslated(0, -2.4375, 1.9375); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(mag[0] * i, mag[1], mag[2]); + + GL11.glTranslated(0, 1, 0); + GL11.glRotated(magroll[2] * i, 0, 0, 1); + GL11.glTranslated(0, -1, 0); + + ResourceManager.aberrator.renderPart("Magazine"); + GL11.glTranslated(bullet[0], bullet[1], bullet[2]); + ResourceManager.aberrator.renderPart("Bullet"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, slide[2]); + ResourceManager.aberrator.renderPart("Slide"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.25, -3.625); + GL11.glRotated(-45 + hammer[0], 1, 0, 0); + GL11.glTranslated(0, -1.25, 3.625); + ResourceManager.aberrator.renderPart("Hammer"); + GL11.glPopMatrix(); + + double smokeScale = 0.5; + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, 4); + GL11.glRotated(recoil[0], -1, 0, 0); + GL11.glRotated(roll[2] * i, 0, 0, -1); + GL11.glRotated(90, 0, 1, 0); + GL11.glScaled(smokeScale, smokeScale, smokeScale); + this.renderSmokeNodes(gun.getConfig(stack, index).smokeNodes, 0.5D); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, 4); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + GL11.glScaled(0.75, 0.75, 0.75); + this.renderMuzzleFlash(gun.lastShot[index], 75, 7.5); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 2, -1.5); + GL11.glScaled(0.5, 0.5, 0.5); + this.renderFireball(gun.lastShot[index]); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + } + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, -1, 4); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + public void setupThirdPersonAkimbo(ItemStack stack) { + super.setupThirdPersonAkimbo(stack); + GL11.glTranslated(0, -1, 4); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + + } + + @Override + public void setupInv(ItemStack stack) { + GL11.glScaled(1, 1, -1); + GL11.glTranslated(8, 8, 0); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void renderInv(ItemStack stack) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glTranslated(0, 1, 0); + + 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(-1, 0, 0); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + 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(1, 0, 0); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderEquipped(ItemStack stack) { + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderEquippedAkimbo(ItemStack stack) { + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.eott_tex); + ResourceManager.aberrator.renderPart("Gun"); + ResourceManager.aberrator.renderPart("Hammer"); + ResourceManager.aberrator.renderPart("Magazine"); + ResourceManager.aberrator.renderPart("Slide"); + ResourceManager.aberrator.renderPart("Sight"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + public static void renderFireball(long lastShot) { + Tessellator tess = Tessellator.instance; + + int flash = 150; + + if(System.currentTimeMillis() - lastShot < flash) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glPushMatrix(); + + double fire = (System.currentTimeMillis() - lastShot) / (double) flash; + double height = 5 * fire; + double length = 10 * fire; + double offset = 1 * fire; + double lengthOffset = -1.125; + Minecraft.getMinecraft().renderEngine.bindTexture(flash_plume); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + + tess.addVertexWithUV(height, -offset, 0, 0, 1); + tess.addVertexWithUV(-height, -offset, 0, 1, 1); + tess.addVertexWithUV(-height, -offset + length, -lengthOffset, 1, 0); + tess.addVertexWithUV(height, -offset + length, -lengthOffset, 0 ,0); + + tess.addVertexWithUV(height, -offset, 0, 0, 1); + tess.addVertexWithUV(-height, -offset, 0, 1, 1); + tess.addVertexWithUV(-height, -offset + length, lengthOffset, 1, 0); + tess.addVertexWithUV(height, -offset + length, lengthOffset, 0 ,0); + + tess.draw(); + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_BLEND); + } + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index d432c31d8..61b78ba4e 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -272,6 +272,7 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_CULL_FACE); GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); GL11.glDepthMask(false); tess.startDrawingQuads(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java index 3b14b0dbb..f9fef2930 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java @@ -48,6 +48,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i public float progress; public int burnTime; public int maxBurnTime; + public int steamUsed = 0; public boolean isVenting; public MaterialStack output; public static final int maxOutput = MaterialShapes.BLOCK.q(16); @@ -124,7 +125,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(this.canProcess(recipe)) { this.progress += 1F / recipe.duration; tanks[1].setFill(tanks[1].getFill() - recipe.steam); - tanks[2].setFill(tanks[2].getFill() + recipe.steam / 100); + steamUsed += recipe.steam; this.isProgressing = true; if(this.progress >= 1F) { @@ -142,6 +143,15 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i } else { this.progress = 0; } + + if(this.steamUsed >= 100) { + int steamReturn = this.steamUsed / 100; + int canReturn = tanks[2].getMaxFill() - tanks[2].getFill(); + int doesReturn = Math.min(steamReturn, canReturn); + this.steamUsed -= doesReturn * 100; + tanks[2].setFill(tanks[2].getFill() + doesReturn); + } + } else { this.progress = 0; } @@ -273,6 +283,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(tanks[1].getFill() < recipe.steam) return false; if(tanks[2].getMaxFill() - tanks[2].getFill() < recipe.steam / 100) return false; + if(this.steamUsed > 100) return false; if(this.output != null) { if(this.output.material != recipe.output.material) return false; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7e274fdf0..5e257b2f0 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2200,6 +2200,7 @@ item.grenade_strong.name=Verbesserte Handgranate item.grenade_tau.name=Taugranate item.grenade_zomg.name=Negativenergie-Paarvernichtungsgranate item.gun_aberrator.name=Aberrator +item.gun_aberrator_eott.name=Eyes Of The Tempest item.gun_am180.name=Schallgedämpfte Maschinenpistole item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto-Flinte diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 9c4e78f98..845db5b7c 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3007,6 +3007,7 @@ item.grenade_zomg.name=Negative Energy Pair Annihilation Grenade item.glyphid_gland.name= Gland item.glyphid_gland_empty.name= Glyphid's Fluid Gland item.gun_aberrator.name=Aberrator +item.gun_aberrator_eott.name=Eyes Of The Tempest item.gun_am180.name=Silenced Submachine Gun item.gun_ar15.name=Josh item.gun_autoshotgun.name=Auto Shotgun diff --git a/src/main/resources/assets/hbm/textures/models/weapons/aberrator.png b/src/main/resources/assets/hbm/textures/models/weapons/aberrator.png index 32796f8ef0adaf7bfd2299e32f6c3fa54aa9218d..b868a5d84912ef62c49aff0d102106179b812d94 100644 GIT binary patch delta 3600 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 W$>wd+hM$fA0000vOI`iv6U7?v}JaU$!Y3zYQV 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 KMNUMnLSTY^C03dM literal 0 HcmV?d00001