4: Move constant storage rebuilding out

This commit is contained in:
Raoul Van den Berge
2016-07-02 20:35:25 +02:00
parent f0be81f1bc
commit 0abd9cf779
10 changed files with 141 additions and 84 deletions

View File

@@ -8,7 +8,6 @@ import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.storage.CompareFlags; import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -65,11 +64,6 @@ public interface INetworkMaster {
*/ */
IGroupedStorage getStorage(); IGroupedStorage getStorage();
/**
* @return The storages connected to this network
*/
List<IStorage> getStorages();
/** /**
* @return The crafting tasks in this network, do NOT modify this list * @return The crafting tasks in this network, do NOT modify this list
*/ */

View File

@@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
import java.util.Collection; import java.util.Collection;
import java.util.List;
/** /**
* This holds all items from all the connected storages from a {@link INetworkMaster}. * This holds all items from all the connected storages from a {@link INetworkMaster}.
@@ -47,4 +48,9 @@ public interface IGroupedStorage {
* @return All stacks in this storage network * @return All stacks in this storage network
*/ */
Collection<ItemStack> getStacks(); Collection<ItemStack> getStacks();
/**
* @return The storages connected to this network
*/
List<IStorage> getStorages();
} }

View File

@@ -7,13 +7,18 @@ import net.minecraft.item.ItemStack;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkSlave;
import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
public class GroupedStorage implements IGroupedStorage { public class GroupedStorage implements IGroupedStorage {
private INetworkMaster network; private INetworkMaster network;
private List<IStorage> storages = new ArrayList<IStorage>();
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create(); private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
private boolean rebuilding; private boolean rebuilding;
@@ -25,9 +30,17 @@ public class GroupedStorage implements IGroupedStorage {
public void rebuild() { public void rebuild() {
this.rebuilding = true; this.rebuilding = true;
storages.clear();
for (INetworkSlave slave : network.getSlaves()) {
if (slave.canUpdate() && slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages);
}
}
stacks.clear(); stacks.clear();
for (IStorage storage : network.getStorages()) { for (IStorage storage : storages) {
for (ItemStack stack : storage.getItems()) { for (ItemStack stack : storage.getItems()) {
add(stack); add(stack);
} }
@@ -102,4 +115,9 @@ public class GroupedStorage implements IGroupedStorage {
public Collection<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return stacks.values(); return stacks.values();
} }
@Override
public List<IStorage> getStorages() {
return storages;
}
} }

View File

@@ -0,0 +1,9 @@
package refinedstorage.tile;
import refinedstorage.api.network.INetworkMaster;
public interface IConnectionHandler {
void onConnected(INetworkMaster network);
void onDisconnected(INetworkMaster network);
}

View File

@@ -14,6 +14,7 @@ import refinedstorage.RefinedStorageItems;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.autocrafting.ICraftingPatternContainer; import refinedstorage.api.autocrafting.ICraftingPatternContainer;
import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.container.ContainerCrafter; import refinedstorage.container.ContainerCrafter;
import refinedstorage.inventory.BasicItemHandler; import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.inventory.BasicItemValidator; import refinedstorage.inventory.BasicItemValidator;
@@ -21,7 +22,7 @@ import refinedstorage.inventory.IItemValidator;
import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemPattern;
import refinedstorage.item.ItemUpgrade; import refinedstorage.item.ItemUpgrade;
public class TileCrafter extends TileSlave implements ICraftingPatternContainer { public class TileCrafter extends TileSlave implements ICraftingPatternContainer, IConnectionHandler {
private BasicItemHandler patterns = new BasicItemHandler(9, this, new IItemValidator() { private BasicItemHandler patterns = new BasicItemHandler(9, this, new IItemValidator() {
@Override @Override
public boolean valid(ItemStack stack) { public boolean valid(ItemStack stack) {
@@ -127,4 +128,14 @@ public class TileCrafter extends TileSlave implements ICraftingPatternContainer
public boolean hasCapability(Capability<?> capability, EnumFacing facing) { public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && facing != getDirection()) || super.hasCapability(capability, facing); return (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && facing != getDirection()) || super.hasCapability(capability, facing);
} }
@Override
public void onConnected(INetworkMaster network) {
network.rebuildPatterns();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.rebuildPatterns();
}
} }

View File

@@ -13,6 +13,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageItems; import refinedstorage.RefinedStorageItems;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider; import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.storage.NBTStorage; import refinedstorage.apiimpl.storage.NBTStorage;
@@ -25,7 +26,7 @@ import refinedstorage.tile.config.*;
import java.util.List; import java.util.List;
public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
public class Storage extends NBTStorage { public class Storage extends NBTStorage {
public Storage(ItemStack disk) { public Storage(ItemStack disk) {
super(disk.getTagCompound(), EnumStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); super(disk.getTagCompound(), EnumStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this);
@@ -62,6 +63,10 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
} else { } else {
storages[slot] = new Storage(disk); storages[slot] = new Storage(disk);
} }
if (network != null) {
network.getStorage().rebuild();
}
} }
@Override @Override
@@ -304,4 +309,14 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
public boolean hasCapability(Capability<?> capability, EnumFacing facing) { public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing);
} }
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
} }

View File

@@ -23,6 +23,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
private boolean active; private boolean active;
private boolean update;
protected boolean connected; protected boolean connected;
protected INetworkMaster network; protected INetworkMaster network;
@@ -46,6 +47,19 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
if (!worldObj.isRemote) { if (!worldObj.isRemote) {
if (ticks == 0) { if (ticks == 0) {
refreshConnection(worldObj); refreshConnection(worldObj);
} else {
// @TODO: Fix updating twice on block placement
if (update != canUpdate()) {
if (network != null && this instanceof IConnectionHandler) {
if (canUpdate()) {
((IConnectionHandler) this).onConnected(network);
} else {
((IConnectionHandler) this).onDisconnected(network);
}
}
update = canUpdate();
}
} }
if (isActive()) { if (isActive()) {
@@ -165,9 +179,9 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
@Override @Override
public void setRedstoneMode(RedstoneMode mode) { public void setRedstoneMode(RedstoneMode mode) {
markDirty();
this.redstoneMode = mode; this.redstoneMode = mode;
markDirty();
} }
@Override @Override

View File

@@ -10,6 +10,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider; import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.storage.NBTStorage; import refinedstorage.apiimpl.storage.NBTStorage;
@@ -22,7 +23,7 @@ import refinedstorage.tile.config.*;
import java.util.List; import java.util.List;
public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
class Storage extends NBTStorage { class Storage extends NBTStorage {
public Storage() { public Storage() {
super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this); super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this);
@@ -256,4 +257,14 @@ public class TileStorage extends TileSlave implements IStorageProvider, IStorage
public int getCapacity() { public int getCapacity() {
return getType().getCapacity(); return getType().getCapacity();
} }
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
} }

View File

@@ -27,7 +27,6 @@ import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags; import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
import refinedstorage.apiimpl.autocrafting.CraftingPattern; import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask;
@@ -40,6 +39,7 @@ import refinedstorage.container.ContainerController;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridItems; import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.IConnectionHandler;
import refinedstorage.tile.ISynchronizedContainer; import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase; import refinedstorage.tile.TileBase;
import refinedstorage.tile.TileCrafter; import refinedstorage.tile.TileCrafter;
@@ -102,36 +102,52 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
@Override @Override
public void update() { public void update() {
if (!worldObj.isRemote) { if (!worldObj.isRemote) {
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); for (INetworkSlave slave : slavesToAdd) {
slaves.add(slave);
for (INetworkSlave newSlave : slavesToAdd) { if (slave instanceof IConnectionHandler) {
boolean found = false; ((IConnectionHandler) slave).onConnected(this);
for (int i = 0; i < slaves.size(); ++i) {
INetworkSlave slave = slaves.get(i);
if (slave.getPosition().equals(newSlave.getPosition())) {
slaves.set(i, newSlave);
found = true;
break;
}
}
if (!found) {
slaves.add(newSlave);
} }
} }
slavesToAdd.clear(); slavesToAdd.clear();
slaves.removeAll(slavesToRemove); for (INetworkSlave slave : slavesToRemove) {
slaves.remove(slave);
if (slave instanceof IConnectionHandler) {
((IConnectionHandler) slave).onDisconnected(this);
}
}
slavesToRemove.clear(); slavesToRemove.clear();
if (canRun()) { if (canRun()) {
if (ticks % 20 == 0 || forceUpdate) { if (ticks % 20 == 0) {
updateSlaves(); Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
int leftStored = left.getStored();
int rightStored = right.getStored();
if (leftStored == rightStored) {
return 0;
}
return (leftStored > rightStored) ? -1 : 1;
}
});
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
if (left.getPriority() == right.getPriority()) {
return 0;
}
return (left.getPriority() > right.getPriority()) ? -1 : 1;
}
});
} }
for (ICraftingTask taskToCancel : craftingTasksToCancel) { for (ICraftingTask taskToCancel : craftingTasksToCancel) {
@@ -180,8 +196,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (!canRun() && !slaves.isEmpty()) { if (!canRun() && !slaves.isEmpty()) {
disconnectSlaves(); disconnectSlaves();
updateSlaves();
} }
if (couldRun != canRun()) { if (couldRun != canRun()) {
@@ -252,11 +266,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return storage; return storage;
} }
@Override
public List<IStorage> getStorages() {
return storages;
}
@Override @Override
public List<ICraftingTask> getCraftingTasks() { public List<ICraftingTask> getCraftingTasks() {
return craftingTasks; return craftingTasks;
@@ -369,48 +378,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
} }
} }
private void updateSlaves() {
this.storages.clear();
this.patterns.clear();
for (INetworkSlave slave : slaves) {
if (!slave.canUpdate()) {
continue;
}
if (slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages);
}
}
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
int leftStored = left.getStored();
int rightStored = right.getStored();
if (leftStored == rightStored) {
return 0;
}
return (leftStored > rightStored) ? -1 : 1;
}
});
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
if (left.getPriority() == right.getPriority()) {
return 0;
}
return (left.getPriority() > right.getPriority()) ? -1 : 1;
}
});
storage.rebuild();
}
@Override @Override
public void sendStorageToClient() { public void sendStorageToClient() {
if (!storage.isRebuilding()) { if (!storage.isRebuilding()) {

View File

@@ -10,11 +10,13 @@ import net.minecraftforge.items.IItemHandler;
import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider; import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.container.ContainerStorage; import refinedstorage.container.ContainerStorage;
import refinedstorage.inventory.BasicItemHandler; import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.network.MessagePriorityUpdate; import refinedstorage.network.MessagePriorityUpdate;
import refinedstorage.tile.IConnectionHandler;
import refinedstorage.tile.IStorageGui; import refinedstorage.tile.IStorageGui;
import refinedstorage.tile.TileSlave; import refinedstorage.tile.TileSlave;
import refinedstorage.tile.config.ICompareConfig; import refinedstorage.tile.config.ICompareConfig;
@@ -25,7 +27,7 @@ import refinedstorage.tile.config.ModeConstants;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
public static final String NBT_PRIORITY = "Priority"; public static final String NBT_PRIORITY = "Priority";
public static final String NBT_COMPARE = "Compare"; public static final String NBT_COMPARE = "Compare";
public static final String NBT_MODE = "Mode"; public static final String NBT_MODE = "Mode";
@@ -247,4 +249,14 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider,
public IItemHandler getFilters() { public IItemHandler getFilters() {
return filters; return filters;
} }
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
} }