using System.Linq; using Cirno.Scripts.Resources; using Godot; using Godot.Collections; namespace Cirno.Scripts.Interactables; public partial class ItemPickup3D : Interactable3D { [Export] public Array LootTable = []; private bool _autoPickup = false; public bool AutoPickup => _autoPickup; public override void _Ready() { _autoPickup = LootTable.Any(x => x.AutoPickup); } public override bool Activate(ActivationType activationType = ActivationType.Toggle) { if (!MeetsRequirements()) return false; Collect(); return true; } public void AddItemsToInventory() { var failedItems = new Array(); foreach (var item in LootTable) { if (!InventoryManager.Instance.AddItem(item)) { failedItems.Add(item); } } if (failedItems.Count > 0) { foreach (var failedItem in failedItems) { var dup = this.Duplicate() as ItemPickup; this.AddSibling(dup); dup.LootTable = [failedItem]; } } // Delet This QueueFree(); } public void Collect() { AddItemsToInventory(); } public void SetSprite(Texture2D sprite) { var spriteNode = GetNodeOrNull("Sprite3D"); if (spriteNode is null) return; spriteNode.Texture = sprite; } }