2364 lines
118 KiB
C#
2364 lines
118 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.GameContent.SmartCursorHelper
|
|
// 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 System;
|
|
using System.Collections.Generic;
|
|
using Terraria.Enums;
|
|
using Terraria.GameContent.UI;
|
|
using Terraria.GameInput;
|
|
using Terraria.ID;
|
|
|
|
namespace Terraria.GameContent
|
|
{
|
|
public class SmartCursorHelper
|
|
{
|
|
private static List<Tuple<int, int>> _targets = new List<Tuple<int, int>>();
|
|
private static List<Tuple<int, int>> _grappleTargets = new List<Tuple<int, int>>();
|
|
private static List<Tuple<int, int>> _points = new List<Tuple<int, int>>();
|
|
private static List<Tuple<int, int>> _endpoints = new List<Tuple<int, int>>();
|
|
private static List<Tuple<int, int>> _toRemove = new List<Tuple<int, int>>();
|
|
private static List<Tuple<int, int>> _targets2 = new List<Tuple<int, int>>();
|
|
|
|
public static void SmartCursorLookup(Player player)
|
|
{
|
|
Main.SmartCursorShowing = false;
|
|
if (!Main.SmartCursorEnabled)
|
|
return;
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo = new SmartCursorHelper.SmartCursorUsageInfo()
|
|
{
|
|
player = player,
|
|
item = player.inventory[player.selectedItem],
|
|
mouse = Main.MouseWorld,
|
|
position = player.position,
|
|
Center = player.Center
|
|
};
|
|
double gravDir = (double) player.gravDir;
|
|
int tileTargetX = Player.tileTargetX;
|
|
int tileTargetY = Player.tileTargetY;
|
|
int tileRangeX = Player.tileRangeX;
|
|
int tileRangeY = Player.tileRangeY;
|
|
providedInfo.screenTargetX = Utils.Clamp<int>(tileTargetX, 10, Main.maxTilesX - 10);
|
|
providedInfo.screenTargetY = Utils.Clamp<int>(tileTargetY, 10, Main.maxTilesY - 10);
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY] == null)
|
|
return;
|
|
int num1 = SmartCursorHelper.IsHoveringOverAnInteractibleTileThatBlocksSmartCursor(providedInfo) ? 1 : 0;
|
|
int num2 = SmartCursorHelper.TryFindingPaintInplayerInventory(providedInfo);
|
|
providedInfo.paintLookup = num2;
|
|
int tileBoost = providedInfo.item.tileBoost;
|
|
providedInfo.reachableStartX = (int) ((double) player.position.X / 16.0) - tileRangeX - tileBoost + 1;
|
|
providedInfo.reachableEndX = (int) (((double) player.position.X + (double) player.width) / 16.0) + tileRangeX + tileBoost - 1;
|
|
providedInfo.reachableStartY = (int) ((double) player.position.Y / 16.0) - tileRangeY - tileBoost + 1;
|
|
providedInfo.reachableEndY = (int) (((double) player.position.Y + (double) player.height) / 16.0) + tileRangeY + tileBoost - 2;
|
|
providedInfo.reachableStartX = Utils.Clamp<int>(providedInfo.reachableStartX, 10, Main.maxTilesX - 10);
|
|
providedInfo.reachableEndX = Utils.Clamp<int>(providedInfo.reachableEndX, 10, Main.maxTilesX - 10);
|
|
providedInfo.reachableStartY = Utils.Clamp<int>(providedInfo.reachableStartY, 10, Main.maxTilesY - 10);
|
|
providedInfo.reachableEndY = Utils.Clamp<int>(providedInfo.reachableEndY, 10, Main.maxTilesY - 10);
|
|
if (num1 != 0 && providedInfo.screenTargetX >= providedInfo.reachableStartX && providedInfo.screenTargetX <= providedInfo.reachableEndX && providedInfo.screenTargetY >= providedInfo.reachableStartY && providedInfo.screenTargetY <= providedInfo.reachableEndY)
|
|
return;
|
|
SmartCursorHelper._grappleTargets.Clear();
|
|
int[] grappling = player.grappling;
|
|
int grapCount = player.grapCount;
|
|
for (int index = 0; index < grapCount; ++index)
|
|
{
|
|
Projectile projectile = Main.projectile[grappling[index]];
|
|
int num3 = (int) projectile.Center.X / 16;
|
|
int num4 = (int) projectile.Center.Y / 16;
|
|
SmartCursorHelper._grappleTargets.Add(new Tuple<int, int>(num3, num4));
|
|
}
|
|
int num5 = -1;
|
|
int num6 = -1;
|
|
if (!Player.SmartCursorSettings.SmartAxeAfterPickaxe)
|
|
SmartCursorHelper.Step_Axe(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_ForceCursorToAnyMinableThing(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Pickaxe_MineShinies(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Pickaxe_MineSolids(player, providedInfo, SmartCursorHelper._grappleTargets, ref num5, ref num6);
|
|
if (Player.SmartCursorSettings.SmartAxeAfterPickaxe)
|
|
SmartCursorHelper.Step_Axe(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_ColoredWrenches(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_MulticolorWrench(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Hammers(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_ActuationRod(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_WireCutter(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Platforms(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_MinecartTracks(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Walls(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_PumpkinSeeds(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Pigronata(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Boulders(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Torch(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_LawnMower(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_BlocksFilling(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_BlocksLines(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_PaintRoller(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_PaintBrush(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_PaintScrapper(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Acorns(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_GemCorns(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_EmptyBuckets(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_Actuators(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_AlchemySeeds(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_PlanterBox(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_ClayPots(providedInfo, ref num5, ref num6);
|
|
SmartCursorHelper.Step_StaffOfRegrowth(providedInfo, ref num5, ref num6);
|
|
if (num5 != -1 && num6 != -1)
|
|
{
|
|
Main.SmartCursorX = Player.tileTargetX = num5;
|
|
Main.SmartCursorY = Player.tileTargetY = num6;
|
|
Main.SmartCursorShowing = true;
|
|
}
|
|
SmartCursorHelper._grappleTargets.Clear();
|
|
}
|
|
|
|
private static int TryFindingPaintInplayerInventory(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo)
|
|
{
|
|
Item[] inventory = providedInfo.player.inventory;
|
|
int num = 0;
|
|
if (providedInfo.item.type == 1071 || providedInfo.item.type == 1543 || providedInfo.item.type == 1072 || providedInfo.item.type == 1544)
|
|
{
|
|
for (int index = 0; index < 58; ++index)
|
|
{
|
|
if (inventory[index].stack > 0 && inventory[index].paint > (byte) 0)
|
|
{
|
|
num = (int) inventory[index].paint;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private static bool IsHoveringOverAnInteractibleTileThatBlocksSmartCursor(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo)
|
|
{
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active())
|
|
{
|
|
switch (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].type)
|
|
{
|
|
case 4:
|
|
case 10:
|
|
case 11:
|
|
case 13:
|
|
case 21:
|
|
case 29:
|
|
case 33:
|
|
case 49:
|
|
case 50:
|
|
case 55:
|
|
case 79:
|
|
case 85:
|
|
case 88:
|
|
case 97:
|
|
case 104:
|
|
case 125:
|
|
case 132:
|
|
case 136:
|
|
case 139:
|
|
case 144:
|
|
case 174:
|
|
case 207:
|
|
case 209:
|
|
case 212:
|
|
case 216:
|
|
case 219:
|
|
case 237:
|
|
case 287:
|
|
case 334:
|
|
case 335:
|
|
case 338:
|
|
case 354:
|
|
case 386:
|
|
case 387:
|
|
case 388:
|
|
case 389:
|
|
case 411:
|
|
case 425:
|
|
case 441:
|
|
case 463:
|
|
case 467:
|
|
case 468:
|
|
case 491:
|
|
case 494:
|
|
case 510:
|
|
case 511:
|
|
case 573:
|
|
case 621:
|
|
flag = true;
|
|
break;
|
|
case 314:
|
|
if ((double) providedInfo.player.gravDir == 1.0)
|
|
{
|
|
flag = true;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
private static void Step_StaffOfRegrowth(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 213 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
bool flag1 = !Main.tile[reachableStartX - 1, reachableStartY].active() || !Main.tile[reachableStartX, reachableStartY + 1].active() || !Main.tile[reachableStartX + 1, reachableStartY].active() || !Main.tile[reachableStartX, reachableStartY - 1].active();
|
|
bool flag2 = !Main.tile[reachableStartX - 1, reachableStartY - 1].active() || !Main.tile[reachableStartX - 1, reachableStartY + 1].active() || !Main.tile[reachableStartX + 1, reachableStartY + 1].active() || !Main.tile[reachableStartX + 1, reachableStartY - 1].active();
|
|
if (tile.active() && !tile.inActive() && tile.type == (ushort) 0 && (flag1 || tile.type == (ushort) 0 & flag2))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_ClayPots(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 78 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active())
|
|
flag = true;
|
|
if (!Collision.InTileBounds(providedInfo.screenTargetX, providedInfo.screenTargetY, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
flag = true;
|
|
if (!flag)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY];
|
|
Tile tile2 = Main.tile[reachableStartX, reachableStartY + 1];
|
|
if ((!tile1.active() || Main.tileCut[(int) tile1.type] || TileID.Sets.BreakableWhenPlacing[(int) tile1.type]) && tile2.nactive() && !tile2.halfBrick() && tile2.slope() == (byte) 0 && Main.tileSolid[(int) tile2.type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if (Collision.EmptyTile(SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2, true))
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY) && (double) num1 != -1.0)
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_PlanterBox(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 380 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active() && Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].type == (ushort) 380)
|
|
flag = true;
|
|
if (!flag)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && tile.type == (ushort) 380)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX - 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX - 1, reachableStartY].type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX + 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX + 1, reachableStartY].type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY) && (double) num1 != -1.0)
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_AlchemySeeds(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 82 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
int placeStyle = providedInfo.item.placeStyle;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY];
|
|
Tile tile2 = Main.tile[reachableStartX, reachableStartY + 1];
|
|
int num = !tile1.active() || TileID.Sets.BreakableWhenPlacing[(int) tile1.type] ? 1 : (!Main.tileCut[(int) tile1.type] || tile1.type == (ushort) 82 ? 0 : (WorldGen.IsHarvestableHerbWithSeed((int) tile1.type, (int) tile1.frameX / 18) ? 1 : 0));
|
|
bool flag = tile2.nactive() && !tile2.halfBrick() && tile2.slope() == (byte) 0;
|
|
if (num != 0 && flag)
|
|
{
|
|
switch (placeStyle)
|
|
{
|
|
case 0:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 2 && tile2.type != (ushort) 477 && tile2.type != (ushort) 109 && tile2.type != (ushort) 492 || tile1.liquid > (byte) 0)
|
|
continue;
|
|
break;
|
|
case 1:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 60 || tile1.liquid > (byte) 0)
|
|
continue;
|
|
break;
|
|
case 2:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 0 && tile2.type != (ushort) 59 || tile1.liquid > (byte) 0)
|
|
continue;
|
|
break;
|
|
case 3:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 203 && tile2.type != (ushort) 199 && tile2.type != (ushort) 23 && tile2.type != (ushort) 25 || tile1.liquid > (byte) 0)
|
|
continue;
|
|
break;
|
|
case 4:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 53 && tile2.type != (ushort) 116 || tile1.liquid > (byte) 0 && tile1.lava())
|
|
continue;
|
|
break;
|
|
case 5:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 57 || tile1.liquid > (byte) 0 && !tile1.lava())
|
|
continue;
|
|
break;
|
|
case 6:
|
|
if (tile2.type != (ushort) 78 && tile2.type != (ushort) 380 && tile2.type != (ushort) 147 && tile2.type != (ushort) 161 && tile2.type != (ushort) 163 && tile2.type != (ushort) 164 && tile2.type != (ushort) 200 || tile1.liquid > (byte) 0 && tile1.lava())
|
|
continue;
|
|
break;
|
|
}
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Actuators(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 849 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if ((tile.wire() || tile.wire2() || tile.wire3() || tile.wire4()) && !tile.actuator() && tile.active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_EmptyBuckets(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 205 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.liquid > (byte) 0)
|
|
{
|
|
int num1 = (int) tile.liquidType();
|
|
int num2 = 0;
|
|
for (int index1 = reachableStartX - 1; index1 <= reachableStartX + 1; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY - 1; index2 <= reachableStartY + 1; ++index2)
|
|
{
|
|
if ((int) Main.tile[index1, index2].liquidType() == num1)
|
|
num2 += (int) Main.tile[index1, index2].liquid;
|
|
}
|
|
}
|
|
if (num2 > 100)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num3 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num4 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num3 == -1.0 || (double) num4 < (double) num3)
|
|
{
|
|
num3 = num4;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_PaintScrapper(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (!ItemID.Sets.IsPaintScraper[providedInfo.item.type] || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && (tile.color() > (byte) 0 || tile.type == (ushort) 184) || tile.wall > (ushort) 0 && tile.wallColor() > (byte) 0)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_PaintBrush(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 1071 && providedInfo.item.type != 1543 || providedInfo.paintLookup == 0 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && (int) tile.color() != providedInfo.paintLookup)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_PaintRoller(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 1072 && providedInfo.item.type != 1544 || providedInfo.paintLookup == 0 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.wall > (ushort) 0 && (int) tile.wallColor() != providedInfo.paintLookup && (!tile.active() || !Main.tileSolid[(int) tile.type] || Main.tileSolidTop[(int) tile.type]))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_BlocksLines(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (!Player.SmartCursorSettings.SmartBlocksEnabled || providedInfo.item.createTile <= -1 || providedInfo.item.type == 213 || !Main.tileSolid[providedInfo.item.createTile] || Main.tileSolidTop[providedInfo.item.createTile] || Main.tileFrameImportant[providedInfo.item.createTile] || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag1 = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active())
|
|
flag1 = true;
|
|
if (!Collision.InTileBounds(providedInfo.screenTargetX, providedInfo.screenTargetY, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
flag1 = true;
|
|
if (!flag1)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (!tile.active() || Main.tileCut[(int) tile.type] || TileID.Sets.BreakableWhenPlacing[(int) tile.type])
|
|
{
|
|
bool flag2 = false;
|
|
if (Main.tile[reachableStartX - 1, reachableStartY].active() && Main.tileSolid[(int) Main.tile[reachableStartX - 1, reachableStartY].type] && !Main.tileSolidTop[(int) Main.tile[reachableStartX - 1, reachableStartY].type])
|
|
flag2 = true;
|
|
if (Main.tile[reachableStartX + 1, reachableStartY].active() && Main.tileSolid[(int) Main.tile[reachableStartX + 1, reachableStartY].type] && !Main.tileSolidTop[(int) Main.tile[reachableStartX + 1, reachableStartY].type])
|
|
flag2 = true;
|
|
if (Main.tile[reachableStartX, reachableStartY - 1].active() && Main.tileSolid[(int) Main.tile[reachableStartX, reachableStartY - 1].type] && !Main.tileSolidTop[(int) Main.tile[reachableStartX, reachableStartY - 1].type])
|
|
flag2 = true;
|
|
if (Main.tile[reachableStartX, reachableStartY + 1].active() && Main.tileSolid[(int) Main.tile[reachableStartX, reachableStartY + 1].type] && !Main.tileSolidTop[(int) Main.tile[reachableStartX, reachableStartY + 1].type])
|
|
flag2 = true;
|
|
if (flag2)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if (Collision.EmptyTile(SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2))
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY) && (double) num1 != -1.0)
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Boulders(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 138 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY + 1];
|
|
Tile tile2 = Main.tile[reachableStartX - 1, reachableStartY + 1];
|
|
bool flag = true;
|
|
if (!tile2.nactive() || !tile1.nactive())
|
|
flag = false;
|
|
if (tile2.slope() > (byte) 0 || tile1.slope() > (byte) 0 || tile2.halfBrick() || tile1.halfBrick())
|
|
flag = false;
|
|
if (Main.tileNoAttach[(int) tile2.type] || Main.tileNoAttach[(int) tile1.type])
|
|
flag = false;
|
|
for (int index1 = reachableStartX - 1; index1 <= reachableStartX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY - 1; index2 <= reachableStartY; ++index2)
|
|
{
|
|
Tile tile3 = Main.tile[index1, index2];
|
|
if (tile3.active() && !Main.tileCut[(int) tile3.type])
|
|
flag = false;
|
|
}
|
|
}
|
|
Rectangle rectangle = new Rectangle(reachableStartX * 16 - 16, reachableStartY * 16 - 16, 32, 32);
|
|
for (int index = 0; index < (int) byte.MaxValue; ++index)
|
|
{
|
|
Player player = Main.player[index];
|
|
if (player.active && !player.dead && player.Hitbox.Intersects(rectangle))
|
|
{
|
|
flag = false;
|
|
break;
|
|
}
|
|
}
|
|
if (flag)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Pigronata(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 454 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY && (double) reachableStartY <= Main.worldSurface - 2.0; ++reachableStartY)
|
|
{
|
|
bool flag = true;
|
|
for (int index1 = reachableStartX - 2; index1 <= reachableStartX + 1; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY - 1; index2 <= reachableStartY + 2; ++index2)
|
|
{
|
|
Tile testTile = Main.tile[index1, index2];
|
|
if (index2 == reachableStartY - 1)
|
|
{
|
|
if (!WorldGen.SolidTile(testTile))
|
|
flag = false;
|
|
}
|
|
else if (testTile.active() && (!Main.tileCut[(int) testTile.type] || testTile.type == (ushort) 454))
|
|
flag = false;
|
|
}
|
|
}
|
|
if (flag)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_PumpkinSeeds(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile != 254 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY + 1];
|
|
Tile tile2 = Main.tile[reachableStartX - 1, reachableStartY + 1];
|
|
if ((double) reachableStartY <= Main.worldSurface - 2.0)
|
|
{
|
|
bool flag = true;
|
|
if (!tile2.active() || !tile1.active())
|
|
flag = false;
|
|
if (tile2.slope() > (byte) 0 || tile1.slope() > (byte) 0 || tile2.halfBrick() || tile1.halfBrick())
|
|
flag = false;
|
|
if (tile2.type != (ushort) 2 && tile2.type != (ushort) 477 && tile2.type != (ushort) 109 && tile2.type != (ushort) 492)
|
|
flag = false;
|
|
if (tile1.type != (ushort) 2 && tile1.type != (ushort) 477 && tile1.type != (ushort) 109 && tile1.type != (ushort) 492)
|
|
flag = false;
|
|
for (int x = reachableStartX - 1; x <= reachableStartX; ++x)
|
|
{
|
|
for (int y = reachableStartY - 1; y <= reachableStartY; ++y)
|
|
{
|
|
if (Main.tile[x, y].active() && !WorldGen.CanCutTile(x, y, TileCuttingContext.TilePlacement))
|
|
flag = false;
|
|
}
|
|
}
|
|
if (flag)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Walls(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
int width = providedInfo.player.width;
|
|
int height = providedInfo.player.height;
|
|
if (providedInfo.item.createWall <= 0 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.wall == (ushort) 0 && (!tile.active() || !Main.tileSolid[(int) tile.type] || Main.tileSolidTop[(int) tile.type]) && Collision.CanHitWithCheck(providedInfo.position, width, height, new Vector2((float) reachableStartX, (float) reachableStartY) * 16f, 16, 16, new Utils.TileActionAttempt(DelegateMethods.NotDoorStand)))
|
|
{
|
|
bool flag = false;
|
|
if (Main.tile[reachableStartX - 1, reachableStartY].active() || Main.tile[reachableStartX - 1, reachableStartY].wall > (ushort) 0)
|
|
flag = true;
|
|
if (Main.tile[reachableStartX + 1, reachableStartY].active() || Main.tile[reachableStartX + 1, reachableStartY].wall > (ushort) 0)
|
|
flag = true;
|
|
if (Main.tile[reachableStartX, reachableStartY - 1].active() || Main.tile[reachableStartX, reachableStartY - 1].wall > (ushort) 0)
|
|
flag = true;
|
|
if (Main.tile[reachableStartX, reachableStartY + 1].active() || Main.tile[reachableStartX, reachableStartY + 1].wall > (ushort) 0)
|
|
flag = true;
|
|
if (WorldGen.IsOpenDoorAnchorFrame(reachableStartX, reachableStartY))
|
|
flag = false;
|
|
if (flag)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_MinecartTracks(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if ((providedInfo.item.type == 2340 || providedInfo.item.type == 2739) && focusedX == -1 && focusedY == -1)
|
|
{
|
|
SmartCursorHelper._targets.Clear();
|
|
Vector2 vector2 = (Main.MouseWorld - providedInfo.Center).SafeNormalize(Vector2.UnitY);
|
|
double num1 = (double) Vector2.Dot(vector2, -Vector2.UnitY);
|
|
bool flag1 = num1 >= 0.5;
|
|
bool flag2 = num1 <= -0.5;
|
|
double num2 = (double) Vector2.Dot(vector2, Vector2.UnitX);
|
|
bool flag3 = num2 >= 0.5;
|
|
bool flag4 = num2 <= -0.5;
|
|
bool flag5 = flag1 & flag4;
|
|
bool flag6 = flag1 & flag3;
|
|
bool flag7 = flag2 & flag4;
|
|
bool flag8 = flag2 & flag3;
|
|
bool flag9;
|
|
if (flag5)
|
|
flag9 = flag4 = false;
|
|
if (flag6)
|
|
flag9 = flag3 = false;
|
|
bool flag10;
|
|
if (flag7)
|
|
flag10 = flag4 = false;
|
|
if (flag8)
|
|
flag10 = flag3 = false;
|
|
bool flag11 = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active() && Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].type == (ushort) 314)
|
|
flag11 = true;
|
|
if (!flag11)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && tile.type == (ushort) 314)
|
|
{
|
|
bool flag12 = Main.tile[reachableStartX + 1, reachableStartY + 1].active() && Main.tile[reachableStartX + 1, reachableStartY + 1].type == (ushort) 314;
|
|
bool flag13 = Main.tile[reachableStartX + 1, reachableStartY - 1].active() && Main.tile[reachableStartX + 1, reachableStartY - 1].type == (ushort) 314;
|
|
bool flag14 = Main.tile[reachableStartX - 1, reachableStartY + 1].active() && Main.tile[reachableStartX - 1, reachableStartY + 1].type == (ushort) 314;
|
|
bool flag15 = Main.tile[reachableStartX - 1, reachableStartY - 1].active() && Main.tile[reachableStartX - 1, reachableStartY - 1].type == (ushort) 314;
|
|
if (flag5 && (!Main.tile[reachableStartX - 1, reachableStartY - 1].active() || Main.tileCut[(int) Main.tile[reachableStartX - 1, reachableStartY - 1].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX - 1, reachableStartY - 1].type]) && !(!flag12 & flag13) && !flag14)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY - 1));
|
|
if (flag4 && (!Main.tile[reachableStartX - 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX - 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX - 1, reachableStartY].type]))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (flag7 && (!Main.tile[reachableStartX - 1, reachableStartY + 1].active() || Main.tileCut[(int) Main.tile[reachableStartX - 1, reachableStartY + 1].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX - 1, reachableStartY + 1].type]) && !(!flag13 & flag12) && !flag15)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY + 1));
|
|
if (flag6 && (!Main.tile[reachableStartX + 1, reachableStartY - 1].active() || Main.tileCut[(int) Main.tile[reachableStartX + 1, reachableStartY - 1].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX + 1, reachableStartY - 1].type]) && !(!flag14 & flag15) && !flag12)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY - 1));
|
|
if (flag3 && (!Main.tile[reachableStartX + 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX + 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX + 1, reachableStartY].type]))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (flag8 && (!Main.tile[reachableStartX + 1, reachableStartY + 1].active() || Main.tileCut[(int) Main.tile[reachableStartX + 1, reachableStartY + 1].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX + 1, reachableStartY + 1].type]) && !(!flag15 & flag14) && !flag13)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY + 1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num3 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if ((!Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 - 1].active() || Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 - 1].type != (ushort) 314) && (!Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 + 1].active() || Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 + 1].type != (ushort) 314))
|
|
{
|
|
float num4 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num3 == -1.0 || (double) num4 < (double) num3)
|
|
{
|
|
num3 = num4;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY) && (double) num3 != -1.0)
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
if (providedInfo.item.type != 2492 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active() && Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].type == (ushort) 314)
|
|
flag = true;
|
|
if (!flag)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && tile.type == (ushort) 314)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX - 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX - 1, reachableStartY].type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].active() || Main.tileCut[(int) Main.tile[reachableStartX + 1, reachableStartY].type] || TileID.Sets.BreakableWhenPlacing[(int) Main.tile[reachableStartX + 1, reachableStartY].type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num5 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if ((!Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 - 1].active() || Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 - 1].type != (ushort) 314) && (!Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 + 1].active() || Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2 + 1].type != (ushort) 314))
|
|
{
|
|
float num6 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num5 == -1.0 || (double) num6 < (double) num5)
|
|
{
|
|
num5 = num6;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY) && (double) num5 != -1.0)
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Platforms(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.createTile < 0 || !TileID.Sets.Platforms[providedInfo.item.createTile] || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].active() && TileID.Sets.Platforms[(int) Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].type])
|
|
flag = true;
|
|
if (!flag)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile1.active() && TileID.Sets.Platforms[(int) tile1.type])
|
|
{
|
|
int num = (int) tile1.slope();
|
|
if (num != 2 && !Main.tile[reachableStartX - 1, reachableStartY - 1].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (num != 1 && !Main.tile[reachableStartX - 1, reachableStartY + 1].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY + 1));
|
|
if (num != 1 && !Main.tile[reachableStartX + 1, reachableStartY - 1].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (num != 2 && !Main.tile[reachableStartX + 1, reachableStartY + 1].active())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY + 1));
|
|
}
|
|
if (!tile1.active())
|
|
{
|
|
int num1 = 0;
|
|
int num2 = 1;
|
|
Tile tile2 = Main.tile[reachableStartX + num1, reachableStartY + num2];
|
|
if (tile2.active() && Main.tileSolid[(int) tile2.type] && !Main.tileSolidTop[(int) tile2.type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
int num3 = -1;
|
|
int num4 = 0;
|
|
Tile tile3 = Main.tile[reachableStartX + num3, reachableStartY + num4];
|
|
if (tile3.active() && Main.tileSolid[(int) tile3.type] && !Main.tileSolidTop[(int) tile3.type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
int num5 = 1;
|
|
int num6 = 0;
|
|
Tile tile4 = Main.tile[reachableStartX + num5, reachableStartY + num6];
|
|
if (tile4.active() && Main.tileSolid[(int) tile4.type] && !Main.tileSolidTop[(int) tile4.type])
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num7 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num8 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num7 == -1.0 || (double) num8 < (double) num7)
|
|
{
|
|
num7 = num8;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_WireCutter(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 510 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.wire() || tile.wire2() || tile.wire3() || tile.wire4() || tile.actuator())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_ActuationRod(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
bool actuationRodLock = providedInfo.player.ActuationRodLock;
|
|
bool actuationRodLockSetting = providedInfo.player.ActuationRodLockSetting;
|
|
if (providedInfo.item.type != 3620 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.active() && tile.actuator() && (!actuationRodLock || actuationRodLockSetting == tile.inActive()))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Hammers(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
int width = providedInfo.player.width;
|
|
int height = providedInfo.player.height;
|
|
if (providedInfo.item.hammer > 0 && focusedX == -1 && focusedY == -1)
|
|
{
|
|
Vector2 vector2 = providedInfo.mouse - providedInfo.Center;
|
|
int num1 = Math.Sign(vector2.X);
|
|
int num2 = Math.Sign(vector2.Y);
|
|
if ((double) Math.Abs(vector2.X) > (double) Math.Abs(vector2.Y) * 3.0)
|
|
{
|
|
num2 = 0;
|
|
providedInfo.mouse.Y = providedInfo.Center.Y;
|
|
}
|
|
if ((double) Math.Abs(vector2.Y) > (double) Math.Abs(vector2.X) * 3.0)
|
|
{
|
|
num1 = 0;
|
|
providedInfo.mouse.X = providedInfo.Center.X;
|
|
}
|
|
int num3 = (int) providedInfo.Center.X / 16;
|
|
int num4 = (int) providedInfo.Center.Y / 16;
|
|
SmartCursorHelper._points.Clear();
|
|
SmartCursorHelper._endpoints.Clear();
|
|
int num5 = 1;
|
|
if (num2 == -1 && num1 != 0)
|
|
num5 = -1;
|
|
int index1 = (int) (((double) providedInfo.position.X + (double) (width / 2) + (double) ((width / 2 - 1) * num1)) / 16.0);
|
|
int index2 = (int) (((double) providedInfo.position.Y + 0.1) / 16.0);
|
|
if (num5 == -1)
|
|
index2 = (int) (((double) providedInfo.position.Y + (double) height - 1.0) / 16.0);
|
|
int num6 = width / 16 + (width % 16 == 0 ? 0 : 1);
|
|
int num7 = height / 16 + (height % 16 == 0 ? 0 : 1);
|
|
if (num1 != 0)
|
|
{
|
|
for (int index3 = 0; index3 < num7; ++index3)
|
|
{
|
|
if (Main.tile[index1, index2 + index3 * num5] != null)
|
|
SmartCursorHelper._points.Add(new Tuple<int, int>(index1, index2 + index3 * num5));
|
|
}
|
|
}
|
|
if (num2 != 0)
|
|
{
|
|
for (int index4 = 0; index4 < num6; ++index4)
|
|
{
|
|
if (Main.tile[(int) ((double) providedInfo.position.X / 16.0) + index4, index2] != null)
|
|
SmartCursorHelper._points.Add(new Tuple<int, int>((int) ((double) providedInfo.position.X / 16.0) + index4, index2));
|
|
}
|
|
}
|
|
int index5 = (int) (((double) providedInfo.mouse.X + (double) ((width / 2 - 1) * num1)) / 16.0);
|
|
int index6 = (int) (((double) providedInfo.mouse.Y + 0.1 - (double) (height / 2 + 1)) / 16.0);
|
|
if (num5 == -1)
|
|
index6 = (int) (((double) providedInfo.mouse.Y + (double) (height / 2) - 1.0) / 16.0);
|
|
if ((double) providedInfo.player.gravDir == -1.0 && num2 == 0)
|
|
++index6;
|
|
if (index6 < 10)
|
|
index6 = 10;
|
|
if (index6 > Main.maxTilesY - 10)
|
|
index6 = Main.maxTilesY - 10;
|
|
int num8 = width / 16 + (width % 16 == 0 ? 0 : 1);
|
|
int num9 = height / 16 + (height % 16 == 0 ? 0 : 1);
|
|
if (num1 != 0)
|
|
{
|
|
for (int index7 = 0; index7 < num9; ++index7)
|
|
{
|
|
if (Main.tile[index5, index6 + index7 * num5] != null)
|
|
SmartCursorHelper._endpoints.Add(new Tuple<int, int>(index5, index6 + index7 * num5));
|
|
}
|
|
}
|
|
if (num2 != 0)
|
|
{
|
|
for (int index8 = 0; index8 < num8; ++index8)
|
|
{
|
|
if (Main.tile[(int) (((double) providedInfo.mouse.X - (double) (width / 2)) / 16.0) + index8, index6] != null)
|
|
SmartCursorHelper._endpoints.Add(new Tuple<int, int>((int) (((double) providedInfo.mouse.X - (double) (width / 2)) / 16.0) + index8, index6));
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
while (SmartCursorHelper._points.Count > 0)
|
|
{
|
|
Tuple<int, int> point = SmartCursorHelper._points[0];
|
|
Tuple<int, int> endpoint = SmartCursorHelper._endpoints[0];
|
|
Tuple<int, int> tuple = Collision.TupleHitLineWall(point.Item1, point.Item2, endpoint.Item1, endpoint.Item2);
|
|
if (tuple.Item1 == -1 || tuple.Item2 == -1)
|
|
{
|
|
SmartCursorHelper._points.Remove(point);
|
|
SmartCursorHelper._endpoints.Remove(endpoint);
|
|
}
|
|
else
|
|
{
|
|
if (tuple.Item1 != endpoint.Item1 || tuple.Item2 != endpoint.Item2)
|
|
SmartCursorHelper._targets.Add(tuple);
|
|
Tile tile = Main.tile[tuple.Item1, tuple.Item2];
|
|
if (Collision.HitWallSubstep(tuple.Item1, tuple.Item2))
|
|
SmartCursorHelper._targets.Add(tuple);
|
|
SmartCursorHelper._points.Remove(point);
|
|
SmartCursorHelper._endpoints.Remove(endpoint);
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num10 = -1f;
|
|
Tuple<int, int> tuple = (Tuple<int, int>) null;
|
|
for (int index9 = 0; index9 < SmartCursorHelper._targets.Count; ++index9)
|
|
{
|
|
if (!Main.tile[SmartCursorHelper._targets[index9].Item1, SmartCursorHelper._targets[index9].Item2].active() || Main.tile[SmartCursorHelper._targets[index9].Item1, SmartCursorHelper._targets[index9].Item2].type != (ushort) 26)
|
|
{
|
|
float num11 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index9].Item1, (float) SmartCursorHelper._targets[index9].Item2) * 16f + Vector2.One * 8f, providedInfo.Center);
|
|
if ((double) num10 == -1.0 || (double) num11 < (double) num10)
|
|
{
|
|
num10 = num11;
|
|
tuple = SmartCursorHelper._targets[index9];
|
|
}
|
|
}
|
|
}
|
|
if (tuple != null && Collision.InTileBounds(tuple.Item1, tuple.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
providedInfo.player.poundRelease = false;
|
|
focusedX = tuple.Item1;
|
|
focusedY = tuple.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
SmartCursorHelper._points.Clear();
|
|
SmartCursorHelper._endpoints.Clear();
|
|
}
|
|
if (providedInfo.item.hammer <= 0 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
if (Main.tile[reachableStartX, reachableStartY].wall > (ushort) 0 && Collision.HitWallSubstep(reachableStartX, reachableStartY))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num12 = -1f;
|
|
Tuple<int, int> tuple = (Tuple<int, int>) null;
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if (!Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2].active() || Main.tile[SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2].type != (ushort) 26)
|
|
{
|
|
float num13 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num12 == -1.0 || (double) num13 < (double) num12)
|
|
{
|
|
num12 = num13;
|
|
tuple = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (tuple != null && Collision.InTileBounds(tuple.Item1, tuple.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
providedInfo.player.poundRelease = false;
|
|
focusedX = tuple.Item1;
|
|
focusedY = tuple.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_MulticolorWrench(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 3625 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
WiresUI.Settings.MultiToolMode toolMode1 = WiresUI.Settings.ToolMode;
|
|
WiresUI.Settings.MultiToolMode multiToolMode = (WiresUI.Settings.MultiToolMode) 0;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire())
|
|
multiToolMode |= WiresUI.Settings.MultiToolMode.Red;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire2())
|
|
multiToolMode |= WiresUI.Settings.MultiToolMode.Blue;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire3())
|
|
multiToolMode |= WiresUI.Settings.MultiToolMode.Green;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire4())
|
|
multiToolMode |= WiresUI.Settings.MultiToolMode.Yellow;
|
|
int num1 = (toolMode1 & ~WiresUI.Settings.MultiToolMode.Cutter) == multiToolMode ? 1 : 0;
|
|
WiresUI.Settings.MultiToolMode toolMode2 = WiresUI.Settings.ToolMode;
|
|
if (num1 == 0)
|
|
{
|
|
bool flag1 = toolMode2.HasFlag((Enum) WiresUI.Settings.MultiToolMode.Red);
|
|
bool flag2 = toolMode2.HasFlag((Enum) WiresUI.Settings.MultiToolMode.Blue);
|
|
bool flag3 = toolMode2.HasFlag((Enum) WiresUI.Settings.MultiToolMode.Green);
|
|
bool flag4 = toolMode2.HasFlag((Enum) WiresUI.Settings.MultiToolMode.Yellow);
|
|
bool flag5 = toolMode2.HasFlag((Enum) WiresUI.Settings.MultiToolMode.Cutter);
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (flag5)
|
|
{
|
|
if (tile.wire() & flag1 || tile.wire2() & flag2 || tile.wire3() & flag3 || tile.wire4() & flag4)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
else if (tile.wire() & flag1 || tile.wire2() & flag2 || tile.wire3() & flag3 || tile.wire4() & flag4)
|
|
{
|
|
if (flag1)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (flag2)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (flag3)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (flag4)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num2 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num3 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num2 == -1.0 || (double) num3 < (double) num2)
|
|
{
|
|
num2 = num3;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_ColoredWrenches(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 509 && providedInfo.item.type != 850 && providedInfo.item.type != 851 && providedInfo.item.type != 3612 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
int num1 = 0;
|
|
if (providedInfo.item.type == 509)
|
|
num1 = 1;
|
|
if (providedInfo.item.type == 850)
|
|
num1 = 2;
|
|
if (providedInfo.item.type == 851)
|
|
num1 = 3;
|
|
if (providedInfo.item.type == 3612)
|
|
num1 = 4;
|
|
bool flag = false;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire() && num1 == 1)
|
|
flag = true;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire2() && num1 == 2)
|
|
flag = true;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire3() && num1 == 3)
|
|
flag = true;
|
|
if (Main.tile[providedInfo.screenTargetX, providedInfo.screenTargetY].wire4() && num1 == 4)
|
|
flag = true;
|
|
if (!flag)
|
|
{
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile = Main.tile[reachableStartX, reachableStartY];
|
|
if (tile.wire() && num1 == 1 || tile.wire2() && num1 == 2 || tile.wire3() && num1 == 3 || tile.wire4() && num1 == 4)
|
|
{
|
|
if (num1 == 1)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (num1 == 2)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire2())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (num1 == 3)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire3())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
if (num1 == 4)
|
|
{
|
|
if (!Main.tile[reachableStartX - 1, reachableStartY].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX - 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX + 1, reachableStartY].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX + 1, reachableStartY));
|
|
if (!Main.tile[reachableStartX, reachableStartY - 1].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY - 1));
|
|
if (!Main.tile[reachableStartX, reachableStartY + 1].wire4())
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY + 1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num2 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num3 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num2 == -1.0 || (double) num3 < (double) num2)
|
|
{
|
|
num2 = num3;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Acorns(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
if (providedInfo.item.type != 27 || focusedX != -1 || focusedY != -1 || providedInfo.reachableStartY <= 20)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY];
|
|
Tile tile2 = Main.tile[reachableStartX, reachableStartY - 1];
|
|
Tile testTile = Main.tile[reachableStartX, reachableStartY + 1];
|
|
Tile tile3 = Main.tile[reachableStartX - 1, reachableStartY];
|
|
Tile tile4 = Main.tile[reachableStartX + 1, reachableStartY];
|
|
Tile tile5 = Main.tile[reachableStartX - 2, reachableStartY];
|
|
Tile tile6 = Main.tile[reachableStartX + 2, reachableStartY];
|
|
Tile tile7 = Main.tile[reachableStartX - 3, reachableStartY];
|
|
Tile tile8 = Main.tile[reachableStartX + 3, reachableStartY];
|
|
if ((!tile1.active() || Main.tileCut[(int) tile1.type] || TileID.Sets.BreakableWhenPlacing[(int) tile1.type]) && (!tile2.active() || Main.tileCut[(int) tile2.type] || TileID.Sets.BreakableWhenPlacing[(int) tile2.type]) && (!tile3.active() || !TileID.Sets.CommonSapling[(int) tile3.type]) && (!tile4.active() || !TileID.Sets.CommonSapling[(int) tile4.type]) && (!tile5.active() || !TileID.Sets.CommonSapling[(int) tile5.type]) && (!tile6.active() || !TileID.Sets.CommonSapling[(int) tile6.type]) && (!tile7.active() || !TileID.Sets.CommonSapling[(int) tile7.type]) && (!tile8.active() || !TileID.Sets.CommonSapling[(int) tile8.type]) && testTile.active() && WorldGen.SolidTile2(testTile))
|
|
{
|
|
switch (testTile.type)
|
|
{
|
|
case 2:
|
|
case 23:
|
|
case 53:
|
|
case 109:
|
|
case 112:
|
|
case 116:
|
|
case 147:
|
|
case 199:
|
|
case 234:
|
|
case 477:
|
|
case 492:
|
|
if (tile3.liquid == (byte) 0 && tile1.liquid == (byte) 0 && tile4.liquid == (byte) 0 && WorldGen.EmptyTileCheck(reachableStartX - 2, reachableStartX + 2, reachableStartY - 20, reachableStartY, 20))
|
|
{
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
continue;
|
|
}
|
|
continue;
|
|
case 60:
|
|
if (WorldGen.EmptyTileCheck(reachableStartX - 2, reachableStartX + 2, reachableStartY - 20, reachableStartY, 20))
|
|
{
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
continue;
|
|
}
|
|
continue;
|
|
default:
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
SmartCursorHelper._toRemove.Clear();
|
|
for (int index1 = 0; index1 < SmartCursorHelper._targets.Count; ++index1)
|
|
{
|
|
bool flag = false;
|
|
for (int index2 = -1; index2 < 2; index2 += 2)
|
|
{
|
|
Tile tile = Main.tile[SmartCursorHelper._targets[index1].Item1 + index2, SmartCursorHelper._targets[index1].Item2 + 1];
|
|
if (tile.active())
|
|
{
|
|
switch (tile.type)
|
|
{
|
|
case 2:
|
|
case 23:
|
|
case 53:
|
|
case 60:
|
|
case 109:
|
|
case 112:
|
|
case 116:
|
|
case 147:
|
|
case 199:
|
|
case 234:
|
|
case 477:
|
|
case 492:
|
|
flag = true;
|
|
continue;
|
|
default:
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
if (!flag)
|
|
SmartCursorHelper._toRemove.Add(SmartCursorHelper._targets[index1]);
|
|
}
|
|
for (int index = 0; index < SmartCursorHelper._toRemove.Count; ++index)
|
|
SmartCursorHelper._targets.Remove(SmartCursorHelper._toRemove[index]);
|
|
SmartCursorHelper._toRemove.Clear();
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_GemCorns(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
WorldGen.GrowTreeSettings profile;
|
|
if (!WorldGen.GrowTreeSettings.Profiles.TryGetFromItemId(providedInfo.item.type, out profile) || focusedX != -1 || focusedY != -1 || providedInfo.reachableStartY <= 20)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int reachableStartX = providedInfo.reachableStartX; reachableStartX <= providedInfo.reachableEndX; ++reachableStartX)
|
|
{
|
|
for (int reachableStartY = providedInfo.reachableStartY; reachableStartY <= providedInfo.reachableEndY; ++reachableStartY)
|
|
{
|
|
Tile tile1 = Main.tile[reachableStartX, reachableStartY];
|
|
Tile tile2 = Main.tile[reachableStartX, reachableStartY - 1];
|
|
Tile testTile = Main.tile[reachableStartX, reachableStartY + 1];
|
|
Tile tile3 = Main.tile[reachableStartX - 1, reachableStartY];
|
|
Tile tile4 = Main.tile[reachableStartX + 1, reachableStartY];
|
|
Tile tile5 = Main.tile[reachableStartX - 2, reachableStartY];
|
|
Tile tile6 = Main.tile[reachableStartX + 2, reachableStartY];
|
|
Tile tile7 = Main.tile[reachableStartX - 3, reachableStartY];
|
|
Tile tile8 = Main.tile[reachableStartX + 3, reachableStartY];
|
|
if (profile.GroundTest((int) testTile.type) && (!tile1.active() || Main.tileCut[(int) tile1.type] || TileID.Sets.BreakableWhenPlacing[(int) tile1.type]) && (!tile2.active() || Main.tileCut[(int) tile2.type] || TileID.Sets.BreakableWhenPlacing[(int) tile2.type]) && (!tile3.active() || !TileID.Sets.CommonSapling[(int) tile3.type]) && (!tile4.active() || !TileID.Sets.CommonSapling[(int) tile4.type]) && (!tile5.active() || !TileID.Sets.CommonSapling[(int) tile5.type]) && (!tile6.active() || !TileID.Sets.CommonSapling[(int) tile6.type]) && (!tile7.active() || !TileID.Sets.CommonSapling[(int) tile7.type]) && (!tile8.active() || !TileID.Sets.CommonSapling[(int) tile8.type]) && testTile.active() && WorldGen.SolidTile2(testTile) && tile3.liquid == (byte) 0 && tile1.liquid == (byte) 0 && tile4.liquid == (byte) 0 && WorldGen.EmptyTileCheck(reachableStartX - 2, reachableStartX + 2, reachableStartY - profile.TreeHeightMax, reachableStartY, (int) profile.SaplingTileType))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(reachableStartX, reachableStartY));
|
|
}
|
|
}
|
|
SmartCursorHelper._toRemove.Clear();
|
|
for (int index1 = 0; index1 < SmartCursorHelper._targets.Count; ++index1)
|
|
{
|
|
bool flag = false;
|
|
for (int index2 = -1; index2 < 2; index2 += 2)
|
|
{
|
|
Tile tile = Main.tile[SmartCursorHelper._targets[index1].Item1 + index2, SmartCursorHelper._targets[index1].Item2 + 1];
|
|
if (tile.active() && profile.GroundTest((int) tile.type))
|
|
flag = true;
|
|
}
|
|
if (!flag)
|
|
SmartCursorHelper._toRemove.Add(SmartCursorHelper._targets[index1]);
|
|
}
|
|
for (int index = 0; index < SmartCursorHelper._toRemove.Count; ++index)
|
|
SmartCursorHelper._targets.Remove(SmartCursorHelper._toRemove[index]);
|
|
SmartCursorHelper._toRemove.Clear();
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_ForceCursorToAnyMinableThing(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
Vector2 mouse = providedInfo.mouse;
|
|
Item obj = providedInfo.item;
|
|
if (fX != -1 || fY != -1 || PlayerInput.UsingGamepad)
|
|
return;
|
|
Point tileCoordinates = mouse.ToTileCoordinates();
|
|
int x = tileCoordinates.X;
|
|
int y = tileCoordinates.Y;
|
|
if (!Collision.InTileBounds(x, y, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
return;
|
|
Tile tile = Main.tile[x, y];
|
|
bool flag = tile.active() && WorldGen.CanKillTile(x, y) && (!Main.tileSolid[(int) tile.type] || Main.tileSolidTop[(int) tile.type]);
|
|
if (flag && Main.tileAxe[(int) tile.type] && obj.axe < 1)
|
|
flag = false;
|
|
if (flag && Main.tileHammer[(int) tile.type] && obj.hammer < 1)
|
|
flag = false;
|
|
if (flag && !Main.tileHammer[(int) tile.type] && !Main.tileAxe[(int) tile.type] && obj.pick < 1)
|
|
flag = false;
|
|
if (!flag)
|
|
return;
|
|
fX = x;
|
|
fY = y;
|
|
}
|
|
|
|
private static void Step_Pickaxe_MineShinies(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
Item obj = providedInfo.item;
|
|
Vector2 mouse = providedInfo.mouse;
|
|
if (obj.pick <= 0 || fX != -1 || fY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
int num1 = obj.type == 1333 || obj.type == 523 ? 0 : (obj.type != 4384 ? 1 : 0);
|
|
int num2 = 0;
|
|
for (int index1 = reachableStartX; index1 <= reachableEndX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY; index2 <= reachableEndY; ++index2)
|
|
{
|
|
Tile tile1 = Main.tile[index1, index2];
|
|
Tile tile2 = Main.tile[index1 - 1, index2];
|
|
Tile tile3 = Main.tile[index1 + 1, index2];
|
|
Tile tile4 = Main.tile[index1, index2 + 1];
|
|
if (tile1.active())
|
|
{
|
|
int num3;
|
|
int num4 = num3 = TileID.Sets.SmartCursorPickaxePriorityOverride[(int) tile1.type];
|
|
if (num4 > 0)
|
|
{
|
|
if (num2 < num4)
|
|
num2 = num4;
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(index1, index2));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
SmartCursorHelper._targets2.Clear();
|
|
foreach (Tuple<int, int> tuple in SmartCursorHelper._targets2)
|
|
{
|
|
Tile tile = Main.tile[tuple.Item1, tuple.Item2];
|
|
if (TileID.Sets.SmartCursorPickaxePriorityOverride[(int) tile.type] < num2)
|
|
SmartCursorHelper._targets2.Add(tuple);
|
|
}
|
|
foreach (Tuple<int, int> tuple in SmartCursorHelper._targets2)
|
|
SmartCursorHelper._targets.Remove(tuple);
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num5 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num6 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, mouse);
|
|
if ((double) num5 == -1.0 || (double) num6 < (double) num5)
|
|
{
|
|
num5 = num6;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
fX = target.Item1;
|
|
fY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Pickaxe_MineSolids(
|
|
Player player,
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
List<Tuple<int, int>> grappleTargets,
|
|
ref int focusedX,
|
|
ref int focusedY)
|
|
{
|
|
int width = player.width;
|
|
int height = player.height;
|
|
int direction = player.direction;
|
|
Vector2 center = player.Center;
|
|
Vector2 position = player.position;
|
|
float gravDir = player.gravDir;
|
|
int whoAmI = player.whoAmI;
|
|
if (providedInfo.item.pick <= 0 || focusedX != -1 || focusedY != -1)
|
|
return;
|
|
if (PlayerInput.UsingGamepad)
|
|
{
|
|
Vector2 navigatorDirections = PlayerInput.Triggers.Current.GetNavigatorDirections();
|
|
Vector2 gamepadThumbstickLeft = PlayerInput.GamepadThumbstickLeft;
|
|
Vector2 gamepadThumbstickRight = PlayerInput.GamepadThumbstickRight;
|
|
Vector2 zero = Vector2.Zero;
|
|
if (navigatorDirections == zero && (double) gamepadThumbstickLeft.Length() < 0.0500000007450581 && (double) gamepadThumbstickRight.Length() < 0.0500000007450581)
|
|
providedInfo.mouse = center + new Vector2((float) (direction * 1000), 0.0f);
|
|
}
|
|
Vector2 vector2_1 = providedInfo.mouse - center;
|
|
int num1 = Math.Sign(vector2_1.X);
|
|
int num2 = Math.Sign(vector2_1.Y);
|
|
if ((double) Math.Abs(vector2_1.X) > (double) Math.Abs(vector2_1.Y) * 3.0)
|
|
{
|
|
num2 = 0;
|
|
providedInfo.mouse.Y = center.Y;
|
|
}
|
|
if ((double) Math.Abs(vector2_1.Y) > (double) Math.Abs(vector2_1.X) * 3.0)
|
|
{
|
|
num1 = 0;
|
|
providedInfo.mouse.X = center.X;
|
|
}
|
|
int num3 = (int) center.X / 16;
|
|
int num4 = (int) center.Y / 16;
|
|
SmartCursorHelper._points.Clear();
|
|
SmartCursorHelper._endpoints.Clear();
|
|
int num5 = 1;
|
|
if (num2 == -1 && num1 != 0)
|
|
num5 = -1;
|
|
int index1 = (int) (((double) position.X + (double) (width / 2) + (double) ((width / 2 - 1) * num1)) / 16.0);
|
|
int index2 = (int) (((double) position.Y + 0.1) / 16.0);
|
|
if (num5 == -1)
|
|
index2 = (int) (((double) position.Y + (double) height - 1.0) / 16.0);
|
|
int num6 = width / 16 + (width % 16 == 0 ? 0 : 1);
|
|
int num7 = height / 16 + (height % 16 == 0 ? 0 : 1);
|
|
if (num1 != 0)
|
|
{
|
|
for (int index3 = 0; index3 < num7; ++index3)
|
|
{
|
|
if (Main.tile[index1, index2 + index3 * num5] != null)
|
|
SmartCursorHelper._points.Add(new Tuple<int, int>(index1, index2 + index3 * num5));
|
|
}
|
|
}
|
|
if (num2 != 0)
|
|
{
|
|
for (int index4 = 0; index4 < num6; ++index4)
|
|
{
|
|
if (Main.tile[(int) ((double) position.X / 16.0) + index4, index2] != null)
|
|
SmartCursorHelper._points.Add(new Tuple<int, int>((int) ((double) position.X / 16.0) + index4, index2));
|
|
}
|
|
}
|
|
int x = (int) (((double) providedInfo.mouse.X + (double) ((width / 2 - 1) * num1)) / 16.0);
|
|
int y = (int) (((double) providedInfo.mouse.Y + 0.1 - (double) (height / 2 + 1)) / 16.0);
|
|
if (num5 == -1)
|
|
y = (int) (((double) providedInfo.mouse.Y + (double) (height / 2) - 1.0) / 16.0);
|
|
if ((double) gravDir == -1.0 && num2 == 0)
|
|
++y;
|
|
if (y < 10)
|
|
y = 10;
|
|
if (y > Main.maxTilesY - 10)
|
|
y = Main.maxTilesY - 10;
|
|
int num8 = width / 16 + (width % 16 == 0 ? 0 : 1);
|
|
int num9 = height / 16 + (height % 16 == 0 ? 0 : 1);
|
|
if (WorldGen.InWorld(x, y, Main.Map.BlackEdgeWidth))
|
|
{
|
|
if (num1 != 0)
|
|
{
|
|
for (int index5 = 0; index5 < num9; ++index5)
|
|
{
|
|
if (Main.tile[x, y + index5 * num5] != null)
|
|
SmartCursorHelper._endpoints.Add(new Tuple<int, int>(x, y + index5 * num5));
|
|
}
|
|
}
|
|
if (num2 != 0)
|
|
{
|
|
for (int index6 = 0; index6 < num8; ++index6)
|
|
{
|
|
if (Main.tile[(int) (((double) providedInfo.mouse.X - (double) (width / 2)) / 16.0) + index6, y] != null)
|
|
SmartCursorHelper._endpoints.Add(new Tuple<int, int>((int) (((double) providedInfo.mouse.X - (double) (width / 2)) / 16.0) + index6, y));
|
|
}
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
while (SmartCursorHelper._points.Count > 0 && SmartCursorHelper._endpoints.Count > 0)
|
|
{
|
|
Tuple<int, int> point = SmartCursorHelper._points[0];
|
|
Tuple<int, int> endpoint = SmartCursorHelper._endpoints[0];
|
|
Tuple<int, int> col;
|
|
if (!Collision.TupleHitLine(point.Item1, point.Item2, endpoint.Item1, endpoint.Item2, num1 * (int) gravDir, -num2 * (int) gravDir, grappleTargets, out col))
|
|
{
|
|
SmartCursorHelper._points.Remove(point);
|
|
SmartCursorHelper._endpoints.Remove(endpoint);
|
|
}
|
|
else
|
|
{
|
|
if (col.Item1 != endpoint.Item1 || col.Item2 != endpoint.Item2)
|
|
SmartCursorHelper._targets.Add(col);
|
|
Tile tile = Main.tile[col.Item1, col.Item2];
|
|
if (!tile.inActive() && tile.active() && Main.tileSolid[(int) tile.type] && !Main.tileSolidTop[(int) tile.type] && !grappleTargets.Contains(col))
|
|
SmartCursorHelper._targets.Add(col);
|
|
SmartCursorHelper._points.Remove(point);
|
|
SmartCursorHelper._endpoints.Remove(endpoint);
|
|
}
|
|
}
|
|
SmartCursorHelper._toRemove.Clear();
|
|
for (int index7 = 0; index7 < SmartCursorHelper._targets.Count; ++index7)
|
|
{
|
|
if (!WorldGen.CanKillTile(SmartCursorHelper._targets[index7].Item1, SmartCursorHelper._targets[index7].Item2))
|
|
SmartCursorHelper._toRemove.Add(SmartCursorHelper._targets[index7]);
|
|
}
|
|
for (int index8 = 0; index8 < SmartCursorHelper._toRemove.Count; ++index8)
|
|
SmartCursorHelper._targets.Remove(SmartCursorHelper._toRemove[index8]);
|
|
SmartCursorHelper._toRemove.Clear();
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num10 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
Vector2 vector2_2 = center;
|
|
if (Main.netMode == 1)
|
|
{
|
|
int num11 = 0;
|
|
int num12 = 0;
|
|
int num13 = 0;
|
|
for (int index9 = 0; index9 < whoAmI; ++index9)
|
|
{
|
|
Player player1 = Main.player[index9];
|
|
if (player1.active && !player1.dead && player1.HeldItem.pick > 0 && player1.itemAnimation > 0)
|
|
{
|
|
if ((double) player.Distance(player1.Center) <= 8.0)
|
|
++num11;
|
|
if ((double) player.Distance(player1.Center) <= 80.0 && (double) Math.Abs(player1.Center.Y - center.Y) <= 12.0)
|
|
++num12;
|
|
}
|
|
}
|
|
for (int index10 = whoAmI + 1; index10 < (int) byte.MaxValue; ++index10)
|
|
{
|
|
Player player2 = Main.player[index10];
|
|
if (player2.active && !player2.dead && player2.HeldItem.pick > 0 && player2.itemAnimation > 0 && (double) player.Distance(player2.Center) <= 8.0)
|
|
++num13;
|
|
}
|
|
if (num11 > 0)
|
|
{
|
|
if (num11 % 2 == 1)
|
|
vector2_2.X += 12f;
|
|
else
|
|
vector2_2.X -= 12f;
|
|
if (num12 % 2 == 1)
|
|
vector2_2.Y -= 12f;
|
|
}
|
|
if (num13 > 0 && num11 == 0)
|
|
{
|
|
if (num13 % 2 == 1)
|
|
vector2_2.X -= 12f;
|
|
else
|
|
vector2_2.X += 12f;
|
|
}
|
|
}
|
|
for (int index11 = 0; index11 < SmartCursorHelper._targets.Count; ++index11)
|
|
{
|
|
float num14 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index11].Item1, (float) SmartCursorHelper._targets[index11].Item2) * 16f + Vector2.One * 8f, vector2_2);
|
|
if ((double) num10 == -1.0 || (double) num14 < (double) num10)
|
|
{
|
|
num10 = num14;
|
|
target = SmartCursorHelper._targets[index11];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, providedInfo.reachableStartX, providedInfo.reachableStartY, providedInfo.reachableEndX, providedInfo.reachableEndY))
|
|
{
|
|
focusedX = target.Item1;
|
|
focusedY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._points.Clear();
|
|
SmartCursorHelper._endpoints.Clear();
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Axe(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
if (providedInfo.item.axe <= 0 || fX != -1 || fY != -1)
|
|
return;
|
|
float num1 = -1f;
|
|
for (int index1 = reachableStartX; index1 <= reachableEndX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY; index2 <= reachableEndY; ++index2)
|
|
{
|
|
if (Main.tile[index1, index2].active())
|
|
{
|
|
Tile tile = Main.tile[index1, index2];
|
|
if (Main.tileAxe[(int) tile.type] && !TileID.Sets.IgnoreSmartCursorPriorityAxe[(int) tile.type])
|
|
{
|
|
int x = index1;
|
|
int y = index2;
|
|
int type = (int) tile.type;
|
|
if (TileID.Sets.IsATreeTrunk[type])
|
|
{
|
|
if (Collision.InTileBounds(x + 1, y, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
if (Main.tile[x, y].frameY >= (short) 198 && Main.tile[x, y].frameX == (short) 44)
|
|
++x;
|
|
if (Main.tile[x, y].frameX == (short) 66 && Main.tile[x, y].frameY <= (short) 44)
|
|
++x;
|
|
if (Main.tile[x, y].frameX == (short) 44 && Main.tile[x, y].frameY >= (short) 132 && Main.tile[x, y].frameY <= (short) 176)
|
|
++x;
|
|
}
|
|
if (Collision.InTileBounds(x - 1, y, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
if (Main.tile[x, y].frameY >= (short) 198 && Main.tile[x, y].frameX == (short) 66)
|
|
--x;
|
|
if (Main.tile[x, y].frameX == (short) 88 && Main.tile[x, y].frameY >= (short) 66 && Main.tile[x, y].frameY <= (short) 110)
|
|
--x;
|
|
if (Main.tile[x, y].frameX == (short) 22 && Main.tile[x, y].frameY >= (short) 132 && Main.tile[x, y].frameY <= (short) 176)
|
|
--x;
|
|
}
|
|
while (Main.tile[x, y].active() && (int) Main.tile[x, y].type == type && (int) Main.tile[x, y + 1].type == type && Collision.InTileBounds(x, y + 1, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
++y;
|
|
}
|
|
if (tile.type == (ushort) 80)
|
|
{
|
|
if (Collision.InTileBounds(x + 1, y, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
if (Main.tile[x, y].frameX == (short) 54)
|
|
++x;
|
|
if (Main.tile[x, y].frameX == (short) 108 && Main.tile[x, y].frameY == (short) 36)
|
|
++x;
|
|
}
|
|
if (Collision.InTileBounds(x - 1, y, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
if (Main.tile[x, y].frameX == (short) 36)
|
|
--x;
|
|
if (Main.tile[x, y].frameX == (short) 108 && Main.tile[x, y].frameY == (short) 18)
|
|
--x;
|
|
}
|
|
while (Main.tile[x, y].active() && Main.tile[x, y].type == (ushort) 80 && Main.tile[x, y + 1].type == (ushort) 80 && Collision.InTileBounds(x, y + 1, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
++y;
|
|
}
|
|
if (tile.type == (ushort) 323 || tile.type == (ushort) 72)
|
|
{
|
|
while (Main.tile[x, y].active() && (Main.tile[x, y].type == (ushort) 323 && Main.tile[x, y + 1].type == (ushort) 323 || Main.tile[x, y].type == (ushort) 72 && Main.tile[x, y + 1].type == (ushort) 72) && Collision.InTileBounds(x, y + 1, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
++y;
|
|
}
|
|
float num2 = Vector2.Distance(new Vector2((float) x, (float) y) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
fX = x;
|
|
fY = y;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void Step_BlocksFilling(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
if (!Player.SmartCursorSettings.SmartBlocksEnabled)
|
|
return;
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
if (Player.SmartCursorSettings.SmartBlocksEnabled || providedInfo.item.createTile <= -1 || providedInfo.item.type == 213 || !Main.tileSolid[providedInfo.item.createTile] || Main.tileSolidTop[providedInfo.item.createTile] || Main.tileFrameImportant[providedInfo.item.createTile] || fX != -1 || fY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag1 = false;
|
|
if (Main.tile[screenTargetX, screenTargetY].active())
|
|
flag1 = true;
|
|
if (!Collision.InTileBounds(screenTargetX, screenTargetY, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
flag1 = true;
|
|
if (!flag1)
|
|
{
|
|
for (int index1 = reachableStartX; index1 <= reachableEndX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY; index2 <= reachableEndY; ++index2)
|
|
{
|
|
Tile tile = Main.tile[index1, index2];
|
|
if (!tile.active() || Main.tileCut[(int) tile.type] || TileID.Sets.BreakableWhenPlacing[(int) tile.type])
|
|
{
|
|
int num = 0;
|
|
if (Main.tile[index1 - 1, index2].active() && Main.tileSolid[(int) Main.tile[index1 - 1, index2].type] && !Main.tileSolidTop[(int) Main.tile[index1 - 1, index2].type])
|
|
++num;
|
|
if (Main.tile[index1 + 1, index2].active() && Main.tileSolid[(int) Main.tile[index1 + 1, index2].type] && !Main.tileSolidTop[(int) Main.tile[index1 + 1, index2].type])
|
|
++num;
|
|
if (Main.tile[index1, index2 - 1].active() && Main.tileSolid[(int) Main.tile[index1, index2 - 1].type] && !Main.tileSolidTop[(int) Main.tile[index1, index2 - 1].type])
|
|
++num;
|
|
if (Main.tile[index1, index2 + 1].active() && Main.tileSolid[(int) Main.tile[index1, index2 + 1].type] && !Main.tileSolidTop[(int) Main.tile[index1, index2 + 1].type])
|
|
++num;
|
|
if (num >= 2)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(index1, index2));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
float num2 = float.PositiveInfinity;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
if (Collision.EmptyTile(SmartCursorHelper._targets[index].Item1, SmartCursorHelper._targets[index].Item2, true))
|
|
{
|
|
Vector2 vector2 = new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f - providedInfo.mouse;
|
|
bool flag2 = false;
|
|
float num3 = Math.Abs(vector2.X);
|
|
float num4 = vector2.Length();
|
|
if ((double) num3 < (double) num2)
|
|
flag2 = true;
|
|
if ((double) num3 == (double) num2 && ((double) num1 == -1.0 || (double) num4 < (double) num1))
|
|
flag2 = true;
|
|
if (flag2)
|
|
{
|
|
num1 = num4;
|
|
num2 = num3;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, reachableStartX, reachableStartY, reachableEndX, reachableEndY) && (double) num1 != -1.0)
|
|
{
|
|
fX = target.Item1;
|
|
fY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_Torch(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
if (providedInfo.item.createTile != 4 || fX != -1 || fY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
bool flag1 = providedInfo.item.type != 1333 && providedInfo.item.type != 523 && providedInfo.item.type != 4384;
|
|
for (int index1 = reachableStartX; index1 <= reachableEndX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY; index2 <= reachableEndY; ++index2)
|
|
{
|
|
Tile tile1 = Main.tile[index1, index2];
|
|
Tile tile2 = Main.tile[index1 - 1, index2];
|
|
Tile tile3 = Main.tile[index1 + 1, index2];
|
|
Tile tile4 = Main.tile[index1, index2 + 1];
|
|
if (!tile1.active() || TileID.Sets.BreakableWhenPlacing[(int) tile1.type] || Main.tileCut[(int) tile1.type] && tile1.type != (ushort) 82 && tile1.type != (ushort) 83)
|
|
{
|
|
bool flag2 = false;
|
|
for (int index3 = index1 - 8; index3 <= index1 + 8; ++index3)
|
|
{
|
|
for (int index4 = index2 - 8; index4 <= index2 + 8; ++index4)
|
|
{
|
|
if (Main.tile[index3, index4] != null && Main.tile[index3, index4].type == (ushort) 4)
|
|
{
|
|
flag2 = true;
|
|
break;
|
|
}
|
|
}
|
|
if (flag2)
|
|
break;
|
|
}
|
|
if (!flag2 && (!flag1 || tile1.liquid <= (byte) 0) && (tile1.wall > (ushort) 0 || tile2.active() && (tile2.slope() == (byte) 0 || (int) tile2.slope() % 2 != 1) && (Main.tileSolid[(int) tile2.type] && !Main.tileNoAttach[(int) tile2.type] && !Main.tileSolidTop[(int) tile2.type] && !TileID.Sets.NotReallySolid[(int) tile2.type] || TileID.Sets.IsBeam[(int) tile2.type] || WorldGen.IsTreeType((int) tile2.type) && WorldGen.IsTreeType((int) Main.tile[index1 - 1, index2 - 1].type) && WorldGen.IsTreeType((int) Main.tile[index1 - 1, index2 + 1].type)) || tile3.active() && (tile3.slope() == (byte) 0 || (int) tile3.slope() % 2 != 0) && (Main.tileSolid[(int) tile3.type] && !Main.tileNoAttach[(int) tile3.type] && !Main.tileSolidTop[(int) tile3.type] && !TileID.Sets.NotReallySolid[(int) tile3.type] || TileID.Sets.IsBeam[(int) tile3.type] || WorldGen.IsTreeType((int) tile3.type) && WorldGen.IsTreeType((int) Main.tile[index1 + 1, index2 - 1].type) && WorldGen.IsTreeType((int) Main.tile[index1 + 1, index2 + 1].type)) || tile4.active() && Main.tileSolid[(int) tile4.type] && !Main.tileNoAttach[(int) tile4.type] && (!Main.tileSolidTop[(int) tile4.type] || TileID.Sets.Platforms[(int) tile4.type] && tile4.slope() == (byte) 0) && !TileID.Sets.NotReallySolid[(int) tile4.type] && !tile4.halfBrick() && tile4.slope() == (byte) 0) && tile1.type != (ushort) 4)
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(index1, index2));
|
|
}
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
fX = target.Item1;
|
|
fY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private static void Step_LawnMower(
|
|
SmartCursorHelper.SmartCursorUsageInfo providedInfo,
|
|
ref int fX,
|
|
ref int fY)
|
|
{
|
|
int reachableStartX = providedInfo.reachableStartX;
|
|
int reachableStartY = providedInfo.reachableStartY;
|
|
int reachableEndX = providedInfo.reachableEndX;
|
|
int reachableEndY = providedInfo.reachableEndY;
|
|
int screenTargetX = providedInfo.screenTargetX;
|
|
int screenTargetY = providedInfo.screenTargetY;
|
|
if (providedInfo.item.type != 4049 || fX != -1 || fY != -1)
|
|
return;
|
|
SmartCursorHelper._targets.Clear();
|
|
for (int index1 = reachableStartX; index1 <= reachableEndX; ++index1)
|
|
{
|
|
for (int index2 = reachableStartY; index2 <= reachableEndY; ++index2)
|
|
{
|
|
Tile tile = Main.tile[index1, index2];
|
|
if (tile.active() && (tile.type == (ushort) 2 || tile.type == (ushort) 109))
|
|
SmartCursorHelper._targets.Add(new Tuple<int, int>(index1, index2));
|
|
}
|
|
}
|
|
if (SmartCursorHelper._targets.Count > 0)
|
|
{
|
|
float num1 = -1f;
|
|
Tuple<int, int> target = SmartCursorHelper._targets[0];
|
|
for (int index = 0; index < SmartCursorHelper._targets.Count; ++index)
|
|
{
|
|
float num2 = Vector2.Distance(new Vector2((float) SmartCursorHelper._targets[index].Item1, (float) SmartCursorHelper._targets[index].Item2) * 16f + Vector2.One * 8f, providedInfo.mouse);
|
|
if ((double) num1 == -1.0 || (double) num2 < (double) num1)
|
|
{
|
|
num1 = num2;
|
|
target = SmartCursorHelper._targets[index];
|
|
}
|
|
}
|
|
if (Collision.InTileBounds(target.Item1, target.Item2, reachableStartX, reachableStartY, reachableEndX, reachableEndY))
|
|
{
|
|
fX = target.Item1;
|
|
fY = target.Item2;
|
|
}
|
|
}
|
|
SmartCursorHelper._targets.Clear();
|
|
}
|
|
|
|
private class SmartCursorUsageInfo
|
|
{
|
|
public Player player;
|
|
public Item item;
|
|
public Vector2 mouse;
|
|
public Vector2 position;
|
|
public Vector2 Center;
|
|
public int screenTargetX;
|
|
public int screenTargetY;
|
|
public int reachableStartX;
|
|
public int reachableEndX;
|
|
public int reachableStartY;
|
|
public int reachableEndY;
|
|
public int paintLookup;
|
|
}
|
|
}
|
|
}
|