Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / bullet / normal / Arrow.cs

using Godot;

/// <summary>
/// 弓箭
/// </summary>
[Tool]
public partial class Arrow : Bullet, IMountItem
{
    [Export, ExportFillNode]
    public AnimatedSprite2D HalfSprite { get; set; }

    public override void InitData(BulletData data, uint attackLayer)
    {
        base.InitData(data, attackLayer);
        SetEnableMovement(true);
        EnableVerticalMotion = false;
        DefaultLayer = RoomLayerEnum.NormalLayer;
        Debug.Log("IsFallOver: ", IsFallOver, ", ", CollisionLayer);
    }

    public override CheckInteractiveResult CheckInteractive(ActivityObject master)
    {
        if (master is Role role) //如果角色有弓箭武器, 则可以拾起地上的箭
        {
            var index = role.WeaponPack.FindIndex((weapon, index) =>
            {
                return weapon.ActivityBase.Id == Ids.Id_weapon0016;
            });
            if (index >= 0)
            {
                var weapon = role.WeaponPack.GetItem(index);
                weapon.SetResidueAmmo(weapon.ResidueAmmo + 1);
                ObjectPool.Reclaim(this);
            }
        }
        return base.CheckInteractive(master);
    }

    public override void OnPlayDisappearEffect()
    {
    }

    public override void OnMoveCollision(KinematicCollision2D collision)
    {
        CurrentBounce++;
        if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
        {
            //创建粒子特效
            OnPlayCollisionEffect(collision);
            ObjectPool.Reclaim(this);
        }
    }

    public override void OnCollisionTarget(IHurt hurt)
    {
        base.OnCollisionTarget(hurt);
        var activityObject = hurt.GetActivityObject();
        if (activityObject != null)
        {
            CallDeferred(nameof(OnBindTarget), activityObject);
        }
    }

    public override void LogicalFinish()
    {
        SetEnableMovement(false);
        var slideCollision = GetLastSlideCollision();
        if (slideCollision != null)
        {
            Position -= slideCollision.GetTravel();
        }
    }

    //将弓箭挂载到目标物体上
    private void OnBindTarget(ActivityObject activityObject)
    {
        if (activityObject.IsDestroyed)
        {
            OnUnmount(activityObject);
        }
        else
        {
            Altitude = Mathf.Max(1, -activityObject.ToLocal(GlobalPosition).Y);
            activityObject.AddMountObject(this);
        }
    }

    public void OnMount(ActivityObject target)
    {
        Reparent(target);
        AnimatedSprite.Play(AnimatorNames.HalfEnd);
        HalfSprite.Visible = true;
    }

    public void OnUnmount(ActivityObject target)
    {
        SetOriginCollisionLayerValue(PhysicsLayer.Prop, true);
        AnimatedSprite.Play(AnimatorNames.Default);
        HalfSprite.Visible = false;
        SetEnableMovement(true);
        EnableVerticalMotion = true;
        MoveController.ClearForce();
        MoveController.BasisVelocity = Vector2.Zero;
        ShadowOffset = new Vector2(0, 1);
        Throw(Mathf.Max(3, Altitude), Utils.Random.RandomRangeInt(50, 80), Vector2.Zero, Utils.Random.RandomRangeInt(-30, 30));
        InheritVelocity(target);
    }

    public override void OnLeavePool()
    {
        SetOriginCollisionLayerValue(PhysicsLayer.Prop, false);
        if (Utils.CollisionMaskWithLayer(CollisionLayer, PhysicsLayer.Prop))
        {
            CollisionLayer ^= PhysicsLayer.Prop;
        }
        base.OnLeavePool();
    }
}