Search in sources :

Example 6 with AbstractContainerMenu

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

the class AbstractContainerMenuMixin_Inventory method impl$sendSlotContents.

private void impl$sendSlotContents(final Integer i, final ItemStack oldStack) {
    for (final ContainerListener listener : this.containerListeners) {
        boolean isChangingQuantityOnly = true;
        if (listener instanceof ServerPlayer) {
            isChangingQuantityOnly = ((ServerPlayer) listener).ignoreSlotUpdateHack;
            ((ServerPlayer) listener).ignoreSlotUpdateHack = false;
        }
        listener.slotChanged(((AbstractContainerMenu) (Object) this), i, oldStack);
        if (listener instanceof ServerPlayer) {
            ((ServerPlayer) listener).ignoreSlotUpdateHack = isChangingQuantityOnly;
        }
    }
}
Also used : AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) ServerPlayer(net.minecraft.server.level.ServerPlayer) ContainerListener(net.minecraft.world.inventory.ContainerListener)

Example 7 with AbstractContainerMenu

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

the class InventoryEventFactory method displayContainer.

@org.checkerframework.checker.nullness.qual.Nullable
public static AbstractContainerMenu displayContainer(final ServerPlayer player, final Inventory inventory, final Component displayName) {
    final net.minecraft.world.inventory.AbstractContainerMenu previousContainer = player.containerMenu;
    final net.minecraft.world.inventory.AbstractContainerMenu container;
    Optional<ViewableInventory> viewable = inventory.asViewable();
    if (viewable.isPresent()) {
        if (viewable.get() instanceof MenuProvider) {
            MenuProvider namedContainerProvider = (MenuProvider) viewable.get();
            if (displayName != null) {
                namedContainerProvider = new SimpleMenuProvider(namedContainerProvider, SpongeAdventure.asVanilla(displayName));
            }
            player.openMenu(namedContainerProvider);
        } else if (viewable.get() instanceof CarriedInventory) {
            Optional carrier = ((CarriedInventory) viewable.get()).carrier();
            if (carrier.get() instanceof AbstractHorse) {
                player.openHorseInventory(((AbstractHorse) carrier.get()), ((Container) viewable.get()));
            }
        } else if (viewable.get() instanceof Merchant) {
            Merchant merchant = (Merchant) viewable.get();
            net.minecraft.network.chat.Component display = null;
            int level = 0;
            if (merchant instanceof Villager) {
                display = ((Villager) merchant).getDisplayName();
                level = ((Villager) merchant).getVillagerData().getLevel();
            } else if (merchant instanceof WanderingTrader) {
                display = ((WanderingTrader) merchant).getDisplayName();
                level = 1;
            }
            if (displayName != null) {
                display = SpongeAdventure.asVanilla(displayName);
            }
            OptionalInt containerId = player.openMenu(new SimpleMenuProvider((id, playerInv, p) -> new MerchantMenu(id, playerInv, merchant), display));
            if (containerId.isPresent() && !merchant.getOffers().isEmpty()) {
                player.sendMerchantOffers(containerId.getAsInt(), merchant.getOffers(), level, merchant.getVillagerXp(), merchant.showProgressBar(), merchant.canRestock());
            }
        }
    }
    container = player.containerMenu;
    if (previousContainer == container) {
        return null;
    }
    if (!InventoryEventFactory.callInteractContainerOpenEvent(player)) {
        return null;
    }
    if (container instanceof ContainerBridge) {
        // This overwrites the normal container behaviour and allows viewing
        // inventories that are more than 8 blocks away
        // This currently actually only works for the Containers mixed into
        // by InteractableContainerMixin ; but throws no errors for other
        // containers
        // Allow viewing inventory; except when dead
        ((ContainerBridge) container).bridge$setCanInteractWith(p -> !p.removed);
    }
    return container;
}
Also used : EnchantItemEvent(org.spongepowered.api.event.item.inventory.EnchantItemEvent) LivingEntity(net.minecraft.world.entity.LivingEntity) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) SimpleMenuProvider(net.minecraft.world.SimpleMenuProvider) SpongeAdventure(org.spongepowered.common.adventure.SpongeAdventure) ContainerBridge(org.spongepowered.common.bridge.world.inventory.container.ContainerBridge) EffectTransactor(org.spongepowered.common.event.tracking.context.transaction.EffectTransactor) Enchantment(org.spongepowered.api.item.enchantment.Enchantment) Villager(net.minecraft.world.entity.npc.Villager) SlotTransaction(org.spongepowered.api.item.inventory.transaction.SlotTransaction) PlayerInventoryTransaction(org.spongepowered.common.event.tracking.context.transaction.inventory.PlayerInventoryTransaction) MerchantMenu(net.minecraft.world.inventory.MerchantMenu) TransactionalCaptureSupplier(org.spongepowered.common.event.tracking.context.transaction.TransactionalCaptureSupplier) Transaction(org.spongepowered.api.data.Transaction) HopperBlockEntity(net.minecraft.world.level.block.entity.HopperBlockEntity) InteractContainerEvent(org.spongepowered.api.event.item.inventory.container.InteractContainerEvent) Merchant(net.minecraft.world.item.trading.Merchant) Player(net.minecraft.world.entity.player.Player) EnchantmentInstance(net.minecraft.world.item.enchantment.EnchantmentInstance) InventoryUtil(org.spongepowered.common.inventory.util.InventoryUtil) List(java.util.List) ItemEntity(net.minecraft.world.entity.item.ItemEntity) PhaseContext(org.spongepowered.common.event.tracking.PhaseContext) ChangeInventoryEvent(org.spongepowered.api.event.item.inventory.ChangeInventoryEvent) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) Optional(java.util.Optional) MenuProvider(net.minecraft.world.MenuProvider) EnchantmentMenu(net.minecraft.world.inventory.EnchantmentMenu) ItemStack(net.minecraft.world.item.ItemStack) ViewableInventory(org.spongepowered.api.item.inventory.type.ViewableInventory) WanderingTrader(net.minecraft.world.entity.npc.WanderingTrader) Inventory(org.spongepowered.api.item.inventory.Inventory) NonNull(org.checkerframework.checker.nullness.qual.NonNull) AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) OptionalInt(java.util.OptionalInt) Supplier(java.util.function.Supplier) TransferInventoryEvent(org.spongepowered.api.event.item.inventory.TransferInventoryEvent) ArrayList(java.util.ArrayList) ServerPlayer(net.minecraft.server.level.ServerPlayer) Container(net.minecraft.world.Container) TrackingUtil(org.spongepowered.common.event.tracking.TrackingUtil) ItemStackUtil(org.spongepowered.common.item.util.ItemStackUtil) Component(net.kyori.adventure.text.Component) CauseStackManager(org.spongepowered.api.event.CauseStackManager) Nullable(org.checkerframework.checker.nullness.qual.Nullable) UpdateAnvilEvent(org.spongepowered.api.event.item.inventory.UpdateAnvilEvent) SpongeEventFactory(org.spongepowered.api.event.SpongeEventFactory) Item(org.spongepowered.api.entity.Item) ContainerUtil(org.spongepowered.common.inventory.util.ContainerUtil) Slot(org.spongepowered.api.item.inventory.Slot) SpongeCommon(org.spongepowered.common.SpongeCommon) PhaseTracker(org.spongepowered.common.event.tracking.PhaseTracker) Entity(org.spongepowered.api.entity.Entity) AnvilMenu(net.minecraft.world.inventory.AnvilMenu) TrackedInventoryBridge(org.spongepowered.common.bridge.world.inventory.container.TrackedInventoryBridge) SpongeRandomEnchantmentListBuilder(org.spongepowered.common.item.enchantment.SpongeRandomEnchantmentListBuilder) AbstractHorse(net.minecraft.world.entity.animal.horse.AbstractHorse) ChangeEntityEquipmentEvent(org.spongepowered.api.event.entity.ChangeEntityEquipmentEvent) PacketPhaseUtil(org.spongepowered.common.event.tracking.phase.packet.PacketPhaseUtil) Collections(java.util.Collections) MerchantMenu(net.minecraft.world.inventory.MerchantMenu) AbstractHorse(net.minecraft.world.entity.animal.horse.AbstractHorse) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) Optional(java.util.Optional) AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) OptionalInt(java.util.OptionalInt) ContainerBridge(org.spongepowered.common.bridge.world.inventory.container.ContainerBridge) SimpleMenuProvider(net.minecraft.world.SimpleMenuProvider) MenuProvider(net.minecraft.world.MenuProvider) ViewableInventory(org.spongepowered.api.item.inventory.type.ViewableInventory) SimpleMenuProvider(net.minecraft.world.SimpleMenuProvider) Merchant(net.minecraft.world.item.trading.Merchant) Villager(net.minecraft.world.entity.npc.Villager) WanderingTrader(net.minecraft.world.entity.npc.WanderingTrader) Nullable(org.checkerframework.checker.nullness.qual.Nullable)

Example 8 with AbstractContainerMenu

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

the class ServerPlayerGameModeMixin_Tracker method useItemOn.

/**
 * @author Morph
 * @reason Fire interact block event.
 */
@Overwrite
public InteractionResult useItemOn(final ServerPlayer playerIn, final Level worldIn, final ItemStack stackIn, final InteractionHand handIn, final BlockHitResult blockRaytraceResultIn) {
    final BlockPos blockpos = blockRaytraceResultIn.getBlockPos();
    final BlockState blockstate = worldIn.getBlockState(blockpos);
    // Sponge start
    final BlockSnapshot snapshot = ((ServerWorld) (worldIn)).createSnapshot(VecHelper.toVector3i(blockpos));
    final Vector3d hitVec = Vector3d.from(blockRaytraceResultIn.getBlockPos().getX(), blockRaytraceResultIn.getBlockPos().getY(), blockRaytraceResultIn.getBlockPos().getZ());
    final org.spongepowered.api.util.Direction direction = DirectionFacingProvider.INSTANCE.getKey(blockRaytraceResultIn.getDirection()).get();
    final InteractBlockEvent.Secondary event = SpongeCommonEventFactory.callInteractBlockEventSecondary(playerIn, stackIn, hitVec, snapshot, direction, handIn);
    if (event.isCancelled()) {
        return InteractionResult.FAIL;
    }
    final Tristate useItem = event.useItemResult();
    final Tristate useBlock = event.useBlockResult();
    // Sponge end
    if (this.gameModeForPlayer == GameType.SPECTATOR) {
        final MenuProvider inamedcontainerprovider = blockstate.getMenuProvider(worldIn, blockpos);
        if (inamedcontainerprovider != null) {
            playerIn.openMenu(inamedcontainerprovider);
            final Vector3i pos = VecHelper.toVector3i(blockRaytraceResultIn.getBlockPos());
            final ServerLocation location = ServerLocation.of((ServerWorld) worldIn, pos);
            try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) {
                frame.pushCause(playerIn);
                frame.addContext(EventContextKeys.BLOCK_HIT, ((ServerWorld) (worldIn)).createSnapshot(pos));
                ((ContainerBridge) playerIn.containerMenu).bridge$setOpenLocation(location);
                if (!InventoryEventFactory.callInteractContainerOpenEvent(playerIn)) {
                    return InteractionResult.SUCCESS;
                }
            }
            return InteractionResult.SUCCESS;
        } else {
            return InteractionResult.PASS;
        }
    } else {
        final boolean flag = !playerIn.getMainHandItem().isEmpty() || !playerIn.getOffhandItem().isEmpty();
        final boolean flag1 = playerIn.isSecondaryUseActive() && flag;
        final ItemStack copiedStack = stackIn.copy();
        if (useBlock != Tristate.FALSE && !flag1) {
            // Sponge check useBlock
            final AbstractContainerMenu lastOpenContainer = playerIn.containerMenu;
            final InteractionResult result = blockstate.use(worldIn, playerIn, handIn, blockRaytraceResultIn);
            if (result.consumesAction() && lastOpenContainer != playerIn.containerMenu) {
                final Vector3i pos = VecHelper.toVector3i(blockRaytraceResultIn.getBlockPos());
                final ServerLocation location = ServerLocation.of((ServerWorld) worldIn, pos);
                try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) {
                    frame.pushCause(playerIn);
                    frame.addContext(EventContextKeys.BLOCK_HIT, ((ServerWorld) (worldIn)).createSnapshot(pos));
                    ((ContainerBridge) playerIn.containerMenu).bridge$setOpenLocation(location);
                    if (!InventoryEventFactory.callInteractContainerOpenEvent(playerIn)) {
                        return InteractionResult.FAIL;
                    }
                }
            }
            if (result.consumesAction()) {
                CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(playerIn, blockpos, copiedStack);
                return result;
            }
        }
        if (!stackIn.isEmpty() && !playerIn.getCooldowns().isOnCooldown(stackIn.getItem())) {
            // Sponge start
            if (useItem == Tristate.FALSE) {
                return InteractionResult.PASS;
            }
            // Sponge end
            final UseOnContext itemusecontext = new UseOnContext(playerIn, handIn, blockRaytraceResultIn);
            final InteractionResult result;
            if (this.isCreative()) {
                final int i = stackIn.getCount();
                result = stackIn.useOn(itemusecontext);
                stackIn.setCount(i);
            } else {
                result = stackIn.useOn(itemusecontext);
                // Sponge start - log change in hand
                final PhaseContext<@NonNull ?> context = PhaseTracker.SERVER.getPhaseContext();
                final TransactionalCaptureSupplier transactor = context.getTransactor();
                transactor.logPlayerInventoryChange(this.player, PlayerInventoryTransaction.EventCreator.STANDARD);
                this.player.inventoryMenu.broadcastChanges();
            // Sponge end
            }
            if (result.consumesAction()) {
                CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(playerIn, blockpos, copiedStack);
            }
            return result;
        } else {
            return InteractionResult.PASS;
        }
    }
}
Also used : ServerLocation(org.spongepowered.api.world.server.ServerLocation) Tristate(org.spongepowered.api.util.Tristate) ContainerBridge(org.spongepowered.common.bridge.world.inventory.container.ContainerBridge) ServerWorld(org.spongepowered.api.world.server.ServerWorld) InteractionResult(net.minecraft.world.InteractionResult) InteractBlockEvent(org.spongepowered.api.event.block.InteractBlockEvent) TransactionalCaptureSupplier(org.spongepowered.common.event.tracking.context.transaction.TransactionalCaptureSupplier) AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) CauseStackManager(org.spongepowered.api.event.CauseStackManager) BlockPos(net.minecraft.core.BlockPos) BlockSnapshot(org.spongepowered.api.block.BlockSnapshot) UseOnContext(net.minecraft.world.item.context.UseOnContext) MenuProvider(net.minecraft.world.MenuProvider) BlockState(net.minecraft.world.level.block.state.BlockState) Vector3d(org.spongepowered.math.vector.Vector3d) Vector3i(org.spongepowered.math.vector.Vector3i) ItemStack(net.minecraft.world.item.ItemStack) Overwrite(org.spongepowered.asm.mixin.Overwrite)

Example 9 with AbstractContainerMenu

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

the class LensRegistrar method generateLens.

@SuppressWarnings("unchecked")
private static Lens generateLens(Object inventory, int size, SlotLensProvider slotLensProvider) {
    if (size == 0) {
        return new DefaultEmptyLens();
    }
    LensFactory lensFactory = LensRegistrar.lensFactories.get(inventory.getClass());
    Lens lens = null;
    if (lensFactory != null) {
        lens = lensFactory.apply(inventory.getClass(), size, slotLensProvider);
        if (lens != null) {
            return lens;
        }
    }
    if (inventory instanceof CraftingContainer) {
        lens = LensRegistrar.lensCraftingInventory(size, ((CraftingContainer) inventory).getWidth(), ((CraftingContainer) inventory).getHeight(), slotLensProvider);
    } else if (inventory instanceof AbstractContainerMenu) {
        lens = ContainerUtil.generateLens(((AbstractContainerMenu) inventory), slotLensProvider);
    } else if (size == 1) {
        return slotLensProvider.getSlotLens(0);
    }
    if (lens != null) {
        return lens;
    }
    return new SingleIndexedLens(0, size, (Class<? extends Inventory>) inventory.getClass(), slotLensProvider);
}
Also used : CraftingContainer(net.minecraft.world.inventory.CraftingContainer) AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) CraftingInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens) SlotLens(org.spongepowered.common.inventory.lens.slots.SlotLens) PrimaryPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens) BasicSlotLens(org.spongepowered.common.inventory.lens.impl.slot.BasicSlotLens) CraftingGridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.CraftingGridInventoryLens) ContainerLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens) BrewingStandInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.BrewingStandInventoryLens) FurnaceInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.FurnaceInventoryLens) ContainerPlayerInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerPlayerInventoryLens) LargeChestInventoryLens(org.spongepowered.common.inventory.lens.impl.minecraft.LargeChestInventoryLens) Lens(org.spongepowered.common.inventory.lens.Lens) SingleIndexedLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleIndexedLens) SingleGridLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens) SingleIndexedLens(org.spongepowered.common.inventory.lens.impl.minecraft.SingleIndexedLens)

Example 10 with AbstractContainerMenu

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

the class KeyValueMatcherQuery method search.

private Map<Lens, Integer> search(final Inventory inventory, final Lens lens) {
    if (inventory instanceof AbstractContainerMenu) {
        final Map<Lens, Integer> matches = new LinkedHashMap<>();
        // Search for Container Slot properties
        for (final net.minecraft.world.inventory.Slot slot : ((AbstractContainerMenu) inventory).slots) {
            if (this.matches(null, null, (Inventory) slot)) {
                matches.put(((InventoryAdapter) slot).inventoryAdapter$getRootLens(), 0);
            }
        }
        if (!matches.isEmpty()) {
            return matches;
        }
        // Search for Container Viewed inventory properties
        final Set<Inventory> viewedInventories = new HashSet<>();
        for (final Slot slot : inventory.slots()) {
            viewedInventories.add(slot.viewedSlot().parent());
        }
        // TODO does this work?
        for (final Inventory viewedInventory : viewedInventories) {
            if (this.matches(null, null, viewedInventory)) {
                matches.put(((InventoryAdapter) viewedInventory).inventoryAdapter$getRootLens(), 0);
            }
        }
        if (!matches.isEmpty()) {
            this.delegateOffset(lens, matches);
            return matches;
        }
    }
    return this.depthLaterSearch(inventory, lens);
}
Also used : AbstractContainerMenu(net.minecraft.world.inventory.AbstractContainerMenu) Slot(org.spongepowered.api.item.inventory.Slot) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) Lens(org.spongepowered.common.inventory.lens.Lens) Inventory(org.spongepowered.api.item.inventory.Inventory) LinkedHashMap(java.util.LinkedHashMap) HashSet(java.util.HashSet)

Aggregations

AbstractContainerMenu (net.minecraft.world.inventory.AbstractContainerMenu)14 ServerPlayer (net.minecraft.server.level.ServerPlayer)5 ItemStack (net.minecraft.world.item.ItemStack)4 Inventory (org.spongepowered.api.item.inventory.Inventory)4 TextComponent (net.minecraft.network.chat.TextComponent)3 MenuProvider (net.minecraft.world.MenuProvider)3 ArrayList (java.util.ArrayList)2 Optional (java.util.Optional)2 ClientboundOpenScreenPacket (net.minecraft.network.protocol.game.ClientboundOpenScreenPacket)2 Player (net.minecraft.world.entity.player.Player)2 ContainerListener (net.minecraft.world.inventory.ContainerListener)2 CarriedInventory (org.spongepowered.api.item.inventory.type.CarriedInventory)2 TransactionalCaptureSupplier (org.spongepowered.common.event.tracking.context.transaction.TransactionalCaptureSupplier)2 Lens (org.spongepowered.common.inventory.lens.Lens)2 Collections (java.util.Collections)1 HashSet (java.util.HashSet)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 OptionalInt (java.util.OptionalInt)1 Supplier (java.util.function.Supplier)1