ashblue / unity-elastic-inventory

An easy to use Unity inventory framework built with scaling and extendability in mind
MIT License
42 stars 2 forks source link

Adding a read only item directly crashes AddEntry on inventory #17

Open ashblue opened 7 months ago

ashblue commented 7 months ago

Calling a script like this with ItemEntryData causes an error when adding an item.

public class MyInventory {
    public InventoryHelper inventory;
    public ItemEntryData item;

    void Awake () {
        inventory.Add(item);
    }
}

The quick workaround is as follows for now.

public class MyInventory {
    public InventoryHelper inventory;
    public ItemEntryData item;

    void Awake () {
        inventory.Add(item.Definition, item.Quantity);
    }
}

If you want to fix this and submit a PR. The issue is this line in InventoryInstance.cs

        public IItemEntryReadOnly AddEntry(IItemEntryReadOnly entry) {
            if (entry == null) return null;

            // Unique items and items without existing quantities can be added directly
            if (entry.Definition.Unique || !Has(entry.Definition)) {
                // ### as IItemEntry ### is causing the issue
                AddEntry(entry as IItemEntry);
                entry.UpdateTimeLogs();
                return entry;
            }

            return Add(entry.Definition, entry.Quantity);

It needs to handle read only implementations separate from live item entry instances. A test should be included.

        public IItemEntryReadOnly AddEntry(IItemEntryReadOnly entry) {
            if (entry == null) return null;

            // Unique items and items without existing quantities can be added directly
            if ((entry.Definition.Unique || !Has(entry.Definition)) && entry is IItemEntry) {
                AddEntry(entry as IItemEntry);
                entry.UpdateTimeLogs();
                return entry;
            }

            return Add(entry.Definition, entry.Quantity);

Error log.

NullReferenceException: Object reference not set to an instance of an object
CleverCrow.Fluid.ElasticInventory.InventoryInstance.AddEntry (CleverCrow.Fluid.ElasticInventory.IItemEntry entry) (at ./Library/PackageCache/com.fluid.elastic-inventory@1.0.1/Runtime/Inventory/InventoryInstance.cs:72)
CleverCrow.Fluid.ElasticInventory.InventoryInstance.AddEntry (CleverCrow.Fluid.ElasticInventory.IItemEntryReadOnly entry) (at ./Library/PackageCache/com.fluid.elastic-inventory@1.0.1/Runtime/Inventory/InventoryInstance.cs:63)
CleverCrow.SpacePirateRebellion.Exploration.SkillChallengeDefinition.OnActivate (CleverCrow.SpacePirateRebellion.Exploration.ITileRuntime tile, CleverCrow.SpacePirateRebellion.Exploration.IPlayerExploration target) (at Assets/Game/Scripts/Exploration/Tiles/SkillChallengeDefinition.cs:111)
CleverCrow.SpacePirateRebellion.Exploration.TileDefinitionBase.Activate (CleverCrow.SpacePirateRebellion.Exploration.ITileRuntime tile, CleverCrow.SpacePirateRebellion.Exploration.IPlayerExploration target) (at Assets/Game/Scripts/Exploration/Tiles/TileDefinitionBase.cs:15)
CleverCrow.SpacePirateRebellion.Exploration.TileRuntime.Activate (CleverCrow.SpacePirateRebellion.Exploration.IPlayerExploration player) (at Assets/Game/Scripts/Exploration/Tiles/TileRuntime.cs:21)
CleverCrow.SpacePirateRebellion.Exploration.ExplorationController+<PlayLoop>d__16.MoveNext () (at Assets/Game/Scripts/Exploration/ExplorationController.cs:69)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <6b66e7caaeb045048a0fbc11f111e6fa>:0)