diff --git a/src/client/java/minicraft/entity/furniture/Chest.java b/src/client/java/minicraft/entity/furniture/Chest.java index 24f0220a..a4ec4771 100644 --- a/src/client/java/minicraft/entity/furniture/Chest.java +++ b/src/client/java/minicraft/entity/furniture/Chest.java @@ -8,6 +8,7 @@ import minicraft.gfx.SpriteLinker.LinkedSprite; import minicraft.gfx.SpriteLinker.SpriteType; import minicraft.item.BoundedInventory; +import minicraft.item.FixedInventory; import minicraft.item.Inventory; import minicraft.item.Item; import minicraft.item.Items; @@ -36,7 +37,7 @@ public Chest(String name) { * @param name Name of chest. */ public Chest(String name, LinkedSprite itemSprite) { - this(new BoundedInventory(), name, itemSprite); // Default with bounded inventory + this(new FixedInventory(), name, itemSprite); // Default with bounded inventory } protected Chest(Inventory inventory, String name, LinkedSprite itemSprite) { @@ -89,7 +90,7 @@ public Inventory getInventory() { @Override public void die() { if (level != null) { - List items = inventory.getItems(); + List items = inventory.getItemsView(); level.dropItem(x, y, items.toArray(new Item[0])); } super.die(); diff --git a/src/client/java/minicraft/entity/furniture/DeathChest.java b/src/client/java/minicraft/entity/furniture/DeathChest.java index 830def57..466070cf 100644 --- a/src/client/java/minicraft/entity/furniture/DeathChest.java +++ b/src/client/java/minicraft/entity/furniture/DeathChest.java @@ -11,10 +11,8 @@ import minicraft.gfx.Screen; import minicraft.gfx.SpriteLinker.LinkedSprite; import minicraft.gfx.SpriteLinker.SpriteType; -import minicraft.item.BoundedInventory; import minicraft.item.Inventory; import minicraft.item.Item; -import minicraft.item.StackableItem; import minicraft.item.UnlimitedInventory; public class DeathChest extends Chest { @@ -46,7 +44,7 @@ public DeathChest(Player player) { this(); this.x = player.x; this.y = player.y; - for (Item i : player.getInventory().getItems()) { + for (Item i : player.getInventory().getItemsView()) { inventory.add(i.copy()); } } @@ -98,7 +96,7 @@ public boolean use(Player player) { public void touchedBy(Entity other) { if (other instanceof Player) { Inventory playerInv = ((Player) other).getInventory(); - for (Item i : inventory.getItems()) { + for (Item i : inventory.getItemsView()) { if (playerInv.add(i) != null) { Game.notifications.add("Your inventory is full!"); return; diff --git a/src/client/java/minicraft/entity/mob/Player.java b/src/client/java/minicraft/entity/mob/Player.java index cfbf572c..9bdd5c0e 100644 --- a/src/client/java/minicraft/entity/mob/Player.java +++ b/src/client/java/minicraft/entity/mob/Player.java @@ -29,6 +29,7 @@ import minicraft.item.BoundedInventory; import minicraft.item.FishingData; import minicraft.item.FishingRodItem; +import minicraft.item.FixedInventory; import minicraft.item.FurnitureItem; import minicraft.item.Inventory; import minicraft.item.Item; @@ -147,7 +148,7 @@ public Player(@Nullable Player previousInstance, InputHandler input) { y = 24; this.input = input; // Since this implementation will be deleted by Better Creative Mode Inventory might not implemented correctly - inventory = new BoundedInventory() { // Registering all triggers to InventoryChanged. + inventory = new FixedInventory() { // Registering all triggers to InventoryChanged. private void triggerTrigger() { AdvancementElement.AdvancementTrigger.InventoryChangedTrigger.INSTANCE.trigger( new AdvancementElement.AdvancementTrigger.InventoryChangedTrigger.InventoryChangedTriggerConditionHandler.InventoryChangedTriggerConditions(this) diff --git a/src/client/java/minicraft/item/BoundedInventory.java b/src/client/java/minicraft/item/BoundedInventory.java index 55b45cd6..e73354ed 100644 --- a/src/client/java/minicraft/item/BoundedInventory.java +++ b/src/client/java/minicraft/item/BoundedInventory.java @@ -3,19 +3,14 @@ import minicraft.util.Logging; import org.jetbrains.annotations.Nullable; -public class BoundedInventory extends Inventory { - public static final int DEFAULT_SIZE = 27; - - protected final int maxItem; - - public BoundedInventory() { this(DEFAULT_SIZE); } - public BoundedInventory(int maxItem) { - this.maxItem = maxItem; - } - - public int getMaxSlots() { - return maxItem; - } +public abstract class BoundedInventory extends Inventory { + /** + * Gets the current maximum capacity of inventory. + * This value is capable to inventory expanding (e.g. upgrades), but not changing by other + * conditions such as the contents. + * @return current value of maximum capacity of general slots + */ + public abstract int getMaxSlots(); @Override public @Nullable Item add(@Nullable Item item) { @@ -26,6 +21,7 @@ public int getMaxSlots() { return null; } + int maxItem = getMaxSlots(); if (item instanceof StackableItem) { // If the item is a item... StackableItem toTake = (StackableItem) item; // ...convert it into a StackableItem object. for (Item value : items) { diff --git a/src/client/java/minicraft/item/FixedInventory.java b/src/client/java/minicraft/item/FixedInventory.java new file mode 100644 index 00000000..e424c8bd --- /dev/null +++ b/src/client/java/minicraft/item/FixedInventory.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2024 Minicraft+ contributors + * SPDX-License-Identifier: GPL-3.0-only + */ + +package minicraft.item; + +/** + * A general inventory implementation with fixed size (number of slots). + */ +public class FixedInventory extends BoundedInventory { + public static final int DEFAULT_SIZE = 27; + + protected final int maxSlots; + + public FixedInventory() { this(DEFAULT_SIZE); } + public FixedInventory(int maxSlots) { + this.maxSlots = maxSlots; + } + + @Override + public int getMaxSlots() { + return maxSlots; + } +} diff --git a/src/client/java/minicraft/item/Inventory.java b/src/client/java/minicraft/item/Inventory.java index 9044117d..48e86705 100644 --- a/src/client/java/minicraft/item/Inventory.java +++ b/src/client/java/minicraft/item/Inventory.java @@ -5,18 +5,28 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Random; +/** + * An item storage space for general purposes, based on the maximum number of item stacks, + * and the default item maximum count for stackable items. + *

+ * For special conditional storage space for items, like custom maximum count of items and + * storage space that is variable to other conditions, slots or a custom implementation + * is recommended instead. + *

+ */ public abstract class Inventory { protected final List items = new ArrayList<>(); // The list of items that is in the inventory. /** * Returns all the items which are in this inventory. - * @return ArrayList containing all the items in the inventory. + * @return a read-only view of the internal list containing all the items in the inventory. */ - public List getItems() { - return new ArrayList<>(items); + public List getItemsView() { + return Collections.unmodifiableList(items); } public void clearInv() { diff --git a/src/client/java/minicraft/item/UnlimitedInventory.java b/src/client/java/minicraft/item/UnlimitedInventory.java index 808c849c..c932261d 100644 --- a/src/client/java/minicraft/item/UnlimitedInventory.java +++ b/src/client/java/minicraft/item/UnlimitedInventory.java @@ -3,6 +3,9 @@ import minicraft.util.Logging; import org.jetbrains.annotations.Nullable; +/** + * A general inventory implementation basically without size limit (maximum number of slots). + */ public class UnlimitedInventory extends Inventory { @Override public @Nullable Item add(@Nullable Item item) { diff --git a/src/client/java/minicraft/screen/InventoryMenu.java b/src/client/java/minicraft/screen/InventoryMenu.java index 34fa9c92..debb68f2 100644 --- a/src/client/java/minicraft/screen/InventoryMenu.java +++ b/src/client/java/minicraft/screen/InventoryMenu.java @@ -21,7 +21,7 @@ class InventoryMenu extends ItemListMenu { InventoryMenu(Entity holder, Inventory inv, String title, RelPos entryPos, @Nullable Action onStackUpdateListener) { this(holder, inv, title, entryPos, false, onStackUpdateListener); } InventoryMenu(Entity holder, Inventory inv, String title, RelPos entryPos, boolean creativeInv) { this(holder, inv, title, entryPos, creativeInv, null); } InventoryMenu(Entity holder, Inventory inv, String title, RelPos entryPos, boolean creativeInv, @Nullable Action onStackUpdateListener) { - super(ItemListMenu.getBuilder(entryPos), ItemEntry.useItems(inv.getItems()), title); + super(ItemListMenu.getBuilder(entryPos), ItemEntry.useItems(inv.getItemsView()), title); this.inv = inv; this.holder = holder; this.title = title; @@ -31,7 +31,7 @@ class InventoryMenu extends ItemListMenu { } InventoryMenu(InventoryMenu model) { - super(ItemListMenu.getBuilder(model.entryPos), ItemEntry.useItems(model.inv.getItems()), model.title); + super(ItemListMenu.getBuilder(model.entryPos), ItemEntry.useItems(model.inv.getItemsView()), model.title); this.inv = model.inv; this.holder = model.holder; this.creativeInv = model.creativeInv; diff --git a/src/client/java/minicraft/util/AdvancementElement.java b/src/client/java/minicraft/util/AdvancementElement.java index 8aef5a88..9c51495a 100644 --- a/src/client/java/minicraft/util/AdvancementElement.java +++ b/src/client/java/minicraft/util/AdvancementElement.java @@ -1,7 +1,6 @@ package minicraft.util; import minicraft.core.World; -import minicraft.entity.furniture.Chest; import minicraft.entity.furniture.RewardChest; import minicraft.item.BoundedInventory; import minicraft.item.Item; @@ -925,7 +924,7 @@ public static class InventoryChangedTriggerConditions extends AdvancementTrigger private final int maxSlots; public InventoryChangedTriggerConditions(BoundedInventory inventory) { - items.addAll(inventory.getItems()); + items.addAll(inventory.getItemsView()); maxSlots = inventory.getMaxSlots(); } }