diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockInputter.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockInputter.java index a5f4f6891..ae4fb49ad 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockInputter.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockInputter.java @@ -90,16 +90,6 @@ public class BlockInputter extends BlockContainerBase{ return EnumRarity.EPIC; } - @Override - public void neighborsChangedCustom(World world, BlockPos pos){ - super.neighborsChangedCustom(world, pos); - - TileEntity tile = world.getTileEntity(pos); - if(tile instanceof TileEntityInputter){ - ((TileEntityInputter)tile).initVars(); - } - } - public static class TheItemBlock extends ItemBlockBase{ private long lastSysTime; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockItemViewer.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockItemViewer.java index 826d8f437..1fec33a8d 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockItemViewer.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockItemViewer.java @@ -30,17 +30,6 @@ public class BlockItemViewer extends BlockContainerBase{ this.setSoundType(SoundType.STONE); } - - @Override - public void neighborsChangedCustom(World world, BlockPos pos){ - super.neighborsChangedCustom(world, pos); - - TileEntity tile = world.getTileEntity(pos); - if(tile instanceof TileEntityItemViewer){ - ((TileEntityItemViewer)tile).saveConnectedRelay(); - } - } - @Override public TileEntity createNewTileEntity(World worldIn, int meta){ return new TileEntityItemViewer(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockLaserRelay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockLaserRelay.java index 1929be83c..7e7f632ad 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockLaserRelay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/BlockLaserRelay.java @@ -112,16 +112,6 @@ public class BlockLaserRelay extends BlockContainerBase{ return false; } - @Override - public void neighborsChangedCustom(World world, BlockPos pos){ - super.neighborsChangedCustom(world, pos); - - TileEntity tile = world.getTileEntity(pos); - if(tile instanceof TileEntityLaserRelay){ - ((TileEntityLaserRelay)tile).saveAllHandlersAround(); - } - } - @Override public TileEntity createNewTileEntity(World world, int i){ switch(this.type){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/base/BlockContainerBase.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/base/BlockContainerBase.java index 178a7d463..9a23558fb 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/base/BlockContainerBase.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/base/BlockContainerBase.java @@ -13,6 +13,7 @@ package de.ellpeck.actuallyadditions.mod.blocks.base; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; import de.ellpeck.actuallyadditions.mod.tile.TileEntityBase; import de.ellpeck.actuallyadditions.mod.tile.TileEntityInventoryBase; +import de.ellpeck.actuallyadditions.mod.tile.TileEntityLaserRelay; import de.ellpeck.actuallyadditions.mod.util.ItemUtil; import de.ellpeck.actuallyadditions.mod.util.Util; import net.minecraft.block.Block; @@ -156,6 +157,14 @@ public abstract class BlockContainerBase extends BlockContainer implements ItemB public void neighborsChangedCustom(World world, BlockPos pos){ this.updateRedstoneState(world, pos); + + TileEntity tile = world.getTileEntity(pos); + if(tile instanceof TileEntityBase){ + TileEntityBase base = (TileEntityBase)tile; + if(base.shouldSaveHandlersAround()){ + base.saveAllHandlersAround(); + } + } } @Override diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityBase.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityBase.java index 96824aca0..3adf69fb0 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityBase.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityBase.java @@ -42,6 +42,9 @@ public abstract class TileEntityBase extends TileEntity implements ITickable{ public boolean isPulseMode; protected int ticksElapsed; + protected TileEntity[] tilesAround = new TileEntity[6]; + protected boolean hasCheckedHandlersAround; + public TileEntityBase(String name){ this.name = name; } @@ -236,8 +239,12 @@ public abstract class TileEntityBase extends TileEntity implements ITickable{ if(amount <= 0){ amount = total; } + for(EnumFacing side : sides){ - WorldUtil.doEnergyInteraction(this, side, amount); + TileEntity tile = this.tilesAround[side.ordinal()]; + if(tile != null){ + WorldUtil.doEnergyInteraction(this, tile, side, amount); + } } } } @@ -254,15 +261,37 @@ public abstract class TileEntityBase extends TileEntity implements ITickable{ if(amount <= 0){ amount = total; } + for(EnumFacing side : sides){ - WorldUtil.doFluidInteraction(this, side, amount); + TileEntity tile = this.tilesAround[side.ordinal()]; + if(tile != null){ + WorldUtil.doFluidInteraction(this, tile, side, amount); + } } } } } + + if(!this.hasCheckedHandlersAround){ + if(this.shouldSaveHandlersAround()){ + this.saveAllHandlersAround(); + } + + this.hasCheckedHandlersAround = true; + } } } + public void saveAllHandlersAround(){ + for(EnumFacing side : EnumFacing.values()){ + this.tilesAround[side.ordinal()] = this.worldObj.getTileEntity(this.pos.offset(side)); + } + } + + public boolean shouldSaveHandlersAround(){ + return this instanceof ISharingEnergyProvider || this instanceof ISharingFluidHandler; + } + public void setRedstonePowered(boolean powered){ this.isRedstonePowered = powered; this.markDirty(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityInputter.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityInputter.java index ee5ec8612..0f4313a6c 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityInputter.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityInputter.java @@ -48,8 +48,6 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt public FilterSettings leftFilter = new FilterSettings(PULL_FILTER_START, PULL_FILTER_START+12, true, true, false, 0, -1000); public FilterSettings rightFilter = new FilterSettings(PUT_FILTER_START, PUT_FILTER_START+12, true, true, false, 0, -2000); - private boolean hasCheckedTilesAround; - public TileEntityInputter(int slots, String name){ super(slots, name); } @@ -313,10 +311,16 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt return !this.isAdvanced || (output ? this.rightFilter : this.leftFilter).check(stack, this.slots); } + @Override + public boolean shouldSaveHandlersAround(){ + return true; + } + /** * Sets all of the relevant variables */ - public void initVars(){ + @Override + public void saveAllHandlersAround(){ if(this.sideToPull != -1){ EnumFacing side = WorldUtil.getDirectionBySidesInOrder(this.sideToPull); this.placeToPull = this.worldObj.getTileEntity(this.pos.offset(side)); @@ -399,7 +403,7 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt } this.markDirty(); - this.initVars(); + this.saveAllHandlersAround(); } @Override @@ -438,10 +442,6 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt public void updateEntity(){ super.updateEntity(); if(!this.worldObj.isRemote){ - if(!this.hasCheckedTilesAround){ - this.initVars(); - this.hasCheckedTilesAround = true; - } //Is Block not powered by Redstone? if(!this.isRedstonePowered){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityItemViewer.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityItemViewer.java index ebf56a478..ebce0c0f3 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityItemViewer.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityItemViewer.java @@ -26,7 +26,6 @@ import java.util.List; public class TileEntityItemViewer extends TileEntityInventoryBase{ public TileEntityLaserRelayItem connectedRelay; - private boolean hasCheckedRelayOnLoad; public TileEntityItemViewer(){ super(0, "itemViewer"); @@ -35,11 +34,6 @@ public class TileEntityItemViewer extends TileEntityInventoryBase{ @Override public void updateEntity(){ super.updateEntity(); - - if(!this.worldObj.isRemote && !this.hasCheckedRelayOnLoad){ - this.saveConnectedRelay(); - this.hasCheckedRelayOnLoad = true; - } } private List getItemHandlerInfos(){ @@ -75,7 +69,13 @@ public class TileEntityItemViewer extends TileEntityInventoryBase{ return null; } - public void saveConnectedRelay(){ + @Override + public boolean shouldSaveHandlersAround(){ + return true; + } + + @Override + public void saveAllHandlersAround(){ TileEntityLaserRelayItem tileFound = null; if(this.worldObj != null){ //Why is that even possible..? for(int i = 0; i <= 5; i++){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java index 1cbe52e90..b681e653a 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java @@ -42,8 +42,6 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{ private Set tempConnectionStorage; - private boolean hasCheckedHandlersAround; - public TileEntityLaserRelay(String name, LaserType type){ super(name); this.type = type; @@ -90,14 +88,6 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{ if(this.worldObj.isRemote){ this.renderParticles(); } - else if(!this.hasCheckedHandlersAround){ - this.saveAllHandlersAround(); - this.hasCheckedHandlersAround = true; - } - } - - public void saveAllHandlersAround(){ - } @SideOnly(Side.CLIENT) diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayEnergy.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayEnergy.java index 27973f05d..49459b737 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayEnergy.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayEnergy.java @@ -74,6 +74,11 @@ public class TileEntityLaserRelayEnergy extends TileEntityLaserRelay implements return true; } + @Override + public boolean shouldSaveHandlersAround(){ + return true; + } + @Override public void saveAllHandlersAround(){ this.receiversAround.clear(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayFluids.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayFluids.java index 4cf598ada..28d3cffbe 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayFluids.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayFluids.java @@ -39,6 +39,11 @@ public class TileEntityLaserRelayFluids extends TileEntityLaserRelay implements super("laserRelayFluids", LaserType.FLUID); } + @Override + public boolean shouldSaveHandlersAround(){ + return true; + } + @Override public void saveAllHandlersAround(){ this.receiversAround.clear(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayItem.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayItem.java index 741932481..4a41ffd2d 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayItem.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelayItem.java @@ -43,6 +43,11 @@ public class TileEntityLaserRelayItem extends TileEntityLaserRelay{ return true; } + @Override + public boolean shouldSaveHandlersAround(){ + return true; + } + @Override public void saveAllHandlersAround(){ this.handlersAround.clear(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/WorldUtil.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/WorldUtil.java index 8655377c1..b808244f9 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/util/WorldUtil.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/WorldUtil.java @@ -88,55 +88,49 @@ public final class WorldUtil{ return null; } - public static void doEnergyInteraction(TileEntity tileFrom, EnumFacing sideTo, int maxTransfer){ + public static void doEnergyInteraction(TileEntity tileFrom, TileEntity tileTo, EnumFacing sideTo, int maxTransfer){ if(maxTransfer > 0){ - TileEntity tileTo = tileFrom.getWorld().getTileEntity(tileFrom.getPos().offset(sideTo)); - if(tileTo != null){ - if(tileFrom instanceof IEnergyProvider && tileTo instanceof IEnergyReceiver){ - IEnergyReceiver handlerTo = (IEnergyReceiver)tileTo; - IEnergyProvider handlerFrom = (IEnergyProvider)tileFrom; + if(tileFrom instanceof IEnergyProvider && tileTo instanceof IEnergyReceiver){ + IEnergyReceiver handlerTo = (IEnergyReceiver)tileTo; + IEnergyProvider handlerFrom = (IEnergyProvider)tileFrom; - int drain = handlerFrom.extractEnergy(sideTo, maxTransfer, true); - if(drain > 0){ - if(handlerTo.canConnectEnergy(sideTo.getOpposite())){ - int filled = handlerTo.receiveEnergy(sideTo.getOpposite(), drain, false); - handlerFrom.extractEnergy(sideTo, filled, false); - } + int drain = handlerFrom.extractEnergy(sideTo, maxTransfer, true); + if(drain > 0){ + if(handlerTo.canConnectEnergy(sideTo.getOpposite())){ + int filled = handlerTo.receiveEnergy(sideTo.getOpposite(), drain, false); + handlerFrom.extractEnergy(sideTo, filled, false); } } - else if(ActuallyAdditions.teslaLoaded){ - TeslaUtil.doWrappedTeslaRFInteraction(tileFrom, tileTo, sideTo, maxTransfer); - } + } + else if(ActuallyAdditions.teslaLoaded){ + TeslaUtil.doWrappedTeslaRFInteraction(tileFrom, tileTo, sideTo, maxTransfer); } } } - public static void doFluidInteraction(TileEntity tileFrom, EnumFacing sideTo, int maxTransfer){ + public static void doFluidInteraction(TileEntity tileFrom, TileEntity tileTo, EnumFacing sideTo, int maxTransfer){ if(maxTransfer > 0){ - TileEntity tileTo = tileFrom.getWorld().getTileEntity(tileFrom.getPos().offset(sideTo)); - if(tileTo != null){ - //Push and pull with old fluid system - if(tileFrom instanceof net.minecraftforge.fluids.IFluidHandler && tileTo instanceof net.minecraftforge.fluids.IFluidHandler){ - net.minecraftforge.fluids.IFluidHandler handlerTo = (net.minecraftforge.fluids.IFluidHandler)tileTo; - net.minecraftforge.fluids.IFluidHandler handlerFrom = (net.minecraftforge.fluids.IFluidHandler)tileFrom; - FluidStack drain = handlerFrom.drain(sideTo, maxTransfer, false); - if(drain != null){ - if(handlerTo.canFill(sideTo.getOpposite(), drain.getFluid())){ - int filled = handlerTo.fill(sideTo.getOpposite(), drain.copy(), true); - handlerFrom.drain(sideTo, filled, true); - } + //Push and pull with old fluid system + if(tileFrom instanceof net.minecraftforge.fluids.IFluidHandler && tileTo instanceof net.minecraftforge.fluids.IFluidHandler){ + net.minecraftforge.fluids.IFluidHandler handlerTo = (net.minecraftforge.fluids.IFluidHandler)tileTo; + net.minecraftforge.fluids.IFluidHandler handlerFrom = (net.minecraftforge.fluids.IFluidHandler)tileFrom; + FluidStack drain = handlerFrom.drain(sideTo, maxTransfer, false); + if(drain != null){ + if(handlerTo.canFill(sideTo.getOpposite(), drain.getFluid())){ + int filled = handlerTo.fill(sideTo.getOpposite(), drain.copy(), true); + handlerFrom.drain(sideTo, filled, true); } } - //Push and pull with new fluid system - else{ - if(tileFrom.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo) && tileTo.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo.getOpposite())){ - IFluidHandler handlerFrom = tileFrom.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo); - IFluidHandler handlerTo = tileTo.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo.getOpposite()); - FluidStack drain = handlerFrom.drain(maxTransfer, false); - if(drain != null){ - int filled = handlerTo.fill(drain.copy(), true); - handlerFrom.drain(filled, true); - } + } + //Push and pull with new fluid system + else{ + if(tileFrom.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo) && tileTo.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo.getOpposite())){ + IFluidHandler handlerFrom = tileFrom.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo); + IFluidHandler handlerTo = tileTo.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, sideTo.getOpposite()); + FluidStack drain = handlerFrom.drain(maxTransfer, false); + if(drain != null){ + int filled = handlerTo.fill(drain.copy(), true); + handlerFrom.drain(filled, true); } } }