BITFALL/Assets/Artists/Scripts/Entity/Inventory/PlayerEquipContainer.cs

95 lines
2.9 KiB
C#
Raw Normal View History

2023-06-08 14:09:50 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BITKit;
using BITKit.Entities;
using static UnityEditor.Progress;
using Google.Apis.Sheets.v4.Data;
namespace BITFALL
{
public interface IPlayerEquipCallback
{
void OnEquip(IEquipmentSlot slot,IBasicItem item);
void DeEquip(IEquipmentSlot slot, IBasicItem item);
}
public interface IPlayerEquipContainer {
bool TryDeEquip(IEquipmentSlot slot);
}
/// <summary>
/// 玩家装备容器
/// 支持,护甲,头盔和背包等
/// </summary>
public class PlayerEquipContainer : EntityComponent, IExcutor<IBasicItem>, IPlayerEquipContainer
{
Dictionary<IEquipmentSlot, IBasicItem> dictionary = new();
IBasicItemContainer inventory;
public override void Initialize(IEntity entity)
{
base.Initialize(entity);
entity.Set<IPlayerEquipContainer>(this);
entity.RegisterCallback<IExcutor<IBasicItem>>(this);
}
public override void OnStart()
{
base.OnStart();
inventory = entity.Get<IBasicItemContainer>();
}
public bool TryDeEquip(IEquipmentSlot slot)
{
if (dictionary.TryGetValue(slot, out var equipable))
{
if (inventory.Add(equipable))
{
DeEquip(slot, equipable);
}
}
return false;
}
bool Equip(IEquipmentSlot slot, IBasicItem item)
{
dictionary.Add(slot, item);
foreach (var x in entity.GetCallbacks<IPlayerEquipCallback>())
{
x.OnEquip(slot, item);
}
return true;
}
bool DeEquip(IEquipmentSlot slot, IBasicItem item)
{
dictionary.Remove(slot);
foreach (var x in entity.GetCallbacks<IPlayerEquipCallback>())
{
x.DeEquip(slot, item);
}
return true;
}
public bool TryExcute(IBasicItem value)
{
var asset = value.GetAssetable();
///尝试获取可装备信息
if (asset.TryGetProperty<EquipmentAsSlot>(out var equipable))
{
///已装备物品
if (dictionary.TryGetValue(equipable.slot, out var equipedItem))
{
///尝试将装配放回背包
if (inventory.Add(equipedItem))
{
///移除已装备物品
DeEquip(equipable.slot, value);
}
}
///从库存中移除物品
if (inventory.Remove(value))
{
///装配物品
Equip(equipable.slot, value);
}
}
return false;
}
}
}