Add fluid grid handler

This commit is contained in:
Raoul Van den Berge
2016-08-13 02:00:43 +02:00
parent 1a3351311f
commit 24a765f705
19 changed files with 255 additions and 52 deletions

View File

@@ -7,6 +7,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fluids.FluidStack;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.api.storage.fluid.IGroupedFluidStorage;
@@ -50,6 +51,11 @@ public interface INetworkMaster {
*/
IItemGridHandler getItemGridHandler();
/**
* @return The {@link IFluidGridHandler} for this network
*/
IFluidGridHandler getFluidGridHandler();
/**
* @return The {@link IWirelessGridHandler} for this network
*/

View File

@@ -2,6 +2,7 @@ package refinedstorage.api.network;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.storage.CompareUtils;
@@ -29,6 +30,10 @@ public final class NetworkUtils {
return stack.getItem().hashCode() * (stack.getItemDamage() + 1) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1);
}
public static int getFluidStackHashCode(FluidStack stack) {
return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1);
}
public static int getNodeHashCode(World world, INetworkNode node) {
int result = node.getPosition().hashCode();
result = 31 * result + world.provider.getDimension();

View File

@@ -0,0 +1,36 @@
package refinedstorage.api.network.grid;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
/**
* Defines the behavior of item grids.
*/
public interface IFluidGridHandler {
/**
* Called when a player tries to extract a fluid from the grid.
*
* @param hash The hash of the fluid we're trying to extract, see {@link refinedstorage.api.network.NetworkUtils#getFluidStackHashCode(net.minecraftforge.fluids.FluidStack)}
* @param shift If we're shift clicking
* @param player The player that is attempting the extraction
*/
void onExtract(int hash, boolean shift, EntityPlayerMP player);
/**
* Called when a player tries to insert fluids to the grid.
*
* @param container A stack with a container we're trying to insert
* @return The remainder, or null if there is no remainder
*/
@Nullable
ItemStack onInsert(ItemStack container);
/**
* Called when a player is trying to insert a fluid that it is holding in their hand in the GUI.
*
* @param player The player that is attempting the insert
*/
void onInsertHeldContainer(EntityPlayerMP player);
}

View File

@@ -0,0 +1,33 @@
package refinedstorage.apiimpl.network.grid;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.grid.IFluidGridHandler;
import javax.annotation.Nullable;
public class FluidGridHandler implements IFluidGridHandler {
private INetworkMaster network;
public FluidGridHandler(INetworkMaster network) {
this.network = network;
}
@Override
public void onExtract(int hash, boolean shift, EntityPlayerMP player) {
System.out.println("Extract " + hash);
}
@Nullable
@Override
public ItemStack onInsert(ItemStack container) {
System.out.println("Insert " + container);
return container;
}
@Override
public void onInsertHeldContainer(EntityPlayerMP player) {
System.out.println("Insert held!");
}
}

View File

@@ -106,8 +106,12 @@ public class ContainerGrid extends ContainerBase {
if (slot.getHasStack()) {
if (slot == craftingResultSlot) {
((TileGrid) grid).onCraftedShift(this, player);
} else if (grid.getHandler() != null && slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy) && grid.getType() != EnumGridType.FLUID) {
slot.putStack(grid.getHandler().onInsert(slot.getStack()));
} else if (slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy)) {
if (grid.getType() != EnumGridType.FLUID && grid.getItemHandler() != null) {
slot.putStack(grid.getItemHandler().onInsert(slot.getStack()));
} else if (grid.getType() == EnumGridType.FLUID && grid.getFluidHandler() != null) {
slot.putStack(grid.getFluidHandler().onInsert(slot.getStack()));
}
detectAndSendChanges();
}

View File

@@ -27,10 +27,7 @@ import refinedstorage.gui.grid.stack.ClientStackItem;
import refinedstorage.gui.grid.stack.IClientStack;
import refinedstorage.gui.sidebutton.*;
import refinedstorage.integration.jei.IntegrationJEI;
import refinedstorage.network.MessageGridCraftingClear;
import refinedstorage.network.MessageGridInsertHeld;
import refinedstorage.network.MessageGridPatternCreate;
import refinedstorage.network.MessageGridPull;
import refinedstorage.network.*;
import refinedstorage.tile.grid.IGrid;
import refinedstorage.tile.grid.TileGrid;
import refinedstorage.tile.grid.WirelessGrid;
@@ -352,7 +349,7 @@ public class GuiGrid extends GuiBase {
BlockPos gridPos = ((TileGrid) grid).getPos();
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPatternCreate(gridPos.getX(), gridPos.getY(), gridPos.getZ()));
} else if (grid.isConnected() && grid.getType() != EnumGridType.FLUID) {
} else if (grid.isConnected()) {
if (clickedClear) {
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingClear((TileGrid) grid));
}
@@ -360,30 +357,34 @@ public class GuiGrid extends GuiBase {
ItemStack held = container.getPlayer().inventory.getItemStack();
if (isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && held != null && (clickedButton == 0 || clickedButton == 1)) {
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridInsertHeld(clickedButton == 1));
RefinedStorage.INSTANCE.network.sendToServer(grid.getType() == EnumGridType.FLUID ? new MessageGridFluidInsertHeld() : new MessageGridItemInsertHeld(clickedButton == 1));
}
if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) {
ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber);
if (grid.getType() != EnumGridType.FLUID) {
ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber);
if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) {
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), stack));
if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) {
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), stack));
} else {
int flags = 0;
if (clickedButton == 1) {
flags |= IItemGridHandler.EXTRACT_HALF;
}
if (GuiScreen.isShiftKeyDown()) {
flags |= IItemGridHandler.EXTRACT_SHIFT;
}
if (clickedButton == 2) {
flags |= IItemGridHandler.EXTRACT_SINGLE;
}
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridItemPull(stack.getHash(), flags));
}
} else {
int flags = 0;
if (clickedButton == 1) {
flags |= IItemGridHandler.EXTRACT_HALF;
}
if (GuiScreen.isShiftKeyDown()) {
flags |= IItemGridHandler.EXTRACT_SHIFT;
}
if (clickedButton == 2) {
flags |= IItemGridHandler.EXTRACT_SINGLE;
}
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(stack.getHash(), flags));
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridFluidPull(STACKS.get(slotNumber).getHash(), GuiScreen.isShiftKeyDown()));
}
}
}

View File

@@ -6,32 +6,40 @@ import net.minecraft.client.Minecraft;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import refinedstorage.api.network.NetworkUtils;
import refinedstorage.gui.GuiBase;
import java.util.Locale;
public class ClientStackFluid implements IClientStack {
private int hash;
private FluidStack stack;
private FluidStackRenderer renderer;
public ClientStackFluid(ByteBuf buf) {
stack = new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf));
renderer = new FluidStackRenderer(1000, false, 16, 16, null);
this.hash = buf.readInt();
this.stack = new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf));
// @TODO: Switch to own implementation
this.renderer = new FluidStackRenderer(1000, false, 16, 16, null);
}
public FluidStack getStack() {
return stack;
}
@Override
public int getHash() {
return hash;
}
@Override
public String getName() {
return stack.getFluid().getLocalizedName(stack);
}
// @todo: ;-)
@Override
public String getModId() {
return "minecraft";
return stack.getFluid().getStill(stack).getResourceDomain();
}
@Override
@@ -57,6 +65,7 @@ public class ClientStackFluid implements IClientStack {
}
public static void write(ByteBuf buf, FluidStack stack) {
buf.writeInt(NetworkUtils.getFluidStackHashCode(stack));
ByteBufUtils.writeUTF8String(buf, FluidRegistry.getFluidName(stack.getFluid()));
buf.writeInt(stack.amount);
ByteBufUtils.writeTag(buf, stack.tag);

View File

@@ -24,10 +24,6 @@ public class ClientStackItem implements IClientStack {
craftable = buf.readBoolean();
}
public int getHash() {
return hash;
}
public ItemStack getStack() {
return stack;
}
@@ -36,6 +32,11 @@ public class ClientStackItem implements IClientStack {
return craftable;
}
@Override
public int getHash() {
return hash;
}
@Override
public String getName() {
return stack.getDisplayName();

View File

@@ -3,6 +3,8 @@ package refinedstorage.gui.grid.stack;
import refinedstorage.gui.GuiBase;
public interface IClientStack {
int getHash();
String getName();
String getModId();

View File

@@ -36,7 +36,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<Messa
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getHandler();
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getItemHandler();
if (handler != null) {
handler.onCraftingRequested(message.hash, message.quantity);

View File

@@ -0,0 +1,34 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridFluidInsertHeld extends MessageHandlerPlayerToServer<MessageGridFluidInsertHeld> implements IMessage {
public MessageGridFluidInsertHeld() {
}
@Override
public void fromBytes(ByteBuf buf) {
}
@Override
public void toBytes(ByteBuf buf) {
}
@Override
public void handle(MessageGridFluidInsertHeld message, EntityPlayerMP player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler();
if (handler != null) {
handler.onInsertHeldContainer(player);
}
}
}
}

View File

@@ -0,0 +1,46 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridFluidPull extends MessageHandlerPlayerToServer<MessageGridFluidPull> implements IMessage {
private int hash;
private boolean shift;
public MessageGridFluidPull() {
}
public MessageGridFluidPull(int hash, boolean shift) {
this.hash = hash;
this.shift = shift;
}
@Override
public void fromBytes(ByteBuf buf) {
hash = buf.readInt();
shift = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(hash);
buf.writeBoolean(shift);
}
@Override
public void handle(MessageGridFluidPull message, EntityPlayerMP player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler();
if (handler != null) {
handler.onExtract(message.hash, message.shift, player);
}
}
}
}

View File

@@ -7,13 +7,13 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridInsertHeld extends MessageHandlerPlayerToServer<MessageGridInsertHeld> implements IMessage {
public class MessageGridItemInsertHeld extends MessageHandlerPlayerToServer<MessageGridItemInsertHeld> implements IMessage {
private boolean single;
public MessageGridInsertHeld() {
public MessageGridItemInsertHeld() {
}
public MessageGridInsertHeld(boolean single) {
public MessageGridItemInsertHeld(boolean single) {
this.single = single;
}
@@ -28,11 +28,11 @@ public class MessageGridInsertHeld extends MessageHandlerPlayerToServer<MessageG
}
@Override
public void handle(MessageGridInsertHeld message, EntityPlayerMP player) {
public void handle(MessageGridItemInsertHeld message, EntityPlayerMP player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getHandler();
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getItemHandler();
if (handler != null) {
handler.onInsertHeldItem(message.single, player);

View File

@@ -7,14 +7,14 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPull> implements IMessage {
public class MessageGridItemPull extends MessageHandlerPlayerToServer<MessageGridItemPull> implements IMessage {
private int hash;
private int flags;
public MessageGridPull() {
public MessageGridItemPull() {
}
public MessageGridPull(int hash, int flags) {
public MessageGridItemPull(int hash, int flags) {
this.hash = hash;
this.flags = flags;
}
@@ -32,11 +32,11 @@ public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPul
}
@Override
public void handle(MessageGridPull message, EntityPlayerMP player) {
public void handle(MessageGridItemPull message, EntityPlayerMP player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getHandler();
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getItemHandler();
if (handler != null) {
handler.onExtract(message.hash, message.flags, player);

View File

@@ -44,8 +44,8 @@ public class CommonProxy {
RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT);
RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameterUpdate.class, MessageTileDataParameterUpdate.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridInsertHeld.class, MessageGridInsertHeld.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridPull.class, MessageGridPull.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemInsertHeld.class, MessageGridItemInsertHeld.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemPull.class, MessageGridItemPull.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingClear.class, MessageGridCraftingClear.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingTransfer.class, MessageGridCraftingTransfer.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageWirelessGridSettingsUpdate.class, MessageWirelessGridSettingsUpdate.class, id++, Side.SERVER);
@@ -56,6 +56,8 @@ public class CommonProxy {
RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemDelta.class, MessageGridItemDelta.class, id++, Side.CLIENT);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidUpdate.class, MessageGridFluidUpdate.class, id++, Side.CLIENT);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidDelta.class, MessageGridFluidDelta.class, id++, Side.CLIENT);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidPull.class, MessageGridFluidPull.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidInsertHeld.class, MessageGridFluidInsertHeld.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageProcessingPatternEncoderClear.class, MessageProcessingPatternEncoderClear.class, id++, Side.SERVER);
RefinedStorage.INSTANCE.network.registerMessage(MessageGridFilterUpdate.class, MessageGridFilterUpdate.class, id++, Side.SERVER);

View File

@@ -23,6 +23,7 @@ import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.*;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.api.storage.fluid.IFluidStorage;
@@ -34,6 +35,7 @@ import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask;
import refinedstorage.apiimpl.network.NetworkNodeGraph;
import refinedstorage.apiimpl.network.WirelessGridHandler;
import refinedstorage.apiimpl.network.grid.FluidGridHandler;
import refinedstorage.apiimpl.network.grid.ItemGridHandler;
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
import refinedstorage.apiimpl.storage.fluid.GroupedFluidStorage;
@@ -146,6 +148,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
};
private ItemGridHandler itemGridHandler = new ItemGridHandler(this);
private FluidGridHandler fluidGridHandler = new FluidGridHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private INetworkNodeGraph nodeGraph = new NetworkNodeGraph(this);
@@ -180,8 +184,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
dataManager.addParameter(ENERGY_CAPACITY);
dataManager.addParameter(NODES);
fluidStorage.add(new FluidStack(FluidRegistry.WATER, 1000 * 32), false);
fluidStorage.add(new FluidStack(FluidRegistry.LAVA, 1000 * 64), false);
fluidStorage.add(new FluidStack(FluidRegistry.WATER, 1000 * 32), true);
fluidStorage.add(new FluidStack(FluidRegistry.LAVA, 1000 * 64), true);
if (IntegrationIC2.isLoaded()) {
this.energyEU = new ControllerEnergyIC2(this);
@@ -325,6 +329,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return itemGridHandler;
}
@Override
public IFluidGridHandler getFluidGridHandler() {
return fluidGridHandler;
}
@Override
public IWirelessGridHandler getWirelessGridHandler() {
return wirelessGridHandler;

View File

@@ -1,6 +1,7 @@
package refinedstorage.tile.grid;
import net.minecraft.util.math.BlockPos;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.block.EnumGridType;
import refinedstorage.gui.grid.GridFilteredItem;
@@ -14,7 +15,9 @@ public interface IGrid {
BlockPos getNetworkPosition();
IItemGridHandler getHandler();
IItemGridHandler getItemHandler();
IFluidGridHandler getFluidHandler();
int getViewType();

View File

@@ -16,6 +16,7 @@ import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageItems;
import refinedstorage.api.network.NetworkUtils;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.block.BlockGrid;
@@ -199,10 +200,15 @@ public class TileGrid extends TileNode implements IGrid {
}
@Override
public IItemGridHandler getHandler() {
public IItemGridHandler getItemHandler() {
return isConnected() ? network.getItemGridHandler() : null;
}
@Override
public IFluidGridHandler getFluidHandler() {
return isConnected() ? network.getFluidGridHandler() : null;
}
public InventoryCrafting getMatrix() {
return matrix;
}

View File

@@ -7,6 +7,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.grid.IFluidGridHandler;
import refinedstorage.api.network.grid.IItemGridHandler;
import refinedstorage.block.EnumGridType;
import refinedstorage.gui.grid.GridFilteredItem;
@@ -84,12 +85,17 @@ public class WirelessGrid implements IGrid {
}
@Override
public IItemGridHandler getHandler() {
public IItemGridHandler getItemHandler() {
TileController controller = getController();
return controller != null ? controller.getItemGridHandler() : null;
}
@Override
public IFluidGridHandler getFluidHandler() {
return null;
}
@Override
public int getViewType() {
return viewType;