diff --git a/src/main/java/remoteio/common/block/BlockRemoteInterface.java b/src/main/java/remoteio/common/block/BlockRemoteInterface.java index 8975f6d..a058f27 100644 --- a/src/main/java/remoteio/common/block/BlockRemoteInterface.java +++ b/src/main/java/remoteio/common/block/BlockRemoteInterface.java @@ -82,6 +82,9 @@ public float getBlockHardness(World world, int x, int y, int z) { @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { TileRemoteInterface tile = (TileRemoteInterface) world.getTileEntity(x, y, z); + if (tile != null && !world.isRemote) { + tile.updateAEConnection(); + } if (tile != null && tile.remotePosition != null && tile.hasTransferChip(TransferType.REDSTONE)) { tile.remotePosition.getBlock().onNeighborBlockChange( tile.remotePosition.getWorld(), diff --git a/src/main/java/remoteio/common/core/compat/LinkedGridNode.java b/src/main/java/remoteio/common/core/compat/LinkedGridNode.java deleted file mode 100644 index 95c60d6..0000000 --- a/src/main/java/remoteio/common/core/compat/LinkedGridNode.java +++ /dev/null @@ -1,170 +0,0 @@ -package remoteio.common.core.compat; - -import java.lang.ref.WeakReference; -import java.util.EnumSet; -import java.util.List; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.google.common.collect.Lists; - -import appeng.api.AEApi; -import appeng.api.networking.GridFlags; -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridBlock; -import appeng.api.networking.IGridConnection; -import appeng.api.networking.IGridHost; -import appeng.api.networking.IGridNode; -import appeng.api.networking.IGridVisitor; -import appeng.api.util.IReadOnlyCollection; -import appeng.util.ReadOnlyCollection; -import remoteio.common.core.TransferType; -import remoteio.common.tile.TileRemoteInterface; - -/** - * @author dmillerw - */ -public class LinkedGridNode implements IGridNode { - - private final WeakReference parentNode; - private final WeakReference ourNode; - - private final TileRemoteInterface parentInterface; - - public LinkedGridNode(IGridNode parentNode, TileRemoteInterface parentInterface) { - this.parentNode = new WeakReference(parentNode); - this.ourNode = new WeakReference(AEApi.instance().createGridNode(parentInterface)); - this.parentInterface = parentInterface; - } - - private IGridNode getParentNode() { - return parentNode != null ? parentNode.get() : null; - } - - private IGridNode getOurNode() { - return ourNode != null ? ourNode.get() : null; - } - - @Override - public void beginVisit(IGridVisitor g) { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - if (gridNode != null) gridNode.beginVisit(g); - else if (ourNode != null) ourNode.beginVisit(g); - } - - @Override - public void updateState() { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - if (gridNode != null) gridNode.updateState(); - if (ourNode != null) ourNode.updateState(); - } - - @Override - public IGridHost getMachine() { - return parentInterface; - } - - @Override - public IGrid getGrid() { - IGridNode gridNode = getParentNode(); - return gridNode != null ? gridNode.getGrid() : null; - } - - @Override - public void destroy() { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - if (gridNode != null) gridNode.destroy(); - if (ourNode != null) ourNode.destroy(); - } - - @Override - public World getWorld() { - return parentInterface.getWorldObj(); - } - - @Override - public EnumSet getConnectedSides() { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - EnumSet enumSet = EnumSet.noneOf(ForgeDirection.class); - if (gridNode != null) enumSet.addAll(gridNode.getConnectedSides()); - if (ourNode != null) enumSet.addAll(ourNode.getConnectedSides()); - return enumSet; - } - - @Override - public IReadOnlyCollection getConnections() { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - List list = Lists.newArrayList(); - if (gridNode != null) { - for (IGridConnection gridConneciton : gridNode.getConnections()) { - list.add(gridConneciton); - } - } - if (ourNode != null) { - for (IGridConnection gridConneciton : ourNode.getConnections()) { - list.add(gridConneciton); - } - } - return new ReadOnlyCollection(list); - } - - @Override - public IGridBlock getGridBlock() { - return parentInterface; - } - - @Override - public boolean isActive() { - return parentInterface.hasTransferChip(TransferType.NETWORK_AE); - } - - @Override - public void loadFromNBT(String name, NBTTagCompound nodeData) { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - if (gridNode != null) gridNode.loadFromNBT(name, nodeData); - if (ourNode != null) ourNode.loadFromNBT(name, nodeData); - } - - @Override - public void saveToNBT(String name, NBTTagCompound nodeData) { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - if (gridNode != null) gridNode.saveToNBT(name, nodeData); - if (ourNode != null) ourNode.saveToNBT(name, nodeData); - } - - @Override - public boolean meetsChannelRequirements() { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - return (gridNode != null && gridNode.meetsChannelRequirements()) - || (ourNode != null && ourNode.meetsChannelRequirements()); - } - - @Override - public boolean hasFlag(GridFlags flag) { - IGridNode gridNode = getParentNode(); - IGridNode ourNode = getOurNode(); - return (gridNode != null && gridNode.hasFlag(flag)) || (ourNode != null && ourNode.hasFlag(flag)); - } - - @Override - public void setPlayerID(int playerID) { - IGridNode gridNode = getParentNode(); - if (gridNode != null) gridNode.setPlayerID(playerID); - } - - @Override - public int getPlayerID() { - IGridNode gridNode = getParentNode(); - return gridNode != null ? gridNode.getPlayerID() : 0; - } -} diff --git a/src/main/java/remoteio/common/tile/TileRemoteInterface.java b/src/main/java/remoteio/common/tile/TileRemoteInterface.java index 3ba62aa..5805f59 100644 --- a/src/main/java/remoteio/common/tile/TileRemoteInterface.java +++ b/src/main/java/remoteio/common/tile/TileRemoteInterface.java @@ -1,6 +1,7 @@ package remoteio.common.tile; -import java.util.EnumSet; +import java.util.ArrayList; +import java.util.EnumMap; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -17,15 +18,11 @@ import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; -import appeng.api.networking.GridFlags; -import appeng.api.networking.GridNotification; -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridBlock; +import appeng.api.exceptions.FailedConnection; +import appeng.api.networking.IGridConnection; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; -import appeng.api.util.AECableType; -import appeng.api.util.AEColor; -import appeng.api.util.DimensionalCoord; +import appeng.me.GridConnection; import cofh.api.energy.IEnergyHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModAPIManager; @@ -37,7 +34,6 @@ import ic2.api.tile.IWrenchable; import remoteio.common.core.TransferType; import remoteio.common.core.UpgradeType; -import remoteio.common.core.compat.LinkedGridNode; import remoteio.common.core.helper.RotationHelper; import remoteio.common.core.helper.mod.IC2Helper; import remoteio.common.lib.DependencyInfo; @@ -73,8 +69,7 @@ @Optional.Interface(iface = DependencyInfo.Paths.IC2.IENERGYTILE, modid = DependencyInfo.ModIds.IC2), @Optional.Interface(iface = DependencyInfo.Paths.IC2.IENERGYSTORAGE, modid = DependencyInfo.ModIds.IC2), @Optional.Interface(iface = DependencyInfo.Paths.COFH.IENERGYHANDLER, modid = DependencyInfo.ModIds.COFH_API), - @Optional.Interface(iface = DependencyInfo.Paths.AE2.IGRIDHOST, modid = DependencyInfo.ModIds.AE2), - @Optional.Interface(iface = DependencyInfo.Paths.AE2.IGRIDBLOCK, modid = DependencyInfo.ModIds.AE2), + @Optional.Interface( iface = DependencyInfo.Paths.Thaumcraft.IWANDABLE, modid = DependencyInfo.ModIds.THAUMCRAFT), @@ -86,8 +81,6 @@ public class TileRemoteInterface extends TileIOCore IEnergySink, // IC2 IEnergyStorage, // IC2 IEnergyHandler, // COFH - IGridHost, // AE2 - IGridBlock, // AE2 IWandable, // THAUMCRAFT IWrenchable // IC2 { @@ -132,8 +125,6 @@ public void callback(IInventory inventory) { public DimensionalCoords remotePosition; - private LinkedGridNode aeGridNode; - // THIS IS NOT AN ANGLE, BUT THE NUMBER OF LEFT-HAND ROTATIONS! public int rotationY = 0; @@ -185,37 +176,16 @@ public void onClientUpdate(NBTTagCompound nbt) { } } + int AEUpdateCooldown; + @Override public void updateEntity() { if (!worldObj.isRemote) { - if (!tracking) { - if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) { - if (remotePosition != null && remotePosition.getTileEntity() != this - && hasTransferChip(TransferType.NETWORK_AE)) { - if (remotePosition.getTileEntity() instanceof IGridHost) { - aeGridNode = new LinkedGridNode( - ((IGridHost) remotePosition.getTileEntity()).getGridNode(ForgeDirection.UNKNOWN), - this); - aeGridNode.updateState(); - } - } - - for (ForgeDirection forgeDirection : ForgeDirection.VALID_DIRECTIONS) { - TileEntity tileEntity = worldObj.getTileEntity( - xCoord + forgeDirection.offsetX, - yCoord + forgeDirection.offsetY, - zCoord + forgeDirection.offsetZ); - if (tileEntity != null && tileEntity instanceof IGridHost) { - IGridNode gridNode = ((IGridHost) tileEntity).getGridNode(forgeDirection.getOpposite()); - if (gridNode != null) gridNode.updateState(); - } - } - } - - BlockTracker.INSTANCE.startTracking(remotePosition, this); - tracking = true; + if (AEUpdateCooldown-- <= 0 || justDestroyed) { + justDestroyed = false; + AEUpdateCooldown = 20; + updateAEConnection(); } - if (!trackingRedstone) { RedstoneTracker.register(this); trackingRedstone = true; @@ -279,14 +249,7 @@ && getEnergyStored(forgeDirection.getOpposite()) > 0) { @Override public void onChunkUnload() { IC2Helper.unloadEnergyTile(this); - - if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) { - if (aeGridNode != null) { - aeGridNode.destroy(); - aeGridNode.updateState(); - } - } - + if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) disconnectAE(); RedstoneTracker.unregister(this); BlockTracker.INSTANCE.stopTracking(remotePosition); } @@ -294,14 +257,7 @@ public void onChunkUnload() { @Override public void invalidate() { IC2Helper.unloadEnergyTile(this); - - if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) { - if (aeGridNode != null) { - aeGridNode.destroy(); - aeGridNode.updateState(); - } - } - + if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) disconnectAE(); RedstoneTracker.unregister(this); BlockTracker.INSTANCE.stopTracking(remotePosition); super.invalidate(); @@ -390,46 +346,17 @@ public void sendVisualState(VisualState visualState) { */ public void setRemotePosition(DimensionalCoords coords) { IC2Helper.unloadEnergyTile(this); - - if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) { - if (aeGridNode != null) { - aeGridNode.destroy(); - aeGridNode.updateState(); - } - } - RedstoneTracker.unregister(this); BlockTracker.INSTANCE.stopTracking(remotePosition); remotePosition = coords; RedstoneTracker.register(this); BlockTracker.INSTANCE.startTracking(remotePosition, this); - IC2Helper.loadEnergyTile(this); - + worldObj.notifyBlockOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType()); if (Loader.isModLoaded(DependencyInfo.ModIds.AE2)) { - if (remotePosition != null && remotePosition.getTileEntity() != this - && hasTransferChip(TransferType.NETWORK_AE)) { - if (remotePosition.getTileEntity() instanceof IGridHost) { - aeGridNode = new LinkedGridNode( - ((IGridHost) remotePosition.getTileEntity()).getGridNode(ForgeDirection.UNKNOWN), - this); - aeGridNode.updateState(); - } - } - - for (ForgeDirection forgeDirection : ForgeDirection.VALID_DIRECTIONS) { - TileEntity tileEntity = worldObj.getTileEntity( - xCoord + forgeDirection.offsetX, - yCoord + forgeDirection.offsetY, - zCoord + forgeDirection.offsetZ); - if (tileEntity != null && tileEntity instanceof IGridHost) { - IGridNode gridNode = ((IGridHost) tileEntity).getGridNode(forgeDirection.getOpposite()); - if (gridNode != null) gridNode.updateState(); - } - } + disconnectAE(); + connectAE(); } - - worldObj.notifyBlockOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType()); markForUpdate(); } @@ -1036,100 +963,105 @@ public ItemStack getWrenchDrop(EntityPlayer entityPlayer) { return null; } - /* IGRIDHOST */ - @Override @Optional.Method(modid = DependencyInfo.ModIds.AE2) public IGridNode getGridNode(ForgeDirection dir) { + IGridHost gridNode = (IGridHost) getTransferImplementation(IGridHost.class); return gridNode != null ? gridNode.getGridNode(getAdjustedSide(dir)) : null; } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public AECableType getCableConnectionType(ForgeDirection dir) { - return AECableType.GLASS; - } + private boolean connected; - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public void securityBreak() { - worldObj.setBlockToAir(xCoord, yCoord, zCoord); + public void updateAEConnection() { + if (!Loader.isModLoaded(DependencyInfo.ModIds.AE2)) return; + if (hasTransferChip(TransferType.NETWORK_AE)) { + // if (!connected) + connectAE(); + } else { + if (connected) disconnectAE(); + } } - /* IGRIDBLOCK */ - @Override @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public double getIdlePowerUsage() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - return gridBlock != null ? gridBlock.getIdlePowerUsage() : 0; - } + public void disconnectAE() { + connected = false; + for (ForgeDirection forgeDirection : ForgeDirection.VALID_DIRECTIONS) { + TileEntity tileEntity = getWorldObj().getTileEntity( + xCoord + forgeDirection.offsetX, + yCoord + forgeDirection.offsetY, + zCoord + forgeDirection.offsetZ); + if (tileEntity != null && tileEntity instanceof IGridHost) { + IGridNode gridNode = ((IGridHost) tileEntity).getGridNode(forgeDirection.getOpposite()); + if (gridNode != null) { + ArrayList toDestroy = new ArrayList<>(); + for (IGridConnection connect : gridNode.getConnections()) { + if (connect instanceof RIOGridConnection + && connect.getDirection(gridNode) == forgeDirection.getOpposite()) { + toDestroy.add(connect); + } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public EnumSet getFlags() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - return gridBlock != null ? gridBlock.getFlags() : EnumSet.noneOf(GridFlags.class); + } ; + toDestroy.forEach(connect -> connect.destroy()); + } + } + } } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public boolean isWorldAccessible() { - return true; - } + private EnumMap connections = new EnumMap<>(ForgeDirection.class); - @Override @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public DimensionalCoord getLocation() { - return new DimensionalCoord(this); - } + public void connectAE() { + connected = true; + connections.entrySet().removeIf(e -> e.getValue().isDestroyed()); + for (ForgeDirection forgeDirection : ForgeDirection.VALID_DIRECTIONS) { + if (connections.containsKey(forgeDirection)) { + continue; + } + TileEntity tileEntity = getWorldObj().getTileEntity( + xCoord + forgeDirection.offsetX, + yCoord + forgeDirection.offsetY, + zCoord + forgeDirection.offsetZ); + if (tileEntity != null && tileEntity instanceof IGridHost) { + IGridNode gridNode = ((IGridHost) tileEntity).getGridNode(forgeDirection.getOpposite()); + if (gridNode != null) { + try { + if (getGridNode(forgeDirection) != null) connections.put( + forgeDirection, + new RIOGridConnection( + gridNode, + getGridNode(forgeDirection), + forgeDirection.getOpposite())); + } catch (FailedConnection e) { + // already connected or permission denied + } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public AEColor getGridColor() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - return gridBlock != null ? gridBlock.getGridColor() : AEColor.Transparent; - } + } + } + } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public void onGridNotification(GridNotification notification) { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - if (gridBlock != null) gridBlock.onGridNotification(notification); } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public void setNetworkStatus(IGrid grid, int channelsInUse) { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - if (gridBlock != null) gridBlock.setNetworkStatus(grid, channelsInUse); - } + private boolean justDestroyed; - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public EnumSet getConnectableSides() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - return gridBlock != null ? gridBlock.getConnectableSides() : EnumSet.noneOf(ForgeDirection.class); - } + public class RIOGridConnection extends GridConnection { - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public IGridHost getMachine() { - return this; - } + public RIOGridConnection(IGridNode aNode, IGridNode bNode, ForgeDirection fromAtoB) throws FailedConnection { + super(aNode, bNode, fromAtoB); - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public void gridChanged() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - if (gridBlock != null) gridBlock.gridChanged(); - } + } - @Override - @Optional.Method(modid = DependencyInfo.ModIds.AE2) - public ItemStack getMachineRepresentation() { - IGridBlock gridBlock = (IGridBlock) getTransferImplementation(IGridBlock.class); - return gridBlock != null ? gridBlock.getMachineRepresentation() : new ItemStack(this.blockType); - } + private boolean destroyed; + + @Override + public void destroy() { + destroyed = true; + justDestroyed = true; + super.destroy(); + } + public boolean isDestroyed() { + return destroyed; + } + } /* END IMPLEMENTATIONS */ }