From fbb07f82fa9b845102bc04541fed27a3099247b5 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 13 May 2016 21:32:40 +0200 Subject: [PATCH] Very unstable improved machine searching --- .../java/refinedstorage/block/BlockBase.java | 17 ++ .../refinedstorage/block/BlockController.java | 16 -- .../refinedstorage/block/BlockMachine.java | 39 ++++ .../MessageWirelessGridCraftingStart.java | 2 +- .../MessageWirelessGridStoragePull.java | 2 +- .../MessageWirelessGridStoragePush.java | 2 +- .../tile/ControllerSearcher.java | 40 ++++ .../refinedstorage/tile/MachineSearcher.java | 46 ----- .../refinedstorage/tile/TileController.java | 183 ++++++++---------- .../java/refinedstorage/tile/TileMachine.java | 73 +++---- 10 files changed, 216 insertions(+), 204 deletions(-) create mode 100755 src/main/java/refinedstorage/tile/ControllerSearcher.java delete mode 100755 src/main/java/refinedstorage/tile/MachineSearcher.java diff --git a/src/main/java/refinedstorage/block/BlockBase.java b/src/main/java/refinedstorage/block/BlockBase.java index e6daef7a7..797b4e16f 100755 --- a/src/main/java/refinedstorage/block/BlockBase.java +++ b/src/main/java/refinedstorage/block/BlockBase.java @@ -8,6 +8,7 @@ import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -132,6 +133,22 @@ public abstract class BlockBase extends Block { super.breakBlock(world, pos, state); } + @Override + public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + if (willHarvest) { + return true; + } + + return super.removedByPlayer(state, world, pos, player, willHarvest); + } + + @Override + public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity tile, ItemStack stack) { + super.harvestBlock(world, player, pos, state, tile, stack); + + world.setBlockToAir(pos); + } + public Item createItemForBlock() { return new ItemBlockBase(this, false); } diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index 504a8c3b9..364eca758 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -93,22 +93,6 @@ public class BlockController extends BlockBase { super.breakBlock(world, pos, state); } - @Override - public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { - if (willHarvest) { - return true; - } - - return super.removedByPlayer(state, world, pos, player, willHarvest); - } - - @Override - public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity tile, ItemStack stack) { - super.harvestBlock(world, player, pos, state, tile, stack); - - world.setBlockToAir(pos); - } - @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { super.onBlockPlacedBy(world, pos, state, player, itemStack); diff --git a/src/main/java/refinedstorage/block/BlockMachine.java b/src/main/java/refinedstorage/block/BlockMachine.java index f621a9df9..c636d1367 100755 --- a/src/main/java/refinedstorage/block/BlockMachine.java +++ b/src/main/java/refinedstorage/block/BlockMachine.java @@ -1,11 +1,15 @@ package refinedstorage.block; +import net.minecraft.block.Block; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; import refinedstorage.tile.TileMachine; public abstract class BlockMachine extends BlockBase { @@ -33,4 +37,39 @@ public abstract class BlockMachine extends BlockBase { return super.getActualState(state, world, pos) .withProperty(CONNECTED, ((TileMachine) world.getTileEntity(pos)).isConnected()); } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) { + super.breakBlock(world, pos, state); + + if (!world.isRemote) { + TileMachine machine = (TileMachine) world.getTileEntity(pos); + + if (machine.isConnected()) { + machine.onDisconnected(); + } + } + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, pos, state, player, stack); + + if (!world.isRemote) { + ((TileMachine) world.getTileEntity(pos)).searchController(); + } + } + + @Override + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block neighborBlock) { + super.onNeighborBlockChange(world, pos, state, neighborBlock); + + if (!world.isRemote) { + TileMachine machine = (TileMachine) world.getTileEntity(pos); + + if (!machine.isConnected()) { + machine.searchController(); + } + } + } } diff --git a/src/main/java/refinedstorage/network/MessageWirelessGridCraftingStart.java b/src/main/java/refinedstorage/network/MessageWirelessGridCraftingStart.java index 49c44959b..da8dff55c 100755 --- a/src/main/java/refinedstorage/network/MessageWirelessGridCraftingStart.java +++ b/src/main/java/refinedstorage/network/MessageWirelessGridCraftingStart.java @@ -47,7 +47,7 @@ public class MessageWirelessGridCraftingStart extends MessageHandlerPlayerToServ public void handle(MessageWirelessGridCraftingStart message, EntityPlayerMP player) { TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ)); - if (tile instanceof TileController && ((TileController) tile).isActive()) { + if (tile instanceof TileController && ((TileController) tile).canRun()) { ((TileController) tile).onCraftingRequested(message.id, message.quantity); } } diff --git a/src/main/java/refinedstorage/network/MessageWirelessGridStoragePull.java b/src/main/java/refinedstorage/network/MessageWirelessGridStoragePull.java index 83f443bbd..5d3c62e2b 100755 --- a/src/main/java/refinedstorage/network/MessageWirelessGridStoragePull.java +++ b/src/main/java/refinedstorage/network/MessageWirelessGridStoragePull.java @@ -47,7 +47,7 @@ public class MessageWirelessGridStoragePull extends MessageHandlerPlayerToServer public void handle(MessageWirelessGridStoragePull message, EntityPlayerMP player) { TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ)); - if (tile instanceof TileController && ((TileController) tile).isActive()) { + if (tile instanceof TileController && ((TileController) tile).canRun()) { ((TileController) tile).handleStoragePull(message.id, message.flags, player); } } diff --git a/src/main/java/refinedstorage/network/MessageWirelessGridStoragePush.java b/src/main/java/refinedstorage/network/MessageWirelessGridStoragePush.java index 59b4212d7..40502c63b 100755 --- a/src/main/java/refinedstorage/network/MessageWirelessGridStoragePush.java +++ b/src/main/java/refinedstorage/network/MessageWirelessGridStoragePush.java @@ -47,7 +47,7 @@ public class MessageWirelessGridStoragePush extends MessageHandlerPlayerToServer public void handle(MessageWirelessGridStoragePush message, EntityPlayerMP player) { TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ)); - if (tile instanceof TileController && ((TileController) tile).isActive()) { + if (tile instanceof TileController && ((TileController) tile).canRun()) { ((TileController) tile).handleStoragePush(message.playerSlot, message.one, player); } } diff --git a/src/main/java/refinedstorage/tile/ControllerSearcher.java b/src/main/java/refinedstorage/tile/ControllerSearcher.java new file mode 100755 index 000000000..b68133635 --- /dev/null +++ b/src/main/java/refinedstorage/tile/ControllerSearcher.java @@ -0,0 +1,40 @@ +package refinedstorage.tile; + +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import refinedstorage.RefinedStorageBlocks; + +import java.util.Set; + +public class ControllerSearcher { + public static TileController search(World world, BlockPos current, Set visited) { + if (visited.contains(current.getX() + "," + current.getY() + "," + current.getZ())) { + return null; + } + + visited.add(current.getX() + "," + current.getY() + "," + current.getZ()); + + TileEntity tile = world.getTileEntity(current); + + if (tile instanceof TileController) { + return (TileController) tile; + } + + Block block = world.getBlockState(current).getBlock(); + + if (tile instanceof TileMachine || block == RefinedStorageBlocks.CABLE) { + for (EnumFacing dir : EnumFacing.VALUES) { + TileController controller = search(world, current.offset(dir), visited); + + if (controller != null) { + return controller; + } + } + } + + return null; + } +} diff --git a/src/main/java/refinedstorage/tile/MachineSearcher.java b/src/main/java/refinedstorage/tile/MachineSearcher.java deleted file mode 100755 index 96caf2adf..000000000 --- a/src/main/java/refinedstorage/tile/MachineSearcher.java +++ /dev/null @@ -1,46 +0,0 @@ -package refinedstorage.tile; - -import net.minecraft.block.Block; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import refinedstorage.RefinedStorageBlocks; - -import java.util.List; -import java.util.Set; - -public class MachineSearcher { - public static void search(TileController controller, BlockPos current, Set visited, List machines) { - if (visited.contains(current.getX() + "," + current.getY() + "," + current.getZ()) || controller.getPos().equals(current)) { - return; - } - - visited.add(current.getX() + "," + current.getY() + "," + current.getZ()); - - Block block = controller.getWorld().getBlockState(current).getBlock(); - TileEntity tile = controller.getWorld().getTileEntity(current); - - if (tile instanceof TileController) { - if (!tile.getPos().equals(controller.getPos())) { - controller.getWorld().createExplosion(null, tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ(), 4.5f, true); - } - } - - if (tile instanceof TileMachine) { - TileMachine machine = (TileMachine) tile; - - if (machine.getRedstoneMode().isEnabled(controller.getWorld(), tile.getPos())) { - machines.add(machine); - } else if (machine instanceof TileRelay) { - // If the relay is disabled we can't search any further - return; - } - } - - if (tile instanceof TileMachine || block == RefinedStorageBlocks.CABLE) { - for (EnumFacing dir : EnumFacing.VALUES) { - search(controller, current.offset(dir), visited, machines); - } - } - } -} diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index ee58a04b8..aaf4bf4bf 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -10,7 +10,6 @@ import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; @@ -54,11 +53,14 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor private List itemGroups = new ArrayList(); private List storages = new ArrayList(); private List wirelessGridConsumers = new ArrayList(); - private List wirelessGridConsumersMarkedForRemoval = new ArrayList(); + private List wirelessGridConsumersToRemove = new ArrayList(); private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private List machines = new ArrayList(); + private List machinesToAdd = new ArrayList(); + private List machinesToRemove = new ArrayList(); + private List clientSideMachines = new ArrayList(); private List patterns = new ArrayList(); @@ -66,120 +68,95 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor private List craftingTasksToAdd = new ArrayList(); private List craftingTasksToCancel = new ArrayList(); - private Set visited = new HashSet(); - private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY); private int energyUsage; private int wirelessGridRange; - private boolean destroyed = false; - private long lastEnergyRender; - private boolean machinesHavePosition(List machines, BlockPos pos) { - for (TileEntity machine : machines) { - if (machine.getPos().getX() == pos.getX() && machine.getPos().getY() == pos.getY() && machine.getPos().getZ() == pos.getZ()) { - return true; - } - } + public void addMachine(TileMachine machine) { + machinesToAdd.add(machine); + } - return false; + public void removeMachine(TileMachine machine) { + machinesToRemove.add(machine); } @Override public void update() { super.update(); - if (!worldObj.isRemote && !destroyed) { + if (!worldObj.isRemote) { + if (!canRun()) { + disconnectAll(); + } + + machines.addAll(machinesToAdd); + machinesToAdd.clear(); + + machines.removeAll(machinesToRemove); + machinesToRemove.clear(); + int lastEnergy = energy.getEnergyStored(); - if (ticks % 20 == 0) { - if (!isActive()) { - disconnectAll(); - } else { - visited.clear(); + int newWirelessGridRange = 0; + int newEnergyUsage = 10; + List newStorages = new ArrayList(); + List newPatterns = new ArrayList(); - List newMachines = new ArrayList(); + for (TileMachine machine : machines) { + machine.updateMachine(); - for (EnumFacing dir : EnumFacing.VALUES) { - MachineSearcher.search(this, pos.offset(dir), visited, newMachines); - } - - for (TileMachine machine : machines) { - if (!machinesHavePosition(newMachines, machine.getPos())) { - machine.onDisconnected(); - } - } - - int newWirelessGridRange = 0; - int newEnergyUsage = 0; - List newStorages = new ArrayList(); - List newPatterns = new ArrayList(); - - for (TileMachine machine : newMachines) { - if (machine instanceof TileWirelessTransmitter) { - newWirelessGridRange += ((TileWirelessTransmitter) machine).getRange(); - } - - if (machine instanceof IStorageProvider) { - ((IStorageProvider) machine).provide(newStorages); - } - - if (machine instanceof TileCrafter) { - TileCrafter crafter = (TileCrafter) machine; - - for (int i = 0; i < TileCrafter.PATTERN_SLOTS; ++i) { - if (crafter.getStackInSlot(i) != null) { - ItemStack pattern = crafter.getStackInSlot(i); - - newPatterns.add(new CraftingPattern( - crafter.getPos().getX(), - crafter.getPos().getY(), - crafter.getPos().getZ(), - ItemPattern.isProcessing(pattern), - ItemPattern.getInputs(pattern), - ItemPattern.getOutputs(pattern))); - } - } - } - - newEnergyUsage += machine.getEnergyUsage(); - - if (!machinesHavePosition(machines, machine.getPos())) { - machine.onConnected(this); - } else { - /* This machine is in our machine list, but due to a chunk reload the tile entity - would get reset which causes its connected property to reset too (to false). - So, if the machine is in our list but not connected (which is the case due to a TE reload) - we connect it either way. */ - if (!machine.isConnected()) { - machine.onConnected(this); - } - } - } - - wirelessGridRange = newWirelessGridRange; - energyUsage = newEnergyUsage; - machines = newMachines; - storages = newStorages; - patterns = newPatterns; - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage s1, IStorage s2) { - if (s1.getPriority() == s2.getPriority()) { - return 0; - } - - return (s1.getPriority() > s2.getPriority()) ? -1 : 1; - } - }); - - syncItems(); + if (machine instanceof TileWirelessTransmitter) { + newWirelessGridRange += ((TileWirelessTransmitter) machine).getRange(); } + + if (machine instanceof IStorageProvider) { + ((IStorageProvider) machine).provide(newStorages); + } + + if (machine instanceof TileCrafter) { + TileCrafter crafter = (TileCrafter) machine; + + for (int i = 0; i < TileCrafter.PATTERN_SLOTS; ++i) { + if (crafter.getStackInSlot(i) == null) { + continue; + } + + ItemStack pattern = crafter.getStackInSlot(i); + + newPatterns.add(new CraftingPattern( + crafter.getPos().getX(), + crafter.getPos().getY(), + crafter.getPos().getZ(), + ItemPattern.isProcessing(pattern), + ItemPattern.getInputs(pattern), + ItemPattern.getOutputs(pattern))); + } + } + + newEnergyUsage += machine.getEnergyUsage(); } + wirelessGridRange = newWirelessGridRange; + energyUsage = newEnergyUsage; + storages = newStorages; + patterns = newPatterns; + + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage s1, IStorage s2) { + if (s1.getPriority() == s2.getPriority()) { + return 0; + } + + return (s1.getPriority() > s2.getPriority()) ? -1 : 1; + } + }); + + syncItems(); + for (ICraftingTask taskToCancel : craftingTasksToCancel) { taskToCancel.onCancelled(this); } @@ -202,7 +179,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor } } - if (isActive()) { + if (canRun()) { switch (getType()) { case NORMAL: energy.extractEnergy(energyUsage, false); @@ -213,8 +190,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor } } - wirelessGridConsumers.removeAll(wirelessGridConsumersMarkedForRemoval); - wirelessGridConsumersMarkedForRemoval.clear(); + wirelessGridConsumers.removeAll(wirelessGridConsumersToRemove); + wirelessGridConsumersToRemove.clear(); Iterator gridConsumerIterator = wirelessGridConsumers.iterator(); @@ -224,7 +201,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor if (!RefinedStorageUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) { consumer.getPlayer().closeScreen(); // This will call onContainerClosed on the Container and remove it from the list } else { - if (isActive()) { + if (canRun()) { RefinedStorage.NETWORK.sendTo(new MessageWirelessGridItems(this), (EntityPlayerMP) consumer.getPlayer()); } } @@ -250,8 +227,6 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor public void onDestroyed() { disconnectAll(); - - destroyed = true; } private void disconnectAll() { @@ -448,7 +423,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor WirelessGridConsumer consumer = getWirelessGridConsumer(player); if (consumer != null) { - wirelessGridConsumersMarkedForRemoval.add(consumer); + wirelessGridConsumersToRemove.add(consumer); } } @@ -555,7 +530,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor return true; } - public boolean isActive() { + public boolean canRun() { return energy.getEnergyStored() >= getEnergyUsage() && redstoneMode.isEnabled(worldObj, pos); } @@ -632,7 +607,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor @Override public void sendContainerData(ByteBuf buf) { - buf.writeInt(isActive() ? energyUsage : 0); + buf.writeInt(canRun() ? energyUsage : 0); buf.writeInt(redstoneMode.id); diff --git a/src/main/java/refinedstorage/tile/TileMachine.java b/src/main/java/refinedstorage/tile/TileMachine.java index 54f29104e..c1ccbb323 100755 --- a/src/main/java/refinedstorage/tile/TileMachine.java +++ b/src/main/java/refinedstorage/tile/TileMachine.java @@ -1,62 +1,65 @@ package refinedstorage.tile; import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import refinedstorage.block.BlockMachine; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; +import java.util.HashSet; +import java.util.Set; + public abstract class TileMachine extends TileBase implements INetworkTile, IRedstoneModeConfig { protected boolean connected = false; protected RedstoneMode redstoneMode = RedstoneMode.IGNORE; protected TileController controller; - private Block machineBlock; - - public void onConnected(TileController controller) { - if (worldObj != null && worldObj.getBlockState(pos).getBlock() == machineBlock) { - markDirty(); - - this.connected = true; - this.controller = controller; - - worldObj.setBlockState(pos, worldObj.getBlockState(pos).withProperty(BlockMachine.CONNECTED, true)); - } - } - - public void onDisconnected() { - if (worldObj != null && worldObj.getBlockState(pos).getBlock() == machineBlock) { - markDirty(); - - this.connected = false; - this.controller = null; - - worldObj.setBlockState(pos, worldObj.getBlockState(pos).withProperty(BlockMachine.CONNECTED, false)); - } - } + private Set visited = new HashSet(); public TileController getController() { return controller; } + public void searchController() { + visited.clear(); + + TileController newController = ControllerSearcher.search(worldObj, pos, visited); + + if (newController != null) { + this.controller = newController; + + onConnected(); + } else if (this.controller != null) { + this.controller = null; + + onDisconnected(); + } + } + @Override - public void update() { - if (worldObj == null) { - super.update(); - return; - } + public void onLoad() { + super.onLoad(); - if (ticks == 0) { - machineBlock = worldObj.getBlockState(pos).getBlock(); + if (!worldObj.isRemote && !connected) { + searchController(); } + } - super.update(); + public void onConnected() { + connected = true; - if (!worldObj.isRemote && isConnected()) { - updateMachine(); - } + worldObj.setBlockState(pos, worldObj.getBlockState(pos).withProperty(BlockMachine.CONNECTED, true)); + + controller.addMachine(this); + } + + public void onDisconnected() { + connected = false; + + worldObj.setBlockState(pos, worldObj.getBlockState(pos).withProperty(BlockMachine.CONNECTED, false)); + + controller.removeMachine(this); } public boolean isConnected() {