cirnogodot/Scripts/Interactables/ItemPickup.cs

110 lines
2.8 KiB
C#
Raw Normal View History

2025-03-28 15:38:55 +01:00
using System.Linq;
using Cirno.Scripts.Resources;
2025-01-31 10:06:27 +01:00
using Godot;
using Godot.Collections;
2025-03-28 19:47:10 +01:00
using GTweens.Builders;
using GTweensGodot.Extensions;
2025-01-31 10:06:27 +01:00
namespace Cirno.Scripts.Interactables;
public partial class ItemPickup : Interactable
{
2025-03-23 16:39:47 +01:00
[Export] public Array<LootItem> LootTable = [];
2025-03-28 19:47:10 +01:00
2025-03-28 15:38:55 +01:00
private bool _autoPickup = false;
2025-03-28 19:47:10 +01:00
public bool AutoPickup => _autoPickup;
public ItemDrop Parent { get; set; } = null;
2025-03-28 15:38:55 +01:00
public override void _Ready()
{
_autoPickup = LootTable.Any(x => x.AutoPickup);
// if (LootTable.Any(x => x.AutoPickup))
// {
// _autoPickup = true;
// }
//this.AreaEntered += _on_area_entered;
}
2025-03-28 19:47:10 +01:00
2025-03-09 21:58:25 +01:00
public override bool Activate(ActivationType activationType = ActivationType.Toggle)
2025-01-31 10:06:27 +01:00
{
GD.Print("Attempting to Pickup Item");
2025-03-28 19:47:10 +01:00
2025-01-31 10:06:27 +01:00
if (!MeetsRequirements()) return false;
2025-03-28 19:47:10 +01:00
Collect();
2025-03-28 15:38:55 +01:00
return true;
}
2025-03-28 19:47:10 +01:00
public void AddItemsToInventory()
2025-03-28 15:38:55 +01:00
{
var failedItems = new Array<LootItem>();
2025-01-31 10:06:27 +01:00
foreach (var item in LootTable)
{
2025-03-28 15:38:55 +01:00
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];
}
2025-01-31 10:06:27 +01:00
}
2025-03-28 19:47:10 +01:00
2025-01-31 10:06:27 +01:00
// Delet This
2025-03-28 19:47:10 +01:00
2025-01-31 10:06:27 +01:00
QueueFree();
2025-03-28 15:38:55 +01:00
}
2025-03-28 19:47:10 +01:00
public void Collect()
2025-03-28 15:38:55 +01:00
{
2025-03-28 19:47:10 +01:00
AddItemsToInventory();
// if (Owner is ItemDrop dropWrapper)
// {
// // move the wrapper
// var tween = GTweenSequenceBuilder.New()
// .Append(dropWrapper.TweenGlobalPosition(GameManager.Instance.PlayerPosition.Value, 0.5f))
// .AppendCallback(() =>
// {
// AddItemsToInventory();
// Owner.QueueFree();
// })
// .Build();
// }
// else
// {
// // move this
//
// }
}
2025-03-28 15:38:55 +01:00
2025-03-28 19:47:10 +01:00
private void _on_area_entered(Area2D area)
{
// if (!_autoPickup) return;
// if (area is InteractionController interactionController)
// {
// //Check if items are not maxed to avoid a looping autopickup situation
// var canAdd = LootTable.Aggregate(false, (current, item) => current || InventoryManager.Instance.CanAddItem(item.ItemKey));
//
// if (canAdd)
// {
// AddItemsToInventory();
// }
// }
2025-01-31 10:06:27 +01:00
}
2025-05-01 10:04:15 +02:00
public void SetSprite(Texture2D sprite)
{
var spriteNode = GetNodeOrNull<Sprite2D>("Sprite2D");
if (spriteNode is null) return;
spriteNode.Texture = sprite;
}
2025-01-31 10:06:27 +01:00
}