From 89f44ae204a17b49ddb654facb35aafb1c959a1f Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 24 Jun 2016 18:43:08 +0200 Subject: [PATCH] Revert networkmasterregistry changes. --- .../api/network/INetworkMaster.java | 17 +- .../apiimpl/network/NetworkMaster.java | 700 ------------------ .../network/NetworkMasterEventHandler.java | 40 - .../network/NetworkMasterRegistry.java | 50 -- .../network/NetworkMasterSavedData.java | 76 -- .../refinedstorage/block/BlockController.java | 26 +- .../refinedstorage/gui/GuiController.java | 5 +- .../item/ItemBlockController.java | 10 +- .../refinedstorage/item/ItemWirelessGrid.java | 10 +- .../network/MessageGridItems.java | 6 +- .../refinedstorage/proxy/CommonProxy.java | 3 - .../java/refinedstorage/tile/TileSlave.java | 33 +- .../tile/controller/TileController.java | 656 ++++++++++++++-- .../tile/grid/WirelessGrid.java | 24 +- 14 files changed, 661 insertions(+), 995 deletions(-) delete mode 100755 src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java delete mode 100755 src/main/java/refinedstorage/apiimpl/network/NetworkMasterEventHandler.java delete mode 100755 src/main/java/refinedstorage/apiimpl/network/NetworkMasterRegistry.java delete mode 100755 src/main/java/refinedstorage/apiimpl/network/NetworkMasterSavedData.java diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index d69993930..48aae9e7c 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -3,7 +3,6 @@ package refinedstorage.api.network; import cofh.api.energy.EnergyStorage; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.api.autocrafting.ICraftingPattern; @@ -19,14 +18,6 @@ public interface INetworkMaster { */ World getWorld(); - /** - * Initializes this network. - * Starting from this call {@link INetworkMaster#update()} will be called every server tick. - * - * @param world The world this network is in - */ - void setWorld(World world); - /** * @return The energy storage of this network */ @@ -60,12 +51,12 @@ public interface INetworkMaster { /** * @param slave The slave to add */ - void addSlave(BlockPos slave); + void addSlave(INetworkSlave slave); /** * @param slave The slave to remove */ - void removeSlave(BlockPos slave); + void removeSlave(INetworkSlave slave); /** * @return The grid handler for this network @@ -203,8 +194,4 @@ public interface INetworkMaster { */ @Nullable ItemStack getItem(ItemStack stack, int flags); - - NBTTagCompound writeToNBT(NBTTagCompound tag); - - void readFromNBT(NBTTagCompound tag); } diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java b/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java deleted file mode 100755 index 1011143c5..000000000 --- a/src/main/java/refinedstorage/apiimpl/network/NetworkMaster.java +++ /dev/null @@ -1,700 +0,0 @@ -package refinedstorage.apiimpl.network; - -import cofh.api.energy.EnergyStorage; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageBlocks; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.RefinedStorageCapabilities; -import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.network.IGridHandler; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.network.INetworkSlave; -import refinedstorage.api.network.IWirelessGridHandler; -import refinedstorage.api.storage.CompareFlags; -import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; -import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; -import refinedstorage.apiimpl.autocrafting.CraftingPattern; -import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; -import refinedstorage.block.BlockController; -import refinedstorage.block.EnumControllerType; -import refinedstorage.container.ContainerGrid; -import refinedstorage.item.ItemPattern; -import refinedstorage.network.MessageGridItems; -import refinedstorage.tile.TileCable; -import refinedstorage.tile.TileCrafter; -import refinedstorage.tile.TileWirelessTransmitter; -import refinedstorage.tile.config.RedstoneMode; - -import java.util.*; - -public class NetworkMaster implements INetworkMaster { - public static final int ENERGY_CAPACITY = 32000; - - public static final String NBT_CRAFTING_TASKS = "CraftingTasks"; - public static final String NBT_ENERGY = "Energy"; - public static final String NBT_SLAVES = "Slaves"; - public static final String NBT_SLAVE_X = "X"; - public static final String NBT_SLAVE_Y = "Y"; - public static final String NBT_SLAVE_Z = "Z"; - - private GridHandler gridHandler = new GridHandler(this); - private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this); - - private List items = new ArrayList(); - private List combinedItems = new ArrayList(); - private Set combinedItemsIndices = new HashSet(); - - private List storages = new ArrayList(); - - private List slaves = new ArrayList(); - private List actualSlaves = new ArrayList(); - private Map slaveConnectivity = new HashMap(); - private List slavesToAdd = new ArrayList(); - private List slavesToLoad = new ArrayList(); - private List slavesToRemove = new ArrayList(); - - private List patterns = new ArrayList(); - - private Stack craftingTasks = new Stack(); - private List craftingTasksToAddAsLast = new ArrayList(); - private List craftingTasksToAdd = new ArrayList(); - private List craftingTasksToCancel = new ArrayList(); - - private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY); - private int energyUsage; - - private boolean couldRun; - private long lastEnergyUpdate; - - private int ticks; - - private EnumControllerType type; - - private World world; - private BlockPos pos; - - private RedstoneMode redstoneMode = RedstoneMode.IGNORE; - - public NetworkMaster(BlockPos pos, World world) { - this.pos = pos; - - setWorld(world); - } - - public NetworkMaster(BlockPos pos) { - this.pos = pos; - } - - public RedstoneMode getRedstoneMode() { - return redstoneMode; - } - - public void setRedstoneMode(RedstoneMode mode) { - this.redstoneMode = mode; - - markDirty(); - } - - @Override - public EnergyStorage getEnergy() { - return energy; - } - - @Override - public int getEnergyUsage() { - return energyUsage; - } - - @Override - public BlockPos getPosition() { - return pos; - } - - @Override - public World getWorld() { - return world; - } - - @Override - public void setWorld(World world) { - this.world = world; - this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE); - - for (BlockPos slavePos : slavesToLoad) { - INetworkSlave slave = world.getTileEntity(slavePos).getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); - - slave.forceConnect(this); - - if (!(slave instanceof TileCable)) { - slaves.add(slavePos); - } - } - - this.slavesToLoad.clear(); - } - - @Override - public boolean canRun() { - return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(world, pos); - } - - @Override - public void update() { - boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); - - for (BlockPos slave : slavesToAdd) { - if (!slaves.contains(slave)) { - slaves.add(slave); - } - } - - slavesToAdd.clear(); - - slaves.removeAll(slavesToRemove); - slavesToRemove.clear(); - - int lastEnergy = energy.getEnergyStored(); - - if (canRun()) { - if (ticks % 20 == 0 || forceUpdate) { - updateSlaves(); - } - - for (INetworkSlave slave : getSlaves()) { - if (slave.canUpdate()) { - slave.updateSlave(); - } - - boolean active = slave.canUpdate(); - - if (!slaveConnectivity.containsKey(slave.getPosition()) || slaveConnectivity.get(slave.getPosition()) != active) { - slaveConnectivity.put(slave.getPosition(), active); - - if (slave.canSendConnectivityUpdate()) { - RefinedStorageUtils.updateBlock(world, slave.getPosition()); - } - } - } - - for (ICraftingTask taskToCancel : craftingTasksToCancel) { - taskToCancel.onCancelled(this); - } - - craftingTasks.removeAll(craftingTasksToCancel); - craftingTasksToCancel.clear(); - - for (ICraftingTask task : craftingTasksToAdd) { - craftingTasks.push(task); - } - - craftingTasksToAdd.clear(); - - for (ICraftingTask task : craftingTasksToAddAsLast) { - craftingTasks.add(0, task); - } - - craftingTasksToAddAsLast.clear(); - - if (!craftingTasks.empty()) { - ICraftingTask top = craftingTasks.peek(); - - if (ticks % top.getPattern().getContainer(world).getSpeed() == 0 && top.update(this)) { - top.onDone(this); - - craftingTasks.pop(); - } - } - } else if (!slaves.isEmpty()) { - disconnectAll(); - updateSlaves(); - } - - if (couldRun != canRun()) { - couldRun = canRun(); - - world.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER); - } - - wirelessGridHandler.update(); - - if (type == EnumControllerType.NORMAL && energyUsage > 0) { - if (energy.getEnergyStored() - energyUsage >= 0) { - energy.extractEnergy(energyUsage, false); - } else { - energy.setEnergyStored(0); - } - } else if (type == EnumControllerType.CREATIVE) { - energy.setEnergyStored(energy.getMaxEnergyStored()); - } - - if (energy.getEnergyStored() != lastEnergy) { - world.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER); - - if (System.currentTimeMillis() - lastEnergyUpdate > 1500) { - lastEnergyUpdate = System.currentTimeMillis(); - - RefinedStorageUtils.updateBlock(world, pos); - } - } - - ticks++; - } - - @Override - public List getSlaves() { - return actualSlaves; - } - - @Override - public void addSlave(BlockPos slave) { - slavesToAdd.add(slave); - - markDirty(); - } - - @Override - public void removeSlave(BlockPos slave) { - slavesToRemove.add(slave); - - markDirty(); - } - - @Override - public IGridHandler getGridHandler() { - return gridHandler; - } - - @Override - public IWirelessGridHandler getWirelessGridHandler() { - return wirelessGridHandler; - } - - public void disconnectAll() { - for (INetworkSlave slave : getSlaves()) { - slave.disconnect(world); - } - - slaves.clear(); - } - - @Override - public List getItems() { - return items; - } - - @Override - public List getCraftingTasks() { - return craftingTasks; - } - - @Override - public void addCraftingTask(ICraftingTask task) { - craftingTasksToAdd.add(task); - - markDirty(); - } - - @Override - public void addCraftingTaskAsLast(ICraftingTask task) { - craftingTasksToAddAsLast.add(task); - - markDirty(); - } - - @Override - public ICraftingTask createCraftingTask(ICraftingPattern pattern) { - if (pattern.isProcessing()) { - return new ProcessingCraftingTask(pattern); - } else { - return new BasicCraftingTask(pattern); - } - } - - @Override - public void cancelCraftingTask(ICraftingTask task) { - craftingTasksToCancel.add(task); - - markDirty(); - } - - @Override - public List getPatterns() { - return patterns; - } - - @Override - public List getPattern(ItemStack pattern, int flags) { - List patterns = new ArrayList(); - - for (ICraftingPattern craftingPattern : getPatterns()) { - for (ItemStack output : craftingPattern.getOutputs()) { - if (RefinedStorageUtils.compareStack(output, pattern, flags)) { - patterns.add(craftingPattern); - } - } - } - - return patterns; - } - - @Override - public ICraftingPattern getPatternWithBestScore(ItemStack pattern) { - return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); - } - - @Override - public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) { - List patterns = getPattern(pattern, flags); - - if (patterns.isEmpty()) { - return null; - } else if (patterns.size() == 1) { - return patterns.get(0); - } - - int highestScore = 0; - int highestPattern = 0; - - for (int i = 0; i < patterns.size(); ++i) { - int score = 0; - - for (ItemStack input : patterns.get(i).getInputs()) { - ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); - - score += stored != null ? stored.stackSize : 0; - } - - if (score > highestScore) { - highestScore = score; - highestPattern = i; - } - } - - return patterns.get(highestPattern); - } - - private void updateSlaves() { - this.energyUsage = 0; - this.actualSlaves.clear(); - this.storages.clear(); - this.patterns.clear(); - - int range = 0; - - for (BlockPos slavePos : slaves) { - TileEntity tile = world.getTileEntity(slavePos); - - if (tile == null || !tile.hasCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null)) { - removeSlave(slavePos); - - continue; - } - - INetworkSlave slave = tile.getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null); - - actualSlaves.add(slave); - - if (!slave.canUpdate()) { - continue; - } - - if (slave instanceof TileWirelessTransmitter) { - range += ((TileWirelessTransmitter) slave).getRange(); - } - - if (slave instanceof IStorageProvider) { - ((IStorageProvider) slave).provide(storages); - } - - if (slave instanceof TileCrafter) { - TileCrafter crafter = (TileCrafter) slave; - - for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) { - ItemStack pattern = crafter.getPatterns().getStackInSlot(i); - - if (pattern != null && ItemPattern.isValid(pattern)) { - patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern))); - } - } - } - - this.energyUsage += slave.getEnergyUsage(); - } - - wirelessGridHandler.setRange(range); - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - int leftStored = left.getStored(); - int rightStored = right.getStored(); - - if (leftStored == rightStored) { - return 0; - } - - return (leftStored > rightStored) ? -1 : 1; - } - }); - - Collections.sort(storages, new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - if (left.getPriority() == right.getPriority()) { - return 0; - } - - return (left.getPriority() > right.getPriority()) ? -1 : 1; - } - }); - - updateItems(); - updateItemsWithClient(); - } - - private void updateItems() { - items.clear(); - - for (IStorage storage : storages) { - storage.addItems(items); - } - - for (ICraftingPattern pattern : patterns) { - for (ItemStack output : pattern.getOutputs()) { - ItemStack patternStack = output.copy(); - patternStack.stackSize = 0; - items.add(patternStack); - } - } - - combinedItems.clear(); - combinedItemsIndices.clear(); - - for (int i = 0; i < items.size(); ++i) { - if (combinedItemsIndices.contains(i)) { - continue; - } - - ItemStack stack = items.get(i); - - for (int j = i + 1; j < items.size(); ++j) { - if (combinedItemsIndices.contains(j)) { - continue; - } - - ItemStack otherStack = items.get(j); - - if (RefinedStorageUtils.compareStackNoQuantity(stack, otherStack)) { - // We copy here so we don't modify the quantity of the ItemStack IStorage uses. - // We re-get the ItemStack because the stack may change from a previous iteration in this loop - ItemStack newStack = items.get(i).copy(); - newStack.stackSize += otherStack.stackSize; - items.set(i, newStack); - - combinedItems.add(otherStack); - combinedItemsIndices.add(j); - } - } - } - - items.removeAll(combinedItems); - } - - @Override - public void updateItemsWithClient() { - for (EntityPlayer player : world.playerEntities) { - if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) { - updateItemsWithClient((EntityPlayerMP) player); - } - } - } - - @Override - public void updateItemsWithClient(EntityPlayerMP player) { - RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player); - } - - @Override - public ItemStack push(ItemStack stack, int size, boolean simulate) { - if (stack == null || stack.getItem() == null) { - return null; - } - - if (storages.isEmpty()) { - return ItemHandlerHelper.copyStackWithSize(stack, size); - } - - int orginalSize = size; - - ItemStack remainder = stack; - - for (IStorage storage : storages) { - remainder = storage.push(remainder, size, simulate); - - if (remainder == null) { - break; - } else { - size = remainder.stackSize; - } - } - - int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize; - - if (!simulate && sizePushed > 0) { - updateItems(); - updateItemsWithClient(); - - for (int i = 0; i < sizePushed; ++i) { - if (!craftingTasks.empty()) { - ICraftingTask top = craftingTasks.peek(); - - if (top instanceof ProcessingCraftingTask) { - ((ProcessingCraftingTask) top).onPushed(stack); - } - } - } - } - - return remainder; - } - - @Override - public ItemStack take(ItemStack stack, int size) { - return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); - } - - @Override - public ItemStack take(ItemStack stack, int size, int flags) { - int requested = size; - int received = 0; - - ItemStack newStack = null; - - for (IStorage storage : storages) { - ItemStack took = storage.take(stack, requested - received, flags); - - if (took != null) { - if (newStack == null) { - newStack = took; - } else { - newStack.stackSize += took.stackSize; - } - - received += took.stackSize; - } - - if (requested == received) { - break; - } - } - - if (newStack != null) { - updateItems(); - updateItemsWithClient(); - } - - return newStack; - } - - @Override - public ItemStack getItem(ItemStack stack, int flags) { - for (ItemStack otherStack : items) { - if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) { - return otherStack; - } - } - - return null; - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - energy.readFromNBT(tag); - - if (tag.hasKey(RedstoneMode.NBT)) { - redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT)); - } - - if (tag.hasKey(NBT_CRAFTING_TASKS)) { - NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < taskList.tagCount(); ++i) { - NBTTagCompound taskTag = taskList.getCompoundTagAt(i); - - CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT)); - - if (pattern != null) { - switch (taskTag.getInteger("Type")) { - case BasicCraftingTask.ID: - addCraftingTask(new BasicCraftingTask(taskTag, pattern)); - break; - case ProcessingCraftingTask.ID: - addCraftingTask(new ProcessingCraftingTask(taskTag, pattern)); - break; - } - } - } - } - - if (tag.hasKey(NBT_SLAVES)) { - NBTTagList slavesTag = tag.getTagList(NBT_SLAVES, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < slavesTag.tagCount(); ++i) { - NBTTagCompound slave = slavesTag.getCompoundTagAt(i); - - slavesToLoad.add(new BlockPos(slave.getInteger(NBT_SLAVE_X), slave.getInteger(NBT_SLAVE_Y), slave.getInteger(NBT_SLAVE_Z))); - } - } - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound tag) { - energy.writeToNBT(tag); - - tag.setInteger(RedstoneMode.NBT, redstoneMode.id); - - NBTTagList list = new NBTTagList(); - - for (ICraftingTask task : craftingTasks) { - NBTTagCompound taskTag = new NBTTagCompound(); - task.writeToNBT(taskTag); - list.appendTag(taskTag); - } - - tag.setTag(NBT_CRAFTING_TASKS, list); - - NBTTagList slavesTag = new NBTTagList(); - - for (BlockPos slave : slaves) { - NBTTagCompound slaveTag = new NBTTagCompound(); - - slaveTag.setInteger(NBT_SLAVE_X, slave.getX()); - slaveTag.setInteger(NBT_SLAVE_Y, slave.getY()); - slaveTag.setInteger(NBT_SLAVE_Z, slave.getZ()); - - slavesTag.appendTag(slaveTag); - } - - tag.setTag(NBT_SLAVES, slavesTag); - - return tag; - } - - public void markDirty() { - if (world != null) { - NetworkMasterSavedData.getOrLoad(world).markDirty(); - } - } -} diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterEventHandler.java b/src/main/java/refinedstorage/apiimpl/network/NetworkMasterEventHandler.java deleted file mode 100755 index f48fe9c3f..000000000 --- a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterEventHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package refinedstorage.apiimpl.network; - -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import refinedstorage.api.network.INetworkMaster; - -import java.util.Map; - -public class NetworkMasterEventHandler { - @SubscribeEvent - public void onWorldTick(TickEvent.WorldTickEvent e) { - if (e.phase == TickEvent.Phase.START) { - Map networks = NetworkMasterRegistry.get(e.world); - - if (networks != null) { - for (INetworkMaster network : networks.values()) { - if (network.getWorld() == null) { - network.setWorld(e.world); - } - - network.update(); - } - } - } - } - - @SubscribeEvent - public void onWorldLoad(WorldEvent.Load e) { - if (!e.getWorld().isRemote) { - NetworkMasterSavedData.getOrLoad(e.getWorld()); - } - } - - @SubscribeEvent - public void onWorldUnload(WorldEvent.Unload e) { - NetworkMasterRegistry.clear(); - } -} diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterRegistry.java b/src/main/java/refinedstorage/apiimpl/network/NetworkMasterRegistry.java deleted file mode 100755 index c7a044bc6..000000000 --- a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterRegistry.java +++ /dev/null @@ -1,50 +0,0 @@ -package refinedstorage.apiimpl.network; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import refinedstorage.api.network.INetworkMaster; - -import java.util.HashMap; -import java.util.Map; - -public class NetworkMasterRegistry { - public static final Map> NETWORKS = new HashMap>(); - - public static void add(World world, INetworkMaster network) { - add(world.provider.getDimension(), network); - - NetworkMasterSavedData.getOrLoad(world).markDirty(); - } - - public static void add(int dim, INetworkMaster network) { - if (NETWORKS.get(dim) == null) { - NETWORKS.put(dim, new HashMap()); - } - - NETWORKS.get(dim).put(network.getPosition(), network); - } - - public static void remove(World world, BlockPos pos) { - if (get(world) != null) { - INetworkMaster network = get(world).get(pos); - - if (network != null) { - get(world).remove(pos); - - NetworkMasterSavedData.getOrLoad(world).markDirty(); - } - } - } - - public static INetworkMaster get(World world, BlockPos pos) { - return get(world) == null ? null : get(world).get(pos); - } - - public static Map get(World world) { - return NETWORKS.get(world.provider.getDimension()); - } - - public static void clear() { - NETWORKS.clear(); - } -} diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterSavedData.java b/src/main/java/refinedstorage/apiimpl/network/NetworkMasterSavedData.java deleted file mode 100755 index 7e598dcc7..000000000 --- a/src/main/java/refinedstorage/apiimpl/network/NetworkMasterSavedData.java +++ /dev/null @@ -1,76 +0,0 @@ -package refinedstorage.apiimpl.network; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldSavedData; -import net.minecraftforge.common.util.Constants; -import refinedstorage.api.network.INetworkMaster; - -import java.util.Map; - -public class NetworkMasterSavedData extends WorldSavedData { - public static final String ID = "RSNetworks"; - public static final String NBT_NETWORKS = "Networks"; - public static final String NBT_NETWORK_X = "X"; - public static final String NBT_NETWORK_Y = "Y"; - public static final String NBT_NETWORK_Z = "Z"; - public static final String NBT_NETWORK_DIM = "Dim"; - public static final String NBT_NETWORK_DATA = "Data"; - - public NetworkMasterSavedData(String name) { - super(name); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - NBTTagList networks = tag.getTagList(NBT_NETWORKS, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < networks.tagCount(); ++i) { - NBTTagCompound networkTag = networks.getCompoundTagAt(i); - - INetworkMaster network = new NetworkMaster(new BlockPos(networkTag.getInteger(NBT_NETWORK_X), networkTag.getInteger(NBT_NETWORK_Y), networkTag.getInteger(NBT_NETWORK_Z))); - - network.readFromNBT(networkTag.getCompoundTag(NBT_NETWORK_DATA)); - - NetworkMasterRegistry.add(networkTag.getInteger(NBT_NETWORK_DIM), network); - } - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound tag) { - NBTTagList networks = new NBTTagList(); - - for (Map.Entry> entry : NetworkMasterRegistry.NETWORKS.entrySet()) { - for (INetworkMaster network : entry.getValue().values()) { - NBTTagCompound networkTag = new NBTTagCompound(); - - networkTag.setInteger(NBT_NETWORK_X, network.getPosition().getX()); - networkTag.setInteger(NBT_NETWORK_Y, network.getPosition().getY()); - networkTag.setInteger(NBT_NETWORK_Z, network.getPosition().getZ()); - networkTag.setInteger(NBT_NETWORK_DIM, entry.getKey()); - - networkTag.setTag(NBT_NETWORK_DATA, network.writeToNBT(new NBTTagCompound())); - - networks.appendTag(networkTag); - } - } - - tag.setTag(NBT_NETWORKS, networks); - - return tag; - } - - public static NetworkMasterSavedData getOrLoad(World world) { - NetworkMasterSavedData instance = (NetworkMasterSavedData) world.getMapStorage().getOrLoadData(NetworkMasterSavedData.class, ID); - - if (instance == null) { - instance = new NetworkMasterSavedData(ID); - - world.getMapStorage().setData(ID, instance); - } - - return instance; - } -} diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index e1c5ba2ff..54eee9423 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -15,14 +15,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageGui; -import refinedstorage.apiimpl.network.NetworkMaster; -import refinedstorage.apiimpl.network.NetworkMasterRegistry; import refinedstorage.item.ItemBlockController; import refinedstorage.tile.controller.TileController; @@ -68,7 +65,7 @@ public class BlockController extends BlockBase { TileController controller = (TileController) world.getTileEntity(pos); return super.getActualState(state, world, pos) - .withProperty(ENERGY, (int) Math.ceil((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * 8f)); + .withProperty(ENERGY, controller.getEnergyScaled(8)); } @Override @@ -84,11 +81,7 @@ public class BlockController extends BlockBase { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - if (((TileController) world.getTileEntity(pos)).getNetwork() == null) { - player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:no_network")); - } else { - player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ()); - } + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ()); } return true; @@ -97,15 +90,13 @@ public class BlockController extends BlockBase { @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { if (!world.isRemote) { - NetworkMaster network = new NetworkMaster(pos, world); + TileController controller = (TileController) world.getTileEntity(pos); NBTTagCompound tag = stack.getTagCompound(); - if (tag != null && tag.hasKey(NetworkMaster.NBT_ENERGY)) { - network.getEnergy().receiveEnergy(tag.getInteger(NetworkMaster.NBT_ENERGY), false); + if (tag != null && tag.hasKey(TileController.NBT_ENERGY)) { + controller.getEnergy().receiveEnergy(tag.getInteger(TileController.NBT_ENERGY), false); } - - NetworkMasterRegistry.add(world, network); } super.onBlockPlacedBy(world, pos, state, player, stack); @@ -114,7 +105,7 @@ public class BlockController extends BlockBase { @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { if (!world.isRemote) { - NetworkMasterRegistry.remove(world, pos); + ((TileController) world.getTileEntity(pos)).disconnectAll(); } super.breakBlock(world, pos, state); @@ -126,9 +117,8 @@ public class BlockController extends BlockBase { ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state)); - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger(NetworkMaster.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergyStored(null)); - stack.setTagCompound(tag); + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setInteger(TileController.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergy().getEnergyStored()); drops.add(stack); diff --git a/src/main/java/refinedstorage/gui/GuiController.java b/src/main/java/refinedstorage/gui/GuiController.java index 66bf794e2..d9f2cecda 100755 --- a/src/main/java/refinedstorage/gui/GuiController.java +++ b/src/main/java/refinedstorage/gui/GuiController.java @@ -3,7 +3,6 @@ package refinedstorage.gui; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import refinedstorage.RefinedStorageUtils; -import refinedstorage.apiimpl.network.NetworkMaster; import refinedstorage.container.ContainerController; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.controller.ClientSlave; @@ -46,7 +45,7 @@ public class GuiController extends GuiBase { drawTexture(x, y, 0, 0, width, height); - int barHeightNew = (int) ((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * (float) barHeight); + int barHeightNew = controller.getEnergyScaled(barHeight); drawTexture(x + barX, y + barY + barHeight - barHeightNew, 178, barHeight - barHeightNew, barWidth, barHeightNew); } @@ -103,7 +102,7 @@ public class GuiController extends GuiBase { } if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) { - drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy(), NetworkMaster.ENERGY_CAPACITY)); + drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy().getEnergyStored(), TileController.ENERGY_CAPACITY)); } } diff --git a/src/main/java/refinedstorage/item/ItemBlockController.java b/src/main/java/refinedstorage/item/ItemBlockController.java index 3bf90eb76..76eb8abe1 100755 --- a/src/main/java/refinedstorage/item/ItemBlockController.java +++ b/src/main/java/refinedstorage/item/ItemBlockController.java @@ -6,8 +6,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.apiimpl.network.NetworkMaster; import refinedstorage.block.EnumControllerType; +import refinedstorage.tile.controller.TileController; import java.util.List; @@ -21,11 +21,11 @@ public class ItemBlockController extends ItemBlockBase { if (stack.getMetadata() != EnumControllerType.CREATIVE.getId()) { int energyStored = 0; - if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(NetworkMaster.NBT_ENERGY)) { - energyStored = stack.getTagCompound().getInteger(NetworkMaster.NBT_ENERGY); + if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(TileController.NBT_ENERGY)) { + energyStored = stack.getTagCompound().getInteger(TileController.NBT_ENERGY); } - list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, NetworkMaster.ENERGY_CAPACITY)); + list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, TileController.ENERGY_CAPACITY)); } } @@ -43,7 +43,7 @@ public class ItemBlockController extends ItemBlockBase { tag = new NBTTagCompound(); } - tag.setInteger(NetworkMaster.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? NetworkMaster.ENERGY_CAPACITY : 0); + tag.setInteger(TileController.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? TileController.ENERGY_CAPACITY : 0); return stack; } diff --git a/src/main/java/refinedstorage/item/ItemWirelessGrid.java b/src/main/java/refinedstorage/item/ItemWirelessGrid.java index be5ac2197..f1b415cd8 100755 --- a/src/main/java/refinedstorage/item/ItemWirelessGrid.java +++ b/src/main/java/refinedstorage/item/ItemWirelessGrid.java @@ -10,14 +10,14 @@ import net.minecraft.item.IItemPropertyGetter; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.apiimpl.network.NetworkMasterRegistry; +import refinedstorage.tile.controller.TileController; import refinedstorage.tile.grid.TileGrid; import java.util.List; @@ -134,10 +134,10 @@ public class ItemWirelessGrid extends ItemEnergyContainer { @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { if (!world.isRemote && hasValidNBT(stack) && getDimensionId(stack) == player.dimension) { - INetworkMaster network = NetworkMasterRegistry.get(player.worldObj, new BlockPos(getX(stack), getY(stack), getZ(stack))); + TileEntity tile = world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack))); - if (network != null) { - if (network.getWirelessGridHandler().onOpen(player, hand)) { + if (tile instanceof TileController) { + if (((TileController) tile).getWirelessGridHandler().onOpen(player, hand)) { return new ActionResult(EnumActionResult.SUCCESS, stack); } else { player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:wireless_grid.out_of_range")); diff --git a/src/main/java/refinedstorage/network/MessageGridItems.java b/src/main/java/refinedstorage/network/MessageGridItems.java index f9da5bfa3..1bff6bc14 100755 --- a/src/main/java/refinedstorage/network/MessageGridItems.java +++ b/src/main/java/refinedstorage/network/MessageGridItems.java @@ -8,20 +8,20 @@ import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import refinedstorage.apiimpl.network.NetworkMaster; +import refinedstorage.api.network.INetworkMaster; import refinedstorage.container.ContainerGrid; import java.util.ArrayList; import java.util.List; public class MessageGridItems implements IMessage, IMessageHandler { - private NetworkMaster network; + private INetworkMaster network; private List items = new ArrayList(); public MessageGridItems() { } - public MessageGridItems(NetworkMaster network) { + public MessageGridItems(INetworkMaster network) { this.network = network; } diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index c2f1e7d8e..6f1a431a5 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -5,7 +5,6 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -18,7 +17,6 @@ import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; import refinedstorage.api.RefinedStorageAPI; -import refinedstorage.apiimpl.network.NetworkMasterEventHandler; import refinedstorage.apiimpl.solderer.*; import refinedstorage.apiimpl.storage.NBTStorage; import refinedstorage.block.BlockBase; @@ -480,7 +478,6 @@ public class CommonProxy { } public void init(FMLInitializationEvent e) { - MinecraftForge.EVENT_BUS.register(new NetworkMasterEventHandler()); } public void postInit(FMLPostInitializationEvent e) { diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index cdaaf5f9e..5e7bc42ea 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -11,7 +11,6 @@ import refinedstorage.RefinedStorageUtils; import refinedstorage.api.RefinedStorageCapabilities; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkSlave; -import refinedstorage.apiimpl.network.NetworkMasterRegistry; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; import refinedstorage.tile.controller.TileController; @@ -23,6 +22,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync public static final String NBT_CONNECTED = "Connected"; private RedstoneMode redstoneMode = RedstoneMode.IGNORE; + private boolean active; protected boolean connected; protected INetworkMaster network; @@ -41,6 +41,27 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync return true; } + @Override + public void update() { + if (!worldObj.isRemote) { + if (ticks == 0) { + refreshConnection(worldObj); + } + + if (isActive()) { + updateSlave(); + } + + if (active != isActive()) { + RefinedStorageUtils.updateBlock(worldObj, pos); + + active = isActive(); + } + } + + super.update(); + } + @Override public void connect(World world, INetworkMaster network) { if (network.canRun()) { @@ -48,7 +69,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync this.connected = true; if (!(this instanceof TileCable)) { - this.network.addSlave(pos); + this.network.addSlave(this); } world.notifyNeighborsOfStateChange(pos, getBlockType()); @@ -70,7 +91,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync this.connected = false; if (this.network != null) { - this.network.removeSlave(pos); + this.network.removeSlave(this); this.network = null; } @@ -87,11 +108,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync if (network == null) { if (controller != null) { - INetworkMaster network = NetworkMasterRegistry.get(world, controller.getPos()); - - if (network != null) { - connect(world, network); - } + connect(world, network); } } else { if (controller == null) { diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 4a3c8328d..116077358 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -1,83 +1,635 @@ package refinedstorage.tile.controller; +import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import io.netty.buffer.ByteBuf; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; +import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.network.IGridHandler; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkSlave; -import refinedstorage.apiimpl.network.NetworkMaster; -import refinedstorage.apiimpl.network.NetworkMasterRegistry; +import refinedstorage.api.network.IWirelessGridHandler; +import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.IStorage; +import refinedstorage.api.storage.IStorageProvider; +import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; +import refinedstorage.apiimpl.autocrafting.CraftingPattern; +import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; +import refinedstorage.apiimpl.network.GridHandler; +import refinedstorage.apiimpl.network.WirelessGridHandler; import refinedstorage.block.BlockController; import refinedstorage.block.EnumControllerType; import refinedstorage.container.ContainerController; +import refinedstorage.container.ContainerGrid; +import refinedstorage.item.ItemPattern; +import refinedstorage.network.MessageGridItems; import refinedstorage.tile.ISynchronizedContainer; import refinedstorage.tile.TileBase; +import refinedstorage.tile.TileCrafter; +import refinedstorage.tile.TileWirelessTransmitter; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; -import java.util.ArrayList; -import java.util.List; +import java.util.*; -public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig { - private INetworkMaster network; +public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig { + public static final int ENERGY_CAPACITY = 32000; - // Only used client side - private List clientSlaves = new ArrayList(); - private int energy; + public static final String NBT_CRAFTING_TASKS = "CraftingTasks"; + public static final String NBT_ENERGY = "Energy"; + + private GridHandler gridHandler = new GridHandler(this); + private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this); + + private List items = new ArrayList(); + private List combinedItems = new ArrayList(); + private Set combinedItemsIndices = new HashSet(); + + private List storages = new ArrayList(); + + private List slaves = new ArrayList(); + private List slavesToAdd = new ArrayList(); + private List slavesToRemove = new ArrayList(); + + private List patterns = new ArrayList(); + + private Stack craftingTasks = new Stack(); + private List craftingTasksToAddAsLast = new ArrayList(); + private List craftingTasksToAdd = new ArrayList(); + private List craftingTasksToCancel = new ArrayList(); + + private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY); private int energyUsage; - private EnumControllerType type; - private RedstoneMode redstoneMode; - public INetworkMaster getNetwork() { - if (network == null) { - network = NetworkMasterRegistry.get(worldObj, pos); + private boolean couldRun; + private long lastEnergyUpdate; + + private EnumControllerType type; + + private RedstoneMode redstoneMode = RedstoneMode.IGNORE; + + private List clientSlaves; + + @Override + public BlockPos getPosition() { + return pos; + } + + @Override + public World getWorld() { + return worldObj; + } + + @Override + public EnergyStorage getEnergy() { + return energy; + } + + @Override + public boolean canRun() { + return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(worldObj, pos); + } + + @Override + public void update() { + if (!worldObj.isRemote) { + boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); + + for (INetworkSlave slave : slavesToAdd) { + if (!slaves.contains(slave)) { + slaves.add(slave); + } + } + + slavesToAdd.clear(); + + slaves.removeAll(slavesToRemove); + slavesToRemove.clear(); + + int lastEnergy = energy.getEnergyStored(); + + if (canRun()) { + if (ticks % 20 == 0 || forceUpdate) { + updateSlaves(); + } + + for (ICraftingTask taskToCancel : craftingTasksToCancel) { + taskToCancel.onCancelled(this); + } + + craftingTasks.removeAll(craftingTasksToCancel); + craftingTasksToCancel.clear(); + + for (ICraftingTask task : craftingTasksToAdd) { + craftingTasks.push(task); + } + + craftingTasksToAdd.clear(); + + for (ICraftingTask task : craftingTasksToAddAsLast) { + craftingTasks.add(0, task); + } + + craftingTasksToAddAsLast.clear(); + + if (!craftingTasks.empty()) { + ICraftingTask top = craftingTasks.peek(); + + if (ticks % top.getPattern().getContainer(worldObj).getSpeed() == 0 && top.update(this)) { + top.onDone(this); + + craftingTasks.pop(); + } + } + } else if (!slaves.isEmpty()) { + disconnectAll(); + updateSlaves(); + } + + if (couldRun != canRun()) { + couldRun = canRun(); + + worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER); + } + + wirelessGridHandler.update(); + + if (type == EnumControllerType.NORMAL && energyUsage > 0) { + if (energy.getEnergyStored() - energyUsage >= 0) { + energy.extractEnergy(energyUsage, false); + } else { + energy.setEnergyStored(0); + } + } else if (type == EnumControllerType.CREATIVE) { + energy.setEnergyStored(energy.getMaxEnergyStored()); + } + + if (energy.getEnergyStored() != lastEnergy) { + worldObj.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER); + + if (System.currentTimeMillis() - lastEnergyUpdate > 1500) { + lastEnergyUpdate = System.currentTimeMillis(); + + RefinedStorageUtils.updateBlock(worldObj, pos); + } + } } - return network; + super.update(); + } + + @Override + public List getSlaves() { + return slaves; + } + + public List getClientSlaves() { + return clientSlaves; + } + + @Override + public void addSlave(INetworkSlave slave) { + slavesToAdd.add(slave); + } + + @Override + public void removeSlave(INetworkSlave slave) { + slavesToRemove.add(slave); + } + + @Override + public IGridHandler getGridHandler() { + return gridHandler; + } + + @Override + public IWirelessGridHandler getWirelessGridHandler() { + return wirelessGridHandler; + } + + public void disconnectAll() { + for (INetworkSlave slave : getSlaves()) { + slave.disconnect(worldObj); + } + + slaves.clear(); + } + + @Override + public List getItems() { + return items; + } + + @Override + public List getCraftingTasks() { + return craftingTasks; + } + + @Override + public void addCraftingTask(ICraftingTask task) { + craftingTasksToAdd.add(task); + + markDirty(); + } + + @Override + public void addCraftingTaskAsLast(ICraftingTask task) { + craftingTasksToAddAsLast.add(task); + + markDirty(); + } + + @Override + public ICraftingTask createCraftingTask(ICraftingPattern pattern) { + if (pattern.isProcessing()) { + return new ProcessingCraftingTask(pattern); + } else { + return new BasicCraftingTask(pattern); + } + } + + @Override + public void cancelCraftingTask(ICraftingTask task) { + craftingTasksToCancel.add(task); + + markDirty(); + } + + @Override + public List getPatterns() { + return patterns; + } + + @Override + public List getPattern(ItemStack pattern, int flags) { + List patterns = new ArrayList(); + + for (ICraftingPattern craftingPattern : getPatterns()) { + for (ItemStack output : craftingPattern.getOutputs()) { + if (RefinedStorageUtils.compareStack(output, pattern, flags)) { + patterns.add(craftingPattern); + } + } + } + + return patterns; + } + + @Override + public ICraftingPattern getPatternWithBestScore(ItemStack pattern) { + return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + } + + @Override + public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) { + List patterns = getPattern(pattern, flags); + + if (patterns.isEmpty()) { + return null; + } else if (patterns.size() == 1) { + return patterns.get(0); + } + + int highestScore = 0; + int highestPattern = 0; + + for (int i = 0; i < patterns.size(); ++i) { + int score = 0; + + for (ItemStack input : patterns.get(i).getInputs()) { + ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + + score += stored != null ? stored.stackSize : 0; + } + + if (score > highestScore) { + highestScore = score; + highestPattern = i; + } + } + + return patterns.get(highestPattern); + } + + private void updateSlaves() { + this.energyUsage = 0; + this.storages.clear(); + this.patterns.clear(); + + int range = 0; + + for (INetworkSlave slave : slaves) { + if (!slave.canUpdate()) { + continue; + } + + if (slave instanceof TileWirelessTransmitter) { + range += ((TileWirelessTransmitter) slave).getRange(); + } + + if (slave instanceof IStorageProvider) { + ((IStorageProvider) slave).provide(storages); + } + + if (slave instanceof TileCrafter) { + TileCrafter crafter = (TileCrafter) slave; + + for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) { + ItemStack pattern = crafter.getPatterns().getStackInSlot(i); + + if (pattern != null && ItemPattern.isValid(pattern)) { + patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern))); + } + } + } + + this.energyUsage += slave.getEnergyUsage(); + } + + wirelessGridHandler.setRange(range); + + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage left, IStorage right) { + int leftStored = left.getStored(); + int rightStored = right.getStored(); + + if (leftStored == rightStored) { + return 0; + } + + return (leftStored > rightStored) ? -1 : 1; + } + }); + + Collections.sort(storages, new Comparator() { + @Override + public int compare(IStorage left, IStorage right) { + if (left.getPriority() == right.getPriority()) { + return 0; + } + + return (left.getPriority() > right.getPriority()) ? -1 : 1; + } + }); + + updateItems(); + updateItemsWithClient(); + } + + private void updateItems() { + items.clear(); + + for (IStorage storage : storages) { + storage.addItems(items); + } + + for (ICraftingPattern pattern : patterns) { + for (ItemStack output : pattern.getOutputs()) { + ItemStack patternStack = output.copy(); + patternStack.stackSize = 0; + items.add(patternStack); + } + } + + combinedItems.clear(); + combinedItemsIndices.clear(); + + for (int i = 0; i < items.size(); ++i) { + if (combinedItemsIndices.contains(i)) { + continue; + } + + ItemStack stack = items.get(i); + + for (int j = i + 1; j < items.size(); ++j) { + if (combinedItemsIndices.contains(j)) { + continue; + } + + ItemStack otherStack = items.get(j); + + if (RefinedStorageUtils.compareStackNoQuantity(stack, otherStack)) { + // We copy here so we don't modify the quantity of the ItemStack IStorage uses. + // We re-get the ItemStack because the stack may change from a previous iteration in this loop + ItemStack newStack = items.get(i).copy(); + newStack.stackSize += otherStack.stackSize; + items.set(i, newStack); + + combinedItems.add(otherStack); + combinedItemsIndices.add(j); + } + } + } + + items.removeAll(combinedItems); + } + + @Override + public void updateItemsWithClient() { + for (EntityPlayer player : worldObj.playerEntities) { + if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) { + updateItemsWithClient((EntityPlayerMP) player); + } + } + } + + @Override + public void updateItemsWithClient(EntityPlayerMP player) { + RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player); + } + + @Override + public ItemStack push(ItemStack stack, int size, boolean simulate) { + if (stack == null || stack.getItem() == null) { + return null; + } + + if (storages.isEmpty()) { + return ItemHandlerHelper.copyStackWithSize(stack, size); + } + + int orginalSize = size; + + ItemStack remainder = stack; + + for (IStorage storage : storages) { + remainder = storage.push(remainder, size, simulate); + + if (remainder == null) { + break; + } else { + size = remainder.stackSize; + } + } + + int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize; + + if (!simulate && sizePushed > 0) { + updateItems(); + updateItemsWithClient(); + + for (int i = 0; i < sizePushed; ++i) { + if (!craftingTasks.empty()) { + ICraftingTask top = craftingTasks.peek(); + + if (top instanceof ProcessingCraftingTask) { + ((ProcessingCraftingTask) top).onPushed(stack); + } + } + } + } + + return remainder; + } + + @Override + public ItemStack take(ItemStack stack, int size) { + return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + } + + @Override + public ItemStack take(ItemStack stack, int size, int flags) { + int requested = size; + int received = 0; + + ItemStack newStack = null; + + for (IStorage storage : storages) { + ItemStack took = storage.take(stack, requested - received, flags); + + if (took != null) { + if (newStack == null) { + newStack = took; + } else { + newStack.stackSize += took.stackSize; + } + + received += took.stackSize; + } + + if (requested == received) { + break; + } + } + + if (newStack != null) { + updateItems(); + updateItemsWithClient(); + } + + return newStack; + } + + @Override + public ItemStack getItem(ItemStack stack, int flags) { + for (ItemStack otherStack : items) { + if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) { + return otherStack; + } + } + + return null; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + energy.readFromNBT(tag); + + if (tag.hasKey(RedstoneMode.NBT)) { + redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT)); + } + + if (tag.hasKey(NBT_CRAFTING_TASKS)) { + NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < taskList.tagCount(); ++i) { + NBTTagCompound taskTag = taskList.getCompoundTagAt(i); + + CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT)); + + if (pattern != null) { + switch (taskTag.getInteger("Type")) { + case BasicCraftingTask.ID: + addCraftingTask(new BasicCraftingTask(taskTag, pattern)); + break; + case ProcessingCraftingTask.ID: + addCraftingTask(new ProcessingCraftingTask(taskTag, pattern)); + break; + } + } + } + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + energy.writeToNBT(tag); + + tag.setInteger(RedstoneMode.NBT, redstoneMode.id); + + NBTTagList list = new NBTTagList(); + + for (ICraftingTask task : craftingTasks) { + NBTTagCompound taskTag = new NBTTagCompound(); + task.writeToNBT(taskTag); + list.appendTag(taskTag); + } + + tag.setTag(NBT_CRAFTING_TASKS, list); + + return tag; } @Override public NBTTagCompound writeUpdate(NBTTagCompound tag) { super.writeUpdate(tag); - tag.setInteger(NetworkMaster.NBT_ENERGY, getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0); + tag.setInteger(NBT_ENERGY, energy.getEnergyStored()); return tag; } @Override public void readUpdate(NBTTagCompound tag) { - energy = tag.getInteger(NetworkMaster.NBT_ENERGY); + energy.setEnergyStored(tag.getInteger(NBT_ENERGY)); super.readUpdate(tag); } @Override public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { - return getNetwork() != null ? getNetwork().getEnergy().receiveEnergy(maxReceive, simulate) : 0; + return energy.receiveEnergy(maxReceive, simulate); } @Override public int getEnergyStored(EnumFacing from) { - return getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0; + return energy.getEnergyStored(); } public int getEnergyScaled(int i) { - float stored = worldObj.isRemote ? energy : (getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0); - float max = NetworkMaster.ENERGY_CAPACITY; - - return (int) (stored / max * (float) i); + return (int) ((float) energy.getEnergyStored() / (float) ENERGY_CAPACITY * (float) i); } @Override public int getMaxEnergyStored(EnumFacing from) { - return getNetwork() != null ? getNetwork().getEnergy().getMaxEnergyStored() : 0; + return energy.getMaxEnergyStored(); } @Override @@ -87,22 +639,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public RedstoneMode getRedstoneMode() { - return worldObj.isRemote ? redstoneMode : (getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode() : RedstoneMode.IGNORE); + return redstoneMode; } @Override public void setRedstoneMode(RedstoneMode mode) { - if (getNetwork() != null) { - ((NetworkMaster) getNetwork()).setRedstoneMode(mode); - } - } - - public List getClientSlaves() { - return clientSlaves; - } - - public int getEnergy() { - return energy; + this.redstoneMode = mode; } public int getEnergyUsage() { @@ -119,7 +661,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public void readContainerData(ByteBuf buf) { - this.energy = buf.readInt(); + energy.setEnergyStored(buf.readInt()); this.energyUsage = buf.readInt(); this.redstoneMode = RedstoneMode.getById(buf.readInt()); @@ -142,25 +684,25 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr @Override public void writeContainerData(ByteBuf buf) { - buf.writeInt(getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0); - buf.writeInt(getNetwork() != null ? getNetwork().getEnergyUsage() : 0); + buf.writeInt(energy.getEnergyStored()); + buf.writeInt(energyUsage); - buf.writeInt(getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode().id : RedstoneMode.IGNORE.id); + buf.writeInt(redstoneMode.id); - if (getNetwork() != null) { - List clientSlaves = new ArrayList(); + List clientSlaves = new ArrayList(); - for (INetworkSlave slave : getNetwork().getSlaves()) { - if (slave.canUpdate()) { - IBlockState state = worldObj.getBlockState(slave.getPosition()); + for (INetworkSlave slave : slaves) { + if (slave.canUpdate()) { + IBlockState state = worldObj.getBlockState(slave.getPosition()); - ClientSlave clientSlave = new ClientSlave(); + ClientSlave clientSlave = new ClientSlave(); - clientSlave.energyUsage = slave.getEnergyUsage(); - clientSlave.amount = 1; - clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); + clientSlave.energyUsage = slave.getEnergyUsage(); + clientSlave.amount = 1; + clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); - if (clientSlave.stack.getItem() != null && clientSlaves.contains(clientSlave)) { + if (clientSlave.stack.getItem() != null) { + if (clientSlaves.contains(clientSlave)) { for (ClientSlave other : clientSlaves) { if (other.equals(clientSlave)) { other.amount++; @@ -173,16 +715,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr } } } + } - buf.writeInt(clientSlaves.size()); + buf.writeInt(clientSlaves.size()); - for (ClientSlave slave : clientSlaves) { - buf.writeInt(slave.energyUsage); - buf.writeInt(slave.amount); - ByteBufUtils.writeItemStack(buf, slave.stack); - } - } else { - buf.writeInt(0); + for (ClientSlave slave : clientSlaves) { + buf.writeInt(slave.energyUsage); + buf.writeInt(slave.amount); + ByteBufUtils.writeItemStack(buf, slave.stack); } } diff --git a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java index 16acfcfc8..68fa8e0f8 100755 --- a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java @@ -2,18 +2,18 @@ package refinedstorage.tile.grid; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.IGridHandler; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.apiimpl.network.NetworkMasterRegistry; import refinedstorage.block.EnumGridType; import refinedstorage.item.ItemWirelessGrid; import refinedstorage.network.MessageWirelessGridSettingsUpdate; import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.tile.controller.TileController; import java.util.ArrayList; import java.util.List; @@ -60,23 +60,25 @@ public class WirelessGrid implements IGrid { @Override public IGridHandler getGridHandler() { - INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos); + TileController controller = getController(); - if (network != null) { - return network.getGridHandler(); - } - - return null; + return controller != null ? controller.getGridHandler() : null; } public void onClose(EntityPlayer player) { - INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos); + TileController controller = getController(); - if (network != null) { - network.getWirelessGridHandler().onClose(player); + if (controller != null) { + controller.getWirelessGridHandler().onClose(player); } } + private TileController getController() { + TileEntity tile = world.getTileEntity(controllerPos); + + return tile instanceof TileController ? (TileController) tile : null; + } + @Override public int getSortingType() { return sortingType;