From f297d4f85626483b9bffd5cc0cc4f2190d9adad1 Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 27 Oct 2025 12:30:17 +1100 Subject: [PATCH 01/10] what the fuc kis a boxcable --- src/main/java/com/hbm/blocks/ModBlocks.java | 7 +- .../com/hbm/blocks/network/FluidDuctBox.java | 6 +- .../com/hbm/blocks/network/PowerCableBox.java | 295 ++++++++++++++++++ .../com/hbm/render/block/RenderBoxDuct.java | 196 ++++++++---- src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../blocks/boxduct_cable_curve_bl.png | Bin 0 -> 304 bytes .../blocks/boxduct_cable_curve_br.png | Bin 0 -> 302 bytes .../blocks/boxduct_cable_curve_tl.png | Bin 0 -> 274 bytes .../blocks/boxduct_cable_curve_tr.png | Bin 0 -> 313 bytes .../textures/blocks/boxduct_cable_end_0.png | Bin 0 -> 499 bytes .../textures/blocks/boxduct_cable_end_1.png | Bin 0 -> 435 bytes .../textures/blocks/boxduct_cable_end_2.png | Bin 0 -> 436 bytes .../textures/blocks/boxduct_cable_end_3.png | Bin 0 -> 432 bytes .../textures/blocks/boxduct_cable_end_4.png | Bin 0 -> 413 bytes .../blocks/boxduct_cable_junction.png | Bin 0 -> 331 bytes .../blocks/boxduct_cable_straight.png | Bin 0 -> 239 bytes 16 files changed, 431 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/PowerCableBox.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_bl.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_br.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tl.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tr.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_2.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_3.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_4.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_junction.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/boxduct_cable_straight.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8497a0690..66668c24b 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -767,6 +767,7 @@ public class ModBlocks { public static Block red_cable_classic; public static Block red_cable_paintable; public static Block red_cable_gauge; + public static Block red_cable_box; public static Block red_connector; public static Block red_pylon; public static Block red_pylon_medium_wood; @@ -1905,6 +1906,7 @@ public class ModBlocks { red_cable_classic = new BlockCable(Material.iron).setBlockName("red_cable_classic").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_cable_classic"); red_cable_paintable = new BlockCablePaintable().setBlockName("red_cable_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); red_cable_gauge = new BlockCableGauge().setBlockName("red_cable_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + red_cable_box = new PowerCableBox(Material.iron).setBlockName("red_cable_box").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); red_connector = new ConnectorRedWire(Material.iron).setBlockName("red_connector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_connector"); red_pylon = new PylonRedWire(Material.iron).setBlockName("red_pylon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_medium_wood = new PylonMedium(Material.wood).setBlockName("red_pylon_medium_wood").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); @@ -2728,7 +2730,7 @@ public class ModBlocks { register(lightstone_bricks_stairs); register(stones_slab, ItemModSlab.class); register(stones_double_slab, ItemModSlab.class); - + register(brick_forgotten); GameRegistry.registerBlock(concrete_slab, ItemModSlab.class, concrete_slab.getUnlocalizedName()); @@ -3193,6 +3195,7 @@ public class ModBlocks { GameRegistry.registerBlock(red_cable_classic, red_cable_classic.getUnlocalizedName()); GameRegistry.registerBlock(red_cable_paintable, red_cable_paintable.getUnlocalizedName()); register(red_cable_gauge); + register(red_cable_box); GameRegistry.registerBlock(red_wire_coated, red_wire_coated.getUnlocalizedName()); GameRegistry.registerBlock(red_connector, ItemBlockBase.class, red_connector.getUnlocalizedName()); GameRegistry.registerBlock(red_pylon, ItemBlockBase.class, red_pylon.getUnlocalizedName()); @@ -3206,7 +3209,7 @@ public class ModBlocks { GameRegistry.registerBlock(cable_detector, cable_detector.getUnlocalizedName()); GameRegistry.registerBlock(cable_diode, ItemBlockBase.class, cable_diode.getUnlocalizedName()); GameRegistry.registerBlock(machine_detector, machine_detector.getUnlocalizedName()); - + register(fluid_duct_neo); register(fluid_duct_box); register(fluid_duct_exhaust); diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java index 4823303a0..3e291a8f3 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctBox.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctBox.java @@ -4,10 +4,10 @@ import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBoxDuct; import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.i18n.I18nUtil; -import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; @@ -130,11 +130,9 @@ public class FluidDuctBox extends FluidDuctBase implements IBlockMulti, ILookOve return meta % 15; } - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - @Override public int getRenderType() { - return renderID; + return RenderBoxDuct.renderID; } @Override diff --git a/src/main/java/com/hbm/blocks/network/PowerCableBox.java b/src/main/java/com/hbm/blocks/network/PowerCableBox.java new file mode 100644 index 000000000..7d63edde2 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/PowerCableBox.java @@ -0,0 +1,295 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.IBlockMulti; +import com.hbm.lib.Library; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBoxDuct; +import com.hbm.tileentity.network.TileEntityCableBaseNT; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class PowerCableBox extends BlockContainer implements IBlockMulti { + + @SideOnly(Side.CLIENT) public IIcon iconStraight; + @SideOnly(Side.CLIENT) public IIcon[] iconEnd; + @SideOnly(Side.CLIENT) public IIcon iconCurveTL; + @SideOnly(Side.CLIENT) public IIcon iconCurveTR; + @SideOnly(Side.CLIENT) public IIcon iconCurveBL; + @SideOnly(Side.CLIENT) public IIcon iconCurveBR; + @SideOnly(Side.CLIENT) public IIcon iconJunction; + + public PowerCableBox(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCableBaseNT(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + + iconEnd = new IIcon[5]; + + iconStraight = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_straight"); + for(int i = 0; i < 5; i++) iconEnd[i] = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_end_" + i); + iconCurveTL = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_curve_tl"); + iconCurveTR = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_curve_tr"); + iconCurveBL = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_curve_bl"); + iconCurveBR = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_curve_br"); + iconJunction = iconRegister.registerIcon(RefStrings.MODID + ":boxduct_" + "cable" + "_junction"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + + TileEntity te = world.getTileEntity(x, y, z); + + boolean nX = canConnectTo(world, x, y, z, Library.NEG_X, te); + boolean pX = canConnectTo(world, x, y, z, Library.POS_X, te); + boolean nY = canConnectTo(world, x, y, z, Library.NEG_Y, te); + boolean pY = canConnectTo(world, x, y, z, Library.POS_Y, te); + boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); + boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); + + int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); + int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); + + int meta = world.getBlockMetadata(x, y, z); + + if((mask & 0b001111) == 0 && mask > 0) { + return (side == 4 || side == 5) ? iconEnd[meta] : iconStraight; + } else if((mask & 0b111100) == 0 && mask > 0) { + return (side == 2 || side == 3) ? iconEnd[meta] : iconStraight; + } else if((mask & 0b110011) == 0 && mask > 0) { + return (side == 0 || side == 1) ? iconEnd[meta] : iconStraight; + } else if(count == 2) { + + if(side == 0 && nY || side == 1 && pY || side == 2 && nZ || side == 3 && pZ || side == 4 && nX || side == 5 && pX) + return iconEnd[meta]; + if(side == 1 && nY || side == 0 && pY || side == 3 && nZ || side == 2 && pZ || side == 5 && nX || side == 4 && pX) + return iconStraight; + + if(nY && pZ) return side == 4 ? iconCurveBR : iconCurveBL; + if(nY && nZ) return side == 5 ? iconCurveBR : iconCurveBL; + if(nY && pX) return side == 3 ? iconCurveBR : iconCurveBL; + if(nY && nX) return side == 2 ? iconCurveBR : iconCurveBL; + if(pY && pZ) return side == 4 ? iconCurveTR : iconCurveTL; + if(pY && nZ) return side == 5 ? iconCurveTR : iconCurveTL; + if(pY && pX) return side == 3 ? iconCurveTR : iconCurveTL; + if(pY && nX) return side == 2 ? iconCurveTR : iconCurveTL; + + if(pX && nZ) return side == 0 ? iconCurveTR : iconCurveTR; + if(pX && pZ) return side == 0 ? iconCurveBR : iconCurveBR; + if(nX && nZ) return side == 0 ? iconCurveTL : iconCurveTL; + if(nX && pZ) return side == 0 ? iconCurveBL : iconCurveBL; + + return iconJunction; + } + + return iconJunction; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < 5; ++i) { + list.add(new ItemStack(item, 1, i)); + } + } + + public int damageDropped(int meta) { + return meta % 5; + } + + @Override + public int getRenderType() { + return RenderBoxDuct.renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + List bbs = new ArrayList<>(); + + TileEntity te = world.getTileEntity(x, y, z); + + double lower = 0.125D; + double upper = 0.875D; + double jLower = 0.0625D; + double jUpper = 0.9375D; + int meta = world.getBlockMetadata(x, y, z); + + for(int i = 0; i < 5; i++) { + + if(meta > i) { + lower += 0.0625D; + upper -= 0.0625D; + jLower += 0.0625D; + jUpper -= 0.0625D; + } + } + + boolean nX = canConnectTo(world, x, y, z, Library.NEG_X, te); + boolean pX = canConnectTo(world, x, y, z, Library.POS_X, te); + boolean nY = canConnectTo(world, x, y, z, Library.NEG_Y, te); + boolean pY = canConnectTo(world, x, y, z, Library.POS_Y, te); + boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); + boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); + int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); + int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); + + if(mask == 0) { + bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); + } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { + bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + lower, z + lower, x + 1.0D, y + upper, z + upper)); + } else if(mask == 0b001000 || mask == 0b000100 || mask == 0b001100) { + bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + 0.0D, z + lower, x + upper, y + 1.0D, z + upper)); + } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { + bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + 0.0D, x + upper, y + upper, z + 1.0D)); + } else { + + if(count != 2) { + bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); + } else { + bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + lower, x + upper, y + upper, z + upper)); + } + + if(pX) bbs.add(AxisAlignedBB.getBoundingBox(x + upper, y + lower, z + lower, x + 1.0D, y + upper, z + upper)); + if(nX) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + lower, z + lower, x + lower, y + upper, z + upper)); + if(pY) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + upper, z + lower, x + upper, y + 1.0D, z + upper)); + if(nY) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + 0.0D, z + lower, x + upper, y + lower, z + upper)); + if(pZ) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + upper, x + upper, y + upper, z + 1.0D)); + if(nZ) bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + 0.0D, x + upper, y + upper, z + lower)); + } + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + + TileEntity te = world.getTileEntity(x, y, z); + + float lower = 0.125F; + float upper = 0.875F; + float jLower = 0.0625F; + float jUpper = 0.9375F; + int meta = world.getBlockMetadata(x, y, z); + + for(int i = 0; i < 5; i++) { + + if(meta > i) { + lower += 0.0625F; + upper -= 0.0625F; + jLower += 0.0625F; + jUpper -= 0.0625F; + } + } + + boolean nX = canConnectTo(world, x, y, z, Library.NEG_X, te); + boolean pX = canConnectTo(world, x, y, z, Library.POS_X, te); + boolean nY = canConnectTo(world, x, y, z, Library.NEG_Y, te); + boolean pY = canConnectTo(world, x, y, z, Library.POS_Y, te); + boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); + boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); + int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); + int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); + + if(mask == 0) { + this.setBlockBounds(jLower, jLower, jLower, jUpper, jUpper, jUpper); + } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { + this.setBlockBounds(0F, lower, lower, 1F, upper, upper); + } else if(mask == 0b001000 || mask == 0b000100 || mask == 0b001100) { + this.setBlockBounds(lower, 0F, lower, upper, 1F, upper); + } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { + this.setBlockBounds(lower, lower, 0F, upper, upper, 1F); + } else { + + if(count != 2) { + this.setBlockBounds( + nX ? 0F : jLower, + nY ? 0F : jLower, + nZ ? 0F : jLower, + pX ? 1F : jUpper, + pY ? 1F : jUpper, + pZ ? 1F : jUpper); + } else { + this.setBlockBounds( + nX ? 0F : lower, + nY ? 0F : lower, + nZ ? 0F : lower, + pX ? 1F : upper, + pY ? 1F : upper, + pZ ? 1F : upper); + } + } + } + + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir, TileEntity tile) { + if(tile instanceof TileEntityCableBaseNT) { + return Library.canConnect(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir); + } + return false; + } + + @Override + public int getSubCount() { + return 1; + } + +} diff --git a/src/main/java/com/hbm/render/block/RenderBoxDuct.java b/src/main/java/com/hbm/render/block/RenderBoxDuct.java index ccb2ab6dc..404b8f68e 100644 --- a/src/main/java/com/hbm/render/block/RenderBoxDuct.java +++ b/src/main/java/com/hbm/render/block/RenderBoxDuct.java @@ -3,6 +3,7 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; import com.hbm.blocks.network.FluidDuctBox; +import com.hbm.blocks.network.PowerCableBox; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; @@ -11,6 +12,7 @@ import com.hbm.tileentity.network.TileEntityPipeBaseNT; import com.hbm.util.ColorUtil; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; @@ -21,48 +23,80 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - Tessellator tessellator = Tessellator.instance; - FluidDuctBox duct = (FluidDuctBox) block; - int type = duct.rectify(metadata); - float lower = 0.125F; - float upper = 0.875F; - - for(int i = 2; i < 13; i += 3) { - - if(metadata > i) { - lower += 0.0625F; - upper -= 0.0625F; + if(block instanceof FluidDuctBox) { + FluidDuctBox duct = (FluidDuctBox) block; + int type = duct.rectify(metadata); + + float lower = 0.125F; + float upper = 0.875F; + + for(int i = 2; i < 13; i += 3) { + + if(metadata > i) { + lower += 0.0625F; + upper -= 0.0625F; + } } - } - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - renderer.setRenderBounds(lower, lower, 0.0F, upper, upper, 1.0F); - - renderer.uvRotateNorth = 1; - renderer.uvRotateSouth = 2; - - tessellator.startDrawingQuads(); - tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, duct.iconStraight[type]); - tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, duct.iconStraight[type]); - tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, duct.iconStraight[type]); - tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, duct.iconStraight[type]); - tessellator.setNormal(0F, 0F, 1F); renderer.renderFaceZPos(block, 0, 0, 0, duct.iconEnd[type]); - tessellator.setNormal(0F, 0F, -1F); renderer.renderFaceZNeg(block, 0, 0, 0, duct.iconEnd[type]); - tessellator.draw(); - renderer.uvRotateNorth = 0; - renderer.uvRotateSouth = 0; + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + renderer.setRenderBounds(lower, lower, 0.0F, upper, upper, 1.0F); + + renderer.uvRotateNorth = 1; + renderer.uvRotateSouth = 2; + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, duct.iconStraight[type]); + tessellator.setNormal(0F, 0F, 1F); renderer.renderFaceZPos(block, 0, 0, 0, duct.iconEnd[type]); + tessellator.setNormal(0F, 0F, -1F); renderer.renderFaceZNeg(block, 0, 0, 0, duct.iconEnd[type]); + tessellator.draw(); + + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + } else if(block instanceof PowerCableBox) { + PowerCableBox cable = (PowerCableBox) block; + + float lower = 0.125F; + float upper = 0.875F; + + for(int i = 0; i < 5; i++) { + + if(metadata > i) { + lower += 0.0625F; + upper -= 0.0625F; + } + } + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + renderer.setRenderBounds(lower, lower, 0.0F, upper, upper, 1.0F); + + renderer.uvRotateNorth = 1; + renderer.uvRotateSouth = 2; + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, cable.iconStraight); + tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, cable.iconStraight); + tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, cable.iconStraight); + tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, cable.iconStraight); + tessellator.setNormal(0F, 0F, 1F); renderer.renderFaceZPos(block, 0, 0, 0, cable.iconEnd[metadata]); + tessellator.setNormal(0F, 0F, -1F); renderer.renderFaceZNeg(block, 0, 0, 0, cable.iconEnd[metadata]); + tessellator.draw(); + + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + } } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - FluidType type = Fluids.NONE; - renderer = RenderBlocksNT.INSTANCE.setWorld(world); - + TileEntity te = world.getTileEntity(x, y, z); Tessellator tessellator = Tessellator.instance; tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); @@ -75,42 +109,65 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { boolean pZ = false; boolean nZ = false; - FluidDuctBox.cachedColor = 0xffffff; - FluidDuctBox duct = (FluidDuctBox) block; - - pX = duct.canConnectTo(world, x, y, z, Library.POS_X, te); - nX = duct.canConnectTo(world, x, y, z, Library.NEG_X, te); - pY = duct.canConnectTo(world, x, y, z, Library.POS_Y, te); - nY = duct.canConnectTo(world, x, y, z, Library.NEG_Y, te); - pZ = duct.canConnectTo(world, x, y, z, Library.POS_Z, te); - nZ = duct.canConnectTo(world, x, y, z, Library.NEG_Z, te); - + double lower = 0.125D; + double upper = 0.875D; + double jLower = lower; + double jUpper = upper; + if(te instanceof TileEntityPipeBaseNT) { + FluidDuctBox.cachedColor = 0xffffff; + FluidDuctBox duct = (FluidDuctBox) block; + + pX = duct.canConnectTo(world, x, y, z, Library.POS_X, te); + nX = duct.canConnectTo(world, x, y, z, Library.NEG_X, te); + pY = duct.canConnectTo(world, x, y, z, Library.POS_Y, te); + nY = duct.canConnectTo(world, x, y, z, Library.NEG_Y, te); + pZ = duct.canConnectTo(world, x, y, z, Library.POS_Z, te); + nZ = duct.canConnectTo(world, x, y, z, Library.NEG_Z, te); + + FluidType type = Fluids.NONE; TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; type = pipe.getType(); if(meta % 3 == 2) { FluidDuctBox.cachedColor = ColorUtil.lightenColor(type.getColor(), 0.25D); //making very dark things not vantablack } + + jLower = 0.0625D; + jUpper = 0.9375D; + + for(int i = 2; i < 13; i += 3) { + + if(meta > i) { + lower += 0.0625D; + upper -= 0.0625D; + jLower += 0.0625D; + jUpper -= 0.0625D; + } + } + } else { + PowerCableBox cable = (PowerCableBox) block; + + pX = cable.canConnectTo(world, x, y, z, Library.POS_X, te); + nX = cable.canConnectTo(world, x, y, z, Library.NEG_X, te); + pY = cable.canConnectTo(world, x, y, z, Library.POS_Y, te); + nY = cable.canConnectTo(world, x, y, z, Library.NEG_Y, te); + pZ = cable.canConnectTo(world, x, y, z, Library.POS_Z, te); + nZ = cable.canConnectTo(world, x, y, z, Library.NEG_Z, te); + + for(int i = 0; i < 5; i++) { + + if(meta > i) { + lower += 0.0625F; + upper -= 0.0625F; + jLower += 0.0625F; + jUpper -= 0.0625F; + } + } } int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); - double lower = 0.125D; - double upper = 0.875D; - double jLower = 0.0625D; - double jUpper = 0.9375D; - - for(int i = 2; i < 13; i += 3) { - - if(meta > i) { - lower += 0.0625D; - upper -= 0.0625D; - jLower += 0.0625D; - jUpper -= 0.0625D; - } - } - //Straight along X if((mask & 0b001111) == 0 && mask > 0) { renderer.uvRotateTop = 1; @@ -119,39 +176,39 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { renderer.uvRotateWest = 1; renderer.setRenderBounds(0.0D, lower, lower, 1.0D, upper, upper); renderer.renderStandardBlock(block, x, y, z); - + //Straight along Z } else if((mask & 0b111100) == 0 && mask > 0) { renderer.uvRotateNorth = 1; renderer.uvRotateSouth = 2; renderer.setRenderBounds(lower, lower, 0.0D, upper, upper, 1.0D); renderer.renderStandardBlock(block, x, y, z); - + //Straight along Y } else if((mask & 0b110011) == 0 && mask > 0) { renderer.setRenderBounds(lower, 0.0D, lower, upper, 1.0D, upper); renderer.renderStandardBlock(block, x, y, z); - + //Curve } else if(count == 2) { - + if(nY && (pX || nX)) { renderer.uvRotateTop = 1; renderer.uvRotateBottom = 1; } - + if(pY && (pX || nX)) { renderer.uvRotateTop = 1; renderer.uvRotateBottom = 1; } - + if(!nY && !pY) { renderer.uvRotateNorth = 1; renderer.uvRotateSouth = 2; renderer.uvRotateEast = 2; renderer.uvRotateWest = 1; } - + renderer.setRenderBounds(lower, lower, lower, upper, upper, upper); renderer.renderStandardBlock(block, x, y, z); @@ -179,7 +236,7 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { renderer.setRenderBounds(lower, lower, upper, upper, upper, 1.0D); renderer.renderStandardBlock(block, x, y, z); } - + //Junction } else { renderer.setRenderBounds(jLower, jLower, jLower, jUpper, jUpper, jUpper); @@ -217,7 +274,7 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { renderer.uvRotateSouth = 0; renderer.uvRotateEast = 0; renderer.uvRotateWest = 0; - + return true; } @@ -226,8 +283,11 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { return true; } + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + @Override public int getRenderId() { - return FluidDuctBox.renderID; + return renderID; } + } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 627305fba..bea8c6eb5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6142,6 +6142,7 @@ tile.reactor_inserter.name=Reactor Fuel Inserter tile.rebar.name=Rebar tile.red_barrel.name=Explosive Barrel tile.red_cable.name=Red Copper Cable +tile.red_cable_box.name=Red Copper Boxcable tile.red_cable_classic.name=Red Copper Cable (Classic) tile.red_cable_gauge.name=Power Gauge tile.red_cable_gauge.desc=Cable that displays how much power$moves within the network per tick.$Split networks connected by energy$storage blocks are considered as one shared network. diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_bl.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_bl.png new file mode 100644 index 0000000000000000000000000000000000000000..2dce54766f5323b9173ef5a2de814bff4269946d GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*#JUET5HPWP}DfH^;M$gQI94Szs0Kx z)Veu5l$MsTe80!YaITeQ)i3LIR%02ln1>S*SpReWaeaRA%=EI!J49^`Mjzy>6Pa_s r`=A7~eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*N9buG`^#I7&A*ug?s>DU>G)vGQ~3*umy#GJM*l)tlMrex5oFb%%c zw0(S*?Ty!N$*$PS#4y8>Mc|@LhZ29n8Lmhs?Ip~sesM80tg5qr#8u(EtwC}VZ_f$l p4!=e9eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*5p+0mflC7GJ1S!~~M;ZBB&4x`a`RfqR~B@_0&7iEb5e~h=)q*(JIM_(P#P6kg` KKbLh*2~7YaY*H}* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tr.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..8037083496a412a7a70efa8fcbb2a4d661cda251 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*2<-A%36zcbMaSX9Ief08f-UA9eEEhhf zi`=MJ5j$w%>)?50`zcSopgY2jZ3XHr50skT&xkA!@?v3#VN|l3b*M zelmxV;T>OjdzZ)W8=b3|7`!y|7o6JM!7*=t4U5g`*au5$SiYRnKX9h4VJ7dxvQFiM zusEjGpG0nGmNTZ^yVW{tTc_xayGQgL_U}K&T`hMqXWkB;3ZT;%JYD@<);T3K0RYJB BX#D^H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f18156dfb4a46c238f13f7ae7f4e6f628902a178 GIT binary patch literal 499 zcmVz@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGf6951U69E94oEQKA00(qQO+^Rk3L5|{G$^vS&Hw-b zNl8ROR5;6(lh10yFbs!(vJ%@Vw9xa|p^!eoUUbj1hiT8HmyyB}Cy}&6n*K}It_C4v z_&&=rA{NYTdMQp^S(Zjb5D_@%;G6>yP4ewoRaG!EWXudA zf|=p-T@V9d;RJIw6q$oBJhI>sf=3>5#OU$y^$lje7N{y>AiQ}&;Tc&B2t`01!vIGQ zp3PA2_As-lpznJu++$dNe$b^3syY=o=P+k`3^y%OY6mdOt_4JdB6CmSKD97&=L$sR zRDm!2L%3@a+Pa0RhlpGYi0ItyKj2g+)V;#YrUGVu3inOIL53fj2=Y8f9`c89-3lt@ z`xOuoV)UqYdvvKgHLR^$)V<;$gi0Ar>Y+!8nSoZTl@Sq^%OzBY_l@~-f03K002ovPDHLkV1gqW!07-0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png new file mode 100644 index 0000000000000000000000000000000000000000..402994b21b8ac84a16deca66dfb0be5ea50106bc GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*&*U^7iZtDA3scCJ<*MQpl!VCor z0vDsZ_ASet)3IPxLYjebN5=O2^KFR@yOo6n1qAQdGW}~_q2;2&Izw`XeK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*^F0dz#rgid{a*b1Zg?0*A+2g-DN%|9^4~9+p?W_jM`Y34MEP*E$x4 zISejeLQ>{_zt_RBiYtxHxVdB2-->Oy(r0-5TpU~sHuL=8UbISJqLe@~i?Oqd*26#< zr-qqZ8w8xhYW7IAO*i&?+>mJT*kqpKbnbii>=V;E47W8H1^chLu6;(Qy?7nllxfwE zj=!C^Ib3x`*5wWJD(=6Jlu2$`b*(|@lCXWAbyAPyC5BT$RgeB=w@aGxWz0)gR_b}o zk=9nMm+m>e|Jvor<=!6eW6ajv@lLpWB<1ys1?-F;f}NzgGH1=3bu2aVRi=*p$$F)= Z`A=q~t6p+r`40>z22WQ%mvv4FO#lEYp(FqR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_3.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a043c24a57a5ff59370e16939dc9168dcaf2abe8 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*DmI+!^r08;uvCadg^5Fyu$`OF6~R^ zirBU9`MB?N+|KkDo^O2p9=KjuqIA<$J5-)IlZA&zVxD`Ej!>OH$3a(?wIN>vZf_H0 zC}0w}7<_7ptsm#l`FjWZRMrfxJn zF7fc4t-`Szq4{Ui*vi{yer@>nxPLq6^Us`*PjediR@Cl4aCdWC;tIyp(6n`Ds`jQO zzfvk+u&TXr>a+Fdt5eO4S7h;K9M?Fz{kCk{w5RVR9Zqku5DeYEo<}ECr+3w_>5i`w zWRB~-y;gI@(cJ0R`L}0O7w81E&RCJl?k>P!FS%stjORaB=Ehv#dhgh$Nq^j5)-bE? WN!R|K)w>TENDQ8?elF{r5}E)$&ZH{< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_4.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf0dee7b2c1eccb25a0a624e1ce9a2dce595f8e GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*8X=#^9~#Ew930? zp1ftc*yfi)Z1w9!`aH65`S)NI8(zD zCYLYMWMkG|?ch*qnj#eBrLgFs^!shO%`+8^jXOBf$~g822?`o~j&ul}7{p{e{{YAK zYYAzK9kO#j$R&oh&U6fQZ~XDu_=fKDJ^hq zUABl&MI{5{3pVGU#dchDInTFB%S*FbORllG{@~x6$`&kMn)(mx>^Y9u9iLO(c<=Puu{pY(smdTaePnbX2|onQxgpTX1B&t;ucLK6Uj CeK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*1_-hR3VD74Vi#WBR<^xVk@d0iAaT-cY2 zyxp&$>zbm!y71%Xi~dI9Cv6y8KlDzSbW8&12Bl3auX!;XV0Lin|5S8&deEi96KC8- zw_IDWDj>9=N6@83fXT0U=EdrIc8O5Ii?#_f;u*s}n;w`Ie&FYmJ&j!_mQeK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*x9{ea*0g(JTm+sw+X byB;y>)|n{0JiqZj&_D)HS3j3^P6 Date: Mon, 27 Oct 2025 12:41:24 +1100 Subject: [PATCH 02/10] boxcable recipe (uses ingots for now) --- .../java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index e6b9fc306..562a65f64 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -223,7 +223,7 @@ public class AnvilRecipes extends SerializableRecipe { new AnvilOutput(new ItemStack(ModBlocks.machine_difurnace_off))).setTier(1)); boolean exp = GeneralConfig.enableExpensiveMode; - + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 8), @@ -568,6 +568,11 @@ public class AnvilRecipes extends SerializableRecipe { constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate(), 1), new ComparableStack(ModItems.plate_polymer)}, new AnvilOutput(new ItemStack(ModBlocks.fluid_duct_exhaust, 8, i))).setTier(2).setOverlay(OverlayType.CONSTRUCTION)); constructionRecipes.add(new AnvilConstructionRecipe(new ComparableStack(ModBlocks.fluid_duct_exhaust, 8, i), new AnvilOutput[] {new AnvilOutput(new ItemStack(ModItems.plate_iron)), new AnvilOutput(new ItemStack(ModItems.plate_polymer))}).setTier(2)); } + + for(int i = 0; i < 5; i++) { + constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(MINGRADE.ingot(), 8), new ComparableStack(ModItems.plate_polymer)}, new AnvilOutput(new ItemStack(ModBlocks.red_cable_box, 8, i))).setTier(2).setOverlay(OverlayType.CONSTRUCTION)); + constructionRecipes.add(new AnvilConstructionRecipe(new ComparableStack(ModBlocks.red_cable_box, 8, i), new AnvilOutput[] {new AnvilOutput(new ItemStack(ModItems.ingot_red_copper, 8)), new AnvilOutput(new ItemStack(ModItems.plate_polymer))}).setTier(2)); + } } public static void registerConstructionAmmo() { From f9baf87289152ac98b07439d599d923c26de7b2b Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 27 Oct 2025 12:42:13 +1100 Subject: [PATCH 03/10] fix PA dipole max speed penalty applying to particles that aren't turning --- .../tileentity/machine/albion/TileEntityPADipole.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java index 7a3218217..1584369eb 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -77,10 +77,10 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv if(isInline) mult = 1; } - if(!isCool()) particle.crash(PAState.CRASH_NOCOOL); - if(this.power < this.usage * mult) particle.crash(PAState.CRASH_NOPOWER); - if(type == null) particle.crash(PAState.CRASH_NOCOIL); - if(type != null && type.diMax < particle.momentum) particle.crash(PAState.CRASH_OVERSPEED); + if(!isCool()) particle.crash(PAState.CRASH_NOCOOL); + if(this.power < usage * mult) particle.crash(PAState.CRASH_NOPOWER); + if(type == null) particle.crash(PAState.CRASH_NOCOIL); + if(type != null && type.diMax < particle.momentum && !isInline) particle.crash(PAState.CRASH_OVERSPEED); if(particle.invalid) return; @@ -90,7 +90,7 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv particle.resetDistance(); } - this.power -= this.usage * mult; + this.power -= usage * mult; } @Override From 6eeefc23b426b5fba2e78bbaf63a2a6b62bf5c1d Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 27 Oct 2025 13:51:26 +1100 Subject: [PATCH 04/10] add OC support to PA dipoles --- .../machine/albion/TileEntityPADipole.java | 118 +++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java index 1584369eb..f4d0bb8a1 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -1,11 +1,13 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.handler.CompatHandler.OCComponent; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPADipole; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.gui.GUIPADipole; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPACoil.EnumCoilType; +import com.hbm.items.special.ItemFusionShield; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState; @@ -14,9 +16,14 @@ import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; @@ -25,7 +32,9 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, IParticleUser { +@SuppressWarnings("unused") +@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) +public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, IParticleUser, OCComponent, SimpleComponent { public int dirLower; public int dirUpper; @@ -235,4 +244,111 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv if(dir == 3) return ForgeDirection.WEST; return ForgeDirection.NORTH; } + + public static String dirToName(int dir) { + if(dir == 1) return "east"; + if(dir == 2) return "south"; + if(dir == 3) return "west"; + return "north"; + } + + public static int nameToDir(String name) { + if(name.equals("north")) return 0; + if(name.equals("east")) return 1; + if(name.equals("south")) return 2; + if(name.equals("west")) return 3; + return -1; + } + + @Override + public String getComponentName() { + return "ntm_pa_dipole"; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getDirLower(Context context, Arguments args) { + return new Object[] {dirToName(dirLower)}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getDirUpper(Context context, Arguments args) { + return new Object[] {dirToName(dirUpper)}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getDirRedstone(Context context, Arguments args) { + return new Object[] {dirToName(dirRedstone)}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getThreshold(Context context, Arguments args) { + return new Object[] {threshold}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] setDirLower(Context context, Arguments args) { + int dir = nameToDir(args.checkString(0)); + if(dir >= 0) dirLower = dir; + return new Object[] {}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] setDirUpper(Context context, Arguments args) { + int dir = nameToDir(args.checkString(0)); + if(dir >= 0) dirUpper = dir; + return new Object[] {}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] setDirRedstone(Context context, Arguments args) { + int dir = nameToDir(args.checkString(0)); + if(dir >= 0) dirRedstone = dir; + return new Object[] {}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] setThreshold(Context context, Arguments args) { + threshold = MathHelper.clamp_int(args.checkInteger(0), 0, 999_999_999); + return new Object[] {}; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public String[] methods() { + return new String[] { + "getDirLower", + "setDirLower", + "getDirUpper", + "setDirUpper", + "getDirRedstone", + "setDirRedstone", + "getThreshold", + "setThreshold", + }; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public Object[] invoke(String method, Context context, Arguments args) throws Exception { + switch (method) { + case "getDirLower": return getDirLower(context, args); + case "setDirLower": return setDirLower(context, args); + case "getDirUpper": return getDirUpper(context, args); + case "setDirUpper": return setDirUpper(context, args); + case "getDirRedstone": return getDirRedstone(context, args); + case "setDirRedstone": return setDirRedstone(context, args); + case "getThreshold": return getThreshold(context, args); + case "setThreshold": return setThreshold(context, args); + } + throw new NoSuchMethodException(); + } + } From 2833d58e848ebaf202b0aace8fbf623b3d22fe1e Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 27 Oct 2025 14:09:04 +1100 Subject: [PATCH 05/10] adjust cable hitboxes and make them look more like red copper --- .../com/hbm/blocks/network/PowerCableBox.java | 45 ++++-------------- .../textures/blocks/boxduct_cable_end_0.png | Bin 499 -> 497 bytes .../textures/blocks/boxduct_cable_end_1.png | Bin 435 -> 437 bytes .../textures/blocks/boxduct_cable_end_2.png | Bin 436 -> 446 bytes .../textures/blocks/boxduct_cable_end_3.png | Bin 432 -> 415 bytes .../textures/blocks/boxduct_cable_end_4.png | Bin 413 -> 405 bytes 6 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/PowerCableBox.java b/src/main/java/com/hbm/blocks/network/PowerCableBox.java index 7d63edde2..b2c67fd42 100644 --- a/src/main/java/com/hbm/blocks/network/PowerCableBox.java +++ b/src/main/java/com/hbm/blocks/network/PowerCableBox.java @@ -153,8 +153,6 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { double lower = 0.125D; double upper = 0.875D; - double jLower = 0.0625D; - double jUpper = 0.9375D; int meta = world.getBlockMetadata(x, y, z); for(int i = 0; i < 5; i++) { @@ -162,8 +160,6 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { if(meta > i) { lower += 0.0625D; upper -= 0.0625D; - jLower += 0.0625D; - jUpper -= 0.0625D; } } @@ -174,10 +170,9 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); - int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); if(mask == 0) { - bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); + bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + lower, x + upper, y + upper, z + upper)); } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + lower, z + lower, x + 1.0D, y + upper, z + upper)); } else if(mask == 0b001000 || mask == 0b000100 || mask == 0b001100) { @@ -185,12 +180,7 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { } else if(mask == 0b000010 || mask == 0b000001 || mask == 0b000011) { bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + 0.0D, x + upper, y + upper, z + 1.0D)); } else { - - if(count != 2) { - bbs.add(AxisAlignedBB.getBoundingBox(x + jLower, y + jLower, z + jLower, x + jUpper, y + jUpper, z + jUpper)); - } else { - bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + lower, x + upper, y + upper, z + upper)); - } + bbs.add(AxisAlignedBB.getBoundingBox(x + lower, y + lower, z + lower, x + upper, y + upper, z + upper)); if(pX) bbs.add(AxisAlignedBB.getBoundingBox(x + upper, y + lower, z + lower, x + 1.0D, y + upper, z + upper)); if(nX) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.0D, y + lower, z + lower, x + lower, y + upper, z + upper)); @@ -227,8 +217,6 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { float lower = 0.125F; float upper = 0.875F; - float jLower = 0.0625F; - float jUpper = 0.9375F; int meta = world.getBlockMetadata(x, y, z); for(int i = 0; i < 5; i++) { @@ -236,8 +224,6 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { if(meta > i) { lower += 0.0625F; upper -= 0.0625F; - jLower += 0.0625F; - jUpper -= 0.0625F; } } @@ -248,10 +234,9 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { boolean nZ = canConnectTo(world, x, y, z, Library.NEG_Z, te); boolean pZ = canConnectTo(world, x, y, z, Library.POS_Z, te); int mask = 0 + (pX ? 32 : 0) + (nX ? 16 : 0) + (pY ? 8 : 0) + (nY ? 4 : 0) + (pZ ? 2 : 0) + (nZ ? 1 : 0); - int count = 0 + (pX ? 1 : 0) + (nX ? 1 : 0) + (pY ? 1 : 0) + (nY ? 1 : 0) + (pZ ? 1 : 0) + (nZ ? 1 : 0); if(mask == 0) { - this.setBlockBounds(jLower, jLower, jLower, jUpper, jUpper, jUpper); + this.setBlockBounds(lower, lower, lower, upper, upper, upper); } else if(mask == 0b100000 || mask == 0b010000 || mask == 0b110000) { this.setBlockBounds(0F, lower, lower, 1F, upper, upper); } else if(mask == 0b001000 || mask == 0b000100 || mask == 0b001100) { @@ -260,23 +245,13 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { this.setBlockBounds(lower, lower, 0F, upper, upper, 1F); } else { - if(count != 2) { - this.setBlockBounds( - nX ? 0F : jLower, - nY ? 0F : jLower, - nZ ? 0F : jLower, - pX ? 1F : jUpper, - pY ? 1F : jUpper, - pZ ? 1F : jUpper); - } else { - this.setBlockBounds( - nX ? 0F : lower, - nY ? 0F : lower, - nZ ? 0F : lower, - pX ? 1F : upper, - pY ? 1F : upper, - pZ ? 1F : upper); - } + this.setBlockBounds( + nX ? 0F : lower, + nY ? 0F : lower, + nZ ? 0F : lower, + pX ? 1F : upper, + pY ? 1F : upper, + pZ ? 1F : upper); } } diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png index f18156dfb4a46c238f13f7ae7f4e6f628902a178..558b9fd729043dd2712fb036f08ca279fcaec83b 100644 GIT binary patch delta 367 zcmV-#0g(Rl1Mvfpi+=+GE3EqsP5=M_M@d9MR5;6(lUr`WKnz8XJrfcLbOZej8|YfQ zEY<)Y?Fy1o@*2Azg|syEWy!KMnsevsjx3z3swxj5@U>G)H~Vln2!LJ$MC4yRaaC2h zh>%i3RZ&$$WH!H^)pd=#6GI4y2=30~x~0eicNiOWN`=KTBYze-d7iOYD7r3r*u4-! zxE3%oiac;16J-=)QIIclvNNo!6>K)x(=+Zq7Z}HpJM0YSH({EFz8^4?xqzy&QUCU3 zng)A)rRxUVGh&R_0wO}G{0fh4hkN{RkW!i)ESA}i@X&VjrvWn~rF1PIB2(Jm!QH9j zXyER1fe^y4@Mzd}G$ywlWZC;a{{$aLrzYHXAR_3x#Gan%`(X;KKMfoW8WU;)ZI>`J z+FHv N002ovPDHLkV1h!!sD}Um delta 369 zcmV-%0gnFh1M>rri+=ztG$^vS&Hw-bNl8ROR5;6(lh10yFbs!(vJ%@Vw9xa|p^!eo zUUbj1hiT8HmyyB}Cy}&6n*K}It_C4v_&&=rA{NYTdMQp^ zS(Zjb5D_@%;G6>yP4ewoRaG!EWXudAf|=p-T@V9d;RJIw6n~k6FFdl~5rRh^a>VHI z@%0U6z80t|Vj#SELE#x$3V}f51!3X@AfdWsi5zBEZk#QetyuU4yrm8IOi~D zdki-%Qfdb<%dQ1Pgd%fK;Xbu6bLR>~UJv-x${~*fePwRnrlz P00000NkvXXu0mjf$112d diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png index 402994b21b8ac84a16deca66dfb0be5ea50106bc..b0ecf38dc35b1ae8a96db12feb03af2ea48ab332 100644 GIT binary patch delta 307 zcmV-30nGlh1GNK?i+=+G8;T-5;s5{v3rR#lR5;6(lTmKMFc3s%*GWw&eDw;>33~MY z_AKP5CxDg`k=^MBwIvhef~AqA$n!i|?+X4_N{Jx^T+7UEY8*!a0L=gqc}T^VQlf~! z%%G}JRfx!9zy7x0??Dn>2mvAjk_GS|#LN&vr~&Q{RmJ=37k^$lLAQ#C&k_A9BE}xN zUIW`L-abA-atWB{8LHYe<8S~;xcd^2W46qGJc8uK*mX4^Lt5r(I>X)TUof*OLCbtT zO&}HS4l}C(B|*bH{Y-F=Ah`sTS~Se_X#)9lJ3-&~mkw)~zh{;jWI*Y}&1QoTLOGD1 z>w3@1%~usMQ!MX+0JtQ`Lop1)L({n1?doaFH{PqfegRmHUPMRaqFMj|002ovPDHLk FV1jIWixvO? delta 305 zcmV-10nYxl1G58=i+=zv537$nXaE2K2}wjjR5;6(lU;6uFc5@iclk@iF`yUdwJY^T zAoU15BtY2RJWyLTAevYjS+X>rXDlz_cQsApB7&_{^-z7^698}k5YbzTzNTrMh@h%q zW-v2|Xt!_AhGBraBNGu25!^ij{)4D0L?i{68JHR0A2Tk6Ab+b$l$Qc|RiZ2l0i+=+G4(I>b2><{A6iGxuR5;6(lTB*GFbsvCBo9dk<^o+i%n5q@ z_9)4&2S{M1VJxeQ*2Z=W?HC@0koW1w65;oF?@dI|N>#gBmW2R-6M%@GQucZ8jfkMC zU}i8gi0E*)-_~`7nZbz&hzMqu0e?YM6(UjtVvJyBh)88@&3_>TnAs5!Ldb^q*E@!n z0jJSn7*62x8Ms{V_VEcbLyYkVC?oxthsum?gPCPH=W0NiavK@jhIqT>=v4`-dT3bB zyzh@}jxj=2Yd{6*m>*v|Vw4O?08W!t4N1qm-}hX9%0N{?*Xz}Y2;(?{ncgmb5C8T#Q8#PwmCGgP1R9Blp4*~#YhP)NiG(EMA^E}tvSPsd5l+HJHYGn!i+=zvA$M6ZrvLx}3Q0skR5;6(lR<98APhynZDx|rIf%0Cs@Lwe zw@EfVK^D`=48~owAP7k9AX!L=|NLz*;dgoOO+;`ERqe*Qt^@#_07UduWS#fkhzP0* zW(G5Zh?@O)wrv~C3{FHqL@=`q_zR+{5Rn=XV+1opL@MD?9DhQ9nYDlrLKb|y8itoM zPUC=KIO8;)A(so@-albxh%vT+GE+~i*DK5{hjXq5l$Lwq$L*f8S0$)w)3Ba+-|tx* zV}z>KfD+OZKW;l>j2Y4Z%2Imb{cDFAH4bQ=XCoqv;|OMkb1r8|myg!dlXpuifNjjn#N^W>S-)L$$uiPZ{(O~CDKL&{{R3007*qoM6N<$ Ef+Ep}!2kdN diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_3.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_3.png index a043c24a57a5ff59370e16939dc9168dcaf2abe8..e3996afa5732ef9dca1567a84969374f0573a161 100644 GIT binary patch delta 285 zcmV+&0pk9!1D^wsi+=+FI_+kDe*gdg^+`lQR5;6(lU-`VKn#ROl1(6xTdbiM==J;9 zW7uy!Kmvi#m8LKCvOn%m76!xO`81L(!S_ii(ag}x-4C^Gn*f0B01-i+=zvHuQ?LU;qFC21!IgR5;6(lS^*HFbqV8q@5H#hrIE=%U-!> z=t=BNPT)n*q$1fxD^(u@X#@-m7@kLREE0ZC2*E`JtyJ|;+qMw^Z~_p~Q_8*&f)f!` z70e7~1`&17_T9ekaCZzM0wRLDXTT$fszO9+fSG}rAtIHrHGjt#;qE;k#@JPF&1MF7 zhne+&_T!JY3Fq?(TkVWLPcbs)vD<=C99tWi~UY zY7J<|D9yLq9cGs0?ioPKvN#b{x33H=RVwIT?bdwMK{rDB&+W`5pe#^@ zn5bq$gGR5;6(lfiMsAPhynkbT?~kTWhJDIkTX zfusiemIAz2q@Tk^9s~AnmYF|h7{8A`Ai>|rIa5{9%FGV6EQ&N*kARrij4I zkWxZQ2_n*c+qHFFK@x+iLPS7vGk9cTW>D4Iz}=Bjf~r`V?enLC zLnM2Hh;fv851v*qj^ji4ZUyZ}HKRQGAYFUw zqIalJ2qJ=% z5>iSaqTw6wwrzu%Au}_G2xfK&yb=)+F!NbJRgqExGoQc+w|~}PW}`rBZSWppRfU;B zRY!sN^E22j=e(!w?dm~?zdt|l^L0JJzIQH*$kT%H Date: Mon, 27 Oct 2025 16:35:36 +1100 Subject: [PATCH 06/10] improve junction connections and add better textures --- .../com/hbm/blocks/network/PowerCableBox.java | 33 +++++++++--------- .../blocks/boxduct_cable_curve_bl.png | Bin 304 -> 229 bytes .../blocks/boxduct_cable_curve_br.png | Bin 302 -> 235 bytes .../blocks/boxduct_cable_curve_tl.png | Bin 274 -> 195 bytes .../blocks/boxduct_cable_curve_tr.png | Bin 313 -> 241 bytes .../textures/blocks/boxduct_cable_end_0.png | Bin 497 -> 514 bytes .../textures/blocks/boxduct_cable_end_1.png | Bin 437 -> 514 bytes .../textures/blocks/boxduct_cable_end_2.png | Bin 446 -> 500 bytes .../textures/blocks/boxduct_cable_end_3.png | Bin 415 -> 476 bytes .../textures/blocks/boxduct_cable_end_4.png | Bin 405 -> 361 bytes .../blocks/boxduct_cable_junction.png | Bin 331 -> 338 bytes .../blocks/boxduct_cable_straight.png | Bin 239 -> 141 bytes 12 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/PowerCableBox.java b/src/main/java/com/hbm/blocks/network/PowerCableBox.java index b2c67fd42..adb592805 100644 --- a/src/main/java/com/hbm/blocks/network/PowerCableBox.java +++ b/src/main/java/com/hbm/blocks/network/PowerCableBox.java @@ -83,28 +83,29 @@ public class PowerCableBox extends BlockContainer implements IBlockMulti { return (side == 2 || side == 3) ? iconEnd[meta] : iconStraight; } else if((mask & 0b110011) == 0 && mask > 0) { return (side == 0 || side == 1) ? iconEnd[meta] : iconStraight; - } else if(count == 2) { + } else { if(side == 0 && nY || side == 1 && pY || side == 2 && nZ || side == 3 && pZ || side == 4 && nX || side == 5 && pX) return iconEnd[meta]; - if(side == 1 && nY || side == 0 && pY || side == 3 && nZ || side == 2 && pZ || side == 5 && nX || side == 4 && pX) - return iconStraight; - if(nY && pZ) return side == 4 ? iconCurveBR : iconCurveBL; - if(nY && nZ) return side == 5 ? iconCurveBR : iconCurveBL; - if(nY && pX) return side == 3 ? iconCurveBR : iconCurveBL; - if(nY && nX) return side == 2 ? iconCurveBR : iconCurveBL; - if(pY && pZ) return side == 4 ? iconCurveTR : iconCurveTL; - if(pY && nZ) return side == 5 ? iconCurveTR : iconCurveTL; - if(pY && pX) return side == 3 ? iconCurveTR : iconCurveTL; - if(pY && nX) return side == 2 ? iconCurveTR : iconCurveTL; + if(count == 2) { + if(side == 1 && nY || side == 0 && pY || side == 3 && nZ || side == 2 && pZ || side == 5 && nX || side == 4 && pX) + return iconStraight; - if(pX && nZ) return side == 0 ? iconCurveTR : iconCurveTR; - if(pX && pZ) return side == 0 ? iconCurveBR : iconCurveBR; - if(nX && nZ) return side == 0 ? iconCurveTL : iconCurveTL; - if(nX && pZ) return side == 0 ? iconCurveBL : iconCurveBL; + if(nY && pZ) return side == 4 ? iconCurveBR : iconCurveBL; + if(nY && nZ) return side == 5 ? iconCurveBR : iconCurveBL; + if(nY && pX) return side == 3 ? iconCurveBR : iconCurveBL; + if(nY && nX) return side == 2 ? iconCurveBR : iconCurveBL; + if(pY && pZ) return side == 4 ? iconCurveTR : iconCurveTL; + if(pY && nZ) return side == 5 ? iconCurveTR : iconCurveTL; + if(pY && pX) return side == 3 ? iconCurveTR : iconCurveTL; + if(pY && nX) return side == 2 ? iconCurveTR : iconCurveTL; - return iconJunction; + if(pX && nZ) return side == 0 ? iconCurveTR : iconCurveTR; + if(pX && pZ) return side == 0 ? iconCurveBR : iconCurveBR; + if(nX && nZ) return side == 0 ? iconCurveTL : iconCurveTL; + if(nX && pZ) return side == 0 ? iconCurveBL : iconCurveBL; + } } return iconJunction; diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_bl.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_bl.png index 2dce54766f5323b9173ef5a2de814bff4269946d..182512e485cf97d24e81b190c282a331a4e11d04 100644 GIT binary patch delta 201 zcmV;)05<=y0_6daB!8?)L_t(I5yg{14#OY}1VJ)i;=un;JPDB6F3GxXWkPzYB?JP` z*g+wNGfF8B5eXbArMVtsgx-6=Y)7p%0u>5y=!FNj)-*NdoVBvx>wXMv32qs4u8(w%Y@7@zrDsM?TnDncO)W%00000NkvXXu0mjf D3yNBk delta 277 zcmaFLxPfVcNG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDS#JUET5HPWP}DfH^;M$gQI94Szs0Kx)Veu5l$MsTe80!YaITeQ)i3LI zR%02ln1>S*SpReWaeaRA%=EI!J49^`Mjzy>6Pa_s`=A7~gB!99=L_t(I5yey63PT|b(^0{1^8cUwB2i&mWGS6f=-Ucnk4@4X zFEM!i~`J6M1F#={gYON7ep#X}fIFWnr3XSLta?V*7Jqg{s9jl3D*+aIN zF98&+patG?6|j4N4fKW(Yz08}I#CC$wV$RQ5kY4h)h%{s#7L1RJZBb8^GSrf<=_O^ zg?5+VV5orSe{CZQJeceqZ{NgoUIO-R--vddWboFDLh)~}@dXgn#O6EsAaei!002ov JPDHLkV1i6VT^j%Z delta 275 zcmaFOxQ=OpNG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSN9buG`^#I7&A z*ug?s>DU>G)vGQ~3*umy#GJM*l)tlMrex5oFb%%cw0(S*?Ty!N$*$PS#4y8>Mc|@L zhZ29n8Lmhs?Ip~sesM80tg5qr#8u(EtwC}VZ_f$l4!=e9c52B!7xYL_t(I5#5t(3VDWpL{9NdGa~l~0|aA6G(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDS5p+0mflC7GJ1S!~~M;ZBB& q4x`a`RfqR~B@_0&7iEb5e~h=)q*(JIM_(P#QU*^~KbLh*2~7ZBUr(+8 diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tr.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_curve_tr.png index 8037083496a412a7a70efa8fcbb2a4d661cda251..a773d39866cc7f53f8c63d38ba0773efbe8de740 100644 GIT binary patch delta 213 zcmV;`04o2v0`UQmB!9R`L_t(I5yg{H3d0}}L={%>M1JJ{2kBCV$4tFkK;Ju5Mvzf6azqaodi(s zzk8ltbc(hAC%`HOcmNQ|DjaK9!VeZ;=SG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSi2YU46!(U^zv@r0}4F#EEhhfi`=MJ5j$w%>)?50`zcSopgY2j zZ3XHr50skT&xkA!@?v3#VN|l3b*MelmxV;T>OjdzZ)W8=b3|7`!y| z7o6JM!7*=t4U5g`*au5$SiYRnKX9h4VJ7dxvQFiMusEjGpG0nGmNTZ^yVW{tTc_xa iyGQgL_KWX7#$7FUGH2cno(iDj7(8A5T-G@yGywo?vS#)G diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_0.png index 558b9fd729043dd2712fb036f08ca279fcaec83b..cab58ce1fff4f0db919098150d9eeb4894f58379 100644 GIT binary patch delta 384 zcmV-`0e}AS1A+vQi+=?i8MNRZqW}N_SV=@dR5;6(ld(?2Fc5~n!r4_;Nb>-QC9rhr z%7)Yj;1PJxcI?!pVX5)}Dd|{*?WPQl-Grt{Sh6hpe4qcj^Nnc7Y&JWI2;Hfa!di=S zt~ZS_tk>%ifCRvhvq&^w9THwX91du$BfvQqK}nLtbFFo_cYkW{oDJ_^C3m-Qf8*(y z@@r-NS~svi!g4x~>ZB_>IA;nb0%;q;L}2HD7G#VW1_bAiZ~tmnLES(;_K*->1Sq9& z&c)X%3oq&u9-aWm%YubXqs=*oQl2g$+af}yyzETjonPNzyYcxbt7z*gxCwO*#NOC$ z;PLt5IQUp=k$E6JNfIi14k0fKf4eN8EU12k0Iia+36gfsCv0I;va)KEm{K=wCHMnS zH$Kbxc({zA8iN3>HTz=-^0JKGkJJMgVG)H~Vln2!LJ$MC4yRaaC2h zh>%i3RZ&$$WH!H^)pd=#6GI4y2=30~x~0eicNiOWN`=KTBYze-d7iOYD7r3r*u4-! zxE3%oiac;16J-=)QIIclvNNo!6>K)x(=+Zq7Z}HpJM0YSH({EFz8^4?xqzy&QUCU3 zng)A)rRxUVGh&R_0wO}G{0fh4hkN{RkW!i)ESA}i@X&VjrvWn~rF1PIB2(Jm!QH9j zXyER1fe^y4@Mzd}G$ywlWZC;a{{$aLrzYHXAR_3x#Gan%`(X;KKMfoW8WU;)ZI>`J z+FHv N002ovPDHLkV1l9}s22bL diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_1.png index b0ecf38dc35b1ae8a96db12feb03af2ea48ab332..feaf2122e55f12e1b3c2bd9b9e08b0f9e3183d43 100644 GIT binary patch delta 384 zcmV-`0e}9r1A+vQi+=?iA)Ml;Jpcd!SV=@dR5;6(ld*2XFc5}6s&fK+k_SLtpi>vt zZe2U|b^0=W5>_TuiLjtNKme&yB&6CW=-}8uN?O&D7u)yUfA{+av}-n-okWDoZH&P= zhpJv}Yc0#=asVI!a4T3OUiU5unGc5pNs>f>sz%UgG>Yd*l7EDEr}oYHVmKWBP|yub z)0C!ZqB`kHfBXEPFpvvmZ3R1ptwQbK{qY5BZ9kweu>SIo3*!N`gZ&XEDOhV`c@bcY zK~*uvkc$s^GCLSg0hm-JbC;3J8DNa3OSjfc+RWoAJio$b1wc{NWJ0tuD7Xtg-?VMB zg8PT7BUO!m!+AM}s476TYS%VvQk6cUDxoT=+Y*9;0E>WN)mDAO<}RbC>b8j)`=fUv zWbXyk&UgFL#$3)e_9_UUB={V<9d>snBEVW30Zr5V85o8MyrmMSO62sPVOlH}*V7ne eb=PkS0KNet{}mL0a(Wj4000033~MY z_AKP5CxDg`k=^MBwIvhef~AqA$n!i|?+X4_N{Jx^T+7UEY8*!a0L=gqc}T^VQlf~! z%%G}JRfx!9zy7x0??Dn>2mvAjk_GS|#LN&vr~&Q{RmJ=37k^$lLAQ#C&k_A9BE}xN zUIW`L-abA-atWB{8LHYe<8S~;xcd^2W46qGJc8uK*mX4^Lt5r(I>X)TUof*OLCbtT zO&}HS4l}C(B|*bH{Y-F=Ah`sTS~Se_X#)9lJ3-&~mkw)~zh{;jWI*Y}&1QoTLOGD1 z>w3@1%~usMQ!MX+0JtQ`Lop1)L({n1?doaFH{PqfegRmHUPMRaqFMj|002ovPDHLk FV1hF0isk?S diff --git a/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_2.png b/src/main/resources/assets/hbm/textures/blocks/boxduct_cable_end_2.png index a4861bff091139b594f79f1e3c414ff29e9e12ef..4ca6dfb6203fff1f8ade2d45f2334e1a49d9e4e1 100644 GIT binary patch delta 370 zcmV-&0ge8?1M~xsi+=?iCv|}W2mk;9N=ZaPR5;6(lQC|>KoCVAXm&9*hy#!`Aw4Z! zZje*tUfhG03PlQ4M-#x@WsE3H=Ro%#FLe`Y{4mdoWuL}~^~WfVjY|WRY}ycZlD7JRXTLCIK@`LgVo`eUCAE+<&Es`8~+8?24eDI2w&8 z%QDePAN_PXk!4wjz=>2909Cy&AR@edzcU%aEY$BTDma{B{jfq+lXwycAz)@{oeW_W zzF@up;3?m;siuj-V*#Z9RuQRho-g3#6+S-znB_&sN+%e)&o1Q3K%M;foVFg@Ud7A+ zI#v}`jSWD)hiiOK(LBK?P?Pw^tuiwXXV_FzW_i*4#3_e!m*TE~sCCvZrgPw)E4mKh%r)@WlFqB&}ybsP^qg#F8^t!?RMMkM#t)pzX$++03IqSZvW3Y Qn*aa+07*qoM6N<$f@GnnGXMYp delta 316 zcmV-C0mJ_E1HJ>0i+=+G4(I>b2><{A6iGxuR5;6(lTB*GFbsvCBo9dk<^o+i%n5q@ z_9)4&2S{M1VJxeQ*2Z=W?HC@0koW1w65;oF?@dI|N>#gBmW2R-6M%@GQucZ8jfkMC zU}i8gi0E*)-_~`7nZbz&hzMqu0e?YM6(UjtVvJyBh)88@&3_>TnAs5!Ldb^q*E@!n z0jJSn7*62x8Ms{V_VEcbLyYkVC?oxthsum?gPCPH=W0NiavK@jhIqT>=v4`-dT3bB zyzh@}jxj=2Yd{6*m>*v|Vw4O?08W!t4N1qm-}hX9%0N{?*Xz}Y2;(?{ncgmb5C8T#Q8#PwmCGgP1R9Blp4*~#YhP)NiG(EMA^E}tvSPsd5l+HJHYGn!wIsgCxGD$>1R5;6(lQC`rK@3G7k;egO)kGrt?-@qhS_gQ2jhDw?JVcQUlz z%{COODoxXnbG{D{5e|pLO(%6-lXH&p0+3R|%zB4EzrSGi+IDKcWjS4NKA!`SQfdLi zT0NM(!utp8HUQYsLfm!mgBYy!fNkl$$1pY`p& zeK*!T$TKkCfVD#bFSv&R8QR_|fL)T_cH6eGi*jXI+As{O0D0o9f_-P+U!HF4`Qamq zdsq%&&pKxb$#(4U`EGW5AO8#9z8L0!8ljJe0ACshk8gK2y?#Xp+B@}Pq7%IU2xj(s z_OQCs^iTj8KuCM`Fo4FDfV%6P_n0fheP0+j=hBYyw^b5ch_0olnce*gdg1ZP1_K>z@;j|==^1poj5AY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rk3L66fAEsieH~;_u>q$gGR5;6(lfiMsAb$)+zmR?06p%A6At@k* zr-7sf`<4Q{SEQfAMjiw9ZkCxpW*EPZJ|My0$T?G0(aOvYwJeJOKnep9c}g3XbEb&E z%#cz-N(my;ecQElT|p9qszO9Sax-{jVrEd)+Q8kBQi7^hU<;R0K(aR|rF6Tuu)BjK z+`Ttwe?Egl!*np*V#jsu!GOQtU-0$uTEQ_7ZZNac1HlT8l9AP9w@2`;!0_g{DAd4Qy| z85(O~T8G4qJU)JuhOddpNko`W?;U0acfTD~#TcUj00kfmCc50EwaC0e0^sgx6#$^B zpa|HpS-%ZfwOfEpN73&;!2m#Srp?Uhy}N_V>@j;xJ+0uElSrAbXDlnI0Bc*Bt^`yw zS+yzPX`r*--9f7QI(UVsDk!!}M9!V>d>qGp8|O;qOw~GveE^CLgf+B!glfex{AqYeVr4;SIAT32?FRO9! zv(Zm77s)&Uh477(lExTe1pp$lsn$vWzym-;kMeTUmr~Mk$jnC-wAP@iP*re@5k!O# z0#1XO(R+Uf7*!F`Jz$t$0ao)hz?xUU`Q*HTipZpSH;c%Yn?bMO0c_b8@)z*bvxT?- z&uk$Zp!W`DJ{sKmmFHIEoUgXAl=8ccgJ|XDMtlH7rMk$XnxxwR0000!6(2`P*K3ZJBfGC*c5y-*= zGdo2DHL7~wnTd!1_j}xZQ7UCnLhcgt?r?O3?mq^=WH1@9C%bN}>KFd%T-*yYaVr>D SDnH5q0000aVy4! zn7Xp;7A$=6&cK-IzyX$%tFMZle!y@0!ja#OZD!@xU5^-b>r510p5OQ%Xd;8BtDnm{ Hr-UW|>P19B From 14d79d426c39e7712a21e56c52e3bf3af43966dc Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 27 Oct 2025 19:36:25 +1100 Subject: [PATCH 07/10] FUCK --- .../java/com/hbm/render/block/RenderBoxDuct.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hbm/render/block/RenderBoxDuct.java b/src/main/java/com/hbm/render/block/RenderBoxDuct.java index 404b8f68e..3db27024d 100644 --- a/src/main/java/com/hbm/render/block/RenderBoxDuct.java +++ b/src/main/java/com/hbm/render/block/RenderBoxDuct.java @@ -114,7 +114,7 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { double jLower = lower; double jUpper = upper; - if(te instanceof TileEntityPipeBaseNT) { + if(block instanceof FluidDuctBox) { FluidDuctBox.cachedColor = 0xffffff; FluidDuctBox duct = (FluidDuctBox) block; @@ -125,11 +125,13 @@ public class RenderBoxDuct implements ISimpleBlockRenderingHandler { pZ = duct.canConnectTo(world, x, y, z, Library.POS_Z, te); nZ = duct.canConnectTo(world, x, y, z, Library.NEG_Z, te); - FluidType type = Fluids.NONE; - TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; - type = pipe.getType(); - if(meta % 3 == 2) { - FluidDuctBox.cachedColor = ColorUtil.lightenColor(type.getColor(), 0.25D); //making very dark things not vantablack + if(te instanceof TileEntityPipeBaseNT) { + FluidType type = Fluids.NONE; + TileEntityPipeBaseNT pipe = (TileEntityPipeBaseNT) te; + type = pipe.getType(); + if(meta % 3 == 2) { + FluidDuctBox.cachedColor = ColorUtil.lightenColor(type.getColor(), 0.25D); //making very dark things not vantablack + } } jLower = 0.0625D; From 02ee44e1ceff460c88bcbd3b7bbb8e049a2005dc Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 27 Oct 2025 16:58:21 +0100 Subject: [PATCH 08/10] boner --- changelog | 9 +++++++- .../com/hbm/blocks/generic/TritiumLamp.java | 8 ++++++- .../com/hbm/blocks/machine/Spotlight.java | 18 +++++++++------ .../com/hbm/blocks/machine/SpotlightBeam.java | 4 ++-- .../hbm/blocks/network/CranePartitioner.java | 22 ++++++++++++++----- .../com/hbm/inventory/gui/GUIScreenFluid.java | 2 +- .../recipes/CrystallizerRecipes.java | 4 ++-- 7 files changed, 47 insertions(+), 20 deletions(-) diff --git a/changelog b/changelog index d00dbd0ad..25070fddf 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,7 @@ +## Added +* Boxcables + * Like boxducts, but for power + ## Changed * Updated meteors * Meteors will now punch through weak blocks like leaves instead of getting stuck on trees @@ -5,6 +9,9 @@ * Falling meteors will produce a sound instead of stealthily blowing people up * Fallen meteors will now be placed deeper into the actual crater instead of hovering awkwardly over the hole * Addd QMAW pages for the particle accelerator parts along with a PA overview page and a simple step by step construction tutorial +* Increased the acidizer partitioner's input limit from 9 to 45 slots ## Fixed -* Fixed arc furnace only allowing electrodes to be inserted when the lid is down instead of up \ No newline at end of file +* Fixed arc furnace only allowing electrodes to be inserted when the lid is down instead of up +* Fixed issue where the `amounts` tracker wasn't being used correctly when using a custom acidizer config, preventing the acidizer partitioner from working +* Fixed multi fluid ID search potentially not working on systems with a non-latin locale \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/TritiumLamp.java b/src/main/java/com/hbm/blocks/generic/TritiumLamp.java index 77118915f..535d81853 100644 --- a/src/main/java/com/hbm/blocks/generic/TritiumLamp.java +++ b/src/main/java/com/hbm/blocks/generic/TritiumLamp.java @@ -79,7 +79,7 @@ public class TritiumLamp extends Block implements ISpotlight { private void updateBeam(World world, int x, int y, int z) { if(!isOn) return; - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) Spotlight.propagateBeam(world, x, y, z, dir, getBeamLength()); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) Spotlight.propagateBeam(world, x, y, z, dir, getBeamLength(), getMeta()); } @Override @@ -98,6 +98,12 @@ public class TritiumLamp extends Block implements ISpotlight { return new ItemStack(getOff()); } + protected int getMeta() { + if(this == ModBlocks.lamp_tritium_green_off || this == ModBlocks.lamp_tritium_green_on) return Spotlight.META_GREEN; + if(this == ModBlocks.lamp_tritium_blue_off || this == ModBlocks.lamp_tritium_blue_on) return Spotlight.META_BLUE; + return Spotlight.META_YELLOW; + } + protected Block getOff() { if(this == ModBlocks.lamp_tritium_green_on) return ModBlocks.lamp_tritium_green_off; if(this == ModBlocks.lamp_tritium_blue_on) return ModBlocks.lamp_tritium_blue_off; diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index a72f81db2..caf101e51 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -28,6 +28,10 @@ import net.minecraftforge.common.util.ForgeDirection; public class Spotlight extends Block implements ISpotlight, INBTBlockTransformable { + public static final int META_YELLOW = 0; + public static final int META_GREEN = 1; + public static final int META_BLUE = 2; + public static boolean disableOnGeneration = true; // I'd be extending the ReinforcedLamp class if it wasn't for the inverted behaviour of these specific lights @@ -223,7 +227,7 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab if(!isOn) return; ForgeDirection dir = getDirection(world, x, y, z); - propagateBeam(world, x, y, z, dir, beamLength); + propagateBeam(world, x, y, z, dir, beamLength, META_YELLOW); } public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) { @@ -281,7 +285,7 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab } // Recursively add beam blocks, updating any that already exist with new incoming light directions - public static void propagateBeam(World world, int x, int y, int z, ForgeDirection dir, int distance) { + public static void propagateBeam(World world, int x, int y, int z, ForgeDirection dir, int distance, int meta) { distance--; if(distance <= 0) return; @@ -295,7 +299,7 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab return; if(!(block instanceof SpotlightBeam)) { - world.setBlock(x, y, z, ModBlocks.spotlight_beam); + world.setBlock(x, y, z, ModBlocks.spotlight_beam, meta, 3); } // If we encounter an existing beam, add a new INCOMING direction to the @@ -303,7 +307,7 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab if (SpotlightBeam.setDirection(world, x, y, z, dir, true) == 0) return; - propagateBeam(world, x, y, z, dir, distance); + propagateBeam(world, x, y, z, dir, distance, meta); } // Recursively delete beam blocks, if they aren't still illuminated from a different direction @@ -326,7 +330,7 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab } // Travels back through a beam to the source, and if found, repropagates the beam - public static void backPropagate(World world, int x, int y, int z, ForgeDirection dir) { + public static void backPropagate(World world, int x, int y, int z, ForgeDirection dir, int meta) { x -= dir.offsetX; y -= dir.offsetY; z -= dir.offsetZ; @@ -334,12 +338,12 @@ public class Spotlight extends Block implements ISpotlight, INBTBlockTransformab Block block = world.getBlock(x, y, z); if(block instanceof ISpotlight) { ISpotlight spot = (ISpotlight) block; - propagateBeam(world, x, y, z, dir, spot.getBeamLength()); + propagateBeam(world, x, y, z, dir, spot.getBeamLength(), meta); } else if(!(block instanceof SpotlightBeam)) { return; } - backPropagate(world, x, y, z, dir); + backPropagate(world, x, y, z, dir, meta); } protected Block getOff() { diff --git a/src/main/java/com/hbm/blocks/machine/SpotlightBeam.java b/src/main/java/com/hbm/blocks/machine/SpotlightBeam.java index 274cdd1e0..15acd2c8b 100644 --- a/src/main/java/com/hbm/blocks/machine/SpotlightBeam.java +++ b/src/main/java/com/hbm/blocks/machine/SpotlightBeam.java @@ -29,8 +29,8 @@ public class SpotlightBeam extends BlockBeamBase { if (world.isRemote) return; if (neighborBlock instanceof SpotlightBeam) return; - for (ForgeDirection dir : getDirections(world, x, y, z)) { - Spotlight.backPropagate(world, x, y, z, dir); + for(ForgeDirection dir : getDirections(world, x, y, z)) { + Spotlight.backPropagate(world, x, y, z, dir, world.getBlockMetadata(x, y, z)); } } diff --git a/src/main/java/com/hbm/blocks/network/CranePartitioner.java b/src/main/java/com/hbm/blocks/network/CranePartitioner.java index f2d0b7cee..8e889c324 100644 --- a/src/main/java/com/hbm/blocks/network/CranePartitioner.java +++ b/src/main/java/com/hbm/blocks/network/CranePartitioner.java @@ -139,8 +139,10 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I public static class TileEntityCranePartitioner extends TileEntityMachineBase { + public static final int SLOT_COUNT = 45; + public TileEntityCranePartitioner() { - super(18); + super(SLOT_COUNT * 2); } @Override public String getName() { return "container.partitioner"; } @@ -151,7 +153,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I if(!worldObj.isRemote) { List stacks = new ArrayList(); - for(int i = 0; i < 9; i++) if(slots[i] != null) stacks.add(slots[i]); + for(int i = 0; i < SLOT_COUNT; i++) if(slots[i] != null) stacks.add(slots[i]); stacks.sort(stackSizeComparator); boolean markDirty = false; @@ -168,7 +170,7 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I } } - for(int i = 0; i < 9; i++) if(slots[i] != null && slots[i].stackSize <= 0) slots[i] = null; + for(int i = 0; i < SLOT_COUNT; i++) if(slots[i] != null && slots[i].stackSize <= 0) slots[i] = null; if(markDirty) this.markDirty(); } } @@ -183,17 +185,25 @@ public class CranePartitioner extends BlockContainer implements IConveyorBelt, I @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { - return slot >= 9; + return slot >= SLOT_COUNT; } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - return i <= 8 && CrystallizerRecipes.getAmount(stack) >= 1; + return i <= (SLOT_COUNT - 1) && CrystallizerRecipes.getAmount(stack) >= 1; } + protected int[] access; + @Override public int[] getAccessibleSlotsFromSide(int side) { - return new int[] { 0, 1, 2, 3, 4, 5, 6 ,7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + + if(access == null) { + access = new int[SLOT_COUNT]; // writing this by hand is for chumps + for(int i = 0; i < SLOT_COUNT; i++) access[i] = i; + } + + return access; } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java index a9658184b..4108940bb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java @@ -175,7 +175,7 @@ public class GUIScreenFluid extends GuiScreen { String subs = this.search.getText().toLowerCase(Locale.US); for(FluidType type : Fluids.getInNiceOrder()) { - String name = type.getLocalizedName().toLowerCase(); + String name = type.getLocalizedName().toLowerCase(Locale.US); if(name.contains(subs) && !type.hasNoID()) { this.searchArray[next] = type; diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index 7108abae4..c8693586a 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -383,9 +383,9 @@ public class CrystallizerRecipes extends SerializableRecipe { input.stacksize = 1; cRecipe.acidAmount = fluid.fill; if(input instanceof ComparableStack) { - recipes.put(new Pair(((ComparableStack) input), fluid.type), cRecipe); + this.registerRecipe(input, cRecipe, fluid); } else if(input instanceof OreDictStack) { - recipes.put(new Pair(((OreDictStack) input).name, fluid.type), cRecipe); + this.registerRecipe(input, cRecipe, fluid); } if(obj.has("productivity")) cRecipe.prod(obj.get("productivity").getAsFloat()); } From efc5a8892882e43090ed95a15aeceac3327cdc94 Mon Sep 17 00:00:00 2001 From: Mikhail Semenov Date: Mon, 27 Oct 2025 23:22:06 +0100 Subject: [PATCH 09/10] Change Builders Jetpack shift space behavior Currently, pressing Shift+Space causes the jetpack to ascend, which I believe is unintentional. This change makes that key combination do nothing. --- src/main/java/com/hbm/items/armor/JetpackBreak.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/JetpackBreak.java b/src/main/java/com/hbm/items/armor/JetpackBreak.java index e5c4128f9..c80e55805 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBreak.java +++ b/src/main/java/com/hbm/items/armor/JetpackBreak.java @@ -47,7 +47,10 @@ public class JetpackBreak extends JetpackFueledBase { if(getFuel(stack) > 0) { - if(props.isJetpackActive()) { + boolean playerTriesToHover = player.isSneaking() && props.isJetpackActive(); + boolean playerShouldHover = playerTriesToHover || !player.isSneaking(); + + if(props.isJetpackActive() && !playerTriesToHover) { player.fallDistance = 0; if(player.motionY < 0.4D) @@ -56,7 +59,7 @@ public class JetpackBreak extends JetpackFueledBase { world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.flamethrowerShoot", 0.25F, 1.5F); this.useUpFuel(player, stack, 5); - } else if(!player.isSneaking() && !player.onGround && props.enableBackpack) { + } else if(playerShouldHover && !player.onGround && props.enableBackpack) { player.fallDistance = 0; if(player.motionY < -1) @@ -72,7 +75,7 @@ public class JetpackBreak extends JetpackFueledBase { world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.flamethrowerShoot", 0.25F, 1.5F); this.useUpFuel(player, stack, 10); } - + ArmorUtil.resetFlightTime(player); } } From 76d4a4a453d769a8a8f82b1b5a1a87f6212fef9c Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 28 Oct 2025 22:18:20 +0100 Subject: [PATCH 10/10] you can have like half a UV --- .../assets/hbm/textures/models/fusion/torus.png | Bin 0 -> 11577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/models/fusion/torus.png diff --git a/src/main/resources/assets/hbm/textures/models/fusion/torus.png b/src/main/resources/assets/hbm/textures/models/fusion/torus.png new file mode 100644 index 0000000000000000000000000000000000000000..d89449133f1319d78aee7ebd6718be3753a13e43 GIT binary patch literal 11577 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 literal 0 HcmV?d00001