Search in sources :

Example 6 with Slot

use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.

the class ContainerUtil method generateAdapterLens.

@SuppressWarnings({ "unchecked", "rawtypes" })
private static Lens generateAdapterLens(final SlotLensProvider slots, final int index, final org.spongepowered.common.inventory.util.ContainerUtil.CraftingInventoryData crafting, final List<Slot> slotList, final net.minecraft.world.@Nullable Container subInventory) {
    Lens lens = ((InventoryBridge) subInventory).bridge$getAdapter().inventoryAdapter$getRootLens();
    if (lens instanceof PlayerInventoryLens) {
        if (slotList.size() == 36) {
            return new DelegatingLens(index, new PrimaryPlayerInventoryLens(0, slots, true), slots);
        }
        return lens;
    }
    // For Crafting Result we need the Slot to get Filter logic
    if (subInventory instanceof ResultContainer) {
        final Slot slot = slotList.get(0);
        if (slot instanceof ResultSlotAccessor) {
            crafting.out = index;
            if (crafting.base == null) {
                // In case we do not find the InventoryCrafting later assume it is directly after the SlotCrafting
                // e.g. for IC2 ContainerIndustrialWorkbench
                crafting.base = index + 1;
                crafting.grid = ((ResultSlotAccessor) slot).accessor$craftSlots();
            }
        }
    }
    if (subInventory instanceof CraftingContainer) {
        crafting.base = index;
        crafting.grid = ((CraftingContainer) subInventory);
    }
    return new DelegatingLens(index, slotList, lens, slots);
}
Also used : CraftingContainer(net.minecraft.world.inventory.CraftingContainer) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) PlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.PlayerInventoryLens) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) ResultSlotAccessor(org.spongepowered.common.accessor.world.inventory.ResultSlotAccessor) Slot(net.minecraft.world.inventory.Slot) CraftingInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) GridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens) ContainerLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) Lens(org.spongepowered.common.inventory.lens.Lens) SingleGridLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens) PlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.PlayerInventoryLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) ResultContainer(net.minecraft.world.inventory.ResultContainer)

Example 7 with Slot

use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.

the class ContainerUtil method generateLens.

/**
 * Generates a fallback lens for given Container
 *
 * @param container The Container to generate a lens for
 * @param slots The slots of the Container
 * @return The generated fallback lens
 */
@SuppressWarnings("unchecked")
public static Lens generateLens(final net.minecraft.world.inventory.AbstractContainerMenu container, final SlotLensProvider slots) {
    // Get all inventories viewed in the Container & count slots & retain order
    final Map<Optional<net.minecraft.world.Container>, List<Slot>> viewed = container.slots.stream().collect(Collectors.groupingBy(i -> Optional.<net.minecraft.world.Container>ofNullable(i.container), LinkedHashMap::new, Collectors.toList()));
    // Count the index
    int index = 0;
    final CraftingInventoryData crafting = new CraftingInventoryData();
    int chestHeight = 0;
    final List<Lens> lenses = new ArrayList<>();
    for (final Map.Entry<Optional<net.minecraft.world.Container>, List<Slot>> entry : viewed.entrySet()) {
        final List<Slot> slotList = entry.getValue();
        final int slotCount = slotList.size();
        final net.minecraft.world.Container subInventory = entry.getKey().orElse(null);
        // Generate Lens based on existing InventoryAdapter
        Lens lens = ContainerUtil.generateAdapterLens(slots, index, crafting, slotList, subInventory);
        // Inventory size <> Lens size
        if (lens.slotCount() != slotCount) {
            CompoundSlotLensProvider slotProvider = new CompoundSlotLensProvider().add(((InventoryBridge) subInventory).bridge$getAdapter());
            CompoundLens.Builder lensBuilder = CompoundLens.builder();
            for (Slot slot : slotList) {
                lensBuilder.add(((InventoryBridge) slot).bridge$getAdapter().inventoryAdapter$getRootLens());
            }
            lens = lensBuilder.build(slotProvider);
        }
        lenses.add(lens);
        index += slotCount;
        // Count height of 9 width grid
        if (chestHeight != -1) {
            if (lens instanceof DelegatingLens) {
                Lens delegated = ((DelegatingLens) lens).getDelegate();
                if (delegated instanceof PrimaryPlayerInventoryLens) {
                    delegated = ((PrimaryPlayerInventoryLens) delegated).getFullGrid();
                }
                if (delegated instanceof SingleGridLens) {
                    delegated = delegated.getSpanningChildren().get(0);
                }
                if (delegated instanceof GridInventoryLens) {
                    if (((GridInventoryLens) delegated).getWidth() == 9) {
                        chestHeight += ((GridInventoryLens) delegated).getHeight();
                    } else {
                        chestHeight = -1;
                    }
                } else {
                    chestHeight = -1;
                }
            } else {
                chestHeight = -1;
            }
        }
    }
    final List<Lens> additional = new ArrayList<>();
    try {
        if (crafting.out != null && crafting.base != null && crafting.grid != null) {
            additional.add(new CraftingInventoryLens(crafting.out, crafting.base, crafting.grid.getWidth(), crafting.grid.getHeight(), slots));
        } else if (crafting.base != null && crafting.grid != null) {
            additional.add(new GridInventoryLens(crafting.base, crafting.grid.getWidth(), crafting.grid.getHeight(), slots));
        }
    } catch (Exception e) {
        SpongeCommon.logger().error("Error while creating CraftingInventoryLensImpl or GridInventoryLensImpl for " + container.getClass().getName(), e);
    }
    if (chestHeight > 0) {
        // Add container grid for chest/double chest
        additional.add(new GridInventoryLens(0, 9, chestHeight, slots));
    }
    // Lens containing/delegating to other lenses
    return new ContainerLens(container.slots.size(), (Class<? extends Inventory>) container.getClass(), slots, lenses, additional);
}
Also used : CraftingInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) ResultContainer(net.minecraft.world.inventory.ResultContainer) ResultSlotAccessor(org.spongepowered.common.accessor.world.inventory.ResultSlotAccessor) HopperMenuAccessor(org.spongepowered.common.accessor.world.inventory.HopperMenuAccessor) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) Random(java.util.Random) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) ContainerBridge(org.spongepowered.common.bridge.world.inventory.container.ContainerBridge) AbstractFurnaceMenuAccessor(org.spongepowered.common.accessor.world.inventory.AbstractFurnaceMenuAccessor) DispenserMenuAccessor(org.spongepowered.common.accessor.world.inventory.DispenserMenuAccessor) Containers(net.minecraft.world.Containers) BlockCarrier(org.spongepowered.api.item.inventory.BlockCarrier) Map(java.util.Map) GridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens) BeaconMenu(net.minecraft.world.inventory.BeaconMenu) BrewingStandMenuAccessor(org.spongepowered.common.accessor.world.inventory.BrewingStandMenuAccessor) SpongeLocationCarrier(org.spongepowered.common.inventory.SpongeLocationCarrier) Carrier(org.spongepowered.api.item.inventory.Carrier) BlockEntity(net.minecraft.world.level.block.entity.BlockEntity) Collectors(java.util.stream.Collectors) Player(net.minecraft.world.entity.player.Player) Slot(net.minecraft.world.inventory.Slot) ChestMenu(net.minecraft.world.inventory.ChestMenu) List(java.util.List) MerchantMenuAccessor(org.spongepowered.common.accessor.world.inventory.MerchantMenuAccessor) CraftingContainer(net.minecraft.world.inventory.CraftingContainer) PhaseContext(org.spongepowered.common.event.tracking.PhaseContext) ContainerLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens) CompoundContainer(net.minecraft.world.CompoundContainer) ItemEntity(net.minecraft.world.entity.item.ItemEntity) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) Optional(java.util.Optional) ItemCombinerMenuAccessor(org.spongepowered.common.accessor.world.inventory.ItemCombinerMenuAccessor) Level(net.minecraft.world.level.Level) ServerLocation(org.spongepowered.api.world.server.ServerLocation) Inventory(org.spongepowered.api.item.inventory.Inventory) NonNull(org.checkerframework.checker.nullness.qual.NonNull) BeaconMenuAccessor(org.spongepowered.common.accessor.world.inventory.BeaconMenuAccessor) ChestBlockEntity(net.minecraft.world.level.block.entity.ChestBlockEntity) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) CompoundSlotLensProvider(org.spongepowered.common.inventory.lens.CompoundSlotLensProvider) ServerLevel(net.minecraft.server.level.ServerLevel) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) ServerPlayer(net.minecraft.server.level.ServerPlayer) Lens(org.spongepowered.common.inventory.lens.Lens) Nullable(org.checkerframework.checker.nullness.qual.Nullable) SingleGridLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens) CustomContainer(org.spongepowered.common.inventory.custom.CustomContainer) AbstractContainerMenuAccessor(org.spongepowered.common.accessor.world.inventory.AbstractContainerMenuAccessor) SpongeCommon(org.spongepowered.common.SpongeCommon) PhaseTracker(org.spongepowered.common.event.tracking.PhaseTracker) SlotLensProvider(org.spongepowered.common.inventory.lens.impl.slot.SlotLensProvider) PlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.PlayerInventoryLens) HorseInventoryMenuAccessor(org.spongepowered.common.accessor.world.inventory.HorseInventoryMenuAccessor) Container(org.spongepowered.api.item.inventory.Container) SpongeBlockEntityCarrier(org.spongepowered.common.inventory.SpongeBlockEntityCarrier) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) ArrayList(java.util.ArrayList) ResultContainer(net.minecraft.world.inventory.ResultContainer) CraftingContainer(net.minecraft.world.inventory.CraftingContainer) CompoundContainer(net.minecraft.world.CompoundContainer) CustomContainer(org.spongepowered.common.inventory.custom.CustomContainer) Container(org.spongepowered.api.item.inventory.Container) GridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens) CompoundSlotLensProvider(org.spongepowered.common.inventory.lens.CompoundSlotLensProvider) List(java.util.List) ArrayList(java.util.ArrayList) Optional(java.util.Optional) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) ContainerLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens) SingleGridLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens) CraftingInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens) Slot(net.minecraft.world.inventory.Slot) CraftingInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) GridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens) ContainerLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) Lens(org.spongepowered.common.inventory.lens.Lens) SingleGridLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens) PlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.PlayerInventoryLens) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens)

Example 8 with Slot

use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.

the class AbstractContainerMenuMixin_Menu_Inventory method impl$onClick.

// Called when clicking in an inventory
// InventoryMenu Callback
@Inject(method = "doClick", at = @At(value = "HEAD"), cancellable = true)
private void impl$onClick(int slotId, int dragType, ClickType clickTypeIn, Player player, CallbackInfoReturnable<ItemStack> cir) {
    final SpongeInventoryMenu menu = this.bridge$getMenu();
    if (menu != null) {
        if (!menu.onClick(slotId, dragType, clickTypeIn, player, (org.spongepowered.api.item.inventory.Container) this)) {
            cir.setReturnValue(ItemStack.EMPTY);
            // Accept all changes made by plugin
            for (int i = 0; i < this.slots.size(); i++) {
                Slot slot = this.slots.get(i);
                this.lastSlots.set(i, slot.getItem().copy());
            }
            // and update client
            for (ContainerListener listener : this.containerListeners) {
                listener.refreshContainer((AbstractContainerMenu) (Object) this, this.lastSlots);
            }
        }
    }
}
Also used : Slot(net.minecraft.world.inventory.Slot) ContainerListener(net.minecraft.world.inventory.ContainerListener) SpongeInventoryMenu(org.spongepowered.common.inventory.custom.SpongeInventoryMenu) Inject(org.spongepowered.asm.mixin.injection.Inject)

Example 9 with Slot

use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.

the class AbstractContainerMenuMixin_Fabric_Inventory method fabric$allInventories.

@Override
public Collection<InventoryBridge> fabric$allInventories() {
    if (this.all == null) {
        ImmutableSet.Builder<InventoryBridge> builder = ImmutableSet.builder();
        for (Slot slot : this.slots) {
            if (slot.container != null) {
                builder.add((InventoryBridge) slot.container);
            }
        }
        this.all = builder.build();
    }
    return this.all;
}
Also used : ImmutableSet(com.google.common.collect.ImmutableSet) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) Slot(net.minecraft.world.inventory.Slot)

Example 10 with Slot

use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.

the class PacketPhaseUtil method handlePlayerSlotRestore.

public static void handlePlayerSlotRestore(final net.minecraft.server.level.ServerPlayer player, final ItemStack itemStack, final InteractionHand hand) {
    if (itemStack.isEmpty()) {
        // No need to check if it's NONE, NONE is checked by isEmpty.
        return;
    }
    player.ignoreSlotUpdateHack = false;
    int slotId = 0;
    if (hand == InteractionHand.OFF_HAND) {
        player.inventory.offhand.set(0, itemStack);
        slotId = (player.inventory.items.size() + Inventory.getSelectionSize());
    } else {
        player.inventory.items.set(player.inventory.selected, itemStack);
        // TODO check if window id -2 and slotid = player.inventory.currentItem works instead of this:
        for (Slot containerSlot : player.containerMenu.slots) {
            if (containerSlot.container == player.inventory && ((SlotAccessor) containerSlot).accessor$slot() == player.inventory.selected) {
                slotId = containerSlot.index;
                break;
            }
        }
    }
    player.containerMenu.broadcastChanges();
    player.ignoreSlotUpdateHack = false;
    player.connection.send(new ClientboundContainerSetSlotPacket(player.containerMenu.containerId, slotId, itemStack));
}
Also used : ClientboundContainerSetSlotPacket(net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket) Slot(net.minecraft.world.inventory.Slot) SlotAccessor(org.spongepowered.common.accessor.world.inventory.SlotAccessor)

Aggregations

Slot (net.minecraft.world.inventory.Slot)12 ContainerListener (net.minecraft.world.inventory.ContainerListener)3 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 CraftingContainer (net.minecraft.world.inventory.CraftingContainer)2 ResultContainer (net.minecraft.world.inventory.ResultContainer)2 ItemStack (net.minecraft.world.item.ItemStack)2 Nullable (org.checkerframework.checker.nullness.qual.Nullable)2 ServerPlayer (org.spongepowered.api.entity.living.player.server.ServerPlayer)2 Container (org.spongepowered.api.item.inventory.Container)2 ItemStackSnapshot (org.spongepowered.api.item.inventory.ItemStackSnapshot)2 SlotTransaction (org.spongepowered.api.item.inventory.transaction.SlotTransaction)2 AbstractContainerMenuAccessor (org.spongepowered.common.accessor.world.inventory.AbstractContainerMenuAccessor)2 ResultSlotAccessor (org.spongepowered.common.accessor.world.inventory.ResultSlotAccessor)2 InventoryBridge (org.spongepowered.common.bridge.world.inventory.InventoryBridge)2 Lens (org.spongepowered.common.inventory.lens.Lens)2 CompoundLens (org.spongepowered.common.inventory.lens.impl.CompoundLens)2 DelegatingLens (org.spongepowered.common.inventory.lens.impl.DelegatingLens)2 CraftingInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens)2 GridInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens)2