187 lines
6.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|