diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/cutoffs/TileEntityCutoffSwitch.java b/src/main/java/com/micatechnologies/realgrid/blocks/cutoffs/TileEntityCutoffSwitch.java index 29606f3..f387d31 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/cutoffs/TileEntityCutoffSwitch.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/cutoffs/TileEntityCutoffSwitch.java @@ -388,7 +388,8 @@ public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { super.readCustomNBT(nbt, descPacket); - facing = EnumFacing.byIndex(nbt.getInteger("facing")); + EnumFacing loaded = EnumFacing.byIndex(nbt.getInteger("facing")); + facing = loaded.getAxis() != EnumFacing.Axis.Y ? loaded : EnumFacing.NORTH; wires = nbt.getInteger("wires"); active = nbt.getBoolean("active"); inverted = nbt.getBoolean("inverted"); diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/InsulatorGeometry.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/InsulatorGeometry.java index fa24662..e5e3404 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/InsulatorGeometry.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/InsulatorGeometry.java @@ -1,5 +1,6 @@ package com.micatechnologies.realgrid.blocks.insulators; +import com.micatechnologies.realgrid.util.BoundsUtil; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.Vec3d; @@ -8,68 +9,50 @@ * {@link TileEntityInsulatorBase} so every leaf TE is just a * constructor-param wrapper instead of a bespoke subclass. * - * Four presets cover all current insulators: + *
Top-mount presets use a fixed bounding box and offset (no rotation). + * Rotatable presets store NORTH-facing bounds and offset, then rotate + * dynamically via {@link BoundsUtil}. + * + *
Five presets cover all current insulators: * VISE_TOP - Hendrix compact top-mount * F_NECK - Locke and MacLean PTI tall top-mount * POST_TOP - MacLean PI full top-mount * SIDE_MOUNT - every direction-dependent side-mount variant + * DEAD_END - dead-end insulators (elevated, direction-dependent) */ public final class InsulatorGeometry { - private final boolean sideMount; - private final Vec3d topOffset; - private final float[] topBounds; - private final double sideY; - private final float[] sideBoundsNS; - private final float[] sideBoundsEW; - - private InsulatorGeometry(Vec3d topOffset, float[] topBounds) - { - this.sideMount = false; - this.topOffset = topOffset; - this.topBounds = topBounds; - this.sideY = 0; - this.sideBoundsNS = null; - this.sideBoundsEW = null; - } + private final boolean usesRotation; + private final Vec3d northOffset; + private final float[] northBounds; - private InsulatorGeometry(double sideY, float[] nsBounds, float[] ewBounds) + private InsulatorGeometry(boolean usesRotation, Vec3d northOffset, float[] northBounds) { - this.sideMount = true; - this.topOffset = null; - this.topBounds = null; - this.sideY = sideY; - this.sideBoundsNS = nsBounds; - this.sideBoundsEW = ewBounds; + this.usesRotation = usesRotation; + this.northOffset = northOffset; + this.northBounds = northBounds; } + /** Creates a top-mount geometry with fixed (non-rotating) bounds and offset. */ public static InsulatorGeometry top(Vec3d offset, float[] bounds) { - return new InsulatorGeometry(offset, bounds); + return new InsulatorGeometry(false, offset, bounds); } - public static InsulatorGeometry side(double y, float[] nsBounds, float[] ewBounds) + /** Creates a direction-dependent geometry that rotates bounds/offset by facing. */ + public static InsulatorGeometry rotatable(Vec3d northOffset, float[] northBounds) { - return new InsulatorGeometry(y, nsBounds, ewBounds); + return new InsulatorGeometry(true, northOffset, northBounds); } public Vec3d connectionOffset(EnumFacing facing) { - if (!sideMount) return topOffset; - double dx = 0.5, dz = 0.5; - if (facing == EnumFacing.NORTH) dz = 0.125; - else if (facing == EnumFacing.SOUTH) dz = 0.875; - else if (facing == EnumFacing.WEST) dx = 0.125; - else if (facing == EnumFacing.EAST) dx = 0.875; - return new Vec3d(dx, sideY, dz); + return usesRotation ? BoundsUtil.rotateOffset(northOffset, facing) : northOffset; } public float[] blockBounds(EnumFacing facing) { - if (!sideMount) return topBounds; - return (facing == EnumFacing.NORTH || facing == EnumFacing.SOUTH) - ? sideBoundsNS - : sideBoundsEW; + return usesRotation ? BoundsUtil.rotateBounds(northBounds, facing) : northBounds; } // === Presets === @@ -92,10 +75,21 @@ public float[] blockBounds(EnumFacing facing) new float[]{0.25f, 0.0f, 0.25f, 0.75f, 0.9375f, 0.75f} ); - /** Every direction-dependent side-mount insulator. */ - public static final InsulatorGeometry SIDE_MOUNT = side( - 0.5625, - new float[]{0.3125f, 0.0f, 0.0625f, 0.6875f, 0.6875f, 0.9375f}, - new float[]{0.0625f, 0.0f, 0.3125f, 0.9375f, 0.6875f, 0.6875f} + /** + * Every direction-dependent side-mount insulator. + * NORTH-facing bounds: narrow in X, extends along Z toward the facing direction. + */ + public static final InsulatorGeometry SIDE_MOUNT = rotatable( + new Vec3d(0.5, 0.5625, 0.125), + new float[]{0.3125f, 0.0f, 0.0625f, 0.6875f, 0.6875f, 0.9375f} + ); + + /** + * Dead-end insulators: elevated models that extend along the facing direction. + * Bounds are raised on Y to match the actual model position. + */ + public static final InsulatorGeometry DEAD_END = rotatable( + new Vec3d(0.5, 0.6875, 0.125), + new float[]{0.25f, 0.375f, 0.0f, 0.75f, 0.8125f, 1.0f} ); } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityInsulatorBase.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityInsulatorBase.java index 71dfa69..8731c18 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityInsulatorBase.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityInsulatorBase.java @@ -59,7 +59,8 @@ public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { super.readCustomNBT(nbt, descPacket); - facing = EnumFacing.byIndex(nbt.getInteger("facing")); + EnumFacing loaded = EnumFacing.byIndex(nbt.getInteger("facing")); + facing = loaded.getAxis() != EnumFacing.Axis.Y ? loaded : EnumFacing.NORTH; wireCount = nbt.getInteger("wireCount"); colorVariant = nbt.getInteger("colorVariant"); } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellNew.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellNew.java index 6ac1edc..ef8ba44 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellNew.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellNew.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI1BellNew extends TileEntityInsulatorBase { public TileEntityMacLeanDEI1BellNew() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellOld.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellOld.java index 3b7131d..8d5450d 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellOld.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI1BellOld.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI1BellOld extends TileEntityInsulatorBase { public TileEntityMacLeanDEI1BellOld() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellNew.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellNew.java index b1d501b..663e477 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellNew.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellNew.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI2BellNew extends TileEntityInsulatorBase { public TileEntityMacLeanDEI2BellNew() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellOld.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellOld.java index 0d8c61d..e725b73 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellOld.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI2BellOld.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI2BellOld extends TileEntityInsulatorBase { public TileEntityMacLeanDEI2BellOld() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellNew.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellNew.java index bea24ec..cfe58b1 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellNew.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellNew.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI3BellNew extends TileEntityInsulatorBase { public TileEntityMacLeanDEI3BellNew() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellOld.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellOld.java index 25fa124..ada6ac8 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellOld.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3BellOld.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI3BellOld extends TileEntityInsulatorBase { public TileEntityMacLeanDEI3BellOld() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3Core.java index 51f46e7..5b68418 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI3Core.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI3Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI3Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core.java index 97b156d..4155845 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI4Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI4Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core2.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core2.java index 03af7b8..a6d5a2a 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core2.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI4Core2.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI4Core2 extends TileEntityInsulatorBase { public TileEntityMacLeanDEI4Core2() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI6Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI6Core.java index 1975597..ec47597 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI6Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI6Core.java @@ -1,9 +1,10 @@ package com.micatechnologies.realgrid.blocks.insulators; + public class TileEntityMacLeanDEI6Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI6Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core.java index 6969277..e86886d 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI7Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI7Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core2.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core2.java index 982d3d1..bdeaeb5 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core2.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core2.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI7Core2 extends TileEntityInsulatorBase { public TileEntityMacLeanDEI7Core2() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core3.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core3.java index 3d4d751..5c5073b 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core3.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI7Core3.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI7Core3 extends TileEntityInsulatorBase { public TileEntityMacLeanDEI7Core3() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI8Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI8Core.java index 0ba4dd3..aacebca 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI8Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI8Core.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI8Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI8Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI9Core.java b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI9Core.java index aac36d1..4071e30 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI9Core.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/insulators/TileEntityMacLeanDEI9Core.java @@ -4,6 +4,6 @@ public class TileEntityMacLeanDEI9Core extends TileEntityInsulatorBase { public TileEntityMacLeanDEI9Core() { - super(InsulatorGeometry.SIDE_MOUNT); + super(InsulatorGeometry.DEAD_END); } } diff --git a/src/main/java/com/micatechnologies/realgrid/blocks/transformers/TileEntityRealTransformer.java b/src/main/java/com/micatechnologies/realgrid/blocks/transformers/TileEntityRealTransformer.java index 3605baf..4e9bd2a 100644 --- a/src/main/java/com/micatechnologies/realgrid/blocks/transformers/TileEntityRealTransformer.java +++ b/src/main/java/com/micatechnologies/realgrid/blocks/transformers/TileEntityRealTransformer.java @@ -114,7 +114,8 @@ public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { super.readCustomNBT(nbt, descPacket); - facing = EnumFacing.byIndex(nbt.getInteger("facing")); + EnumFacing loaded = EnumFacing.byIndex(nbt.getInteger("facing")); + facing = loaded.getAxis() != EnumFacing.Axis.Y ? loaded : EnumFacing.NORTH; dummy = nbt.getInteger("dummy"); hvCable1 = nbt.hasKey("hvCable1") ? ApiUtils.getWireTypeFromNBT(nbt, "hvCable1") : null; hvCable2 = nbt.hasKey("hvCable2") ? ApiUtils.getWireTypeFromNBT(nbt, "hvCable2") : null; diff --git a/src/main/java/com/micatechnologies/realgrid/util/BoundsUtil.java b/src/main/java/com/micatechnologies/realgrid/util/BoundsUtil.java new file mode 100644 index 0000000..3b51cbc --- /dev/null +++ b/src/main/java/com/micatechnologies/realgrid/util/BoundsUtil.java @@ -0,0 +1,59 @@ +package com.micatechnologies.realgrid.util; + +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.Vec3d; + +/** + * Utility for rotating bounding boxes and connection offsets by horizontal + * {@link EnumFacing}. All inputs are assumed to describe the NORTH-facing + * orientation; the utility rotates them clockwise around the block centre. + * + *
Adapted from CSM's {@code RotationUtils} for the {@code float[]} format + * used by IE's {@code IBlockBounds} interface. + */ +public final class BoundsUtil +{ + private BoundsUtil() {} + + /** + * Rotates a NORTH-facing bounding box ({@code [minX, minY, minZ, maxX, maxY, maxZ]}) + * to align with the given horizontal facing. + */ + public static float[] rotateBounds(float[] northBounds, EnumFacing facing) + { + float minX = northBounds[0], minY = northBounds[1], minZ = northBounds[2]; + float maxX = northBounds[3], maxY = northBounds[4], maxZ = northBounds[5]; + + switch (facing) + { + case SOUTH: + return new float[]{ 1f - maxX, minY, 1f - maxZ, 1f - minX, maxY, 1f - minZ }; + case EAST: + return new float[]{ 1f - maxZ, minY, minX, 1f - minZ, maxY, maxX }; + case WEST: + return new float[]{ minZ, minY, 1f - maxX, maxZ, maxY, 1f - minX }; + default: // NORTH or unexpected + return northBounds; + } + } + + /** + * Rotates a NORTH-facing connection offset to align with the given + * horizontal facing. + */ + public static Vec3d rotateOffset(Vec3d northOffset, EnumFacing facing) + { + double x = northOffset.x, y = northOffset.y, z = northOffset.z; + switch (facing) + { + case SOUTH: + return new Vec3d(1.0 - x, y, 1.0 - z); + case EAST: + return new Vec3d(1.0 - z, y, x); + case WEST: + return new Vec3d(z, y, 1.0 - x); + default: // NORTH or unexpected + return northOffset; + } + } +}