Removing of storage networks

This commit is contained in:
Raoul Van den Berge
2016-06-20 11:47:09 +02:00
parent 5460dbf76f
commit 3ee2b98658
5 changed files with 62 additions and 39 deletions

View File

@@ -31,7 +31,6 @@ 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.*;
@@ -82,7 +81,7 @@ public class StorageNetwork {
public StorageNetwork(BlockPos pos, World world) { public StorageNetwork(BlockPos pos, World world) {
this.pos = pos; this.pos = pos;
setWorld(world); onAdded(world);
} }
public StorageNetwork(BlockPos pos) { public StorageNetwork(BlockPos pos) {
@@ -111,23 +110,6 @@ 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;
} }
@@ -155,6 +137,9 @@ public class StorageNetwork {
syncMachines(); syncMachines();
} }
// @todo: If the chunk unloads, and we come back to the chunk
// the machine tile will be reset to a new tile instance and nothing will work
for (ICraftingTask taskToCancel : craftingTasksToCancel) { for (ICraftingTask taskToCancel : craftingTasksToCancel) {
taskToCancel.onCancelled(this); taskToCancel.onCancelled(this);
} }
@@ -245,7 +230,7 @@ public class StorageNetwork {
return wirelessGridRange; return wirelessGridRange;
} }
private void disconnectAll() { public void disconnectAll() {
for (TileMachine machine : machines) { for (TileMachine machine : machines) {
machine.onDisconnected(world); machine.onDisconnected(world);
} }
@@ -253,6 +238,25 @@ public class StorageNetwork {
machines.clear(); machines.clear();
} }
public void onRemoved() {
markDirty();
}
public void onAdded(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);
}
}
}
public List<ItemStack> getItems() { public List<ItemStack> getItems() {
return items; return items;
} }

View File

@@ -15,7 +15,7 @@ public class StorageNetworkEventHandler {
if (networks != null) { if (networks != null) {
for (StorageNetwork network : networks.values()) { for (StorageNetwork network : networks.values()) {
if (network.getWorld() == null) { if (network.getWorld() == null) {
network.setWorld(e.world); network.onAdded(e.world);
} }
network.update(); network.update();

View File

@@ -16,6 +16,13 @@ public class StorageNetworkRegistry {
NETWORKS.get(dimension).put(network.getPos(), network); NETWORKS.get(dimension).put(network.getPos(), network);
} }
public static void remove(BlockPos pos, int dimension) {
if (get(dimension) != null) {
get(dimension).get(pos).onRemoved();
get(dimension).remove(pos);
}
}
public static StorageNetwork get(BlockPos pos, int dimension) { public static StorageNetwork get(BlockPos pos, int dimension) {
return get(dimension) == null ? null : get(dimension).get(pos); return get(dimension) == null ? null : get(dimension).get(pos);
} }

View File

@@ -90,22 +90,29 @@ 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 stack) {
if (!world.isRemote) { if (!world.isRemote) {
StorageNetwork network = new StorageNetwork(pos, world); StorageNetwork network = new StorageNetwork(pos, world);
NBTTagCompound tag = itemStack.getTagCompound(); NBTTagCompound tag = stack.getTagCompound();
if (tag != null && tag.hasKey(StorageNetwork.NBT_ENERGY)) { if (tag != null && tag.hasKey(StorageNetwork.NBT_ENERGY)) {
network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false); network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false);
} }
StorageNetworkRegistry.add(network, world.provider.getDimension()); StorageNetworkRegistry.add(network, world.provider.getDimension());
((TileController) world.getTileEntity(pos)).setNetwork(network);
} }
super.onBlockPlacedBy(world, pos, state, player, itemStack); super.onBlockPlacedBy(world, pos, state, player, stack);
}
@Override
public void breakBlock(World world, BlockPos pos, IBlockState state) {
if (!world.isRemote) {
StorageNetworkRegistry.remove(pos, world.provider.getDimension());
}
super.breakBlock(world, pos, state);
} }
@Override @Override

View File

@@ -10,6 +10,7 @@ import net.minecraft.util.EnumFacing;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.ByteBufUtils;
import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageBlocks;
import refinedstorage.api.storagenet.StorageNetwork; import refinedstorage.api.storagenet.StorageNetwork;
import refinedstorage.api.storagenet.StorageNetworkRegistry;
import refinedstorage.block.BlockController; import refinedstorage.block.BlockController;
import refinedstorage.block.EnumControllerType; import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerController; import refinedstorage.container.ContainerController;
@@ -32,15 +33,19 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
private EnumControllerType type; private EnumControllerType type;
private RedstoneMode redstoneMode; private RedstoneMode redstoneMode;
public void setNetwork(StorageNetwork network) { public StorageNetwork getNetwork() {
this.network = network; if (network == null) {
network = StorageNetworkRegistry.get(pos, worldObj.provider.getDimension());
}
return network;
} }
@Override @Override
public NBTTagCompound writeUpdate(NBTTagCompound tag) { public NBTTagCompound writeUpdate(NBTTagCompound tag) {
super.writeUpdate(tag); super.writeUpdate(tag);
tag.setInteger(StorageNetwork.NBT_ENERGY, network != null ? network.getEnergy().getEnergyStored() : 0); tag.setInteger(StorageNetwork.NBT_ENERGY, getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
return tag; return tag;
} }
@@ -54,16 +59,16 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override @Override
public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) {
return network.getEnergy().receiveEnergy(maxReceive, simulate); return getNetwork().getEnergy().receiveEnergy(maxReceive, simulate);
} }
@Override @Override
public int getEnergyStored(EnumFacing from) { public int getEnergyStored(EnumFacing from) {
return network.getEnergy().getEnergyStored(); return getNetwork().getEnergy().getEnergyStored();
} }
public int getEnergyScaled(int i) { public int getEnergyScaled(int i) {
float stored = worldObj.isRemote ? energy : network.getEnergy().getEnergyStored(); float stored = worldObj.isRemote ? energy : getNetwork().getEnergy().getEnergyStored();
float max = StorageNetwork.ENERGY_CAPACITY; float max = StorageNetwork.ENERGY_CAPACITY;
return (int) (stored / max * (float) i); return (int) (stored / max * (float) i);
@@ -71,7 +76,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override @Override
public int getMaxEnergyStored(EnumFacing from) { public int getMaxEnergyStored(EnumFacing from) {
return network.getEnergy().getMaxEnergyStored(); return getNetwork().getEnergy().getMaxEnergyStored();
} }
@Override @Override
@@ -81,12 +86,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override @Override
public RedstoneMode getRedstoneMode() { public RedstoneMode getRedstoneMode() {
return worldObj.isRemote ? redstoneMode : network.getRedstoneMode(); return worldObj.isRemote ? redstoneMode : getNetwork().getRedstoneMode();
} }
@Override @Override
public void setRedstoneMode(RedstoneMode mode) { public void setRedstoneMode(RedstoneMode mode) {
network.setRedstoneMode(mode); getNetwork().setRedstoneMode(mode);
} }
public List<ClientMachine> getClientMachines() { public List<ClientMachine> getClientMachines() {
@@ -133,14 +138,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override @Override
public void writeContainerData(ByteBuf buf) { public void writeContainerData(ByteBuf buf) {
buf.writeInt(network.getEnergy().getEnergyStored()); buf.writeInt(getNetwork().getEnergy().getEnergyStored());
buf.writeInt(network.getEnergyUsage()); buf.writeInt(getNetwork().getEnergyUsage());
buf.writeInt(network.getRedstoneMode().id); buf.writeInt(getNetwork().getRedstoneMode().id);
List<ClientMachine> m = new ArrayList<ClientMachine>(); List<ClientMachine> m = new ArrayList<ClientMachine>();
for (TileMachine machine : network.getMachines()) { for (TileMachine machine : getNetwork().getMachines()) {
if (machine.canUpdate()) { if (machine.canUpdate()) {
IBlockState state = worldObj.getBlockState(machine.getPos()); IBlockState state = worldObj.getBlockState(machine.getPos());