From 4d6a92e015e65a6dce3b514212447b884a25ee54 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 15 Oct 2025 15:13:59 +0200 Subject: [PATCH] i think i may have creeked my flow --- changelog | 18 ++++- .../com/hbm/blocks/network/FluidPump.java | 2 +- .../container/ContainerWeaponTable.java | 7 +- src/main/java/com/hbm/items/ModItems.java | 18 ++--- .../weapon/sedna/factory/GunFactory.java | 1 + .../weapon/sedna/factory/XFactoryDrill.java | 40 +++++++++- .../items/weapon/sedna/impl/ItemGunDrill.java | 71 ++++++++++++++++-- .../sedna/mags/MagazineElectricEngine.java | 2 +- .../weapon/sedna/mods/WeaponModCaliber.java | 16 +--- .../weapon/sedna/mods/WeaponModCanisters.java | 42 +++++++++++ .../sedna/mods/WeaponModDrillFortune.java | 38 ++++++++++ .../weapon/sedna/mods/WeaponModEngine.java | 11 +-- .../weapon/sedna/mods/WeaponModStackMag.java | 3 + .../weapon/sedna/mods/XWeaponModManager.java | 71 ++++++++++++++++-- .../com/hbm/main/ModEventHandlerRenderer.java | 10 +++ .../machine/TileEntityMachineMiningLaser.java | 2 +- .../java/com/hbm/util/EnchantmentUtil.java | 33 +++++--- .../java/com/hbm/util/EntityDamageUtil.java | 3 +- src/main/resources/assets/hbm/lang/de_DE.lang | 9 ++- src/main/resources/assets/hbm/lang/en_US.lang | 9 ++- .../hbm/textures/items/weapon_mod_sheet.png | Bin 5316 -> 5650 bytes .../items/weapon_mod_special.canisters.png | Bin 0 -> 256 bytes .../items/weapon_mod_special.magnet.png | Bin 0 -> 300 bytes .../items/weapon_mod_special.sifter.png | Bin 0 -> 211 bytes 24 files changed, 329 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCanisters.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModDrillFortune.java create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.canisters.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.magnet.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.sifter.png diff --git a/changelog b/changelog index 6e6163f03..5661224ac 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,15 @@ +## Added +* Powered drill + * Gasoline-fueled mining drill with AoE + * Uses the gun system and therefore does not have configurable abilities + * Mining level of iron tools by default + * AoE, melee damage, reach and mining level can be upgraded with drill bits + * Mining speed and fuel used can be changed with engines (diesel, aviation, electric, turbo) + * Fortune can be added as mods (both mods do in fact stack) + * Not a precision tool, intended to be used alongside pickaxes instead of replacing them + * Despite this, sneaking allows the AoE to be disabled + * Unlike pickaxes, shows a preview for what area is to be mined + ## Changed * Updated russian and chinese localization * VNT type explosions now track affected block positions when the explosion events fire, this should ensure compatibility with mods that rely on that @@ -20,11 +32,13 @@ * Conveyor inserters can now accept boxes directly instead of causing them to burst open * Conveyor inserters now have a special rule when supplying an arc furnace where instead of trying a full stack and then one item, the first always failing and the last being too slow, they will supply the slot target amount instead * Given the cycle delay and the lid's movement speed, the inserters should now be fast enough to fully supply a speed III arc furnace -* Skeletons can bow be gibbed by explosions, although it will spawn clean bone particles and omit the gore splash effect +* Skeletons can now be gibbed by explosions, although it will spawn clean bone particles and omit the gore splash effect +* Polymer power tools now only have AoE 1 instead of AoE 2 ## Fixed * Fixed the T-51b set not having radiation resistance * Potentially fixed a crash on thermos-derived servers involving the flow control pumps * Fixed crash caused when another tile entity replaces an RBMK component due to an unchecked cast * Fixed constant cascading chunk gen caused by meteorites and flower patches -* Fixed garbage loot pool sometimes producing "stone wires" \ No newline at end of file +* Fixed garbage loot pool sometimes producing "stone wires" +* Fixed mining lasers targeting blocks with the "gas" material \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/network/FluidPump.java b/src/main/java/com/hbm/blocks/network/FluidPump.java index c94cd205d..fb0730ceb 100644 --- a/src/main/java/com/hbm/blocks/network/FluidPump.java +++ b/src/main/java/com/hbm/blocks/network/FluidPump.java @@ -130,7 +130,6 @@ public class FluidPump extends BlockContainer implements INBTBlockTransformable, return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } - @SideOnly(Side.CLIENT) @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public static class TileEntityFluidPump extends TileEntityLoadedBase implements IFluidStandardTransceiverMK2, IControlReceiver, SimpleComponent, CompatHandler.OCComponent { @@ -348,6 +347,7 @@ public class FluidPump extends BlockContainer implements INBTBlockTransformable, } } + @SideOnly(Side.CLIENT) public static class GUIPump extends GuiScreen { protected final TileEntityFluidPump pump; diff --git a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java index 9b2f23c2a..c40002880 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java @@ -49,7 +49,7 @@ public class ContainerWeaponTable extends Container { @Override public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onPickupFromSlot(player, stack); - + XWeaponModManager.install( stack, index, mods.getStackInSlot(0), @@ -91,7 +91,7 @@ public class ContainerWeaponTable extends Container { if(stack != null && stack.getItem() instanceof ItemGunBaseNT) { int configs = ((ItemGunBaseNT) stack.getItem()).getConfigCount(); if(configs < button) return null; - + XWeaponModManager.install( stack, this.index, mods.getStackInSlot(0), @@ -197,19 +197,16 @@ public class ContainerWeaponTable extends Container { public void putStack(ItemStack stack) { super.putStack(stack); refreshInstalledMods(); - XWeaponModManager.onInstallStack(gun.getStackInSlot(0), stack, index); } @Override public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onPickupFromSlot(player, stack); refreshInstalledMods(); - XWeaponModManager.onUninstallStack(gun.getStackInSlot(0), stack, index); } public void refreshInstalledMods() { if(gun.getStackInSlot(0) == null) return; - XWeaponModManager.uninstall(gun.getStackInSlot(0), index); XWeaponModManager.install( gun.getStackInSlot(0), index, mods.getStackInSlot(0), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 6dee7b14a..7edac6a80 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4549,15 +4549,15 @@ public class ModItems { .addAbility(IWeaponAbility.STUN, 2).setUnlocalizedName("elec_sword").setTextureName(RefStrings.MODID + ":elec_sword_anim"); elec_pickaxe = new ItemToolAbilityPower(6F, 0, MainRegistry.tMatElec, EnumToolType.PICKAXE, 500000, 1000, 100) - .addAbility(IToolAreaAbility.HAMMER, 1) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) + .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim"); elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100) - .addAbility(IToolAreaAbility.HAMMER, 1) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) + .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4565,8 +4565,8 @@ public class ModItems { .addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim"); elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100) - .addAbility(IToolAreaAbility.HAMMER, 1) - .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) + .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim"); @@ -4677,7 +4677,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IToolAreaAbility.HAMMER, 1) .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) - .addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setTextureName(RefStrings.MODID + ":drax"); + .addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax"); drax_mk2 = new ItemToolAbilityPower(15F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 1000000000, 250000, 7500) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.SHREDDER, 0) @@ -4685,7 +4685,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.LUCK, 2) .addAbility(IToolAreaAbility.HAMMER, 2) .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) - .addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setTextureName(RefStrings.MODID + ":drax_mk2"); + .addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax_mk2"); drax_mk3 = new ItemToolAbilityPower(20F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 2500000000L, 500000, 10000) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.SHREDDER, 0) @@ -4695,7 +4695,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IToolAreaAbility.HAMMER, 3) .addAbility(IToolAreaAbility.HAMMER_FLAT, 3) - .addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setTextureName(RefStrings.MODID + ":drax_mk3"); + .addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setCreativeTab(null).setTextureName(RefStrings.MODID + ":drax_mk3"); ToolMaterial matBismuth = EnumHelper.addToolMaterial("HBM_BISMUTH", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); bismuth_pickaxe = new ItemToolAbility(15F, 0, matBismuth, EnumToolType.MINER) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index bccb184c5..11896fab7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -169,6 +169,7 @@ public class GunFactory { NICKEL, DOUBLOONS, DRILL_HSS, DRILL_WEAPONSTEEL, DRILL_TCALLOY, DRILL_SATURNITE, ENGINE_DIESEL, ENGINE_AVIATION, ENGINE_ELECTRIC, ENGINE_TURBO, + MAGNET, SIFTER, CANISTERS } public static enum EnumModCaliber { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryDrill.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryDrill.java index d69bd9bf8..ad5a51dfd 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryDrill.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryDrill.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.blocks.ICustomBlockHighlight; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; @@ -23,13 +24,17 @@ import com.hbm.render.anim.AnimationEnums.GunAnimation; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.util.EntityDamageUtil; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.network.play.server.S28PacketEffect; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -88,7 +93,7 @@ public class XFactoryDrill { } int ammoToUse = 10; - if(XWeaponModManager.hasUpgrade(stack, 0, XWeaponModManager.ID_ENGINE_ELECTRIC)) ammoToUse = 500; // that's 2,000 operations + if(XWeaponModManager.hasUpgrade(stack, 0, XWeaponModManager.ID_ENGINE_ELECTRIC)) ammoToUse = 1_000; // that's 1,000 operations mag.useUpAmmo(stack, ctx.inventory, ammoToUse); if(calcWear) ItemGunBaseNT.setWear(stack, index, Math.min(ItemGunBaseNT.getWear(stack, index), ctx.config.getDurability(stack))); } @@ -140,4 +145,37 @@ public class XFactoryDrill { return null; }; + + /** + * Called by the ModEventHandlerRenderer if the held item is a drill, cancels the tooltip so we an replace it with this. + * Should probably make an interface for stuff like this + * @param player + * @param drill + * @param interp + */ + @SideOnly(Side.CLIENT) + public static void drawBlockHighlight(EntityPlayer player, ItemStack drill, float interp) { + MovingObjectPosition mop = EntityDamageUtil.getMouseOver(player, getModdableReach(drill, 5.0D)); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) interp; + double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) interp; + double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; + + ICustomBlockHighlight.setup(); + + int aoe = player.isSneaking() ? 0 : getModdableAoE(drill, 1); + + float exp = 0.002F; + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + RenderGlobal.drawOutlinedBoundingBox(aabb.expand(exp, exp, exp).getOffsetBoundingBox(mop.blockX - dX, mop.blockY - dY, mop.blockZ - dZ), aoe > 0 ? -1 : 0x800000); + + if(aoe > 0) { + aabb = AxisAlignedBB.getBoundingBox(-aoe, -aoe, -aoe, 1 + aoe, 1 + aoe, 1 + aoe); + RenderGlobal.drawOutlinedBoundingBox(aabb.expand(exp, exp, exp).getOffsetBoundingBox(mop.blockX - dX, mop.blockY - dY, mop.blockZ - dZ), 0x800000); + } + + ICustomBlockHighlight.cleanup(); + } + } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java index 55ef58dd5..084ace60b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java @@ -6,6 +6,7 @@ import com.hbm.items.weapon.sedna.GunConfig; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.factory.XFactoryDrill; import com.hbm.items.weapon.sedna.mags.IMagazine; +import com.hbm.items.weapon.sedna.mags.MagazineElectricEngine; import com.hbm.items.weapon.sedna.mags.MagazineLiquidEngine; import api.hbm.energymk2.IBatteryItem; @@ -32,7 +33,13 @@ public class ItemGunDrill extends ItemGunBaseNT implements IFillableItem, IBatte @Override public boolean acceptsFluid(FluidType type, ItemStack stack) { IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); - return mag instanceof MagazineLiquidEngine; + + if(mag instanceof MagazineLiquidEngine) { + MagazineLiquidEngine engine = (MagazineLiquidEngine) mag; + for(FluidType acc : engine.acceptedTypes) if(type == acc) return true; + } + + return false; } @Override @@ -72,12 +79,60 @@ public class ItemGunDrill extends ItemGunBaseNT implements IFillableItem, IBatte return 0; } - // TBI - @Override public void chargeBattery(ItemStack stack, long i) { } - @Override public void setCharge(ItemStack stack, long i) { } - @Override public void dischargeBattery(ItemStack stack, long i) { } - @Override public long getCharge(ItemStack stack) { return 0; } - @Override public long getMaxCharge(ItemStack stack) { return 0; } - @Override public long getChargeRate() { return 0; } + @Override + public void chargeBattery(ItemStack stack, long i) { + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); + + if(mag instanceof MagazineElectricEngine) { + MagazineElectricEngine engine = (MagazineElectricEngine) mag; + engine.setAmount(stack, Math.min(engine.capacity, engine.getAmount(stack, null) + (int) i)); + } + } + + @Override + public void setCharge(ItemStack stack, long i) { + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); + + if(mag instanceof MagazineElectricEngine) { + MagazineElectricEngine engine = (MagazineElectricEngine) mag; + engine.setAmount(stack, (int) i); + } + } + + @Override + public void dischargeBattery(ItemStack stack, long i) { + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); + + if(mag instanceof MagazineElectricEngine) { + MagazineElectricEngine engine = (MagazineElectricEngine) mag; + engine.setAmount(stack, Math.max(0, engine.getAmount(stack, null) - (int) i)); + } + } + + @Override + public long getCharge(ItemStack stack) { + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); + + if(mag instanceof MagazineElectricEngine) { + MagazineElectricEngine engine = (MagazineElectricEngine) mag; + return engine.getAmount(stack, null); + } + + return 0; + } + + @Override + public long getMaxCharge(ItemStack stack) { + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack); + + if(mag instanceof MagazineElectricEngine) { + MagazineElectricEngine engine = (MagazineElectricEngine) mag; + return engine.getCapacity(stack); + } + + return 0; + } + + @Override public long getChargeRate() { return 50_000; } @Override public long getDischargeRate() { return 0; } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineElectricEngine.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineElectricEngine.java index ea38a19d9..1c8c2c285 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineElectricEngine.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineElectricEngine.java @@ -42,7 +42,7 @@ public class MagazineElectricEngine implements IMagazine { @Override public void reloadAction(ItemStack stack, IInventory inventory) { } @Override public SpentCasing getCasing(ItemStack stack, IInventory inventory) { return null; } - @Override public ItemStack getIconForHUD(ItemStack stack, EntityPlayer player) { return new ItemStack(ModItems.battery_creative); } + @Override public ItemStack getIconForHUD(ItemStack stack, EntityPlayer player) { return new ItemStack(ModItems.battery_generic); } @Override public String reportAmmoStateForHUD(ItemStack stack, EntityPlayer player) { return BobMathUtil.getShortNumber(getAmount(stack, player.inventory)) + "/" + BobMathUtil.getShortNumber(this.capacity) + "HE"; } @Override public void setAmountBeforeReload(ItemStack stack, int amount) { ItemGunBaseNT.setValueInt(stack, KEY_MAG_PREV + index, amount); } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java index 7bbd1f3db..cc96ea38c 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java @@ -4,13 +4,10 @@ import java.util.ArrayList; import java.util.List; import com.hbm.items.weapon.sedna.BulletConfig; -import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; -import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; -import com.hbm.items.weapon.sedna.mags.MagazineSingleTypeBase; import net.minecraft.item.ItemStack; @@ -60,15 +57,6 @@ public class WeaponModCaliber extends WeaponModBase { } /* adding or removing a caliber mod annihilates the loaded rounds */ - @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } - @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } - - public void clearMag(ItemStack stack, int index) { - ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - IMagazine mag = gun.getConfig(stack, index).getReceivers(stack)[0].getMagazine(stack); - if(mag instanceof MagazineSingleTypeBase) { - MagazineSingleTypeBase mstb = (MagazineSingleTypeBase) mag; - mstb.setAmount(stack, 0); - } - } + @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } + @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCanisters.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCanisters.java new file mode 100644 index 000000000..cef95f06e --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCanisters.java @@ -0,0 +1,42 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.mags.MagazineElectricEngine; +import com.hbm.items.weapon.sedna.mags.MagazineLiquidEngine; + +import net.minecraft.item.ItemStack; + +public class WeaponModCanisters extends WeaponModBase { + + protected static MagazineLiquidEngine DUMMY_LIQUID = new MagazineLiquidEngine(0, 0); + protected static MagazineElectricEngine DUMMY_ELECTRIC = new MagazineElectricEngine(0, 0); + + public WeaponModCanisters(int id) { + super(id, "CANISTERS"); + this.setPriority(PRIORITY_MULT_FINAL); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.O_MAGAZINE) { + if(base instanceof MagazineLiquidEngine) { + MagazineLiquidEngine original = (MagazineLiquidEngine) base; + DUMMY_LIQUID.acceptedTypes = original.acceptedTypes; + DUMMY_LIQUID.capacity = original.capacity * 3; + DUMMY_LIQUID.index = original.index; + return (T) DUMMY_LIQUID; + } + + if(base instanceof MagazineElectricEngine) { + MagazineElectricEngine original = (MagazineElectricEngine) base; + DUMMY_ELECTRIC.capacity = original.capacity * 3; + DUMMY_ELECTRIC.index = original.index; + return (T) DUMMY_ELECTRIC; + } + } + return base; + } + + @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } + @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModDrillFortune.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModDrillFortune.java new file mode 100644 index 000000000..ea89dbfdd --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModDrillFortune.java @@ -0,0 +1,38 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.util.EnchantmentUtil; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.ItemStack; + +public class WeaponModDrillFortune extends WeaponModBase { + + int addFortune = 0; + + public WeaponModDrillFortune(int id, String slot, int fortune) { + super(id, slot); + this.setPriority(PRIORITY_ADDITIVE); + this.addFortune = fortune; + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + return base; + } + + @Override + public void onInstall(ItemStack gun, ItemStack mod, int index) { + int fortuneLvl = EnchantmentUtil.getEnchantmentLevel(gun, Enchantment.fortune); + fortuneLvl += this.addFortune; + EnchantmentUtil.removeEnchantment(gun, Enchantment.fortune); + EnchantmentUtil.addEnchantment(gun, Enchantment.fortune, fortuneLvl); + } + + @Override + public void onUninstall(ItemStack gun, ItemStack mod, int index) { + int fortuneLvl = EnchantmentUtil.getEnchantmentLevel(gun, Enchantment.fortune); + fortuneLvl -= this.addFortune; + EnchantmentUtil.removeEnchantment(gun, Enchantment.fortune); + if(fortuneLvl > 0) EnchantmentUtil.addEnchantment(gun, Enchantment.fortune, fortuneLvl); + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModEngine.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModEngine.java index 70a2e09db..f4f067f6b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModEngine.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModEngine.java @@ -1,7 +1,6 @@ package com.hbm.items.weapon.sedna.mods; import com.hbm.inventory.fluid.Fluids; -import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineElectricEngine; @@ -36,12 +35,6 @@ public class WeaponModEngine extends WeaponModBase { return base; } - @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } - @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } - - public void clearMag(ItemStack stack, int index) { - ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - IMagazine mag = gun.getConfig(stack, index).getReceivers(stack)[0].getMagazine(stack); - mag.setAmount(stack, 0); - } + @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } + @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModStackMag.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModStackMag.java index 6fd3e35a1..3ef2e7ea7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModStackMag.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModStackMag.java @@ -38,4 +38,7 @@ public class WeaponModStackMag extends WeaponModBase { } return base; } + + @Override public void onInstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } + @Override public void onUninstall(ItemStack gun, ItemStack mod, int index) { XWeaponModManager.changedMagState(); } } 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 e60cee0ae..2dc9cb2e6 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 @@ -11,6 +11,7 @@ import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.factory.XFactory9mm; +import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModCaliber; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModGeneric; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModSpecial; @@ -27,6 +28,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Item.ToolMaterial; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; /** * The mod manager operates by scraping upgrades from a gun, then iterating over them and evaluating the given value, passing the modified value to successive mods. @@ -155,12 +157,15 @@ public class XWeaponModManager { new WeaponModDefinition(EnumModSpecial.DRILL_HSS).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_HSS).damage(1.25F).dt(3F).pierce(0.15F).harvest(ToolMaterial.EMERALD.ordinal())); new WeaponModDefinition(EnumModSpecial.DRILL_WEAPONSTEEL).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_WSTEEL).damage(1.5F).dt(5F).pierce(0.2F).aoe(2).harvest(ToolMaterial.EMERALD.ordinal())); - new WeaponModDefinition(EnumModSpecial.DRILL_TCALLOY).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_TCALLOY).damage(2F).dt(7.5F).pierce(0.2F).reach(1.5).aoe(2).harvest(ToolMaterial.EMERALD.ordinal() + 1)); - new WeaponModDefinition(EnumModSpecial.DRILL_SATURNITE).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_SATURN).damage(3F).dt(10F).pierce(0.25F).reach(2).aoe(2).harvest(ToolMaterial.EMERALD.ordinal() + 2)); + new WeaponModDefinition(EnumModSpecial.DRILL_TCALLOY).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_TCALLOY).damage(2F).dt(7.5F).pierce(0.2F).reach(2).aoe(3).harvest(ToolMaterial.EMERALD.ordinal() + 1)); + new WeaponModDefinition(EnumModSpecial.DRILL_SATURNITE).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrill(ID_DRILL_SATURN).damage(3F).dt(10F).pierce(0.25F).reach(2).aoe(3).harvest(ToolMaterial.EMERALD.ordinal() + 2)); new WeaponModDefinition(EnumModSpecial.ENGINE_DIESEL).addMod(new Item[] {ModItems.gun_drill}, new WeaponModEngine(ID_ENGINE_DIESEL).mag(WeaponModEngine.ENGINE_DIESEL).delay(15)); new WeaponModDefinition(EnumModSpecial.ENGINE_AVIATION).addMod(new Item[] {ModItems.gun_drill}, new WeaponModEngine(ID_ENGINE_AVIATION).mag(WeaponModEngine.ENGINE_AVIATION).delay(10)); new WeaponModDefinition(EnumModSpecial.ENGINE_ELECTRIC).addMod(new Item[] {ModItems.gun_drill}, new WeaponModEngine(ID_ENGINE_ELECTRIC).mag(WeaponModEngine.ENGINE_ELECTRIC).delay(15)); new WeaponModDefinition(EnumModSpecial.ENGINE_TURBO).addMod(new Item[] {ModItems.gun_drill}, new WeaponModEngine(ID_ENGINE_TURBO).mag(WeaponModEngine.ENGINE_TURBO).delay(2)); + new WeaponModDefinition(EnumModSpecial.MAGNET).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrillFortune(230, "MAGNET", 2)); + new WeaponModDefinition(EnumModSpecial.SIFTER).addMod(new Item[] {ModItems.gun_drill}, new WeaponModDrillFortune(231, "SIFTER", 1)); + new WeaponModDefinition(EnumModSpecial.CANISTERS).addMod(new Item[] {ModItems.gun_drill}, new WeaponModCanisters(232)); BulletConfig[] p9 = new BulletConfig[] {XFactory9mm.p9_sp, XFactory9mm.p9_fmj, XFactory9mm.p9_jhp, XFactory9mm.p9_ap}; BulletConfig[] p45 = new BulletConfig[] {XFactory45.p45_sp, XFactory45.p45_fmj, XFactory45.p45_jhp, XFactory45.p45_ap, XFactory45.p45_du}; @@ -249,8 +254,51 @@ public class XWeaponModManager { return false; } - /** Installs the supplied mods to the gun */ + private static Object prevMagType; + private static int prevMagCount; + private static boolean changedMagState = false; + + public static void changedMagState() { + changedMagState = true; + } + + /** 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); + prevMagType = mag.getType(stack, null); + prevMagCount = mag.getAmount(stack, null); + } + + /* + * TODO: as soon as there's guns that use more receivers, handle those as well + * arising problem: assume there's three receivers, 0, 1, 2, and receiver 1 is removed by pulling a weapon mod. + * the previous states of receivers 0 and 2 would need to be mapped to the new receivers 0 and 1. + * proposed solution: order can be expected the same, simply check both arrays side by side and skip an index on either + * one if that one's type doesn't match. there may be edge cases where this doesn't work, especially with a ton of + * receivers, but for a common case of an SMG + GL this should work just fine + */ + private static void restoreMagState(ItemStack stack, int cfg) { + if(!changedMagState) return; + changedMagState = false; + + IMagazine mag = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, cfg).getReceivers(stack)[0].getMagazine(stack); + if(mag.getType(stack, null) == prevMagType) { + mag.setAmount(stack, MathHelper.clamp_int(prevMagCount, 0, mag.getCapacity(stack))); + } else { + mag.setAmount(stack, 0); + } + } + + /** + * Saves the mag state on receiver 0, uninstalls all existing mods to ensure there's no double install calls, + * then installs the mods. If a mag state change has been reported, the mag on receiver 0 is validated, + * i.e. if the type is still the same, the amount is restored, otherwise the mag is cleared. + */ public static void install(ItemStack stack, int cfg, ItemStack... mods) { + saveMagState(stack, cfg); + // we need to always clear things, so existing mods aren't installed twice, i.e. enchantment levels applied twice + uninstall(stack, cfg); + List toInstall = new ArrayList(); ComparableStack gun = new ComparableStack(stack); @@ -260,8 +308,9 @@ public class XWeaponModManager { WeaponModDefinition def = stackToMod.get(comp); if(def != null) { IWeaponMod forGun = def.modByGun.get(gun); - if(forGun != null) toInstall.add(forGun); //since this code only runs for upgrading, we can just indexOf because who cares - else { + if(forGun != null) { + toInstall.add(forGun); //since this code only runs for upgrading, we can just indexOf because who cares + } else { forGun = def.modByGun.get(null); if(forGun != null) toInstall.add(forGun); } @@ -271,13 +320,21 @@ public class XWeaponModManager { toInstall.sort(modSorter); if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); int[] modIds = new int[toInstall.size()]; - for(int i = 0; i < modIds.length; i++) modIds[i] = idToMod.inverse().get(toInstall.get(i)); + for(int i = 0; i < modIds.length; i++) { + IWeaponMod mod = toInstall.get(i); + modIds[i] = idToMod.inverse().get(mod); + onInstallStack(stack, modToStack.get(mod), cfg); + } stack.stackTagCompound.setIntArray(KEY_MOD_LIST + cfg, modIds); + restoreMagState(stack, cfg); } /** Wipes all mods from the gun */ public static void uninstall(ItemStack stack, int cfg) { - if(stack.hasTagCompound()) { + if(stack != null && stack.hasTagCompound()) { + for(ItemStack mod : getUpgradeItems(stack, cfg)) { + XWeaponModManager.onUninstallStack(stack, mod, cfg); + } stack.stackTagCompound.removeTag(KEY_MOD_LIST + cfg); //no need to clean up empty stackTagCompound because gun NBT is never empty anyway } diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index fc9bfe68b..78a531acf 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -5,9 +5,11 @@ import com.hbm.config.ClientConfig; import com.hbm.config.RadiationConfig; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.IAnimatedItem; +import com.hbm.items.ModItems; import com.hbm.items.armor.IArmorDisableModel; import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart; import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.factory.XFactoryDrill; import com.hbm.packet.PermaSyncHandler; import com.hbm.render.item.weapon.sedna.ItemRenderWeaponBase; import com.hbm.render.model.ModelMan; @@ -409,6 +411,14 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onDrawHighlight(DrawBlockHighlightEvent event) { + + EntityPlayer player = MainRegistry.proxy.me(); + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gun_drill) { + XFactoryDrill.drawBlockHighlight(player, player.getHeldItem(), event.partialTicks); + event.setCanceled(true); + return; + } + MovingObjectPosition mop = event.target; if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 358aa12ec..b7b8b277b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -425,7 +425,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } private boolean canBreak(Block block, int x, int y, int z) { - return !block.isAir(worldObj, x, y, z) && block.getBlockHardness(worldObj, x, y, z) >= 0 && !block.getMaterial().isLiquid() && block != Blocks.bedrock; + return !block.isAir(worldObj, x, y, z) && block.getMaterial() != ModBlocks.materialGas && block.getBlockHardness(worldObj, x, y, z) >= 0 && !block.getMaterial().isLiquid() && block != Blocks.bedrock; } public int getRange() { diff --git a/src/main/java/com/hbm/util/EnchantmentUtil.java b/src/main/java/com/hbm/util/EnchantmentUtil.java index 8007924ae..9899c6939 100644 --- a/src/main/java/com/hbm/util/EnchantmentUtil.java +++ b/src/main/java/com/hbm/util/EnchantmentUtil.java @@ -13,7 +13,6 @@ public class EnchantmentUtil { * @param level */ public static void addEnchantment(ItemStack stack, Enchantment enchantment, int level) { - stack.addEnchantment(enchantment, level); } @@ -24,8 +23,7 @@ public class EnchantmentUtil { */ public static void removeEnchantment(ItemStack stack, Enchantment enchantment) { - if(stack.getEnchantmentTagList() == null) - return; + if(stack.getEnchantmentTagList() == null) return; int i = 0; for( ; i < stack.getEnchantmentTagList().tagCount(); i++) { @@ -40,20 +38,31 @@ public class EnchantmentUtil { stack.getTagCompound().removeTag("ench"); } + public static int getEnchantmentLevel(ItemStack stack, Enchantment enchantment) { + if(stack.getEnchantmentTagList() == null) return 0; + + for(int i = 0; i < stack.getEnchantmentTagList().tagCount(); i++) { + if(stack.getEnchantmentTagList().getCompoundTagAt(i).getShort("id") == enchantment.effectId) + return stack.getEnchantmentTagList().getCompoundTagAt(i).getShort("lvl"); + } + + return 0; + } + /** * Returns the size of the XP bar for the given level * @param level * @return */ - public static int xpBarCap(int level) { - return level >= 30 ? 62 + (level - 30) * 7 : (level >= 15 ? 17 + (level - 15) * 3 : 17); - } - - /** - * - * @param targetXp - * @return - */ + public static int xpBarCap(int level) { + return level >= 30 ? 62 + (level - 30) * 7 : (level >= 15 ? 17 + (level - 15) * 3 : 17); + } + + /** + * + * @param targetXp + * @return + */ public static int getLevelForExperience(int xp) { int level = 0; diff --git a/src/main/java/com/hbm/util/EntityDamageUtil.java b/src/main/java/com/hbm/util/EntityDamageUtil.java index 6ba1791ce..5aa57beaf 100644 --- a/src/main/java/com/hbm/util/EntityDamageUtil.java +++ b/src/main/java/com/hbm/util/EntityDamageUtil.java @@ -497,6 +497,7 @@ public class EntityDamageUtil { } public static Vec3 getPosition(EntityPlayer player) { - return Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); + boolean client = player.yOffset != 0; // shitty hack to account for the weird offset rules i couldn't really work around otherwise + return Vec3.createVectorHelper(player.posX, player.posY + (client ? 0 : player.getEyeHeight()), player.posZ); } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 8da8f4d1a..a47a56742 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1909,9 +1909,9 @@ item.door_metal.name=Metalltür item.door_office.name=Bürotür item.door_red.name=Rote Tür item.dosimeter.name=Dosimeter -item.drax.name=Terra-Bohrer -item.drax_mk2.name=Gehärteter Terra-Bohrer -item.drax_mk3.name=Schrabidischer Terra-Bohrer +item.drax.name=Terra-Bohrer (LEGACY) +item.drax_mk2.name=Gehärteter Terra-Bohrer (LEGACY) +item.drax_mk3.name=Schrabidischer Terra-Bohrer (LEGACY) item.drillbit_desh.name=Desh-Bohrspitze item.drillbit_desh_diamond.name=Desh-Bohrspitze (Diamantbeschichtung) item.drillbit_ferro.name=Ferrouran-Bohrspitze @@ -3658,6 +3658,7 @@ item.weapon_mod_generic.tcalloy_dura.name=Langlebige Legierungsteile item.weapon_mod_generic.wsteel_damage.name=Optimierter Waffenstahl-Verschluss item.weapon_mod_generic.wsteel_dura.name=Langlebige Waffenstahl-Teile item.weapon_mod_special.bayonet.name=Bayonet +item.weapon_mod_special.canisters.name=Motorisierter Bohrer - Zusätzliche Kanister item.weapon_mod_special.choke.name=Choke item.weapon_mod_special.doubloons.name=Zwei Golddublonen item.weapon_mod_special.drill_hss.name=Motorisierter Bohrer - Schnellarbeitsstahl-Bohrkopf @@ -3674,9 +3675,11 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernisierungskit item.weapon_mod_special.las_auto.name=Lasergewehr - Autommatischer Verschluss item.weapon_mod_special.las_capacitor.name=Lasergewehr - Erweiterter Kondensator item.weapon_mod_special.las_shotgun.name=Lasergewehr - Strahlteiler +item.weapon_mod_special.magnet.name=Motorisierter Bohrer - Elektromagnet item.weapon_mod_special.nickel.name=10 Cent item.weapon_mod_special.saw.name=Bügelsäge item.weapon_mod_special.scope.name=Ziehlvorrichtung +item.weapon_mod_special.sifter.name=Motorisierter Bohrer - Sieb item.weapon_mod_special.silencer.name=Schalldämpfer item.weapon_mod_special.skin_saturnite.name=Saturnit-Skin item.weapon_mod_special.slowdown.name=Rädergetriebe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c68ebd25f..79da8ba6b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2725,9 +2725,9 @@ item.door_metal.name=Metal Door item.door_office.name=Office Door item.door_red.name=Red Door item.dosimeter.name=Dosimeter -item.drax.name=Terra Drill -item.drax_mk2.name=Hardened Terra Drill -item.drax_mk3.name=Schrabidic Terra Drill +item.drax.name=Terra Drill (LEGACY) +item.drax_mk2.name=Hardened Terra Drill (LEGACY) +item.drax_mk3.name=Schrabidic Terra Drill (LEGACY) item.drillbit_desh.name=Desh Drillbit item.drillbit_desh_diamond.name=Desh Drillbit (Diamond-Tipped) item.drillbit_ferro.name=Ferrouranium Drillbit @@ -4805,6 +4805,7 @@ item.weapon_mod_generic.tcalloy_dura.name=High-Durability Resistant Alloy Parts item.weapon_mod_generic.wsteel_damage.name=Optimized Weapon Steel Receiver item.weapon_mod_generic.wsteel_dura.name=High-Durability Weapon Steel Parts item.weapon_mod_special.bayonet.name=Bayonet +item.weapon_mod_special.canisters.name=Powered Drill - Extension Canisters item.weapon_mod_special.choke.name=Choke item.weapon_mod_special.doubloons.name=Two Gold Doubloons item.weapon_mod_special.drill_hss.name=Powered Drill - High-Speed Steel Drillbit @@ -4821,9 +4822,11 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernization Kit item.weapon_mod_special.las_auto.name=Laser Rifle Automatic Receiver item.weapon_mod_special.las_capacitor.name=Laser Rifle Extended Capacitor item.weapon_mod_special.las_shotgun.name=Laser Rifle Beam Splitter +item.weapon_mod_special.magnet.name=Powered Drill - Electromagnet item.weapon_mod_special.nickel.name=Two Nickels item.weapon_mod_special.saw.name=Hacksaw item.weapon_mod_special.scope.name=Scope +item.weapon_mod_special.sifter.name=Powered Drill - Sifter item.weapon_mod_special.silencer.name=Silencer item.weapon_mod_special.skin_saturnite.name=Saturnite Skin item.weapon_mod_special.slowdown.name=Gear Train diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png index 4eb0e8aa0f330ece0fbb30b9652675d088b076e0..7d7b022fefe2f8d9648da0fcbae6b17bce804e4e 100644 GIT binary patch literal 5650 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 QUh)DODmu#Lik89u2jJPvI{*Lx literal 5316 zcmX9?2UJr{)4rjG-lZ6d^hgOHRch$GbQDAkMLv3vW(1^$fK=%SDoqqcnsh1BqzNbx zlnzQaL29T$0{rp(_srcnJLlY)yR$RT%x;pEg%J}yA3Xp7OeV(qHe~Md?*-G4$Cc+H zs$@p>P}k%(nEXV5-4X$SGu%WUemk^a+c6x)XG9TeUwYpdM+WP5bBbN=&Qm-A1bv?@wC zWWm21&X5cqyB7WEg~G`67_Aig$A+jyS+;SO8@=mk+gDZsRON1G?=m)Ohdn~6N>oUS zuAwW@+0n7uK9^JbNmTI7!qPWyD83%_$ipok8M@N42^O*end?o&T%D91aec{33VO>%7 z7y-5d3yH_e>v;iTZal!=@Vl@PcdONgGdo+`%&IDBJlE&t0M?X#ij;m#XQ!5Gi8Ah0x-Z*)hN7Y^JNqubP{=MMOk+czC)UdUtE_rzsUA-a`f@Ex;+RqT;&w$d3(F z))(dJ)x$x#w2+g%0ne`it%xjl6J9|eczdqjK$s05lmz_!`giG5v9%Q&8kf?2{8$YHG|v|{f&t=7UxgRgR{1CGV=-@<_!B1)$Ljsv z-GE(!Go0`vMCj;jq#gWUL??A)QxicQ&s9=V5`%mY#!+qV--A1#bFfk5GjMko1FabZ zs6q-54CB`+l%f{)AP0Bzz^*ElJ#ME#^DXAdQOBacc3aH>rC>9&SrpCHa%JT3PV?oL$OQqyh&i7{1jhQ!b;gL zpb(Y9KwCN9@G0eF&SIp;PH?u#*)8B+OZ3^P$t0O*1O z2%rOp$B46KbA5KLW1S*$ZeeriOT;lViK|@jByGJ4wA+HU5Gy%WgdaS30Qt&7MKL%y zh}{~^Sr{j6Y8f4?seIJ3$=UmqLx`EdDqg5}y)SW7-kjBLKl7J8l1L+giATGs{{87&-UL@2@F?H1V8Pcki0uZLF=~=un7B{N+jtjD0HA zO7>GayEFYgL8$OQMeonXhnwxCNm^BeBZ%|xHhw*N)=St|txh$InKCi;eK3V9+rUGR z>+0q@rS7UkFSj1dSz7omZ4Vtiepyio1_z(9n7z1@Vae3>a91cqDJ}Xf5sC>7PQTK& z_bR);EV6s@=EbuWJxdJ@(9PA2?EXCZd&cn!;*x?^j*cU+uv4gw`p!&UY-4lto2n|t z?d|Q*v+d^W23!UGndWvS1Cu=CA;+N{b#1pEr-_b3cEEPfSdB`Bm83 z+OA<#;`R+;Q8PYYx@nypTc4z*F{4l@{3tabKVDy7Ppp4WXj+ISLrjU6%$GxQVjBrY z_FZ*G4pIPAvhO=O_#2N|n3;uDRPruIHjjLumR^ncxfy<;?nO;0-Wa}O1BDH1`rB8w7u?D{AI3=#uDI!Q1ukh{A(3AeC-sQqBPl{*oz z2=iOf)}FGdNMX>)5U@pR+Q>YK@7gGAx2FnxA&{Pc^z-|j3bUy2Qu7R(R^N-^E>{*w z-c)bGQNB+pkxlGhS`vy+NFdkbKwN~ z&IX^AsT9Ge9Sncb=le*8(*(?(P%cGkeZo$$f~i~@W;xGdIV3E=jFzw~=yz6f=IIoF z6&_|9$2pfGn7J}#8-3;bK#jPfg)(S^7`05v7O&2?lUr7?EG#SsoAvbyGrr1XeDeO2 z^JZL9I1?P9B}j%()>K0!-eO&U&fMTy6ev!1U<1WoJeF6R4k^`dd3_2%7yTP%NeIWAUQi2&2U?Xibw#BK2yRfhjVQ$WJ z-|_nw!D#8npiE<`Ptm`PDz@2WL-ojDAaXX4LT0OVS5oF4GhnBt2Fg^+!9MZ-D+%Eg zHSD(tI9rmi2OX0BGUQwie2@|y*>3=q&hfCNN5iiNV>nPfv9YljilB!NsrmiLc1kdV z{HXEQ2Bo#Nth>tkJRq}{U2c_|PG|0GSX{oT6yw)SlEj_?y{tz8pp(#jwgrn?> zs7tK#^3q5)Vlp$*{V$$oWqCrI70wwz)+8z+kr2%;3}NndkrRS2Q=)YMXs1BpDLGn2 z`BH_+rR#oNZ~S;UI4rHppDA&M7aenmn<2*FXz;gX5IQSwBriR!%_nCKI*HXKjv)_T7wYZX0d-h_OlS?vkQfDdumkP z9QSj3wk+!WjPeg3#79O(NDU;PQvg^SF={t%nmt^n^m_14w-%H5Gd0JmQTf(2dw8Fc z<0z5yUxi}&J>=fk=rMhW8KGNSU*8x`w${pLk!+i<;OkyhU;e0>V2jMp+GU}Mt%!gw z!l>Wo$`vubxPpDjh_?KOT1j^sKj0Sg>`(msB^p?(uI=Ba3uy)`Af<^+6J3>XKTiGg zPkd{JaGQ+H=VWIlEjY?B8DUSsVK?tzS?T-6-Szj)PTbSn(li&I>+4STiR#|+6ALLV z*>-18o+c4#nd!Y@8Lv!=)!Pv>9oENn0I&h z?wA@k^=B)XnPwDUYrx4#>^z@DaHhD(4JN63C~?1~3Pvg39VmM>E7MCs`LDv=1HL}{ zTJ^S;ob{5aX^nlo&kT)*)+p^)r3g*m`olp`QdR>P;Q76iPRZ>AvuK7aw#DFxrYP*f1Dz6<<1tT?cZ`@#O3XEQ_V$x za<_s+ZuX6`5I_EJzS4h>`}EtQcGaxE#0~B44s7gxwej_2dI0LH>=n4`M*$cKw5XQ= zLyKXm7RZKYeN+eK%Sa@WFnPzhzj@%J3H|52?O^rt%F5L@CHYmm?5!u~wJ&5o(ALhw z$rVXH`XZu@!FrgsmK0}=eZCvFb#(n)*;XgjQgGOz$>-T`Umm5-U!Ejy&S(1|e6gSo zlE_5;gyboY_qUPJXPALj2Eo>>DAgw?wu2AceZ!BKgq1tTaC&e!h};PS88TxRZ&u{X z2^;rpi0XE!2b2J7_E4PpRLE&7H9AO3h#J_x+<_|mR*%^`4#PH!o{-sdYg}yRy}UXLP=!2)8%&b)H0~uo>Unm#IVkW zFUfU51i_h}%_N)YBW!a)!DZ?5jKo5epV>8>HdNd}+}oHiBnDHvG?6dqouKmu-Qwcd zPW#X&$}~GYDebplp8Rpk>h|M$=aVeP%UPK&Q55eO!F};0o2poUtFGzS33V!tqLU$_ z{Nx#No6qNtMx)`Wc7Pc;-lB?+zMn~USw;eB1=p348Gn*;iL zv%BR}t!{Vk^7fPvv)wMw!yTXCaJX!8(T~%u!zDP}yZ4Ad)?a#fJTJd?LJ2s{v{-XT zJ3ZiU-8udbL06RLn#^sjb*4U;8G`q450&n`ZbGy{Ik^w%?Oe znO!X#9*FE4SEomZdrp_ZvectyCTya`Pd{NFy;KiAWat#L=e8#=4m&er-1yC6gS@yj z0nOp&IBJF~-Cl~X>*_K&xyrlFTKm^mEDBU(u5}5HH+W`d7BM#rmA;6s*ihOT`;y-8 z&=WxQ&xDd%gHrLOn=WCz&sel4g;fp3SsZ<#W>@1>{W#f5lzrJ?=2HkPcxxucJYN}} z!UhuJN!k-`ul3IMyHJU_(GH&OxOlyDP|PT)Jal^#k(IAP8$UR0U++c-bi2qcP2KZ1 zFf~p2b8GnY^i&iEW6>&RY49AQ0T9vWN1-Ibm%7IX9*2jAlKbQh7X9JUeP(WMLco#z zfK*^I)~=N(|EKyRn!&NGRfa`79)qEX^5SJqIDJ_fe{m7DlO$23)?zwg1S%09E4i^aWfw=4*qh-3QJBp7R?PY7mW3 zE9~ke{ue#y@+)XPp;d!6ZdcT?J+uz3t)Wph$bA{I*8BD?#RYm;W0|Gn7c@{Lm!j{f zcE}FmqS&&W;5qVA>~wCCNV=zMKpgMj>I=K2wSVABx`^RfEYM`Q+wh&8n7Ld7psm=h zz?{s!dE8LAaRY=dcF)Sqjel{&Q+&_J$OweKJef!^H8r{KBw#i$Q^`pp)W*td@;7|{ zL5+|V;JBWGgDU&Z1lT@VQeP$?!>K4hWO7P;`joLiE0PbOLPD+g4}!4TtU8xEXl`Mo z9ba48m*3R2WI6t9%Fxg-^qR+LK~hP{HGsA1t-d^O>Ry5_nc7*&CdSW30HAM5OpJ%0 zzaNj6jIO?O6=RLnW6_KY-)S|frHs7V7Ao_kY0S4blI60}WxnuOEDH&Zm^qZxB0WfQ zxo2&ix#mFM;q9%8BD{8)=WqT=0X)C#;NrP@wRdKQ#}B^~f6~iR7a6|NmopTvgAP#D z_&^)@?1Bf*F&dS8Fy8m+#huj)jW4y=z-HsCh zW{7Hcbh_aiNonaEgz0kEFCuSnGwJH3rUHrU3amh)HMhsPX1lv0ns2=;JuS_3v_K6& zt3CYvYBxF>gS=H#8mU8Zp&&*b;^8S`WrfbS`#{y~Mn|#uZ9TO(Xp4vb_ekEFlgysU z1+aMX5%`@?KGQ?*-GCNkQ8M`V7&Al=Ee7_glp{7QJlMuN-edd{XGKVsr%Ql5%&Y;G6IF SdKmdy5->5a(Ep(8g84rWJ1VRI diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.canisters.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.canisters.png new file mode 100644 index 0000000000000000000000000000000000000000..16e20b9b70ab08b131384ae0db6fcfb08ea3651f GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf8c|ud-K1zz8%BE4Ydgu zu7@TcINpAfhq(tRT(CcWPffRDe0VRTy!_2?)7RfK+OVghGfPR)Zqu{c-RBLB3=Iqp zEM{Zl_?S3LQbHo&GNU0wr12ewpgoOiDhn7G>ZbKrOb(eS4DmdKI;Vst07oHV A5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.magnet.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..b51e7dff3ec2d9514211b8fc832ed40a822f5596 GIT binary patch literal 300 zcmV+{0n`48P)l*U6h%)v>i~gXgO7@;slqe;iuyHJhQT6{_4WM$${+L_ zBGxgDAkkEX+1G~dy7sE%zIRVvW*+>t?)D08+pgj4y{GT{Xzvd*1gB}*yk%LaswxT+ zm%6UkaU99AjIQgj)&gLyWf%qk%CZ!Y!zDl|MUo@{G))toKq)0A761UPHF=&3&wG#7 zdYkB1z$GXs77V)It=uR9aL!!~eD4uoFvgIkX*6i9#W{yDM)+NAJ$vE|Di8ER%J{qImF-q00009XUP-=rQHSR_I$q(CC{6+)_!U6wJ2ue)z@u! z6yF>Q{WZ<