WIP saving stuff

This commit is contained in:
Raoul Van den Berge
2016-06-19 23:42:14 +02:00
parent 209d603c62
commit 76c708e57d
10 changed files with 195 additions and 51 deletions

View File

@@ -6,6 +6,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
@@ -20,6 +21,7 @@ import refinedstorage.autocrafting.CraftingPattern;
import refinedstorage.autocrafting.task.BasicCraftingTask; import refinedstorage.autocrafting.task.BasicCraftingTask;
import refinedstorage.autocrafting.task.ICraftingTask; import refinedstorage.autocrafting.task.ICraftingTask;
import refinedstorage.autocrafting.task.ProcessingCraftingTask; import refinedstorage.autocrafting.task.ProcessingCraftingTask;
import refinedstorage.block.BlockController;
import refinedstorage.block.EnumControllerType; import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemPattern;
@@ -29,6 +31,7 @@ import refinedstorage.tile.TileMachine;
import refinedstorage.tile.TileWirelessTransmitter; import refinedstorage.tile.TileWirelessTransmitter;
import refinedstorage.tile.config.RedstoneMode; import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.controller.StorageHandler; import refinedstorage.tile.controller.StorageHandler;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.controller.WirelessGridHandler; import refinedstorage.tile.controller.WirelessGridHandler;
import java.util.*; import java.util.*;
@@ -50,6 +53,7 @@ public class StorageNetwork {
private List<TileMachine> machines = new ArrayList<TileMachine>(); private List<TileMachine> machines = new ArrayList<TileMachine>();
private List<TileMachine> machinesToAdd = new ArrayList<TileMachine>(); private List<TileMachine> machinesToAdd = new ArrayList<TileMachine>();
private List<BlockPos> machinesToLoad = new ArrayList<BlockPos>();
private List<TileMachine> machinesToRemove = new ArrayList<TileMachine>(); private List<TileMachine> machinesToRemove = new ArrayList<TileMachine>();
private List<CraftingPattern> patterns = new ArrayList<CraftingPattern>(); private List<CraftingPattern> patterns = new ArrayList<CraftingPattern>();
@@ -75,10 +79,14 @@ public class StorageNetwork {
private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
public StorageNetwork(World world, BlockPos pos, EnumControllerType type) { public StorageNetwork(BlockPos pos, World world) {
this.world = world; this.pos = pos;
setWorld(world);
}
public StorageNetwork(BlockPos pos) {
this.pos = pos; this.pos = pos;
this.type = type;
} }
public RedstoneMode getRedstoneMode() { public RedstoneMode getRedstoneMode() {
@@ -87,6 +95,8 @@ public class StorageNetwork {
public void setRedstoneMode(RedstoneMode mode) { public void setRedstoneMode(RedstoneMode mode) {
this.redstoneMode = mode; this.redstoneMode = mode;
markDirty();
} }
public EnergyStorage getEnergy() { public EnergyStorage getEnergy() {
@@ -101,6 +111,23 @@ public class StorageNetwork {
return pos; 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() { public World getWorld() {
return world; return world;
} }
@@ -196,10 +223,14 @@ public class StorageNetwork {
public void addMachine(TileMachine machine) { public void addMachine(TileMachine machine) {
machinesToAdd.add(machine); machinesToAdd.add(machine);
markDirty();
} }
public void removeMachine(TileMachine machine) { public void removeMachine(TileMachine machine) {
machinesToRemove.add(machine); machinesToRemove.add(machine);
markDirty();
} }
public StorageHandler getStorageHandler() { public StorageHandler getStorageHandler() {
@@ -232,10 +263,14 @@ public class StorageNetwork {
public void addCraftingTask(ICraftingTask task) { public void addCraftingTask(ICraftingTask task) {
craftingTasksToAdd.add(task); craftingTasksToAdd.add(task);
markDirty();
} }
public void addCraftingTaskAsLast(ICraftingTask task) { public void addCraftingTaskAsLast(ICraftingTask task) {
craftingTasksToAddAsLast.add(task); craftingTasksToAddAsLast.add(task);
markDirty();
} }
public ICraftingTask createCraftingTask(CraftingPattern pattern) { public ICraftingTask createCraftingTask(CraftingPattern pattern) {
@@ -248,6 +283,8 @@ public class StorageNetwork {
public void cancelCraftingTask(ICraftingTask task) { public void cancelCraftingTask(ICraftingTask task) {
craftingTasksToCancel.add(task); craftingTasksToCancel.add(task);
markDirty();
} }
public List<CraftingPattern> getPatterns() { public List<CraftingPattern> getPatterns() {
@@ -514,34 +551,15 @@ public class StorageNetwork {
return null; return null;
} }
public NBTTagCompound write(NBTTagCompound tag) { public void readFromNBT(NBTTagCompound tag) {
energy.writeToNBT(tag); energy.readFromNBT(tag);
tag.setInteger(RedstoneMode.NBT, redstoneMode.id); if (tag.hasKey(RedstoneMode.NBT)) {
redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT));
NBTTagList list = new NBTTagList();
for (ICraftingTask task : craftingTasks) {
NBTTagCompound taskTag = new NBTTagCompound();
task.writeToNBT(taskTag);
list.appendTag(taskTag);
} }
tag.setTag(NBT_CRAFTING_TASKS, list); if (tag.hasKey(NBT_CRAFTING_TASKS)) {
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
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);
for (int i = 0; i < taskList.tagCount(); ++i) { for (int i = 0; i < taskList.tagCount(); ++i) {
NBTTagCompound taskTag = taskList.getCompoundTagAt(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();
} }
} }

View File

@@ -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());
}
}

View File

@@ -6,5 +6,10 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class StorageNetworkRegistry { public class StorageNetworkRegistry {
// @todo: handle multiple dims
public static final Map<BlockPos, StorageNetwork> NETWORKS = new HashMap<BlockPos, StorageNetwork>(); public static final Map<BlockPos, StorageNetwork> NETWORKS = new HashMap<BlockPos, StorageNetwork>();
public static void addStorageNetwork(StorageNetwork network) {
NETWORKS.put(network.getPos(), network);
}
} }

View File

@@ -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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -92,7 +92,7 @@ public class BlockController extends BlockBase {
@Override @Override
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) { public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack itemStack) {
if (!world.isRemote) { if (!world.isRemote) {
StorageNetwork network = new StorageNetwork(world, pos, (EnumControllerType) state.getValue(TYPE)); StorageNetwork network = new StorageNetwork(pos, world);
NBTTagCompound tag = itemStack.getTagCompound(); NBTTagCompound tag = itemStack.getTagCompound();
@@ -100,7 +100,7 @@ public class BlockController extends BlockBase {
network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false); network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false);
} }
StorageNetworkRegistry.NETWORKS.put(pos, network); StorageNetworkRegistry.addStorageNetwork(network);
((TileController) world.getTileEntity(pos)).setNetwork(network); ((TileController) world.getTileEntity(pos)).setNetwork(network);
} }

View File

@@ -2,10 +2,10 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.storagenet.StorageNetwork; import refinedstorage.tile.grid.TileGrid;
import refinedstorage.api.storagenet.StorageNetworkRegistry;
public class MessageGridStoragePull extends MessageHandlerPlayerToServer<MessageGridStoragePull> implements IMessage { public class MessageGridStoragePull extends MessageHandlerPlayerToServer<MessageGridStoragePull> implements IMessage {
private int x; private int x;
@@ -45,10 +45,10 @@ public class MessageGridStoragePull extends MessageHandlerPlayerToServer<Message
@Override @Override
public void handle(MessageGridStoragePull message, EntityPlayerMP player) { public void handle(MessageGridStoragePull message, EntityPlayerMP player) {
StorageNetwork network = StorageNetworkRegistry.NETWORKS.get(new BlockPos(message.x, message.y, message.z)); TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z));
if (network != null && network.canRun()) { if (tile instanceof TileGrid && ((TileGrid) tile).isConnected()) {
network.getStorageHandler().onPull(message.id, message.flags, player); ((TileGrid) tile).getNetwork().getStorageHandler().onPull(message.id, message.flags, player);
} }
} }
} }

View File

@@ -20,7 +20,7 @@ import refinedstorage.RefinedStorageItems;
import refinedstorage.api.solderer.SoldererRecipeBasic; import refinedstorage.api.solderer.SoldererRecipeBasic;
import refinedstorage.api.solderer.SoldererRegistry; import refinedstorage.api.solderer.SoldererRegistry;
import refinedstorage.api.storage.NBTStorage; import refinedstorage.api.storage.NBTStorage;
import refinedstorage.api.storagenet.StorageNetworkTickHandler; import refinedstorage.api.storagenet.StorageNetworkEventHandler;
import refinedstorage.block.BlockBase; import refinedstorage.block.BlockBase;
import refinedstorage.block.EnumControllerType; import refinedstorage.block.EnumControllerType;
import refinedstorage.block.EnumGridType; import refinedstorage.block.EnumGridType;
@@ -485,7 +485,7 @@ public class CommonProxy {
} }
public void init(FMLInitializationEvent e) { public void init(FMLInitializationEvent e) {
MinecraftForge.EVENT_BUS.register(new StorageNetworkTickHandler()); MinecraftForge.EVENT_BUS.register(new StorageNetworkEventHandler());
} }
public void postInit(FMLPostInitializationEvent e) { public void postInit(FMLPostInitializationEvent e) {

View File

@@ -97,6 +97,11 @@ public abstract class TileMachine extends TileBase implements ISynchronizedConta
return true; return true;
} }
public void forceConnect(StorageNetwork network) {
this.network = network;
this.connected = true;
}
public void onDisconnected(World world) { public void onDisconnected(World world) {
this.connected = false; this.connected = false;

View File

@@ -40,7 +40,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
public NBTTagCompound writeUpdate(NBTTagCompound tag) { public NBTTagCompound writeUpdate(NBTTagCompound tag) {
super.writeUpdate(tag); super.writeUpdate(tag);
tag.setInteger(StorageNetwork.NBT_ENERGY, network.getEnergy().getEnergyStored()); tag.setInteger(StorageNetwork.NBT_ENERGY, network != null ? network.getEnergy().getEnergyStored() : 0);
return tag; return tag;
} }