Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / buff / effect / Eff_AreaTrigger.cs
@小李xl 小李xl on 19 Mar 2024 1 KB 制作新道具
  1.  
  2. using System.Collections.Generic;
  3. using Godot;
  4.  
  5. [EffectFragment("AreaTrigger", "")]
  6. public class Eff_AreaTrigger : EffectFragment
  7. {
  8. private Prop5003Area _areaNode;
  9. private List<Weapon> _weaponList = new List<Weapon>();
  10. public override void Ready()
  11. {
  12. _areaNode = ResourceManager.LoadAndInstantiate<Prop5003Area>(ResourcePath.prefab_prop_activeComp_Prop5003_Area_tscn);
  13. _areaNode.BodyEntered += OnBodyEntered;
  14. _areaNode.BodyExited += OnBodyExited;
  15. AddChild(_areaNode);
  16. }
  17.  
  18. public override void OnDestroy()
  19. {
  20. _areaNode.QueueFree();
  21. }
  22.  
  23. public override void OnUse()
  24. {
  25. _areaNode.PlayEffect(0, 250, 6);
  26. }
  27.  
  28. public override void Process(float delta)
  29. {
  30. for (var i = 0; i < _weaponList.Count; i++)
  31. {
  32. var weapon = _weaponList[i];
  33. if (weapon.Master != null)
  34. {
  35. _weaponList.RemoveAt(i--);
  36. continue;
  37. }
  38. weapon.Trigger(Role, false);
  39. }
  40. }
  41.  
  42. public override void OnPickUpItem()
  43. {
  44. RemoveChild(_areaNode);
  45. Role.AnimatedSprite.AddChild(_areaNode);
  46. }
  47.  
  48. public override void OnRemoveItem()
  49. {
  50. Role.AnimatedSprite.RemoveChild(_areaNode);
  51. AddChild(_areaNode);
  52. }
  53.  
  54. private void OnBodyEntered(Node2D node)
  55. {
  56. if (node is Weapon weapon && weapon.Master == null)
  57. {
  58. if (!_weaponList.Contains(weapon))
  59. {
  60. _weaponList.Add(weapon);
  61. }
  62. }
  63. }
  64. private void OnBodyExited(Node2D node)
  65. {
  66. if (node is Weapon weapon && weapon.Master == null)
  67. {
  68. _weaponList.Remove(weapon);
  69. }
  70. }
  71. }