public void Teleport(Player player)
        {
            Point desiredPos;

            Point FindRandomPos() => (player.Center + new Vector2((Main.rand.NextBool() ? -1 : 1) * Main.rand.NextFloat(200, 300), Main.rand.NextFloat(-100, 0))).ToTileCoordinates();

            desiredPos = FindRandomPos();
            while (desiredPos.X < 0 || desiredPos.Y < 0 || desiredPos.X > Main.maxTilesX || desiredPos.Y > Main.maxTilesY)             //out of bounds bad
            {
                desiredPos = FindRandomPos();
            }

            int numTries = 0;
            int maxTries = 1000;

            while (numTries < maxTries && ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(desiredPos.X, desiredPos.Y, 1, 3)))             //find a random point not within tiles
            {
                numTries++;
                desiredPos = FindRandomPos();
                while (desiredPos.X < 0 || desiredPos.Y < 0 || desiredPos.X > Main.maxTilesX || desiredPos.Y > Main.maxTilesY)                 //out of bounds still bad
                {
                    desiredPos = FindRandomPos();
                }
            }

            while (desiredPos.Y < Main.maxTilesY && !ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(desiredPos.X, desiredPos.Y + 4, 1, 0)))
            {
                desiredPos.Y++;
            }

            npc.position  = desiredPos.ToWorldCoordinates();
            npc.netUpdate = true;
        }
예제 #2
0
        public bool SetTilePos()
        {
            Point tilePos = projectile.Center.ToTileCoordinates();

            int tilesMoved     = 0;
            int maxTilesToMove = 15;

            while (tilePos.Y < 0 && ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(tilePos.X, tilePos.Y, 0, 0)) && tilesMoved < maxTilesToMove)
            {
                tilesMoved++;
                tilePos.Y--;
            }

            while (tilePos.Y < Main.maxTilesY && !ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(tilePos.X, tilePos.Y + 1, 1, 0)) && tilesMoved < maxTilesToMove)
            {
                tilesMoved++;
                tilePos.Y++;
            }
            if (tilesMoved >= maxTilesToMove)
            {
                return(false);
            }

            tilePos.Y--;
            projectile.position.Y = tilePos.ToWorldCoordinates().Y - 8;
            return(true);
        }
예제 #3
0
        // Token: 0x060002E6 RID: 742 RVA: 0x00011E14 File Offset: 0x00010014
        public override bool Combo(TargetManager targetManager, ComboModeMenu comboModeMenu)
        {
            AbilityHelper abilityHelper = new AbilityHelper(targetManager, comboModeMenu, this);
            Unit9         target        = targetManager.Target;

            if (abilityHelper.UseAbility(this.hex, true))
            {
                return(true);
            }
            if (abilityHelper.CanBeCasted(this.vortex, true, true, true, true) && (target.CanBecomeMagicImmune || target.CanBecomeInvisible) && abilityHelper.UseAbility(this.vortex, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.bloodthorn, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.orchid, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.nullifier, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.dagon, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.shiva, true))
            {
                return(true);
            }
            bool flag = base.Owner.CanAttack(target, 25f) && base.Owner.HasModifier("modifier_storm_spirit_overload");
            TrackingProjectile trackingProjectile = ObjectManager.TrackingProjectiles.FirstOrDefault(delegate(TrackingProjectile x)
            {
                Entity source             = x.Source;
                EntityHandle?entityHandle = (source != null) ? new EntityHandle?(source.Handle) : null;
                if (((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) == this.Handle)
                {
                    Entity target = x.Target;
                    entityHandle  = ((target != null) ? new EntityHandle?(target.Handle) : null);
                    if (((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) == target.Handle)
                    {
                        return(ProjectileExtensions.IsAutoAttackProjectile(x));
                    }
                }
                return(false);
            });

            if (flag)
            {
                if (trackingProjectile == null)
                {
                    return(false);
                }
                int num = (target.IsMoving && target.GetAngle(trackingProjectile.Position, false) > 1.5f) ? 250 : 450;
                if (trackingProjectile.Position.Distance2D(trackingProjectile.TargetPosition, false) > (float)num)
                {
                    return(false);
                }
            }
            else
            {
                if (trackingProjectile != null)
                {
                    Ability9 ability = base.Owner.Abilities.FirstOrDefault((Ability9 x) => x.Id == AbilityId.storm_spirit_overload);
                    if (ability != null)
                    {
                        int   attackDamage = base.Owner.GetAttackDamage(target, 0, 0f);
                        int   damage       = ability.GetDamage(target);
                        float health       = target.Health;
                        if ((float)attackDamage < health && (float)(attackDamage + damage) > health)
                        {
                            if (abilityHelper.CanBeCasted(this.remnant, false, false, true, true) && abilityHelper.ForceUseAbility(this.remnant, true, true))
                            {
                                return(true);
                            }
                            if (abilityHelper.CanBeCasted(this.ball, false, false, true, true) && trackingProjectile.Position.Distance2D(trackingProjectile.TargetPosition, false) / (float)trackingProjectile.Speed > this.ball.Ability.CastPoint && abilityHelper.ForceUseAbility(this.ball, true, true))
                            {
                                return(true);
                            }
                        }
                    }
                }
                if (abilityHelper.UseAbility(this.vortex, true))
                {
                    base.ComboSleeper.ExtendSleep(0.1f);
                    BallLightning ballLightning = this.ball;
                    if (ballLightning != null)
                    {
                        ballLightning.Sleeper.Sleep(1f);
                    }
                    return(true);
                }
                if (abilityHelper.UseAbility(this.remnant, true))
                {
                    base.ComboSleeper.ExtendSleep(0.1f);
                    BallLightning ballLightning2 = this.ball;
                    if (ballLightning2 != null)
                    {
                        ballLightning2.Sleeper.Sleep(1f);
                    }
                    return(true);
                }
            }
            return(abilityHelper.UseAbility(this.ball, true));
        }
예제 #4
0
        public override void IdleMovement(Player player)
        {
            AiTimer++;
            _featherShotFrameTime = 0;
            if (AiState != STATE_HOVERTORESTSPOT && AiState != STATE_RESTING)
            {
                AiTimer = 0;
                AiState = STATE_HOVERTORESTSPOT;
            }

            projectile.direction = projectile.spriteDirection = (projectile.Center.X < player.MountedCenter.X) ? -1 : 1;
            Vector2 targetCenter = player.MountedCenter - new Vector2(50 * (IndexOfType + 1) * player.direction, 0);
            //take the base desired homing position, and try to find the lowest solid tile for the minion to rest at from it
            Point tilepos          = targetCenter.ToTileCoordinates();
            int   tilesfrombase    = 0;
            int   maxtilesfrombase = 15;
            bool  canstartrest     = true;        //dont start resting if rest position is too far from the base desired position

            int startX = tilepos.X + ((projectile.direction > 0) ? -1 : 0);

            while (ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(startX, tilepos.Y, 1, 1)))             //move up until not inside a tile
            {
                tilepos.Y--;
                if (++tilesfrombase >= maxtilesfrombase)
                {
                    canstartrest = false;
                    break;
                }
            }
            while (!ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(startX, tilepos.Y + 1, 1, 1)))            //move down until just above a tile
            {
                tilepos.Y++;
                if (++tilesfrombase >= maxtilesfrombase)
                {
                    canstartrest = false;
                    break;
                }
            }

            if (AiState == STATE_RESTING || AiState == STATE_HOVERTORESTSPOT && canstartrest)             //if not too far, or too far but already resting, set the desired position to the lowest non solid tile
            {
                targetCenter = tilepos.ToWorldCoordinates();
            }

            switch (AiState)
            {
            case STATE_HOVERTORESTSPOT:
                projectile.tileCollide = false;
                projectile.AccelFlyingMovement(targetCenter, 0.15f, 0.1f, 15);
                //check if close enough to and above the rest spot, and not inside a tile, if so, start resting
                if (projectile.Distance(targetCenter) < 10 && projectile.Center.Y < targetCenter.Y && canstartrest && !ProjectileExtensions.CheckSolidTilesAndPlatforms(new Rectangle(startX, tilepos.Y, 1, 1)) && AiTimer > 30)
                {
                    AiTimer = 0;
                    AiState = STATE_RESTING;
                }
                break;

            case STATE_RESTING:
                projectile.tileCollide = true;
                projectile.velocity.X *= 0.7f;
                projectile.velocity.Y += 0.4f;
                //if too far from the new resting position, start flying to it
                if (projectile.Distance(targetCenter) > 150)
                {
                    AiState = STATE_HOVERTORESTSPOT;
                    AiTimer = 0;
                    projectile.velocity.Y = -5;
                }
                break;
            }

            if (projectile.Distance(targetCenter) > 1800)
            {
                projectile.Center    = targetCenter;
                projectile.netUpdate = true;
            }
        }