Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / buff / effect / Eff_AreaTrigger.cs

using System.Collections.Generic;
using System.Text.Json;
using Godot;

[EffectFragment("AreaTrigger", 
    "触发附近地上的武器开火, " +
    "参数1为最大作用半径, ")]
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();
            }
        }
    }
}