use of org.spongepowered.common.item.inventory.lens.Lens in project SpongeCommon by SpongePowered.
the class ContainerUtil method generateAdapterLens.
@Nullable
private static Lens<IInventory, ItemStack> generateAdapterLens(SlotProvider<IInventory, ItemStack> slots, int index, CraftingInventoryData crafting, List<Slot> slotList, @Nullable IInventory subInventory) {
if (!(subInventory instanceof InventoryAdapter)) {
return null;
}
Lens<IInventory, ItemStack> adapterLens = ((InventoryAdapter) subInventory).getRootLens();
if (adapterLens == null) {
return null;
}
if (subInventory.getSizeInventory() == 0) {
return new DefaultEmptyLens<>(((InventoryAdapter) subInventory));
}
if (adapterLens instanceof PlayerInventoryLens) {
if (slotList.size() == 36) {
return new DelegatingLens(index, new MainPlayerInventoryLensImpl(index, slots, true), slots);
}
return null;
}
// For Crafting Result we need the Slot to get Filter logic
if (subInventory instanceof InventoryCraftResult) {
Slot slot = slotList.get(0);
adapterLens = new CraftingOutputSlotLensImpl(index, item -> slot.isItemValid(((ItemStack) item)), itemType -> (slot.isItemValid((ItemStack) org.spongepowered.api.item.inventory.ItemStack.of(itemType, 1))));
crafting.out = index;
if (slot instanceof SlotCrafting) {
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 = ((SlotCrafting) slot).craftMatrix;
}
}
}
if (subInventory instanceof InventoryCrafting) {
crafting.base = index;
crafting.grid = ((InventoryCrafting) subInventory);
}
return new DelegatingLens(index, adapterLens, slots);
}
use of org.spongepowered.common.item.inventory.lens.Lens in project SpongeCommon by SpongePowered.
the class MixinInventoryPlayer method onConstructed.
@Inject(method = "<init>*", at = @At("RETURN"), remap = false)
private void onConstructed(EntityPlayer playerIn, CallbackInfo ci) {
// Find offhand slot
for (NonNullList<ItemStack> inventory : this.allInventories) {
if (inventory == this.offHandInventory) {
break;
}
this.offhandIndex += inventory.size();
}
// Set Carrier if we got a real Player
if (playerIn instanceof EntityPlayerMP) {
this.carrier = (Player) playerIn;
this.inventory = new IInventoryFabric((IInventory) this);
Class clazz = this.getClass();
if (clazz == InventoryPlayer.class) {
// Build Player Lens
// We only care about Server inventories
this.slots = new SlotCollection.Builder().add(this.mainInventory.size()).add(this.offHandInventory.size()).add(EquipmentSlotAdapter.class, index -> new EquipmentSlotLensImpl(index, i -> true, t -> true, e -> e == EquipmentTypes.BOOTS)).add(EquipmentSlotAdapter.class, index -> new EquipmentSlotLensImpl(index, i -> true, t -> true, e -> e == EquipmentTypes.LEGGINGS)).add(EquipmentSlotAdapter.class, index -> new EquipmentSlotLensImpl(index, i -> true, t -> true, e -> e == EquipmentTypes.CHESTPLATE)).add(EquipmentSlotAdapter.class, index -> new EquipmentSlotLensImpl(index, i -> true, t -> true, e -> e == EquipmentTypes.HEADWEAR)).add(this.armorInventory.size() - 4, EquipmentSlotAdapter.class).add(this.getSizeInventory() - this.mainInventory.size() - this.offHandInventory.size() - this.armorInventory.size()).build();
this.lens = new PlayerInventoryLens(this, this.slots);
} else if (this.getSizeInventory() != 0) {
// Fallback OrderedLens when not 0 sized inventory
this.slots = new SlotCollection.Builder().add(this.getSizeInventory()).build();
this.lens = new OrderedInventoryLensImpl(0, this.getSizeInventory(), 1, slots);
}
}
}
use of org.spongepowered.common.item.inventory.lens.Lens in project SpongeCommon by SpongePowered.
the class MixinContainerWorkbench method rootLens.
@Override
public Lens<IInventory, ItemStack> rootLens(Fabric<IInventory> fabric, InventoryAdapter<IInventory, ItemStack> adapter) {
List<Lens<IInventory, ItemStack>> lenses = new ArrayList<>();
lenses.add(new CraftingInventoryLensImpl(0, 1, 3, 3, inventory$getSlotProvider()));
lenses.add(new MainPlayerInventoryLensImpl(3 * 3 + 1, inventory$getSlotProvider(), true));
return new ContainerLens(adapter, inventory$getSlotProvider(), lenses);
}
use of org.spongepowered.common.item.inventory.lens.Lens in project SpongeCommon by SpongePowered.
the class MixinTraitAdapter method getReusableLens.
@SuppressWarnings("unchecked")
private ReusableLens<?> getReusableLens() {
if (this.reusableLens != null) {
return this.reusableLens;
}
if (this instanceof ReusableLensProvider) {
return ((ReusableLensProvider<IInventory, ItemStack>) this).generateLens(this.getFabric(), this);
}
if (this instanceof LensProvider) {
this.slots = ((LensProvider) this).slotProvider(this.getFabric(), this);
Lens lens = ((LensProvider) this).rootLens(this.getFabric(), this);
return new ReusableLens<>(this.slots, lens);
}
SlotCollection slots = new SlotCollection.Builder().add(this.getFabric().getSize()).build();
Lens<IInventory, ItemStack> lens;
if (this.getFabric().getSize() == 0) {
lens = new DefaultEmptyLens<>(this);
} else {
lens = new OrderedInventoryLensImpl(0, this.getFabric().getSize(), 1, slots);
}
return new ReusableLens<>(slots, lens);
}
use of org.spongepowered.common.item.inventory.lens.Lens 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", "rawtypes" })
private static Lens<IInventory, ItemStack> generateLens(net.minecraft.inventory.Container container, SlotProvider<IInventory, ItemStack> slots) {
// Get all inventories viewed in the Container & count slots & retain order
Map<Optional<IInventory>, List<Slot>> viewed = container.inventorySlots.stream().collect(Collectors.groupingBy(i -> Optional.<IInventory>ofNullable(i.inventory), LinkedHashMap::new, Collectors.toList()));
// Count the index
int index = 0;
CraftingInventoryData crafting = new CraftingInventoryData();
List<Lens<IInventory, ItemStack>> lenses = new ArrayList<>();
for (Map.Entry<Optional<IInventory>, List<Slot>> entry : viewed.entrySet()) {
List<Slot> slotList = entry.getValue();
int slotCount = slotList.size();
IInventory subInventory = entry.getKey().orElse(null);
// Generate Lens based on existing InventoryAdapter
Lens<IInventory, ItemStack> lens = generateAdapterLens(slots, index, crafting, slotList, subInventory);
// Check if sub-inventory is LensProvider
if (lens == null && subInventory instanceof LensProvider) {
Fabric<IInventory> keyFabric = MinecraftFabric.of(subInventory);
lens = ((LensProvider) subInventory).rootLens(keyFabric, new VanillaAdapter(keyFabric, container));
}
// Unknown Inventory or Inventory size <> Lens size
if (lens == null || lens.slotCount() != slotCount) {
if (subInventory instanceof InventoryCraftResult) {
// InventoryCraftResult is a Slot
Slot slot = slotList.get(0);
lens = new CraftingOutputSlotLensImpl(index, item -> slot.isItemValid(((ItemStack) item)), itemType -> (slot.isItemValid((ItemStack) org.spongepowered.api.item.inventory.ItemStack.of(itemType, 1))));
} else if (subInventory instanceof InventoryCrafting) {
// InventoryCrafting has width and height and is Input
InventoryCrafting craftGrid = (InventoryCrafting) subInventory;
lens = new GridInventoryLensImpl(index, craftGrid.getWidth(), craftGrid.getHeight(), craftGrid.getWidth(), InputSlot.class, slots);
} else if (slotCount == 1) {
// Unknown - A single Slot
lens = new SlotLensImpl(index);
} else if (subInventory instanceof InventoryBasic && subInventory.getClass().isAnonymousClass()) {
// Anonymous InventoryBasic -> Check for Vanilla Containers:
switch(subInventory.getName()) {
// Container InputSlots
case "Enchant":
case // Container InputSlots
"Repair":
lens = new OrderedInventoryLensImpl(index, slotCount, 1, InputSlot.class, slots);
break;
default:
// Unknown
lens = new OrderedInventoryLensImpl(index, slotCount, 1, slots);
}
} else {
// Unknown - fallback to OrderedInventory
lens = new OrderedInventoryLensImpl(index, slotCount, 1, slots);
}
}
lenses.add(lens);
index += slotCount;
}
List<Lens<IInventory, ItemStack>> additional = new ArrayList<>();
try {
if (crafting.out != null && crafting.base != null && crafting.grid != null) {
additional.add(new CraftingInventoryLensImpl(crafting.out, crafting.base, crafting.grid.getWidth(), crafting.grid.getHeight(), slots));
}
} catch (Exception e) {
SpongeImpl.getLogger().error("Error while creating CraftingInventoryLensImpl for " + container.getClass().getName(), e);
}
// Lens containing/delegating to other lenses
return new ContainerLens((InventoryAdapter<IInventory, ItemStack>) container, slots, lenses, additional);
}
Aggregations