Terraria.Player.SmartCursorLookup C# (CSharp) Method

SmartCursorLookup() public method

public SmartCursorLookup ( ) : void
return void
        public void SmartCursorLookup()
        {
            if (this.whoAmI != Main.myPlayer)
                return;
            Main.smartDigShowing = false;
            if (!Main.smartDigEnabled)
                return;
            Item obj = this.inventory[this.selectedItem];
            Vector2 vector2_1 = Main.screenPosition + new Vector2((float)Main.mouseX, (float)Main.mouseY);
            if ((double)this.gravDir == -1.0)
                vector2_1.Y = Main.screenPosition.Y + (float)Main.screenHeight - (float)Main.mouseY;
            int x1 = Player.tileTargetX;
            int y1 = Player.tileTargetY;
            if (x1 < 10)
                x1 = 10;
            if (x1 > Main.maxTilesX - 10)
                x1 = Main.maxTilesX - 10;
            if (y1 < 10)
                y1 = 10;
            if (y1 > Main.maxTilesY - 10)
                y1 = Main.maxTilesY - 10;
            bool flag1 = false;
            if (Main.tile[x1, y1] == null)
                return;
            if (Main.tile[x1, y1].active())
            {
                ushort num = Main.tile[x1, y1].type;
                if ((uint)num <= 132U)
                {
                    if ((uint)num <= 55U)
                    {
                        if ((uint)num <= 21U)
                        {
                            switch (num)
                            {
                                case (ushort)4:
                                case (ushort)10:
                                case (ushort)11:
                                case (ushort)13:
                                case (ushort)21:
                                    break;
                                default:
                                    goto label_45;
                            }
                        }
                        else if ((uint)num <= 33U)
                        {
                            if ((int)num != 29 && (int)num != 33)
                                goto label_45;
                        }
                        else
                        {
                            switch (num)
                            {
                                case (ushort)49:
                                case (ushort)50:
                                case (ushort)55:
                                    break;
                                default:
                                    goto label_45;
                            }
                        }
                    }
                    else if ((uint)num <= 88U)
                    {
                        if ((int)num != 79 && (int)num != 85 && (int)num != 88)
                            goto label_45;
                    }
                    else if ((uint)num <= 104U)
                    {
                        if ((int)num != 97 && (int)num != 104)
                            goto label_45;
                    }
                    else if ((int)num != 125 && (int)num != 132)
                        goto label_45;
                }
                else if ((uint)num <= 216U)
                {
                    if ((uint)num <= 144U)
                    {
                        if ((int)num != 136 && (int)num != 139 && (int)num != 144)
                            goto label_45;
                    }
                    else if ((uint)num <= 209U)
                    {
                        switch (num)
                        {
                            case (ushort)174:
                            case (ushort)207:
                            case (ushort)209:
                                break;
                            default:
                                goto label_45;
                        }
                    }
                    else if ((int)num != 212 && (int)num != 216)
                        goto label_45;
                }
                else if ((uint)num <= 314U)
                {
                    if ((uint)num <= 237U)
                    {
                        if ((int)num != 219 && (int)num != 237)
                            goto label_45;
                    }
                    else if ((int)num != 287)
                    {
                        if ((int)num == 314 && (double)this.gravDir == 1.0)
                        {
                            flag1 = true;
                            goto label_45;
                        }
                        else
                            goto label_45;
                    }
                }
                else if ((uint)num <= 354U)
                {
                    switch (num)
                    {
                        case (ushort)334:
                        case (ushort)335:
                        case (ushort)338:
                        case (ushort)354:
                            break;
                        default:
                            goto label_45;
                    }
                }
                else
                {
                    switch (num)
                    {
                        case (ushort)386:
                        case (ushort)387:
                        case (ushort)411:
                            break;
                        default:
                            goto label_45;
                    }
                }
                flag1 = true;
            }
        label_45:
            int num1 = obj.tileBoost;
            int num2 = 0;
            if (obj.itemId == 1071 || obj.itemId == 1543 || (obj.itemId == 1072 || obj.itemId == 1544))
            {
                for (int index = 0; index < 58; ++index)
                {
                    if (this.inventory[index].stack > 0 && (int)this.inventory[index].paint > 0)
                    {
                        num2 = (int)this.inventory[index].paint;
                        break;
                    }
                }
            }
            int lx = (int)((double)this.position.X / 16.0) - Player.tileRangeX - num1 + 1;
            int hx = (int)(((double)this.position.X + (double)this.width) / 16.0) + Player.tileRangeX + num1 - 1;
            int ly = (int)((double)this.position.Y / 16.0) - Player.tileRangeY - num1 + 1;
            int hy = (int)(((double)this.position.Y + (double)this.height) / 16.0) + Player.tileRangeY + num1 - 2;
            if (lx < 10)
                lx = 10;
            if (hx > Main.maxTilesX - 10)
                hx = Main.maxTilesX - 10;
            if (ly < 10)
                ly = 10;
            if (hy > Main.maxTilesY - 10)
                hy = Main.maxTilesY - 10;
            if (flag1 && x1 >= lx && (x1 <= hx && y1 >= ly) && y1 <= hy)
                return;
            List<Tuple<int, int>> ignoreTargets = new List<Tuple<int, int>>();
            for (int index = 0; index < this.grapCount; ++index)
            {
                Projectile projectile = Main.projectile[this.grappling[index]];
                int num3 = (int)projectile.Center.X / 16;
                int num4 = (int)projectile.Center.Y / 16;
                ignoreTargets.Add(new Tuple<int, int>(num3, num4));
            }
            int num5 = -1;
            int num6 = -1;
            if (obj.axe > 0 && num5 == -1 && num6 == -1)
            {
                float num3 = -1f;
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        if (Main.tile[index1, index2].active())
                        {
                            Tile tile = Main.tile[index1, index2];
                            if (Main.tileAxe[(int)tile.type])
                            {
                                int x2 = index1;
                                int y2 = index2;
                                if ((int)tile.type == 5)
                                {
                                    if (Collision.InTileBounds(x2 + 1, y2, lx, ly, hx, hy))
                                    {
                                        if ((int)Main.tile[x2, y2].frameY >= 198 && (int)Main.tile[x2, y2].frameX == 44)
                                            ++x2;
                                        if ((int)Main.tile[x2, y2].frameX == 66 && (int)Main.tile[x2, y2].frameY <= 44)
                                            ++x2;
                                        if ((int)Main.tile[x2, y2].frameX == 44 && (int)Main.tile[x2, y2].frameY >= 132 && (int)Main.tile[x2, y2].frameY <= 176)
                                            ++x2;
                                    }
                                    if (Collision.InTileBounds(x2 - 1, y2, lx, ly, hx, hy))
                                    {
                                        if ((int)Main.tile[x2, y2].frameY >= 198 && (int)Main.tile[x2, y2].frameX == 66)
                                            --x2;
                                        if ((int)Main.tile[x2, y2].frameX == 88 && (int)Main.tile[x2, y2].frameY >= 66 && (int)Main.tile[x2, y2].frameY <= 110)
                                            --x2;
                                        if ((int)Main.tile[x2, y2].frameX == 22 && (int)Main.tile[x2, y2].frameY >= 132 && (int)Main.tile[x2, y2].frameY <= 176)
                                            --x2;
                                    }
                                    while (Main.tile[x2, y2].active() && (int)Main.tile[x2, y2].type == 5 && ((int)Main.tile[x2, y2 + 1].type == 5 && Collision.InTileBounds(x2, y2 + 1, lx, ly, hx, hy)))
                                        ++y2;
                                }
                                if ((int)tile.type == 80)
                                {
                                    if (Collision.InTileBounds(x2 + 1, y2, lx, ly, hx, hy))
                                    {
                                        if ((int)Main.tile[x2, y2].frameX == 54)
                                            ++x2;
                                        if ((int)Main.tile[x2, y2].frameX == 108 && (int)Main.tile[x2, y2].frameY == 36)
                                            ++x2;
                                    }
                                    if (Collision.InTileBounds(x2 - 1, y2, lx, ly, hx, hy))
                                    {
                                        if ((int)Main.tile[x2, y2].frameX == 36)
                                            --x2;
                                        if ((int)Main.tile[x2, y2].frameX == 108 && (int)Main.tile[x2, y2].frameY == 18)
                                            --x2;
                                    }
                                    while (Main.tile[x2, y2].active() && (int)Main.tile[x2, y2].type == 80 && ((int)Main.tile[x2, y2 + 1].type == 80 && Collision.InTileBounds(x2, y2 + 1, lx, ly, hx, hy)))
                                        ++y2;
                                }
                                if ((int)tile.type == 323 || (int)tile.type == 72)
                                {
                                    while (Main.tile[x2, y2].active() && ((int)Main.tile[x2, y2].type == 323 && (int)Main.tile[x2, y2 + 1].type == 323 || (int)Main.tile[x2, y2].type == 72 && (int)Main.tile[x2, y2 + 1].type == 72) && Collision.InTileBounds(x2, y2 + 1, lx, ly, hx, hy))
                                        ++y2;
                                }
                                float num4 = Vector2.Distance(new Vector2((float)x2, (float)y2) * 16f + Vector2.One * 8f, vector2_1);
                                if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                                {
                                    num3 = num4;
                                    num5 = x2;
                                    num6 = y2;
                                }
                            }
                        }
                    }
                }
            }
            if (obj.pick > 0 && num5 == -1 && num6 == -1)
            {
                Vector2 vector2_2 = vector2_1 - this.Center;
                int num3 = Math.Sign(vector2_2.X);
                int num4 = Math.Sign(vector2_2.Y);
                if ((double)Math.Abs(vector2_2.X) > (double)Math.Abs(vector2_2.Y) * 3.0)
                {
                    num4 = 0;
                    vector2_1.Y = this.Center.Y;
                }
                if ((double)Math.Abs(vector2_2.Y) > (double)Math.Abs(vector2_2.X) * 3.0)
                {
                    num3 = 0;
                    vector2_1.X = this.Center.X;
                }
                int num7 = (int)this.Center.X / 16;
                int num8 = (int)this.Center.Y / 16;
                List<Tuple<int, int>> list1 = new List<Tuple<int, int>>();
                List<Tuple<int, int>> list2 = new List<Tuple<int, int>>();
                int num9 = 1;
                if (num4 == -1 && num3 != 0)
                    num9 = -1;
                int index1 = (int)(((double)this.position.X + (double)(this.width / 2) + (double)((this.width / 2 - 1) * num3)) / 16.0);
                int index2 = (int)(((double)this.position.Y + 0.1) / 16.0);
                if (num9 == -1)
                    index2 = (int)(((double)this.position.Y + (double)this.height - 1.0) / 16.0);
                int num10 = this.width / 16 + (this.width % 16 == 0 ? 0 : 1);
                int num11 = this.height / 16 + (this.height % 16 == 0 ? 0 : 1);
                if (num3 != 0)
                {
                    for (int index3 = 0; index3 < num11; ++index3)
                    {
                        if (Main.tile[index1, index2 + index3 * num9] == null)
                            return;
                        list1.Add(new Tuple<int, int>(index1, index2 + index3 * num9));
                    }
                }
                if (num4 != 0)
                {
                    for (int index3 = 0; index3 < num10; ++index3)
                    {
                        if (Main.tile[(int)((double)this.position.X / 16.0) + index3, index2] == null)
                            return;
                        list1.Add(new Tuple<int, int>((int)((double)this.position.X / 16.0) + index3, index2));
                    }
                }
                int index4 = (int)(((double)vector2_1.X + (double)((this.width / 2 - 1) * num3)) / 16.0);
                int index5 = (int)(((double)vector2_1.Y + 0.1 - (double)(this.height / 2 + 1)) / 16.0);
                if (num9 == -1)
                    index5 = (int)(((double)vector2_1.Y + (double)(this.height / 2) - 1.0) / 16.0);
                if ((double)this.gravDir == -1.0 && num4 == 0)
                    ++index5;
                if (index5 < 10)
                    index5 = 10;
                if (index5 > Main.maxTilesY - 10)
                    index5 = Main.maxTilesY - 10;
                int num12 = this.width / 16 + (this.width % 16 == 0 ? 0 : 1);
                int num13 = this.height / 16 + (this.height % 16 == 0 ? 0 : 1);
                if (num3 != 0)
                {
                    for (int index3 = 0; index3 < num13; ++index3)
                    {
                        if (Main.tile[index4, index5 + index3 * num9] == null)
                            return;
                        list2.Add(new Tuple<int, int>(index4, index5 + index3 * num9));
                    }
                }
                if (num4 != 0)
                {
                    for (int index3 = 0; index3 < num12; ++index3)
                    {
                        if (Main.tile[(int)(((double)vector2_1.X - (double)(this.width / 2)) / 16.0) + index3, index5] == null)
                            return;
                        list2.Add(new Tuple<int, int>((int)(((double)vector2_1.X - (double)(this.width / 2)) / 16.0) + index3, index5));
                    }
                }
                List<Tuple<int, int>> list3 = new List<Tuple<int, int>>();
                while (list1.Count > 0)
                {
                    Tuple<int, int> tuple1 = list1[0];
                    Tuple<int, int> tuple2 = list2[0];
                    Tuple<int, int> col;
                    if (!Collision.TupleHitLine(tuple1.Item1, tuple1.Item2, tuple2.Item1, tuple2.Item2, num3 * (int)this.gravDir, -num4 * (int)this.gravDir, ignoreTargets, out col))
                    {
                        list1.Remove(tuple1);
                        list2.Remove(tuple2);
                    }
                    else
                    {
                        if (col.Item1 != tuple2.Item1 || col.Item2 != tuple2.Item2)
                            list3.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]) && !ignoreTargets.Contains(col))
                            list3.Add(col);
                        list1.Remove(tuple1);
                        list2.Remove(tuple2);
                    }
                }
                List<Tuple<int, int>> list4 = new List<Tuple<int, int>>();
                for (int index3 = 0; index3 < list3.Count; ++index3)
                {
                    if (!WorldGen.CanKillTile(list3[index3].Item1, list3[index3].Item2))
                        list4.Add(list3[index3]);
                }
                for (int index3 = 0; index3 < list4.Count; ++index3)
                    list3.Remove(list4[index3]);
                list4.Clear();
                if (list3.Count > 0)
                {
                    float num14 = -1f;
                    Tuple<int, int> tuple = list3[0];
                    for (int index3 = 0; index3 < list3.Count; ++index3)
                    {
                        float num15 = Vector2.Distance(new Vector2((float)list3[index3].Item1, (float)list3[index3].Item2) * 16f + Vector2.One * 8f, this.Center);
                        if ((double)num14 == -1.0 || (double)num15 < (double)num14)
                        {
                            num14 = num15;
                            tuple = list3[index3];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list1.Clear();
                list2.Clear();
                list3.Clear();
            }
            if ((obj.itemId == 509 || obj.itemId == 850 || obj.itemId == 851) && (num5 == -1 && num6 == -1))
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
				var flag = k_WireFlags.WIRE_NONE;
				if (obj.itemId == 509)
					flag = k_WireFlags.WIRE_RED;
				if (obj.itemId == 850)
					flag = k_WireFlags.WIRE_GREEN;
				if (obj.itemId == 851)
					flag = k_WireFlags.WIRE_BLUE;

				if (flag != k_WireFlags.WIRE_NONE && !Main.tile[x1, y1].k_HasWireFlags(flag))
                {
					var directions = new int[][] { new int[] { 0, -1 }, new int[] { 0, 1 }, new int[] { -1, 0 }, new int[] { 1, 0 } };
					for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile = Main.tile[index1, index2];
							if (tile.k_HasWireFlags(flag))
							{
								for (int index3 = 0; index3 < 4; ++index3)
								{
									int i3x = index1 + directions[index3][0];
									int i3y = index2 + directions[index3][1];
									if (!Main.tile[i3x, i3y].k_HasWireFlags(flag))
										list.Add(new Tuple<int, int>(i3x, i3y));
								}
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num4 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num7 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num4 == -1.0 || (double)num7 < (double)num4)
                        {
                            num4 = num7;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.hammer > 0 && num5 == -1 && num6 == -1)
            {
                Vector2 vector2_2 = vector2_1 - this.Center;
                int num3 = Math.Sign(vector2_2.X);
                int num4 = Math.Sign(vector2_2.Y);
                if ((double)Math.Abs(vector2_2.X) > (double)Math.Abs(vector2_2.Y) * 3.0)
                {
                    num4 = 0;
                    vector2_1.Y = this.Center.Y;
                }
                if ((double)Math.Abs(vector2_2.Y) > (double)Math.Abs(vector2_2.X) * 3.0)
                {
                    num3 = 0;
                    vector2_1.X = this.Center.X;
                }
                int num7 = (int)this.Center.X / 16;
                int num8 = (int)this.Center.Y / 16;
                List<Tuple<int, int>> list1 = new List<Tuple<int, int>>();
                List<Tuple<int, int>> list2 = new List<Tuple<int, int>>();
                int num9 = 1;
                if (num4 == -1 && num3 != 0)
                    num9 = -1;
                int index1 = (int)(((double)this.position.X + (double)(this.width / 2) + (double)((this.width / 2 - 1) * num3)) / 16.0);
                int index2 = (int)(((double)this.position.Y + 0.1) / 16.0);
                if (num9 == -1)
                    index2 = (int)(((double)this.position.Y + (double)this.height - 1.0) / 16.0);
                int num10 = this.width / 16 + (this.width % 16 == 0 ? 0 : 1);
                int num11 = this.height / 16 + (this.height % 16 == 0 ? 0 : 1);
                if (num3 != 0)
                {
                    for (int index3 = 0; index3 < num11; ++index3)
                    {
                        if (Main.tile[index1, index2 + index3 * num9] == null)
                            return;
                        list1.Add(new Tuple<int, int>(index1, index2 + index3 * num9));
                    }
                }
                if (num4 != 0)
                {
                    for (int index3 = 0; index3 < num10; ++index3)
                    {
                        if (Main.tile[(int)((double)this.position.X / 16.0) + index3, index2] == null)
                            return;
                        list1.Add(new Tuple<int, int>((int)((double)this.position.X / 16.0) + index3, index2));
                    }
                }
                int index4 = (int)(((double)vector2_1.X + (double)((this.width / 2 - 1) * num3)) / 16.0);
                int index5 = (int)(((double)vector2_1.Y + 0.1 - (double)(this.height / 2 + 1)) / 16.0);
                if (num9 == -1)
                    index5 = (int)(((double)vector2_1.Y + (double)(this.height / 2) - 1.0) / 16.0);
                if ((double)this.gravDir == -1.0 && num4 == 0)
                    ++index5;
                if (index5 < 10)
                    index5 = 10;
                if (index5 > Main.maxTilesY - 10)
                    index5 = Main.maxTilesY - 10;
                int num12 = this.width / 16 + (this.width % 16 == 0 ? 0 : 1);
                int num13 = this.height / 16 + (this.height % 16 == 0 ? 0 : 1);
                if (num3 != 0)
                {
                    for (int index3 = 0; index3 < num13; ++index3)
                    {
                        if (Main.tile[index4, index5 + index3 * num9] == null)
                            return;
                        list2.Add(new Tuple<int, int>(index4, index5 + index3 * num9));
                    }
                }
                if (num4 != 0)
                {
                    for (int index3 = 0; index3 < num12; ++index3)
                    {
                        if (Main.tile[(int)(((double)vector2_1.X - (double)(this.width / 2)) / 16.0) + index3, index5] == null)
                            return;
                        list2.Add(new Tuple<int, int>((int)(((double)vector2_1.X - (double)(this.width / 2)) / 16.0) + index3, index5));
                    }
                }
                List<Tuple<int, int>> list3 = new List<Tuple<int, int>>();
                while (list1.Count > 0)
                {
                    Tuple<int, int> tuple1 = list1[0];
                    Tuple<int, int> tuple2 = list2[0];
                    Tuple<int, int> tuple3 = Collision.TupleHitLineWall(tuple1.Item1, tuple1.Item2, tuple2.Item1, tuple2.Item2);
                    if (tuple3.Item1 == -1 || tuple3.Item2 == -1)
                    {
                        list1.Remove(tuple1);
                        list2.Remove(tuple2);
                    }
                    else
                    {
                        if (tuple3.Item1 != tuple2.Item1 || tuple3.Item2 != tuple2.Item2)
                            list3.Add(tuple3);
                        Tile tile = Main.tile[tuple3.Item1, tuple3.Item2];
                        if (Collision.HitWallSubstep(tuple3.Item1, tuple3.Item2))
                            list3.Add(tuple3);
                        list1.Remove(tuple1);
                        list2.Remove(tuple2);
                    }
                }
                if (list3.Count > 0)
                {
                    float num14 = -1f;
                    Tuple<int, int> tuple = list3[0];
                    for (int index3 = 0; index3 < list3.Count; ++index3)
                    {
                        float num15 = Vector2.Distance(new Vector2((float)list3[index3].Item1, (float)list3[index3].Item2) * 16f + Vector2.One * 8f, this.Center);
                        if ((double)num14 == -1.0 || (double)num15 < (double)num14)
                        {
                            num14 = num15;
                            tuple = list3[index3];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        this.poundRelease = false;
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list3.Clear();
                list1.Clear();
                list2.Clear();
            }
            if (obj.hammer > 0 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int x2 = lx; x2 <= hx; ++x2)
                {
                    for (int y2 = ly; y2 <= hy; ++y2)
                    {
                        if ((int)Main.tile[x2, y2].wall > 0 && Collision.HitWallSubstep(x2, y2))
                            list.Add(new Tuple<int, int>(x2, y2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        this.poundRelease = false;
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.itemId == 510 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if (tile.k_wireFlags != k_WireFlags.WIRE_NONE)
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.createTile == 19 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active() && (int)Main.tile[x1, y1].type == 19)
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile1 = Main.tile[index1, index2];
                            if (tile1.active() && (int)tile1.type == 19)
                            {
                                int num3 = (int)tile1.slope();
                                if (num3 != 2 && !Main.tile[index1 - 1, index2 - 1].active())
                                    list.Add(new Tuple<int, int>(index1 - 1, index2 - 1));
                                if (!Main.tile[index1 - 1, index2].active())
                                    list.Add(new Tuple<int, int>(index1 - 1, index2));
                                if (num3 != 1 && !Main.tile[index1 - 1, index2 + 1].active())
                                    list.Add(new Tuple<int, int>(index1 - 1, index2 + 1));
                                if (num3 != 1 && !Main.tile[index1 + 1, index2 - 1].active())
                                    list.Add(new Tuple<int, int>(index1 + 1, index2 - 1));
                                if (!Main.tile[index1 + 1, index2].active())
                                    list.Add(new Tuple<int, int>(index1 + 1, index2));
                                if (num3 != 2 && !Main.tile[index1 + 1, index2 + 1].active())
                                    list.Add(new Tuple<int, int>(index1 + 1, index2 + 1));
                            }
                            if (!tile1.active())
                            {
                                int num3 = 0;
                                int num4 = 1;
                                Tile tile2 = Main.tile[index1 + num3, index2 + num4];
                                if (tile2.active() && Main.tileSolid[(int)tile2.type] && !Main.tileSolidTop[(int)tile2.type])
                                    list.Add(new Tuple<int, int>(index1, index2));
                                int num7 = -1;
                                int num8 = 0;
                                Tile tile3 = Main.tile[index1 + num7, index2 + num8];
                                if (tile3.active() && Main.tileSolid[(int)tile3.type] && !Main.tileSolidTop[(int)tile3.type])
                                    list.Add(new Tuple<int, int>(index1, index2));
                                int num9 = 1;
                                int num10 = 0;
                                Tile tile4 = Main.tile[index1 + num9, index2 + num10];
                                if (tile4.active() && Main.tileSolid[(int)tile4.type] && !Main.tileSolidTop[(int)tile4.type])
                                    list.Add(new Tuple<int, int>(index1, index2));
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if ((obj.itemId == 2340 || obj.itemId == 2739) && (num5 == -1 && num6 == -1))
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active() && (int)Main.tile[x1, y1].type == 314)
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile = Main.tile[index1, index2];
                            if (tile.active() && (int)tile.type == 314)
                            {
                                bool flag3 = Main.tile[index1 + 1, index2 + 1].active() && (int)Main.tile[index1 + 1, index2 + 1].type == 314;
                                bool flag4 = Main.tile[index1 + 1, index2 - 1].active() && (int)Main.tile[index1 + 1, index2 - 1].type == 314;
                                bool flag5 = Main.tile[index1 - 1, index2 + 1].active() && (int)Main.tile[index1 - 1, index2 + 1].type == 314;
                                bool flag6 = Main.tile[index1 - 1, index2 - 1].active() && (int)Main.tile[index1 - 1, index2 - 1].type == 314;
                                if ((!Main.tile[index1 - 1, index2 - 1].active() || Main.tileCut[(int)Main.tile[index1 - 1, index2 - 1].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 - 1, index2 - 1].type]) && (flag3 || !flag4))
                                    list.Add(new Tuple<int, int>(index1 - 1, index2 - 1));
                                if (!Main.tile[index1 - 1, index2].active() || Main.tileCut[(int)Main.tile[index1 - 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 - 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 - 1, index2));
                                if ((!Main.tile[index1 - 1, index2 + 1].active() || Main.tileCut[(int)Main.tile[index1 - 1, index2 + 1].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 - 1, index2 + 1].type]) && (flag4 || !flag3))
                                    list.Add(new Tuple<int, int>(index1 - 1, index2 + 1));
                                if ((!Main.tile[index1 + 1, index2 - 1].active() || Main.tileCut[(int)Main.tile[index1 + 1, index2 - 1].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 + 1, index2 - 1].type]) && (flag5 || !flag6))
                                    list.Add(new Tuple<int, int>(index1 + 1, index2 - 1));
                                if (!Main.tile[index1 + 1, index2].active() || Main.tileCut[(int)Main.tile[index1 + 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 + 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 + 1, index2));
                                if ((!Main.tile[index1 + 1, index2 + 1].active() || Main.tileCut[(int)Main.tile[index1 + 1, index2 + 1].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 + 1, index2 + 1].type]) && (flag6 || !flag5))
                                    list.Add(new Tuple<int, int>(index1 + 1, index2 + 1));
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        if ((!Main.tile[list[index].Item1, list[index].Item2 - 1].active() || (int)Main.tile[list[index].Item1, list[index].Item2 - 1].type != 314) && (!Main.tile[list[index].Item1, list[index].Item2 + 1].active() || (int)Main.tile[list[index].Item1, list[index].Item2 + 1].type != 314))
                        {
                            float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                            if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                            {
                                num3 = num4;
                                tuple = list[index];
                            }
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy) && (double)num3 != -1.0)
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.itemId == 2492 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active() && (int)Main.tile[x1, y1].type == 314)
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile = Main.tile[index1, index2];
                            if (tile.active() && (int)tile.type == 314)
                            {
                                if (!Main.tile[index1 - 1, index2].active() || Main.tileCut[(int)Main.tile[index1 - 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 - 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 - 1, index2));
                                if (!Main.tile[index1 + 1, index2].active() || Main.tileCut[(int)Main.tile[index1 + 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 + 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 + 1, index2));
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        if ((!Main.tile[list[index].Item1, list[index].Item2 - 1].active() || (int)Main.tile[list[index].Item1, list[index].Item2 - 1].type != 314) && (!Main.tile[list[index].Item1, list[index].Item2 + 1].active() || (int)Main.tile[list[index].Item1, list[index].Item2 + 1].type != 314))
                        {
                            float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                            if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                            {
                                num3 = num4;
                                tuple = list[index];
                            }
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy) && (double)num3 != -1.0)
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.createWall > 0 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if ((int)tile.wall == 0 && (!tile.active() || !Main.tileSolid[(int)tile.type] || Main.tileSolidTop[(int)tile.type]) && Collision.CanHitWithCheck(this.position, this.width, this.height, new Vector2((float)index1, (float)index2) * 16f, 16, 16, new Utils.PerLinePoint(DelegateMethods.NotDoorStand)))
                        {
                            bool flag2 = false;
                            if (Main.tile[index1 - 1, index2].active() || (int)Main.tile[index1 - 1, index2].wall > 0)
                                flag2 = true;
                            if (Main.tile[index1 + 1, index2].active() || (int)Main.tile[index1 + 1, index2].wall > 0)
                                flag2 = true;
                            if (Main.tile[index1, index2 - 1].active() || (int)Main.tile[index1, index2 - 1].wall > 0)
                                flag2 = true;
                            if (Main.tile[index1, index2 + 1].active() || (int)Main.tile[index1, index2 + 1].wall > 0)
                                flag2 = true;
                            if (Main.tile[index1, index2].active() && (int)Main.tile[index1, index2].type == 11 && ((int)Main.tile[index1, index2].frameX < 18 || (int)Main.tile[index1, index2].frameX >= 54))
                                flag2 = false;
                            if (flag2)
                                list.Add(new Tuple<int, int>(index1, index2));
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (Player.SmartCursorSettings.SmartBlocksEnabled && obj.createTile > -1 && (obj.itemId != 213 && Main.tileSolid[obj.createTile]) && (!Main.tileSolidTop[obj.createTile] && !Main.tileFrameImportant[obj.createTile] && (num5 == -1 && num6 == -1)))
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active())
                    flag2 = true;
                if (!Collision.InTileBounds(x1, y1, lx, ly, hx, hy))
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile = Main.tile[index1, index2];
                            if (!tile.active() || Main.tileCut[(int)tile.type] || TileID.Sets.BreakableWhenPlacing[(int)tile.type])
                            {
                                bool flag3 = false;
                                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])
                                    flag3 = true;
                                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])
                                    flag3 = true;
                                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])
                                    flag3 = true;
                                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])
                                    flag3 = true;
                                if (flag3)
                                    list.Add(new Tuple<int, int>(index1, index2));
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        if (Collision.EmptyTile(list[index].Item1, list[index].Item2, false))
                        {
                            float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                            if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                            {
                                num3 = num4;
                                tuple = list[index];
                            }
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy) && (double)num3 != -1.0)
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if ((obj.itemId == 1072 || obj.itemId == 1544) && (num2 != 0 && num5 == -1) && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if ((int)tile.wall > 0 && (int)tile.wallColor() != num2 && (!tile.active() || !Main.tileSolid[(int)tile.type] || Main.tileSolidTop[(int)tile.type]))
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if ((obj.itemId == 1071 || obj.itemId == 1543) && (num2 != 0 && num5 == -1) && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if (tile.active() && (int)tile.color() != num2)
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if ((obj.itemId == 1100 || obj.itemId == 1545) && (num5 == -1 && num6 == -1))
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if (tile.active() && (int)tile.color() > 0 || (int)tile.wall > 0 && (int)tile.wallColor() > 0)
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.itemId == 27 && num5 == -1 && (num6 == -1 && ly > 20))
            {
                List<Tuple<int, int>> list1 = new List<Tuple<int, int>>();
                for (int index = lx; index <= hx; ++index)
                {
                    for (int endY = ly; endY <= hy; ++endY)
                    {
                        Tile tile1 = Main.tile[index, endY];
                        Tile tile2 = Main.tile[index, endY - 1];
                        Tile testTile = Main.tile[index, endY + 1];
                        Tile tile3 = Main.tile[index - 1, endY];
                        Tile tile4 = Main.tile[index + 1, endY];
                        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() || (int)tile3.type != 20) && (!tile4.active() || (int)tile4.type != 20) && (testTile.active() && WorldGen.SolidTile2(testTile))))
                        {
                            ushort num3 = testTile.type;
                            if ((uint)num3 <= 109U)
                            {
                                if ((uint)num3 <= 23U)
                                {
                                    if ((int)num3 != 2 && (int)num3 != 23)
                                        continue;
                                }
                                else if ((int)num3 != 53)
                                {
                                    if ((int)num3 != 60)
                                    {
                                        if ((int)num3 != 109)
                                            continue;
                                    }
                                    else
                                    {
                                        if (WorldGen.EmptyTileCheck(index - 2, index + 2, endY - 20, endY, 20))
                                        {
                                            list1.Add(new Tuple<int, int>(index, endY));
                                            continue;
                                        }
                                        continue;
                                    }
                                }
                            }
                            else if ((uint)num3 <= 116U)
                            {
                                if ((int)num3 != 112 && (int)num3 != 116)
                                    continue;
                            }
                            else if ((int)num3 != 147 && (int)num3 != 199 && (int)num3 != 234)
                                continue;
                            if ((int)tile3.liquid == 0 && (int)tile1.liquid == 0 && ((int)tile4.liquid == 0 && WorldGen.EmptyTileCheck(index - 2, index + 2, endY - 20, endY, 20)))
                                list1.Add(new Tuple<int, int>(index, endY));
                        }
                    }
                }
                List<Tuple<int, int>> list2 = new List<Tuple<int, int>>();
                for (int index = 0; index < list1.Count; ++index)
                {
                    bool flag2 = false;
                    int num3 = -1;
                    while (num3 < 2)
                    {
                        Tile tile = Main.tile[list1[index].Item1 + num3, list1[index].Item2 + 1];
                        if (tile.active())
                        {
                            ushort num4 = tile.type;
                            if ((uint)num4 <= 109U)
                            {
                                if ((uint)num4 <= 23U)
                                {
                                    if ((int)num4 != 2 && (int)num4 != 23)
                                        goto label_571;
                                }
                                else if ((int)num4 != 53 && (int)num4 != 60 && (int)num4 != 109)
                                    goto label_571;
                            }
                            else if ((uint)num4 <= 116U)
                            {
                                if ((int)num4 != 112 && (int)num4 != 116)
                                    goto label_571;
                            }
                            else if ((int)num4 != 147 && (int)num4 != 199 && (int)num4 != 234)
                                goto label_571;
                            flag2 = true;
                        }
                    label_571:
                        num3 += 2;
                    }
                    if (!flag2)
                        list2.Add(list1[index]);
                }
                for (int index = 0; index < list2.Count; ++index)
                    list1.Remove(list2[index]);
                list2.Clear();
                if (list1.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list1[0];
                    for (int index = 0; index < list1.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list1[index].Item1, (float)list1[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list1[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list1.Clear();
            }
            if (obj.itemId == 205 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if ((int)tile.liquid > 0)
                        {
                            int num3 = (int)tile.liquidType();
                            int num4 = 0;
                            for (int index3 = index1 - 1; index3 <= index1 + 1; ++index3)
                            {
                                for (int index4 = index2 - 1; index4 <= index2 + 1; ++index4)
                                {
                                    if ((int)Main.tile[index3, index4].liquidType() == num3)
                                        num4 += (int)Main.tile[index3, index4].liquid;
                                }
                            }
                            if (num4 > 100)
                                list.Add(new Tuple<int, int>(index1, index2));
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.itemId == 849 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        if (tile.k_HasWireFlagsAny(k_WireFlags.WIRE_RGB) && !tile.k_HasWireFlags(k_WireFlags.WIRE_ACTUATOR) && tile.active())
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.createTile == 82 && num5 == -1 && num6 == -1)
            {
                int num3 = obj.placeStyle;
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile1 = Main.tile[index1, index2];
                        Tile tile2 = Main.tile[index1, index2 + 1];
                        if ((!tile1.active() || TileID.Sets.BreakableWhenPlacing[(int)tile1.type] || Main.tileCut[(int)tile1.type] && (int)tile1.type != 82 && (int)tile1.type != 83) && (tile2.nactive() && !tile2.halfBrick() && (int)tile2.slope() == 0))
                        {
                            if (num3 == 0)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && ((int)tile2.type != 2 && (int)tile2.type != 109) || (int)tile1.liquid > 0)
                                    continue;
                            }
                            else if (num3 == 1)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && (int)tile2.type != 60 || (int)tile1.liquid > 0)
                                    continue;
                            }
                            else if (num3 == 2)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && ((int)tile2.type != 0 && (int)tile2.type != 59) || (int)tile1.liquid > 0)
                                    continue;
                            }
                            else if (num3 == 3)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && ((int)tile2.type != 203 && (int)tile2.type != 199) && ((int)tile2.type != 23 && (int)tile2.type != 25) || (int)tile1.liquid > 0)
                                    continue;
                            }
                            else if (num3 == 4)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && ((int)tile2.type != 53 && (int)tile2.type != 116) || (int)tile1.liquid > 0 && tile1.lava())
                                    continue;
                            }
                            else if (num3 == 5)
                            {
                                if ((int)tile2.type != 78 && (int)tile2.type != 380 && (int)tile2.type != 57 || (int)tile1.liquid > 0 && !tile1.lava())
                                    continue;
                            }
                            else if (num3 == 6 && ((int)tile2.type != 78 && (int)tile2.type != 380 && ((int)tile2.type != 147 && (int)tile2.type != 161) && ((int)tile2.type != 163 && (int)tile2.type != 164 && (int)tile2.type != 200) || (int)tile1.liquid > 0 && tile1.lava()))
                                continue;
                            list.Add(new Tuple<int, int>(index1, index2));
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num4 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num7 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num4 == -1.0 || (double)num7 < (double)num4)
                        {
                            num4 = num7;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.createTile == 380 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active() && (int)Main.tile[x1, y1].type == 380)
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile = Main.tile[index1, index2];
                            if (tile.active() && (int)tile.type == 380)
                            {
                                if (!Main.tile[index1 - 1, index2].active() || Main.tileCut[(int)Main.tile[index1 - 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 - 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 - 1, index2));
                                if (!Main.tile[index1 + 1, index2].active() || Main.tileCut[(int)Main.tile[index1 + 1, index2].type] || TileID.Sets.BreakableWhenPlacing[(int)Main.tile[index1 + 1, index2].type])
                                    list.Add(new Tuple<int, int>(index1 + 1, index2));
                            }
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy) && (double)num3 != -1.0)
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.createTile == 78 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                bool flag2 = false;
                if (Main.tile[x1, y1].active())
                    flag2 = true;
                if (!Collision.InTileBounds(x1, y1, lx, ly, hx, hy))
                    flag2 = true;
                if (!flag2)
                {
                    for (int index1 = lx; index1 <= hx; ++index1)
                    {
                        for (int index2 = ly; index2 <= hy; ++index2)
                        {
                            Tile tile1 = Main.tile[index1, index2];
                            Tile tile2 = Main.tile[index1, index2 + 1];
                            if ((!tile1.active() || Main.tileCut[(int)tile1.type] || TileID.Sets.BreakableWhenPlacing[(int)tile1.type]) && (tile2.nactive() && !tile2.halfBrick() && ((int)tile2.slope() == 0 && Main.tileSolid[(int)tile2.type])))
                                list.Add(new Tuple<int, int>(index1, index2));
                        }
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        if (Collision.EmptyTile(list[index].Item1, list[index].Item2, true))
                        {
                            float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                            if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                            {
                                num3 = num4;
                                tuple = list[index];
                            }
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy) && (double)num3 != -1.0)
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (obj.itemId == 213 && num5 == -1 && num6 == -1)
            {
                List<Tuple<int, int>> list = new List<Tuple<int, int>>();
                for (int index1 = lx; index1 <= hx; ++index1)
                {
                    for (int index2 = ly; index2 <= hy; ++index2)
                    {
                        Tile tile = Main.tile[index1, index2];
                        bool flag2 = !Main.tile[index1 - 1, index2].active() || !Main.tile[index1, index2 + 1].active() || !Main.tile[index1 + 1, index2].active() || !Main.tile[index1, index2 - 1].active();
                        bool flag3 = !Main.tile[index1 - 1, index2 - 1].active() || !Main.tile[index1 - 1, index2 + 1].active() || !Main.tile[index1 + 1, index2 + 1].active() || !Main.tile[index1 + 1, index2 - 1].active();
                        if (tile.active() && !tile.inActive() && ((int)tile.type == 0 || (int)tile.type == 1) && (flag2 || (int)tile.type == 0 && flag3))
                            list.Add(new Tuple<int, int>(index1, index2));
                    }
                }
                if (list.Count > 0)
                {
                    float num3 = -1f;
                    Tuple<int, int> tuple = list[0];
                    for (int index = 0; index < list.Count; ++index)
                    {
                        float num4 = Vector2.Distance(new Vector2((float)list[index].Item1, (float)list[index].Item2) * 16f + Vector2.One * 8f, vector2_1);
                        if ((double)num3 == -1.0 || (double)num4 < (double)num3)
                        {
                            num3 = num4;
                            tuple = list[index];
                        }
                    }
                    if (Collision.InTileBounds(tuple.Item1, tuple.Item2, lx, ly, hx, hy))
                    {
                        num5 = tuple.Item1;
                        num6 = tuple.Item2;
                    }
                }
                list.Clear();
            }
            if (num5 != -1 && num6 != -1)
            {
                Main.smartDigX = Player.tileTargetX = num5;
                Main.smartDigY = Player.tileTargetY = num6;
                Main.smartDigShowing = true;
            }
            ignoreTargets.Clear();
        }
Player