using System;
using Configs;
using Data;
using Item;
using Managers;
using UnityEngine;
// 添加 System 命名空间以使用 Action
namespace Entity
{
public class Character : LivingEntity
{
public override Attributes defAttributes
{
get
{
var def = base.defAttributes;
var weaponDef = GetCurrentWeapon()?.Attributes;
if (weaponDef != null)
{
weaponDef.health = def.health;
weaponDef.moveSpeed = def.moveSpeed;
return weaponDef;
}
return def;
}
}
private int _currentSelected; // 私有字段用于存储实际值
///
/// 当前选中的背包槽位索引。
/// 当此值被设置时,如果与旧值不同,将触发 OnCurrentSelectedChanged 事件。
///
public int CurrentSelected
{
get => _currentSelected;
set
{
var maxIndex = PlayerInventory != null && PlayerInventory.Capacity > 0 ? PlayerInventory.Capacity - 1 : 0;
var clampedValue = Mathf.Clamp(value, 0, maxIndex);
_currentSelected = clampedValue;
InitWeaponAnimator();
}
}
public Inventory PlayerInventory { get; private set; }
public InventorySlot Coin{get;private set;}
public override void Init(EntityDef entityDefine)
{
PlayerInventory = new Inventory(this, 3);
var coinItem = ItemResourceManager.Instance.GetItem(ConfigManager.Instance.GetValue("CoinItem"));
if(!KeyValueArchiveManager.Instance.HasKey("coinCount"))
{
KeyValueArchiveManager.Instance.Set("coinCount", 0);
}
Coin = Program.Instance.OutsidePlayDimension == null
? new InventorySlot(coinItem, Program.Instance.CoinCount)
: new InventorySlot(coinItem, 0);
PlayerInventory.OnInventoryChanged += InventoryChange;
CurrentSelected = 0;
base.Init(entityDefine);
}
///
/// 尝试将指定物品添加到角色的背包中。
///
/// 要尝试添加的物品资源。
/// 要尝试添加的数量。
///
/// 未成功添加到背包的物品数量。
/// 如果返回0,表示所有物品都成功添加;
/// 如果返回quantity,表示未能添加任何物品;
/// 如果返回一个介于0和quantity之间的值,表示部分物品被添加。
///
public int TryPickupItem(ItemResource itemResource, int quantity)
{
if (PlayerInventory == null)
{
Debug.LogError($"Character '{name}' inventory is not initialized. Cannot pickup item.");
return quantity; // 如果背包未初始化,则视为未能添加任何物品
}
var remainingQuantity = PlayerInventory.AddItem(itemResource, quantity);
return remainingQuantity;
}
public override WeaponResource GetCurrentWeapon()
{
var currentSelectItem = PlayerInventory.GetSlot(CurrentSelected);
return currentSelectItem?.Item as WeaponResource;
}
private void InventoryChange()
{
InitWeaponAnimator();
}
}
}