From 5341f5d255980009e2bd5e2504fd727f7517d6e3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 9 Feb 2025 18:38:30 +0100 Subject: [PATCH] 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