95 lines
2.9 KiB
C#
95 lines
2.9 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|