- using System.Collections.Generic;
- using System.Text.Json;
- using Godot;
- [EffectFragment(
- "AreaTrigger",
- "触发附近地上的武器开火, ",
- Arg1 = "(int)最大作用半径"
- )]
- public class Eff_AreaTrigger : EffectFragment
- {
- private Prop5003Area _areaNode;
- private List<Weapon> _weaponList = new List<Weapon>();
- private float _time = 0;
- private int _radius = 250;
- public override void InitParam(JsonElement[] arg)
- {
- _radius = arg[0].GetInt32();
- }
- public override void Ready()
- {
- _areaNode = ResourceManager.LoadAndInstantiate<Prop5003Area>(ResourcePath.prefab_prop_activeComp_Prop5003_Area_tscn);
- _areaNode.BodyEntered += OnBodyEntered;
- _areaNode.BodyExited += OnBodyExited;
- AddChild(_areaNode);
- }
- public override void OnDestroy()
- {
- _areaNode.QueueFree();
- }
- public override void OnUse()
- {
- _areaNode.PlayEffect(0, _radius, Master.Attribute.Duration);
- }
- public override void OnUsingFinish()
- {
- foreach (var weapon in _weaponList)
- {
- weapon.ClearTriggerRole();
- }
- _weaponList.Clear();
- }
- public override void Process(float delta)
- {
- if (!Master.IsUsing)
- {
- _time = 0;
- return;
- }
- _time += delta;
- var flag = false;
- if (_time >= 0.5f)
- {
- flag = true;
- _time %= 0.5f;
- }
- for (var i = 0; i < _weaponList.Count; i++)
- {
- var weapon = _weaponList[i];
- if (weapon.Master != null)
- {
- _weaponList.RemoveAt(i--);
- weapon.ClearTriggerRole();
- continue;
- }
- if (flag)
- {
- var weaponBase = weapon.GetUseAttribute(Role);
- if (!weaponBase.ContinuousShoot)
- {
- if (!weaponBase.LooseShoot)
- {
- continue;
- }
- else if (!weapon.IsCharging || weapon.IsChargeFinish())
- {
- continue;
- }
- }
- }
- weapon.Trigger(Role, false);
- }
- }
- public override void OnPickUpItem()
- {
- RemoveChild(_areaNode);
- Role.AnimatedSprite.AddChild(_areaNode);
- }
- public override void OnRemoveItem()
- {
- Role.AnimatedSprite.RemoveChild(_areaNode);
- AddChild(_areaNode);
- }
- private void OnBodyEntered(Node2D node)
- {
- if (node is Weapon weapon && weapon.Master == null)
- {
- if (!_weaponList.Contains(weapon))
- {
- _weaponList.Add(weapon);
- }
- }
- }
- private void OnBodyExited(Node2D node)
- {
- if (node is Weapon weapon && weapon.Master == null)
- {
- if (_weaponList.Remove(weapon))
- {
- weapon.ClearTriggerRole();
- }
- }
- }
- }