Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ CheckForGoodTeleportationSpot()

Vector2 Terraria.Player.CheckForGoodTeleportationSpot ( ref bool canSpawn,
int teleportStartX,
int teleportRangeX,
int teleportStartY,
int teleportRangeY,
RandomTeleportationAttemptSettings settings )
inline

Definition at line 52685 of file Player.cs.

52686 {
52687 int num = 0;
52688 int num2 = 0;
52689 int num3 = 0;
52690 int num4 = width;
52691 Vector2 vector = new Vector2(num2, num3) * 16f + new Vector2(-num4 / 2 + 8, -height);
52692 while (!canSpawn && num < settings.attemptsBeforeGivingUp)
52693 {
52694 num++;
52695 num2 = teleportStartX + Main.rand.Next(teleportRangeX);
52696 num3 = teleportStartY + Main.rand.Next(teleportRangeY);
52697 int num5 = 5;
52698 num2 = (int)MathHelper.Clamp(num2, num5, Main.maxTilesX - num5);
52699 num3 = (int)MathHelper.Clamp(num3, num5, Main.maxTilesY - num5);
52700 vector = new Vector2(num2, num3) * 16f + new Vector2(-num4 / 2 + 8, -height);
52701 if (Collision.SolidCollision(vector, num4, height))
52702 {
52703 continue;
52704 }
52705 if (Main.tile[num2, num3] == null)
52706 {
52707 Main.tile[num2, num3] = new Tile();
52708 }
52709 if ((settings.avoidWalls && Main.tile[num2, num3].wall > 0) || (Main.tile[num2, num3].wall == 87 && (double)num3 > Main.worldSurface && !NPC.downedPlantBoss) || (Main.wallDungeon[Main.tile[num2, num3].wall] && (double)num3 > Main.worldSurface && !NPC.downedBoss3))
52710 {
52711 continue;
52712 }
52713 int num6 = 0;
52714 while (num6 < settings.maximumFallDistanceFromOrignalPoint)
52715 {
52716 if (Main.tile[num2, num3 + num6] == null)
52717 {
52718 Main.tile[num2, num3 + num6] = new Tile();
52719 }
52720 Tile tile = Main.tile[num2, num3 + num6];
52721 vector = new Vector2(num2, num3 + num6) * 16f + new Vector2(-num4 / 2 + 8, -height);
52722 Collision.SlopeCollision(vector, velocity, num4, height, gravDir);
52723 if (!Collision.SolidCollision(vector, num4, height))
52724 {
52725 num6++;
52726 continue;
52727 }
52728 if (tile.active() && !tile.inActive() && Main.tileSolid[tile.type])
52729 {
52730 break;
52731 }
52732 num6++;
52733 }
52734 vector.Y -= 16f;
52735 int i = (int)vector.X / 16;
52736 int j = (int)vector.Y / 16;
52737 int num7 = (int)(vector.X + (float)num4 * 0.5f) / 16;
52738 int j2 = (int)(vector.Y + (float)height) / 16;
52739 Tile tileSafely = Framing.GetTileSafely(i, j);
52740 Tile tileSafely2 = Framing.GetTileSafely(num7, j2);
52741 if (settings.avoidAnyLiquid && tileSafely2.liquid > 0)
52742 {
52743 continue;
52744 }
52745 if (settings.mostlySolidFloor)
52746 {
52747 Tile tileSafely3 = Framing.GetTileSafely(num7 - 1, j2);
52748 Tile tileSafely4 = Framing.GetTileSafely(num7 + 1, j2);
52749 if (!tileSafely3.active() || tileSafely3.inActive() || !Main.tileSolid[tileSafely3.type] || Main.tileSolidTop[tileSafely3.type] || !tileSafely4.active() || tileSafely4.inActive() || !Main.tileSolid[tileSafely4.type] || Main.tileSolidTop[tileSafely4.type])
52750 {
52751 continue;
52752 }
52753 }
52754 if ((settings.avoidWalls && tileSafely.wall > 0) || (settings.avoidAnyLiquid && Collision.WetCollision(vector, num4, height)) || (settings.avoidLava && Collision.LavaCollision(vector, num4, height)) || (settings.avoidHurtTiles && Collision.AnyHurtingTiles(vector, num4, height)) || Collision.SolidCollision(vector, num4, height) || num6 >= settings.maximumFallDistanceFromOrignalPoint - 1)
52755 {
52756 continue;
52757 }
52758 Vector2 vector2 = Vector2.UnitX * 16f;
52759 if (Collision.TileCollision(vector - vector2, vector2, width, height, fallThrough: false, fall2: false, (int)gravDir) != vector2)
52760 {
52761 continue;
52762 }
52763 vector2 = -Vector2.UnitX * 16f;
52764 if (Collision.TileCollision(vector - vector2, vector2, width, height, fallThrough: false, fall2: false, (int)gravDir) != vector2)
52765 {
52766 continue;
52767 }
52768 vector2 = Vector2.UnitY * 16f;
52769 if (!(Collision.TileCollision(vector - vector2, vector2, width, height, fallThrough: false, fall2: false, (int)gravDir) != vector2))
52770 {
52771 vector2 = -Vector2.UnitY * 16f;
52772 if (!(Collision.TileCollision(vector - vector2, vector2, width, height, fallThrough: false, fall2: false, (int)gravDir) != vector2))
52773 {
52774 canSpawn = true;
52775 num3 += num6;
52776 break;
52777 }
52778 }
52779 }
52780 return vector;
52781 }
static float Clamp(float value, float min, float max)
Definition MathHelper.cs:46
Vector2 velocity
Definition Entity.cs:16

References Terraria.Tile.active(), Terraria.Collision.AnyHurtingTiles(), Terraria.Player.RandomTeleportationAttemptSettings.attemptsBeforeGivingUp, Terraria.Player.RandomTeleportationAttemptSettings.avoidAnyLiquid, Terraria.Player.RandomTeleportationAttemptSettings.avoidHurtTiles, Terraria.Player.RandomTeleportationAttemptSettings.avoidLava, Terraria.Player.RandomTeleportationAttemptSettings.avoidWalls, Microsoft.Xna.Framework.MathHelper.Clamp(), Terraria.NPC.downedBoss3, Terraria.NPC.downedPlantBoss, Terraria.Framing.GetTileSafely(), Terraria.Tile.inActive(), Terraria.Collision.LavaCollision(), Terraria.Player.RandomTeleportationAttemptSettings.maximumFallDistanceFromOrignalPoint, Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.Player.RandomTeleportationAttemptSettings.mostlySolidFloor, Terraria.Main.rand, Terraria.Collision.SlopeCollision(), Terraria.Collision.SolidCollision(), Terraria.DataStructures.Tile, Terraria.Main.tile, Terraria.Collision.TileCollision(), Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, Terraria.Tile.type, Terraria.Main.wallDungeon, Terraria.Collision.WetCollision(), and Terraria.Main.worldSurface.