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; }
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); }
// 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)); }
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; } }