Search in sources :

Example 1 with DelegatingLens

use of org.spongepowered.common.inventory.lens.impl.DelegatingLens 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 2 with DelegatingLens

use of org.spongepowered.common.inventory.lens.impl.DelegatingLens 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 3 with DelegatingLens

use of org.spongepowered.common.inventory.lens.impl.DelegatingLens in project SpongeCommon by SpongePowered.

the class SpongeQuery method toResult.

protected Inventory toResult(Inventory inventory, Fabric fabric, Map<Lens, Integer> matches) {
    if (matches.isEmpty()) {
        return new EmptyInventoryImpl(inventory);
    }
    if (matches.size() == 1) {
        final Map.Entry<Lens, Integer> entry = matches.entrySet().iterator().next();
        if (entry.getValue() == 0) {
            return entry.getKey().getAdapter(fabric, inventory);
        }
        final LensRegistrar.BasicSlotLensProvider slotProvider = new LensRegistrar.BasicSlotLensProvider(entry.getKey().slotCount());
        // TODO check correct slotprovider
        final DelegatingLens delegate = new DelegatingLens(entry.getValue(), entry.getKey(), slotProvider);
        return delegate.getAdapter(fabric, inventory);
    }
    final QueryLens lens = new QueryLens(matches, this);
    return lens.getAdapter(fabric, inventory);
}
Also used : LensRegistrar(org.spongepowered.common.inventory.lens.impl.LensRegistrar) EmptyInventoryImpl(org.spongepowered.common.inventory.EmptyInventoryImpl) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) QueriedSlotLens(org.spongepowered.common.inventory.lens.impl.slot.QueriedSlotLens) SlotLens(org.spongepowered.common.inventory.lens.slots.SlotLens) QueryLens(org.spongepowered.common.inventory.lens.impl.QueryLens) Lens(org.spongepowered.common.inventory.lens.Lens) DelegatingSlotLens(org.spongepowered.common.inventory.lens.impl.slot.DelegatingSlotLens) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) QueryLens(org.spongepowered.common.inventory.lens.impl.QueryLens)

Example 4 with DelegatingLens

use of org.spongepowered.common.inventory.lens.impl.DelegatingLens in project SpongeCommon by SpongePowered.

the class SpongeInventoryBuilder method completeStructure.

public EndStep completeStructure() {
    CompoundLens.Builder lensBuilder = CompoundLens.builder();
    int size = 0;
    for (Lens lens : this.lenses) {
        size += lens.slotCount();
    }
    final LensRegistrar.BasicSlotLensProvider lensProvider = new LensRegistrar.BasicSlotLensProvider(size);
    int offset = 0;
    for (Lens lens : this.lenses) {
        lensBuilder.add(new DelegatingLens(offset, lens, lensProvider));
        offset += lens.slotCount();
    }
    this.finalLens = lensBuilder.build(lensProvider);
    return this;
}
Also used : LensRegistrar(org.spongepowered.common.inventory.lens.impl.LensRegistrar) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) DefaultIndexedLens(org.spongepowered.common.inventory.lens.impl.DefaultIndexedLens) Lens(org.spongepowered.common.inventory.lens.Lens) GridInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens) DelegatingLens(org.spongepowered.common.inventory.lens.impl.DelegatingLens)

Aggregations

Lens (org.spongepowered.common.inventory.lens.Lens)4 DelegatingLens (org.spongepowered.common.inventory.lens.impl.DelegatingLens)4 CompoundLens (org.spongepowered.common.inventory.lens.impl.CompoundLens)3 GridInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.GridInventoryLens)3 LinkedHashMap (java.util.LinkedHashMap)2 Map (java.util.Map)2 CraftingContainer (net.minecraft.world.inventory.CraftingContainer)2 ResultContainer (net.minecraft.world.inventory.ResultContainer)2 Slot (net.minecraft.world.inventory.Slot)2 ResultSlotAccessor (org.spongepowered.common.accessor.world.inventory.ResultSlotAccessor)2 CraftingInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.CraftingInventoryLens)2 PrimaryPlayerInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.PrimaryPlayerInventoryLens)2 PlayerInventoryLens (org.spongepowered.common.inventory.lens.impl.minecraft.PlayerInventoryLens)2 SingleGridLens (org.spongepowered.common.inventory.lens.impl.minecraft.SingleGridLens)2 ContainerLens (org.spongepowered.common.inventory.lens.impl.minecraft.container.ContainerLens)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Optional (java.util.Optional)1 Random (java.util.Random)1