Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / buff / effect / Eff_AreaTrigger.cs
@小李xl 小李xl on 22 Mar 2024 2 KB 道具逻辑片段更新参数描述
  1.  
  2. using System.Collections.Generic;
  3. using System.Text.Json;
  4. using Godot;
  5.  
  6. [EffectFragment(
  7. "AreaTrigger",
  8. "触发附近地上的武器开火, ",
  9. Arg1 = "(int)最大作用半径"
  10. )]
  11. public class Eff_AreaTrigger : EffectFragment
  12. {
  13. private Prop5003Area _areaNode;
  14. private List<Weapon> _weaponList = new List<Weapon>();
  15. private float _time = 0;
  16. private int _radius = 250;
  17.  
  18. public override void InitParam(JsonElement[] arg)
  19. {
  20. _radius = arg[0].GetInt32();
  21. }
  22.  
  23. public override void Ready()
  24. {
  25. _areaNode = ResourceManager.LoadAndInstantiate<Prop5003Area>(ResourcePath.prefab_prop_activeComp_Prop5003_Area_tscn);
  26. _areaNode.BodyEntered += OnBodyEntered;
  27. _areaNode.BodyExited += OnBodyExited;
  28. AddChild(_areaNode);
  29. }
  30.  
  31. public override void OnDestroy()
  32. {
  33. _areaNode.QueueFree();
  34. }
  35.  
  36. public override void OnUse()
  37. {
  38. _areaNode.PlayEffect(0, _radius, Master.Attribute.Duration);
  39. }
  40.  
  41. public override void OnUsingFinish()
  42. {
  43. foreach (var weapon in _weaponList)
  44. {
  45. weapon.ClearTriggerRole();
  46. }
  47. _weaponList.Clear();
  48. }
  49.  
  50. public override void Process(float delta)
  51. {
  52. if (!Master.IsUsing)
  53. {
  54. _time = 0;
  55. return;
  56. }
  57. _time += delta;
  58. var flag = false;
  59. if (_time >= 0.5f)
  60. {
  61. flag = true;
  62. _time %= 0.5f;
  63. }
  64. for (var i = 0; i < _weaponList.Count; i++)
  65. {
  66. var weapon = _weaponList[i];
  67. if (weapon.Master != null)
  68. {
  69. _weaponList.RemoveAt(i--);
  70. weapon.ClearTriggerRole();
  71. continue;
  72. }
  73.  
  74. if (flag)
  75. {
  76. var weaponBase = weapon.GetUseAttribute(Role);
  77. if (!weaponBase.ContinuousShoot)
  78. {
  79. if (!weaponBase.LooseShoot)
  80. {
  81. continue;
  82. }
  83. else if (!weapon.IsCharging || weapon.IsChargeFinish())
  84. {
  85. continue;
  86. }
  87. }
  88. }
  89. weapon.Trigger(Role, false);
  90. }
  91. }
  92.  
  93. public override void OnPickUpItem()
  94. {
  95. RemoveChild(_areaNode);
  96. Role.AnimatedSprite.AddChild(_areaNode);
  97. }
  98.  
  99. public override void OnRemoveItem()
  100. {
  101. Role.AnimatedSprite.RemoveChild(_areaNode);
  102. AddChild(_areaNode);
  103. }
  104.  
  105. private void OnBodyEntered(Node2D node)
  106. {
  107. if (node is Weapon weapon && weapon.Master == null)
  108. {
  109. if (!_weaponList.Contains(weapon))
  110. {
  111. _weaponList.Add(weapon);
  112. }
  113. }
  114. }
  115. private void OnBodyExited(Node2D node)
  116. {
  117. if (node is Weapon weapon && weapon.Master == null)
  118. {
  119. if (_weaponList.Remove(weapon))
  120. {
  121. weapon.ClearTriggerRole();
  122. }
  123. }
  124. }
  125. }