Improve save stuff
This commit is contained in:
@@ -3,7 +3,7 @@ package com.jaquadro.minecraft.storagedrawers.api.registry;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Ingredient handlers are used to get ItemStacks from ingredients in custom IRecipe implementations. If you have
|
||||
* Ingredient handlers are used to getOrLoad ItemStacks from ingredients in custom IRecipe implementations. If you have
|
||||
* registered an IRecipeHandler that returns lists of objects that aren't ItemStacks, then you will need to
|
||||
* implement an ingredient handler for those objects.
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,7 @@ public interface IRecipeHandler {
|
||||
/**
|
||||
* Get the recipe ingredient list as an array of objects (usually used for shaped recipes).
|
||||
* If your array does not contain ItemStack objects, you will need to register an {@link IIngredientHandler} to
|
||||
* get an ItemStack from them.
|
||||
* getOrLoad an ItemStack from them.
|
||||
* <p>
|
||||
* If you would prefer to return a List, return null in this method and implement {@link #getInputAsList}.
|
||||
*
|
||||
@@ -24,7 +24,7 @@ public interface IRecipeHandler {
|
||||
/**
|
||||
* Get the recipe ingredient list as a list of objects (usually used for shapeless recipes).
|
||||
* If your list does not contain ItemStack objects, you will need to register an {@link IIngredientHandler} to
|
||||
* get an ItemStack from them.
|
||||
* getOrLoad an ItemStack from them.
|
||||
* <p>
|
||||
* If you would prefer to return an array, return null in this method and implement {@link #getInputAsArray}.
|
||||
*
|
||||
|
||||
@@ -6,7 +6,7 @@ import net.minecraft.world.World;
|
||||
/**
|
||||
* Represents a slave or machine in the storage network.
|
||||
*
|
||||
* Make sure you implement {@link Object#hashCode()} or the slave will not get properly removed or added by the storage master.
|
||||
* Make sure you implement {@link Object#hashCode()} or the slave will not getOrLoad properly removed or added by the storage master.
|
||||
* Typically the hash code from {@link INetworkSlave#getPosition()} is used.
|
||||
*/
|
||||
public interface INetworkSlave {
|
||||
@@ -65,7 +65,7 @@ public interface INetworkSlave {
|
||||
boolean isConnected();
|
||||
|
||||
/**
|
||||
* @return If {@link INetworkSlave#canUpdate()} can get called. Typically checks for connection and redstone mode.
|
||||
* @return If {@link INetworkSlave#canUpdate()} can getOrLoad called. Typically checks for connection and redstone mode.
|
||||
*/
|
||||
boolean canUpdate();
|
||||
|
||||
|
||||
@@ -40,6 +40,10 @@ public class NetworkMaster {
|
||||
|
||||
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 StorageHandler storageHandler = new StorageHandler(this);
|
||||
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
|
||||
@@ -446,7 +450,7 @@ public class NetworkMaster {
|
||||
|
||||
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
|
||||
// We re-getOrLoad 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);
|
||||
@@ -589,13 +593,13 @@ public class NetworkMaster {
|
||||
}
|
||||
}
|
||||
|
||||
if (tag.hasKey("Machines")) {
|
||||
NBTTagList machinesTag = tag.getTagList("Machines", Constants.NBT.TAG_COMPOUND);
|
||||
if (tag.hasKey(NBT_SLAVES)) {
|
||||
NBTTagList slavesTag = tag.getTagList(NBT_SLAVES, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
for (int i = 0; i < machinesTag.tagCount(); ++i) {
|
||||
NBTTagCompound coords = machinesTag.getCompoundTagAt(i);
|
||||
for (int i = 0; i < slavesTag.tagCount(); ++i) {
|
||||
NBTTagCompound slave = slavesTag.getCompoundTagAt(i);
|
||||
|
||||
slavesToLoad.add(new BlockPos(coords.getInteger("X"), coords.getInteger("Y"), coords.getInteger("Z")));
|
||||
slavesToLoad.add(new BlockPos(slave.getInteger(NBT_SLAVE_X), slave.getInteger(NBT_SLAVE_Y), slave.getInteger(NBT_SLAVE_Z)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -615,20 +619,24 @@ public class NetworkMaster {
|
||||
|
||||
tag.setTag(NBT_CRAFTING_TASKS, list);
|
||||
|
||||
NBTTagList machinesTag = new NBTTagList();
|
||||
NBTTagList slavesTag = new NBTTagList();
|
||||
|
||||
for (INetworkSlave slave : slaves) {
|
||||
NBTTagCompound coords = new NBTTagCompound();
|
||||
coords.setInteger("X", slave.getPosition().getX());
|
||||
coords.setInteger("Y", slave.getPosition().getY());
|
||||
coords.setInteger("Z", slave.getPosition().getZ());
|
||||
machinesTag.appendTag(coords);
|
||||
NBTTagCompound slaveTag = new NBTTagCompound();
|
||||
|
||||
slaveTag.setInteger(NBT_SLAVE_X, slave.getPosition().getX());
|
||||
slaveTag.setInteger(NBT_SLAVE_Y, slave.getPosition().getY());
|
||||
slaveTag.setInteger(NBT_SLAVE_Z, slave.getPosition().getZ());
|
||||
|
||||
slavesTag.appendTag(slaveTag);
|
||||
}
|
||||
tag.setTag("Machines", machinesTag);
|
||||
|
||||
tag.setTag(NBT_SLAVES, slavesTag);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
public void markDirty() {
|
||||
NetworkMasterSavedData.get(world).markDirty();
|
||||
NetworkMasterSavedData.getOrLoad(world).markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,6 @@ public class NetworkMasterEventHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWorldLoad(WorldEvent.Load e) {
|
||||
NetworkMasterSavedData.get(e.getWorld());
|
||||
NetworkMasterSavedData.getOrLoad(e.getWorld());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,13 @@ import net.minecraftforge.common.util.Constants;
|
||||
import java.util.Map;
|
||||
|
||||
public class NetworkMasterSavedData extends WorldSavedData {
|
||||
public static final String NBT_STORAGE_NETWORKS = "StorageNetworks";
|
||||
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);
|
||||
@@ -18,17 +24,16 @@ public class NetworkMasterSavedData extends WorldSavedData {
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tag) {
|
||||
NBTTagList networks = tag.getTagList(NBT_STORAGE_NETWORKS, Constants.NBT.TAG_COMPOUND);
|
||||
NBTTagList networks = tag.getTagList(NBT_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"));
|
||||
NetworkMaster network = new NetworkMaster(new BlockPos(networkTag.getInteger(NBT_NETWORK_X), networkTag.getInteger(NBT_NETWORK_Y), networkTag.getInteger(NBT_NETWORK_Z)));
|
||||
|
||||
NetworkMaster network = new NetworkMaster(pos);
|
||||
network.readFromNBT(networkTag.getCompoundTag("Data"));
|
||||
network.readFromNBT(networkTag.getCompoundTag(NBT_NETWORK_DATA));
|
||||
|
||||
NetworkMasterRegistry.add(network, networkTag.getInteger("Dim"));
|
||||
NetworkMasterRegistry.add(network, networkTag.getInteger(NBT_NETWORK_DIM));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,26 +44,30 @@ public class NetworkMasterSavedData extends WorldSavedData {
|
||||
for (Map.Entry<Integer, Map<BlockPos, NetworkMaster>> entry : NetworkMasterRegistry.NETWORKS.entrySet()) {
|
||||
for (NetworkMaster network : entry.getValue().values()) {
|
||||
NBTTagCompound networkTag = new NBTTagCompound();
|
||||
networkTag.setInteger("X", network.getPos().getX());
|
||||
networkTag.setInteger("Y", network.getPos().getY());
|
||||
networkTag.setInteger("Z", network.getPos().getZ());
|
||||
networkTag.setInteger("Dim", entry.getKey());
|
||||
networkTag.setTag("Data", network.writeToNBT(new NBTTagCompound()));
|
||||
|
||||
networkTag.setInteger(NBT_NETWORK_X, network.getPos().getX());
|
||||
networkTag.setInteger(NBT_NETWORK_Y, network.getPos().getY());
|
||||
networkTag.setInteger(NBT_NETWORK_Z, network.getPos().getZ());
|
||||
networkTag.setInteger(NBT_NETWORK_DIM, entry.getKey());
|
||||
|
||||
networkTag.setTag(NBT_NETWORK_DATA, network.writeToNBT(new NBTTagCompound()));
|
||||
|
||||
networks.appendTag(networkTag);
|
||||
}
|
||||
}
|
||||
|
||||
tag.setTag(NBT_STORAGE_NETWORKS, networks);
|
||||
tag.setTag(NBT_NETWORKS, networks);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
public static NetworkMasterSavedData get(World world) {
|
||||
NetworkMasterSavedData instance = (NetworkMasterSavedData) world.getMapStorage().getOrLoadData(NetworkMasterSavedData.class, "RSStorageNetworks");
|
||||
public static NetworkMasterSavedData getOrLoad(World world) {
|
||||
NetworkMasterSavedData instance = (NetworkMasterSavedData) world.getMapStorage().getOrLoadData(NetworkMasterSavedData.class, ID);
|
||||
|
||||
if (instance == null) {
|
||||
instance = new NetworkMasterSavedData("RSStorageNetworks");
|
||||
world.getMapStorage().setData("RSStorageNetworks", instance);
|
||||
instance = new NetworkMasterSavedData(ID);
|
||||
|
||||
world.getMapStorage().setData(ID, instance);
|
||||
}
|
||||
|
||||
return instance;
|
||||
|
||||
@@ -6,7 +6,7 @@ import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.api.network.NetworkMaster;
|
||||
import refinedstorage.container.ContainerController;
|
||||
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
|
||||
import refinedstorage.tile.controller.ClientMachine;
|
||||
import refinedstorage.tile.controller.ClientSlave;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
|
||||
import java.util.List;
|
||||
@@ -63,28 +63,28 @@ public class GuiController extends GuiBase {
|
||||
|
||||
RenderHelper.enableGUIStandardItemLighting();
|
||||
|
||||
List<ClientMachine> machines = controller.getClientMachines();
|
||||
List<ClientSlave> slaves = controller.getClientSlaves();
|
||||
|
||||
ClientMachine machineHovering = null;
|
||||
ClientSlave slaveHovering = null;
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (slot < machines.size()) {
|
||||
ClientMachine machine = machines.get(slot);
|
||||
if (slot < slaves.size()) {
|
||||
ClientSlave slave = slaves.get(slot);
|
||||
|
||||
drawItem(x, y + 5, machine.stack);
|
||||
drawItem(x, y + 5, slave.stack);
|
||||
|
||||
float scale = 0.5f;
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.scale(scale, scale, 1);
|
||||
|
||||
drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 1, scale), RefinedStorageUtils.calculateOffsetOnScale(y - 2, scale), machine.stack.getDisplayName());
|
||||
drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 21, scale), RefinedStorageUtils.calculateOffsetOnScale(y + 10, scale), t("gui.refinedstorage:controller.machine_amount", machine.amount));
|
||||
drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 1, scale), RefinedStorageUtils.calculateOffsetOnScale(y - 2, scale), slave.stack.getDisplayName());
|
||||
drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 21, scale), RefinedStorageUtils.calculateOffsetOnScale(y + 10, scale), t("gui.refinedstorage:controller.machine_amount", slave.amount));
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
if (inBounds(x, y, 16, 16, mouseX, mouseY)) {
|
||||
machineHovering = machine;
|
||||
slaveHovering = slave;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,8 +98,8 @@ public class GuiController extends GuiBase {
|
||||
slot++;
|
||||
}
|
||||
|
||||
if (machineHovering != null) {
|
||||
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage_minimal", machineHovering.energyUsage));
|
||||
if (slaveHovering != null) {
|
||||
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage_minimal", slaveHovering.energyUsage));
|
||||
}
|
||||
|
||||
if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) {
|
||||
@@ -112,7 +112,7 @@ public class GuiController extends GuiBase {
|
||||
}
|
||||
|
||||
private int getRows() {
|
||||
int max = (int) Math.ceil((float) controller.getClientMachines().size() / (float) 2);
|
||||
int max = (int) Math.ceil((float) controller.getClientSlaves().size() / (float) 2);
|
||||
|
||||
return max < 0 ? 0 : max;
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class TileDestructor extends TileSlave implements ICompareConfig, IModeCo
|
||||
worldObj.setBlockToAir(front);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
// We check if the controller isn't null here because when a destructor faces a machine block and removes it
|
||||
// We check if the controller isn't null here because when a destructor faces a slave block and removes it
|
||||
// it will essentially remove this block itself from the network without knowing
|
||||
if (network == null) {
|
||||
InventoryHelper.spawnItemStack(worldObj, front.getX(), front.getY(), front.getZ(), drop);
|
||||
|
||||
@@ -3,7 +3,7 @@ package refinedstorage.tile.controller;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import refinedstorage.RefinedStorageUtils;
|
||||
|
||||
public class ClientMachine {
|
||||
public class ClientSlave {
|
||||
public ItemStack stack;
|
||||
public int amount;
|
||||
public int energyUsage;
|
||||
@@ -14,11 +14,11 @@ public class ClientMachine {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(other instanceof ClientMachine)) {
|
||||
if (!(other instanceof ClientSlave)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return energyUsage == ((ClientMachine) other).energyUsage && RefinedStorageUtils.compareStack(stack, ((ClientMachine) other).stack);
|
||||
return energyUsage == ((ClientSlave) other).energyUsage && RefinedStorageUtils.compareStack(stack, ((ClientSlave) other).stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -27,7 +27,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
private NetworkMaster network;
|
||||
|
||||
// Only used client side
|
||||
private List<ClientMachine> clientMachines = new ArrayList<ClientMachine>();
|
||||
private List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
|
||||
private int energy;
|
||||
private int energyUsage;
|
||||
private EnumControllerType type;
|
||||
@@ -94,8 +94,8 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
getNetwork().setRedstoneMode(mode);
|
||||
}
|
||||
|
||||
public List<ClientMachine> getClientMachines() {
|
||||
return clientMachines;
|
||||
public List<ClientSlave> getClientSlaves() {
|
||||
return clientSlaves;
|
||||
}
|
||||
|
||||
public int getEnergy() {
|
||||
@@ -120,20 +120,21 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
this.energyUsage = buf.readInt();
|
||||
this.redstoneMode = RedstoneMode.getById(buf.readInt());
|
||||
|
||||
List<ClientMachine> machines = new ArrayList<ClientMachine>();
|
||||
List<ClientSlave> slaves = new ArrayList<ClientSlave>();
|
||||
|
||||
int size = buf.readInt();
|
||||
|
||||
for (int i = 0; i < size; ++i) {
|
||||
ClientMachine machine = new ClientMachine();
|
||||
machine.energyUsage = buf.readInt();
|
||||
machine.amount = buf.readInt();
|
||||
machine.stack = ByteBufUtils.readItemStack(buf);
|
||||
ClientSlave slave = new ClientSlave();
|
||||
|
||||
machines.add(machine);
|
||||
slave.energyUsage = buf.readInt();
|
||||
slave.amount = buf.readInt();
|
||||
slave.stack = ByteBufUtils.readItemStack(buf);
|
||||
|
||||
slaves.add(slave);
|
||||
}
|
||||
|
||||
this.clientMachines = machines;
|
||||
this.clientSlaves = slaves;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -143,37 +144,37 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
|
||||
buf.writeInt(getNetwork().getRedstoneMode().id);
|
||||
|
||||
List<ClientMachine> m = new ArrayList<ClientMachine>();
|
||||
List<ClientSlave> slaves = new ArrayList<ClientSlave>();
|
||||
|
||||
for (INetworkSlave machine : getNetwork().getSlaves()) {
|
||||
if (machine.canUpdate()) {
|
||||
IBlockState state = worldObj.getBlockState(machine.getPosition());
|
||||
for (INetworkSlave slave : getNetwork().getSlaves()) {
|
||||
if (slave.canUpdate()) {
|
||||
IBlockState state = worldObj.getBlockState(slave.getPosition());
|
||||
|
||||
ClientMachine clientMachine = new ClientMachine();
|
||||
ClientSlave clientSlave = new ClientSlave();
|
||||
|
||||
clientMachine.energyUsage = machine.getEnergyUsage();
|
||||
clientMachine.amount = 1;
|
||||
clientMachine.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 (m.contains(clientMachine)) {
|
||||
for (ClientMachine other : m) {
|
||||
if (other.equals(clientMachine)) {
|
||||
if (slaves.contains(clientSlave)) {
|
||||
for (ClientSlave other : slaves) {
|
||||
if (other.equals(clientSlave)) {
|
||||
other.amount++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m.add(clientMachine);
|
||||
slaves.add(clientSlave);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buf.writeInt(m.size());
|
||||
buf.writeInt(slaves.size());
|
||||
|
||||
for (ClientMachine machine : m) {
|
||||
buf.writeInt(machine.energyUsage);
|
||||
buf.writeInt(machine.amount);
|
||||
ByteBufUtils.writeItemStack(buf, machine.stack);
|
||||
for (ClientSlave slave : slaves) {
|
||||
buf.writeInt(slave.energyUsage);
|
||||
buf.writeInt(slave.amount);
|
||||
ByteBufUtils.writeItemStack(buf, slave.stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user