Revert networkmasterregistry changes.

This commit is contained in:
Raoul Van den Berge
2016-06-24 18:43:08 +02:00
parent 12c0917c57
commit 89f44ae204
14 changed files with 661 additions and 995 deletions

View File

@@ -3,7 +3,6 @@ package refinedstorage.api.network;
import cofh.api.energy.EnergyStorage;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import refinedstorage.api.autocrafting.ICraftingPattern;
@@ -19,14 +18,6 @@ public interface INetworkMaster {
*/
World getWorld();
/**
* Initializes this network.
* Starting from this call {@link INetworkMaster#update()} will be called every server tick.
*
* @param world The world this network is in
*/
void setWorld(World world);
/**
* @return The energy storage of this network
*/
@@ -60,12 +51,12 @@ public interface INetworkMaster {
/**
* @param slave The slave to add
*/
void addSlave(BlockPos slave);
void addSlave(INetworkSlave slave);
/**
* @param slave The slave to remove
*/
void removeSlave(BlockPos slave);
void removeSlave(INetworkSlave slave);
/**
* @return The grid handler for this network
@@ -203,8 +194,4 @@ public interface INetworkMaster {
*/
@Nullable
ItemStack getItem(ItemStack stack, int flags);
NBTTagCompound writeToNBT(NBTTagCompound tag);
void readFromNBT(NBTTagCompound tag);
}

View File

@@ -1,700 +0,0 @@
package refinedstorage.apiimpl.network;
import cofh.api.energy.EnergyStorage;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.RefinedStorageCapabilities;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.IGridHandler;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkSlave;
import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask;
import refinedstorage.block.BlockController;
import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.TileCable;
import refinedstorage.tile.TileCrafter;
import refinedstorage.tile.TileWirelessTransmitter;
import refinedstorage.tile.config.RedstoneMode;
import java.util.*;
public class NetworkMaster implements INetworkMaster {
public static final int ENERGY_CAPACITY = 32000;
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 GridHandler gridHandler = new GridHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private List<ItemStack> items = new ArrayList<ItemStack>();
private List<ItemStack> combinedItems = new ArrayList<ItemStack>();
private Set<Integer> combinedItemsIndices = new HashSet<Integer>();
private List<IStorage> storages = new ArrayList<IStorage>();
private List<BlockPos> slaves = new ArrayList<BlockPos>();
private List<INetworkSlave> actualSlaves = new ArrayList<INetworkSlave>();
private Map<BlockPos, Boolean> slaveConnectivity = new HashMap<BlockPos, Boolean>();
private List<BlockPos> slavesToAdd = new ArrayList<BlockPos>();
private List<BlockPos> slavesToLoad = new ArrayList<BlockPos>();
private List<BlockPos> slavesToRemove = new ArrayList<BlockPos>();
private List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
private Stack<ICraftingTask> craftingTasks = new Stack<ICraftingTask>();
private List<ICraftingTask> craftingTasksToAddAsLast = new ArrayList<ICraftingTask>();
private List<ICraftingTask> craftingTasksToAdd = new ArrayList<ICraftingTask>();
private List<ICraftingTask> craftingTasksToCancel = new ArrayList<ICraftingTask>();
private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY);
private int energyUsage;
private boolean couldRun;
private long lastEnergyUpdate;
private int ticks;
private EnumControllerType type;
private World world;
private BlockPos pos;
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
public NetworkMaster(BlockPos pos, World world) {
this.pos = pos;
setWorld(world);
}
public NetworkMaster(BlockPos pos) {
this.pos = pos;
}
public RedstoneMode getRedstoneMode() {
return redstoneMode;
}
public void setRedstoneMode(RedstoneMode mode) {
this.redstoneMode = mode;
markDirty();
}
@Override
public EnergyStorage getEnergy() {
return energy;
}
@Override
public int getEnergyUsage() {
return energyUsage;
}
@Override
public BlockPos getPosition() {
return pos;
}
@Override
public World getWorld() {
return world;
}
@Override
public void setWorld(World world) {
this.world = world;
this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE);
for (BlockPos slavePos : slavesToLoad) {
INetworkSlave slave = world.getTileEntity(slavePos).getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null);
slave.forceConnect(this);
if (!(slave instanceof TileCable)) {
slaves.add(slavePos);
}
}
this.slavesToLoad.clear();
}
@Override
public boolean canRun() {
return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(world, pos);
}
@Override
public void update() {
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty();
for (BlockPos slave : slavesToAdd) {
if (!slaves.contains(slave)) {
slaves.add(slave);
}
}
slavesToAdd.clear();
slaves.removeAll(slavesToRemove);
slavesToRemove.clear();
int lastEnergy = energy.getEnergyStored();
if (canRun()) {
if (ticks % 20 == 0 || forceUpdate) {
updateSlaves();
}
for (INetworkSlave slave : getSlaves()) {
if (slave.canUpdate()) {
slave.updateSlave();
}
boolean active = slave.canUpdate();
if (!slaveConnectivity.containsKey(slave.getPosition()) || slaveConnectivity.get(slave.getPosition()) != active) {
slaveConnectivity.put(slave.getPosition(), active);
if (slave.canSendConnectivityUpdate()) {
RefinedStorageUtils.updateBlock(world, slave.getPosition());
}
}
}
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
taskToCancel.onCancelled(this);
}
craftingTasks.removeAll(craftingTasksToCancel);
craftingTasksToCancel.clear();
for (ICraftingTask task : craftingTasksToAdd) {
craftingTasks.push(task);
}
craftingTasksToAdd.clear();
for (ICraftingTask task : craftingTasksToAddAsLast) {
craftingTasks.add(0, task);
}
craftingTasksToAddAsLast.clear();
if (!craftingTasks.empty()) {
ICraftingTask top = craftingTasks.peek();
if (ticks % top.getPattern().getContainer(world).getSpeed() == 0 && top.update(this)) {
top.onDone(this);
craftingTasks.pop();
}
}
} else if (!slaves.isEmpty()) {
disconnectAll();
updateSlaves();
}
if (couldRun != canRun()) {
couldRun = canRun();
world.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER);
}
wirelessGridHandler.update();
if (type == EnumControllerType.NORMAL && energyUsage > 0) {
if (energy.getEnergyStored() - energyUsage >= 0) {
energy.extractEnergy(energyUsage, false);
} else {
energy.setEnergyStored(0);
}
} else if (type == EnumControllerType.CREATIVE) {
energy.setEnergyStored(energy.getMaxEnergyStored());
}
if (energy.getEnergyStored() != lastEnergy) {
world.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER);
if (System.currentTimeMillis() - lastEnergyUpdate > 1500) {
lastEnergyUpdate = System.currentTimeMillis();
RefinedStorageUtils.updateBlock(world, pos);
}
}
ticks++;
}
@Override
public List<INetworkSlave> getSlaves() {
return actualSlaves;
}
@Override
public void addSlave(BlockPos slave) {
slavesToAdd.add(slave);
markDirty();
}
@Override
public void removeSlave(BlockPos slave) {
slavesToRemove.add(slave);
markDirty();
}
@Override
public IGridHandler getGridHandler() {
return gridHandler;
}
@Override
public IWirelessGridHandler getWirelessGridHandler() {
return wirelessGridHandler;
}
public void disconnectAll() {
for (INetworkSlave slave : getSlaves()) {
slave.disconnect(world);
}
slaves.clear();
}
@Override
public List<ItemStack> getItems() {
return items;
}
@Override
public List<ICraftingTask> getCraftingTasks() {
return craftingTasks;
}
@Override
public void addCraftingTask(ICraftingTask task) {
craftingTasksToAdd.add(task);
markDirty();
}
@Override
public void addCraftingTaskAsLast(ICraftingTask task) {
craftingTasksToAddAsLast.add(task);
markDirty();
}
@Override
public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
if (pattern.isProcessing()) {
return new ProcessingCraftingTask(pattern);
} else {
return new BasicCraftingTask(pattern);
}
}
@Override
public void cancelCraftingTask(ICraftingTask task) {
craftingTasksToCancel.add(task);
markDirty();
}
@Override
public List<ICraftingPattern> getPatterns() {
return patterns;
}
@Override
public List<ICraftingPattern> getPattern(ItemStack pattern, int flags) {
List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
for (ICraftingPattern craftingPattern : getPatterns()) {
for (ItemStack output : craftingPattern.getOutputs()) {
if (RefinedStorageUtils.compareStack(output, pattern, flags)) {
patterns.add(craftingPattern);
}
}
}
return patterns;
}
@Override
public ICraftingPattern getPatternWithBestScore(ItemStack pattern) {
return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
}
@Override
public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) {
List<ICraftingPattern> patterns = getPattern(pattern, flags);
if (patterns.isEmpty()) {
return null;
} else if (patterns.size() == 1) {
return patterns.get(0);
}
int highestScore = 0;
int highestPattern = 0;
for (int i = 0; i < patterns.size(); ++i) {
int score = 0;
for (ItemStack input : patterns.get(i).getInputs()) {
ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
score += stored != null ? stored.stackSize : 0;
}
if (score > highestScore) {
highestScore = score;
highestPattern = i;
}
}
return patterns.get(highestPattern);
}
private void updateSlaves() {
this.energyUsage = 0;
this.actualSlaves.clear();
this.storages.clear();
this.patterns.clear();
int range = 0;
for (BlockPos slavePos : slaves) {
TileEntity tile = world.getTileEntity(slavePos);
if (tile == null || !tile.hasCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null)) {
removeSlave(slavePos);
continue;
}
INetworkSlave slave = tile.getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null);
actualSlaves.add(slave);
if (!slave.canUpdate()) {
continue;
}
if (slave instanceof TileWirelessTransmitter) {
range += ((TileWirelessTransmitter) slave).getRange();
}
if (slave instanceof IStorageProvider) {
((IStorageProvider) slave).provide(storages);
}
if (slave instanceof TileCrafter) {
TileCrafter crafter = (TileCrafter) slave;
for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) {
ItemStack pattern = crafter.getPatterns().getStackInSlot(i);
if (pattern != null && ItemPattern.isValid(pattern)) {
patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern)));
}
}
}
this.energyUsage += slave.getEnergyUsage();
}
wirelessGridHandler.setRange(range);
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;
}
});
updateItems();
updateItemsWithClient();
}
private void updateItems() {
items.clear();
for (IStorage storage : storages) {
storage.addItems(items);
}
for (ICraftingPattern pattern : patterns) {
for (ItemStack output : pattern.getOutputs()) {
ItemStack patternStack = output.copy();
patternStack.stackSize = 0;
items.add(patternStack);
}
}
combinedItems.clear();
combinedItemsIndices.clear();
for (int i = 0; i < items.size(); ++i) {
if (combinedItemsIndices.contains(i)) {
continue;
}
ItemStack stack = items.get(i);
for (int j = i + 1; j < items.size(); ++j) {
if (combinedItemsIndices.contains(j)) {
continue;
}
ItemStack otherStack = items.get(j);
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
ItemStack newStack = items.get(i).copy();
newStack.stackSize += otherStack.stackSize;
items.set(i, newStack);
combinedItems.add(otherStack);
combinedItemsIndices.add(j);
}
}
}
items.removeAll(combinedItems);
}
@Override
public void updateItemsWithClient() {
for (EntityPlayer player : world.playerEntities) {
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) {
updateItemsWithClient((EntityPlayerMP) player);
}
}
}
@Override
public void updateItemsWithClient(EntityPlayerMP player) {
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
}
@Override
public ItemStack push(ItemStack stack, int size, boolean simulate) {
if (stack == null || stack.getItem() == null) {
return null;
}
if (storages.isEmpty()) {
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
int orginalSize = size;
ItemStack remainder = stack;
for (IStorage storage : storages) {
remainder = storage.push(remainder, size, simulate);
if (remainder == null) {
break;
} else {
size = remainder.stackSize;
}
}
int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize;
if (!simulate && sizePushed > 0) {
updateItems();
updateItemsWithClient();
for (int i = 0; i < sizePushed; ++i) {
if (!craftingTasks.empty()) {
ICraftingTask top = craftingTasks.peek();
if (top instanceof ProcessingCraftingTask) {
((ProcessingCraftingTask) top).onPushed(stack);
}
}
}
}
return remainder;
}
@Override
public ItemStack take(ItemStack stack, int size) {
return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
}
@Override
public ItemStack take(ItemStack stack, int size, int flags) {
int requested = size;
int received = 0;
ItemStack newStack = null;
for (IStorage storage : storages) {
ItemStack took = storage.take(stack, requested - received, flags);
if (took != null) {
if (newStack == null) {
newStack = took;
} else {
newStack.stackSize += took.stackSize;
}
received += took.stackSize;
}
if (requested == received) {
break;
}
}
if (newStack != null) {
updateItems();
updateItemsWithClient();
}
return newStack;
}
@Override
public ItemStack getItem(ItemStack stack, int flags) {
for (ItemStack otherStack : items) {
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
return otherStack;
}
}
return null;
}
@Override
public void readFromNBT(NBTTagCompound tag) {
energy.readFromNBT(tag);
if (tag.hasKey(RedstoneMode.NBT)) {
redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT));
}
if (tag.hasKey(NBT_CRAFTING_TASKS)) {
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < taskList.tagCount(); ++i) {
NBTTagCompound taskTag = taskList.getCompoundTagAt(i);
CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT));
if (pattern != null) {
switch (taskTag.getInteger("Type")) {
case BasicCraftingTask.ID:
addCraftingTask(new BasicCraftingTask(taskTag, pattern));
break;
case ProcessingCraftingTask.ID:
addCraftingTask(new ProcessingCraftingTask(taskTag, pattern));
break;
}
}
}
}
if (tag.hasKey(NBT_SLAVES)) {
NBTTagList slavesTag = tag.getTagList(NBT_SLAVES, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < slavesTag.tagCount(); ++i) {
NBTTagCompound slave = slavesTag.getCompoundTagAt(i);
slavesToLoad.add(new BlockPos(slave.getInteger(NBT_SLAVE_X), slave.getInteger(NBT_SLAVE_Y), slave.getInteger(NBT_SLAVE_Z)));
}
}
}
@Override
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 slavesTag = new NBTTagList();
for (BlockPos slave : slaves) {
NBTTagCompound slaveTag = new NBTTagCompound();
slaveTag.setInteger(NBT_SLAVE_X, slave.getX());
slaveTag.setInteger(NBT_SLAVE_Y, slave.getY());
slaveTag.setInteger(NBT_SLAVE_Z, slave.getZ());
slavesTag.appendTag(slaveTag);
}
tag.setTag(NBT_SLAVES, slavesTag);
return tag;
}
public void markDirty() {
if (world != null) {
NetworkMasterSavedData.getOrLoad(world).markDirty();
}
}
}

View File

@@ -1,40 +0,0 @@
package refinedstorage.apiimpl.network;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import refinedstorage.api.network.INetworkMaster;
import java.util.Map;
public class NetworkMasterEventHandler {
@SubscribeEvent
public void onWorldTick(TickEvent.WorldTickEvent e) {
if (e.phase == TickEvent.Phase.START) {
Map<BlockPos, INetworkMaster> networks = NetworkMasterRegistry.get(e.world);
if (networks != null) {
for (INetworkMaster network : networks.values()) {
if (network.getWorld() == null) {
network.setWorld(e.world);
}
network.update();
}
}
}
}
@SubscribeEvent
public void onWorldLoad(WorldEvent.Load e) {
if (!e.getWorld().isRemote) {
NetworkMasterSavedData.getOrLoad(e.getWorld());
}
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload e) {
NetworkMasterRegistry.clear();
}
}

View File

@@ -1,50 +0,0 @@
package refinedstorage.apiimpl.network;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import refinedstorage.api.network.INetworkMaster;
import java.util.HashMap;
import java.util.Map;
public class NetworkMasterRegistry {
public static final Map<Integer, Map<BlockPos, INetworkMaster>> NETWORKS = new HashMap<Integer, Map<BlockPos, INetworkMaster>>();
public static void add(World world, INetworkMaster network) {
add(world.provider.getDimension(), network);
NetworkMasterSavedData.getOrLoad(world).markDirty();
}
public static void add(int dim, INetworkMaster network) {
if (NETWORKS.get(dim) == null) {
NETWORKS.put(dim, new HashMap<BlockPos, INetworkMaster>());
}
NETWORKS.get(dim).put(network.getPosition(), network);
}
public static void remove(World world, BlockPos pos) {
if (get(world) != null) {
INetworkMaster network = get(world).get(pos);
if (network != null) {
get(world).remove(pos);
NetworkMasterSavedData.getOrLoad(world).markDirty();
}
}
}
public static INetworkMaster get(World world, BlockPos pos) {
return get(world) == null ? null : get(world).get(pos);
}
public static Map<BlockPos, INetworkMaster> get(World world) {
return NETWORKS.get(world.provider.getDimension());
}
public static void clear() {
NETWORKS.clear();
}
}

View File

@@ -1,76 +0,0 @@
package refinedstorage.apiimpl.network;
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;
import refinedstorage.api.network.INetworkMaster;
import java.util.Map;
public class NetworkMasterSavedData extends WorldSavedData {
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);
}
@Override
public void readFromNBT(NBTTagCompound tag) {
NBTTagList networks = tag.getTagList(NBT_NETWORKS, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < networks.tagCount(); ++i) {
NBTTagCompound networkTag = networks.getCompoundTagAt(i);
INetworkMaster network = new NetworkMaster(new BlockPos(networkTag.getInteger(NBT_NETWORK_X), networkTag.getInteger(NBT_NETWORK_Y), networkTag.getInteger(NBT_NETWORK_Z)));
network.readFromNBT(networkTag.getCompoundTag(NBT_NETWORK_DATA));
NetworkMasterRegistry.add(networkTag.getInteger(NBT_NETWORK_DIM), network);
}
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
NBTTagList networks = new NBTTagList();
for (Map.Entry<Integer, Map<BlockPos, INetworkMaster>> entry : NetworkMasterRegistry.NETWORKS.entrySet()) {
for (INetworkMaster network : entry.getValue().values()) {
NBTTagCompound networkTag = new NBTTagCompound();
networkTag.setInteger(NBT_NETWORK_X, network.getPosition().getX());
networkTag.setInteger(NBT_NETWORK_Y, network.getPosition().getY());
networkTag.setInteger(NBT_NETWORK_Z, network.getPosition().getZ());
networkTag.setInteger(NBT_NETWORK_DIM, entry.getKey());
networkTag.setTag(NBT_NETWORK_DATA, network.writeToNBT(new NBTTagCompound()));
networks.appendTag(networkTag);
}
}
tag.setTag(NBT_NETWORKS, networks);
return tag;
}
public static NetworkMasterSavedData getOrLoad(World world) {
NetworkMasterSavedData instance = (NetworkMasterSavedData) world.getMapStorage().getOrLoadData(NetworkMasterSavedData.class, ID);
if (instance == null) {
instance = new NetworkMasterSavedData(ID);
world.getMapStorage().setData(ID, instance);
}
return instance;
}
}

View File

@@ -15,14 +15,11 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageGui;
import refinedstorage.apiimpl.network.NetworkMaster;
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
import refinedstorage.item.ItemBlockController;
import refinedstorage.tile.controller.TileController;
@@ -68,7 +65,7 @@ public class BlockController extends BlockBase {
TileController controller = (TileController) world.getTileEntity(pos);
return super.getActualState(state, world, pos)
.withProperty(ENERGY, (int) Math.ceil((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * 8f));
.withProperty(ENERGY, controller.getEnergyScaled(8));
}
@Override
@@ -84,11 +81,7 @@ public class BlockController extends BlockBase {
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
if (!world.isRemote) {
if (((TileController) world.getTileEntity(pos)).getNetwork() == null) {
player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:no_network"));
} else {
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ());
}
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ());
}
return true;
@@ -97,15 +90,13 @@ public class BlockController extends BlockBase {
@Override
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) {
if (!world.isRemote) {
NetworkMaster network = new NetworkMaster(pos, world);
TileController controller = (TileController) world.getTileEntity(pos);
NBTTagCompound tag = stack.getTagCompound();
if (tag != null && tag.hasKey(NetworkMaster.NBT_ENERGY)) {
network.getEnergy().receiveEnergy(tag.getInteger(NetworkMaster.NBT_ENERGY), false);
if (tag != null && tag.hasKey(TileController.NBT_ENERGY)) {
controller.getEnergy().receiveEnergy(tag.getInteger(TileController.NBT_ENERGY), false);
}
NetworkMasterRegistry.add(world, network);
}
super.onBlockPlacedBy(world, pos, state, player, stack);
@@ -114,7 +105,7 @@ public class BlockController extends BlockBase {
@Override
public void breakBlock(World world, BlockPos pos, IBlockState state) {
if (!world.isRemote) {
NetworkMasterRegistry.remove(world, pos);
((TileController) world.getTileEntity(pos)).disconnectAll();
}
super.breakBlock(world, pos, state);
@@ -126,9 +117,8 @@ public class BlockController extends BlockBase {
ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state));
NBTTagCompound tag = new NBTTagCompound();
tag.setInteger(NetworkMaster.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergyStored(null));
stack.setTagCompound(tag);
stack.setTagCompound(new NBTTagCompound());
stack.getTagCompound().setInteger(TileController.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergy().getEnergyStored());
drops.add(stack);

View File

@@ -3,7 +3,6 @@ package refinedstorage.gui;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.apiimpl.network.NetworkMaster;
import refinedstorage.container.ContainerController;
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import refinedstorage.tile.controller.ClientSlave;
@@ -46,7 +45,7 @@ public class GuiController extends GuiBase {
drawTexture(x, y, 0, 0, width, height);
int barHeightNew = (int) ((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * (float) barHeight);
int barHeightNew = controller.getEnergyScaled(barHeight);
drawTexture(x + barX, y + barY + barHeight - barHeightNew, 178, barHeight - barHeightNew, barWidth, barHeightNew);
}
@@ -103,7 +102,7 @@ public class GuiController extends GuiBase {
}
if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) {
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy(), NetworkMaster.ENERGY_CAPACITY));
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy().getEnergyStored(), TileController.ENERGY_CAPACITY));
}
}

View File

@@ -6,8 +6,8 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.apiimpl.network.NetworkMaster;
import refinedstorage.block.EnumControllerType;
import refinedstorage.tile.controller.TileController;
import java.util.List;
@@ -21,11 +21,11 @@ public class ItemBlockController extends ItemBlockBase {
if (stack.getMetadata() != EnumControllerType.CREATIVE.getId()) {
int energyStored = 0;
if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(NetworkMaster.NBT_ENERGY)) {
energyStored = stack.getTagCompound().getInteger(NetworkMaster.NBT_ENERGY);
if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(TileController.NBT_ENERGY)) {
energyStored = stack.getTagCompound().getInteger(TileController.NBT_ENERGY);
}
list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, NetworkMaster.ENERGY_CAPACITY));
list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, TileController.ENERGY_CAPACITY));
}
}
@@ -43,7 +43,7 @@ public class ItemBlockController extends ItemBlockBase {
tag = new NBTTagCompound();
}
tag.setInteger(NetworkMaster.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? NetworkMaster.ENERGY_CAPACITY : 0);
tag.setInteger(TileController.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? TileController.ENERGY_CAPACITY : 0);
return stack;
}

View File

@@ -10,14 +10,14 @@ import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.grid.TileGrid;
import java.util.List;
@@ -134,10 +134,10 @@ public class ItemWirelessGrid extends ItemEnergyContainer {
@Override
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) {
if (!world.isRemote && hasValidNBT(stack) && getDimensionId(stack) == player.dimension) {
INetworkMaster network = NetworkMasterRegistry.get(player.worldObj, new BlockPos(getX(stack), getY(stack), getZ(stack)));
TileEntity tile = world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack)));
if (network != null) {
if (network.getWirelessGridHandler().onOpen(player, hand)) {
if (tile instanceof TileController) {
if (((TileController) tile).getWirelessGridHandler().onOpen(player, hand)) {
return new ActionResult(EnumActionResult.SUCCESS, stack);
} else {
player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:wireless_grid.out_of_range"));

View File

@@ -8,20 +8,20 @@ import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.apiimpl.network.NetworkMaster;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.container.ContainerGrid;
import java.util.ArrayList;
import java.util.List;
public class MessageGridItems implements IMessage, IMessageHandler<MessageGridItems, IMessage> {
private NetworkMaster network;
private INetworkMaster network;
private List<ItemStack> items = new ArrayList<ItemStack>();
public MessageGridItems() {
}
public MessageGridItems(NetworkMaster network) {
public MessageGridItems(INetworkMaster network) {
this.network = network;
}

View File

@@ -5,7 +5,6 @@ import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
@@ -18,7 +17,6 @@ import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageItems;
import refinedstorage.api.RefinedStorageAPI;
import refinedstorage.apiimpl.network.NetworkMasterEventHandler;
import refinedstorage.apiimpl.solderer.*;
import refinedstorage.apiimpl.storage.NBTStorage;
import refinedstorage.block.BlockBase;
@@ -480,7 +478,6 @@ public class CommonProxy {
}
public void init(FMLInitializationEvent e) {
MinecraftForge.EVENT_BUS.register(new NetworkMasterEventHandler());
}
public void postInit(FMLPostInitializationEvent e) {

View File

@@ -11,7 +11,6 @@ import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.RefinedStorageCapabilities;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkSlave;
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.controller.TileController;
@@ -23,6 +22,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
public static final String NBT_CONNECTED = "Connected";
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
private boolean active;
protected boolean connected;
protected INetworkMaster network;
@@ -41,6 +41,27 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
return true;
}
@Override
public void update() {
if (!worldObj.isRemote) {
if (ticks == 0) {
refreshConnection(worldObj);
}
if (isActive()) {
updateSlave();
}
if (active != isActive()) {
RefinedStorageUtils.updateBlock(worldObj, pos);
active = isActive();
}
}
super.update();
}
@Override
public void connect(World world, INetworkMaster network) {
if (network.canRun()) {
@@ -48,7 +69,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
this.connected = true;
if (!(this instanceof TileCable)) {
this.network.addSlave(pos);
this.network.addSlave(this);
}
world.notifyNeighborsOfStateChange(pos, getBlockType());
@@ -70,7 +91,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
this.connected = false;
if (this.network != null) {
this.network.removeSlave(pos);
this.network.removeSlave(this);
this.network = null;
}
@@ -87,11 +108,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
if (network == null) {
if (controller != null) {
INetworkMaster network = NetworkMasterRegistry.get(world, controller.getPos());
if (network != null) {
connect(world, network);
}
connect(world, network);
}
} else {
if (controller == null) {

View File

@@ -1,83 +1,635 @@
package refinedstorage.tile.controller;
import cofh.api.energy.EnergyStorage;
import cofh.api.energy.IEnergyReceiver;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.IGridHandler;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkSlave;
import refinedstorage.apiimpl.network.NetworkMaster;
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask;
import refinedstorage.apiimpl.network.GridHandler;
import refinedstorage.apiimpl.network.WirelessGridHandler;
import refinedstorage.block.BlockController;
import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerController;
import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase;
import refinedstorage.tile.TileCrafter;
import refinedstorage.tile.TileWirelessTransmitter;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.config.RedstoneMode;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
private INetworkMaster network;
public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
public static final int ENERGY_CAPACITY = 32000;
// Only used client side
private List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
private int energy;
public static final String NBT_CRAFTING_TASKS = "CraftingTasks";
public static final String NBT_ENERGY = "Energy";
private GridHandler gridHandler = new GridHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private List<ItemStack> items = new ArrayList<ItemStack>();
private List<ItemStack> combinedItems = new ArrayList<ItemStack>();
private Set<Integer> combinedItemsIndices = new HashSet<Integer>();
private List<IStorage> storages = new ArrayList<IStorage>();
private List<INetworkSlave> slaves = new ArrayList<INetworkSlave>();
private List<INetworkSlave> slavesToAdd = new ArrayList<INetworkSlave>();
private List<INetworkSlave> slavesToRemove = new ArrayList<INetworkSlave>();
private List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
private Stack<ICraftingTask> craftingTasks = new Stack<ICraftingTask>();
private List<ICraftingTask> craftingTasksToAddAsLast = new ArrayList<ICraftingTask>();
private List<ICraftingTask> craftingTasksToAdd = new ArrayList<ICraftingTask>();
private List<ICraftingTask> craftingTasksToCancel = new ArrayList<ICraftingTask>();
private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY);
private int energyUsage;
private EnumControllerType type;
private RedstoneMode redstoneMode;
public INetworkMaster getNetwork() {
if (network == null) {
network = NetworkMasterRegistry.get(worldObj, pos);
private boolean couldRun;
private long lastEnergyUpdate;
private EnumControllerType type;
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
private List<ClientSlave> clientSlaves;
@Override
public BlockPos getPosition() {
return pos;
}
@Override
public World getWorld() {
return worldObj;
}
@Override
public EnergyStorage getEnergy() {
return energy;
}
@Override
public boolean canRun() {
return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(worldObj, pos);
}
@Override
public void update() {
if (!worldObj.isRemote) {
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty();
for (INetworkSlave slave : slavesToAdd) {
if (!slaves.contains(slave)) {
slaves.add(slave);
}
}
slavesToAdd.clear();
slaves.removeAll(slavesToRemove);
slavesToRemove.clear();
int lastEnergy = energy.getEnergyStored();
if (canRun()) {
if (ticks % 20 == 0 || forceUpdate) {
updateSlaves();
}
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
taskToCancel.onCancelled(this);
}
craftingTasks.removeAll(craftingTasksToCancel);
craftingTasksToCancel.clear();
for (ICraftingTask task : craftingTasksToAdd) {
craftingTasks.push(task);
}
craftingTasksToAdd.clear();
for (ICraftingTask task : craftingTasksToAddAsLast) {
craftingTasks.add(0, task);
}
craftingTasksToAddAsLast.clear();
if (!craftingTasks.empty()) {
ICraftingTask top = craftingTasks.peek();
if (ticks % top.getPattern().getContainer(worldObj).getSpeed() == 0 && top.update(this)) {
top.onDone(this);
craftingTasks.pop();
}
}
} else if (!slaves.isEmpty()) {
disconnectAll();
updateSlaves();
}
if (couldRun != canRun()) {
couldRun = canRun();
worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER);
}
wirelessGridHandler.update();
if (type == EnumControllerType.NORMAL && energyUsage > 0) {
if (energy.getEnergyStored() - energyUsage >= 0) {
energy.extractEnergy(energyUsage, false);
} else {
energy.setEnergyStored(0);
}
} else if (type == EnumControllerType.CREATIVE) {
energy.setEnergyStored(energy.getMaxEnergyStored());
}
if (energy.getEnergyStored() != lastEnergy) {
worldObj.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER);
if (System.currentTimeMillis() - lastEnergyUpdate > 1500) {
lastEnergyUpdate = System.currentTimeMillis();
RefinedStorageUtils.updateBlock(worldObj, pos);
}
}
}
return network;
super.update();
}
@Override
public List<INetworkSlave> getSlaves() {
return slaves;
}
public List<ClientSlave> getClientSlaves() {
return clientSlaves;
}
@Override
public void addSlave(INetworkSlave slave) {
slavesToAdd.add(slave);
}
@Override
public void removeSlave(INetworkSlave slave) {
slavesToRemove.add(slave);
}
@Override
public IGridHandler getGridHandler() {
return gridHandler;
}
@Override
public IWirelessGridHandler getWirelessGridHandler() {
return wirelessGridHandler;
}
public void disconnectAll() {
for (INetworkSlave slave : getSlaves()) {
slave.disconnect(worldObj);
}
slaves.clear();
}
@Override
public List<ItemStack> getItems() {
return items;
}
@Override
public List<ICraftingTask> getCraftingTasks() {
return craftingTasks;
}
@Override
public void addCraftingTask(ICraftingTask task) {
craftingTasksToAdd.add(task);
markDirty();
}
@Override
public void addCraftingTaskAsLast(ICraftingTask task) {
craftingTasksToAddAsLast.add(task);
markDirty();
}
@Override
public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
if (pattern.isProcessing()) {
return new ProcessingCraftingTask(pattern);
} else {
return new BasicCraftingTask(pattern);
}
}
@Override
public void cancelCraftingTask(ICraftingTask task) {
craftingTasksToCancel.add(task);
markDirty();
}
@Override
public List<ICraftingPattern> getPatterns() {
return patterns;
}
@Override
public List<ICraftingPattern> getPattern(ItemStack pattern, int flags) {
List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
for (ICraftingPattern craftingPattern : getPatterns()) {
for (ItemStack output : craftingPattern.getOutputs()) {
if (RefinedStorageUtils.compareStack(output, pattern, flags)) {
patterns.add(craftingPattern);
}
}
}
return patterns;
}
@Override
public ICraftingPattern getPatternWithBestScore(ItemStack pattern) {
return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
}
@Override
public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) {
List<ICraftingPattern> patterns = getPattern(pattern, flags);
if (patterns.isEmpty()) {
return null;
} else if (patterns.size() == 1) {
return patterns.get(0);
}
int highestScore = 0;
int highestPattern = 0;
for (int i = 0; i < patterns.size(); ++i) {
int score = 0;
for (ItemStack input : patterns.get(i).getInputs()) {
ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
score += stored != null ? stored.stackSize : 0;
}
if (score > highestScore) {
highestScore = score;
highestPattern = i;
}
}
return patterns.get(highestPattern);
}
private void updateSlaves() {
this.energyUsage = 0;
this.storages.clear();
this.patterns.clear();
int range = 0;
for (INetworkSlave slave : slaves) {
if (!slave.canUpdate()) {
continue;
}
if (slave instanceof TileWirelessTransmitter) {
range += ((TileWirelessTransmitter) slave).getRange();
}
if (slave instanceof IStorageProvider) {
((IStorageProvider) slave).provide(storages);
}
if (slave instanceof TileCrafter) {
TileCrafter crafter = (TileCrafter) slave;
for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) {
ItemStack pattern = crafter.getPatterns().getStackInSlot(i);
if (pattern != null && ItemPattern.isValid(pattern)) {
patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern)));
}
}
}
this.energyUsage += slave.getEnergyUsage();
}
wirelessGridHandler.setRange(range);
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;
}
});
updateItems();
updateItemsWithClient();
}
private void updateItems() {
items.clear();
for (IStorage storage : storages) {
storage.addItems(items);
}
for (ICraftingPattern pattern : patterns) {
for (ItemStack output : pattern.getOutputs()) {
ItemStack patternStack = output.copy();
patternStack.stackSize = 0;
items.add(patternStack);
}
}
combinedItems.clear();
combinedItemsIndices.clear();
for (int i = 0; i < items.size(); ++i) {
if (combinedItemsIndices.contains(i)) {
continue;
}
ItemStack stack = items.get(i);
for (int j = i + 1; j < items.size(); ++j) {
if (combinedItemsIndices.contains(j)) {
continue;
}
ItemStack otherStack = items.get(j);
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
ItemStack newStack = items.get(i).copy();
newStack.stackSize += otherStack.stackSize;
items.set(i, newStack);
combinedItems.add(otherStack);
combinedItemsIndices.add(j);
}
}
}
items.removeAll(combinedItems);
}
@Override
public void updateItemsWithClient() {
for (EntityPlayer player : worldObj.playerEntities) {
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) {
updateItemsWithClient((EntityPlayerMP) player);
}
}
}
@Override
public void updateItemsWithClient(EntityPlayerMP player) {
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
}
@Override
public ItemStack push(ItemStack stack, int size, boolean simulate) {
if (stack == null || stack.getItem() == null) {
return null;
}
if (storages.isEmpty()) {
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
int orginalSize = size;
ItemStack remainder = stack;
for (IStorage storage : storages) {
remainder = storage.push(remainder, size, simulate);
if (remainder == null) {
break;
} else {
size = remainder.stackSize;
}
}
int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize;
if (!simulate && sizePushed > 0) {
updateItems();
updateItemsWithClient();
for (int i = 0; i < sizePushed; ++i) {
if (!craftingTasks.empty()) {
ICraftingTask top = craftingTasks.peek();
if (top instanceof ProcessingCraftingTask) {
((ProcessingCraftingTask) top).onPushed(stack);
}
}
}
}
return remainder;
}
@Override
public ItemStack take(ItemStack stack, int size) {
return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
}
@Override
public ItemStack take(ItemStack stack, int size, int flags) {
int requested = size;
int received = 0;
ItemStack newStack = null;
for (IStorage storage : storages) {
ItemStack took = storage.take(stack, requested - received, flags);
if (took != null) {
if (newStack == null) {
newStack = took;
} else {
newStack.stackSize += took.stackSize;
}
received += took.stackSize;
}
if (requested == received) {
break;
}
}
if (newStack != null) {
updateItems();
updateItemsWithClient();
}
return newStack;
}
@Override
public ItemStack getItem(ItemStack stack, int flags) {
for (ItemStack otherStack : items) {
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
return otherStack;
}
}
return null;
}
@Override
public void readFromNBT(NBTTagCompound tag) {
energy.readFromNBT(tag);
if (tag.hasKey(RedstoneMode.NBT)) {
redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT));
}
if (tag.hasKey(NBT_CRAFTING_TASKS)) {
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < taskList.tagCount(); ++i) {
NBTTagCompound taskTag = taskList.getCompoundTagAt(i);
CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT));
if (pattern != null) {
switch (taskTag.getInteger("Type")) {
case BasicCraftingTask.ID:
addCraftingTask(new BasicCraftingTask(taskTag, pattern));
break;
case ProcessingCraftingTask.ID:
addCraftingTask(new ProcessingCraftingTask(taskTag, pattern));
break;
}
}
}
}
}
@Override
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);
return tag;
}
@Override
public NBTTagCompound writeUpdate(NBTTagCompound tag) {
super.writeUpdate(tag);
tag.setInteger(NetworkMaster.NBT_ENERGY, getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
tag.setInteger(NBT_ENERGY, energy.getEnergyStored());
return tag;
}
@Override
public void readUpdate(NBTTagCompound tag) {
energy = tag.getInteger(NetworkMaster.NBT_ENERGY);
energy.setEnergyStored(tag.getInteger(NBT_ENERGY));
super.readUpdate(tag);
}
@Override
public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) {
return getNetwork() != null ? getNetwork().getEnergy().receiveEnergy(maxReceive, simulate) : 0;
return energy.receiveEnergy(maxReceive, simulate);
}
@Override
public int getEnergyStored(EnumFacing from) {
return getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0;
return energy.getEnergyStored();
}
public int getEnergyScaled(int i) {
float stored = worldObj.isRemote ? energy : (getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
float max = NetworkMaster.ENERGY_CAPACITY;
return (int) (stored / max * (float) i);
return (int) ((float) energy.getEnergyStored() / (float) ENERGY_CAPACITY * (float) i);
}
@Override
public int getMaxEnergyStored(EnumFacing from) {
return getNetwork() != null ? getNetwork().getEnergy().getMaxEnergyStored() : 0;
return energy.getMaxEnergyStored();
}
@Override
@@ -87,22 +639,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override
public RedstoneMode getRedstoneMode() {
return worldObj.isRemote ? redstoneMode : (getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode() : RedstoneMode.IGNORE);
return redstoneMode;
}
@Override
public void setRedstoneMode(RedstoneMode mode) {
if (getNetwork() != null) {
((NetworkMaster) getNetwork()).setRedstoneMode(mode);
}
}
public List<ClientSlave> getClientSlaves() {
return clientSlaves;
}
public int getEnergy() {
return energy;
this.redstoneMode = mode;
}
public int getEnergyUsage() {
@@ -119,7 +661,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override
public void readContainerData(ByteBuf buf) {
this.energy = buf.readInt();
energy.setEnergyStored(buf.readInt());
this.energyUsage = buf.readInt();
this.redstoneMode = RedstoneMode.getById(buf.readInt());
@@ -142,25 +684,25 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
@Override
public void writeContainerData(ByteBuf buf) {
buf.writeInt(getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
buf.writeInt(getNetwork() != null ? getNetwork().getEnergyUsage() : 0);
buf.writeInt(energy.getEnergyStored());
buf.writeInt(energyUsage);
buf.writeInt(getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode().id : RedstoneMode.IGNORE.id);
buf.writeInt(redstoneMode.id);
if (getNetwork() != null) {
List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
for (INetworkSlave slave : getNetwork().getSlaves()) {
if (slave.canUpdate()) {
IBlockState state = worldObj.getBlockState(slave.getPosition());
for (INetworkSlave slave : slaves) {
if (slave.canUpdate()) {
IBlockState state = worldObj.getBlockState(slave.getPosition());
ClientSlave clientSlave = new ClientSlave();
ClientSlave clientSlave = new ClientSlave();
clientSlave.energyUsage = slave.getEnergyUsage();
clientSlave.amount = 1;
clientSlave.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 (clientSlave.stack.getItem() != null && clientSlaves.contains(clientSlave)) {
if (clientSlave.stack.getItem() != null) {
if (clientSlaves.contains(clientSlave)) {
for (ClientSlave other : clientSlaves) {
if (other.equals(clientSlave)) {
other.amount++;
@@ -173,16 +715,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
}
}
}
}
buf.writeInt(clientSlaves.size());
buf.writeInt(clientSlaves.size());
for (ClientSlave slave : clientSlaves) {
buf.writeInt(slave.energyUsage);
buf.writeInt(slave.amount);
ByteBufUtils.writeItemStack(buf, slave.stack);
}
} else {
buf.writeInt(0);
for (ClientSlave slave : clientSlaves) {
buf.writeInt(slave.energyUsage);
buf.writeInt(slave.amount);
ByteBufUtils.writeItemStack(buf, slave.stack);
}
}

View File

@@ -2,18 +2,18 @@ package refinedstorage.tile.grid;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.IGridHandler;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
import refinedstorage.block.EnumGridType;
import refinedstorage.item.ItemWirelessGrid;
import refinedstorage.network.MessageWirelessGridSettingsUpdate;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.controller.TileController;
import java.util.ArrayList;
import java.util.List;
@@ -60,23 +60,25 @@ public class WirelessGrid implements IGrid {
@Override
public IGridHandler getGridHandler() {
INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos);
TileController controller = getController();
if (network != null) {
return network.getGridHandler();
}
return null;
return controller != null ? controller.getGridHandler() : null;
}
public void onClose(EntityPlayer player) {
INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos);
TileController controller = getController();
if (network != null) {
network.getWirelessGridHandler().onClose(player);
if (controller != null) {
controller.getWirelessGridHandler().onClose(player);
}
}
private TileController getController() {
TileEntity tile = world.getTileEntity(controllerPos);
return tile instanceof TileController ? (TileController) tile : null;
}
@Override
public int getSortingType() {
return sortingType;