From d43e8d19dd0213fa0ab3de3a3acbd3df41984908 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 14 Jun 2020 21:23:42 +0200 Subject: [PATCH] Implements opening containers from items with and without a block context. --- .../implementations/guiobjects/IGuiItem.java | 14 ++- .../block/networking/BlockCableBus.java | 7 +- .../gui/implementations/GuiMEMonitorable.java | 4 + .../appeng/container/ContainerLocator.java | 108 +++++++++++++++--- ...tainerHelper.java => ContainerHelper.java} | 88 +++++++++++--- .../implementations/ContainerCraftAmount.java | 6 +- .../ContainerCraftConfirm.java | 8 +- .../ContainerCraftingStatus.java | 7 +- .../ContainerCraftingTerm.java | 7 +- .../implementations/ContainerInterface.java | 6 +- .../ContainerMEMonitorable.java | 12 +- .../ContainerMEPortableCell.java | 6 +- .../ContainerNetworkStatus.java | 7 +- .../implementations/ContainerNetworkTool.java | 7 +- .../implementations/ContainerPatternTerm.java | 7 +- .../implementations/ContainerPriority.java | 6 +- .../implementations/ContainerQuartzKnife.java | 6 +- .../ContainerSecurityStation.java | 7 +- .../implementations/ContainerUpgradeable.java | 13 +-- .../ContainerWirelessTerm.java | 7 +- .../features/registries/WirelessRegistry.java | 2 +- src/main/java/appeng/core/sync/GuiBridge.java | 19 --- .../appeng/core/sync/packets/PacketClick.java | 65 ++++++++--- .../container/ContainerFluidInterface.java | 6 +- .../container/ContainerFluidTerminal.java | 6 +- .../helpers/WirelessTerminalGuiObject.java | 4 +- .../appeng/items/tools/ToolNetworkTool.java | 80 ++++++------- .../items/tools/powered/ToolPortableCell.java | 6 +- .../tools/quartz/ToolQuartzCuttingKnife.java | 23 ++-- src/main/java/appeng/parts/PartPlacement.java | 2 +- 30 files changed, 342 insertions(+), 204 deletions(-) rename src/main/java/appeng/container/helper/{PartOrTileContainerHelper.java => ContainerHelper.java} (58%) diff --git a/src/api/java/appeng/api/implementations/guiobjects/IGuiItem.java b/src/api/java/appeng/api/implementations/guiobjects/IGuiItem.java index 0a52d461a..ef9b0fcf0 100644 --- a/src/api/java/appeng/api/implementations/guiobjects/IGuiItem.java +++ b/src/api/java/appeng/api/implementations/guiobjects/IGuiItem.java @@ -28,6 +28,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import javax.annotation.Nullable; + /** * Implemented on Item objects, to return objects used to manage, and interact @@ -35,6 +37,14 @@ import net.minecraft.world.World; */ public interface IGuiItem { - - IGuiItemObject getGuiObject( ItemStack is, World world, BlockPos pos ); + /** + * + * @param is The item used to open the container. + * @param playerInventorySlot The slot in the player's inventory the item is in. + * @param world The world the player is in. + * @param pos If the item was used on a block in the world, has that block's position. Null if no block was targetted. + * @return Null if no GUI object is available. + */ + @Nullable + IGuiItemObject getGuiObject( ItemStack is, int playerInventorySlot, World world, @Nullable BlockPos pos ); } diff --git a/src/main/java/appeng/block/networking/BlockCableBus.java b/src/main/java/appeng/block/networking/BlockCableBus.java index f2fc6ff5e..88c3ab0cd 100644 --- a/src/main/java/appeng/block/networking/BlockCableBus.java +++ b/src/main/java/appeng/block/networking/BlockCableBus.java @@ -47,10 +47,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.IFluidState; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.DyeColor; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.state.BooleanProperty; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; @@ -312,7 +309,7 @@ public class BlockCableBus extends AEBaseTileBlock /* FIXME implem if (this.cb(worldIn, pos).clicked(player, Hand.MAIN_HAND, hitVec)) { NetworkHandler.instance() .sendToServer( - new PacketClick(pos, ((BlockRayTraceResult) rtr).getFace(), (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, Hand.MAIN_HAND, true)); + new PacketClick(pos, brtr.getFace(), (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, Hand.MAIN_HAND, true)); } } } diff --git a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java index 974917388..96d6e3753 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java +++ b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java @@ -139,6 +139,10 @@ public class GuiMEMonitorable extends AEBaseME { this.myName = GuiText.Terminal; } + else + { + throw new IllegalArgumentException("Invalid GUI target given: " + te); + } } public void postUpdate( final List list ) diff --git a/src/main/java/appeng/container/ContainerLocator.java b/src/main/java/appeng/container/ContainerLocator.java index 21407268d..1465c4c2b 100644 --- a/src/main/java/appeng/container/ContainerLocator.java +++ b/src/main/java/appeng/container/ContainerLocator.java @@ -23,16 +23,16 @@ import appeng.api.parts.IPartHost; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.parts.AEBasePart; -import appeng.parts.misc.PartInterface; import com.google.common.base.Preconditions; import io.netty.handler.codec.DecoderException; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; -import org.apache.commons.lang3.NotImplementedException; /** * Describes how a container the player has opened was originally @@ -47,7 +47,16 @@ import org.apache.commons.lang3.NotImplementedException; public final class ContainerLocator { private enum Type { - ITEM, + /** + * An item used from the player's inventory. + */ + PLAYER_INVENTORY, + /** + * An item used from the player's inventory, but right-clicked + * on a block face, has block position and side in addition to the + * above. + */ + PLAYER_INVENTORY_WITH_BLOCK_CONTEXT, BLOCK, PART } @@ -82,9 +91,38 @@ public final class ContainerLocator { return new ContainerLocator(Type.PART, -1, dimensionId, te.getPos(), AEPartLocation.fromFacing(side)); } - public static ContainerLocator forHand(Hand hand) { - // FIXME can we get an inventory location for the hand? - throw new IllegalStateException(); + /** + * Construct a container locator for an item being used on a block. The item could still open a container + * for itself, but it might also open a special container for the block being right-clicked. + */ + public static ContainerLocator forItemUseContext(ItemUseContext context) { + PlayerEntity player = context.getPlayer(); + if (player == null) { + throw new IllegalArgumentException("Cannot open a container without a player"); + } + int dimensionId = player.world.getDimension().getType().getId(); + int slot = getPlayerInventorySlotFromHand(player, context.getHand()); + AEPartLocation side = AEPartLocation.fromFacing(context.getFace()); + return new ContainerLocator(Type.PLAYER_INVENTORY_WITH_BLOCK_CONTEXT, slot, dimensionId, context.getPos(), side); + } + + public static ContainerLocator forHand(PlayerEntity player, Hand hand) { + int slot = getPlayerInventorySlotFromHand(player, hand); + return new ContainerLocator(Type.PLAYER_INVENTORY, slot, -1, null, null); + } + + private static int getPlayerInventorySlotFromHand(PlayerEntity player, Hand hand) { + ItemStack is = player.getHeldItem(hand); + if (is.isEmpty()) { + throw new IllegalArgumentException("Cannot open an item-inventory with empty hands"); + } + int invSize = player.inventory.getSizeInventory(); + for (int i = 0; i < invSize; i++) { + if (player.inventory.getStackInSlot(i) == is) { + return i; + } + } + throw new IllegalArgumentException("Could not find item held in hand " + hand + " in player inventory"); } public static ContainerLocator forPart(AEBasePart part) { @@ -100,11 +138,11 @@ public final class ContainerLocator { } public boolean hasItemIndex() { - return type == Type.ITEM; + return type == Type.PLAYER_INVENTORY || type == Type.PLAYER_INVENTORY_WITH_BLOCK_CONTEXT; } public int getItemIndex() { - Preconditions.checkState(type == Type.ITEM); + Preconditions.checkState(hasItemIndex()); return itemIndex; } @@ -113,36 +151,43 @@ public final class ContainerLocator { } public boolean hasBlockPos() { - return type == Type.BLOCK || type == Type.PART; + return type == Type.BLOCK || type == Type.PART || type == Type.PLAYER_INVENTORY_WITH_BLOCK_CONTEXT; } public BlockPos getBlockPos() { - Preconditions.checkState(type == Type.BLOCK || type == Type.PART); + Preconditions.checkState(hasBlockPos()); return blockPos; } public boolean hasSide() { - return type == Type.PART; + return type == Type.PART || type == Type.PLAYER_INVENTORY_WITH_BLOCK_CONTEXT; } public AEPartLocation getSide() { - Preconditions.checkState(type == Type.PART); + Preconditions.checkState(hasSide()); return side; } public void write(PacketBuffer buf) { switch (type) { - case ITEM: + case PLAYER_INVENTORY: buf.writeByte(0); buf.writeInt(itemIndex); break; - case BLOCK: + case PLAYER_INVENTORY_WITH_BLOCK_CONTEXT: buf.writeByte(1); + buf.writeInt(itemIndex); + buf.writeInt(dimensionId); + buf.writeBlockPos(blockPos); + buf.writeByte(side.ordinal()); + break; + case BLOCK: + buf.writeByte(22); buf.writeInt(dimensionId); buf.writeBlockPos(blockPos); break; case PART: - buf.writeByte(2); + buf.writeByte(3); buf.writeInt(dimensionId); buf.writeBlockPos(blockPos); buf.writeByte(side.ordinal()); @@ -157,13 +202,21 @@ public final class ContainerLocator { switch (type) { case 0: return new ContainerLocator( - Type.ITEM, + Type.PLAYER_INVENTORY, buf.readInt(), -1, null, null ); case 1: + return new ContainerLocator( + Type.PLAYER_INVENTORY_WITH_BLOCK_CONTEXT, + buf.readInt(), + buf.readInt(), + buf.readBlockPos(), + AEPartLocation.values()[buf.readByte()] + ); + case 2: return new ContainerLocator( Type.BLOCK, -1, @@ -171,7 +224,7 @@ public final class ContainerLocator { buf.readBlockPos(), null ); - case 2: + case 3: return new ContainerLocator( Type.PART, -1, @@ -184,4 +237,25 @@ public final class ContainerLocator { } } + @Override + public String toString() { + StringBuilder result = new StringBuilder(type.name()); + result.append('{'); + if (hasItemIndex()) { + result.append("slot=").append(itemIndex).append(','); + } + if (hasBlockPos()) { + result.append("dim=").append(dimensionId).append(','); + result.append("pos=").append(blockPos).append(','); + } + if (hasSide()) { + result.append("side=").append(side).append(','); + } + if (result.charAt(result.length() - 1) == ',') { + result.setLength(result.length() - 1); + } + result.append('}'); + return result.toString(); + } + } diff --git a/src/main/java/appeng/container/helper/PartOrTileContainerHelper.java b/src/main/java/appeng/container/helper/ContainerHelper.java similarity index 58% rename from src/main/java/appeng/container/helper/PartOrTileContainerHelper.java rename to src/main/java/appeng/container/helper/ContainerHelper.java index 14ade5dcb..7ee4fa3d8 100644 --- a/src/main/java/appeng/container/helper/PartOrTileContainerHelper.java +++ b/src/main/java/appeng/container/helper/ContainerHelper.java @@ -1,26 +1,30 @@ package appeng.container.helper; +import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridNode; -import appeng.api.networking.energy.IEnergyGrid; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.ISecurityGrid; +import appeng.api.features.IWirelessTermHandler; +import appeng.api.implementations.guiobjects.IGuiItem; +import appeng.api.implementations.guiobjects.IGuiItemObject; import appeng.api.parts.IPart; import appeng.api.parts.IPartHost; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.core.AELog; +import appeng.helpers.ICustomNameObject; +import appeng.helpers.WirelessTerminalGuiObject; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.inventory.container.SimpleNamedContainerProvider; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; /** @@ -29,18 +33,17 @@ import net.minecraftforge.fml.network.NetworkHooks; * * @param */ -// FIXME: This is also used in contexts where access is via an item that implements I or exposes I via IGuiItemObject -public final class PartOrTileContainerHelper extends AbstractContainerHelper { +public final class ContainerHelper extends AbstractContainerHelper { private final Class interfaceClass; private final ContainerFactory factory; - public PartOrTileContainerHelper(ContainerFactory factory, Class interfaceClass) { + public ContainerHelper(ContainerFactory factory, Class interfaceClass) { this(factory, interfaceClass, null); } - public PartOrTileContainerHelper(ContainerFactory factory, Class interfaceClass, SecurityPermissions requiredPermission) { + public ContainerHelper(ContainerFactory factory, Class interfaceClass, SecurityPermissions requiredPermission) { super(requiredPermission); this.interfaceClass = interfaceClass; this.factory = factory; @@ -75,10 +78,7 @@ public final class PartOrTileContainerHelper exten return false; } - // Use block name at position - // FIXME: this is not right, we'd need to check the part's item stack, or custom naming interface impl - // FIXME: Should move this up, because at this point, it's hard to know where the terminal host came from (part or tile) - ITextComponent title = player.world.getBlockState(locator.getBlockPos()).getBlock().getNameTextComponent(); + ITextComponent title = findContainerTitle(player.world, locator, accessInterface); INamedContainerProvider container = new SimpleNamedContainerProvider( (wnd, p, pl) -> { @@ -94,7 +94,31 @@ public final class PartOrTileContainerHelper exten return true; } + private ITextComponent findContainerTitle(World world, ContainerLocator locator, I accessInterface) { + + if (accessInterface instanceof ICustomNameObject) { + ICustomNameObject customNameObject = (ICustomNameObject) accessInterface; + if (customNameObject.hasCustomInventoryName()) { + return customNameObject.getCustomInventoryName(); + } + } + + // Use block name at position + // FIXME: this is not right, we'd need to check the part's item stack, or custom naming interface impl + // FIXME: Should move this up, because at this point, it's hard to know where the terminal host came from (part or tile) + if (locator.hasBlockPos()) { + return world.getBlockState(locator.getBlockPos()).getBlock().getNameTextComponent(); + } + + return new StringTextComponent("Unknown"); + + } + private I getHostFromLocator(PlayerEntity player, ContainerLocator locator) { + if (locator.hasItemIndex()) { + return getHostFromPlayerInventory(player, locator); + } + if (!locator.hasBlockPos() || !locator.hasSide()) { return null; // No block was clicked or the side is unknown // FIXME: If no side is provided, should be try with INTERNAL??? @@ -116,7 +140,7 @@ public final class PartOrTileContainerHelper exten if (interfaceClass.isInstance(part)) { return interfaceClass.cast(part); } else { - AELog.debug("Trying to open a container @ {} for a {}, but the container requires {}", + AELog.debug("Trying to open a container @ %s for a %s, but the container requires %s", locator, part.getClass(), interfaceClass); return null; } @@ -126,6 +150,38 @@ public final class PartOrTileContainerHelper exten } } + private I getHostFromPlayerInventory(PlayerEntity player, ContainerLocator locator) { + + ItemStack it = player.inventory.getStackInSlot(locator.getItemIndex()); + + if (it.isEmpty()) { + AELog.debug("Cannot open container for player %s since they no longer hold the item in slot %d", + player, locator.hasItemIndex()); + return null; + } + + if ( it.getItem() instanceof IGuiItem ) + { + IGuiItem guiItem = (IGuiItem) it.getItem(); + // Optionally contains the block the item was used on to open the container + BlockPos blockPos = locator.hasBlockPos() ? locator.getBlockPos() : null; + IGuiItemObject guiObject = guiItem.getGuiObject(it, locator.getItemIndex(), player.world, blockPos); + if (interfaceClass.isInstance(guiObject)) { + return interfaceClass.cast(guiObject); + } + } + + if( interfaceClass.isAssignableFrom(WirelessTerminalGuiObject.class) ) + { + final IWirelessTermHandler wh = AEApi.instance().registries().wireless().getWirelessTerminalHandler( it ); + if ( wh != null) { + return interfaceClass.cast(new WirelessTerminalGuiObject(wh, it, player, locator.getItemIndex())); + } + } + + return null; + } + @FunctionalInterface public interface ContainerFactory { C create(int windowId, PlayerInventory playerInv, I accessObj); diff --git a/src/main/java/appeng/container/implementations/ContainerCraftAmount.java b/src/main/java/appeng/container/implementations/ContainerCraftAmount.java index f99a8d7c3..456061ab2 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftAmount.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftAmount.java @@ -22,7 +22,7 @@ package appeng.container.implementations; import javax.annotation.Nonnull; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ContainerType; @@ -47,8 +47,8 @@ public class ContainerCraftAmount extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerCraftAmount::new, ITerminalHost.class, SecurityPermissions.CRAFT); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerCraftAmount::new, ITerminalHost.class, SecurityPermissions.CRAFT); private final Slot craftingItem; private IAEItemStack itemToCreate; diff --git a/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java b/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java index 61a60ca3e..86da73ec8 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java @@ -39,8 +39,7 @@ import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.guisync.GuiSync; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import appeng.core.AELog; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketMEInventoryUpdate; @@ -57,7 +56,6 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.container.ContainerType; import net.minecraft.inventory.container.IContainerListener; import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; @@ -73,8 +71,8 @@ public class ContainerCraftConfirm extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerCraftConfirm::new, ITerminalHost.class, SecurityPermissions.CRAFT); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerCraftConfirm::new, ITerminalHost.class, SecurityPermissions.CRAFT); public static ContainerCraftConfirm fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerCraftingStatus.java b/src/main/java/appeng/container/implementations/ContainerCraftingStatus.java index 3e8e970dd..0541ec0b1 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingStatus.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingStatus.java @@ -25,8 +25,7 @@ import java.util.List; import appeng.api.config.SecurityPermissions; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import com.google.common.collect.ImmutableSet; import net.minecraft.entity.player.PlayerEntity; @@ -46,8 +45,8 @@ public class ContainerCraftingStatus extends ContainerCraftingCPU public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerCraftingStatus::new, ITerminalHost.class, SecurityPermissions.CRAFT); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerCraftingStatus::new, ITerminalHost.class, SecurityPermissions.CRAFT); public static ContainerCraftingStatus fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java index b5935388e..b007f8e02 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java @@ -21,8 +21,7 @@ package appeng.container.implementations; import appeng.api.config.SecurityPermissions; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.IInventory; @@ -53,8 +52,8 @@ public class ContainerCraftingTerm extends ContainerMEMonitorable implements IAE public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerCraftingTerm::new, ITerminalHost.class, SecurityPermissions.CRAFT); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerCraftingTerm::new, ITerminalHost.class, SecurityPermissions.CRAFT); public static ContainerCraftingTerm fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerInterface.java b/src/main/java/appeng/container/implementations/ContainerInterface.java index ed0f90298..5c6f982b7 100644 --- a/src/main/java/appeng/container/implementations/ContainerInterface.java +++ b/src/main/java/appeng/container/implementations/ContainerInterface.java @@ -20,7 +20,7 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -43,8 +43,8 @@ public class ContainerInterface extends ContainerUpgradeable public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerInterface::new, IInterfaceHost.class, SecurityPermissions.BUILD); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerInterface::new, IInterfaceHost.class, SecurityPermissions.BUILD); public static ContainerInterface fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java index bb06d411e..8068e6f40 100644 --- a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java +++ b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java @@ -24,8 +24,9 @@ import java.nio.BufferOverflowException; import javax.annotation.Nonnull; +import appeng.api.implementations.guiobjects.IGuiItemObject; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -82,8 +83,8 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerMEMonitorable::new, ITerminalHost.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerMEMonitorable::new, ITerminalHost.class); public static ContainerMEMonitorable fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); @@ -116,7 +117,8 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa id, ip, monitorable instanceof TileEntity ? (TileEntity) monitorable : null, - monitorable instanceof IPart ? (IPart) monitorable : null ); + monitorable instanceof IPart ? (IPart) monitorable : null, + monitorable instanceof IGuiItemObject ? (IGuiItemObject) monitorable : null); this.host = monitorable; this.clientCM = new ConfigManager( this ); @@ -166,7 +168,7 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa final IGrid g = node.getGrid(); if( g != null ) { - this.setPowerSource( new ChannelPowerSrc( this.networkNode, (IEnergySource) g.getCache( IEnergyGrid.class ) ) ); + this.setPowerSource( new ChannelPowerSrc( this.networkNode, g.getCache( IEnergyGrid.class )) ); } } } diff --git a/src/main/java/appeng/container/implementations/ContainerMEPortableCell.java b/src/main/java/appeng/container/implementations/ContainerMEPortableCell.java index 5535f2f4d..34fb8b58a 100644 --- a/src/main/java/appeng/container/implementations/ContainerMEPortableCell.java +++ b/src/main/java/appeng/container/implementations/ContainerMEPortableCell.java @@ -20,7 +20,7 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ContainerType; @@ -38,8 +38,8 @@ public class ContainerMEPortableCell extends ContainerMEMonitorable public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerMEPortableCell::new, IPortableCell.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerMEPortableCell::new, IPortableCell.class); public static ContainerMEPortableCell fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java b/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java index ba9c845bd..d173ca1c5 100644 --- a/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java +++ b/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java @@ -22,8 +22,7 @@ package appeng.container.implementations; import java.io.IOException; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -55,8 +54,8 @@ public class ContainerNetworkStatus extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerNetworkStatus::new, INetworkTool.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerNetworkStatus::new, INetworkTool.class); public static ContainerNetworkStatus fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerNetworkTool.java b/src/main/java/appeng/container/implementations/ContainerNetworkTool.java index 155af1320..3fc7bde77 100644 --- a/src/main/java/appeng/container/implementations/ContainerNetworkTool.java +++ b/src/main/java/appeng/container/implementations/ContainerNetworkTool.java @@ -23,8 +23,7 @@ import appeng.api.implementations.guiobjects.INetworkTool; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import appeng.container.slot.SlotRestrictedInput; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -39,8 +38,8 @@ public class ContainerNetworkTool extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerNetworkTool::new, INetworkTool.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerNetworkTool::new, INetworkTool.class); public static ContainerNetworkTool fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java index 24c5a212c..739ec3136 100644 --- a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java @@ -31,8 +31,7 @@ import appeng.api.storage.data.IItemList; import appeng.container.ContainerLocator; import appeng.container.ContainerNull; import appeng.container.guisync.GuiSync; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import appeng.container.slot.*; import appeng.core.sync.packets.PacketPatternSlot; import appeng.helpers.IContainerCraftingPacket; @@ -77,8 +76,8 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerPatternTerm::new, ITerminalHost.class, SecurityPermissions.CRAFT); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerPatternTerm::new, ITerminalHost.class, SecurityPermissions.CRAFT); public static ContainerPatternTerm fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerPriority.java b/src/main/java/appeng/container/implementations/ContainerPriority.java index f792a677f..08b668e7a 100644 --- a/src/main/java/appeng/container/implementations/ContainerPriority.java +++ b/src/main/java/appeng/container/implementations/ContainerPriority.java @@ -20,7 +20,7 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -43,8 +43,8 @@ public class ContainerPriority extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerPriority::new, IPriorityHost.class, SecurityPermissions.BUILD); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerPriority::new, IPriorityHost.class, SecurityPermissions.BUILD); public static ContainerPriority fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerQuartzKnife.java b/src/main/java/appeng/container/implementations/ContainerQuartzKnife.java index c8b54e363..006741add 100644 --- a/src/main/java/appeng/container/implementations/ContainerQuartzKnife.java +++ b/src/main/java/appeng/container/implementations/ContainerQuartzKnife.java @@ -22,7 +22,7 @@ package appeng.container.implementations; import javax.annotation.Nonnull; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ContainerType; @@ -47,8 +47,8 @@ public class ContainerQuartzKnife extends AEBaseContainer public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerQuartzKnife::new, QuartzKnifeObj.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerQuartzKnife::new, QuartzKnifeObj.class); public static ContainerQuartzKnife fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/container/implementations/ContainerSecurityStation.java b/src/main/java/appeng/container/implementations/ContainerSecurityStation.java index b7bcfd80c..ca45e8f61 100644 --- a/src/main/java/appeng/container/implementations/ContainerSecurityStation.java +++ b/src/main/java/appeng/container/implementations/ContainerSecurityStation.java @@ -20,8 +20,7 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.container.helper.TileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ContainerType; @@ -50,8 +49,8 @@ public class ContainerSecurityStation extends ContainerMEMonitorable implements public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerSecurityStation::new, ITerminalHost.class, SecurityPermissions.SECURITY); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerSecurityStation::new, ITerminalHost.class, SecurityPermissions.SECURITY); private final SlotRestrictedInput configSlot; diff --git a/src/main/java/appeng/container/implementations/ContainerUpgradeable.java b/src/main/java/appeng/container/implementations/ContainerUpgradeable.java index 68db4099f..42fe55941 100644 --- a/src/main/java/appeng/container/implementations/ContainerUpgradeable.java +++ b/src/main/java/appeng/container/implementations/ContainerUpgradeable.java @@ -20,20 +20,15 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartContainerHelper; -import appeng.container.helper.PartOrTileContainerHelper; -import appeng.parts.misc.PartStorageBus; -import appeng.tile.misc.TileCellWorkbench; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; @@ -66,8 +61,8 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerUpgradeable::new, IUpgradeableHost.class, SecurityPermissions.BUILD); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerUpgradeable::new, IUpgradeableHost.class, SecurityPermissions.BUILD); public static ContainerUpgradeable fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); @@ -130,7 +125,7 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl { this.lockPlayerInventorySlot( x ); this.tbSlot = x; - this.tbInventory = (NetworkToolViewer) ( (IGuiItem) pii.getItem() ).getGuiObject( pii, w, new BlockPos( xCoord, yCoord, zCoord ) ); + this.tbInventory = (NetworkToolViewer) ( (IGuiItem) pii.getItem() ).getGuiObject( pii, x, w, new BlockPos( xCoord, yCoord, zCoord ) ); break; } } diff --git a/src/main/java/appeng/container/implementations/ContainerWirelessTerm.java b/src/main/java/appeng/container/implementations/ContainerWirelessTerm.java index 11154ccf5..7d9726b9d 100644 --- a/src/main/java/appeng/container/implementations/ContainerWirelessTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerWirelessTerm.java @@ -20,8 +20,7 @@ package appeng.container.implementations; import appeng.container.ContainerLocator; -import appeng.container.helper.PartContainerHelper; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -38,8 +37,8 @@ public class ContainerWirelessTerm extends ContainerMEPortableCell public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerWirelessTerm::new, WirelessTerminalGuiObject.class); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerWirelessTerm::new, WirelessTerminalGuiObject.class); public static ContainerWirelessTerm fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/core/features/registries/WirelessRegistry.java b/src/main/java/appeng/core/features/registries/WirelessRegistry.java index 8d862b140..82d58a6c4 100644 --- a/src/main/java/appeng/core/features/registries/WirelessRegistry.java +++ b/src/main/java/appeng/core/features/registries/WirelessRegistry.java @@ -116,7 +116,7 @@ public final class WirelessRegistry implements IWirelessTermRegistry if( handler.hasPower( player, 0.5, item ) ) { - ContainerOpener.openContainer(ContainerWirelessTerm.TYPE, player, ContainerLocator.forHand(hand)); + ContainerOpener.openContainer(ContainerWirelessTerm.TYPE, player, ContainerLocator.forHand(player, hand)); } else { diff --git a/src/main/java/appeng/core/sync/GuiBridge.java b/src/main/java/appeng/core/sync/GuiBridge.java index 07c57e126..dcac222fc 100644 --- a/src/main/java/appeng/core/sync/GuiBridge.java +++ b/src/main/java/appeng/core/sync/GuiBridge.java @@ -307,20 +307,6 @@ public enum GuiBridge private Object getGuiObject( final ItemStack it, final PlayerEntity player, final World w, final int x, final int y, final int z ) { - if( !it.isEmpty() ) - { - if( it.getItem() instanceof IGuiItem ) - { - return ( (IGuiItem) it.getItem() ).getGuiObject( it, w, new BlockPos( x, y, z ) ); - } - - final IWirelessTermHandler wh = AEApi.instance().registries().wireless().getWirelessTerminalHandler( it ); - if( wh != null ) - { - return new WirelessTerminalGuiObject( wh, it, player, w, x, y, z ); - } - } - return null; } @@ -485,11 +471,6 @@ public enum GuiBridge final ItemStack it = player.inventory.getCurrentItem(); if( !it.isEmpty() && it.getItem() instanceof IGuiItem ) { - final Object myItem = ( (IGuiItem) it.getItem() ).getGuiObject( it, w, pos ); - if( this.CorrectTileOrPart( myItem ) ) - { - return true; - } } } diff --git a/src/main/java/appeng/core/sync/packets/PacketClick.java b/src/main/java/appeng/core/sync/packets/PacketClick.java index 0587ae6b9..6ec27f17b 100644 --- a/src/main/java/appeng/core/sync/packets/PacketClick.java +++ b/src/main/java/appeng/core/sync/packets/PacketClick.java @@ -19,26 +19,29 @@ package appeng.core.sync.packets; -import appeng.block.networking.BlockCableBus; -import appeng.items.tools.ToolNetworkTool; -import appeng.items.tools.powered.ToolColorApplicator; -import io.netty.buffer.Unpooled; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; - import appeng.api.AEApi; import appeng.api.definitions.IComparableDefinition; import appeng.api.definitions.IItems; import appeng.api.implementations.items.IMemoryCard; import appeng.api.implementations.items.MemoryCardMessages; +import appeng.block.networking.BlockCableBus; +import appeng.container.ContainerLocator; +import appeng.container.ContainerOpener; +import appeng.container.implementations.ContainerNetworkTool; import appeng.core.sync.AppEngPacket; import appeng.core.sync.network.INetworkInfo; +import appeng.items.tools.ToolNetworkTool; +import appeng.items.tools.powered.ToolColorApplicator; +import io.netty.buffer.Unpooled; +import net.minecraft.block.Block; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -76,8 +79,19 @@ public class PacketClick extends AppEngPacket this.leftClick = stream.readBoolean(); } - // api - public PacketClick( final BlockPos pos, final Direction side, final float hitX, final float hitY, final float hitZ, final Hand hand ) + // API for when a block was right clicked + public PacketClick( ItemUseContext context ) + { + this(context.getPos(), context.getFace(), context.getPos().getX(), context.getPos().getY(), context.getPos().getZ(), context.getHand()); + } + + // API for when an item in hand was right-clicked, with no block context + public PacketClick( Hand hand ) + { + this(BlockPos.ZERO, null, 0, 0, 0, hand); + } + + private PacketClick( final BlockPos pos, final Direction side, final float hitX, final float hitY, final float hitZ, final Hand hand ) { this( pos, side, hitX, hitY, hitZ, hand, false ); } @@ -108,14 +122,21 @@ public class PacketClick extends AppEngPacket this.configureWrite( data ); } + // Indicates that block pos, side and hit vector have valid data + private boolean hasBlockContext() { + return side != null; + } + @Override public void serverPacketData( final INetworkInfo manager, final PlayerEntity player ) { - final ItemStack is = player.inventory.getCurrentItem(); + final BlockPos pos = new BlockPos( this.x, this.y, this.z ); + + final ItemStack is = player.getHeldItem(hand); final IItems items = AEApi.instance().definitions().items(); final IComparableDefinition maybeMemoryCard = items.memoryCard(); final IComparableDefinition maybeColorApplicator = items.colorApplicator(); - final BlockPos pos = new BlockPos( this.x, this.y, this.z ); + if( this.leftClick ) { final Block block = player.world.getBlockState( pos ).getBlock(); @@ -131,8 +152,14 @@ public class PacketClick extends AppEngPacket if( is.getItem() instanceof ToolNetworkTool) { final ToolNetworkTool tnt = (ToolNetworkTool) is.getItem(); - tnt.serverSideToolLogic( is, player, this.hand, player.world, pos, this.side, this.hitX, this.hitY, - this.hitZ ); + + if (hasBlockContext()) { + // Reconstruct an item use context + ItemUseContext useContext = new ItemUseContext(player, hand, new BlockRayTraceResult(new Vec3d(hitX, hitY, hitZ), side, pos, false)); + tnt.serverSideToolLogic(useContext); + } else { + ContainerOpener.openContainer(ContainerNetworkTool.TYPE, player, ContainerLocator.forHand(player, hand)); + } } if( maybeMemoryCard.isSameAs( is ) ) diff --git a/src/main/java/appeng/fluids/container/ContainerFluidInterface.java b/src/main/java/appeng/fluids/container/ContainerFluidInterface.java index b1c8df0a2..8cf3f7451 100644 --- a/src/main/java/appeng/fluids/container/ContainerFluidInterface.java +++ b/src/main/java/appeng/fluids/container/ContainerFluidInterface.java @@ -23,7 +23,7 @@ import appeng.api.config.SecurityPermissions; import appeng.api.storage.data.IAEFluidStack; import appeng.api.util.IConfigManager; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import appeng.fluids.helper.DualityFluidInterface; import appeng.fluids.helper.FluidSyncHelper; import appeng.fluids.helper.IFluidInterfaceHost; @@ -44,8 +44,8 @@ public class ContainerFluidInterface extends ContainerFluidConfigurable public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerFluidInterface::new, IFluidInterfaceHost.class, SecurityPermissions.BUILD); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerFluidInterface::new, IFluidInterfaceHost.class, SecurityPermissions.BUILD); public static ContainerFluidInterface fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/fluids/container/ContainerFluidTerminal.java b/src/main/java/appeng/fluids/container/ContainerFluidTerminal.java index 6127466dd..96ec7e691 100644 --- a/src/main/java/appeng/fluids/container/ContainerFluidTerminal.java +++ b/src/main/java/appeng/fluids/container/ContainerFluidTerminal.java @@ -26,7 +26,7 @@ import javax.annotation.Nonnull; import appeng.api.AEApi; import appeng.api.config.*; import appeng.container.ContainerLocator; -import appeng.container.helper.PartOrTileContainerHelper; +import appeng.container.helper.ContainerHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.ServerPlayerEntity; @@ -82,8 +82,8 @@ public class ContainerFluidTerminal extends AEBaseContainer implements IConfigMa public static ContainerType TYPE; - private static final PartOrTileContainerHelper helper - = new PartOrTileContainerHelper<>(ContainerFluidTerminal::new, ITerminalHost.class, SecurityPermissions.BUILD); + private static final ContainerHelper helper + = new ContainerHelper<>(ContainerFluidTerminal::new, ITerminalHost.class, SecurityPermissions.BUILD); public static ContainerFluidTerminal fromNetwork(int windowId, PlayerInventory inv, PacketBuffer buf) { return helper.fromNetwork(windowId, inv, buf); diff --git a/src/main/java/appeng/helpers/WirelessTerminalGuiObject.java b/src/main/java/appeng/helpers/WirelessTerminalGuiObject.java index 4b09051ac..984c01207 100644 --- a/src/main/java/appeng/helpers/WirelessTerminalGuiObject.java +++ b/src/main/java/appeng/helpers/WirelessTerminalGuiObject.java @@ -65,13 +65,13 @@ public class WirelessTerminalGuiObject implements IPortableCell, IActionHost, II private double myRange = Double.MAX_VALUE; private final int inventorySlot; - public WirelessTerminalGuiObject( final IWirelessTermHandler wh, final ItemStack is, final PlayerEntity ep, final World w, final int x, final int y, final int z ) + public WirelessTerminalGuiObject( final IWirelessTermHandler wh, final ItemStack is, final PlayerEntity ep, int inventorySlot ) { this.encryptionKey = wh.getEncryptionKey( is ); this.effectiveItem = is; this.myPlayer = ep; this.wth = wh; - this.inventorySlot = x; + this.inventorySlot = inventorySlot; ILocatable obj = null; diff --git a/src/main/java/appeng/items/tools/ToolNetworkTool.java b/src/main/java/appeng/items/tools/ToolNetworkTool.java index f400b8d29..bfd6e017d 100644 --- a/src/main/java/appeng/items/tools/ToolNetworkTool.java +++ b/src/main/java/appeng/items/tools/ToolNetworkTool.java @@ -67,8 +67,11 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench } @Override - public IGuiItemObject getGuiObject( final ItemStack is, final World world, final BlockPos pos ) + public IGuiItemObject getGuiObject( final ItemStack is, int playerInventorySlot, final World world, final BlockPos pos ) { + if (pos == null) { + return new NetworkToolViewer( is, null ); + } final TileEntity te = world.getTileEntity( pos ); return new NetworkToolViewer( is, (IGridHost) ( te instanceof IGridHost ? te : null ) ); } @@ -82,7 +85,7 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench if( mop == null || mop.getType() == RayTraceResult.Type.MISS ) { - NetworkHandler.instance().sendToServer( new PacketClick( BlockPos.ZERO, null, 0, 0, 0, hand ) ); + NetworkHandler.instance().sendToServer( new PacketClick( hand ) ); } } @@ -118,7 +121,7 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench if( Platform.isClient() ) { - NetworkHandler.instance().sendToServer( new PacketClick( context.getPos(), context.getFace(), context.getPos().getX(), context.getPos().getY(), context.getPos().getZ(), context.getHand() ) ); + NetworkHandler.instance().sendToServer( new PacketClick( context ) ); } return ActionResultType.SUCCESS; @@ -130,59 +133,58 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench return true; } - public boolean serverSideToolLogic( final ItemStack is, final PlayerEntity p, final Hand hand, final World w, final BlockPos pos, final Direction side, final float hitX, final float hitY, final float hitZ ) + public boolean serverSideToolLogic( ItemUseContext useContext ) { - if( side != null ) + BlockPos pos = useContext.getPos(); + PlayerEntity p = useContext.getPlayer(); + World w = p.world; + Hand hand = useContext.getHand(); + Direction side = useContext.getFace(); + + if( !Platform.hasPermissions( new DimensionalCoord( w, pos ), p ) ) { - if( !Platform.hasPermissions( new DimensionalCoord( w, pos ), p ) ) - { - return false; - } + return false; + } - final BlockState bs = w.getBlockState( pos ); - if( !p.isCrouching() ) + final BlockState bs = w.getBlockState( pos ); + if( !p.isCrouching() ) + { + final TileEntity te = w.getTileEntity( pos ); + if( !( te instanceof IGridHost ) ) { - final TileEntity te = w.getTileEntity( pos ); - if( !( te instanceof IGridHost ) ) + if( bs.rotate( w, pos, Rotation.CLOCKWISE_90 ) != bs ) { - if( bs.rotate( w, pos, Rotation.CLOCKWISE_90 ) != bs ) - { - bs.neighborChanged( w, pos, Platform.AIR_BLOCK, pos, false ); - p.swingArm( hand ); - return !w.isRemote; - } + bs.neighborChanged( w, pos, Platform.AIR_BLOCK, pos, false ); + p.swingArm( hand ); + return !w.isRemote; } } + } - if( !p.isCrouching() ) + if( !p.isCrouching() ) + { + if( p.openContainer instanceof AEBaseContainer ) { - if( p.openContainer instanceof AEBaseContainer ) - { - return true; - } - - final TileEntity te = w.getTileEntity( pos ); - - if( te instanceof IGridHost ) - { - ContainerOpener.openContainer(ContainerNetworkStatus.TYPE, p, ContainerLocator.forTileEntitySide(te, side)); - } - else - { - ContainerOpener.openContainer(ContainerNetworkTool.TYPE, p, ContainerLocator.forHand(hand)); - } - return true; } + + final TileEntity te = w.getTileEntity( pos ); + + if( te instanceof IGridHost ) + { + ContainerOpener.openContainer(ContainerNetworkStatus.TYPE, p, ContainerLocator.forItemUseContext(useContext)); + } else { - BlockRayTraceResult rtr = new BlockRayTraceResult(new Vec3d(hitX, hitY, hitZ), side, pos, false); - bs.onBlockActivated( w, p, hand, rtr ); + ContainerOpener.openContainer(ContainerNetworkTool.TYPE, p, ContainerLocator.forHand(p, hand)); } + + return true; } else { - ContainerOpener.openContainer(ContainerNetworkTool.TYPE, p, ContainerLocator.forHand(hand)); + BlockRayTraceResult rtr = new BlockRayTraceResult(useContext.getHitVec(), side, pos, false); + bs.onBlockActivated( w, p, hand, rtr ); } return false; diff --git a/src/main/java/appeng/items/tools/powered/ToolPortableCell.java b/src/main/java/appeng/items/tools/powered/ToolPortableCell.java index 085436161..1b5c9af3e 100644 --- a/src/main/java/appeng/items/tools/powered/ToolPortableCell.java +++ b/src/main/java/appeng/items/tools/powered/ToolPortableCell.java @@ -71,7 +71,7 @@ public class ToolPortableCell extends AEBasePoweredItem implements IStorageCell< @Override public ActionResult onItemRightClick( final World w, final PlayerEntity player, final Hand hand ) { - ContainerOpener.openContainer(ContainerMEPortableCell.TYPE, player, ContainerLocator.forHand(hand)); + ContainerOpener.openContainer(ContainerMEPortableCell.TYPE, player, ContainerLocator.forHand(player, hand)); return new ActionResult<>( ActionResultType.SUCCESS, player.getHeldItem( hand ) ); } @@ -183,9 +183,9 @@ public class ToolPortableCell extends AEBasePoweredItem implements IStorageCell< } @Override - public IGuiItemObject getGuiObject( final ItemStack is, final World w, final BlockPos pos ) + public IGuiItemObject getGuiObject( final ItemStack is, int playerInventorySlot, final World w, final BlockPos pos ) { - return new PortableCellViewer( is, pos.getX() ); + return new PortableCellViewer( is, playerInventorySlot ); } @Override diff --git a/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java b/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java index 5b2dc116a..3d5e2b99a 100644 --- a/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java +++ b/src/main/java/appeng/items/tools/quartz/ToolQuartzCuttingKnife.java @@ -19,12 +19,17 @@ package appeng.items.tools.quartz; +import appeng.api.features.AEFeature; +import appeng.api.implementations.guiobjects.IGuiItem; +import appeng.api.implementations.guiobjects.IGuiItemObject; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.ContainerQuartzKnife; +import appeng.items.AEBaseItem; +import appeng.items.contents.QuartzKnifeObj; +import appeng.util.Platform; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.util.ActionResult; @@ -33,13 +38,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import appeng.api.implementations.guiobjects.IGuiItem; -import appeng.api.implementations.guiobjects.IGuiItemObject; -import appeng.api.features.AEFeature; -import appeng.items.AEBaseItem; -import appeng.items.contents.QuartzKnifeObj; -import appeng.util.Platform; - public class ToolQuartzCuttingKnife extends AEBaseItem implements IGuiItem { @@ -54,9 +52,10 @@ public class ToolQuartzCuttingKnife extends AEBaseItem implements IGuiItem @Override public ActionResultType onItemUse(ItemUseContext context ) { - if( Platform.isServer() ) + PlayerEntity player = context.getPlayer(); + if( Platform.isServer() && player != null ) { - ContainerOpener.openContainer(ContainerQuartzKnife.TYPE, context.getPlayer(), ContainerLocator.forHand(context.getHand())); + ContainerOpener.openContainer(ContainerQuartzKnife.TYPE, context.getPlayer(), ContainerLocator.forItemUseContext(context)); } return ActionResultType.SUCCESS; } @@ -66,7 +65,7 @@ public class ToolQuartzCuttingKnife extends AEBaseItem implements IGuiItem { if( Platform.isServer() ) { - ContainerOpener.openContainer(ContainerQuartzKnife.TYPE, p, ContainerLocator.forHand(hand)); + ContainerOpener.openContainer(ContainerQuartzKnife.TYPE, p, ContainerLocator.forHand(p, hand)); } p.swingArm( hand ); return new ActionResult<>( ActionResultType.SUCCESS, p.getHeldItem( hand ) ); @@ -94,7 +93,7 @@ public class ToolQuartzCuttingKnife extends AEBaseItem implements IGuiItem } @Override - public IGuiItemObject getGuiObject( final ItemStack is, final World world, final BlockPos pos ) + public IGuiItemObject getGuiObject( final ItemStack is, int playerInventorySlot, final World world, final BlockPos pos ) { return new QuartzKnifeObj( is ); } diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index 6ed8ae664..24f469532 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -432,7 +432,7 @@ public class PartPlacement if( event.getPlayer().isCrouching() && !held.isEmpty() && supportedItem ) { - NetworkHandler.instance().sendToServer( new PacketClick( event.getPos(), event.getFace(), 0, 0, 0, event.getHand() ) ); + NetworkHandler.instance().sendToServer( new PacketClick( event.getHand() ) ); } } }