From 19cfc54dee17bfe8a58a697cd109ce7bc3356418 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 10 Oct 2024 23:21:39 +0200 Subject: [PATCH] grenade tweaks --- changelog | 5 +- .../java/com/hbm/crafting/WeaponRecipes.java | 5 +- .../projectile/EntityBulletBaseMK4.java | 6 + .../java/com/hbm/explosion/ExplosionNT.java | 9 +- .../standard/EntityProcessorCross.java | 16 +- .../standard/EntityProcessorCrossSmooth.java | 15 ++ .../standard/EntityProcessorStandard.java | 14 +- .../hbm/items/weapon/sedna/BulletConfig.java | 8 + .../sedna/factory/GunFactoryClient.java | 198 +++--------------- .../hbm/items/weapon/sedna/factory/Lego.java | 13 ++ .../weapon/sedna/factory/LegoClient.java | 150 +++++++++++++ .../weapon/sedna/factory/Orchestras.java | 27 +++ .../weapon/sedna/factory/XFactory357.java | 15 +- .../weapon/sedna/factory/XFactory40mm.java | 16 +- .../com/hbm/main/ModEventHandlerClient.java | 2 +- .../com/hbm/main/ModEventHandlerRenderer.java | 3 + .../entity/projectile/RenderBullet.java | 15 -- .../weapon/sedna/ItemRenderCongoLake.java | 4 +- .../models/weapons/dani_celestial.png | Bin 3086 -> 3292 bytes .../textures/models/weapons/dani_lunar.png | Bin 3090 -> 3329 bytes 20 files changed, 321 insertions(+), 200 deletions(-) create mode 100644 src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCrossSmooth.java diff --git a/changelog b/changelog index 6a367159f..5c2fa570a 100644 --- a/changelog +++ b/changelog @@ -19,4 +19,7 @@ * Fixed compatibility with EndlessIDs, biome changes should no longer crash the game * Fixed GL state leak caused by fluid tanks, causing some tile entities to be rendered without face culling * Fixed a bug where using too many PWR heatsinks would cause an overflow, making the heat capacity negative -* Fixed landmines generating into the floor on superflat worlds \ No newline at end of file +* Fixed landmines generating into the floor on superflat worlds +* All NTM type explosions are no longer affected by difficulty setting, preventing them from dealing damage in peaceful mode + * There are a few instances of vanilla explosions still being used, those will be phased out in the future +* Fixed tutorial presentations triggering when hitting F1 not just in the inventory but also when looking at the block in question \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 43e3803b9..7914ba839 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -39,10 +39,12 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_henry, 1), new Object[] { "BRP", "BMS", 'B', STEEL.lightBarrel(), 'R', GUNMETAL.lightReceiver(), 'M', GUNMETAL.mechanism(), 'S', WOOD.stock(), 'P', GUNMETAL.plate() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_greasegun, 1), new Object[] { "BRS", "SMG", 'B', STEEL.lightBarrel(), 'R', STEEL.lightReceiver(), 'S', STEEL.bolt(), 'M', GUNMETAL.mechanism(), 'G', STEEL.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_maresleg, 1), new Object[] { "BRM", "BGS", 'B', STEEL.lightBarrel(), 'R', STEEL.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', STEEL.bolt(), 'S', WOOD.stock() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_flaregun, 1), new Object[] { "BRM", " G", 'B', STEEL.heavyBarrel(), 'R', STEEL.lightReceiver(), 'M', GUNMETAL.mechanism(), 'B', STEEL.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_flaregun, 1), new Object[] { "BRM", " G", 'B', STEEL.heavyBarrel(), 'R', STEEL.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', STEEL.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_heavy_revolver, 1), new Object[] { "BRM", " G", 'B', DURA.lightBarrel(), 'R', DURA.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', WOOD.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_carbine, 1), new Object[] { "BRM", "G S", 'B', DURA.lightBarrel(), 'R', DURA.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', WOOD.grip(), 'S', WOOD.stock() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_am180, 1), new Object[] { "BBR", "GMS", 'B', DURA.lightBarrel(), 'R', DURA.lightReceiver(), 'M', GUNMETAL.mechanism(), 'G', WOOD.grip(), 'S', WOOD.stock() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_liberator, 1), new Object[] { "BB ", "BBM", "G G", 'B', DURA.lightBarrel(), 'M', GUNMETAL.mechanism(), 'G', WOOD.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_congolake, 1), new Object[] { "BM ", "BRS", "G ", 'B', DURA.heavyBarrel(), 'M', GUNMETAL.mechanism(), 'R', DURA.lightReceiver(), 'S', WOOD.stock(), 'G', WOOD.grip() }); //SEDNA Ammo CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE, 6), new Object[] { "C", "P", "G", 'C', KEY_COBBLESTONE, 'P', Items.paper, 'G', Items.gunpowder }); @@ -98,7 +100,6 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_karl, 1), new Object[] { "SSW", " MW", 'S', STEEL.shell(), 'W', ALLOY.plate(), 'M', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_quadro, 1), new Object[] { "SSS", "SSS", "CM ", 'S', STEEL.pipe(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'M', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_hk69, 1), new Object[] { "SSI", " MB", 'S', STEEL.shell(), 'I', IRON.ingot(), 'M', ModItems.mechanism_launcher_1, 'B', STEEL.bolt() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_congolake, 1), new Object[] { "HHR", "WLW", 'H', AL.shell(), 'R', ModItems.mechanism_rifle_1, 'W', KEY_LOG, 'L', ModItems.mechanism_launcher_1 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_stinger, 1), new Object[] { "SSW", "CMW", 'S', STEEL.plate(), 'W', TI.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'M', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver, 1), new Object[] { "SSM", " RW", 'S', STEEL.plate(), 'W', KEY_PLANKS, 'R', AL.wireFine(), 'M', ModItems.mechanism_revolver_1 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver_saturnite, 1), new Object[] { "SSM", " RW", 'S', BIGMT.plate(), 'W', KEY_PLANKS, 'R', W.wireFine(), 'M', ModItems.mechanism_revolver_2 }); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java index 7b000c098..f83eeb76d 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseMK4.java @@ -110,6 +110,8 @@ public class EntityBulletBaseMK4 extends EntityThrowableInterp { } if(!worldObj.isRemote && this.ticksExisted > config.expires) this.setDead(); + + if(this.config.onUpdate != null) this.config.onUpdate.accept(this); } @Override @@ -124,6 +126,10 @@ public class EntityBulletBaseMK4 extends EntityThrowableInterp { protected void onImpact(MovingObjectPosition mop) { if(!worldObj.isRemote) { + if(this.config.onImpact != null) this.config.onImpact.accept(this, mop); + + if(this.isDead) return; + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); diff --git a/src/main/java/com/hbm/explosion/ExplosionNT.java b/src/main/java/com/hbm/explosion/ExplosionNT.java index 5de3072b3..533823d5f 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNT.java +++ b/src/main/java/com/hbm/explosion/ExplosionNT.java @@ -21,6 +21,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkPosition; @@ -156,7 +157,7 @@ public class ExplosionNT extends Explosion { currentZ /= d9; double d10 = (double) this.worldObj.getBlockDensity(vec3, entity.boundingBox); double d11 = (1.0D - d4) * d10; - entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float) ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * (double) this.explosionSize + 1.0D))); + entity.attackEntityFrom(setExplosionSource(this), (float) ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * (double) this.explosionSize + 1.0D))); double d8 = EnchantmentProtection.func_92092_a(entity, d11); entity.motionX += currentX * d8; entity.motionY += currentY * d8; @@ -173,6 +174,12 @@ public class ExplosionNT extends Explosion { } } + public static DamageSource setExplosionSource(Explosion explosion) { + return explosion != null && explosion.getExplosivePlacedBy() != null ? + (new EntityDamageSource("explosion.player", explosion.getExplosivePlacedBy())).setExplosion() : + (new DamageSource("explosion")).setExplosion(); + } + public void doExplosionB(boolean p_77279_1_) { if(!has(ExAttrib.NOSOUND)) diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCross.java b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCross.java index 64c4de445..15b1a06b8 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCross.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCross.java @@ -13,7 +13,9 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.Vec3; +import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.ForgeEventFactory; @@ -86,8 +88,8 @@ public class EntityProcessorCross implements IEntityProcessor { } double knockback = (1.0D - distanceScaled) * density; - - entity.attackEntityFrom(DamageSource.setExplosionSource(explosion.compat), (float) ((int) ((knockback * knockback + knockback) / 2.0D * 8.0D * size + 1.0D))); + + entity.attackEntityFrom(setExplosionSource(explosion.compat), calculateDamage(distanceScaled, density, knockback, size)); double enchKnockback = EnchantmentProtection.func_92092_a(entity, knockback); entity.motionX += deltaX * enchKnockback; @@ -108,6 +110,16 @@ public class EntityProcessorCross implements IEntityProcessor { return affectedPlayers; } + public float calculateDamage(double distanceScaled, double density, double knockback, float size) { + return (float) ((int) ((knockback * knockback + knockback) / 2.0D * 8.0D * size + 1.0D)); + } + + public static DamageSource setExplosionSource(Explosion explosion) { + return explosion != null && explosion.getExplosivePlacedBy() != null ? + (new EntityDamageSource("explosion.player", explosion.getExplosivePlacedBy())).setExplosion() : + (new DamageSource("explosion")).setExplosion(); + } + public EntityProcessorCross withRangeMod(float mod) { range = new IEntityRangeMutator() { @Override diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCrossSmooth.java b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCrossSmooth.java new file mode 100644 index 000000000..725b9fc92 --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorCrossSmooth.java @@ -0,0 +1,15 @@ +package com.hbm.explosion.vanillant.standard; + +public class EntityProcessorCrossSmooth extends EntityProcessorCross { + + protected float fixedDamage; + + public EntityProcessorCrossSmooth(double nodeDist, float fixedDamage) { + super(nodeDist); + this.fixedDamage = fixedDamage; + } + + public float calculateDamage(double distanceScaled, double density, double knockback, float size) { + return (float) (fixedDamage * (1 - distanceScaled)); + } +} diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorStandard.java index ba9a66cad..9e369ea35 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/EntityProcessorStandard.java @@ -13,7 +13,9 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.Vec3; +import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.event.ForgeEventFactory; @@ -67,7 +69,7 @@ public class EntityProcessorStandard implements IEntityProcessor { double density = world.getBlockDensity(vec3, entity.boundingBox); double knockback = (1.0D - distanceScaled) * density; - entity.attackEntityFrom(DamageSource.setExplosionSource(explosion.compat), (float) ((int) ((knockback * knockback + knockback) / 2.0D * 8.0D * size + 1.0D))); + entity.attackEntityFrom(setExplosionSource(explosion.compat), calculateDamage(distanceScaled, density, knockback, size)); double enchKnockback = EnchantmentProtection.func_92092_a(entity, knockback); entity.motionX += deltaX * enchKnockback; @@ -88,6 +90,16 @@ public class EntityProcessorStandard implements IEntityProcessor { return affectedPlayers; } + public float calculateDamage(double distanceScaled, double density, double knockback, float size) { + return (float) ((int) ((knockback * knockback + knockback) / 2.0D * 8.0D * size + 1.0D)); + } + + public static DamageSource setExplosionSource(Explosion explosion) { + return explosion != null && explosion.getExplosivePlacedBy() != null ? + (new EntityDamageSource("explosion.player", explosion.getExplosivePlacedBy())).setExplosion() : + (new DamageSource("explosion")).setExplosion(); + } + public EntityProcessorStandard withRangeMod(float mod) { range = new IEntityRangeMutator() { @Override diff --git a/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java index 4cf10e425..419b29f25 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java +++ b/src/main/java/com/hbm/items/weapon/sedna/BulletConfig.java @@ -3,6 +3,7 @@ package com.hbm.items.weapon.sedna; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; +import java.util.function.Consumer; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.inventory.RecipesCommon.ComparableStack; @@ -15,6 +16,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.MovingObjectPosition; public class BulletConfig { @@ -45,6 +47,9 @@ public class BulletConfig { public int maxRicochetCount = 2; /** Whether damage dealt to an entity is subtracted from the projectile's damage on penetration */ public boolean damageFalloffByPen = true; + + public Consumer onUpdate; + public BiConsumer onImpact; public double gravity = 0; public int expires = 30; @@ -88,6 +93,9 @@ public class BulletConfig { public BulletConfig setCasing(SpentCasing casing) { this.casing = casing; return this; } public BulletConfig setRenderer(BiConsumer renderer) { this.renderer = renderer; return this; } + public BulletConfig setOnUpdate(Consumer lambda) { this.onUpdate = lambda; return this; } + public BulletConfig setOnImpact(BiConsumer lambda) { this.onImpact = lambda; return this; } + public DamageSource getDamage(EntityBulletBaseMK4 bullet, EntityLivingBase shooter, boolean bypass) { DamageSource dmg; 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 55203d453..c2e43b673 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 @@ -9,21 +9,10 @@ import static com.hbm.items.weapon.sedna.factory.XFactory44.*; import static com.hbm.items.weapon.sedna.factory.XFactory762mm.*; import static com.hbm.items.weapon.sedna.factory.XFactory9mm.*; -import java.util.function.BiConsumer; - -import org.lwjgl.opengl.GL11; - -import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.ItemGunBaseNT; -import com.hbm.lib.RefStrings; import com.hbm.render.item.weapon.sedna.*; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.MinecraftForgeClient; public class GunFactoryClient { @@ -44,36 +33,37 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_liberator, new ItemRenderLiberator()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_congolake, new ItemRenderCongoLake()); //PROJECTILES - ammo_debug.setRenderer(RENDER_STANDARD_BULLET); - ammo_debug_buckshot.setRenderer(RENDER_STANDARD_BULLET); - m357_sp.setRenderer(RENDER_STANDARD_BULLET); - m357_fmj.setRenderer(RENDER_STANDARD_BULLET); - m357_jhp.setRenderer(RENDER_STANDARD_BULLET); - m357_ap.setRenderer(RENDER_AP_BULLET); - m357_express.setRenderer(RENDER_EXPRESS_BULLET); - m44_sp.setRenderer(RENDER_STANDARD_BULLET); - m44_fmj.setRenderer(RENDER_STANDARD_BULLET); - m44_jhp.setRenderer(RENDER_STANDARD_BULLET); - m44_ap.setRenderer(RENDER_AP_BULLET); - m44_express.setRenderer(RENDER_EXPRESS_BULLET); - p9_sp.setRenderer(RENDER_STANDARD_BULLET); - p9_fmj.setRenderer(RENDER_STANDARD_BULLET); - p9_jhp.setRenderer(RENDER_STANDARD_BULLET); - p9_ap.setRenderer(RENDER_AP_BULLET); - g12_bp.setRenderer(RENDER_STANDARD_BULLET); - g12_bp_magnum.setRenderer(RENDER_STANDARD_BULLET); - g12_bp_slug.setRenderer(RENDER_STANDARD_BULLET); - g12.setRenderer(RENDER_STANDARD_BULLET); - g40_flare.setRenderer(RENDER_FLARE); - r762_sp.setRenderer(RENDER_STANDARD_BULLET); - r762_fmj.setRenderer(RENDER_STANDARD_BULLET); - r762_jhp.setRenderer(RENDER_STANDARD_BULLET); - r762_ap.setRenderer(RENDER_AP_BULLET); - r762_du.setRenderer(RENDER_DU_BULLET); - p22_sp.setRenderer(RENDER_STANDARD_BULLET); - p22_fmj.setRenderer(RENDER_STANDARD_BULLET); - p22_jhp.setRenderer(RENDER_STANDARD_BULLET); - p22_ap.setRenderer(RENDER_AP_BULLET); + ammo_debug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + ammo_debug_buckshot.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m357_sp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m357_fmj.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m357_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m357_ap.setRenderer(LegoClient.RENDER_AP_BULLET); + m357_express.setRenderer(LegoClient.RENDER_EXPRESS_BULLET); + m44_sp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m44_fmj.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m44_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + m44_ap.setRenderer(LegoClient.RENDER_AP_BULLET); + m44_express.setRenderer(LegoClient.RENDER_EXPRESS_BULLET); + p9_sp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p9_fmj.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p9_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p9_ap.setRenderer(LegoClient.RENDER_AP_BULLET); + g12_bp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12_bp_magnum.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12_bp_slug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + g12.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + r762_sp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + r762_fmj.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + r762_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + r762_ap.setRenderer(LegoClient.RENDER_AP_BULLET); + r762_du.setRenderer(LegoClient.RENDER_DU_BULLET); + p22_sp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p22_fmj.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p22_jhp.setRenderer(LegoClient.RENDER_STANDARD_BULLET); + p22_ap.setRenderer(LegoClient.RENDER_AP_BULLET); + g40_flare.setRenderer(LegoClient.RENDER_FLARE); + g40.setRenderer(LegoClient.RENDER_GRENADE); //HUDS ((ItemGunBaseNT) ModItems.gun_debug) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_pepperbox) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); @@ -90,130 +80,4 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_light_revolver_dani).getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY_MIRROR, LegoClient.HUD_COMPONENT_AMMO_MIRROR); ((ItemGunBaseNT) ModItems.gun_light_revolver_dani).getConfig(null, 1).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); } - - public static BiConsumer RENDER_STANDARD_BULLET = (bullet, interp) -> { - double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; - if(length <= 0) return; - renderBulletStandard(Tessellator.instance, 0xFFBF00, 0xFFFFFF, length, false); - }; - - public static BiConsumer RENDER_AP_BULLET = (bullet, interp) -> { - double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; - if(length <= 0) return; - renderBulletStandard(Tessellator.instance, 0xFF6A00, 0xFFE28D, length, false); - }; - - public static BiConsumer RENDER_EXPRESS_BULLET = (bullet, interp) -> { - double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; - if(length <= 0) return; - renderBulletStandard(Tessellator.instance, 0x9E082E, 0xFF8A79, length, false); - }; - - public static BiConsumer RENDER_DU_BULLET = (bullet, interp) -> { - double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; - if(length <= 0) return; - renderBulletStandard(Tessellator.instance, 0x5CCD41, 0xE9FF8D, length, false); - }; - - public static BiConsumer RENDER_TRACER_BULLET = (bullet, interp) -> { - double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; - if(length <= 0) return; - renderBulletStandard(Tessellator.instance, 0x9E082E, 0xFF8A79, length, true); - }; - - public static void renderBulletStandard(Tessellator tess, int dark, int light, double length, boolean fullbright) { renderBulletStandard(tess, dark, light, length, 0.03125D, 0.03125D * 0.25D, fullbright); } - - public static void renderBulletStandard(Tessellator tess, int dark, int light, double length, double widthF, double widthB, boolean fullbright) { - - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glShadeModel(GL11.GL_SMOOTH); - GL11.glColor4f(1F, 1F, 1F, 1F); - - tess.startDrawingQuads(); - if(fullbright) tess.setBrightness(240); - tess.setNormal(0F, 1F, 0F); - tess.setColorOpaque_I(dark); - tess.addVertex(length, widthB, -widthB); tess.addVertex(length, widthB, widthB); - tess.setColorOpaque_I(light); - tess.addVertex(0, widthF, widthF); tess.addVertex(0, widthF, -widthF); - tess.setColorOpaque_I(dark); - tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, -widthB, widthB); - tess.setColorOpaque_I(light); - tess.addVertex(0, -widthF, widthF); tess.addVertex(0, -widthF, -widthF); - tess.setColorOpaque_I(dark); - tess.addVertex(length, -widthB, widthB); tess.addVertex(length, widthB, widthB); - tess.setColorOpaque_I(light); - tess.addVertex(0, widthF, widthF); tess.addVertex(0, -widthF, widthF); - tess.setColorOpaque_I(dark); - tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, widthB, -widthB); - tess.setColorOpaque_I(light); - tess.addVertex(0, widthF, -widthF); tess.addVertex(0, -widthF, -widthF); - tess.setColorOpaque_I(dark); - tess.addVertex(length, widthB, widthB); tess.addVertex(length, widthB, -widthB); - tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, -widthB, widthB); - tess.setColorOpaque_I(light); - tess.addVertex(0, widthF, widthF); tess.addVertex(0, widthF, -widthF); - tess.addVertex(0, -widthF, -widthF); tess.addVertex(0, -widthF, widthF); - tess.draw(); - - GL11.glShadeModel(GL11.GL_FLAT); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_TEXTURE_2D); - } - - private static final ResourceLocation flare = new ResourceLocation(RefStrings.MODID + ":textures/particle/flare.png"); - public static BiConsumer RENDER_FLARE = (bullet, interp) -> { - - if(bullet.ticksExisted < 2) return; - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GL11.glAlphaFunc(GL11.GL_GREATER, 0); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glDepthMask(false); - RenderHelper.disableStandardItemLighting(); - - Minecraft.getMinecraft().getTextureManager().bindTexture(flare); - - Tessellator tess = Tessellator.instance; - tess.startDrawingQuads(); - - float f1 = ActiveRenderInfo.rotationX; - float f2 = ActiveRenderInfo.rotationZ; - float f3 = ActiveRenderInfo.rotationYZ; - float f4 = ActiveRenderInfo.rotationXY; - float f5 = ActiveRenderInfo.rotationXZ; - - double posX = 0; - double posY = 0; - double posZ = 0; - double scale = Math.min(5, (bullet.ticksExisted + interp - 2) * 0.5) * (0.8 + bullet.worldObj.rand.nextDouble() * 0.4); - - tess.setColorRGBA_F(1F, 0.5F, 0.5F, 0.5F); - tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); - tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); - tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); - tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); - - scale *= 0.5D; - - tess.setColorRGBA_F(1F, 1F, 1F, 0.75F); - tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); - tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); - tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); - tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); - - tess.draw(); - - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_ALPHA_TEST); - RenderHelper.enableStandardItemLighting(); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GL11.glDisable(GL11.GL_BLEND); - GL11.glPopMatrix(); - }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java index f702a63bc..943b39532 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java @@ -6,6 +6,10 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth; +import com.hbm.explosion.vanillant.standard.ExplosionEffectStandard; +import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.GunConfig; import com.hbm.items.weapon.sedna.ItemGunBaseNT; @@ -20,6 +24,7 @@ import com.hbm.render.anim.HbmAnimations.AnimType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; /** @@ -187,6 +192,14 @@ public class Lego { return 1F - (percent - 0.75F) * 2F; } + public static void standardExplode(EntityBulletBaseMK4 bullet, MovingObjectPosition mop, float range) { + ExplosionVNT vnt = new ExplosionVNT(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, range); + vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, bullet.damage)); + vnt.setPlayerProcessor(new PlayerProcessorStandard()); + vnt.setSFX(new ExplosionEffectStandard()); + vnt.explode(); + } + /** anims for the DEBUG revolver, mostly a copy of the li'lpip but with some fixes regarding the cylinder movement */ @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_DEBUG_ANIMS = (stack, type) -> { switch(type) { 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 caf5a33a2..f9f1f349e 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 @@ -1,7 +1,20 @@ package com.hbm.items.weapon.sedna.factory; +import java.util.function.BiConsumer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.items.weapon.sedna.hud.HUDComponentAmmoCounter; import com.hbm.items.weapon.sedna.hud.HUDComponentDurabilityBar; +import com.hbm.lib.RefStrings; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; public class LegoClient { @@ -9,4 +22,141 @@ public class LegoClient { public static HUDComponentDurabilityBar HUD_COMPONENT_DURABILITY_MIRROR = new HUDComponentDurabilityBar(true); public static HUDComponentAmmoCounter HUD_COMPONENT_AMMO = new HUDComponentAmmoCounter(0); public static HUDComponentAmmoCounter HUD_COMPONENT_AMMO_MIRROR = new HUDComponentAmmoCounter(0, true); + + public static BiConsumer RENDER_STANDARD_BULLET = (bullet, interp) -> { + double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; + if(length <= 0) return; + renderBulletStandard(Tessellator.instance, 0xFFBF00, 0xFFFFFF, length, false); + }; + + public static BiConsumer RENDER_AP_BULLET = (bullet, interp) -> { + double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; + if(length <= 0) return; + renderBulletStandard(Tessellator.instance, 0xFF6A00, 0xFFE28D, length, false); + }; + + public static BiConsumer RENDER_EXPRESS_BULLET = (bullet, interp) -> { + double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; + if(length <= 0) return; + renderBulletStandard(Tessellator.instance, 0x9E082E, 0xFF8A79, length, false); + }; + + public static BiConsumer RENDER_DU_BULLET = (bullet, interp) -> { + double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; + if(length <= 0) return; + renderBulletStandard(Tessellator.instance, 0x5CCD41, 0xE9FF8D, length, false); + }; + + public static BiConsumer RENDER_TRACER_BULLET = (bullet, interp) -> { + double length = bullet.prevVelocity + (bullet.velocity - bullet.prevVelocity) * interp; + if(length <= 0) return; + renderBulletStandard(Tessellator.instance, 0x9E082E, 0xFF8A79, length, true); + }; + + public static void renderBulletStandard(Tessellator tess, int dark, int light, double length, boolean fullbright) { renderBulletStandard(tess, dark, light, length, 0.03125D, 0.03125D * 0.25D, fullbright); } + + public static void renderBulletStandard(Tessellator tess, int dark, int light, double length, double widthF, double widthB, boolean fullbright) { + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glColor4f(1F, 1F, 1F, 1F); + + tess.startDrawingQuads(); + if(fullbright) tess.setBrightness(240); + tess.setNormal(0F, 1F, 0F); + tess.setColorOpaque_I(dark); + tess.addVertex(length, widthB, -widthB); tess.addVertex(length, widthB, widthB); + tess.setColorOpaque_I(light); + tess.addVertex(0, widthF, widthF); tess.addVertex(0, widthF, -widthF); + tess.setColorOpaque_I(dark); + tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, -widthB, widthB); + tess.setColorOpaque_I(light); + tess.addVertex(0, -widthF, widthF); tess.addVertex(0, -widthF, -widthF); + tess.setColorOpaque_I(dark); + tess.addVertex(length, -widthB, widthB); tess.addVertex(length, widthB, widthB); + tess.setColorOpaque_I(light); + tess.addVertex(0, widthF, widthF); tess.addVertex(0, -widthF, widthF); + tess.setColorOpaque_I(dark); + tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, widthB, -widthB); + tess.setColorOpaque_I(light); + tess.addVertex(0, widthF, -widthF); tess.addVertex(0, -widthF, -widthF); + tess.setColorOpaque_I(dark); + tess.addVertex(length, widthB, widthB); tess.addVertex(length, widthB, -widthB); + tess.addVertex(length, -widthB, -widthB); tess.addVertex(length, -widthB, widthB); + tess.setColorOpaque_I(light); + tess.addVertex(0, widthF, widthF); tess.addVertex(0, widthF, -widthF); + tess.addVertex(0, -widthF, -widthF); tess.addVertex(0, -widthF, widthF); + tess.draw(); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + private static final ResourceLocation flare = new ResourceLocation(RefStrings.MODID + ":textures/particle/flare.png"); + public static BiConsumer RENDER_FLARE = (bullet, interp) -> { + + if(bullet.ticksExisted < 2) return; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + RenderHelper.disableStandardItemLighting(); + + Minecraft.getMinecraft().getTextureManager().bindTexture(flare); + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + float f1 = ActiveRenderInfo.rotationX; + float f2 = ActiveRenderInfo.rotationZ; + float f3 = ActiveRenderInfo.rotationYZ; + float f4 = ActiveRenderInfo.rotationXY; + float f5 = ActiveRenderInfo.rotationXZ; + + double posX = 0; + double posY = 0; + double posZ = 0; + double scale = Math.min(5, (bullet.ticksExisted + interp - 2) * 0.5) * (0.8 + bullet.worldObj.rand.nextDouble() * 0.4); + + tess.setColorRGBA_F(1F, 0.5F, 0.5F, 0.5F); + tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); + tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); + tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); + tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); + + scale *= 0.5D; + + tess.setColorRGBA_F(1F, 1F, 1F, 0.75F); + tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); + tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); + tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); + tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); + + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + }; + + public static BiConsumer RENDER_GRENADE = (bullet, interp) -> { + + GL11.glScalef(0.25F, 0.25F, 0.25F); + GL11.glRotated(90, 0, 0, 1); + + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.grenade_tex); + ResourceManager.projectiles.renderPart("Grenade"); + GL11.glShadeModel(GL11.GL_FLAT); + }; } 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 a857f90f8..49525d3d0 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 @@ -101,6 +101,33 @@ public class Orchestras { } }; + public static BiConsumer ORCHESTRA_DANI = (stack, ctx) -> { + EntityPlayer player = ctx.player; + AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); + int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + + if(type == AnimType.RELOAD) { + if(timer == 2) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.magSmallRemove", 1F, 1F); + if(timer == 36) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.magSmallInsert", 1F, 1F); + if(timer == 44) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.revolverClose", 1F, 1F); + } + if(type == AnimType.CYCLE) { + if(timer == 9) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.revolverCock", 1F, 0.9F); + } + if(type == AnimType.CYCLE_DRY) { + if(timer == 2) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.dryFireClick", 1F, 1F); + if(timer == 9) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.revolverCock", 1F, 0.9F); + } + if(type == AnimType.INSPECT) { + if(timer == 2) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.magSmallRemove", 1F, 1F); + if(timer == 24) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.revolverClose", 1F, 1F); + } + if(type == AnimType.JAMMED) { + if(timer == 12) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.magSmallRemove", 1F, 1F); + if(timer == 34) player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.revolverClose", 1F, 1F); + } + }; + public static BiConsumer ORCHESTRA_HENRY = (stack, ctx) -> { EntityPlayer player = ctx.player; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java index 611b7969f..12c5f5b17 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java @@ -47,22 +47,22 @@ public class XFactory357 { ModItems.gun_light_revolver_dani = new ItemGunBaseNT( new GunConfig().dura(30_000).draw(20).inspect(23).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(10F).delay(16).reload(55).jam(45).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) + .dmg(10F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 6).addConfigs(m357_sp, m357_fmj, m357_jhp, m357_ap, m357_express)) .offset(0.75, -0.0625, 0.3125D) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_STANDARD_FIRE).recoil(Lego.LAMBDA_STANDARD_RECOIL)) .pp(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) - .anim(LAMBDA_DANI_ANIMS).orchestra(Orchestras.ORCHESTRA_ATLAS), + .anim(LAMBDA_DANI_ANIMS).orchestra(Orchestras.ORCHESTRA_DANI), new GunConfig().dura(30_000).draw(20).inspect(23).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(10F).delay(16).reload(55).jam(45).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) + .dmg(10F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) .mag(new MagazineFullReload(1, 6).addConfigs(m357_sp, m357_fmj, m357_jhp, m357_ap, m357_express)) .offset(0.75, -0.0625, -0.3125D) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_STANDARD_FIRE).recoil(Lego.LAMBDA_STANDARD_RECOIL)) .ps(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) .decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) - .anim(LAMBDA_DANI_ANIMS).orchestra(Orchestras.ORCHESTRA_ATLAS) + .anim(LAMBDA_DANI_ANIMS).orchestra(Orchestras.ORCHESTRA_DANI) ).setUnlocalizedName("gun_light_revolver_dani").setTextureName(RefStrings.MODID + ":gun_darter"); } @@ -101,6 +101,13 @@ public class XFactory357 { @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_DANI_ANIMS = (stack, type) -> { switch(type) { case EQUIP: return new BusAnimation().addBus("EQUIP", new BusAnimationSequence().addPos(360 * 3, 0, 0, 1000, IType.SIN_DOWN)); + case CYCLE: return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(0, 0, -3, 50).addPos(0, 0, 0, 250)) + .addBus("HAMMER", new BusAnimationSequence().addPos(0, 0, 1, 50).addPos(0, 0, 1, 300).addPos(0, 0, 0, 200)) + .addBus("DRUM", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, 0, 1, 200)); + case CYCLE_DRY: return new BusAnimation() + .addBus("HAMMER", new BusAnimationSequence().addPos(0, 0, 1, 50).addPos(0, 0, 1, 200).addPos(0, 0, 0, 200)) + .addBus("DRUM", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, 0, 1, 200)); } return LAMBDA_ATLAS_ANIMS.apply(stack, type); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java index 49c34c53c..c555e08e9 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory40mm.java @@ -3,6 +3,7 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -22,21 +23,26 @@ import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; public class XFactory40mm { public static BulletConfig g40_flare; public static BulletConfig g40; + public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { + Lego.standardExplode(bullet, mop, 5F); bullet.setDead(); + }; + public static void init() { - g40_flare = new BulletConfig().setItem(EnumAmmo.G40_FLARE).setVel(2F).setGrav(0.035D).setRenderRotations(false).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x9E1616).setScale(2F).register("G40Flare")); - g40 = new BulletConfig().setItem(EnumAmmo.G40).setVel(2F).setGrav(0.035D).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(SpentCasing.COLOR_CASE_40MM).setScale(2, 2F, 1.5F).register("G40")); + g40_flare = new BulletConfig().setItem(EnumAmmo.G40_FLARE).setLife(100).setVel(2F).setGrav(0.035D).setRenderRotations(false).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0x9E1616).setScale(2F).register("G40Flare")); + g40 = new BulletConfig().setItem(EnumAmmo.G40).setLife(200).setOnImpact(LAMBDA_STANDARD_EXPLODE).setVel(2F).setGrav(0.035D).setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(SpentCasing.COLOR_CASE_40MM).setScale(2, 2F, 1.5F).register("G40")); ModItems.gun_flaregun = new ItemGunBaseNT(new GunConfig() .dura(100).draw(7).inspect(39).crosshair(Crosshair.L_CIRCUMFLEX).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) - .dmg(12F).delay(20).reload(28).jam(33).sound("hbm:weapon.hkShoot", 1.0F, 1.0F) + .dmg(15F).delay(20).reload(28).jam(33).sound("hbm:weapon.hkShoot", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 1).addConfigs(g40_flare)) .offset(0.75, -0.0625, -0.1875D) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_STANDARD_FIRE).recoil(Lego.LAMBDA_STANDARD_RECOIL)) @@ -47,8 +53,8 @@ public class XFactory40mm { ModItems.gun_congolake = new ItemGunBaseNT(new GunConfig() .dura(400).draw(7).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCUMFLEX).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) - .dmg(12F).delay(24).reload(16, 16, 16, 0).jam(0).sound("hbm:weapon.glShoot", 1.0F, 1.0F) - .mag(new MagazineSingleReload(0, 4).addConfigs(g40_flare)) + .dmg(30F).delay(24).reload(16, 16, 16, 0).jam(0).sound("hbm:weapon.glShoot", 1.0F, 1.0F) + .mag(new MagazineSingleReload(0, 4).addConfigs(g40, g40_flare)) .offset(0.75, -0.0625, -0.1875D) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_STANDARD_FIRE).recoil(Lego.LAMBDA_STANDARD_RECOIL)) .setupStandardConfiguration() diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index b46602c31..bafb52c23 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -909,7 +909,7 @@ public class ModEventHandlerClient { } } - if(Keyboard.isKeyDown(Keyboard.KEY_F1)) { + if(Keyboard.isKeyDown(Keyboard.KEY_F1) && Minecraft.getMinecraft().currentScreen != null) { ComparableStack comp = canneryTimestamp > System.currentTimeMillis() - 100 ? lastCannery : null; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 4c557405c..b061f02a2 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -21,6 +21,7 @@ import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.RenderBlocks; @@ -135,6 +136,8 @@ public class ModEventHandlerRenderer { ModelBiped biped = renderer.modelBipedMain; biped.bipedLeftArm.rotateAngleY = 0.1F + biped.bipedHead.rotateAngleY; if(!isManly) { + AbstractClientPlayer acp = (AbstractClientPlayer) player; + Minecraft.getMinecraft().getTextureManager().bindTexture(acp.getLocationSkin()); biped.bipedLeftArm.isHidden = false; biped.bipedLeftArm.render(0.0625F); } diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java b/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java index c97e4b982..f2cd70fc3 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderBullet.java @@ -178,21 +178,6 @@ public class RenderBullet extends Render { GL11.glScalef(0.25F, 0.25F, 0.25F); GL11.glRotated(90, 0, 0, 1); GL11.glRotated(90, 0, 1, 0); - - switch(type) { - case 0: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenade.png")); break; - case 1: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenadeHE.png")); break; - case 2: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenadeIncendiary.png")); break; - case 3: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenadeToxic.png")); break; - case 4: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenadeSleek.png")); break; - case 5: - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/entity/ModelGrenadeTraining.png")); break; - } GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.grenade_tex); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderCongoLake.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderCongoLake.java index 42cd24e97..06a26a145 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderCongoLake.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderCongoLake.java @@ -132,7 +132,9 @@ public class ItemRenderCongoLake extends ItemRenderWeaponBase { @Override public void setupThirdPerson(ItemStack stack) { super.setupThirdPerson(stack); - GL11.glTranslated(0, 1, 3); + GL11.glTranslated(0, -2.5, 4); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); } diff --git a/src/main/resources/assets/hbm/textures/models/weapons/dani_celestial.png b/src/main/resources/assets/hbm/textures/models/weapons/dani_celestial.png index cfed1c07113504d234501b9922338d301efe3565..ebe3ebd70df8e633b2cfa0235cff983d6c07bcc9 100644 GIT binary patch delta 3273 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 Hu0mjfyDfBF delta 3065 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 Hu0mjfg*Om` diff --git a/src/main/resources/assets/hbm/textures/models/weapons/dani_lunar.png b/src/main/resources/assets/hbm/textures/models/weapons/dani_lunar.png index 1e58d97d18a6f68b3b875e783ce7626cf9b15de3..4ea531472eab38d680ad076acd5dcf79839222c1 100644 GIT binary patch delta 3310 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 delta 3069 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