diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java index 9fc6365a5..5ba23bb57 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetwork.java @@ -6,6 +6,7 @@ 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; @@ -20,6 +21,7 @@ import refinedstorage.autocrafting.CraftingPattern; import refinedstorage.autocrafting.task.BasicCraftingTask; import refinedstorage.autocrafting.task.ICraftingTask; import refinedstorage.autocrafting.task.ProcessingCraftingTask; +import refinedstorage.block.BlockController; import refinedstorage.block.EnumControllerType; import refinedstorage.container.ContainerGrid; import refinedstorage.item.ItemPattern; @@ -29,6 +31,7 @@ import refinedstorage.tile.TileMachine; import refinedstorage.tile.TileWirelessTransmitter; import refinedstorage.tile.config.RedstoneMode; import refinedstorage.tile.controller.StorageHandler; +import refinedstorage.tile.controller.TileController; import refinedstorage.tile.controller.WirelessGridHandler; import java.util.*; @@ -50,6 +53,7 @@ public class StorageNetwork { private List machines = new ArrayList(); private List machinesToAdd = new ArrayList(); + private List machinesToLoad = new ArrayList(); private List machinesToRemove = new ArrayList(); private List patterns = new ArrayList(); @@ -75,10 +79,14 @@ public class StorageNetwork { private RedstoneMode redstoneMode = RedstoneMode.IGNORE; - public StorageNetwork(World world, BlockPos pos, EnumControllerType type) { - this.world = world; + public StorageNetwork(BlockPos pos, World world) { + this.pos = pos; + + setWorld(world); + } + + public StorageNetwork(BlockPos pos) { this.pos = pos; - this.type = type; } public RedstoneMode getRedstoneMode() { @@ -87,6 +95,8 @@ public class StorageNetwork { public void setRedstoneMode(RedstoneMode mode) { this.redstoneMode = mode; + + markDirty(); } public EnergyStorage getEnergy() { @@ -101,6 +111,23 @@ public class StorageNetwork { return pos; } + public void setWorld(World world) { + this.world = world; + this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE); + + for (BlockPos machine : machinesToLoad) { + TileEntity tile = world.getTileEntity(machine); + + if (tile instanceof TileMachine) { + ((TileMachine) tile).forceConnect(this); + + machines.add((TileMachine) tile); + } + } + + ((TileController) world.getTileEntity(pos)).setNetwork(this); + } + public World getWorld() { return world; } @@ -196,10 +223,14 @@ public class StorageNetwork { public void addMachine(TileMachine machine) { machinesToAdd.add(machine); + + markDirty(); } public void removeMachine(TileMachine machine) { machinesToRemove.add(machine); + + markDirty(); } public StorageHandler getStorageHandler() { @@ -232,10 +263,14 @@ public class StorageNetwork { public void addCraftingTask(ICraftingTask task) { craftingTasksToAdd.add(task); + + markDirty(); } public void addCraftingTaskAsLast(ICraftingTask task) { craftingTasksToAddAsLast.add(task); + + markDirty(); } public ICraftingTask createCraftingTask(CraftingPattern pattern) { @@ -248,6 +283,8 @@ public class StorageNetwork { public void cancelCraftingTask(ICraftingTask task) { craftingTasksToCancel.add(task); + + markDirty(); } public List getPatterns() { @@ -514,34 +551,15 @@ public class StorageNetwork { return null; } - public NBTTagCompound write(NBTTagCompound tag) { - energy.writeToNBT(tag); + public void readFromNBT(NBTTagCompound tag) { + energy.readFromNBT(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); + if (tag.hasKey(RedstoneMode.NBT)) { + redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT)); } - tag.setTag(NBT_CRAFTING_TASKS, list); - - return tag; - } - - - public void read(NBTTagCompound nbt) { - energy.readFromNBT(nbt); - - if (nbt.hasKey(RedstoneMode.NBT)) { - redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT)); - } - - if (nbt.hasKey(NBT_CRAFTING_TASKS)) { - NBTTagList taskList = nbt.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND); + 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); @@ -560,5 +578,47 @@ public class StorageNetwork { } } } + + if (tag.hasKey("Machines")) { + NBTTagList machinesTag = tag.getTagList("Machines", Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < machinesTag.tagCount(); ++i) { + NBTTagCompound coords = machinesTag.getCompoundTagAt(i); + + machinesToLoad.add(new BlockPos(coords.getInteger("X"), coords.getInteger("Y"), coords.getInteger("Z"))); + } + } + } + + 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 machinesTag = new NBTTagList(); + for (TileMachine machine : machines) { + NBTTagCompound coords = new NBTTagCompound(); + coords.setInteger("X", machine.getPos().getX()); + coords.setInteger("Y", machine.getPos().getY()); + coords.setInteger("Z", machine.getPos().getZ()); + machinesTag.appendTag(coords); + } + tag.setTag("Machines", machinesTag); + + return tag; + } + + public void markDirty() { + StorageNetworkSavedData.get(world).markDirty(); } } diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java new file mode 100755 index 000000000..5854814f5 --- /dev/null +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkEventHandler.java @@ -0,0 +1,26 @@ +package refinedstorage.api.storagenet; + +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class StorageNetworkEventHandler { + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent e) { + // @todo: !!! + if (e.world.provider.getDimension() == 0) { + for (StorageNetwork network : StorageNetworkRegistry.NETWORKS.values()) { + if (network.getWorld() == null) { + network.setWorld(e.world); + } + + network.update(); + } + } + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load e) { + StorageNetworkSavedData.get(e.getWorld()); + } +} diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java index e900af1b2..54d4729b4 100755 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkRegistry.java @@ -6,5 +6,10 @@ import java.util.HashMap; import java.util.Map; public class StorageNetworkRegistry { + // @todo: handle multiple dims public static final Map NETWORKS = new HashMap(); + + public static void addStorageNetwork(StorageNetwork network) { + NETWORKS.put(network.getPos(), network); + } } diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkSavedData.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkSavedData.java new file mode 100755 index 000000000..0ae388173 --- /dev/null +++ b/src/main/java/refinedstorage/api/storagenet/StorageNetworkSavedData.java @@ -0,0 +1,61 @@ +package refinedstorage.api.storagenet; + +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; + +public class StorageNetworkSavedData extends WorldSavedData { + public static final String NBT_STORAGE_NETWORKS = "StorageNetworks"; + + public StorageNetworkSavedData(String name) { + super(name); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + NBTTagList networks = tag.getTagList(NBT_STORAGE_NETWORKS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < networks.tagCount(); ++i) { + NBTTagCompound networkTag = networks.getCompoundTagAt(i); + + BlockPos pos = new BlockPos(networkTag.getInteger("X"), networkTag.getInteger("Y"), networkTag.getInteger("Z")); + + StorageNetwork network = new StorageNetwork(pos); + network.readFromNBT(networkTag.getCompoundTag("Data")); + + StorageNetworkRegistry.addStorageNetwork(network); + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + NBTTagList networks = new NBTTagList(); + + for (StorageNetwork network : StorageNetworkRegistry.NETWORKS.values()) { + NBTTagCompound networkTag = new NBTTagCompound(); + networkTag.setInteger("X", network.getPos().getX()); + networkTag.setInteger("Y", network.getPos().getY()); + networkTag.setInteger("Z", network.getPos().getZ()); + networkTag.setTag("Data", network.writeToNBT(new NBTTagCompound())); + networks.appendTag(networkTag); + } + + tag.setTag(NBT_STORAGE_NETWORKS, networks); + + return tag; + } + + public static StorageNetworkSavedData get(World world) { + StorageNetworkSavedData instance = (StorageNetworkSavedData) world.getMapStorage().getOrLoadData(StorageNetworkSavedData.class, "RSStorageNetworks"); + + if (instance == null) { + instance = new StorageNetworkSavedData("RSStorageNetworks"); + world.getMapStorage().setData("RSStorageNetworks", instance); + } + + return instance; + } +} diff --git a/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java b/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java deleted file mode 100755 index 8c7becf35..000000000 --- a/src/main/java/refinedstorage/api/storagenet/StorageNetworkTickHandler.java +++ /dev/null @@ -1,13 +0,0 @@ -package refinedstorage.api.storagenet; - -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -public class StorageNetworkTickHandler { - @SubscribeEvent - public void onServerTick(TickEvent.ServerTickEvent e) { - for (StorageNetwork network : StorageNetworkRegistry.NETWORKS.values()) { - network.update(); - } - } -} diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index b3f43cd77..3b11f3264 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -92,7 +92,7 @@ public class BlockController extends BlockBase { @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { if (!world.isRemote) { - StorageNetwork network = new StorageNetwork(world, pos, (EnumControllerType) state.getValue(TYPE)); + StorageNetwork network = new StorageNetwork(pos, world); NBTTagCompound tag = itemStack.getTagCompound(); @@ -100,7 +100,7 @@ public class BlockController extends BlockBase { network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false); } - StorageNetworkRegistry.NETWORKS.put(pos, network); + StorageNetworkRegistry.addStorageNetwork(network); ((TileController) world.getTileEntity(pos)).setNetwork(network); } diff --git a/src/main/java/refinedstorage/network/MessageGridStoragePull.java b/src/main/java/refinedstorage/network/MessageGridStoragePull.java index f0e7e8398..4e5d2d324 100755 --- a/src/main/java/refinedstorage/network/MessageGridStoragePull.java +++ b/src/main/java/refinedstorage/network/MessageGridStoragePull.java @@ -2,10 +2,10 @@ package refinedstorage.network; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.api.storagenet.StorageNetwork; -import refinedstorage.api.storagenet.StorageNetworkRegistry; +import refinedstorage.tile.grid.TileGrid; public class MessageGridStoragePull extends MessageHandlerPlayerToServer implements IMessage { private int x; @@ -45,10 +45,10 @@ public class MessageGridStoragePull extends MessageHandlerPlayerToServer