Search in sources :

Example 11 with Slot

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

the class CustomContainer method quickMoveStack.

@Override
public ItemStack quickMoveStack(final Player playerIn, final int index) {
    // Almost 1:1 copy of ChestContainer#transferStackInSlot
    ItemStack itemstack = ItemStack.EMPTY;
    final Slot slot = this.slots.get(index);
    if (slot != null && slot.hasItem()) {
        final ItemStack itemstack1 = slot.getItem();
        itemstack = itemstack1.copy();
        if (index < this.inv.getContainerSize()) {
            if (!this.moveItemStackTo(itemstack1, this.inv.getContainerSize(), this.slots.size(), true)) {
                return ItemStack.EMPTY;
            }
        } else if (!this.moveItemStackTo(itemstack1, 0, this.inv.getContainerSize(), false)) {
            return ItemStack.EMPTY;
        }
        if (itemstack1.isEmpty()) {
            slot.set(ItemStack.EMPTY);
        } else {
            slot.setChanged();
        }
    }
    return itemstack;
}
Also used : Slot(net.minecraft.world.inventory.Slot) ItemStack(net.minecraft.world.item.ItemStack)

Example 12 with Slot

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

the class AbstractContainerMenuMixin_Inventory method bridge$detectAndSendChanges.

@Override
public void bridge$detectAndSendChanges(final boolean captureOnly) {
    // Code-Flow changed from vanilla completely!
    final SpongeInventoryMenu menu = ((MenuBridge) this).bridge$getMenu();
    // We first collect all differences and check if cancelled for readonly menu changes
    final List<Integer> changes = new ArrayList<>();
    for (int i = 0; i < this.slots.size(); ++i) {
        final Slot slot = this.slots.get(i);
        final ItemStack newStack = slot.getItem();
        final ItemStack oldStack = this.lastSlots.get(i);
        if (!ItemStack.matches(oldStack, newStack)) {
            changes.add(i);
        }
    }
    // For each change
    for (final Integer i : changes) {
        final Slot slot = this.slots.get(i);
        final ItemStack newStack = slot.getItem();
        ItemStack oldStack = this.lastSlots.get(i);
        // Only call Menu Callbacks when clicking
        if (this.impl$isClicking && menu != null && !menu.onChange(newStack, oldStack, (org.spongepowered.api.item.inventory.Container) this, i, slot)) {
            // revert changes
            this.lastSlots.set(i, oldStack.copy());
            // Send reverted slots to clients
            this.impl$sendSlotContents(i, oldStack);
        } else {
            // Capture changes for inventory events
            this.impl$capture(i, newStack, oldStack);
            if (captureOnly) {
                continue;
            }
            // Perform vanilla logic - updating inventory stack - notify listeners
            oldStack = newStack.isEmpty() ? ItemStack.EMPTY : newStack.copy();
            this.lastSlots.set(i, oldStack);
            // TODO forge checks !itemstack1.equals(itemstack, true) before doing this
            for (final ContainerListener listener : this.containerListeners) {
                listener.slotChanged(((AbstractContainerMenu) (Object) this), i, oldStack);
            }
        }
    }
    // like vanilla send property changes
    this.impl$detectAndSendPropertyChanges();
    if (this instanceof InventoryMenuBridge) {
        ((InventoryMenuBridge) this).bridge$markClean();
    }
}
Also used : InventoryMenuBridge(org.spongepowered.common.bridge.world.inventory.InventoryMenuBridge) MenuBridge(org.spongepowered.common.bridge.world.inventory.container.MenuBridge) ArrayList(java.util.ArrayList) AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) InventoryMenuBridge(org.spongepowered.common.bridge.world.inventory.InventoryMenuBridge) ResultSlot(net.minecraft.world.inventory.ResultSlot) DataSlot(net.minecraft.world.inventory.DataSlot) Slot(net.minecraft.world.inventory.Slot) ContainerListener(net.minecraft.world.inventory.ContainerListener) SpongeInventoryMenu(org.spongepowered.common.inventory.custom.SpongeInventoryMenu) ItemStack(net.minecraft.world.item.ItemStack)

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