From ada6623e13078ae8d5b46ad23e72095a3805a2da Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Sun, 23 Oct 2016 20:29:26 +0200 Subject: [PATCH] implement retrieving Properties from CustomInventories and viewing containers implement retrieving InventoryTitle Property from Container/IInventory --- SpongeAPI | 2 +- .../inventory/SpongeInventoryBuilder.java | 2 +- .../item/inventory/adapter/impl/Adapter.java | 55 +++++++++++++++++++ .../impl/MinecraftInventoryAdapter.java | 7 +-- .../lens/impl/struct/LensHandle.java | 10 ++-- 5 files changed, 64 insertions(+), 12 deletions(-) diff --git a/SpongeAPI b/SpongeAPI index f9d00ec740e..55fbc17d134 160000 --- a/SpongeAPI +++ b/SpongeAPI @@ -1 +1 @@ -Subproject commit f9d00ec740ef7f540ced92994ea5bfde46dd8a80 +Subproject commit 55fbc17d1347a2e294825d3be3bb854eba66d199 diff --git a/src/main/java/org/spongepowered/common/item/inventory/SpongeInventoryBuilder.java b/src/main/java/org/spongepowered/common/item/inventory/SpongeInventoryBuilder.java index 681509beb9f..ff2c2cb3596 100644 --- a/src/main/java/org/spongepowered/common/item/inventory/SpongeInventoryBuilder.java +++ b/src/main/java/org/spongepowered/common/item/inventory/SpongeInventoryBuilder.java @@ -97,7 +97,7 @@ public Inventory build(Object plugin) { @Override public Inventory.Builder from(Inventory value) { if (value instanceof CustomInventory) { - this.archetype = ((CustomInventory) value).getArchetype(); + this.archetype = value.getArchetype(); this.properties.putAll(((CustomInventory) value).getProperties()); return this; } diff --git a/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/Adapter.java b/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/Adapter.java index a9958d485fd..4b12af57280 100644 --- a/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/Adapter.java +++ b/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/Adapter.java @@ -26,6 +26,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.collect.Streams; import net.minecraft.inventory.IInventory; import org.spongepowered.api.item.ItemType; import org.spongepowered.api.item.ItemTypes; @@ -35,12 +36,15 @@ import org.spongepowered.api.item.inventory.InventoryProperty; import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.item.inventory.Slot; +import org.spongepowered.api.item.inventory.property.InventoryTitle; import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult; import org.spongepowered.api.item.inventory.transaction.InventoryTransactionResult.Type; import org.spongepowered.api.plugin.PluginContainer; +import org.spongepowered.api.text.Text; import org.spongepowered.api.text.translation.Translation; import org.spongepowered.common.item.inventory.EmptyInventoryImpl; import org.spongepowered.common.item.inventory.adapter.InventoryAdapter; +import org.spongepowered.common.item.inventory.custom.CustomInventory; import org.spongepowered.common.item.inventory.lens.Fabric; import org.spongepowered.common.item.inventory.lens.Lens; import org.spongepowered.common.item.inventory.lens.LensProvider; @@ -51,6 +55,7 @@ import org.spongepowered.common.item.inventory.lens.slots.SlotLens; import org.spongepowered.common.item.inventory.observer.InventoryEventArgs; import org.spongepowered.common.item.inventory.util.ItemStackUtil; +import org.spongepowered.common.text.SpongeTexts; import org.spongepowered.common.text.translation.SpongeTranslation; import java.util.ArrayList; @@ -283,6 +288,56 @@ public static int getCapacity(Fabric inv, Lens> Collection getRootProperties(InventoryAdapter adapter, Class property) { + adapter = inventoryRoot(adapter); + if (adapter instanceof CustomInventory) { + return ((CustomInventory) adapter).getProperties().values().stream().filter(p -> property.equals(p.getClass())) + .map(property::cast).collect(Collectors.toList()); + } + return Streams.stream(findRootProperty(adapter, property)).collect(Collectors.toList()); + } + + static > Optional getRootProperty(InventoryAdapter adapter, Class property, Object key) { + adapter = inventoryRoot(adapter); + if (adapter instanceof CustomInventory) { + InventoryProperty forKey = ((CustomInventory) adapter).getProperties().get(key); + if (forKey != null && property.equals(forKey.getClass())) { + return Optional.of((T) forKey); + } + } + return findRootProperty(adapter, property); + } + + private static > Optional findRootProperty(InventoryAdapter adapter, Class property) { + if (property == InventoryTitle.class) { + if (adapter instanceof Container) { + IInventory inv = adapter.getInventory().allInventories().iterator().next(); + Text text = SpongeTexts.toText(inv.getDisplayName()); + return ((Optional) Optional.of(InventoryTitle.of(text))); + } + if (adapter instanceof IInventory) { + Text text = SpongeTexts.toText(((IInventory) adapter).getDisplayName()); + return ((Optional) Optional.of(InventoryTitle.of(text))); + } + } + // TODO more properties of top level inventory + return Optional.empty(); + } + + private static InventoryAdapter inventoryRoot(InventoryAdapter adapter) { + // Get Root Inventory + adapter = ((InventoryAdapter) adapter.root()); + if (adapter instanceof Container) { + // If Root is a Container get the viewed inventory + IInventory first = adapter.getInventory().allInventories().iterator().next(); + if (first instanceof CustomInventory) { + // if viewed inventory is a custom inventory get it instead + adapter = ((InventoryAdapter) first); + } + } + return adapter; + } + public static boolean contains(InventoryAdapter adapter, ItemStack stack) { return Logic.contains(adapter.getInventory(), adapter.getRootLens(), stack, stack.getQuantity()); } diff --git a/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/MinecraftInventoryAdapter.java b/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/MinecraftInventoryAdapter.java index 32eb5040f5c..777b8ce8711 100644 --- a/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/MinecraftInventoryAdapter.java +++ b/src/main/java/org/spongepowered/common/item/inventory/adapter/impl/MinecraftInventoryAdapter.java @@ -39,7 +39,6 @@ import org.spongepowered.common.item.inventory.query.Query; import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.Optional; @@ -143,7 +142,7 @@ default void setMaxStackSize(int size) { @Override default > Collection getProperties(Class property) { if (this.parent() == this) { - return Collections.emptyList(); // TODO top level inventory properties + return Adapter.Logic.getRootProperties(this, property); } return this.parent().getProperties(this, property); } @@ -153,7 +152,7 @@ default void setMaxStackSize(int size) { default > Optional getProperty(Inventory child, Class property, Object key) { for (InventoryProperty prop : Adapter.Logic.getProperties(this, child, property)) { if (key.equals(prop.getKey())) { - return Optional.of(((T) prop)); + return Optional.of((T)prop); } } return Optional.empty(); @@ -162,7 +161,7 @@ default void setMaxStackSize(int size) { @Override default > Optional getProperty(Class property, Object key) { if (this.parent() == this) { - return Optional.empty(); // TODO top level inventory properties + return Adapter.Logic.getRootProperty(this, property, key); } return this.parent().getProperty(this, property, key); } diff --git a/src/main/java/org/spongepowered/common/item/inventory/lens/impl/struct/LensHandle.java b/src/main/java/org/spongepowered/common/item/inventory/lens/impl/struct/LensHandle.java index 316a2bc449e..aba76c3c09d 100644 --- a/src/main/java/org/spongepowered/common/item/inventory/lens/impl/struct/LensHandle.java +++ b/src/main/java/org/spongepowered/common/item/inventory/lens/impl/struct/LensHandle.java @@ -73,10 +73,8 @@ public LensHandle() { public LensHandle(Lens lens, InventoryProperty... properties) { this.lens = lens; if (properties != null && properties.length > 0) { - this.properties = new ArrayList>(); - for (InventoryProperty property : properties) { - this.properties.add(property); - } + this.properties = new ArrayList<>(); + Collections.addAll(this.properties, properties); } } @@ -90,13 +88,13 @@ public LensHandle(Lens lens, InventoryProperty... prop public LensHandle(Lens lens, Collection> properties) { this.lens = lens; if (properties != null && properties.size() > 0) { - this.properties = new ArrayList>(properties); + this.properties = new ArrayList<>(properties); } } public Collection> getProperties() { if (this.properties == null) { - return Collections.>emptyList(); + return Collections.emptyList(); } return Collections.unmodifiableCollection(this.properties); }