Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / prop / BuffProp.cs

using System;
using System.Collections.Generic;
using System.Text.Json;
using Config;
using Godot;

/// <summary>
/// 通用被动道具实体类
/// </summary>
[Tool]
public partial class BuffProp : PropActivity
{
    /// <summary>
    /// 配置数据
    /// </summary>
    public ExcelConfig.BuffPropBase Attribute { get; private set; }
    
    //被动属性
    private readonly List<BuffFragment> _buffFragment = new List<BuffFragment>();

    public override void OnInit()
    {
        base.OnInit();
        var buffAttribute = GetBuffAttribute(ActivityBase.Id);
        Attribute = buffAttribute;
        //初始化buff属性
        if (buffAttribute.Buff != null)
        {
            foreach (var keyValuePair in buffAttribute.Buff)
            {
                var buffInfo = PropFragmentRegister.BuffFragmentInfos[keyValuePair.Key];
                var item = keyValuePair.Value;
                var buff = (BuffFragment)AddComponent(buffInfo.Type);
                try
                {
                    buff.InitParam(item);
                }
                catch (Exception e)
                {
                    Debug.LogError($"初始化道具'{ActivityBase.Id}'参数时发生异常: {e.Message}\n{e.StackTrace}");
                }
                _buffFragment.Add(buff);
            }
        }

        //显示纹理
        if (!string.IsNullOrEmpty(ActivityBase.Icon))
        {
            SetDefaultTexture(ResourceManager.LoadTexture2D(ActivityBase.Icon));
        }
    }

    public override void OnPickUpItem()
    {
        foreach (var buffFragment in _buffFragment)
        {
            buffFragment.OnPickUpItem();
        }
    }

    public override void OnRemoveItem()
    {
        foreach (var buffFragment in _buffFragment)
        {
            buffFragment.OnRemoveItem();
        }
    }
    
    /// <summary>
    /// 添加被动属性
    /// </summary>
    public void AddBuffFragment<T>(JsonElement[] arg) where T : BuffFragment, new()
    {
        var fragment = AddComponent<T>();
        _buffFragment.Add(fragment);
        try
        {
            fragment.InitParam(arg);
        }
        catch (Exception e)
        {
            Debug.LogError($"初始化道具'{ActivityBase.Id}'参数时发生异常: {e.Message}\n{e.StackTrace}");
        }
        if (Master != null)
        {
            fragment.OnPickUpItem();
        }
    }

    public override void Interactive(ActivityObject master)
    {
        if (master is Role role)
        {
            Pickup();
            role.PickUpBuffProp(this);
        }
    }

    public override CheckInteractiveResult CheckInteractive(ActivityObject master)
    {
        if (master is Role)
        {
            return new CheckInteractiveResult(this, true, CheckInteractiveResult.InteractiveType.PickUp);
        }
        return base.CheckInteractive(master);
    }
    
    
    private static bool _init = false;
    private static Dictionary<string, ExcelConfig.BuffPropBase> _buffAttributeMap =
        new Dictionary<string, ExcelConfig.BuffPropBase>();

    /// <summary>
    /// 初始化 buff 属性数据
    /// </summary>
    public static void InitBuffAttribute()
    {
        if (_init)
        {
            return;
        }

        _init = true;
        foreach (var buffAttr in ExcelConfig.BuffPropBase_List)
        {
            if (buffAttr.Activity != null)
            {
                if (!_buffAttributeMap.TryAdd(buffAttr.Activity.Id, buffAttr))
                {
                    Debug.LogError("发现重复注册的 buff 属性: " + buffAttr.Id);
                }
            }
        }
    }
    
    /// <summary>
    /// 根据 ActivityBase.Id 获取对应 buff 的属性数据
    /// </summary>
    public static ExcelConfig.BuffPropBase GetBuffAttribute(string itemId)
    {
        if (itemId == null)
        {
            return null;
        }
        if (_buffAttributeMap.TryGetValue(itemId, out var attr))
        {
            return attr;
        }

        throw new Exception($"buff'{itemId}'没有在 BuffPropBase 表中配置属性数据!");
    }
}