public static void SteerFlight(SpiritWalkingPlayer myplayer, bool down, bool up, bool left, bool right)
        {
            bool isFinalDash = myplayer.FinalDashElapsed > 0;

            if (!isFinalDash)
            {
                if (down)
                {
                    SpiritWalkFlightLogic.ApplyFlightSpeedBrakeIf(myplayer);
                }
                else if (up)
                {
                    SpiritWalkFlightLogic.ApplyFlightSpeedBoostIf(myplayer);
                }
            }

            var   config  = SpiritWalkingConfig.Instance;
            float rotStep = config.Get <float>(nameof(config.SpiritWalkSteering));              //0.03f;

            if (left)
            {
                myplayer.IntendedFlightVelocity = myplayer.IntendedFlightVelocity.RotatedBy(-rotStep);
            }
            else if (right)
            {
                myplayer.IntendedFlightVelocity = myplayer.IntendedFlightVelocity.RotatedBy(rotStep);
            }
        }
示例#2
0
        public static void ActivateFlightBehavior(SpiritWalkingPlayer myplayer)
        {
            myplayer.IntendedFlightVelocity = SpiritWalkFlightLogic.DefaultFlightHeading;

            int projWho = SpiritWalkFlightLogic.CreateSpiritBall(myplayer);

            myplayer.FlightProjectile = Main.projectile[projWho];
        }
示例#3
0
        public static void ApplySpiritWalkOpenAirFriction(Player player)
        {
            var config = SpiritWalkingConfig.Instance;

            if (SpiritWalkingConfig.SpiritWalkUsesAnima)
            {
                SpiritWalkFlightLogic.ApplySpiritWalkOpenAirFriction_Anima(player);
            }
            else
            {
                SpiritWalkFlightLogic.ApplySpiritWalkOpenAirFriction_Mana(player);
            }
        }
示例#4
0
        ////////////////

        public static void ActivateIf(Player player, bool syncIfClient)
        {
            var config   = SpiritWalkingConfig.Instance;
            var myplayer = player.GetModPlayer <SpiritWalkingPlayer>();

            if (myplayer.IsSpiritWalking)
            {
                return;
            }

            if (SpiritWalkLogic.IsUponOpenAir(player))
            {
                if (!config.Get <bool>(nameof(config.OpenAirAllowsEngagingSpiritWalk)))
                {
                    Main.NewText("Cannot enage spirit walking upon open air.", Color.Yellow);

                    return;
                }
            }

            if (!SpiritWalkLogic.ApplyActivateCostIf(player))
            {
                return;
            }

            //

            SpiritWalkFlightLogic.ActivateFlightBehavior(myplayer);

            SpiritWalkLogic.ActivatePlayerForm(player);

            SpiritWalkFxLogic.ActivationFx(myplayer);

            SpiritWalkPelletsLogic.ActivationPreparations(myplayer);

            //

            myplayer.IsSpiritWalking = true;

            SpiritWalkingAPI.RunSpiritWalkActivationHooks(player, true);

            //

            if (syncIfClient)
            {
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    SpiritWalkStateProtocol.Broadcast(myplayer);
                }
            }
        }
        ////

        private static void UpdateSpeedChanges(SpiritWalkingPlayer myplayer)
        {
            if (myplayer.FlightBurstCooldown > 0)
            {
                myplayer.FlightBurstCooldown--;
            }

            if (myplayer.FlightBurstDuration > 1)
            {
                myplayer.FlightBurstDuration--;
            }
            else if (myplayer.FlightBurstDuration == 1)
            {
                myplayer.FlightBurstDuration = 0;

                SpiritWalkFlightLogic.RevertFlightSpeedScale(myplayer);
            }
        }
        ////////////////

        public static void UpdateWalk(SpiritWalkingPlayer myplayer)
        {
            SpiritWalkFlightLogic.UpdateSpeedChanges(myplayer);

            if (myplayer.FlightProjectile?.active != true)
            {
                int projWho = SpiritWalkFlightLogic.CreateSpiritBall(myplayer);
                myplayer.FlightProjectile = Main.projectile[projWho];
            }

            if (myplayer.FlightProjectile?.active == true)
            {
                myplayer.player.Center   = myplayer.FlightProjectile.Center;
                myplayer.player.velocity = default;
            }
            //float accel = 0.1f;
            //myplayer.player.velocity = Vector2.Lerp( myplayer.player.velocity, myplayer.FlightDirection, accel );
        }
        public static void ApplyFlightSpeedBoostIf(SpiritWalkingPlayer myplayer)
        {
            if (myplayer.FlightBurstCooldown > 0)
            {
                return;
            }

            var   config = SpiritWalkingConfig.Instance;
            float boost  = config.Get <float>(nameof(config.SpiritWalkBoostSpeedMultiplier));

            SpiritWalkFlightLogic.ApplyFlightSpeedScaleChange(myplayer, boost);

            Main.PlaySound(SoundID.Grass);

            SpiritWalkFxLogic.EmitSpiritParticles(
                position: myplayer.FlightProjectile.Center,
                direction: myplayer.FlightProjectile.velocity * -2f,
                particles: 20
                );
        }
        public static void DeactivateIf(Player player, bool syncIfClient)
        {
            var myplayer = player.GetModPlayer <SpiritWalkingPlayer>();

            if (!myplayer.IsSpiritWalking)
            {
                return;
            }

            //

            SpiritWalkLogic.DeactivatePlayerForm(player);

            SpiritWalkFlightLogic.DeactivateFlightBehavior(player);

            SpiritWalkFxLogic.DeactivationFx(player);

            //

            SpiritWalkPelletsLogic.FlushCache();

            //

            myplayer.IsSpiritWalking = false;

            SpiritWalkingAPI.RunSpiritWalkActivationHooks(player, false);

            //

            if (syncIfClient)
            {
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    SpiritWalkStateProtocol.Broadcast(myplayer);
                }
            }
        }
示例#9
0
        private static void UpdateForSpiritWalk(SpiritWalkingPlayer myplayer)
        {
            if (SpiritWalkLogic.IsUponOpenAir(myplayer.player))
            {
                SpiritWalkFlightLogic.ApplySpiritWalkOpenAirFriction(myplayer.player);
                SpiritWalkFxLogic.ApplySpiritWalkOpenAirFriction(myplayer.player);
            }

            //

            SpiritWalkLogic.UpdateSpiritWalkCost(myplayer.player);

            SpiritWalkLogic.RunFinalDashIf(myplayer);

            //

            myplayer.player.gravity = 0f;

            //

            SpiritWalkFlightLogic.UpdateWalk(myplayer);

            SpiritWalkPelletsLogic.UpdateWalk(myplayer);
        }