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.config.RedstoneMode;
import refinedstorage.tile.controller.StorageHandler;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.controller.WirelessGridHandler;
import java.util.*;
@@ -82,7 +81,7 @@ public class StorageNetwork {
public StorageNetwork(BlockPos pos, World world) {
this.pos = pos;
setWorld(world);
onAdded(world);
}
public StorageNetwork(BlockPos pos) {
@@ -111,23 +110,6 @@ 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;
}
@@ -155,6 +137,9 @@ public class StorageNetwork {
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) {
taskToCancel.onCancelled(this);
}
@@ -245,7 +230,7 @@ public class StorageNetwork {
return wirelessGridRange;
}
private void disconnectAll() {
public void disconnectAll() {
for (TileMachine machine : machines) {
machine.onDisconnected(world);
}
@@ -253,6 +238,25 @@ public class StorageNetwork {
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() {
return items;
}

View File

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

View File

@@ -16,6 +16,13 @@ public class StorageNetworkRegistry {
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) {
return get(dimension) == null ? null : get(dimension).get(pos);
}

View File

@@ -90,22 +90,29 @@ public class BlockController extends BlockBase {
}
@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) {
StorageNetwork network = new StorageNetwork(pos, world);
NBTTagCompound tag = itemStack.getTagCompound();
NBTTagCompound tag = stack.getTagCompound();
if (tag != null && tag.hasKey(StorageNetwork.NBT_ENERGY)) {
network.getEnergy().receiveEnergy(tag.getInteger(StorageNetwork.NBT_ENERGY), false);
}
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

View File

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