Search in sources :

Example 1 with InventoryBridge

use of org.spongepowered.common.bridge.world.inventory.InventoryBridge 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 2 with InventoryBridge

use of org.spongepowered.common.bridge.world.inventory.InventoryBridge in project SpongeCommon by SpongePowered.

the class UnionQuery method execute.

@Override
public Inventory execute(Inventory inventory, InventoryAdapter adapter) {
    final CompoundLens.Builder lensBuilder = CompoundLens.builder().add(adapter.inventoryAdapter$getRootLens());
    final CompoundFabric fabric = new CompoundFabric(adapter.inventoryAdapter$getFabric(), ((InventoryBridge) this.other).bridge$getAdapter().inventoryAdapter$getFabric());
    final CompoundSlotLensProvider provider = new CompoundSlotLensProvider().add(adapter);
    for (final Inventory inv : this.other.children()) {
        lensBuilder.add(((InventoryAdapter) inv).inventoryAdapter$getRootLens());
        provider.add((InventoryAdapter) inv);
    }
    final CompoundLens lens = lensBuilder.build(provider);
    return lens.getAdapter(fabric, inventory);
}
Also used : CompoundFabric(org.spongepowered.common.inventory.fabric.CompoundFabric) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) CompoundSlotLensProvider(org.spongepowered.common.inventory.lens.CompoundSlotLensProvider) CompoundLens(org.spongepowered.common.inventory.lens.impl.CompoundLens) Inventory(org.spongepowered.api.item.inventory.Inventory)

Example 3 with InventoryBridge

use of org.spongepowered.common.bridge.world.inventory.InventoryBridge in project SpongeCommon by SpongePowered.

the class TraitMixin_ArmorEquipable_Inventory_API method equip.

@Override
public boolean equip(final EquipmentType type, @Nullable final ItemStack equipment) {
    final InventoryAdapter inv = ((InventoryBridge) this).bridge$getAdapter();
    final EquipmentInventoryLens lens = this.impl$equipmentInventory(inv);
    final Fabric fabric = inv.inventoryAdapter$getFabric();
    return lens.getSlotLens(type).setStack(fabric, ItemStackUtil.toNative(equipment));
}
Also used : InventoryAdapter(org.spongepowered.common.inventory.adapter.InventoryAdapter) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) Fabric(org.spongepowered.common.inventory.fabric.Fabric) EquipmentInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.EquipmentInventoryLens)

Example 4 with InventoryBridge

use of org.spongepowered.common.bridge.world.inventory.InventoryBridge in project SpongeCommon by SpongePowered.

the class TraitMixin_Equipable_Inventory_API method equipment.

@Override
public EquipmentInventory equipment() {
    if (this.impl$equipmentInventory == null) {
        final InventoryAdapter inv = ((InventoryBridge) this).bridge$getAdapter();
        final EquipmentInventoryLens lens = (EquipmentInventoryLens) inv.inventoryAdapter$getRootLens();
        this.impl$equipmentInventory = (EquipmentInventory) lens.getAdapter(inv.inventoryAdapter$getFabric(), null);
    }
    return this.impl$equipmentInventory;
}
Also used : InventoryAdapter(org.spongepowered.common.inventory.adapter.InventoryAdapter) InventoryBridge(org.spongepowered.common.bridge.world.inventory.InventoryBridge) EquipmentInventoryLens(org.spongepowered.common.inventory.lens.impl.comp.EquipmentInventoryLens)

Example 5 with InventoryBridge

use of org.spongepowered.common.bridge.world.inventory.InventoryBridge 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)

Aggregations

InventoryBridge (org.spongepowered.common.bridge.world.inventory.InventoryBridge)8 InventoryAdapter (org.spongepowered.common.inventory.adapter.InventoryAdapter)5 EquipmentInventoryLens (org.spongepowered.common.inventory.lens.impl.comp.EquipmentInventoryLens)4 CompoundSlotLensProvider (org.spongepowered.common.inventory.lens.CompoundSlotLensProvider)3 CompoundLens (org.spongepowered.common.inventory.lens.impl.CompoundLens)3 ArrayList (java.util.ArrayList)2 Slot (net.minecraft.world.inventory.Slot)2 Inventory (org.spongepowered.api.item.inventory.Inventory)2 ImmutableSet (com.google.common.collect.ImmutableSet)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 Random (java.util.Random)1 Collectors (java.util.stream.Collectors)1 ServerLevel (net.minecraft.server.level.ServerLevel)1 ServerPlayer (net.minecraft.server.level.ServerPlayer)1 CompoundContainer (net.minecraft.world.CompoundContainer)1 Containers (net.minecraft.world.Containers)1 ItemEntity (net.minecraft.world.entity.item.ItemEntity)1