terraria-source-code/GameContent/TeleportHelpers.cs
2021-10-26 12:45:26 -04:00

112 lines
4.2 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.TeleportHelpers
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using Microsoft.Xna.Framework;
namespace Terraria.GameContent
{
public class TeleportHelpers
{
public static bool RequestMagicConchTeleportPosition(
Player player,
int crawlOffsetX,
int startX,
out Point landingPoint)
{
landingPoint = new Point();
Point point = new Point(startX, 50);
int num1 = 1;
int num2 = -1;
int num3 = 1;
int num4 = 0;
int num5 = 5000;
Vector2 vector2 = new Vector2((float) player.width * 0.5f, (float) player.height);
int num6 = 40;
bool flag1 = WorldGen.SolidOrSlopedTile(Main.tile[point.X, point.Y]);
int num7 = 0;
int num8 = 400;
while (num4 < num5 && num7 < num8)
{
++num4;
Tile tile1 = Main.tile[point.X, point.Y];
Tile tile2 = Main.tile[point.X, point.Y + num3];
bool flag2 = WorldGen.SolidOrSlopedTile(tile1) || tile1.liquid > (byte) 0;
bool flag3 = WorldGen.SolidOrSlopedTile(tile2) || tile2.liquid > (byte) 0;
if (TeleportHelpers.IsInSolidTilesExtended(new Vector2((float) (point.X * 16 + 8), (float) (point.Y * 16 + 15)) - vector2, player.velocity, player.width, player.height, (int) player.gravDir))
{
if (flag1)
point.Y += num1;
else
point.Y += num2;
}
else if (flag2)
{
if (flag1)
point.Y += num1;
else
point.Y += num2;
}
else
{
flag1 = false;
if (!TeleportHelpers.IsInSolidTilesExtended(new Vector2((float) (point.X * 16 + 8), (float) (point.Y * 16 + 15 + 16)) - vector2, player.velocity, player.width, player.height, (int) player.gravDir) && !flag3 && (double) point.Y < Main.worldSurface)
point.Y += num1;
else if (tile2.liquid > (byte) 0)
{
point.X += crawlOffsetX;
++num7;
}
else if (TeleportHelpers.TileIsDangerous(point.X, point.Y))
{
point.X += crawlOffsetX;
++num7;
}
else if (TeleportHelpers.TileIsDangerous(point.X, point.Y + num3))
{
point.X += crawlOffsetX;
++num7;
}
else if (point.Y < num6)
point.Y += num1;
else
break;
}
}
if (num4 == num5 || num7 >= num8 || !WorldGen.InWorld(point.X, point.Y, 40))
return false;
landingPoint = point;
return true;
}
private static bool TileIsDangerous(int x, int y)
{
Tile tile = Main.tile[x, y];
return tile.liquid > (byte) 0 && tile.lava() || tile.wall == (ushort) 87 && (double) y > Main.worldSurface && !NPC.downedPlantBoss || Main.wallDungeon[(int) tile.wall] && (double) y > Main.worldSurface && !NPC.downedBoss3;
}
private static bool IsInSolidTilesExtended(
Vector2 testPosition,
Vector2 playerVelocity,
int width,
int height,
int gravDir)
{
if (Collision.LavaCollision(testPosition, width, height) || (double) Collision.HurtTiles(testPosition, playerVelocity, width, height).Y > 0.0 || Collision.SolidCollision(testPosition, width, height))
return true;
Vector2 Velocity1 = Vector2.UnitX * 16f;
if (Collision.TileCollision(testPosition - Velocity1, Velocity1, width, height, gravDir: gravDir) != Velocity1)
return true;
Vector2 Velocity2 = -Vector2.UnitX * 16f;
if (Collision.TileCollision(testPosition - Velocity2, Velocity2, width, height, gravDir: gravDir) != Velocity2)
return true;
Vector2 Velocity3 = Vector2.UnitY * 16f;
if (Collision.TileCollision(testPosition - Velocity3, Velocity3, width, height, gravDir: gravDir) != Velocity3)
return true;
Vector2 Velocity4 = -Vector2.UnitY * 16f;
return Collision.TileCollision(testPosition - Velocity4, Velocity4, width, height, gravDir: gravDir) != Velocity4;
}
}
}