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