From f62fcc89cba0e405e685ebb3435d0830a571bb2c Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 23 Feb 2026 20:36:00 +0100 Subject: [PATCH] back mounted rocket launcher time --- changelog | 5 ++ .../com/hbm/blocks/generic/BlockKeyhole.java | 16 ++++-- .../java/com/hbm/crafting/WeaponRecipes.java | 3 + src/main/java/com/hbm/items/ModItems.java | 2 + .../java/com/hbm/items/armor/ArmorNCRPA.java | 16 +++++- .../com/hbm/items/armor/ArmorNCRPARanged.java | 51 +++++++++++++++++ .../java/com/hbm/items/armor/ArmorRPA.java | 2 + .../java/com/hbm/items/armor/IPARanged.java | 11 ++++ .../hbm/items/armor/IPAWeaponsProvider.java | 14 +++++ .../sedna/factory/GunFactoryClient.java | 2 + .../weapon/sedna/factory/XFactoryPA.java | 35 ++++++++---- .../weapon/sedna/factory/XFactoryRocket.java | 23 +++++++- .../weapon/sedna/mods/XWeaponModManager.java | 2 + .../item/weapon/sedna/ItemRenderPAMelee.java | 23 ++++++++ .../com/hbm/render/tileentity/RenderLoot.java | 54 ++++++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/items/gun_pa_ranged.png | Bin 0 -> 235 bytes 18 files changed, 242 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/hbm/items/armor/ArmorNCRPARanged.java create mode 100644 src/main/java/com/hbm/items/armor/IPARanged.java create mode 100644 src/main/resources/assets/hbm/textures/items/gun_pa_ranged.png diff --git a/changelog b/changelog index 63239426d..6f123f62f 100644 --- a/changelog +++ b/changelog @@ -5,11 +5,16 @@ * NCR Ranger Power Armor * Legendary set, like the remnants power armor * Stats are largely similar, but has a speed boost when sprinting + * Red room exclusive * Comes with the power armor - melee controller item * If the full set is equipped, the melee controller allows for powerful melee attacks * Left click does two rapid swings, right click causes both arms to swing at once * The NCRPA's blades are armor-piercing and gib enemies on death * The blades do 250% damage on large enemies, i.e. ones with 100 or more max health + * And also the power armor - ranged controller + * Allows the NCRPA to fire rockets straight from the intentory + * Left click fires guided rockets and right click unguided ones + * Only does 25 damage max, but has no reload and a fire rate of 120 per minute ## Changed * Reworked the industrial turbine diff --git a/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java b/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java index f267857fd..b042ba695 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java +++ b/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java @@ -205,10 +205,18 @@ public class BlockKeyhole extends BlockStone { if(rand == 0) { world.setBlock(x, y + 1, z, ModBlocks.deco_loot); TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y + 1, z); - loot.addItem(new ItemStack(ModItems.trenchmaster_helmet), 0, 0, 0); - loot.addItem(new ItemStack(ModItems.trenchmaster_plate), 0, 0, 0); - loot.addItem(new ItemStack(ModItems.trenchmaster_legs), 0, 0, 0); - loot.addItem(new ItemStack(ModItems.trenchmaster_boots), 0, 0, 0); + + if(world.rand.nextInt(5) == 0) { + loot.addItem(new ItemStack(ModItems.ncrpa_helmet), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.ncrpa_plate), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.ncrpa_legs), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.ncrpa_boots), 0, 0, 0); + } else { + loot.addItem(new ItemStack(ModItems.trenchmaster_helmet), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.trenchmaster_plate), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.trenchmaster_legs), 0, 0, 0); + loot.addItem(new ItemStack(ModItems.trenchmaster_boots), 0, 0, 0); + } } else { spawnPedestalItem(world, x, y + 1, z); } diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index ef8d2b503..e32196a1d 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -103,6 +103,9 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_charge_thrower, 1), new Object[] { "MMM", "BBL", "GG ", 'M', GUNMETAL.mechanism(), 'B', STEEL.heavyBarrel(), 'G', STEEL.grip(), 'L', ANY_RUBBER.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_drill, 1), new Object[] { " GL", "IBP", " GL", 'G', GUNMETAL.ingot(), 'L', ANY_RUBBER.ingot(), 'I', TI.ingot(), 'B', STEEL.block(), 'P', ModItems.piston_selenium }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_pa_melee, 1), new Object[] { " C ", "MWM", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'M', ModItems.motor, 'W', GOLD.wireDense() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_pa_ranged, 1), new Object[] { "C", "W", "P", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'P', ANY_PLASTIC.ingot(), 'W', GOLD.wireDense() }); + //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 }); CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_AP, 6), new Object[] { "C", "P", "G", 'C', Items.flint, 'P', Items.paper, 'G', Items.gunpowder }); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 6446fb2b5..a55fdc85b 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1440,6 +1440,7 @@ public class ModItems { public static Item gun_charge_thrower; public static Item gun_drill; public static Item gun_pa_melee; + public static Item gun_pa_ranged; public static Item ammo_standard; public static Item ammo_secret; @@ -6330,6 +6331,7 @@ public class ModItems { GameRegistry.registerItem(gun_charge_thrower, gun_charge_thrower.getUnlocalizedName()); GameRegistry.registerItem(gun_drill, gun_drill.getUnlocalizedName()); GameRegistry.registerItem(gun_pa_melee, gun_pa_melee.getUnlocalizedName()); + GameRegistry.registerItem(gun_pa_ranged, gun_pa_ranged.getUnlocalizedName()); GameRegistry.registerItem(ammo_standard, ammo_standard.getUnlocalizedName()); GameRegistry.registerItem(ammo_secret, ammo_secret.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorNCRPA.java b/src/main/java/com/hbm/items/armor/ArmorNCRPA.java index 69d19c527..f9e9dae71 100644 --- a/src/main/java/com/hbm/items/armor/ArmorNCRPA.java +++ b/src/main/java/com/hbm/items/armor/ArmorNCRPA.java @@ -21,6 +21,8 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.client.IItemRenderer; @@ -53,8 +55,6 @@ public class ArmorNCRPA extends ArmorFSBPowered implements IItemRendererProvider if(this != ModItems.ncrpa_plate) return; - HbmPlayerProps props = HbmPlayerProps.getData(player); - /// SPEED /// Multimap multimap = super.getAttributeModifiers(stack); multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(speed, "NCRPA SPEED", 0.1, 0)); @@ -63,6 +63,9 @@ public class ArmorNCRPA extends ArmorFSBPowered implements IItemRendererProvider if(player.isSprinting()) { player.getAttributeMap().applyAttributeModifiers(multimap); } + + if(world.getTotalWorldTime() % 20 != 0) return; + if(HbmPlayerProps.getData(player).enableHUD) player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 300, 0, true)); } @Override public Item getItemForRenderer() { return this; } @@ -79,12 +82,19 @@ public class ArmorNCRPA extends ArmorFSBPowered implements IItemRendererProvider "Helmet,Eyes", "Chest", "LeftArm", "RightArm", "LeftLeg", "RightLeg", "LeftBoot", "RightBoot"); }}; } - + public static final ArmorNCRPAMelee meleeComponent = new ArmorNCRPAMelee(); + public static final ArmorNCRPARanged rangedComponent = new ArmorNCRPARanged(); @Override public IPAMelee getMeleeComponent(EntityPlayer entity) { if(this.hasFSBArmorIgnoreCharge(entity)) return meleeComponent; return null; } + + @Override + public IPARanged getRangedComponent(EntityPlayer entity) { + if(this.hasFSBArmorIgnoreCharge(entity)) return rangedComponent; + return null; + } } diff --git a/src/main/java/com/hbm/items/armor/ArmorNCRPARanged.java b/src/main/java/com/hbm/items/armor/ArmorNCRPARanged.java new file mode 100644 index 000000000..04be55e7c --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ArmorNCRPARanged.java @@ -0,0 +1,51 @@ +package com.hbm.items.armor; + +import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.GunState; +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; +import com.hbm.items.weapon.sedna.factory.XFactoryRocket; +import com.hbm.items.weapon.sedna.mags.MagazineBelt; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class ArmorNCRPARanged implements IPARanged { + + public static MagazineBelt rocketSteerMag = new MagazineBelt(); + public static MagazineBelt rocketMag = new MagazineBelt(); + + @Override public void clickPrimary(ItemStack stack, LambdaContext ctx) { fireRocket(stack, ctx, true); } + @Override public void clickSecondary(ItemStack stack, LambdaContext ctx) { fireRocket(stack, ctx, false); } + + public static void fireRocket(ItemStack stack, LambdaContext ctx, boolean steer) { + + EntityPlayer player = ctx.getPlayer(); + GunState state = ItemGunBaseNT.getState(stack, 0); + MagazineBelt mag = steer ? rocketSteerMag : rocketMag; + + if(state == GunState.IDLE) { + if(mag.acceptedBullets.isEmpty()) { + mag.addConfigs(steer ? XFactoryRocket.rocket_ncrpa_steer : XFactoryRocket.rocket_ncrpa); + } + BulletConfig cfg = mag.getType(stack, player.inventory); + int amount = mag.getAmount(stack, player.inventory); + + if(amount > 0) { + mag.useUpAmmo(stack, player.inventory, 1); + EntityBulletBaseMK4 mk4 = new EntityBulletBaseMK4(player, cfg, 25, 0, 0.25F * (player.getRNG().nextBoolean() ? - 1 : 1), 0, 0); + player.worldObj.spawnEntityInWorld(mk4); + ItemGunBaseNT.setState(stack, 0, GunState.COOLDOWN); + ItemGunBaseNT.setTimer(stack, 0, 10); + player.worldObj.playSoundAtEntity(player, "hbm:weapon.rpgShoot", 0.5F, 0.9F + player.getRNG().nextFloat() * 0.2F); + player.inventoryContainer.detectAndSendChanges(); + } else { + ItemGunBaseNT.setState(stack, 0, GunState.COOLDOWN); + ItemGunBaseNT.setTimer(stack, 0, 10); + player.worldObj.playSoundAtEntity(player, "hbm:weapon.reload.dryFireClick", 1F, 1F); + } + } + } + +} diff --git a/src/main/java/com/hbm/items/armor/ArmorRPA.java b/src/main/java/com/hbm/items/armor/ArmorRPA.java index 0a5c4eeab..fb8a808c7 100644 --- a/src/main/java/com/hbm/items/armor/ArmorRPA.java +++ b/src/main/java/com/hbm/items/armor/ArmorRPA.java @@ -61,4 +61,6 @@ public class ArmorRPA extends ArmorFSBPowered implements IItemRendererProvider, if(this.hasFSBArmorIgnoreCharge(entity)) return meleeComponent; return null; } + + @Override public IPARanged getRangedComponent(EntityPlayer entity) { return null; } } diff --git a/src/main/java/com/hbm/items/armor/IPARanged.java b/src/main/java/com/hbm/items/armor/IPARanged.java new file mode 100644 index 000000000..d05c85ec5 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/IPARanged.java @@ -0,0 +1,11 @@ +package com.hbm.items.armor; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; + +import net.minecraft.item.ItemStack; + +public interface IPARanged { + + public void clickPrimary(ItemStack stack, LambdaContext ctx); + public void clickSecondary(ItemStack stack, LambdaContext ctx); +} diff --git a/src/main/java/com/hbm/items/armor/IPAWeaponsProvider.java b/src/main/java/com/hbm/items/armor/IPAWeaponsProvider.java index babfbbcb2..556191e17 100644 --- a/src/main/java/com/hbm/items/armor/IPAWeaponsProvider.java +++ b/src/main/java/com/hbm/items/armor/IPAWeaponsProvider.java @@ -19,4 +19,18 @@ public interface IPAWeaponsProvider { } return null; } + + public IPARanged getRangedComponent(EntityPlayer entity); + + public static IPARanged getRangedComponentClient() { + return getRangedComponentCommon(MainRegistry.proxy.me()); + } + + public static IPARanged getRangedComponentCommon(EntityPlayer player) { + if(player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() instanceof IPAWeaponsProvider) { + IPAWeaponsProvider prov = (IPAWeaponsProvider) player.inventory.armorInventory[2].getItem(); + return prov.getRangedComponent(player); + } + return null; + } } 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 298e2a108..cbfdd37dd 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 @@ -211,6 +211,8 @@ public class GunFactoryClient { setRendererBulk(LegoClient.RENDER_RPZB, rocket_rpzb); setRendererBulk(LegoClient.RENDER_QD, rocket_qd); setRendererBulk(LegoClient.RENDER_ML, rocket_ml); + setRendererBulk(LegoClient.RENDER_RPZB, rocket_ncrpa_steer); + setRendererBulk(LegoClient.RENDER_RPZB, rocket_ncrpa); setRendererBulk(LegoClient.RENDER_NUKE, nuke_standard, nuke_demo, nuke_high); nuke_tots.setRenderer(LegoClient.RENDER_GRENADE); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryPA.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryPA.java index fc173e8ad..d176e8b3a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryPA.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryPA.java @@ -6,10 +6,12 @@ import java.util.function.BiFunction; import com.hbm.items.ModItems; import com.hbm.items.armor.IPAMelee; +import com.hbm.items.armor.IPARanged; import com.hbm.items.armor.IPAWeaponsProvider; import com.hbm.items.weapon.sedna.Crosshair; import com.hbm.items.weapon.sedna.GunConfig; import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.lib.RefStrings; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.ItemGunBaseNT.GunState; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; @@ -26,14 +28,18 @@ public class XFactoryPA { public static void init() { - ModItems.gun_pa_melee = new ItemGunMelee(WeaponQuality.UTILITY, new GunConfig() - .draw(10).inspect(55).crosshair(Crosshair.NONE) - .rec(new Receiver(0) - .dmg(10F).delay(20).jam(0) - .offset(1, -0.0625 * 2.5, -0.25D)) - .pp(LAMBDA_CLICK_PRIMARY).ps(LAMBDA_CLICK_SENONDARY).decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + ModItems.gun_pa_melee = new ItemGunPA(WeaponQuality.UTILITY, new GunConfig() + .draw(10).crosshair(Crosshair.NONE) + .rec(new Receiver(0)) + .pp(LAMBDA_CLICK_MELEE_PRIMARY).ps(LAMBDA_CLICK_MELEE_SENONDARY).decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) .anim(LAMBDA_MELEE_ANIMS).orchestra(ORCHESTRA) ).setUnlocalizedName("gun_pa_melee"); + + ModItems.gun_pa_ranged = new ItemGunPA(WeaponQuality.UTILITY, new GunConfig() + .draw(0).crosshair(Crosshair.CROSS) + .rec(new Receiver(0)) + .pp(LAMBDA_CLICK_RANGED_PRIMARY).ps(LAMBDA_CLICK_RANGED_SENONDARY).decider(GunStateDecider.LAMBDA_STANDARD_DECIDER) + ).setUnlocalizedName("gun_pa_ranged").setFull3D().setTextureName(RefStrings.MODID + ":gun_pa_ranged"); } public static BiConsumer ORCHESTRA = (stack, ctx) -> { @@ -47,11 +53,11 @@ public class XFactoryPA { return null; }; - public static BiConsumer LAMBDA_CLICK_PRIMARY = (stack, ctx) -> { + public static BiConsumer LAMBDA_CLICK_MELEE_PRIMARY = (stack, ctx) -> { IPAMelee component = IPAWeaponsProvider.getMeleeComponentClient(); if(component != null) component.clickPrimary(stack, ctx); }; - public static BiConsumer LAMBDA_CLICK_SENONDARY = (stack, ctx) -> { + public static BiConsumer LAMBDA_CLICK_MELEE_SENONDARY = (stack, ctx) -> { IPAMelee component = IPAWeaponsProvider.getMeleeComponentClient(); if(component != null) component.clickSecondary(stack, ctx); }; @@ -69,9 +75,18 @@ public class XFactoryPA { } } - public static class ItemGunMelee extends ItemGunBaseNT { + public static BiConsumer LAMBDA_CLICK_RANGED_PRIMARY = (stack, ctx) -> { + IPARanged component = IPAWeaponsProvider.getRangedComponentClient(); + if(component != null) component.clickPrimary(stack, ctx); + }; + public static BiConsumer LAMBDA_CLICK_RANGED_SENONDARY = (stack, ctx) -> { + IPARanged component = IPAWeaponsProvider.getRangedComponentClient(); + if(component != null) component.clickSecondary(stack, ctx); + }; + + public static class ItemGunPA extends ItemGunBaseNT { - public ItemGunMelee(WeaponQuality quality, GunConfig... cfg) { + public ItemGunPA(WeaponQuality quality, GunConfig... cfg) { super(quality, cfg); } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java index 5010a64ef..c490f4836 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java @@ -50,6 +50,8 @@ public class XFactoryRocket { public static BulletConfig[] rocket_rpzb; public static BulletConfig[] rocket_qd; public static BulletConfig[] rocket_ml; + public static BulletConfig[] rocket_ncrpa; + public static BulletConfig[] rocket_ncrpa_steer; // FLYING public static Consumer LAMBDA_STANDARD_ACCELERATE = (entity) -> { @@ -57,13 +59,25 @@ public class XFactoryRocket { if(bullet.accel < 7) bullet.accel += 0.4D; }; public static Consumer LAMBDA_STEERING_ACCELERATE = (entity) -> { + EntityBulletBaseMK4 bullet = (EntityBulletBaseMK4) entity; + if(!(entity instanceof EntityPlayer)) { + if(bullet.accel < 7) bullet.accel += 0.4D; + return; + } + EntityPlayer player = (EntityPlayer) bullet.getThrower(); + steeringAccelerate(entity, player.getHeldItem() == null || !(player.getHeldItem().getItem() instanceof ItemGunBaseNT) || !ItemGunBaseNT.getIsAiming(player.getHeldItem())); + }; + public static Consumer LAMBDA_NCR_ACCELERATE = (entity) -> { + steeringAccelerate(entity, false); + }; + public static void steeringAccelerate(Entity entity, boolean noSteer) { EntityBulletBaseMK4 bullet = (EntityBulletBaseMK4) entity; if(bullet.accel < 4) bullet.accel += 0.4D; if(bullet.getThrower() == null || !(bullet.getThrower() instanceof EntityPlayer)) return; EntityPlayer player = (EntityPlayer) bullet.getThrower(); if(Vec3.createVectorHelper(bullet.posX - player.posX, bullet.posY - player.posY, bullet.posZ - player.posZ).lengthVector() > 100) return; - if(player.getHeldItem() == null || !(player.getHeldItem().getItem() instanceof ItemGunBaseNT) || !ItemGunBaseNT.getIsAiming(player.getHeldItem())) return; + if(noSteer) return; MovingObjectPosition mop = Library.rayTrace(player, 200, 1); if(mop == null || mop.hitVec == null) return; @@ -76,7 +90,7 @@ public class XFactoryRocket { bullet.motionX = vec.xCoord * speed; bullet.motionY = vec.yCoord * speed; bullet.motionZ = vec.zCoord * speed; - }; + } // IMPACT public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { @@ -138,6 +152,7 @@ public class XFactoryRocket { public static BulletConfig makeRPZB(BulletConfig original) { return original.clone(); } public static BulletConfig makeQD(BulletConfig original) { return original.clone().setLife(400).setOnUpdate(LAMBDA_STEERING_ACCELERATE); } + public static BulletConfig makeNCR(BulletConfig original) { return original.clone().setLife(400).setOnUpdate(LAMBDA_NCR_ACCELERATE); } public static BulletConfig makeML(BulletConfig original) { return original.clone(); } //this is starting to get messy but we need to put this crap *somewhere* and fragmenting it into a billion classes with two methods each just isn't gonna help @@ -156,11 +171,15 @@ public class XFactoryRocket { rocket_rpzb = new BulletConfig[rocket_template.length]; rocket_qd = new BulletConfig[rocket_template.length]; rocket_ml = new BulletConfig[rocket_template.length]; + rocket_ncrpa_steer = new BulletConfig[rocket_template.length]; + rocket_ncrpa = new BulletConfig[rocket_template.length]; for(int i = 0; i < rocket_template.length; i++) { rocket_rpzb[i] = makeRPZB(rocket_template[i]); rocket_qd[i] = makeQD(rocket_template[i]); rocket_ml[i] = makeML(rocket_template[i]); + rocket_ncrpa_steer[i] = makeNCR(rocket_template[i]); + rocket_ncrpa[i] = makeRPZB(rocket_template[i]); } ModItems.gun_panzerschreck = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java index c65d4d64b..f51c962a1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/XWeaponModManager.java @@ -268,6 +268,7 @@ public class XWeaponModManager { /** Saves the state on receiver 0 so that if the mag changes through upgrading, the state may potentially be restored, if compatible */ private static void saveMagState(ItemStack stack, int cfg) { IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, cfg).getReceivers(stack)[0].getMagazine(stack); + if(mag == null) return; prevMagType = mag.getType(stack, null); prevMagCount = mag.getAmount(stack, null); } @@ -285,6 +286,7 @@ public class XWeaponModManager { changedMagState = false; IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, cfg).getReceivers(stack)[0].getMagazine(stack); + if(mag == null) return; if(mag.getType(stack, null) == prevMagType) { mag.setAmount(stack, MathHelper.clamp_int(prevMagCount, 0, mag.getCapacity(stack))); } else { diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPAMelee.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPAMelee.java index 20946c0df..b5473d1ae 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPAMelee.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderPAMelee.java @@ -73,4 +73,27 @@ public class ItemRenderPAMelee extends ItemRenderWeaponBase { GL11.glShadeModel(GL11.GL_FLAT); } + + public void renderOther(ItemStack stack, ItemRenderType type, Object... data) { + if(type == type.EQUIPPED) return; + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ncrpa_arm); + + GL11.glPushMatrix(); + double scale = 0.3125D; + GL11.glScaled(scale, scale, scale); + + GL11.glRotated(90, 1, 0, 0); + GL11.glTranslated(0, -5.5, 0); + GL11.glTranslated(-2, 0, 0); + ResourceManager.armor_ncr.renderPart("Leftarm"); + GL11.glTranslated(4, 0, 0); + ResourceManager.armor_ncr.renderPart("RightArm"); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderLoot.java b/src/main/java/com/hbm/render/tileentity/RenderLoot.java index 738152d74..05f85753f 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLoot.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLoot.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL12; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.items.ModItems; +import com.hbm.items.armor.ArmorNCRPA; import com.hbm.items.armor.ArmorTrenchmaster; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.main.ResourceManager; @@ -47,6 +48,8 @@ public class RenderLoot extends TileEntitySpecialRenderer { } else if(stack.getItem() instanceof ArmorTrenchmaster) { renderTrenchmaster(stack); + } else if(stack.getItem() instanceof ArmorNCRPA) { + renderNCR(stack); } else { renderStandardItem(item.getW()); } @@ -107,6 +110,57 @@ public class RenderLoot extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); } + + private void renderNCR(ItemStack stack) { + GL11.glPushMatrix(); + GL11.glTranslated(0.5, 1.5, 0.5); + GL11.glScaled(0.0625, 0.0625, 0.0625); + GL11.glRotated(180, 1, 0, 0); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + if(stack.getItem() == ModItems.ncrpa_helmet) { + bindTexture(ResourceManager.ncrpa_helmet); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + ResourceManager.armor_ncr.renderPart("Helmet"); + GL11.glDisable(GL11.GL_BLEND); + float lastX = OpenGlHelper.lastBrightnessX; + float lastY = OpenGlHelper.lastBrightnessY; + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + GL11.glDisable(GL11.GL_LIGHTING); + ResourceManager.armor_ncr.renderPart("Eyes"); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lastX, lastY); + } + if(stack.getItem() == ModItems.ncrpa_plate) { + bindTexture(ResourceManager.ncrpa_chest); + ResourceManager.armor_ncr.renderPart("Chest"); + bindTexture(ResourceManager.ncrpa_arm); + GL11.glPushMatrix(); + GL11.glRotated(-3, 1, 0, 0); + ResourceManager.armor_ncr.renderPart("LeftArm"); + ResourceManager.armor_ncr.renderPart("RightArm"); + GL11.glPopMatrix(); + } + if(stack.getItem() == ModItems.ncrpa_legs) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ncrpa_leg); + ResourceManager.armor_ncr.renderPart("LeftLeg"); + GL11.glPushMatrix(); + GL11.glRotated(-0.1, 1, 0, 0); + ResourceManager.armor_ncr.renderPart("RightLeg"); + GL11.glPopMatrix(); + } + if(stack.getItem() == ModItems.ncrpa_boots) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ncrpa_leg); + ResourceManager.armor_ncr.renderPart("LeftBoot"); + GL11.glPushMatrix(); + GL11.glRotated(-0.1, 1, 0, 0); + ResourceManager.armor_ncr.renderPart("RightBoot"); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } private void renderNuke() { GL11.glScaled(0.5, 0.5, 0.5); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index df5364607..8ab22405e 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2221,6 +2221,7 @@ item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Raketenwerfer item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pa_melee.name=Powerrüstung - Nahkampfcontroller +item.gun_pa_ranged.name=Powerrüstung - Fernkampfcontroller item.gun_panzerschreck.name=Panzerschreck item.gun_pepperbox.name=Bündelrevolver item.gun_quadro.name=Vierfachraketenwerfer diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 5603c8c43..a72d0289a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3064,6 +3064,7 @@ item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Missile Launcher item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pa_melee.name=Power Armor - Melee Controller +item.gun_pa_ranged.name=Power Armor - Ranged Controller item.gun_panzerschreck.name=Panzerschreck item.gun_pepperbox.name=Pepperbox item.gun_quadro.name=Quad Rocket Launcher diff --git a/src/main/resources/assets/hbm/textures/items/gun_pa_ranged.png b/src/main/resources/assets/hbm/textures/items/gun_pa_ranged.png new file mode 100644 index 0000000000000000000000000000000000000000..92d3a34a8339c26f3377136825a4792ed357f0fb GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfR=l^^mQmqL?|4LlekSkap@yV`E!l&~VgLb5bP0l+XkKj>}cw literal 0 HcmV?d00001