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

187 lines
6.9 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.MinecartDiggerHelper
// 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;
using Terraria.GameContent.Achievements;
using Terraria.ID;
namespace Terraria.GameContent
{
public class MinecartDiggerHelper
{
public static MinecartDiggerHelper Instance = new MinecartDiggerHelper();
public void TryDigging(
Player player,
Vector2 trackWorldPosition,
int digDirectionX,
int digDirectionY)
{
digDirectionY = 0;
Point tileCoordinates = trackWorldPosition.ToTileCoordinates();
if (Framing.GetTileSafely(tileCoordinates).type != (ushort) 314 || (double) tileCoordinates.Y < Main.worldSurface)
return;
Point point1 = tileCoordinates;
point1.X += digDirectionX;
point1.Y += digDirectionY;
if (this.AlreadyLeadsIntoWantedTrack(tileCoordinates, point1) || digDirectionY == 0 && (this.AlreadyLeadsIntoWantedTrack(tileCoordinates, new Point(point1.X, point1.Y - 1)) || this.AlreadyLeadsIntoWantedTrack(tileCoordinates, new Point(point1.X, point1.Y + 1))))
return;
int num = 5;
if (digDirectionY != 0)
num = 5;
Point point2 = point1;
Point point3 = point2;
point3.Y -= num - 1;
int x1 = point3.X;
for (int y = point3.Y; y <= point2.Y; ++y)
{
if (!this.CanGetPastTile(x1, y) || !this.HasPickPower(player, x1, y))
return;
}
if (!this.CanConsumeATrackItem(player))
return;
int x2 = point3.X;
for (int y = point3.Y; y <= point2.Y; ++y)
this.MineTheTileIfNecessary(x2, y);
this.ConsumeATrackItem(player);
this.PlaceATrack(point1.X, point1.Y);
player.velocity.X = MathHelper.Clamp(player.velocity.X, -1f, 1f);
if (this.DoTheTracksConnectProperly(tileCoordinates, point1))
return;
this.CorrectTrackConnections(tileCoordinates, point1);
}
private bool CanConsumeATrackItem(Player player) => this.FindMinecartTrackItem(player) != null;
private void ConsumeATrackItem(Player player)
{
Item minecartTrackItem = this.FindMinecartTrackItem(player);
--minecartTrackItem.stack;
if (minecartTrackItem.stack != 0)
return;
minecartTrackItem.TurnToAir();
}
private Item FindMinecartTrackItem(Player player)
{
Item obj1 = (Item) null;
for (int index = 0; index < 58; ++index)
{
if (player.selectedItem != index || player.itemAnimation <= 0 && player.reuseDelay <= 0 && player.itemTime <= 0)
{
Item obj2 = player.inventory[index];
if (obj2.type == 2340 && obj2.stack > 0)
{
obj1 = obj2;
break;
}
}
}
return obj1;
}
private void PoundTrack(Point spot)
{
if (Main.tile[spot.X, spot.Y].type != (ushort) 314 || !Minecart.FrameTrack(spot.X, spot.Y, true) || Main.netMode != 1)
return;
NetMessage.SendData(17, number: 15, number2: ((float) spot.X), number3: ((float) spot.Y), number4: 1f);
}
private bool AlreadyLeadsIntoWantedTrack(
Point tileCoordsOfFrontWheel,
Point tileCoordsWeWantToReach)
{
Tile tileSafely1 = Framing.GetTileSafely(tileCoordsOfFrontWheel);
Tile tileSafely2 = Framing.GetTileSafely(tileCoordsWeWantToReach);
if (!tileSafely1.active() || tileSafely1.type != (ushort) 314 || !tileSafely2.active() || tileSafely2.type != (ushort) 314)
return false;
int? expectedStartLeft;
int? expectedStartRight;
int? expectedEndLeft;
int? expectedEndRight;
MinecartDiggerHelper.GetExpectedDirections(tileCoordsOfFrontWheel, tileCoordsWeWantToReach, out expectedStartLeft, out expectedStartRight, out expectedEndLeft, out expectedEndRight);
return Minecart.GetAreExpectationsForSidesMet(tileCoordsOfFrontWheel, expectedStartLeft, expectedStartRight) && Minecart.GetAreExpectationsForSidesMet(tileCoordsWeWantToReach, expectedEndLeft, expectedEndRight);
}
private static void GetExpectedDirections(
Point startCoords,
Point endCoords,
out int? expectedStartLeft,
out int? expectedStartRight,
out int? expectedEndLeft,
out int? expectedEndRight)
{
int num1 = endCoords.Y - startCoords.Y;
int num2 = endCoords.X - startCoords.X;
expectedStartLeft = new int?();
expectedStartRight = new int?();
expectedEndLeft = new int?();
expectedEndRight = new int?();
if (num2 == -1)
{
expectedStartLeft = new int?(num1);
expectedEndRight = new int?(-num1);
}
if (num2 != 1)
return;
expectedStartRight = new int?(num1);
expectedEndLeft = new int?(-num1);
}
private bool DoTheTracksConnectProperly(
Point tileCoordsOfFrontWheel,
Point tileCoordsWeWantToReach)
{
return this.AlreadyLeadsIntoWantedTrack(tileCoordsOfFrontWheel, tileCoordsWeWantToReach);
}
private void CorrectTrackConnections(Point startCoords, Point endCoords)
{
int? expectedStartLeft;
int? expectedStartRight;
int? expectedEndLeft;
int? expectedEndRight;
MinecartDiggerHelper.GetExpectedDirections(startCoords, endCoords, out expectedStartLeft, out expectedStartRight, out expectedEndLeft, out expectedEndRight);
Tile tileSafely1 = Framing.GetTileSafely(startCoords);
Tile tileSafely2 = Framing.GetTileSafely(endCoords);
if (tileSafely1.active() && tileSafely1.type == (ushort) 314)
Minecart.TryFittingTileOrientation(startCoords, expectedStartLeft, expectedStartRight);
if (!tileSafely2.active() || tileSafely2.type != (ushort) 314)
return;
Minecart.TryFittingTileOrientation(endCoords, expectedEndLeft, expectedEndRight);
}
private bool HasPickPower(Player player, int x, int y) => player.HasEnoughPickPowerToHurtTile(x, y);
private bool CanGetPastTile(int x, int y)
{
if (WorldGen.CheckTileBreakability(x, y) != 0)
return false;
Tile tile = Main.tile[x, y];
return (!tile.active() || !TileID.Sets.Falling[(int) tile.type]) && (!tile.active() || WorldGen.CanKillTile(x, y));
}
private void PlaceATrack(int x, int y)
{
int Type = 314;
int num = 0;
if (!WorldGen.PlaceTile(x, y, Type, plr: Main.myPlayer, style: num))
return;
NetMessage.SendData(17, number: 1, number2: ((float) x), number3: ((float) y), number4: ((float) Type), number5: num);
}
private void MineTheTileIfNecessary(int x, int y)
{
AchievementsHelper.CurrentlyMining = true;
if (Main.tile[x, y].active())
{
WorldGen.KillTile(x, y);
NetMessage.SendData(17, number2: ((float) x), number3: ((float) y));
}
AchievementsHelper.CurrentlyMining = false;
}
}
}