Files
vampire-like/Assets/GameMain/Scripts/Runtime/Components/BackpackComponent.cs
T

104 lines
2.7 KiB
C#

using System.Collections.Generic;
using SepCore.Definition;
using SepCore.Entity;
using UnityEngine;
namespace SepCore.Components
{
public class BackpackComponent : MonoBehaviour
{
/// <summary>
/// 玩家类引用。
/// </summary>
private Player _player;
/// <summary>
/// 武器列表。
/// </summary>
private List<WeaponBase> _weapons;
/// <summary>
/// 道具列表。
/// </summary>
private List<PropItem> _props;
/// <summary>
/// 玩家状态组件引用,用于道具效果的应用。
/// </summary>
private StatComponent _statComponent;
/// <summary>
/// 武器装备槽,在 Editor 中进行配置,表示武器在世界中的显示位置。
/// </summary>
[SerializeField] private Transform[] _weaponSlots;
public IReadOnlyList<WeaponBase> Weapons => _weapons;
public IReadOnlyList<PropItem> Props => _props;
public int WeaponCapacity => GameEntry.Luban.Global.WeaponCapacity;
public void OnInit(Player player)
{
_player = player;
_weapons = new List<WeaponBase>(WeaponCapacity);
_props = new List<PropItem>();
_statComponent = GetComponent<StatComponent>();
}
public void OnReset()
{
_weapons.Clear();
_props.Clear();
}
public bool AttachWeapon(WeaponBase weapon)
{
if (_weapons.Count == WeaponCapacity) return false;
GameEntry.Entity.AttachEntity(weapon.Id, _player.Id, _weaponSlots[_weapons.Count]);
_weapons.Add(weapon);
weapon.SetEnabled(true);
return true;
}
public bool DetachWeapon(WeaponBase weapon)
{
bool result = _weapons.Remove(weapon);
if (result)
{
GameEntry.Entity.DetachEntity(weapon.Id, _player.Id);
}
return result;
}
public bool AttachProp(PropItem prop)
{
_props.Add(prop);
foreach (var modifier in prop.Modifiers)
{
_statComponent.AddModifier(modifier);
}
return true;
}
public bool DetachProp(PropItem prop)
{
_props.Remove(prop);
foreach (var modifier in prop.Modifiers)
{
_statComponent.RemoveModifier(modifier);
}
return true;
}
public void SetWeaponState(bool state)
{
foreach (var weapon in _weapons)
{
weapon.SetEnabled(state);
}
}
}
}