Big refactor of connection code. Connections can now be blocked by covers but pass through hollow covers.

This commit is contained in:
Ben Spiers 2013-09-26 20:26:02 +01:00
parent 2bf6c2de9c
commit a7579ff98f
4 changed files with 98 additions and 61 deletions

View file

@ -24,6 +24,7 @@ public class MultipartRI implements IPartFactory
MultipartGenerator.registerPassThroughInterface("ic2.api.energy.tile.IEnergySink"); MultipartGenerator.registerPassThroughInterface("ic2.api.energy.tile.IEnergySink");
MultipartGenerator.registerPassThroughInterface("buildcraft.api.power.IPowerReceptor"); MultipartGenerator.registerPassThroughInterface("buildcraft.api.power.IPowerReceptor");
MultipartGenerator.registerPassThroughInterface("resonantinduction.wire.IInsulatedMaterial"); MultipartGenerator.registerPassThroughInterface("resonantinduction.wire.IInsulatedMaterial");
MultipartGenerator.registerPassThroughInterface("resonantinduction.wire.multipart.IBlockableConnection");
} }
} }

View file

@ -0,0 +1,8 @@
package resonantinduction.wire.multipart;
import net.minecraftforge.common.ForgeDirection;
public interface IBlockableConnection
{
public boolean isBlockedOnSide(ForgeDirection side);
}

View file

@ -51,7 +51,7 @@ public abstract class PartUniversalConductor extends PartConductor implements IE
if (tileEntity instanceof IConnector) if (tileEntity instanceof IConnector)
{ {
if (((IConnector) tileEntity).canConnect(side.getOpposite())) if (this.canConnect(side) && ((IConnector) tileEntity).canConnect(side.getOpposite()))
{ {
this.adjacentConnections[i] = tileEntity; this.adjacentConnections[i] = tileEntity;
} }

View file

@ -64,27 +64,36 @@ import codechicken.multipart.handler.MultipartProxy;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
public class PartWire extends PartUniversalConductor implements TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects, IInsulatedMaterial public class PartWire extends PartUniversalConductor implements TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects, IInsulatedMaterial, IBlockableConnection
{ {
public static final int DEFAULT_COLOR = 16; public static final int DEFAULT_COLOR = 16;
public int dyeID = DEFAULT_COLOR; public int dyeID = DEFAULT_COLOR;
public boolean isInsulated = false; public boolean isInsulated = false;
public static RenderPartWire renderer = new RenderPartWire(); public static RenderPartWire renderer = new RenderPartWire();
public static IndexedCuboid6[] sides = new IndexedCuboid6[7]; public static IndexedCuboid6[] sides = new IndexedCuboid6[7];
public static IndexedCuboid6[] insulatedSides = new IndexedCuboid6[7];
public EnumWireMaterial material = EnumWireMaterial.COPPER; public EnumWireMaterial material = EnumWireMaterial.COPPER;
public byte currentConnections; public byte currentConnections = 0x00;
/** Client Side Connection Check */ /** Client Side Connection Check */
public boolean isTick = false; public boolean isTick = false;
private ForgeDirection testingSide;
static { static {
sides[0] = new IndexedCuboid6(0, new Cuboid6(0.3, 0.0, 0.3, 0.7, 0.3, 0.7)); sides[0] = new IndexedCuboid6(0, new Cuboid6(0.36, 0.000, 0.36, 0.64, 0.36, 0.64));
sides[1] = new IndexedCuboid6(1, new Cuboid6(0.3, 0.7, 0.3, 0.7, 1.0, 0.7)); sides[1] = new IndexedCuboid6(1, new Cuboid6(0.36, 0.64, 0.36, 0.64, 1.000, 0.64));
sides[2] = new IndexedCuboid6(2, new Cuboid6(0.3, 0.3, 0.0, 0.7, 0.7, 0.3)); sides[2] = new IndexedCuboid6(2, new Cuboid6(0.36, 0.36, 0.000, 0.64, 0.64, 0.36));
sides[3] = new IndexedCuboid6(3, new Cuboid6(0.3, 0.3, 0.7, 0.7, 0.7, 1.0)); sides[3] = new IndexedCuboid6(3, new Cuboid6(0.36, 0.36, 0.64, 0.64, 0.64, 1.000));
sides[4] = new IndexedCuboid6(4, new Cuboid6(0.0, 0.3, 0.3, 0.3, 0.7, 0.7)); sides[4] = new IndexedCuboid6(4, new Cuboid6(0.000, 0.36, 0.36, 0.36, 0.64, 0.64));
sides[5] = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7)); sides[5] = new IndexedCuboid6(5, new Cuboid6(0.64, 0.36, 0.36, 1.000, 0.64, 0.64));
sides[6] = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)); sides[6] = new IndexedCuboid6(6, new Cuboid6(0.36, 0.36, 0.36, 0.64, 0.64, 0.64));
insulatedSides[0] = new IndexedCuboid6(0, new Cuboid6(0.3, 0.0, 0.3, 0.7, 0.3, 0.7));
insulatedSides[1] = new IndexedCuboid6(1, new Cuboid6(0.3, 0.7, 0.3, 0.7, 1.0, 0.7));
insulatedSides[2] = new IndexedCuboid6(2, new Cuboid6(0.3, 0.3, 0.0, 0.7, 0.7, 0.3));
insulatedSides[3] = new IndexedCuboid6(3, new Cuboid6(0.3, 0.3, 0.7, 0.7, 0.7, 1.0));
insulatedSides[4] = new IndexedCuboid6(4, new Cuboid6(0.0, 0.3, 0.3, 0.3, 0.7, 0.7));
insulatedSides[5] = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7));
insulatedSides[6] = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7));
} }
public PartWire(int typeID) public PartWire(int typeID)
@ -108,83 +117,83 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
Vector3 connectPos = new Vector3(tile()).modifyPositionFromSide(direction); Vector3 connectPos = new Vector3(tile()).modifyPositionFromSide(direction);
TileEntity connectTile = connectPos.getTileEntity(this.world()); TileEntity connectTile = connectPos.getTileEntity(this.world());
if (connectTile instanceof IWireMaterial) return !connectionPrevented(connectTile, direction);
}
public boolean connectionPrevented(TileEntity tile, ForgeDirection side)
{
if (tile instanceof IWireMaterial)
{ {
IWireMaterial wireTile = (IWireMaterial) connectTile; IWireMaterial wireTile = (IWireMaterial) tile;
if (wireTile.getMaterial() != this.getMaterial()) if (wireTile.getMaterial() != this.getMaterial())
{ return true;
return false;
}
} }
if (this.isInsulated() && connectTile instanceof IInsulation) if (this.isInsulated() && tile instanceof IInsulation)
{ {
IInsulation insulatedTile = (IInsulation) connectTile; IInsulation insulatedTile = (IInsulation) tile;
if ((insulatedTile.isInsulated() && insulatedTile.getInsulationColor() != this.getInsulationColor() && this.getInsulationColor() != DEFAULT_COLOR && insulatedTile.getInsulationColor() != DEFAULT_COLOR)) if ((insulatedTile.isInsulated() && insulatedTile.getInsulationColor() != this.getInsulationColor() && this.getInsulationColor() != DEFAULT_COLOR && insulatedTile.getInsulationColor() != DEFAULT_COLOR))
{ return true;
return false;
}
} }
return true; return (this.isBlockedOnSide(side) || tile instanceof IBlockableConnection && ((IBlockableConnection)tile).isBlockedOnSide(side.getOpposite()));
} }
public byte getPreventedConnections() public byte getPossibleConnections()
{ {
byte map = 0x00; byte connections = 0x00;
if (this.world().isBlockIndirectlyGettingPowered(this.x(), this.y(), this.z()))
{
return connections;
}
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{ {
TileEntity tileEntity = VectorHelper.getTileEntityFromSide(this.world(), new Vector3(tile()), side); TileEntity tileEntity = VectorHelper.getTileEntityFromSide(this.world(), new Vector3(tile()), side);
if (tileEntity instanceof INetworkProvider && !canConnect(side)) if (tileEntity instanceof INetworkProvider && !this.connectionPrevented(tileEntity, side))
map |= 1 << side.ordinal(); connections |= 1 << side.ordinal();
} }
return map; return connections;
} }
@Override @Override
public void refresh() public void refresh()
{ {
this.adjacentConnections = null; // this.adjacentConnections = null;
if (!this.world().isRemote) if (!this.world().isRemote)
{ {
if (isInsulated() || this.world().isBlockIndirectlyGettingPowered(this.x(), this.y(), this.z())) this.adjacentConnections = null;
byte possibleConnections = getPossibleConnections();
if (possibleConnections != currentConnections)
{ {
byte preventedConnections = getPreventedConnections(); byte or = (byte) (possibleConnections | currentConnections);
for (int i = 0; i < 6; i++) if (or != possibleConnections) //Connections have been removed
{ {
int sideConnected = currentConnections & (1 << i); this.getNetwork().split((IConductor) tile());
int sidePrevented = preventedConnections & (1 << i); this.setNetwork(null);
if (sideConnected == 1 << i && sidePrevented == 1 << i)
{
currentConnections = 0x00;
getNetwork().split((IConductor) tile());
setNetwork(null);
break;
}
} }
}
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
if (this.canConnect(side))
{ {
TileEntity tileEntity = VectorHelper.getConnectorFromSide(this.world(), new Vector3(tile()), side); byte tester = (byte) (1 << side.ordinal());
if ((possibleConnections & tester) > 0)
if (tileEntity != null)
{ {
TileEntity tileEntity = VectorHelper.getConnectorFromSide(this.world(), new Vector3(tile()), side);
if (tileEntity instanceof INetworkProvider) if (tileEntity instanceof INetworkProvider)
{ {
this.getNetwork().merge(((INetworkProvider) tileEntity).getNetwork()); this.getNetwork().merge(((INetworkProvider) tileEntity).getNetwork());
currentConnections |= (1 << side.ordinal());
} }
} }
} }
}
this.getNetwork().refresh(); currentConnections = possibleConnections;
}
this.sendDescUpdate();
this.getNetwork().refresh();
} }
tile().markRender(); tile().markRender();
} }
@ -271,16 +280,17 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
public Iterable<IndexedCuboid6> getSubParts() public Iterable<IndexedCuboid6> getSubParts()
{ {
Set<IndexedCuboid6> subParts = new HashSet<IndexedCuboid6>(); Set<IndexedCuboid6> subParts = new HashSet<IndexedCuboid6>();
if(getTile() != null) IndexedCuboid6[] currentSides = this.isInsulated() ? insulatedSides : sides;
if(tile() != null)
{ {
TileEntity[] connections = getAdjacentConnections(); TileEntity[] connections = getAdjacentConnections();
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{ {
int ord = side.ordinal(); int ord = side.ordinal();
if(connections[ord] != null) subParts.add(sides[ord]); if(connections[ord] != null || side == this.testingSide) subParts.add(currentSides[ord]);
} }
} }
subParts.add(sides[6]); subParts.add(currentSides[6]);
return subParts; return subParts;
} }
@ -312,7 +322,7 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void renderStatic(codechicken.lib.vec.Vector3 pos, LazyLightMatrix olm, int pass) public void renderStatic(codechicken.lib.vec.Vector3 pos, LazyLightMatrix olm, int pass)
{ {
if (pass ==0) if (pass == 0)
renderer.renderStatic(this); renderer.renderStatic(this);
} }
@ -338,7 +348,8 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
this.dyeID = packet.readInt(); this.dyeID = packet.readInt();
this.isInsulated = packet.readBoolean(); this.isInsulated = packet.readBoolean();
this.isTick = packet.readBoolean(); this.isTick = packet.readBoolean();
this.currentConnections = packet.readByte();
if (tile() != null) tile().markRender();
} }
@Override @Override
@ -348,6 +359,7 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
packet.writeInt(this.dyeID); packet.writeInt(this.dyeID);
packet.writeBoolean(this.isInsulated); packet.writeBoolean(this.isInsulated);
packet.writeBoolean(this.isTick); packet.writeBoolean(this.isTick);
packet.writeByte(this.currentConnections);
} }
@Override @Override
@ -385,12 +397,12 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
{ {
if (item != null) if (item != null)
{ {
if (item.itemID == Item.dyePowder.itemID) if (item.itemID == Item.dyePowder.itemID && isInsulated())
{ {
setDye(item.getItemDamage()); setDye(item.getItemDamage());
return true; return true;
} }
else if (item.itemID == Block.cloth.blockID && !isInsulated) else if (item.itemID == Block.cloth.blockID && !isInsulated())
{ {
setInsulated(); setInsulated();
setDye(BlockColored.getDyeFromBlock(item.getItemDamage())); setDye(BlockColored.getDyeFromBlock(item.getItemDamage()));
@ -490,6 +502,22 @@ public class PartWire extends PartUniversalConductor implements TSlottedPart, JN
{ {
IconHitEffects.addDestroyEffects(this, effectRenderer, false); IconHitEffects.addDestroyEffects(this, effectRenderer, false);
} }
@Override
public boolean isBlockedOnSide(ForgeDirection side)
{
TMultiPart blocker = tile().partMap(side.ordinal());
this.testingSide = side;
boolean expandable = NormalOcclusionTest.apply(this, blocker);
this.testingSide = null;
return !expandable;
}
@Override
public void onPartChanged(TMultiPart part)
{
refresh();
}
} }