Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / prop / BuffProp.cs
@小李xl 小李xl on 20 Mar 2024 4 KB 解决编译错误
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text.Json;
  5. using Config;
  6. using Godot;
  7.  
  8. /// <summary>
  9. /// 通用被动道具实体类
  10. /// </summary>
  11. [Tool]
  12. public partial class BuffProp : PropActivity
  13. {
  14. /// <summary>
  15. /// 配置数据
  16. /// </summary>
  17. public ExcelConfig.BuffPropBase Attribute { get; private set; }
  18. //被动属性
  19. private readonly List<BuffFragment> _buffFragment = new List<BuffFragment>();
  20.  
  21. public override void OnInit()
  22. {
  23. base.OnInit();
  24. var buffAttribute = GetBuffAttribute(ActivityBase.Id);
  25. Attribute = buffAttribute;
  26. //初始化buff属性
  27. if (buffAttribute.Buff != null)
  28. {
  29. foreach (var keyValuePair in buffAttribute.Buff)
  30. {
  31. var buffInfo = PropFragmentRegister.BuffFragmentInfos[keyValuePair.Key];
  32. var item = keyValuePair.Value;
  33. var buff = (BuffFragment)AddComponent(buffInfo.Type);
  34. try
  35. {
  36. buff.InitParam(item);
  37. }
  38. catch (Exception e)
  39. {
  40. Debug.LogError($"初始化道具'{ActivityBase.Id}'参数时发生异常: {e.Message}\n{e.StackTrace}");
  41. }
  42. _buffFragment.Add(buff);
  43. }
  44. }
  45.  
  46. //显示纹理
  47. if (!string.IsNullOrEmpty(ActivityBase.Icon))
  48. {
  49. SetDefaultTexture(ResourceManager.LoadTexture2D(ActivityBase.Icon));
  50. }
  51. }
  52.  
  53. public override void OnPickUpItem()
  54. {
  55. foreach (var buffFragment in _buffFragment)
  56. {
  57. buffFragment.OnPickUpItem();
  58. }
  59. }
  60.  
  61. public override void OnRemoveItem()
  62. {
  63. foreach (var buffFragment in _buffFragment)
  64. {
  65. buffFragment.OnRemoveItem();
  66. }
  67. }
  68. /// <summary>
  69. /// 添加被动属性
  70. /// </summary>
  71. public void AddBuffFragment<T>(JsonElement[] arg) where T : BuffFragment, new()
  72. {
  73. var fragment = AddComponent<T>();
  74. _buffFragment.Add(fragment);
  75. try
  76. {
  77. fragment.InitParam(arg);
  78. }
  79. catch (Exception e)
  80. {
  81. Debug.LogError($"初始化道具'{ActivityBase.Id}'参数时发生异常: {e.Message}\n{e.StackTrace}");
  82. }
  83. if (Master != null)
  84. {
  85. fragment.OnPickUpItem();
  86. }
  87. }
  88.  
  89. public override void Interactive(ActivityObject master)
  90. {
  91. if (master is Player role)
  92. {
  93. Pickup();
  94. role.PickUpBuffProp(this);
  95. }
  96. }
  97.  
  98. public override CheckInteractiveResult CheckInteractive(ActivityObject master)
  99. {
  100. if (master is Player)
  101. {
  102. return new CheckInteractiveResult(this, true, CheckInteractiveResult.InteractiveType.PickUp);
  103. }
  104. return base.CheckInteractive(master);
  105. }
  106. private static bool _init = false;
  107. private static Dictionary<string, ExcelConfig.BuffPropBase> _buffAttributeMap =
  108. new Dictionary<string, ExcelConfig.BuffPropBase>();
  109.  
  110. /// <summary>
  111. /// 初始化 buff 属性数据
  112. /// </summary>
  113. public static void InitBuffAttribute()
  114. {
  115. if (_init)
  116. {
  117. return;
  118. }
  119.  
  120. _init = true;
  121. foreach (var buffAttr in ExcelConfig.BuffPropBase_List)
  122. {
  123. if (buffAttr.Activity != null)
  124. {
  125. if (!_buffAttributeMap.TryAdd(buffAttr.Activity.Id, buffAttr))
  126. {
  127. Debug.LogError("发现重复注册的 buff 属性: " + buffAttr.Id);
  128. }
  129. }
  130. }
  131. }
  132. /// <summary>
  133. /// 根据 ActivityBase.Id 获取对应 buff 的属性数据
  134. /// </summary>
  135. public static ExcelConfig.BuffPropBase GetBuffAttribute(string itemId)
  136. {
  137. if (itemId == null)
  138. {
  139. return null;
  140. }
  141. if (_buffAttributeMap.TryGetValue(itemId, out var attr))
  142. {
  143. return attr;
  144. }
  145.  
  146. throw new Exception($"buff'{itemId}'没有在 BuffPropBase 表中配置属性数据!");
  147. }
  148. }