Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
ashblue opened this issue Feb 26, 2024 · 1 comment
Closed

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

ashblue opened this issue Feb 26, 2024 · 1 comment
Labels
bug Something isn't working released

Comments

@ashblue
Copy link
Owner

ashblue commented Feb 26, 2024

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)
@ashblue ashblue added the bug Something isn't working label Feb 26, 2024
ashblue pushed a commit that referenced this issue Jan 11, 2025
# [2.0.0](v1.0.1...v2.0.0) (2025-01-11)

### Bug Fixes

* **id repair:** null and empty string IDs are now repaired ([489ec64](489ec64))
* **inventory add:** no longer crashes when read only items are added ([afb6b44](afb6b44)), closes [#17](#17)
* **inventory.getall<t>():** no longer crashes when used with a custom item entry type ([c8678b0](c8678b0)), closes [#20](#20)
* **semantic-release:** was not picking up the main branch ([7124ae0](7124ae0))

### Features

* **inventory window:** categories now live display in the item table ([53193c4](53193c4)), closes [#21](#21)
* **item definitions:** display name must now be implemented on all ItemDefinitionBase classes ([56e69c2](56e69c2))

### BREAKING CHANGES

* **item definitions:** Find all classes that inherit ItemDefinitionBase and add `[SerializeField] string
_displayName; public override string DisplayName => _displayName;`. To fix the error that your
classes do not implement  the display name get accessor.
@ashblue
Copy link
Owner Author

ashblue commented Jan 11, 2025

🎉 This issue has been resolved in version 2.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working released
Projects
None yet
Development

No branches or pull requests

1 participant