Consolidate some stuff from controller in other classes. This will make implementing triple clicking easier.

This commit is contained in:
Raoul Van den Berge
2016-05-24 21:39:22 +02:00
parent 1fc2b12193
commit 65561cef3b
29 changed files with 349 additions and 276 deletions

View File

@@ -21,7 +21,7 @@ import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageGui;
import refinedstorage.item.ItemBlockController;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
import java.util.ArrayList;
import java.util.List;

View File

@@ -4,7 +4,8 @@ import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import refinedstorage.container.ContainerController;
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.ClientSideMachine;
import refinedstorage.tile.controller.TileController;
import java.util.List;
@@ -74,13 +75,13 @@ public class GuiController extends GuiBase {
RenderHelper.enableGUIStandardItemLighting();
List<TileController.ClientSideMachine> machines = controller.getClientSideMachines();
List<ClientSideMachine> machines = controller.getClientSideMachines();
TileController.ClientSideMachine machineHovering = null;
ClientSideMachine machineHovering = null;
for (int i = 0; i < 4; ++i) {
if (slot < machines.size()) {
TileController.ClientSideMachine machine = machines.get(slot);
ClientSideMachine machine = machines.get(slot);
drawItem(x, y + 5, machine.stack);

View File

@@ -6,7 +6,7 @@ import net.minecraft.client.gui.GuiTextField;
import net.minecraftforge.fml.client.FMLClientHandler;
import org.lwjgl.input.Keyboard;
import refinedstorage.container.ContainerDummy;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.StorageHandler;
import java.io.IOException;
@@ -81,7 +81,7 @@ public class GuiCraftingSettings extends GuiBase {
private void startRequest() {
Integer quantity = Ints.tryParse(amountField.getText());
if (quantity != null && quantity > 0 && quantity <= TileController.MAX_CRAFTING_QUANTITY_PER_REQUEST) {
if (quantity != null && quantity > 0 && quantity <= StorageHandler.MAX_CRAFTING_PER_REQUEST) {
gridGui.getGrid().onCraftingRequested(id, quantity);
close();

View File

@@ -14,6 +14,7 @@ import refinedstorage.tile.*;
import refinedstorage.tile.autocrafting.TileCrafter;
import refinedstorage.tile.autocrafting.TileCraftingMonitor;
import refinedstorage.tile.autocrafting.TileProcessingPatternEncoder;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.grid.TileGrid;
import refinedstorage.tile.grid.WirelessGrid;
import refinedstorage.tile.solderer.TileSolderer;

View File

@@ -7,7 +7,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.block.EnumControllerType;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
import java.util.List;

View File

@@ -17,7 +17,7 @@ import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.grid.TileGrid;
import java.util.List;
@@ -137,7 +137,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer {
TileEntity tile = world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack)));
if (tile instanceof TileController) {
if (((TileController) tile).onOpenWirelessGrid(player, hand)) {
if (((TileController) tile).getWirelessGridHandler().handleOpen(player, hand)) {
return new ActionResult(EnumActionResult.SUCCESS, stack);
} else {
player.addChatComponentMessage(new TextComponentString(I18n.format("misc.refinedstorage:wireless_grid.out_of_range")));

View File

@@ -47,7 +47,7 @@ public class MessageCraftingMonitorCancel extends MessageHandlerPlayerToServer<M
TileCraftingMonitor craftingMonitor = (TileCraftingMonitor) tile;
if (craftingMonitor.isConnected()) {
craftingMonitor.getController().onCraftingTaskCancelRequested(message.id);
craftingMonitor.getController().getStorageHandler().handleCraftingCancel(message.id);
}
}
}

View File

@@ -48,7 +48,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<Messa
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.gridX, message.gridY, message.gridZ));
if (tile instanceof TileGrid && ((TileGrid) tile).isConnected()) {
((TileGrid) tile).getController().onCraftingRequested(message.id, message.quantity);
((TileGrid) tile).getController().getStorageHandler().handleCraftingRequest(message.id, message.quantity);
}
}
}

View File

@@ -48,7 +48,7 @@ public class MessageGridStoragePull extends MessageHandlerPlayerToServer<Message
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.gridX, message.gridY, message.gridZ));
if (tile instanceof TileGrid && ((TileGrid) tile).isConnected()) {
((TileGrid) tile).getController().handleStoragePull(message.id, message.flags, player);
((TileGrid) tile).getController().getStorageHandler().handlePull(message.id, message.flags, player);
}
}
}

View File

@@ -48,7 +48,7 @@ public class MessageGridStoragePush extends MessageHandlerPlayerToServer<Message
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.gridX, message.gridY, message.gridZ));
if (tile instanceof TileGrid && ((TileGrid) tile).isConnected()) {
((TileGrid) tile).getController().handleStoragePush(message.playerSlot, message.one, player);
((TileGrid) tile).getController().getStorageHandler().handlePush(message.playerSlot, message.one, player);
}
}
}

View File

@@ -5,7 +5,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
public class MessageWirelessGridCraftingStart extends MessageHandlerPlayerToServer<MessageWirelessGridCraftingStart> implements IMessage {
private int controllerX;
@@ -48,7 +48,7 @@ public class MessageWirelessGridCraftingStart extends MessageHandlerPlayerToServ
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ));
if (tile instanceof TileController && ((TileController) tile).mayRun()) {
((TileController) tile).onCraftingRequested(message.id, message.quantity);
((TileController) tile).getStorageHandler().handleCraftingRequest(message.id, message.quantity);
}
}
}

View File

@@ -5,7 +5,7 @@ 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.storage.ItemGroup;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.grid.WirelessGrid;
import java.util.ArrayList;
@@ -37,7 +37,7 @@ public class MessageWirelessGridItems implements IMessage, IMessageHandler<Messa
@Override
public void toBytes(ByteBuf buf) {
controller.sendItemGroups(buf);
controller.writeItemGroups(buf);
}
@Override

View File

@@ -5,7 +5,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
public class MessageWirelessGridStoragePull extends MessageHandlerPlayerToServer<MessageWirelessGridStoragePull> implements IMessage {
private int controllerX;
@@ -48,7 +48,7 @@ public class MessageWirelessGridStoragePull extends MessageHandlerPlayerToServer
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ));
if (tile instanceof TileController && ((TileController) tile).mayRun()) {
((TileController) tile).handleStoragePull(message.id, message.flags, player);
((TileController) tile).getStorageHandler().handlePull(message.id, message.flags, player);
}
}
}

View File

@@ -5,7 +5,7 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.tile.TileController;
import refinedstorage.tile.controller.TileController;
public class MessageWirelessGridStoragePush extends MessageHandlerPlayerToServer<MessageWirelessGridStoragePush> implements IMessage {
private int controllerX;
@@ -48,7 +48,7 @@ public class MessageWirelessGridStoragePush extends MessageHandlerPlayerToServer
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.controllerX, message.controllerY, message.controllerZ));
if (tile instanceof TileController && ((TileController) tile).mayRun()) {
((TileController) tile).handleStoragePush(message.playerSlot, message.one, player);
((TileController) tile).getStorageHandler().handlePush(message.playerSlot, message.one, player);
}
}
}

View File

@@ -26,6 +26,7 @@ import refinedstorage.tile.*;
import refinedstorage.tile.autocrafting.TileCrafter;
import refinedstorage.tile.autocrafting.TileCraftingMonitor;
import refinedstorage.tile.autocrafting.TileProcessingPatternEncoder;
import refinedstorage.tile.controller.TileController;
import refinedstorage.tile.grid.TileGrid;
import refinedstorage.tile.solderer.*;

View File

@@ -19,6 +19,7 @@ import refinedstorage.container.ContainerConstructor;
import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.inventory.BasicItemValidator;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.autocrafting.task.CraftingTaskScheduler;
import refinedstorage.tile.config.ICompareConfig;
public class TileConstructor extends TileMachine implements ICompareConfig {

View File

@@ -15,6 +15,7 @@ import refinedstorage.container.ContainerExporter;
import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.inventory.BasicItemValidator;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.autocrafting.task.CraftingTaskScheduler;
import refinedstorage.tile.config.ICompareConfig;
public class TileExporter extends TileMachine implements ICompareConfig {

View File

@@ -8,6 +8,8 @@ import net.minecraft.world.World;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.controller.ControllerSearcher;
import refinedstorage.tile.controller.TileController;
import java.util.HashSet;
import java.util.Set;

View File

@@ -6,8 +6,8 @@ import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.common.util.Constants;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.controller.TileController;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,9 +1,10 @@
package refinedstorage.tile;
package refinedstorage.tile.autocrafting.task;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.controller.TileController;
public class CraftingTaskScheduler {
public static String NBT_SCHEDULED = "CraftingTaskScheduled";

View File

@@ -1,8 +1,8 @@
package refinedstorage.tile.autocrafting.task;
import net.minecraft.nbt.NBTTagCompound;
import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.controller.TileController;
public interface ICraftingTask {
CraftingPattern getPattern();

View File

@@ -6,9 +6,9 @@ import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.autocrafting.TileCrafter;
import refinedstorage.tile.controller.TileController;
public class ProcessingCraftingTask implements ICraftingTask {
public static final int ID = 1;

View File

@@ -0,0 +1,30 @@
package refinedstorage.tile.controller;
import net.minecraft.item.ItemStack;
import refinedstorage.RefinedStorageUtils;
public class ClientSideMachine {
public ItemStack stack;
public int amount;
public int energyUsage;
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof ClientSideMachine)) {
return false;
}
return energyUsage == ((ClientSideMachine) other).energyUsage && RefinedStorageUtils.compareStack(stack, ((ClientSideMachine) other).stack);
}
@Override
public int hashCode() {
int result = stack.hashCode();
result = 31 * result + energyUsage;
return result;
}
}

View File

@@ -1,9 +1,11 @@
package refinedstorage.tile;
package refinedstorage.tile.controller;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import refinedstorage.tile.TileMachine;
import refinedstorage.tile.TileRelay;
import java.util.Set;

View File

@@ -0,0 +1,137 @@
package refinedstorage.tile.controller;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.item.ItemWirelessGrid;
import refinedstorage.network.GridPullFlags;
import refinedstorage.storage.ItemGroup;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.autocrafting.task.ICraftingTask;
public class StorageHandler {
public static final int MAX_CRAFTING_PER_REQUEST = 500;
private TileController controller;
public StorageHandler(TileController controller) {
this.controller = controller;
}
public void handlePull(int id, int flags, EntityPlayerMP player) {
if (player.inventory.getItemStack() != null) {
return;
}
if (id < 0 || id > controller.getItemGroups().size() - 1) {
return;
}
ItemGroup group = controller.getItemGroups().get(id);
int quantity = 64;
if (GridPullFlags.isPullingHalf(flags) && group.getQuantity() > 1) {
quantity = group.getQuantity() / 2;
if (quantity > 32) {
quantity = 32;
}
} else if (GridPullFlags.isPullingOne(flags)) {
quantity = 1;
} else if (GridPullFlags.isPullingWithShift(flags)) {
// NO OP, the quantity already set (64) is needed for shift
}
if (quantity > group.getType().getItemStackLimit(group.toStack())) {
quantity = group.getType().getItemStackLimit(group.toStack());
}
ItemStack took = controller.take(group.copy(quantity).toStack());
if (took != null) {
if (GridPullFlags.isPullingWithShift(flags)) {
if (!player.inventory.addItemStackToInventory(took.copy())) {
controller.push(took);
}
} else {
player.inventory.setItemStack(took);
player.updateHeldItem();
}
controller.getWirelessGridHandler().drainEnergy(player, ItemWirelessGrid.USAGE_PULL);
}
}
public void handlePush(int playerSlot, boolean one, EntityPlayerMP player) {
ItemStack stack;
if (playerSlot == -1) {
stack = player.inventory.getItemStack().copy();
if (one) {
stack.stackSize = 1;
}
} else {
stack = player.inventory.getStackInSlot(playerSlot);
}
if (stack != null) {
boolean success = controller.push(stack);
if (success) {
if (playerSlot == -1) {
if (one) {
player.inventory.getItemStack().stackSize--;
if (player.inventory.getItemStack().stackSize == 0) {
player.inventory.setItemStack(null);
}
} else {
player.inventory.setItemStack(null);
}
player.updateHeldItem();
} else {
player.inventory.setInventorySlotContents(playerSlot, null);
}
}
controller.getWirelessGridHandler().drainEnergy(player, ItemWirelessGrid.USAGE_PUSH);
}
}
public void handleCraftingRequest(int id, int quantity) {
if (id >= 0 && id < controller.getItemGroups().size() && quantity > 0 && quantity <= MAX_CRAFTING_PER_REQUEST) {
ItemStack requested = controller.getItemGroups().get(id).toStack();
int quantityPerRequest = 0;
CraftingPattern pattern = controller.getPattern(requested);
if (pattern != null) {
for (ItemStack output : pattern.getOutputs()) {
if (RefinedStorageUtils.compareStackNoQuantity(requested, output)) {
quantityPerRequest = output.stackSize;
break;
}
}
while (quantity > 0) {
controller.addCraftingTask(pattern);
quantity -= quantityPerRequest;
}
}
}
}
public void handleCraftingCancel(int id) {
if (id >= 0 && id < controller.getCraftingTasks().size()) {
controller.cancelCraftingTask(controller.getCraftingTasks().get(id));
} else if (id == -1) {
for (ICraftingTask task : controller.getCraftingTasks()) {
controller.cancelCraftingTask(task);
}
}
}
}

View File

@@ -1,31 +1,30 @@
package refinedstorage.tile;
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.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import refinedstorage.*;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.block.BlockController;
import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerController;
import refinedstorage.item.ItemPattern;
import refinedstorage.item.ItemWirelessGrid;
import refinedstorage.network.GridPullFlags;
import refinedstorage.network.MessageWirelessGridItems;
import refinedstorage.storage.IStorage;
import refinedstorage.storage.IStorageProvider;
import refinedstorage.storage.ItemGroup;
import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase;
import refinedstorage.tile.TileMachine;
import refinedstorage.tile.TileWirelessTransmitter;
import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.autocrafting.TileCrafter;
import refinedstorage.tile.autocrafting.task.BasicCraftingTask;
@@ -33,50 +32,23 @@ import refinedstorage.tile.autocrafting.task.ICraftingTask;
import refinedstorage.tile.autocrafting.task.ProcessingCraftingTask;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.grid.WirelessGridConsumer;
import java.util.*;
public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
public class ClientSideMachine {
public ItemStack stack;
public int amount;
public int energyUsage;
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof ClientSideMachine)) {
return false;
}
return energyUsage == ((ClientSideMachine) other).energyUsage && RefinedStorageUtils.compareStack(stack, ((ClientSideMachine) other).stack);
}
@Override
public int hashCode() {
int result = stack.hashCode();
result = 31 * result + energyUsage;
return result;
}
}
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 int MAX_CRAFTING_QUANTITY_PER_REQUEST = 500;
private EnumControllerType type;
private StorageHandler storageHandler = new StorageHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private List<ItemGroup> itemGroups = new ArrayList<ItemGroup>();
private List<IStorage> storages = new ArrayList<IStorage>();
private List<WirelessGridConsumer> wirelessGridConsumers = new ArrayList<WirelessGridConsumer>();
private List<WirelessGridConsumer> wirelessGridConsumersToRemove = new ArrayList<WirelessGridConsumer>();
private Set<Integer> combinedGroupsIndices = new HashSet<Integer>();
private List<ItemGroup> combinedGroups = new ArrayList<ItemGroup>();
@@ -97,20 +69,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY);
private int energyUsage;
private int wirelessGridRange;
private boolean couldRun;
private long lastEnergyUpdate;
private int wirelessGridRange;
public void addMachine(TileMachine machine) {
machinesToAdd.add(machine);
}
public void removeMachine(TileMachine machine) {
machinesToRemove.add(machine);
}
@Override
public void update() {
super.update();
@@ -169,22 +133,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER);
}
wirelessGridConsumers.removeAll(wirelessGridConsumersToRemove);
wirelessGridConsumersToRemove.clear();
Iterator<WirelessGridConsumer> gridConsumerIterator = wirelessGridConsumers.iterator();
while (gridConsumerIterator.hasNext()) {
WirelessGridConsumer consumer = gridConsumerIterator.next();
if (!RefinedStorageUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) {
consumer.getPlayer().closeScreen(); // This will call onContainerClosed on the Container and remove it from the list
} else {
if (mayRun()) {
RefinedStorage.NETWORK.sendTo(new MessageWirelessGridItems(this), (EntityPlayerMP) consumer.getPlayer());
}
}
}
wirelessGridHandler.update();
if (getType() == EnumControllerType.NORMAL && energyUsage > 0) {
if (energy.getEnergyStored() - energyUsage >= 0) {
@@ -256,6 +205,15 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
syncItems();
}
public void addMachine(TileMachine machine) {
machinesToAdd.add(machine);
}
public void removeMachine(TileMachine machine) {
machinesToRemove.add(machine);
}
public EnumControllerType getType() {
if (type == null && worldObj.getBlockState(pos).getBlock() == RefinedStorageBlocks.CONTROLLER) {
this.type = (EnumControllerType) worldObj.getBlockState(pos).getValue(BlockController.TYPE);
@@ -264,6 +222,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
return type == null ? EnumControllerType.NORMAL : type;
}
public StorageHandler getStorageHandler() {
return storageHandler;
}
public WirelessGridHandler getWirelessGridHandler() {
return wirelessGridHandler;
}
public int getWirelessGridRange() {
return wirelessGridRange;
}
@@ -280,6 +246,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
return itemGroups;
}
public void writeItemGroups(ByteBuf buf) {
buf.writeInt(itemGroups.size());
for (ItemGroup group : itemGroups) {
group.toBytes(buf, itemGroups.indexOf(group));
}
}
public List<ICraftingTask> getCraftingTasks() {
return craftingTasks;
}
@@ -439,62 +413,6 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
energy.setEnergyStored(amount);
}
public boolean onOpenWirelessGrid(EntityPlayer player, EnumHand hand) {
boolean inRange = (int) Math.sqrt(Math.pow(getPos().getX() - player.posX, 2) + Math.pow(getPos().getY() - player.posY, 2) + Math.pow(getPos().getZ() - player.posZ, 2)) < getWirelessGridRange();
if (!inRange) {
return false;
}
wirelessGridConsumers.add(new WirelessGridConsumer(player, hand, player.getHeldItem(hand)));
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, worldObj, RefinedStorageUtils.getIdFromHand(hand), 0, 0);
drainEnergyFromWirelessGrid(player, ItemWirelessGrid.USAGE_OPEN);
return true;
}
public void onCloseWirelessGrid(EntityPlayer player) {
WirelessGridConsumer consumer = getWirelessGridConsumer(player);
if (consumer != null) {
wirelessGridConsumersToRemove.add(consumer);
}
}
public void drainEnergyFromWirelessGrid(EntityPlayer player, int energy) {
WirelessGridConsumer consumer = getWirelessGridConsumer(player);
if (consumer != null) {
ItemWirelessGrid item = RefinedStorageItems.WIRELESS_GRID;
ItemStack held = consumer.getPlayer().getHeldItem(consumer.getHand());
if (held.getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) {
item.extractEnergy(held, energy, false);
if (item.getEnergyStored(held) <= 0) {
onCloseWirelessGrid(player);
consumer.getPlayer().closeScreen();
}
}
}
}
public WirelessGridConsumer getWirelessGridConsumer(EntityPlayer player) {
Iterator<WirelessGridConsumer> it = wirelessGridConsumers.iterator();
while (it.hasNext()) {
WirelessGridConsumer consumer = it.next();
if (consumer.getPlayer() == player) {
return consumer;
}
}
return null;
}
@Override
public NBTTagCompound write(NBTTagCompound tag) {
super.write(tag);
@@ -688,129 +606,4 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
public Class<? extends Container> getContainer() {
return ContainerController.class;
}
public void handleStoragePull(int id, int flags, EntityPlayerMP player) {
if (player.inventory.getItemStack() != null) {
return;
}
if (id < 0 || id > itemGroups.size() - 1) {
return;
}
ItemGroup group = itemGroups.get(id);
int quantity = 64;
if (GridPullFlags.isPullingHalf(flags) && group.getQuantity() > 1) {
quantity = group.getQuantity() / 2;
if (quantity > 32) {
quantity = 32;
}
} else if (GridPullFlags.isPullingOne(flags)) {
quantity = 1;
} else if (GridPullFlags.isPullingWithShift(flags)) {
// NO OP, the quantity already set (64) is needed for shift
}
if (quantity > group.getType().getItemStackLimit(group.toStack())) {
quantity = group.getType().getItemStackLimit(group.toStack());
}
ItemStack took = take(group.copy(quantity).toStack());
if (took != null) {
if (GridPullFlags.isPullingWithShift(flags)) {
if (!player.inventory.addItemStackToInventory(took.copy())) {
push(took);
}
} else {
player.inventory.setItemStack(took);
player.updateHeldItem();
}
drainEnergyFromWirelessGrid(player, ItemWirelessGrid.USAGE_PULL);
}
}
public void handleStoragePush(int playerSlot, boolean one, EntityPlayerMP player) {
ItemStack stack;
if (playerSlot == -1) {
stack = player.inventory.getItemStack().copy();
if (one) {
stack.stackSize = 1;
}
} else {
stack = player.inventory.getStackInSlot(playerSlot);
}
if (stack != null) {
boolean success = push(stack);
if (success) {
if (playerSlot == -1) {
if (one) {
player.inventory.getItemStack().stackSize--;
if (player.inventory.getItemStack().stackSize == 0) {
player.inventory.setItemStack(null);
}
} else {
player.inventory.setItemStack(null);
}
player.updateHeldItem();
} else {
player.inventory.setInventorySlotContents(playerSlot, null);
}
}
drainEnergyFromWirelessGrid(player, ItemWirelessGrid.USAGE_PUSH);
}
}
public void sendItemGroups(ByteBuf buf) {
buf.writeInt(getItemGroups().size());
for (ItemGroup group : getItemGroups()) {
group.toBytes(buf, getItemGroups().indexOf(group));
}
}
public void onCraftingRequested(int id, int quantity) {
if (id >= 0 && id < itemGroups.size() && quantity > 0 && quantity <= MAX_CRAFTING_QUANTITY_PER_REQUEST) {
ItemStack requested = itemGroups.get(id).toStack();
int quantityPerRequest = 0;
CraftingPattern pattern = getPattern(requested);
if (pattern != null) {
for (ItemStack output : pattern.getOutputs()) {
if (RefinedStorageUtils.compareStackNoQuantity(requested, output)) {
quantityPerRequest = output.stackSize;
break;
}
}
while (quantity > 0) {
addCraftingTask(pattern);
quantity -= quantityPerRequest;
}
}
}
}
public void onCraftingTaskCancelRequested(int id) {
if (id >= 0 && id < craftingTasks.size()) {
cancelCraftingTask(craftingTasks.get(id));
} else if (id == -1) {
for (ICraftingTask task : craftingTasks) {
cancelCraftingTask(task);
}
}
}
}

View File

@@ -0,0 +1,103 @@
package refinedstorage.tile.controller;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageGui;
import refinedstorage.RefinedStorageItems;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.item.ItemWirelessGrid;
import refinedstorage.network.MessageWirelessGridItems;
import refinedstorage.tile.grid.WirelessGridConsumer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class WirelessGridHandler {
private TileController controller;
private List<WirelessGridConsumer> consumers = new ArrayList<WirelessGridConsumer>();
private List<WirelessGridConsumer> consumersToRemove = new ArrayList<WirelessGridConsumer>();
public WirelessGridHandler(TileController controller) {
this.controller = controller;
}
public void update() {
consumers.removeAll(consumersToRemove);
consumersToRemove.clear();
Iterator<WirelessGridConsumer> it = consumers.iterator();
while (it.hasNext()) {
WirelessGridConsumer consumer = it.next();
if (!RefinedStorageUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) {
consumer.getPlayer().closeScreen(); // This will call onContainerClosed on the Container and remove it from the list
} else {
if (controller.mayRun()) {
RefinedStorage.NETWORK.sendTo(new MessageWirelessGridItems(controller), (EntityPlayerMP) consumer.getPlayer());
}
}
}
}
public boolean handleOpen(EntityPlayer player, EnumHand hand) {
int distance = (int) Math.sqrt(Math.pow(controller.getPos().getX() - player.posX, 2) + Math.pow(controller.getPos().getY() - player.posY, 2) + Math.pow(controller.getPos().getZ() - player.posZ, 2));
if (distance > controller.getWirelessGridRange()) {
return false;
}
consumers.add(new WirelessGridConsumer(player, hand, player.getHeldItem(hand)));
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, controller.getWorld(), RefinedStorageUtils.getIdFromHand(hand), 0, 0);
drainEnergy(player, ItemWirelessGrid.USAGE_OPEN);
return true;
}
public void handleClose(EntityPlayer player) {
WirelessGridConsumer consumer = getConsumer(player);
if (consumer != null) {
consumersToRemove.add(consumer);
}
}
public void drainEnergy(EntityPlayer player, int energy) {
WirelessGridConsumer consumer = getConsumer(player);
if (consumer != null) {
ItemWirelessGrid item = RefinedStorageItems.WIRELESS_GRID;
ItemStack held = consumer.getPlayer().getHeldItem(consumer.getHand());
if (held.getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) {
item.extractEnergy(held, energy, false);
if (item.getEnergyStored(held) <= 0) {
handleClose(player);
consumer.getPlayer().closeScreen();
}
}
}
}
public WirelessGridConsumer getConsumer(EntityPlayer player) {
Iterator<WirelessGridConsumer> it = consumers.iterator();
while (it.hasNext()) {
WirelessGridConsumer consumer = it.next();
if (consumer.getPlayer() == player) {
return consumer;
}
}
return null;
}
}

View File

@@ -337,7 +337,7 @@ public class TileGrid extends TileMachine implements IGrid {
buf.writeInt(searchBoxMode);
if (connected) {
controller.sendItemGroups(buf);
controller.writeItemGroups(buf);
} else {
buf.writeInt(0);
}

View File

@@ -14,8 +14,8 @@ import refinedstorage.network.MessageWirelessGridSettingsUpdate;
import refinedstorage.network.MessageWirelessGridStoragePull;
import refinedstorage.network.MessageWirelessGridStoragePush;
import refinedstorage.storage.ItemGroup;
import refinedstorage.tile.TileController;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.controller.TileController;
import java.util.ArrayList;
import java.util.List;
@@ -62,7 +62,7 @@ public class WirelessGrid implements IGrid {
TileEntity tile = player.worldObj.getTileEntity(new BlockPos(ItemWirelessGrid.getX(stack), ItemWirelessGrid.getY(stack), ItemWirelessGrid.getZ(stack)));
if (tile instanceof TileController) {
((TileController) tile).onCloseWirelessGrid(player);
((TileController) tile).getWirelessGridHandler().handleClose(player);
}
}