bottomSlope() public method

public bottomSlope ( ) : bool
return bool
Exemplo n.º 1
0
        public static bool CanPlace(
            int x,
            int y,
            int type,
            int style,
            int dir,
            out TileObject objectData,
            bool onlyCheck = false)
        {
            TileObjectData tileData1 = TileObjectData.GetTileData(type, style, 0);

            objectData = TileObject.Empty;
            if (tileData1 == null)
            {
                return(false);
            }
            int num1 = x - (int)tileData1.Origin.X;
            int num2 = y - (int)tileData1.Origin.Y;

            if (num1 < 0 || num1 + tileData1.Width >= Main.maxTilesX || (num2 < 0 || num2 + tileData1.Height >= Main.maxTilesY))
            {
                return(false);
            }
            bool flag1 = tileData1.RandomStyleRange > 0;

            if (TileObjectPreviewData.placementCache == null)
            {
                TileObjectPreviewData.placementCache = new TileObjectPreviewData();
            }
            TileObjectPreviewData.placementCache.Reset();
            int num3 = 0;

            if (tileData1.AlternatesCount != 0)
            {
                num3 = tileData1.AlternatesCount;
            }
            float          num4           = -1f;
            float          num5           = -1f;
            int            num6           = 0;
            TileObjectData tileObjectData = (TileObjectData)null;
            int            alternate      = 0 - 1;

            while (alternate < num3)
            {
                ++alternate;
                TileObjectData tileData2 = TileObjectData.GetTileData(type, style, alternate);
                if (tileData2.Direction == TileObjectDirection.None || (tileData2.Direction != TileObjectDirection.PlaceLeft || dir != 1) && (tileData2.Direction != TileObjectDirection.PlaceRight || dir != -1))
                {
                    int num7 = x - (int)tileData2.Origin.X;
                    int num8 = y - (int)tileData2.Origin.Y;
                    if (num7 < 5 || num7 + tileData2.Width > Main.maxTilesX - 5 || (num8 < 5 || num8 + tileData2.Height > Main.maxTilesY - 5))
                    {
                        return(false);
                    }
                    Rectangle rectangle = new Rectangle(0, 0, tileData2.Width, tileData2.Height);
                    int       X         = 0;
                    int       Y         = 0;
                    if (tileData2.AnchorTop.tileCount != 0)
                    {
                        if (rectangle.Y == 0)
                        {
                            rectangle.Y = -1;
                            ++rectangle.Height;
                            ++Y;
                        }
                        int checkStart = tileData2.AnchorTop.checkStart;
                        if (checkStart < rectangle.X)
                        {
                            rectangle.Width += rectangle.X - checkStart;
                            X          += rectangle.X - checkStart;
                            rectangle.X = checkStart;
                        }
                        int num9  = checkStart + tileData2.AnchorTop.tileCount - 1;
                        int num10 = rectangle.X + rectangle.Width - 1;
                        if (num9 > num10)
                        {
                            rectangle.Width += num9 - num10;
                        }
                    }
                    if (tileData2.AnchorBottom.tileCount != 0)
                    {
                        if (rectangle.Y + rectangle.Height == tileData2.Height)
                        {
                            ++rectangle.Height;
                        }
                        int checkStart = tileData2.AnchorBottom.checkStart;
                        if (checkStart < rectangle.X)
                        {
                            rectangle.Width += rectangle.X - checkStart;
                            X          += rectangle.X - checkStart;
                            rectangle.X = checkStart;
                        }
                        int num9  = checkStart + tileData2.AnchorBottom.tileCount - 1;
                        int num10 = rectangle.X + rectangle.Width - 1;
                        if (num9 > num10)
                        {
                            rectangle.Width += num9 - num10;
                        }
                    }
                    if (tileData2.AnchorLeft.tileCount != 0)
                    {
                        if (rectangle.X == 0)
                        {
                            rectangle.X = -1;
                            ++rectangle.Width;
                            ++X;
                        }
                        int checkStart = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            --checkStart;
                        }
                        if (checkStart < rectangle.Y)
                        {
                            rectangle.Width += rectangle.Y - checkStart;
                            Y          += rectangle.Y - checkStart;
                            rectangle.Y = checkStart;
                        }
                        int num9 = checkStart + tileData2.AnchorLeft.tileCount - 1;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num9 += 2;
                        }
                        int num10 = rectangle.Y + rectangle.Height - 1;
                        if (num9 > num10)
                        {
                            rectangle.Height += num9 - num10;
                        }
                    }
                    if (tileData2.AnchorRight.tileCount != 0)
                    {
                        if (rectangle.X + rectangle.Width == tileData2.Width)
                        {
                            ++rectangle.Width;
                        }
                        int checkStart = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            --checkStart;
                        }
                        if (checkStart < rectangle.Y)
                        {
                            rectangle.Width += rectangle.Y - checkStart;
                            Y          += rectangle.Y - checkStart;
                            rectangle.Y = checkStart;
                        }
                        int num9 = checkStart + tileData2.AnchorRight.tileCount - 1;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num9 += 2;
                        }
                        int num10 = rectangle.Y + rectangle.Height - 1;
                        if (num9 > num10)
                        {
                            rectangle.Height += num9 - num10;
                        }
                    }
                    if (onlyCheck)
                    {
                        TileObject.objectPreview.Reset();
                        TileObject.objectPreview.Active      = true;
                        TileObject.objectPreview.Type        = (ushort)type;
                        TileObject.objectPreview.Style       = (short)style;
                        TileObject.objectPreview.Alternate   = alternate;
                        TileObject.objectPreview.Size        = new Point16(rectangle.Width, rectangle.Height);
                        TileObject.objectPreview.ObjectStart = new Point16(X, Y);
                        TileObject.objectPreview.Coordinates = new Point16(num7 - X, num8 - Y);
                    }
                    float num11 = 0.0f;
                    float num12 = (float)(tileData2.Width * tileData2.Height);
                    float num13 = 0.0f;
                    float num14 = 0.0f;
                    for (int index1 = 0; index1 < tileData2.Width; ++index1)
                    {
                        for (int index2 = 0; index2 < tileData2.Height; ++index2)
                        {
                            Tile tileSafely = Framing.GetTileSafely(num7 + index1, num8 + index2);
                            bool flag2      = !tileData2.LiquidPlace(tileSafely);
                            bool flag3      = false;
                            if (tileData2.AnchorWall)
                            {
                                ++num14;
                                if (!tileData2.isValidWallAnchor((int)tileSafely.wall))
                                {
                                    flag3 = true;
                                }
                                else
                                {
                                    ++num13;
                                }
                            }
                            bool flag4 = false;
                            if (tileSafely.active() && (!Main.tileCut[(int)tileSafely.type] || tileSafely.type == (ushort)484) && !TileID.Sets.BreakableWhenPlacing[(int)tileSafely.type])
                            {
                                flag4 = true;
                            }
                            if (flag4 | flag2 | flag3)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[index1 + X, index2 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[index1 + X, index2 + Y] = 1;
                                }
                                ++num11;
                            }
                        }
                    }
                    AnchorData anchorBottom = tileData2.AnchorBottom;
                    if (anchorBottom.tileCount != 0)
                    {
                        num14 += (float)anchorBottom.tileCount;
                        int height = tileData2.Height;
                        for (int index = 0; index < anchorBottom.tileCount; ++index)
                        {
                            int  num9       = anchorBottom.checkStart + index;
                            Tile tileSafely = Framing.GetTileSafely(num7 + num9, num8 + height);
                            bool flag2      = false;
                            if (tileSafely.nactive())
                            {
                                if ((anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[(int)tileSafely.type] && (!Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type]) && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && ((anchorBottom.type & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchorBottom.type & AnchorType.Table) == AnchorType.Table))
                                {
                                    if (TileID.Sets.Platforms[(int)tileSafely.type])
                                    {
                                        int num10 = (int)tileSafely.frameX / TileObjectData.PlatformFrameWidth();
                                        if (!tileSafely.halfBrick() && WorldGen.PlatformProperTopFrame(tileSafely.frameX))
                                        {
                                            flag2 = true;
                                        }
                                    }
                                    else if (Main.tileSolid[(int)tileSafely.type] && Main.tileSolidTop[(int)tileSafely.type])
                                    {
                                        flag2 = true;
                                    }
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.Table) == AnchorType.Table && (!TileID.Sets.Platforms[(int)tileSafely.type] && Main.tileTable[(int)tileSafely.type]) && tileSafely.blockType() == 0)
                                {
                                    flag2 = true;
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type]))
                                {
                                    switch (tileSafely.blockType())
                                    {
                                    case 4:
                                    case 5:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num9 + X, height + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num9 + X, height + Y] = 1;
                                }
                                ++num13;
                            }
                        }
                    }
                    AnchorData anchorTop = tileData2.AnchorTop;
                    if (anchorTop.tileCount != 0)
                    {
                        num14 += (float)anchorTop.tileCount;
                        int num9 = -1;
                        for (int index = 0; index < anchorTop.tileCount; ++index)
                        {
                            int  num10      = anchorTop.checkStart + index;
                            Tile tileSafely = Framing.GetTileSafely(num7 + num10, num8 + num9);
                            bool flag2      = false;
                            if (tileSafely.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.SolidBottom) == AnchorType.SolidBottom && (Main.tileSolid[(int)tileSafely.type] && (!Main.tileSolidTop[(int)tileSafely.type] || TileID.Sets.Platforms[(int)tileSafely.type] && (tileSafely.halfBrick() || tileSafely.topSlope())) || (tileSafely.halfBrick() || tileSafely.topSlope())) && (!TileID.Sets.NotReallySolid[(int)tileSafely.type] && !tileSafely.bottomSlope()))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type]))
                                {
                                    switch (tileSafely.blockType())
                                    {
                                    case 2:
                                    case 3:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorTop.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, num9 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, num9 + Y] = 1;
                                }
                                ++num13;
                            }
                        }
                    }
                    AnchorData anchorRight = tileData2.AnchorRight;
                    if (anchorRight.tileCount != 0)
                    {
                        num14 += (float)anchorRight.tileCount;
                        int width = tileData2.Width;
                        for (int index = 0; index < anchorRight.tileCount; ++index)
                        {
                            int  num9        = anchorRight.checkStart + index;
                            Tile tileSafely1 = Framing.GetTileSafely(num7 + width, num8 + num9);
                            bool flag2       = false;
                            if (tileSafely1.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type] && !Main.tileNoAttach[(int)tileSafely1.type] && (tileData2.FlattenAnchors || tileSafely1.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type]))
                                {
                                    switch (tileSafely1.blockType())
                                    {
                                    case 2:
                                    case 4:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.Tree) == AnchorType.Tree && TileID.Sets.IsATreeTrunk[(int)tileSafely1.type])
                                {
                                    flag2 = true;
                                    if (index == 0)
                                    {
                                        ++num14;
                                        Tile tileSafely2 = Framing.GetTileSafely(num7 + width, num8 + num9 - 1);
                                        if (tileSafely2.nactive() && TileID.Sets.IsATreeTrunk[(int)tileSafely2.type])
                                        {
                                            ++num13;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + X, num9 + Y - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + X, num9 + Y - 1] = 2;
                                        }
                                    }
                                    if (index == anchorRight.tileCount - 1)
                                    {
                                        ++num14;
                                        Tile tileSafely2 = Framing.GetTileSafely(num7 + width, num8 + num9 + 1);
                                        if (tileSafely2.nactive() && TileID.Sets.IsATreeTrunk[(int)tileSafely2.type])
                                        {
                                            ++num13;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + X, num9 + Y + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + X, num9 + Y + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely1.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorRight.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + X, num9 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + X, num9 + Y] = 1;
                                }
                                ++num13;
                            }
                        }
                    }
                    AnchorData anchorLeft = tileData2.AnchorLeft;
                    if (anchorLeft.tileCount != 0)
                    {
                        num14 += (float)anchorLeft.tileCount;
                        int num9 = -1;
                        for (int index = 0; index < anchorLeft.tileCount; ++index)
                        {
                            int  num10       = anchorLeft.checkStart + index;
                            Tile tileSafely1 = Framing.GetTileSafely(num7 + num9, num8 + num10);
                            bool flag2       = false;
                            if (tileSafely1.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type] && !Main.tileNoAttach[(int)tileSafely1.type] && (tileData2.FlattenAnchors || tileSafely1.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type]))
                                {
                                    switch (tileSafely1.blockType())
                                    {
                                    case 3:
                                    case 5:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.Tree) == AnchorType.Tree && TileID.Sets.IsATreeTrunk[(int)tileSafely1.type])
                                {
                                    flag2 = true;
                                    if (index == 0)
                                    {
                                        ++num14;
                                        Tile tileSafely2 = Framing.GetTileSafely(num7 + num9, num8 + num10 - 1);
                                        if (tileSafely2.nactive() && TileID.Sets.IsATreeTrunk[(int)tileSafely2.type])
                                        {
                                            ++num13;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num9 + X, num10 + Y - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num9 + X, num10 + Y - 1] = 2;
                                        }
                                    }
                                    if (index == anchorLeft.tileCount - 1)
                                    {
                                        ++num14;
                                        Tile tileSafely2 = Framing.GetTileSafely(num7 + num9, num8 + num10 + 1);
                                        if (tileSafely2.nactive() && TileID.Sets.IsATreeTrunk[(int)tileSafely2.type])
                                        {
                                            ++num13;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num9 + X, num10 + Y + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num9 + X, num10 + Y + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely1.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorLeft.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num9 + X, num10 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num9 + X, num10 + Y] = 1;
                                }
                                ++num13;
                            }
                        }
                    }
                    if (tileData2.HookCheckIfCanPlace.hook != null)
                    {
                        if (tileData2.HookCheckIfCanPlace.processedCoordinates)
                        {
                            Point16 origin1 = tileData2.Origin;
                            Point16 origin2 = tileData2.Origin;
                        }
                        if (tileData2.HookCheckIfCanPlace.hook(x, y, type, style, dir, alternate) == tileData2.HookCheckIfCanPlace.badReturn && tileData2.HookCheckIfCanPlace.badResponse == 0)
                        {
                            num13 = 0.0f;
                            num11 = 0.0f;
                            TileObject.objectPreview.AllInvalid();
                        }
                    }
                    float num15 = num13 / num14;
                    float num16 = num11 / num12;
                    if ((double)num16 == 1.0 && (double)num14 == 0.0)
                    {
                        num15 = 1f;
                        num16 = 1f;
                    }
                    if ((double)num15 == 1.0 && (double)num16 == 1.0)
                    {
                        num4           = 1f;
                        num5           = 1f;
                        num6           = alternate;
                        tileObjectData = tileData2;
                        break;
                    }
                    if ((double)num15 > (double)num4 || (double)num15 == (double)num4 && (double)num16 > (double)num5)
                    {
                        TileObjectPreviewData.placementCache.CopyFrom(TileObject.objectPreview);
                        num4           = num15;
                        num5           = num16;
                        tileObjectData = tileData2;
                        num6           = alternate;
                    }
                }
            }
            int num17 = -1;

            if (flag1)
            {
                if (TileObjectPreviewData.randomCache == null)
                {
                    TileObjectPreviewData.randomCache = new TileObjectPreviewData();
                }
                bool flag2 = false;
                if ((int)TileObjectPreviewData.randomCache.Type == type)
                {
                    Point16 coordinates = TileObjectPreviewData.randomCache.Coordinates;
                    Point16 objectStart = TileObjectPreviewData.randomCache.ObjectStart;
                    int     num7        = (int)coordinates.X + (int)objectStart.X;
                    int     num8        = (int)coordinates.Y + (int)objectStart.Y;
                    int     num9        = x - (int)tileData1.Origin.X;
                    int     num10       = y - (int)tileData1.Origin.Y;
                    if (num7 != num9 || num8 != num10)
                    {
                        flag2 = true;
                    }
                }
                else
                {
                    flag2 = true;
                }
                num17 = !flag2 ? TileObjectPreviewData.randomCache.Random : Main.rand.Next(tileData1.RandomStyleRange);
            }
            if (onlyCheck)
            {
                if ((double)num4 != 1.0 || (double)num5 != 1.0)
                {
                    TileObject.objectPreview.CopyFrom(TileObjectPreviewData.placementCache);
                    alternate = num6;
                }
                TileObject.objectPreview.Random = num17;
                if (tileData1.RandomStyleRange > 0)
                {
                    TileObjectPreviewData.randomCache.CopyFrom(TileObject.objectPreview);
                }
            }
            if (!onlyCheck)
            {
                objectData.xCoord    = x - (int)tileObjectData.Origin.X;
                objectData.yCoord    = y - (int)tileObjectData.Origin.Y;
                objectData.type      = type;
                objectData.style     = style;
                objectData.alternate = alternate;
                objectData.random    = num17;
            }
            return((double)num4 == 1.0 && (double)num5 == 1.0);
        }
Exemplo n.º 2
0
        private void DrawWaterfall(SpriteBatch spriteBatch, int Style = 0, float Alpha = 1f)
        {
            Main.tileSolid[546] = false;
            float num   = 0f;
            float num2  = 99999f;
            float num3  = 99999f;
            int   num4  = -1;
            int   num5  = -1;
            float num6  = 0f;
            float num7  = 99999f;
            float num8  = 99999f;
            int   num9  = -1;
            int   num10 = -1;

            for (int i = 0; i < currentMax; i++)
            {
                int num11 = 0;
                int num12 = waterfalls[i].type;
                int num13 = waterfalls[i].x;
                int num14 = waterfalls[i].y;
                int num15 = 0;
                int num16 = 0;
                int num17 = 0;
                int num18 = 0;
                int num19 = 0;
                int num20 = 0;
                int num21;
                int num22;
                if (num12 == 1 || num12 == 14)
                {
                    if (Main.drewLava || waterfalls[i].stopAtStep == 0)
                    {
                        continue;
                    }
                    num21 = 32 * slowFrame;
                }
                else
                {
                    switch (num12)
                    {
                    case 11:
                    case 22:
                    {
                        if (Main.drewLava)
                        {
                            continue;
                        }
                        num22 = waterfallDist / 4;
                        if (num12 == 22)
                        {
                            num22 = waterfallDist / 2;
                        }
                        if (waterfalls[i].stopAtStep > num22)
                        {
                            waterfalls[i].stopAtStep = num22;
                        }
                        if (waterfalls[i].stopAtStep == 0 || (float)(num14 + num22) < Main.screenPosition.Y / 16f || (float)num13 <Main.screenPosition.X / 16f - 20f || (float)num13> (Main.screenPosition.X + (float)Main.screenWidth) / 16f + 20f)
                        {
                            continue;
                        }
                        int num23;
                        int num24;
                        if (num13 % 2 == 0)
                        {
                            num23 = rainFrameForeground + 3;
                            if (num23 > 7)
                            {
                                num23 -= 8;
                            }
                            num24 = rainFrameBackground + 2;
                            if (num24 > 7)
                            {
                                num24 -= 8;
                            }
                            if (num12 == 22)
                            {
                                num23 = snowFrameForeground + 3;
                                if (num23 > 7)
                                {
                                    num23 -= 8;
                                }
                            }
                        }
                        else
                        {
                            num23 = rainFrameForeground;
                            num24 = rainFrameBackground;
                            if (num12 == 22)
                            {
                                num23 = snowFrameForeground;
                            }
                        }
                        Rectangle value    = new Rectangle(num24 * 18, 0, 16, 16);
                        Rectangle value2   = new Rectangle(num23 * 18, 0, 16, 16);
                        Vector2   origin   = new Vector2(8f, 8f);
                        Vector2   position = (num14 % 2 != 0) ? (new Vector2(num13 * 16 + 8, num14 * 16 + 8) - Main.screenPosition) : (new Vector2(num13 * 16 + 9, num14 * 16 + 8) - Main.screenPosition);
                        Tile      tile     = Main.tile[num13, num14 - 1];
                        if (tile.active() && tile.bottomSlope())
                        {
                            position.Y -= 16f;
                        }
                        bool  flag     = false;
                        float rotation = 0f;
                        for (int j = 0; j < num22; j++)
                        {
                            Color color = Lighting.GetColor(num13, num14);
                            float num25 = 0.6f;
                            float num26 = 0.3f;
                            if (j > num22 - 8)
                            {
                                float num27 = (float)(num22 - j) / 8f;
                                num25 *= num27;
                                num26 *= num27;
                            }
                            Color color2 = color * num25;
                            Color color3 = color * num26;
                            if (num12 == 22)
                            {
                                spriteBatch.Draw(waterfallTexture[22].get_Value(), position, value2, color2, 0f, origin, 1f, SpriteEffects.None, 0f);
                            }
                            else
                            {
                                spriteBatch.Draw(waterfallTexture[12].get_Value(), position, value, color3, rotation, origin, 1f, SpriteEffects.None, 0f);
                                spriteBatch.Draw(waterfallTexture[11].get_Value(), position, value2, color2, rotation, origin, 1f, SpriteEffects.None, 0f);
                            }
                            if (flag)
                            {
                                break;
                            }
                            num14++;
                            Tile tile2 = Main.tile[num13, num14];
                            if (WorldGen.SolidTile(tile2))
                            {
                                flag = true;
                            }
                            if (tile2.liquid > 0)
                            {
                                int num28 = (int)(16f * ((float)(int)tile2.liquid / 255f)) & 0xFE;
                                if (num28 >= 15)
                                {
                                    break;
                                }
                                value2.Height -= num28;
                                value.Height  -= num28;
                            }
                            if (num14 % 2 == 0)
                            {
                                position.X += 1f;
                            }
                            else
                            {
                                position.X -= 1f;
                            }
                            position.Y += 16f;
                        }
                        waterfalls[i].stopAtStep = 0;
                        continue;
                    }

                    case 0:
                        num12 = Style;
                        break;

                    case 2:
                        if (Main.drewLava)
                        {
                            continue;
                        }
                        break;
                    }
                    num21 = 32 * regularFrame;
                }
                int num29 = 0;
                num22 = waterfallDist;
                Color color4 = Color.White;
                for (int k = 0; k < num22; k++)
                {
                    if (num29 >= 2)
                    {
                        continue;
                    }
                    switch (num12)
                    {
                    case 1:
                    {
                        float r;
                        float num30 = r = (0.55f + (float)(270 - Main.mouseTextColor) / 900f) * 0.4f;
                        float g     = num30 * 0.3f;
                        float b     = num30 * 0.1f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 2:
                    {
                        float r = (float)Main.DiscoR / 255f;
                        float g = (float)Main.DiscoG / 255f;
                        float b = (float)Main.DiscoB / 255f;
                        r *= 0.2f;
                        g *= 0.2f;
                        b *= 0.2f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 15:
                    {
                        float r = 0f;
                        float g = 0f;
                        float b = 0.2f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 16:
                    {
                        float r = 0f;
                        float g = 0.2f;
                        float b = 0f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 17:
                    {
                        float r = 0f;
                        float g = 0f;
                        float b = 0.2f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 18:
                    {
                        float r = 0f;
                        float g = 0.2f;
                        float b = 0f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 19:
                    {
                        float r = 0.2f;
                        float g = 0f;
                        float b = 0f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }

                    case 20:
                        Lighting.AddLight(num13, num14, 0.2f, 0.2f, 0.2f);
                        break;

                    case 21:
                    {
                        float r = 0.2f;
                        float g = 0f;
                        float b = 0f;
                        Lighting.AddLight(num13, num14, r, g, b);
                        break;
                    }
                    }
                    int  num31 = 0;
                    int  num32 = 0;
                    int  num33 = 0;
                    Tile tile3 = Main.tile[num13, num14];
                    if (tile3 == null)
                    {
                        tile3 = new Tile();
                        Main.tile[num13, num14] = tile3;
                    }
                    if (tile3.nactive() && Main.tileSolid[tile3.type] && !Main.tileSolidTop[tile3.type] && !TileID.Sets.Platforms[tile3.type] && tile3.blockType() == 0)
                    {
                        break;
                    }
                    Tile tile4 = Main.tile[num13 - 1, num14];
                    if (tile4 == null)
                    {
                        tile4 = new Tile();
                        Main.tile[num13 - 1, num14] = tile4;
                    }
                    Tile tile5 = Main.tile[num13, num14 + 1];
                    if (tile5 == null)
                    {
                        tile5 = new Tile();
                        Main.tile[num13, num14 + 1] = tile5;
                    }
                    Tile tile6 = Main.tile[num13 + 1, num14];
                    if (tile6 == null)
                    {
                        tile6 = new Tile();
                        Main.tile[num13 + 1, num14] = tile6;
                    }
                    num33 = (int)tile3.liquid / 16;
                    int num34 = 0;
                    int num35 = num18;
                    if (tile5.topSlope() && !tile3.halfBrick() && tile5.type != 19)
                    {
                        if (tile5.slope() == 1)
                        {
                            num34 = 1;
                            num31 = 1;
                            num17 = 1;
                            num18 = num17;
                        }
                        else
                        {
                            num34 = -1;
                            num31 = -1;
                            num17 = -1;
                            num18 = num17;
                        }
                        num32 = 1;
                    }
                    else if ((!WorldGen.SolidTile(tile5) && !tile5.bottomSlope() && !tile3.halfBrick()) || (!tile5.active() && !tile3.halfBrick()))
                    {
                        num29 = 0;
                        num32 = 1;
                        num31 = 0;
                    }
                    else if ((WorldGen.SolidTile(tile4) || tile4.topSlope() || tile4.liquid > 0) && !WorldGen.SolidTile(tile6) && tile6.liquid == 0)
                    {
                        if (num17 == -1)
                        {
                            num29++;
                        }
                        num31 = 1;
                        num32 = 0;
                        num17 = 1;
                    }
                    else if ((WorldGen.SolidTile(tile6) || tile6.topSlope() || tile6.liquid > 0) && !WorldGen.SolidTile(tile4) && tile4.liquid == 0)
                    {
                        if (num17 == 1)
                        {
                            num29++;
                        }
                        num31 = -1;
                        num32 = 0;
                        num17 = -1;
                    }
                    else if (((!WorldGen.SolidTile(tile6) && !tile3.topSlope()) || tile6.liquid == 0) && !WorldGen.SolidTile(tile4) && !tile3.topSlope() && tile4.liquid == 0)
                    {
                        num32 = 0;
                        num31 = num17;
                    }
                    else
                    {
                        num29++;
                        num32 = 0;
                        num31 = 0;
                    }
                    if (num29 >= 2)
                    {
                        num17 *= -1;
                        num31 *= -1;
                    }
                    int num36 = -1;
                    if (num12 != 1 && num12 != 14)
                    {
                        if (tile5.active())
                        {
                            num36 = tile5.type;
                        }
                        if (tile3.active())
                        {
                            num36 = tile3.type;
                        }
                    }
                    switch (num36)
                    {
                    case 160:
                        num12 = 2;
                        break;

                    case 262:
                    case 263:
                    case 264:
                    case 265:
                    case 266:
                    case 267:
                    case 268:
                        num12 = 15 + num36 - 262;
                        break;
                    }
                    if (WorldGen.SolidTile(tile5) && !tile3.halfBrick())
                    {
                        num11 = 8;
                    }
                    else if (num16 != 0)
                    {
                        num11 = 0;
                    }
                    Color color5 = Lighting.GetColor(num13, num14);
                    Color color6 = color5;
                    float num37;
                    switch (num12)
                    {
                    case 1:
                        num37 = 1f;
                        break;

                    case 14:
                        num37 = 0.8f;
                        break;

                    default:
                        num37 = ((tile3.wall != 0 || !((double)num14 < Main.worldSurface)) ? (0.6f * Alpha) : Alpha);
                        break;
                    }
                    if (k > num22 - 10)
                    {
                        num37 *= (float)(num22 - k) / 10f;
                    }
                    float num38 = (float)(int)color5.R * num37;
                    float num39 = (float)(int)color5.G * num37;
                    float num40 = (float)(int)color5.B * num37;
                    float num41 = (float)(int)color5.A * num37;
                    switch (num12)
                    {
                    case 1:
                        if (num38 < 190f * num37)
                        {
                            num38 = 190f * num37;
                        }
                        if (num39 < 190f * num37)
                        {
                            num39 = 190f * num37;
                        }
                        if (num40 < 190f * num37)
                        {
                            num40 = 190f * num37;
                        }
                        break;

                    case 2:
                        num38 = (float)Main.DiscoR * num37;
                        num39 = (float)Main.DiscoG * num37;
                        num40 = (float)Main.DiscoB * num37;
                        break;

                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20:
                    case 21:
                        num38 = 255f * num37;
                        num39 = 255f * num37;
                        num40 = 255f * num37;
                        break;
                    }
                    color5 = new Color((int)num38, (int)num39, (int)num40, (int)num41);
                    if (num12 == 1)
                    {
                        float num42 = Math.Abs((float)(num13 * 16 + 8) - (Main.screenPosition.X + (float)(Main.screenWidth / 2)));
                        float num43 = Math.Abs((float)(num14 * 16 + 8) - (Main.screenPosition.Y + (float)(Main.screenHeight / 2)));
                        if (num42 < (float)(Main.screenWidth * 2) && num43 < (float)(Main.screenHeight * 2))
                        {
                            float num44 = (float)Math.Sqrt(num42 * num42 + num43 * num43);
                            float num45 = 1f - num44 / ((float)Main.screenWidth * 0.75f);
                            if (num45 > 0f)
                            {
                                num6 += num45;
                            }
                        }
                        if (num42 < num7)
                        {
                            num7 = num42;
                            num9 = num13 * 16 + 8;
                        }
                        if (num43 < num8)
                        {
                            num8  = num42;
                            num10 = num14 * 16 + 8;
                        }
                    }
                    else if (num12 != 1 && num12 != 14 && num12 != 11 && num12 != 12 && num12 != 22)
                    {
                        float num46 = Math.Abs((float)(num13 * 16 + 8) - (Main.screenPosition.X + (float)(Main.screenWidth / 2)));
                        float num47 = Math.Abs((float)(num14 * 16 + 8) - (Main.screenPosition.Y + (float)(Main.screenHeight / 2)));
                        if (num46 < (float)(Main.screenWidth * 2) && num47 < (float)(Main.screenHeight * 2))
                        {
                            float num48 = (float)Math.Sqrt(num46 * num46 + num47 * num47);
                            float num49 = 1f - num48 / ((float)Main.screenWidth * 0.75f);
                            if (num49 > 0f)
                            {
                                num += num49;
                            }
                        }
                        if (num46 < num2)
                        {
                            num2 = num46;
                            num4 = num13 * 16 + 8;
                        }
                        if (num47 < num3)
                        {
                            num3 = num46;
                            num5 = num14 * 16 + 8;
                        }
                    }
                    if (k > 50 && (color6.R > 20 || color6.B > 20 || color6.G > 20))
                    {
                        float num50 = (int)color6.R;
                        if ((float)(int)color6.G > num50)
                        {
                            num50 = (int)color6.G;
                        }
                        if ((float)(int)color6.B > num50)
                        {
                            num50 = (int)color6.B;
                        }
                        if ((float)Main.rand.Next(20000) < num50 / 30f)
                        {
                            int num51 = Dust.NewDust(new Vector2(num13 * 16 - num17 * 7, num14 * 16 + 6), 10, 8, 43, 0f, 0f, 254, Color.White, 0.5f);
                            Main.dust[num51].velocity *= 0f;
                        }
                    }
                    if (num15 == 0 && num34 != 0 && num16 == 1 && num17 != num18)
                    {
                        num34  = 0;
                        num17  = num18;
                        color5 = Color.White;
                        if (num17 == 1)
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16 + 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color5, 0f, Vector2.Zero, 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                        else
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16 + 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 8), color5, 0f, Vector2.Zero, 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                    }
                    if (num19 != 0 && num31 == 0 && num32 == 1)
                    {
                        if (num17 == 1)
                        {
                            if (num20 != num12)
                            {
                                spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11 + 8) - Main.screenPosition, new Rectangle(num21, 0, 16, 16 - num33 - 8), color4, 0f, Vector2.Zero, 1f, SpriteEffects.FlipHorizontally, 0f);
                            }
                            else
                            {
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11 + 8) - Main.screenPosition, new Rectangle(num21, 0, 16, 16 - num33 - 8), color5, 0f, Vector2.Zero, 1f, SpriteEffects.FlipHorizontally, 0f);
                            }
                        }
                        else
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11 + 8) - Main.screenPosition, new Rectangle(num21, 0, 16, 16 - num33 - 8), color5, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
                        }
                    }
                    if (num11 == 8 && num16 == 1 && num19 == 0)
                    {
                        if (num18 == -1)
                        {
                            if (num20 != num12)
                            {
                                spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 8), color4, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                            else
                            {
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 8), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                        }
                        else if (num20 != num12)
                        {
                            spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 8), color4, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                        else
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 8), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                    }
                    if (num34 != 0 && num15 == 0)
                    {
                        if (num35 == 1)
                        {
                            if (num20 != num12)
                            {
                                spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color4, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                            }
                            else
                            {
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                            }
                        }
                        else if (num20 != num12)
                        {
                            spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color4, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                        }
                        else
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                        }
                    }
                    if (num32 == 1 && num34 == 0 && num19 == 0)
                    {
                        if (num17 == -1)
                        {
                            if (num16 == 0)
                            {
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11) - Main.screenPosition, new Rectangle(num21, 0, 16, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                            else if (num20 != num12)
                            {
                                spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color4, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                            else
                            {
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                        }
                        else if (num16 == 0)
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11) - Main.screenPosition, new Rectangle(num21, 0, 16, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                        else if (num20 != num12)
                        {
                            spriteBatch.Draw(waterfallTexture[num20].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color4, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                        else
                        {
                            spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 - 16, num14 * 16) - Main.screenPosition, new Rectangle(num21, 24, 32, 16 - num33), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                        }
                    }
                    else
                    {
                        switch (num31)
                        {
                        case 1:
                            if (Main.tile[num13, num14].liquid > 0 && !Main.tile[num13, num14].halfBrick())
                            {
                                break;
                            }
                            if (num34 == 1)
                            {
                                for (int m = 0; m < 8; m++)
                                {
                                    int num55 = m * 2;
                                    int num56 = 14 - m * 2;
                                    int num57 = num55;
                                    num11 = 8;
                                    if (num15 == 0 && m < 2)
                                    {
                                        num57 = 4;
                                    }
                                    spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 + num55, num14 * 16 + num11 + num57) - Main.screenPosition, new Rectangle(16 + num21 + num56, 0, 2, 16 - num11), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                                }
                            }
                            else
                            {
                                int height2 = 16;
                                if (TileID.Sets.BlocksWaterDrawingBehindSelf[Main.tile[num13, num14].type])
                                {
                                    height2 = 8;
                                }
                                else if (TileID.Sets.BlocksWaterDrawingBehindSelf[Main.tile[num13, num14 + 1].type])
                                {
                                    height2 = 8;
                                }
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11) - Main.screenPosition, new Rectangle(16 + num21, 0, 16, height2), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                            }
                            break;

                        case -1:
                            if (Main.tile[num13, num14].liquid > 0 && !Main.tile[num13, num14].halfBrick())
                            {
                                break;
                            }
                            if (num34 == -1)
                            {
                                for (int l = 0; l < 8; l++)
                                {
                                    int num52 = l * 2;
                                    int num53 = l * 2;
                                    int num54 = 14 - l * 2;
                                    num11 = 8;
                                    if (num15 == 0 && l > 5)
                                    {
                                        num54 = 4;
                                    }
                                    spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16 + num52, num14 * 16 + num11 + num54) - Main.screenPosition, new Rectangle(16 + num21 + num53, 0, 2, 16 - num11), color5, 0f, default(Vector2), 1f, SpriteEffects.FlipHorizontally, 0f);
                                }
                            }
                            else
                            {
                                int height = 16;
                                if (TileID.Sets.BlocksWaterDrawingBehindSelf[Main.tile[num13, num14].type])
                                {
                                    height = 8;
                                }
                                else if (TileID.Sets.BlocksWaterDrawingBehindSelf[Main.tile[num13, num14 + 1].type])
                                {
                                    height = 8;
                                }
                                spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11) - Main.screenPosition, new Rectangle(16 + num21, 0, 16, height), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                            }
                            break;

                        case 0:
                            if (num32 == 0)
                            {
                                if (Main.tile[num13, num14].liquid <= 0 || Main.tile[num13, num14].halfBrick())
                                {
                                    spriteBatch.Draw(waterfallTexture[num12].get_Value(), new Vector2(num13 * 16, num14 * 16 + num11) - Main.screenPosition, new Rectangle(16 + num21, 0, 16, 16), color5, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
                                }
                                k = 1000;
                            }
                            break;
                        }
                    }
                    if (tile3.liquid > 0 && !tile3.halfBrick())
                    {
                        k = 1000;
                    }
                    num16  = num32;
                    num18  = num17;
                    num15  = num31;
                    num13 += num31;
                    num14 += num32;
                    num19  = num34;
                    color4 = color5;
                    if (num20 != num12)
                    {
                        num20 = num12;
                    }
                    if ((tile4.active() && (tile4.type == 189 || tile4.type == 196)) || (tile6.active() && (tile6.type == 189 || tile6.type == 196)) || (tile5.active() && (tile5.type == 189 || tile5.type == 196)))
                    {
                        num22 = (int)((float)(40 * (Main.maxTilesX / 4200)) * Main.gfxQuality);
                    }
                }
            }
            Main.ambientWaterfallX        = num4;
            Main.ambientWaterfallY        = num5;
            Main.ambientWaterfallStrength = num;
            Main.ambientLavafallX         = num9;
            Main.ambientLavafallY         = num10;
            Main.ambientLavafallStrength  = num6;
            Main.tileSolid[546]           = true;
        }
Exemplo n.º 3
0
        public static bool CanPlace(int x, int y, int type, int style, int dir, out TileObject objectData, bool onlyCheck = false)
        {
            TileObjectData tileData = TileObjectData.GetTileData(type, style);

            objectData = Empty;
            if (tileData == null)
            {
                return(false);
            }
            int num  = x - tileData.Origin.X;
            int num2 = y - tileData.Origin.Y;

            if (num < 0 || num + tileData.Width >= Main.maxTilesX || num2 < 0 || num2 + tileData.Height >= Main.maxTilesY)
            {
                return(false);
            }
            bool flag = tileData.RandomStyleRange > 0;

            if (TileObjectPreviewData.placementCache == null)
            {
                TileObjectPreviewData.placementCache = new TileObjectPreviewData();
            }
            TileObjectPreviewData.placementCache.Reset();
            int num3 = 0;

            if (tileData.AlternatesCount != 0)
            {
                num3 = tileData.AlternatesCount;
            }
            float          num4           = -1f;
            float          num5           = -1f;
            int            num6           = 0;
            TileObjectData tileObjectData = null;
            int            num7           = -1;

            while (num7 < num3)
            {
                num7++;
                TileObjectData tileData2 = TileObjectData.GetTileData(type, style, num7);
                if (tileData2.Direction != 0 && ((tileData2.Direction == TileObjectDirection.PlaceLeft && dir == 1) || (tileData2.Direction == TileObjectDirection.PlaceRight && dir == -1)))
                {
                    continue;
                }
                int num8 = x - tileData2.Origin.X;
                int num9 = y - tileData2.Origin.Y;
                if (num8 < 5 || num8 + tileData2.Width > Main.maxTilesX - 5 || num9 < 5 || num9 + tileData2.Height > Main.maxTilesY - 5)
                {
                    return(false);
                }
                Rectangle rectangle = new Rectangle(0, 0, tileData2.Width, tileData2.Height);
                int       num10     = 0;
                int       num11     = 0;
                if (tileData2.AnchorTop.tileCount != 0)
                {
                    if (rectangle.Y == 0)
                    {
                        rectangle.Y = -1;
                        rectangle.Height++;
                        num11++;
                    }
                    int checkStart = tileData2.AnchorTop.checkStart;
                    if (checkStart < rectangle.X)
                    {
                        rectangle.Width += rectangle.X - checkStart;
                        num10           += rectangle.X - checkStart;
                        rectangle.X      = checkStart;
                    }
                    int num12 = checkStart + tileData2.AnchorTop.tileCount - 1;
                    int num13 = rectangle.X + rectangle.Width - 1;
                    if (num12 > num13)
                    {
                        rectangle.Width += num12 - num13;
                    }
                }
                if (tileData2.AnchorBottom.tileCount != 0)
                {
                    if (rectangle.Y + rectangle.Height == tileData2.Height)
                    {
                        rectangle.Height++;
                    }
                    int checkStart2 = tileData2.AnchorBottom.checkStart;
                    if (checkStart2 < rectangle.X)
                    {
                        rectangle.Width += rectangle.X - checkStart2;
                        num10           += rectangle.X - checkStart2;
                        rectangle.X      = checkStart2;
                    }
                    int num14 = checkStart2 + tileData2.AnchorBottom.tileCount - 1;
                    int num15 = rectangle.X + rectangle.Width - 1;
                    if (num14 > num15)
                    {
                        rectangle.Width += num14 - num15;
                    }
                }
                if (tileData2.AnchorLeft.tileCount != 0)
                {
                    if (rectangle.X == 0)
                    {
                        rectangle.X = -1;
                        rectangle.Width++;
                        num10++;
                    }
                    int num16 = tileData2.AnchorLeft.checkStart;
                    if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num16--;
                    }
                    if (num16 < rectangle.Y)
                    {
                        rectangle.Width += rectangle.Y - num16;
                        num11           += rectangle.Y - num16;
                        rectangle.Y      = num16;
                    }
                    int num17 = num16 + tileData2.AnchorLeft.tileCount - 1;
                    if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num17 += 2;
                    }
                    int num18 = rectangle.Y + rectangle.Height - 1;
                    if (num17 > num18)
                    {
                        rectangle.Height += num17 - num18;
                    }
                }
                if (tileData2.AnchorRight.tileCount != 0)
                {
                    if (rectangle.X + rectangle.Width == tileData2.Width)
                    {
                        rectangle.Width++;
                    }
                    int num19 = tileData2.AnchorLeft.checkStart;
                    if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num19--;
                    }
                    if (num19 < rectangle.Y)
                    {
                        rectangle.Width += rectangle.Y - num19;
                        num11           += rectangle.Y - num19;
                        rectangle.Y      = num19;
                    }
                    int num20 = num19 + tileData2.AnchorRight.tileCount - 1;
                    if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num20 += 2;
                    }
                    int num21 = rectangle.Y + rectangle.Height - 1;
                    if (num20 > num21)
                    {
                        rectangle.Height += num20 - num21;
                    }
                }
                if (onlyCheck)
                {
                    objectPreview.Reset();
                    objectPreview.Active      = true;
                    objectPreview.Type        = (ushort)type;
                    objectPreview.Style       = (short)style;
                    objectPreview.Alternate   = num7;
                    objectPreview.Size        = new Point16(rectangle.Width, rectangle.Height);
                    objectPreview.ObjectStart = new Point16(num10, num11);
                    objectPreview.Coordinates = new Point16(num8 - num10, num9 - num11);
                }
                float num22 = 0f;
                float num23 = tileData2.Width * tileData2.Height;
                float num24 = 0f;
                float num25 = 0f;
                for (int i = 0; i < tileData2.Width; i++)
                {
                    for (int j = 0; j < tileData2.Height; j++)
                    {
                        Tile tileSafely = Framing.GetTileSafely(num8 + i, num9 + j);
                        bool flag2      = !tileData2.LiquidPlace(tileSafely);
                        bool flag3      = false;
                        if (tileData2.AnchorWall)
                        {
                            num25 += 1f;
                            if (!tileData2.isValidWallAnchor(tileSafely.wall))
                            {
                                flag3 = true;
                            }
                            else
                            {
                                num24 += 1f;
                            }
                        }
                        bool flag4 = false;
                        if (tileSafely.active() && (!Main.tileCut[tileSafely.type] || tileSafely.type == 484) && !TileID.Sets.BreakableWhenPlacing[tileSafely.type])
                        {
                            flag4 = true;
                        }
                        if (flag4 | flag2 | flag3)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[i + num10, j + num11] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[i + num10, j + num11] = 1;
                        }
                        num22 += 1f;
                    }
                }
                AnchorData anchorBottom = tileData2.AnchorBottom;
                if (anchorBottom.tileCount != 0)
                {
                    num25 += (float)anchorBottom.tileCount;
                    int height = tileData2.Height;
                    for (int k = 0; k < anchorBottom.tileCount; k++)
                    {
                        int  num26      = anchorBottom.checkStart + k;
                        Tile tileSafely = Framing.GetTileSafely(num8 + num26, num9 + height);
                        bool flag5      = false;
                        if (tileSafely.nactive())
                        {
                            if ((anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag5 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag5 && ((anchorBottom.type & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchorBottom.type & AnchorType.Table) == AnchorType.Table))
                            {
                                if (TileID.Sets.Platforms[tileSafely.type])
                                {
                                    _ = tileSafely.frameX / TileObjectData.PlatformFrameWidth();
                                    if (!tileSafely.halfBrick() && WorldGen.PlatformProperTopFrame(tileSafely.frameX))
                                    {
                                        flag5 = true;
                                    }
                                }
                                else if (Main.tileSolid[tileSafely.type] && Main.tileSolidTop[tileSafely.type])
                                {
                                    flag5 = true;
                                }
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.Table) == AnchorType.Table && !TileID.Sets.Platforms[tileSafely.type] && Main.tileTable[tileSafely.type] && tileSafely.blockType() == 0)
                            {
                                flag5 = true;
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                int num27 = tileSafely.blockType();
                                if ((uint)(num27 - 4) <= 1u)
                                {
                                    flag5 = tileData2.isValidTileAnchor(tileSafely.type);
                                }
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag5 = true;
                            }
                        }
                        else if (!flag5 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag5 = true;
                        }
                        if (!flag5)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num26 + num10, height + num11] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num26 + num10, height + num11] = 1;
                        }
                        num24 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorTop;
                if (anchorBottom.tileCount != 0)
                {
                    num25 += (float)anchorBottom.tileCount;
                    int num28 = -1;
                    for (int l = 0; l < anchorBottom.tileCount; l++)
                    {
                        int  num29      = anchorBottom.checkStart + l;
                        Tile tileSafely = Framing.GetTileSafely(num8 + num29, num9 + num28);
                        bool flag6      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.SolidBottom) == AnchorType.SolidBottom && ((Main.tileSolid[tileSafely.type] && (!Main.tileSolidTop[tileSafely.type] || (TileID.Sets.Platforms[tileSafely.type] && (tileSafely.halfBrick() || tileSafely.topSlope())))) || tileSafely.halfBrick() || tileSafely.topSlope()) && !TileID.Sets.NotReallySolid[tileSafely.type] && !tileSafely.bottomSlope())
                            {
                                flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                int num27 = tileSafely.blockType();
                                if ((uint)(num27 - 2) <= 1u)
                                {
                                    flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                                }
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag6 = true;
                            }
                        }
                        else if (!flag6 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag6 = true;
                        }
                        if (!flag6)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num29 + num10, num28 + num11] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num29 + num10, num28 + num11] = 1;
                        }
                        num24 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorRight;
                if (anchorBottom.tileCount != 0)
                {
                    num25 += (float)anchorBottom.tileCount;
                    int width = tileData2.Width;
                    for (int m = 0; m < anchorBottom.tileCount; m++)
                    {
                        int  num30      = anchorBottom.checkStart + m;
                        Tile tileSafely = Framing.GetTileSafely(num8 + width, num9 + num30);
                        bool flag7      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag7 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                int num27 = tileSafely.blockType();
                                if (num27 == 2 || num27 == 4)
                                {
                                    flag7 = tileData2.isValidTileAnchor(tileSafely.type);
                                }
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.Tree) == AnchorType.Tree && TileID.Sets.IsATreeTrunk[tileSafely.type])
                            {
                                flag7 = true;
                                if (m == 0)
                                {
                                    num25 += 1f;
                                    Tile tileSafely2 = Framing.GetTileSafely(num8 + width, num9 + num30 - 1);
                                    if (tileSafely2.nactive() && TileID.Sets.IsATreeTrunk[tileSafely2.type])
                                    {
                                        num24 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[width + num10, num30 + num11 - 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[width + num10, num30 + num11 - 1] = 2;
                                    }
                                }
                                if (m == anchorBottom.tileCount - 1)
                                {
                                    num25 += 1f;
                                    Tile tileSafely3 = Framing.GetTileSafely(num8 + width, num9 + num30 + 1);
                                    if (tileSafely3.nactive() && TileID.Sets.IsATreeTrunk[tileSafely3.type])
                                    {
                                        num24 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[width + num10, num30 + num11 + 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[width + num10, num30 + num11 + 1] = 2;
                                    }
                                }
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag7 = true;
                            }
                        }
                        else if (!flag7 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag7 = true;
                        }
                        if (!flag7)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[width + num10, num30 + num11] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[width + num10, num30 + num11] = 1;
                        }
                        num24 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorLeft;
                if (anchorBottom.tileCount != 0)
                {
                    num25 += (float)anchorBottom.tileCount;
                    int num31 = -1;
                    for (int n = 0; n < anchorBottom.tileCount; n++)
                    {
                        int  num32      = anchorBottom.checkStart + n;
                        Tile tileSafely = Framing.GetTileSafely(num8 + num31, num9 + num32);
                        bool flag8      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag8 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                int num27 = tileSafely.blockType();
                                if (num27 == 3 || num27 == 5)
                                {
                                    flag8 = tileData2.isValidTileAnchor(tileSafely.type);
                                }
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.Tree) == AnchorType.Tree && TileID.Sets.IsATreeTrunk[tileSafely.type])
                            {
                                flag8 = true;
                                if (n == 0)
                                {
                                    num25 += 1f;
                                    Tile tileSafely4 = Framing.GetTileSafely(num8 + num31, num9 + num32 - 1);
                                    if (tileSafely4.nactive() && TileID.Sets.IsATreeTrunk[tileSafely4.type])
                                    {
                                        num24 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[num31 + num10, num32 + num11 - 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[num31 + num10, num32 + num11 - 1] = 2;
                                    }
                                }
                                if (n == anchorBottom.tileCount - 1)
                                {
                                    num25 += 1f;
                                    Tile tileSafely5 = Framing.GetTileSafely(num8 + num31, num9 + num32 + 1);
                                    if (tileSafely5.nactive() && TileID.Sets.IsATreeTrunk[tileSafely5.type])
                                    {
                                        num24 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[num31 + num10, num32 + num11 + 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[num31 + num10, num32 + num11 + 1] = 2;
                                    }
                                }
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag8 = true;
                            }
                        }
                        else if (!flag8 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag8 = true;
                        }
                        if (!flag8)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num31 + num10, num32 + num11] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num31 + num10, num32 + num11] = 1;
                        }
                        num24 += 1f;
                    }
                }
                if (tileData2.HookCheckIfCanPlace.hook != null)
                {
                    if (tileData2.HookCheckIfCanPlace.processedCoordinates)
                    {
                        _ = tileData2.Origin;
                        _ = tileData2.Origin;
                    }
                    if (tileData2.HookCheckIfCanPlace.hook(x, y, type, style, dir, num7) == tileData2.HookCheckIfCanPlace.badReturn && tileData2.HookCheckIfCanPlace.badResponse == 0)
                    {
                        num24 = 0f;
                        num22 = 0f;
                        objectPreview.AllInvalid();
                    }
                }
                float num33 = num24 / num25;
                float num34 = num22 / num23;
                if (num34 == 1f && num25 == 0f)
                {
                    num23 = 1f;
                    num25 = 1f;
                    num33 = 1f;
                    num34 = 1f;
                }
                if (num33 == 1f && num34 == 1f)
                {
                    num4           = 1f;
                    num5           = 1f;
                    num6           = num7;
                    tileObjectData = tileData2;
                    break;
                }
                if (num33 > num4 || (num33 == num4 && num34 > num5))
                {
                    TileObjectPreviewData.placementCache.CopyFrom(objectPreview);
                    num4           = num33;
                    num5           = num34;
                    tileObjectData = tileData2;
                    num6           = num7;
                }
            }
            int num35 = -1;

            if (flag)
            {
                if (TileObjectPreviewData.randomCache == null)
                {
                    TileObjectPreviewData.randomCache = new TileObjectPreviewData();
                }
                bool flag9 = false;
                if (TileObjectPreviewData.randomCache.Type == type)
                {
                    Point16 coordinates = TileObjectPreviewData.randomCache.Coordinates;
                    Point16 objectStart = TileObjectPreviewData.randomCache.ObjectStart;
                    int     num36       = coordinates.X + objectStart.X;
                    int     num37       = coordinates.Y + objectStart.Y;
                    int     num38       = x - tileData.Origin.X;
                    int     num39       = y - tileData.Origin.Y;
                    if (num36 != num38 || num37 != num39)
                    {
                        flag9 = true;
                    }
                }
                else
                {
                    flag9 = true;
                }
                num35 = ((!flag9) ? TileObjectPreviewData.randomCache.Random : Main.rand.Next(tileData.RandomStyleRange));
            }
            if (onlyCheck)
            {
                if (num4 != 1f || num5 != 1f)
                {
                    objectPreview.CopyFrom(TileObjectPreviewData.placementCache);
                    num7 = num6;
                }
                objectPreview.Random = num35;
                if (tileData.RandomStyleRange > 0)
                {
                    TileObjectPreviewData.randomCache.CopyFrom(objectPreview);
                }
            }
            if (!onlyCheck)
            {
                objectData.xCoord    = x - tileObjectData.Origin.X;
                objectData.yCoord    = y - tileObjectData.Origin.Y;
                objectData.type      = type;
                objectData.style     = style;
                objectData.alternate = num7;
                objectData.random    = num35;
            }
            if (num4 == 1f)
            {
                return(num5 == 1f);
            }
            return(false);
        }
Exemplo n.º 4
0
        public static bool CanPlace(int x, int y, int type, int style, int dir, out TileObject objectData, bool onlyCheck = false)
        {
            TileObjectData tileData1 = TileObjectData.GetTileData(type, style, 0);

            objectData = TileObject.Empty;
            if (tileData1 == null)
            {
                return(false);
            }
            int num1 = x - (int)tileData1.Origin.X;
            int num2 = y - (int)tileData1.Origin.Y;

            if (num1 < 0 || num1 + tileData1.Width >= Main.maxTilesX || (num2 < 0 || num2 + tileData1.Height >= Main.maxTilesY))
            {
                return(false);
            }
            bool flag1 = tileData1.RandomStyleRange > 0;

            if (TileObjectPreviewData.placementCache == null)
            {
                TileObjectPreviewData.placementCache = new TileObjectPreviewData();
            }
            TileObjectPreviewData.placementCache.Reset();
            int num3 = 0;
            int num4 = 0;

            if (tileData1.AlternatesCount != 0)
            {
                num4 = tileData1.AlternatesCount;
            }
            float          num5           = -1f;
            float          num6           = -1f;
            int            num7           = 0;
            TileObjectData tileObjectData = (TileObjectData)null;
            int            alternate      = num3 - 1;

            while (alternate < num4)
            {
                ++alternate;
                TileObjectData tileData2 = TileObjectData.GetTileData(type, style, alternate);
                if (tileData2.Direction == TileObjectDirection.None || (tileData2.Direction != TileObjectDirection.PlaceLeft || dir != 1) && (tileData2.Direction != TileObjectDirection.PlaceRight || dir != -1))
                {
                    int num8 = x - (int)tileData2.Origin.X;
                    int num9 = y - (int)tileData2.Origin.Y;
                    if (num8 < 5 || num8 + tileData2.Width > Main.maxTilesX - 5 || (num9 < 5 || num9 + tileData2.Height > Main.maxTilesY - 5))
                    {
                        return(false);
                    }
                    Rectangle rectangle;
                    // ISSUE: explicit reference operation
                    ((Rectangle)@rectangle).\u002Ector(0, 0, tileData2.Width, tileData2.Height);
                    int X = 0;
                    int Y = 0;
                    if (tileData2.AnchorTop.tileCount != 0)
                    {
                        if (rectangle.Y == null)
                        {
                            rectangle.Y = (__Null) - 1;
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Height + 1;
                            // ISSUE: explicit reference operation
                            (^ local).Height = (__Null)num10;
                            ++Y;
                        }
                        int checkStart = tileData2.AnchorTop.checkStart;
                        if (checkStart < rectangle.X)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (rectangle.X - checkStart);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                            X          += rectangle.X - checkStart;
                            rectangle.X = (__Null)checkStart;
                        }
                        int num11 = checkStart + tileData2.AnchorTop.tileCount - 1;
                        int num12 = rectangle.X + rectangle.Width - 1;
                        if (num11 > num12)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (num11 - num12);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                        }
                    }
                    if (tileData2.AnchorBottom.tileCount != 0)
                    {
                        if (rectangle.Y + rectangle.Height == tileData2.Height)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Height + 1;
                            // ISSUE: explicit reference operation
                            (^ local).Height = (__Null)num10;
                        }
                        int checkStart = tileData2.AnchorBottom.checkStart;
                        if (checkStart < rectangle.X)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (rectangle.X - checkStart);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                            X          += rectangle.X - checkStart;
                            rectangle.X = (__Null)checkStart;
                        }
                        int num11 = checkStart + tileData2.AnchorBottom.tileCount - 1;
                        int num12 = rectangle.X + rectangle.Width - 1;
                        if (num11 > num12)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (num11 - num12);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                        }
                    }
                    if (tileData2.AnchorLeft.tileCount != 0)
                    {
                        if (rectangle.X == null)
                        {
                            rectangle.X = (__Null) - 1;
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + 1;
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                            ++X;
                        }
                        int checkStart = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            --checkStart;
                        }
                        if (checkStart < rectangle.Y)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (rectangle.Y - checkStart);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                            Y          += rectangle.Y - checkStart;
                            rectangle.Y = (__Null)checkStart;
                        }
                        int num11 = checkStart + tileData2.AnchorLeft.tileCount - 1;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num11 += 2;
                        }
                        int num12 = rectangle.Y + rectangle.Height - 1;
                        if (num11 > num12)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Height + (num11 - num12);
                            // ISSUE: explicit reference operation
                            (^ local).Height = (__Null)num10;
                        }
                    }
                    if (tileData2.AnchorRight.tileCount != 0)
                    {
                        if (rectangle.X + rectangle.Width == tileData2.Width)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + 1;
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                        }
                        int checkStart = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            --checkStart;
                        }
                        if (checkStart < rectangle.Y)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Width + (rectangle.Y - checkStart);
                            // ISSUE: explicit reference operation
                            (^ local).Width = (__Null)num10;
                            Y          += rectangle.Y - checkStart;
                            rectangle.Y = (__Null)checkStart;
                        }
                        int num11 = checkStart + tileData2.AnchorRight.tileCount - 1;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num11 += 2;
                        }
                        int num12 = rectangle.Y + rectangle.Height - 1;
                        if (num11 > num12)
                        {
                            // ISSUE: explicit reference operation
                            // ISSUE: variable of a reference type
                            Rectangle& local = @rectangle;
                            // ISSUE: explicit reference operation
                            int num10 = (^ local).Height + (num11 - num12);
                            // ISSUE: explicit reference operation
                            (^ local).Height = (__Null)num10;
                        }
                    }
                    if (onlyCheck)
                    {
                        TileObject.objectPreview.Reset();
                        TileObject.objectPreview.Active      = true;
                        TileObject.objectPreview.Type        = (ushort)type;
                        TileObject.objectPreview.Style       = (short)style;
                        TileObject.objectPreview.Alternate   = alternate;
                        TileObject.objectPreview.Size        = new Point16((int)rectangle.Width, (int)rectangle.Height);
                        TileObject.objectPreview.ObjectStart = new Point16(X, Y);
                        TileObject.objectPreview.Coordinates = new Point16(num8 - X, num9 - Y);
                    }
                    float num13 = 0.0f;
                    float num14 = (float)(tileData2.Width * tileData2.Height);
                    float num15 = 0.0f;
                    float num16 = 0.0f;
                    for (int index1 = 0; index1 < tileData2.Width; ++index1)
                    {
                        for (int index2 = 0; index2 < tileData2.Height; ++index2)
                        {
                            Tile tileSafely = Framing.GetTileSafely(num8 + index1, num9 + index2);
                            bool flag2      = !tileData2.LiquidPlace(tileSafely);
                            bool flag3      = false;
                            if (tileData2.AnchorWall)
                            {
                                ++num16;
                                if (!tileData2.isValidWallAnchor((int)tileSafely.wall))
                                {
                                    flag3 = true;
                                }
                                else
                                {
                                    ++num15;
                                }
                            }
                            bool flag4 = false;
                            if (tileSafely.active() && !Main.tileCut[(int)tileSafely.type])
                            {
                                flag4 = true;
                            }
                            if (flag4 || flag2 || flag3)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[index1 + X, index2 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[index1 + X, index2 + Y] = 1;
                                }
                                ++num13;
                            }
                        }
                    }
                    AnchorData anchorBottom = tileData2.AnchorBottom;
                    if (anchorBottom.tileCount != 0)
                    {
                        num16 += (float)anchorBottom.tileCount;
                        int height = tileData2.Height;
                        for (int index = 0; index < anchorBottom.tileCount; ++index)
                        {
                            int  num10      = anchorBottom.checkStart + index;
                            Tile tileSafely = Framing.GetTileSafely(num8 + num10, num9 + height);
                            bool flag2      = false;
                            if (tileSafely.nactive())
                            {
                                if ((anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[(int)tileSafely.type] && (!Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type]) && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && ((anchorBottom.type & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchorBottom.type & AnchorType.Table) == AnchorType.Table))
                                {
                                    if (TileID.Sets.Platforms[(int)tileSafely.type])
                                    {
                                        int num11 = (int)tileSafely.frameX / TileObjectData.PlatformFrameWidth();
                                        if (!tileSafely.halfBrick() && num11 >= 0 && num11 <= 7 || (num11 >= 12 && num11 <= 16 || num11 >= 25 && num11 <= 26))
                                        {
                                            flag2 = true;
                                        }
                                    }
                                    else if (Main.tileSolid[(int)tileSafely.type] && Main.tileSolidTop[(int)tileSafely.type])
                                    {
                                        flag2 = true;
                                    }
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.Table) == AnchorType.Table && (!TileID.Sets.Platforms[(int)tileSafely.type] && Main.tileTable[(int)tileSafely.type]) && tileSafely.blockType() == 0)
                                {
                                    flag2 = true;
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type]))
                                {
                                    switch (tileSafely.blockType())
                                    {
                                    case 4:
                                    case 5:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, height + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, height + Y] = 1;
                                }
                                ++num15;
                            }
                        }
                    }
                    AnchorData anchorTop = tileData2.AnchorTop;
                    if (anchorTop.tileCount != 0)
                    {
                        num16 += (float)anchorTop.tileCount;
                        int num10 = -1;
                        for (int index = 0; index < anchorTop.tileCount; ++index)
                        {
                            int  num11      = anchorTop.checkStart + index;
                            Tile tileSafely = Framing.GetTileSafely(num8 + num11, num9 + num10);
                            bool flag2      = false;
                            if (tileSafely.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.SolidBottom) == AnchorType.SolidBottom && (Main.tileSolid[(int)tileSafely.type] && (!Main.tileSolidTop[(int)tileSafely.type] || TileID.Sets.Platforms[(int)tileSafely.type] && (tileSafely.halfBrick() || tileSafely.topSlope())) || (tileSafely.halfBrick() || tileSafely.topSlope())) && (!TileID.Sets.NotReallySolid[(int)tileSafely.type] && !tileSafely.bottomSlope()))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type]))
                                {
                                    switch (tileSafely.blockType())
                                    {
                                    case 2:
                                    case 3:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorTop.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorTop.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num11 + X, num10 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num11 + X, num10 + Y] = 1;
                                }
                                ++num15;
                            }
                        }
                    }
                    AnchorData anchorRight = tileData2.AnchorRight;
                    if (anchorRight.tileCount != 0)
                    {
                        num16 += (float)anchorRight.tileCount;
                        int width = tileData2.Width;
                        for (int index = 0; index < anchorRight.tileCount; ++index)
                        {
                            int  num10       = anchorRight.checkStart + index;
                            Tile tileSafely1 = Framing.GetTileSafely(num8 + width, num9 + num10);
                            bool flag2       = false;
                            if (tileSafely1.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type] && !Main.tileNoAttach[(int)tileSafely1.type] && (tileData2.FlattenAnchors || tileSafely1.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type]))
                                {
                                    switch (tileSafely1.blockType())
                                    {
                                    case 2:
                                    case 4:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.Tree) == AnchorType.Tree && (int)tileSafely1.type == 5)
                                {
                                    flag2 = true;
                                    if (index == 0)
                                    {
                                        ++num16;
                                        Tile tileSafely2 = Framing.GetTileSafely(num8 + width, num9 + num10 - 1);
                                        if (tileSafely2.nactive() && (int)tileSafely2.type == 5)
                                        {
                                            ++num15;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + X, num10 + Y - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + X, num10 + Y - 1] = 2;
                                        }
                                    }
                                    if (index == anchorRight.tileCount - 1)
                                    {
                                        ++num16;
                                        Tile tileSafely2 = Framing.GetTileSafely(num8 + width, num9 + num10 + 1);
                                        if (tileSafely2.nactive() && (int)tileSafely2.type == 5)
                                        {
                                            ++num15;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + X, num10 + Y + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + X, num10 + Y + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag2 && (anchorRight.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely1.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorRight.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + X, num10 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + X, num10 + Y] = 1;
                                }
                                ++num15;
                            }
                        }
                    }
                    AnchorData anchorLeft = tileData2.AnchorLeft;
                    if (anchorLeft.tileCount != 0)
                    {
                        num16 += (float)anchorLeft.tileCount;
                        int num10 = -1;
                        for (int index = 0; index < anchorLeft.tileCount; ++index)
                        {
                            int  num11       = anchorLeft.checkStart + index;
                            Tile tileSafely1 = Framing.GetTileSafely(num8 + num10, num9 + num11);
                            bool flag2       = false;
                            if (tileSafely1.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type] && !Main.tileNoAttach[(int)tileSafely1.type] && (tileData2.FlattenAnchors || tileSafely1.blockType() == 0))
                                {
                                    flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.SolidSide) == AnchorType.SolidSide && (Main.tileSolid[(int)tileSafely1.type] && !Main.tileSolidTop[(int)tileSafely1.type]))
                                {
                                    switch (tileSafely1.blockType())
                                    {
                                    case 3:
                                    case 5:
                                        flag2 = tileData2.isValidTileAnchor((int)tileSafely1.type);
                                        break;
                                    }
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.Tree) == AnchorType.Tree && (int)tileSafely1.type == 5)
                                {
                                    flag2 = true;
                                    if (index == 0)
                                    {
                                        ++num16;
                                        Tile tileSafely2 = Framing.GetTileSafely(num8 + num10, num9 + num11 - 1);
                                        if (tileSafely2.nactive() && (int)tileSafely2.type == 5)
                                        {
                                            ++num15;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num10 + X, num11 + Y - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num10 + X, num11 + Y - 1] = 2;
                                        }
                                    }
                                    if (index == anchorLeft.tileCount - 1)
                                    {
                                        ++num16;
                                        Tile tileSafely2 = Framing.GetTileSafely(num8 + num10, num9 + num11 + 1);
                                        if (tileSafely2.nactive() && (int)tileSafely2.type == 5)
                                        {
                                            ++num15;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num10 + X, num11 + Y + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num10 + X, num11 + Y + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag2 && (anchorLeft.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely1.type))
                                {
                                    flag2 = true;
                                }
                            }
                            else if (!flag2 && (anchorLeft.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag2 = true;
                            }
                            if (!flag2)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, num11 + Y] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num10 + X, num11 + Y] = 1;
                                }
                                ++num15;
                            }
                        }
                    }
                    if (tileData2.HookCheck.hook != null)
                    {
                        if (tileData2.HookCheck.processedCoordinates)
                        {
                            int x1 = (int)tileData2.Origin.X;
                            int y1 = (int)tileData2.Origin.Y;
                        }
                        if (tileData2.HookCheck.hook.Invoke(x, y, type, style, dir) == tileData2.HookCheck.badReturn && tileData2.HookCheck.badResponse == 0)
                        {
                            num15 = 0.0f;
                            num13 = 0.0f;
                            TileObject.objectPreview.AllInvalid();
                        }
                    }
                    float num17 = num15 / num16;
                    float num18 = num13 / num14;
                    if ((double)num18 == 1.0 && (double)num16 == 0.0)
                    {
                        num17 = 1f;
                        num18 = 1f;
                    }
                    if ((double)num17 == 1.0 && (double)num18 == 1.0)
                    {
                        num5           = 1f;
                        num6           = 1f;
                        num7           = alternate;
                        tileObjectData = tileData2;
                        break;
                    }
                    if ((double)num17 > (double)num5 || (double)num17 == (double)num5 && (double)num18 > (double)num6)
                    {
                        TileObjectPreviewData.placementCache.CopyFrom(TileObject.objectPreview);
                        num5           = num17;
                        num6           = num18;
                        tileObjectData = tileData2;
                        num7           = alternate;
                    }
                }
            }
            int num19 = -1;

            if (flag1)
            {
                if (TileObjectPreviewData.randomCache == null)
                {
                    TileObjectPreviewData.randomCache = new TileObjectPreviewData();
                }
                bool flag2 = false;
                if ((int)TileObjectPreviewData.randomCache.Type == type)
                {
                    Point16 coordinates = TileObjectPreviewData.randomCache.Coordinates;
                    Point16 objectStart = TileObjectPreviewData.randomCache.ObjectStart;
                    int     num8        = (int)coordinates.X + (int)objectStart.X;
                    int     num9        = (int)coordinates.Y + (int)objectStart.Y;
                    int     num10       = x - (int)tileData1.Origin.X;
                    int     num11       = y - (int)tileData1.Origin.Y;
                    if (num8 != num10 || num9 != num11)
                    {
                        flag2 = true;
                    }
                }
                else
                {
                    flag2 = true;
                }
                num19 = !flag2 ? TileObjectPreviewData.randomCache.Random : Main.rand.Next(tileData1.RandomStyleRange);
            }
            if (onlyCheck)
            {
                if ((double)num5 != 1.0 || (double)num6 != 1.0)
                {
                    TileObject.objectPreview.CopyFrom(TileObjectPreviewData.placementCache);
                    alternate = num7;
                }
                TileObject.objectPreview.Random = num19;
                if (tileData1.RandomStyleRange > 0)
                {
                    TileObjectPreviewData.randomCache.CopyFrom(TileObject.objectPreview);
                }
            }
            if (!onlyCheck)
            {
                objectData.xCoord    = x - (int)tileObjectData.Origin.X;
                objectData.yCoord    = y - (int)tileObjectData.Origin.Y;
                objectData.type      = type;
                objectData.style     = style;
                objectData.alternate = alternate;
                objectData.random    = num19;
            }
            if ((double)num5 == 1.0)
            {
                return((double)num6 == 1.0);
            }
            return(false);
        }
Exemplo n.º 5
0
 public static bool AnchorValid(Tile tileCache, AnchorType anchor)
 {
     bool flag = false;
     if (tileCache.nactive())
     {
         if ((anchor & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[(int)tileCache.type] && !Main.tileSolidTop[(int)tileCache.type] && !Main.tileNoAttach[(int)tileCache.type] && tileCache.blockType() == 0)
         {
             flag = true;
         }
         if ((anchor & AnchorType.SolidBottom) == AnchorType.SolidBottom && !Main.tileNoAttach[(int)tileCache.type] && ((Main.tileSolid[(int)tileCache.type] && (!Main.tileSolidTop[(int)tileCache.type] || (tileCache.type == 19 && (tileCache.halfBrick() || tileCache.topSlope())))) || tileCache.topSlope() || tileCache.halfBrick()) && !TileID.Sets.NotReallySolid[(int)tileCache.type] && !tileCache.bottomSlope())
         {
             flag = true;
         }
         if (!flag && ((anchor & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchor & AnchorType.Table) == AnchorType.Table))
         {
             if (tileCache.type == 19)
             {
                 int num = (int)tileCache.frameX / TileObjectData.PlatformFrameWidth();
                 if ((!tileCache.halfBrick() && num >= 0 && num <= 7) || (num >= 12 && num <= 16) || (num >= 25 && num <= 26))
                 {
                     flag = true;
                 }
             }
             else if (Main.tileSolid[(int)tileCache.type] && Main.tileSolidTop[(int)tileCache.type])
             {
                 flag = true;
             }
         }
         if (!flag && (anchor & AnchorType.Table) == AnchorType.Table && tileCache.type != 19 && Main.tileTable[(int)tileCache.type] && tileCache.blockType() == 0)
         {
             flag = true;
         }
         if (!flag && (anchor & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[(int)tileCache.type] && !Main.tileSolidTop[(int)tileCache.type])
         {
             switch (tileCache.blockType())
             {
                 case 4:
                 case 5:
                     flag = true;
                     break;
             }
         }
     }
     else if (!flag && (anchor & AnchorType.EmptyTile) == AnchorType.EmptyTile)
     {
         flag = true;
     }
     return flag;
 }
Exemplo n.º 6
0
        public static bool CanPlace(int x, int y, int type, int style, int dir, out TileObject objectData, bool onlyCheck = false)
        {
            TileObjectData tileData = TileObjectData.GetTileData(type, style);

            objectData = Empty;
            if (tileData == null)
            {
                return(false);
            }
            int num  = x - tileData.Origin.X;
            int num2 = y - tileData.Origin.Y;

            if (num < 0 || num + tileData.Width >= Main.maxTilesX || num2 < 0 || num2 + tileData.Height >= Main.maxTilesY)
            {
                return(false);
            }
            bool flag = tileData.RandomStyleRange > 0;

            if (TileObjectPreviewData.placementCache == null)
            {
                TileObjectPreviewData.placementCache = new TileObjectPreviewData();
            }
            TileObjectPreviewData.placementCache.Reset();
            int num3 = 0;
            int num4 = 0;

            if (tileData.AlternatesCount != 0)
            {
                num4 = tileData.AlternatesCount;
            }
            float          num5           = -1f;
            float          num6           = -1f;
            int            num7           = 0;
            TileObjectData tileObjectData = null;
            int            num8           = num3 - 1;

            while (num8 < num4)
            {
                num8++;
                TileObjectData tileData2 = TileObjectData.GetTileData(type, style, num8);
                if (tileData2.Direction != 0 && ((tileData2.Direction == TileObjectDirection.PlaceLeft && dir == 1) || (tileData2.Direction == TileObjectDirection.PlaceRight && dir == -1)))
                {
                    continue;
                }
                int num9  = x - tileData2.Origin.X;
                int num10 = y - tileData2.Origin.Y;
                if (num9 < 5 || num9 + tileData2.Width > Main.maxTilesX - 5 || num10 < 5 || num10 + tileData2.Height > Main.maxTilesY - 5)
                {
                    return(false);
                }
                Rectangle rectangle = new Rectangle(0, 0, tileData2.Width, tileData2.Height);
                int       num11     = 0;
                int       num12     = 0;
                if (tileData2.AnchorTop.tileCount != 0)
                {
                    if (rectangle.Y == 0)
                    {
                        rectangle.Y = -1;
                        rectangle.Height++;
                        num12++;
                    }
                    int checkStart = tileData2.AnchorTop.checkStart;
                    if (checkStart < rectangle.X)
                    {
                        rectangle.Width += rectangle.X - checkStart;
                        num11           += rectangle.X - checkStart;
                        rectangle.X      = checkStart;
                    }
                    int num13 = checkStart + tileData2.AnchorTop.tileCount - 1;
                    int num14 = rectangle.X + rectangle.Width - 1;
                    if (num13 > num14)
                    {
                        rectangle.Width += num13 - num14;
                    }
                }
                if (tileData2.AnchorBottom.tileCount != 0)
                {
                    if (rectangle.Y + rectangle.Height == tileData2.Height)
                    {
                        rectangle.Height++;
                    }
                    int checkStart2 = tileData2.AnchorBottom.checkStart;
                    if (checkStart2 < rectangle.X)
                    {
                        rectangle.Width += rectangle.X - checkStart2;
                        num11           += rectangle.X - checkStart2;
                        rectangle.X      = checkStart2;
                    }
                    int num15 = checkStart2 + tileData2.AnchorBottom.tileCount - 1;
                    int num16 = rectangle.X + rectangle.Width - 1;
                    if (num15 > num16)
                    {
                        rectangle.Width += num15 - num16;
                    }
                }
                if (tileData2.AnchorLeft.tileCount != 0)
                {
                    if (rectangle.X == 0)
                    {
                        rectangle.X = -1;
                        rectangle.Width++;
                        num11++;
                    }
                    int num17 = tileData2.AnchorLeft.checkStart;
                    if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num17--;
                    }
                    if (num17 < rectangle.Y)
                    {
                        rectangle.Width += rectangle.Y - num17;
                        num12           += rectangle.Y - num17;
                        rectangle.Y      = num17;
                    }
                    int num18 = num17 + tileData2.AnchorLeft.tileCount - 1;
                    if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num18 += 2;
                    }
                    int num19 = rectangle.Y + rectangle.Height - 1;
                    if (num18 > num19)
                    {
                        rectangle.Height += num18 - num19;
                    }
                }
                if (tileData2.AnchorRight.tileCount != 0)
                {
                    if (rectangle.X + rectangle.Width == tileData2.Width)
                    {
                        rectangle.Width++;
                    }
                    int num20 = tileData2.AnchorLeft.checkStart;
                    if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num20--;
                    }
                    if (num20 < rectangle.Y)
                    {
                        rectangle.Width += rectangle.Y - num20;
                        num12           += rectangle.Y - num20;
                        rectangle.Y      = num20;
                    }
                    int num21 = num20 + tileData2.AnchorRight.tileCount - 1;
                    if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                    {
                        num21 += 2;
                    }
                    int num22 = rectangle.Y + rectangle.Height - 1;
                    if (num21 > num22)
                    {
                        rectangle.Height += num21 - num22;
                    }
                }
                if (onlyCheck)
                {
                    objectPreview.Reset();
                    objectPreview.Active      = true;
                    objectPreview.Type        = (ushort)type;
                    objectPreview.Style       = (short)style;
                    objectPreview.Alternate   = num8;
                    objectPreview.Size        = new Point16(rectangle.Width, rectangle.Height);
                    objectPreview.ObjectStart = new Point16(num11, num12);
                    objectPreview.Coordinates = new Point16(num9 - num11, num10 - num12);
                }
                float num23 = 0f;
                float num24 = tileData2.Width * tileData2.Height;
                float num25 = 0f;
                float num26 = 0f;
                for (int i = 0; i < tileData2.Width; i++)
                {
                    for (int j = 0; j < tileData2.Height; j++)
                    {
                        Tile tileSafely = Framing.GetTileSafely(num9 + i, num10 + j);
                        bool flag2      = !tileData2.LiquidPlace(tileSafely);
                        bool flag3      = false;
                        if (tileData2.AnchorWall)
                        {
                            num26 += 1f;
                            if (!tileData2.isValidWallAnchor(tileSafely.wall))
                            {
                                flag3 = true;
                            }
                            else
                            {
                                num25 += 1f;
                            }
                        }
                        bool flag4 = false;
                        if (tileSafely.active() && !Main.tileCut[tileSafely.type])
                        {
                            flag4 = true;
                        }
                        if (flag4 || flag2 || flag3)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[i + num11, j + num12] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[i + num11, j + num12] = 1;
                        }
                        num23 += 1f;
                    }
                }
                AnchorData anchorBottom = tileData2.AnchorBottom;
                if (anchorBottom.tileCount != 0)
                {
                    num26 += (float)anchorBottom.tileCount;
                    int height = tileData2.Height;
                    for (int k = 0; k < anchorBottom.tileCount; k++)
                    {
                        int  num27      = anchorBottom.checkStart + k;
                        Tile tileSafely = Framing.GetTileSafely(num9 + num27, num10 + height);
                        bool flag5      = false;
                        if (tileSafely.nactive())
                        {
                            if ((anchorBottom.type & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag5 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag5 && ((anchorBottom.type & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchorBottom.type & AnchorType.Table) == AnchorType.Table))
                            {
                                if (tileSafely.type == 19)
                                {
                                    int num28 = tileSafely.frameX / TileObjectData.PlatformFrameWidth();
                                    if ((!tileSafely.halfBrick() && num28 >= 0 && num28 <= 7) || (num28 >= 12 && num28 <= 16) || (num28 >= 25 && num28 <= 26))
                                    {
                                        flag5 = true;
                                    }
                                }
                                else if (Main.tileSolid[tileSafely.type] && Main.tileSolidTop[tileSafely.type])
                                {
                                    flag5 = true;
                                }
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.Table) == AnchorType.Table && tileSafely.type != 19 && Main.tileTable[tileSafely.type] && tileSafely.blockType() == 0)
                            {
                                flag5 = true;
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                switch (tileSafely.blockType())
                                {
                                case 4:
                                case 5:
                                    flag5 = tileData2.isValidTileAnchor(tileSafely.type);
                                    break;
                                }
                            }
                            if (!flag5 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag5 = true;
                            }
                        }
                        else if (!flag5 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag5 = true;
                        }
                        if (!flag5)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num27 + num11, height + num12] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num27 + num11, height + num12] = 1;
                        }
                        num25 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorTop;
                if (anchorBottom.tileCount != 0)
                {
                    num26 += (float)anchorBottom.tileCount;
                    int num29 = -1;
                    for (int l = 0; l < anchorBottom.tileCount; l++)
                    {
                        int  num30      = anchorBottom.checkStart + l;
                        Tile tileSafely = Framing.GetTileSafely(num9 + num30, num10 + num29);
                        bool flag6      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.SolidBottom) == AnchorType.SolidBottom && ((Main.tileSolid[tileSafely.type] && (!Main.tileSolidTop[tileSafely.type] || (tileSafely.type == 19 && (tileSafely.halfBrick() || tileSafely.topSlope())))) || tileSafely.halfBrick() || tileSafely.topSlope()) && !TileID.Sets.NotReallySolid[tileSafely.type] && !tileSafely.bottomSlope())
                            {
                                flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                switch (tileSafely.blockType())
                                {
                                case 2:
                                case 3:
                                    flag6 = tileData2.isValidTileAnchor(tileSafely.type);
                                    break;
                                }
                            }
                            if (!flag6 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag6 = true;
                            }
                        }
                        else if (!flag6 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag6 = true;
                        }
                        if (!flag6)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num30 + num11, num29 + num12] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num30 + num11, num29 + num12] = 1;
                        }
                        num25 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorRight;
                if (anchorBottom.tileCount != 0)
                {
                    num26 += (float)anchorBottom.tileCount;
                    int width = tileData2.Width;
                    for (int m = 0; m < anchorBottom.tileCount; m++)
                    {
                        int  num31      = anchorBottom.checkStart + m;
                        Tile tileSafely = Framing.GetTileSafely(num9 + width, num10 + num31);
                        bool flag7      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag7 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                switch (tileSafely.blockType())
                                {
                                case 2:
                                case 4:
                                    flag7 = tileData2.isValidTileAnchor(tileSafely.type);
                                    break;
                                }
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.Tree) == AnchorType.Tree && tileSafely.type == 5)
                            {
                                flag7 = true;
                                if (m == 0)
                                {
                                    num26 += 1f;
                                    Tile tileSafely2 = Framing.GetTileSafely(num9 + width, num10 + num31 - 1);
                                    if (tileSafely2.nactive() && tileSafely2.type == 5)
                                    {
                                        num25 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[width + num11, num31 + num12 - 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[width + num11, num31 + num12 - 1] = 2;
                                    }
                                }
                                if (m == anchorBottom.tileCount - 1)
                                {
                                    num26 += 1f;
                                    Tile tileSafely3 = Framing.GetTileSafely(num9 + width, num10 + num31 + 1);
                                    if (tileSafely3.nactive() && tileSafely3.type == 5)
                                    {
                                        num25 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[width + num11, num31 + num12 + 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[width + num11, num31 + num12 + 1] = 2;
                                    }
                                }
                            }
                            if (!flag7 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag7 = true;
                            }
                        }
                        else if (!flag7 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag7 = true;
                        }
                        if (!flag7)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[width + num11, num31 + num12] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[width + num11, num31 + num12] = 1;
                        }
                        num25 += 1f;
                    }
                }
                anchorBottom = tileData2.AnchorLeft;
                if (anchorBottom.tileCount != 0)
                {
                    num26 += (float)anchorBottom.tileCount;
                    int num32 = -1;
                    for (int n = 0; n < anchorBottom.tileCount; n++)
                    {
                        int  num33      = anchorBottom.checkStart + n;
                        Tile tileSafely = Framing.GetTileSafely(num9 + num32, num10 + num33);
                        bool flag8      = false;
                        if (tileSafely.nactive())
                        {
                            if (Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type] && !Main.tileNoAttach[tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                            {
                                flag8 = tileData2.isValidTileAnchor(tileSafely.type);
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[tileSafely.type] && !Main.tileSolidTop[tileSafely.type])
                            {
                                switch (tileSafely.blockType())
                                {
                                case 3:
                                case 5:
                                    flag8 = tileData2.isValidTileAnchor(tileSafely.type);
                                    break;
                                }
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.Tree) == AnchorType.Tree && tileSafely.type == 5)
                            {
                                flag8 = true;
                                if (n == 0)
                                {
                                    num26 += 1f;
                                    Tile tileSafely4 = Framing.GetTileSafely(num9 + num32, num10 + num33 - 1);
                                    if (tileSafely4.nactive() && tileSafely4.type == 5)
                                    {
                                        num25 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[num32 + num11, num33 + num12 - 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[num32 + num11, num33 + num12 - 1] = 2;
                                    }
                                }
                                if (n == anchorBottom.tileCount - 1)
                                {
                                    num26 += 1f;
                                    Tile tileSafely5 = Framing.GetTileSafely(num9 + num32, num10 + num33 + 1);
                                    if (tileSafely5.nactive() && tileSafely5.type == 5)
                                    {
                                        num25 += 1f;
                                        if (onlyCheck)
                                        {
                                            objectPreview[num32 + num11, num33 + num12 + 1] = 1;
                                        }
                                    }
                                    else if (onlyCheck)
                                    {
                                        objectPreview[num32 + num11, num33 + num12 + 1] = 2;
                                    }
                                }
                            }
                            if (!flag8 && (anchorBottom.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor(tileSafely.type))
                            {
                                flag8 = true;
                            }
                        }
                        else if (!flag8 && (anchorBottom.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                        {
                            flag8 = true;
                        }
                        if (!flag8)
                        {
                            if (onlyCheck)
                            {
                                objectPreview[num32 + num11, num33 + num12] = 2;
                            }
                            continue;
                        }
                        if (onlyCheck)
                        {
                            objectPreview[num32 + num11, num33 + num12] = 1;
                        }
                        num25 += 1f;
                    }
                }
                if (tileData2.HookCheck.hook != null)
                {
                    if (tileData2.HookCheck.processedCoordinates)
                    {
                        short x2 = tileData2.Origin.X;
                        short y2 = tileData2.Origin.Y;
                    }
                    if (tileData2.HookCheck.hook(x, y, type, style, dir) == tileData2.HookCheck.badReturn && tileData2.HookCheck.badResponse == 0)
                    {
                        num25 = 0f;
                        num23 = 0f;
                        objectPreview.AllInvalid();
                    }
                }
                float num34 = num25 / num26;
                float num35 = num23 / num24;
                if (num34 == 1f && num35 == 1f)
                {
                    num5           = 1f;
                    num6           = 1f;
                    num7           = num8;
                    tileObjectData = tileData2;
                    break;
                }
                if (num34 > num5 || (num34 == num5 && num35 > num6))
                {
                    TileObjectPreviewData.placementCache.CopyFrom(objectPreview);
                    num5           = num34;
                    num6           = num35;
                    tileObjectData = tileData2;
                    num7           = num8;
                }
            }
            int num36 = -1;

            if (flag)
            {
                if (TileObjectPreviewData.randomCache == null)
                {
                    TileObjectPreviewData.randomCache = new TileObjectPreviewData();
                }
                bool flag9 = false;
                if (TileObjectPreviewData.randomCache.Type == type)
                {
                    Point16 coordinates = TileObjectPreviewData.randomCache.Coordinates;
                    Point16 objectStart = TileObjectPreviewData.randomCache.ObjectStart;
                    int     num37       = coordinates.X + objectStart.X;
                    int     num38       = coordinates.Y + objectStart.Y;
                    int     num39       = x - tileData.Origin.X;
                    int     num40       = y - tileData.Origin.Y;
                    if (num37 != num39 || num38 != num40)
                    {
                        flag9 = true;
                    }
                }
                else
                {
                    flag9 = true;
                }
                num36 = ((!flag9) ? TileObjectPreviewData.randomCache.Random : Main.rand.Next(tileData.RandomStyleRange));
            }
            if (onlyCheck)
            {
                if (num5 != 1f || num6 != 1f)
                {
                    objectPreview.CopyFrom(TileObjectPreviewData.placementCache);
                    num8 = num7;
                }
                objectPreview.Random = num36;
                if (tileData.RandomStyleRange > 0)
                {
                    TileObjectPreviewData.randomCache.CopyFrom(objectPreview);
                }
            }
            if (!onlyCheck)
            {
                objectData.xCoord    = x - tileObjectData.Origin.X;
                objectData.yCoord    = y - tileObjectData.Origin.Y;
                objectData.type      = type;
                objectData.style     = style;
                objectData.alternate = num8;
                objectData.random    = num36;
            }
            if (num5 == 1f)
            {
                return(num6 == 1f);
            }
            return(false);
        }
Exemplo n.º 7
0
        // Token: 0x060001A6 RID: 422 RVA: 0x0002ECC8 File Offset: 0x0002CEC8
        public static bool CanPlace(int x, int y, int type, int style, int dir, out TileObject objectData, bool onlyCheck = false)
        {
            TileObjectData tileData = TileObjectData.GetTileData(type, style, 0);

            objectData = TileObject.Empty;
            if (tileData == null)
            {
                return(false);
            }
            int num  = x - (int)tileData.Origin.X;
            int num2 = y - (int)tileData.Origin.Y;

            if (num < 0 || num + tileData.Width >= Main.maxTilesX || num2 < 0 || num2 + tileData.Height >= Main.maxTilesY)
            {
                return(false);
            }
            bool flag = tileData.RandomStyleRange > 0;

            if (TileObjectPreviewData.placementCache == null)
            {
                TileObjectPreviewData.placementCache = new TileObjectPreviewData();
            }
            TileObjectPreviewData.placementCache.Reset();
            int arg_AF_0 = 0;
            int num3     = 0;

            if (tileData.AlternatesCount != 0)
            {
                num3 = tileData.AlternatesCount;
            }
            float          num4           = -1f;
            float          num5           = -1f;
            int            num6           = 0;
            TileObjectData tileObjectData = null;
            int            i = arg_AF_0 - 1;

            while (i < num3)
            {
                i++;
                TileObjectData tileData2 = TileObjectData.GetTileData(type, style, i);
                if (tileData2.Direction == TileObjectDirection.None || ((tileData2.Direction != TileObjectDirection.PlaceLeft || dir != 1) && (tileData2.Direction != TileObjectDirection.PlaceRight || dir != -1)))
                {
                    int num7 = x - (int)tileData2.Origin.X;
                    int num8 = y - (int)tileData2.Origin.Y;
                    if (num7 < 5 || num7 + tileData2.Width > Main.maxTilesX - 5 || num8 < 5 || num8 + tileData2.Height > Main.maxTilesY - 5)
                    {
                        return(false);
                    }
                    Rectangle rectangle = new Rectangle(0, 0, tileData2.Width, tileData2.Height);
                    int       num9      = 0;
                    int       num10     = 0;
                    if (tileData2.AnchorTop.tileCount != 0)
                    {
                        if (rectangle.Y == 0)
                        {
                            rectangle.Y = -1;
                            rectangle.Height++;
                            num10++;
                        }
                        int checkStart = tileData2.AnchorTop.checkStart;
                        if (checkStart < rectangle.X)
                        {
                            rectangle.Width += rectangle.X - checkStart;
                            num9            += rectangle.X - checkStart;
                            rectangle.X      = checkStart;
                        }
                        int num11 = checkStart + tileData2.AnchorTop.tileCount - 1;
                        int num12 = rectangle.X + rectangle.Width - 1;
                        if (num11 > num12)
                        {
                            rectangle.Width += num11 - num12;
                        }
                    }
                    if (tileData2.AnchorBottom.tileCount != 0)
                    {
                        if (rectangle.Y + rectangle.Height == tileData2.Height)
                        {
                            rectangle.Height++;
                        }
                        int checkStart2 = tileData2.AnchorBottom.checkStart;
                        if (checkStart2 < rectangle.X)
                        {
                            rectangle.Width += rectangle.X - checkStart2;
                            num9            += rectangle.X - checkStart2;
                            rectangle.X      = checkStart2;
                        }
                        int num13 = checkStart2 + tileData2.AnchorBottom.tileCount - 1;
                        int num14 = rectangle.X + rectangle.Width - 1;
                        if (num13 > num14)
                        {
                            rectangle.Width += num13 - num14;
                        }
                    }
                    if (tileData2.AnchorLeft.tileCount != 0)
                    {
                        if (rectangle.X == 0)
                        {
                            rectangle.X = -1;
                            rectangle.Width++;
                            num9++;
                        }
                        int num15 = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num15--;
                        }
                        if (num15 < rectangle.Y)
                        {
                            rectangle.Width += rectangle.Y - num15;
                            num10           += rectangle.Y - num15;
                            rectangle.Y      = num15;
                        }
                        int num16 = num15 + tileData2.AnchorLeft.tileCount - 1;
                        if ((tileData2.AnchorLeft.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num16 += 2;
                        }
                        int num17 = rectangle.Y + rectangle.Height - 1;
                        if (num16 > num17)
                        {
                            rectangle.Height += num16 - num17;
                        }
                    }
                    if (tileData2.AnchorRight.tileCount != 0)
                    {
                        if (rectangle.X + rectangle.Width == tileData2.Width)
                        {
                            rectangle.Width++;
                        }
                        int num18 = tileData2.AnchorLeft.checkStart;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num18--;
                        }
                        if (num18 < rectangle.Y)
                        {
                            rectangle.Width += rectangle.Y - num18;
                            num10           += rectangle.Y - num18;
                            rectangle.Y      = num18;
                        }
                        int num19 = num18 + tileData2.AnchorRight.tileCount - 1;
                        if ((tileData2.AnchorRight.type & AnchorType.Tree) == AnchorType.Tree)
                        {
                            num19 += 2;
                        }
                        int num20 = rectangle.Y + rectangle.Height - 1;
                        if (num19 > num20)
                        {
                            rectangle.Height += num19 - num20;
                        }
                    }
                    if (onlyCheck)
                    {
                        TileObject.objectPreview.Reset();
                        TileObject.objectPreview.Active      = true;
                        TileObject.objectPreview.Type        = (ushort)type;
                        TileObject.objectPreview.Style       = (short)style;
                        TileObject.objectPreview.Alternate   = i;
                        TileObject.objectPreview.Size        = new Point16(rectangle.Width, rectangle.Height);
                        TileObject.objectPreview.ObjectStart = new Point16(num9, num10);
                        TileObject.objectPreview.Coordinates = new Point16(num7 - num9, num8 - num10);
                    }
                    float num21 = 0f;
                    float num22 = (float)(tileData2.Width * tileData2.Height);
                    float num23 = 0f;
                    float num24 = 0f;
                    for (int j = 0; j < tileData2.Width; j++)
                    {
                        for (int k = 0; k < tileData2.Height; k++)
                        {
                            Tile tileSafely = Framing.GetTileSafely(num7 + j, num8 + k);
                            bool flag2      = !tileData2.LiquidPlace(tileSafely);
                            bool flag3      = false;
                            if (tileData2.AnchorWall)
                            {
                                num24 += 1f;
                                if (!tileData2.isValidWallAnchor((int)tileSafely.wall))
                                {
                                    flag3 = true;
                                }
                                else
                                {
                                    num23 += 1f;
                                }
                            }
                            bool flag4 = false;
                            if (tileSafely.active() && !Main.tileCut[(int)tileSafely.type])
                            {
                                flag4 = true;
                            }
                            if (flag4 | flag2 | flag3)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[j + num9, k + num10] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[j + num9, k + num10] = 1;
                                }
                                num21 += 1f;
                            }
                        }
                    }
                    AnchorData anchorData = tileData2.AnchorBottom;
                    if (anchorData.tileCount != 0)
                    {
                        num24 += (float)anchorData.tileCount;
                        int height = tileData2.Height;
                        for (int l = 0; l < anchorData.tileCount; l++)
                        {
                            int  num25      = anchorData.checkStart + l;
                            Tile tileSafely = Framing.GetTileSafely(num7 + num25, num8 + height);
                            bool flag5      = false;
                            if (tileSafely.nactive())
                            {
                                if ((anchorData.type & AnchorType.SolidTile) == AnchorType.SolidTile && Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag5 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag5 && ((anchorData.type & AnchorType.SolidWithTop) == AnchorType.SolidWithTop || (anchorData.type & AnchorType.Table) == AnchorType.Table))
                                {
                                    if (TileID.Sets.Platforms[(int)tileSafely.type])
                                    {
                                        int num26 = (int)tileSafely.frameX / TileObjectData.PlatformFrameWidth();
                                        if ((!tileSafely.halfBrick() && num26 >= 0 && num26 <= 7) || (num26 >= 12 && num26 <= 16) || (num26 >= 25 && num26 <= 26))
                                        {
                                            flag5 = true;
                                        }
                                    }
                                    else if (Main.tileSolid[(int)tileSafely.type] && Main.tileSolidTop[(int)tileSafely.type])
                                    {
                                        flag5 = true;
                                    }
                                }
                                if (!flag5 && (anchorData.type & AnchorType.Table) == AnchorType.Table && !TileID.Sets.Platforms[(int)tileSafely.type] && Main.tileTable[(int)tileSafely.type] && tileSafely.blockType() == 0)
                                {
                                    flag5 = true;
                                }
                                if (!flag5 && (anchorData.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type])
                                {
                                    int num27 = tileSafely.blockType();
                                    if (num27 - 4 <= 1)
                                    {
                                        flag5 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                    }
                                }
                                if (!flag5 && (anchorData.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag5 = true;
                                }
                            }
                            else if (!flag5 && (anchorData.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag5 = true;
                            }
                            if (!flag5)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num25 + num9, height + num10] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num25 + num9, height + num10] = 1;
                                }
                                num23 += 1f;
                            }
                        }
                    }
                    anchorData = tileData2.AnchorTop;
                    if (anchorData.tileCount != 0)
                    {
                        num24 += (float)anchorData.tileCount;
                        int num28 = -1;
                        for (int m = 0; m < anchorData.tileCount; m++)
                        {
                            int  num29      = anchorData.checkStart + m;
                            Tile tileSafely = Framing.GetTileSafely(num7 + num29, num8 + num28);
                            bool flag6      = false;
                            if (tileSafely.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag6 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag6 && (anchorData.type & AnchorType.SolidBottom) == AnchorType.SolidBottom && ((Main.tileSolid[(int)tileSafely.type] && (!Main.tileSolidTop[(int)tileSafely.type] || (TileID.Sets.Platforms[(int)tileSafely.type] && (tileSafely.halfBrick() || tileSafely.topSlope())))) || tileSafely.halfBrick() || tileSafely.topSlope()) && !TileID.Sets.NotReallySolid[(int)tileSafely.type] && !tileSafely.bottomSlope())
                                {
                                    flag6 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag6 && (anchorData.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type])
                                {
                                    int num27 = tileSafely.blockType();
                                    if (num27 - 2 <= 1)
                                    {
                                        flag6 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                    }
                                }
                                if (!flag6 && (anchorData.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag6 = true;
                                }
                            }
                            else if (!flag6 && (anchorData.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag6 = true;
                            }
                            if (!flag6)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num29 + num9, num28 + num10] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num29 + num9, num28 + num10] = 1;
                                }
                                num23 += 1f;
                            }
                        }
                    }
                    anchorData = tileData2.AnchorRight;
                    if (anchorData.tileCount != 0)
                    {
                        num24 += (float)anchorData.tileCount;
                        int width = tileData2.Width;
                        for (int n = 0; n < anchorData.tileCount; n++)
                        {
                            int  num30      = anchorData.checkStart + n;
                            Tile tileSafely = Framing.GetTileSafely(num7 + width, num8 + num30);
                            bool flag7      = false;
                            if (tileSafely.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag7 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag7 && (anchorData.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type])
                                {
                                    int num27 = tileSafely.blockType();
                                    if (num27 == 2 || num27 == 4)
                                    {
                                        flag7 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                    }
                                }
                                if (!flag7 && (anchorData.type & AnchorType.Tree) == AnchorType.Tree && tileSafely.type == 5)
                                {
                                    flag7 = true;
                                    if (n == 0)
                                    {
                                        num24 += 1f;
                                        Tile tileSafely2 = Framing.GetTileSafely(num7 + width, num8 + num30 - 1);
                                        if (tileSafely2.nactive() && tileSafely2.type == 5)
                                        {
                                            num23 += 1f;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + num9, num30 + num10 - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + num9, num30 + num10 - 1] = 2;
                                        }
                                    }
                                    if (n == anchorData.tileCount - 1)
                                    {
                                        num24 += 1f;
                                        Tile tileSafely3 = Framing.GetTileSafely(num7 + width, num8 + num30 + 1);
                                        if (tileSafely3.nactive() && tileSafely3.type == 5)
                                        {
                                            num23 += 1f;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[width + num9, num30 + num10 + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[width + num9, num30 + num10 + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag7 && (anchorData.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag7 = true;
                                }
                            }
                            else if (!flag7 && (anchorData.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag7 = true;
                            }
                            if (!flag7)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + num9, num30 + num10] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[width + num9, num30 + num10] = 1;
                                }
                                num23 += 1f;
                            }
                        }
                    }
                    anchorData = tileData2.AnchorLeft;
                    if (anchorData.tileCount != 0)
                    {
                        num24 += (float)anchorData.tileCount;
                        int num31 = -1;
                        for (int num32 = 0; num32 < anchorData.tileCount; num32++)
                        {
                            int  num33      = anchorData.checkStart + num32;
                            Tile tileSafely = Framing.GetTileSafely(num7 + num31, num8 + num33);
                            bool flag8      = false;
                            if (tileSafely.nactive())
                            {
                                if (Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type] && !Main.tileNoAttach[(int)tileSafely.type] && (tileData2.FlattenAnchors || tileSafely.blockType() == 0))
                                {
                                    flag8 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                }
                                if (!flag8 && (anchorData.type & AnchorType.SolidSide) == AnchorType.SolidSide && Main.tileSolid[(int)tileSafely.type] && !Main.tileSolidTop[(int)tileSafely.type])
                                {
                                    int num27 = tileSafely.blockType();
                                    if (num27 == 3 || num27 == 5)
                                    {
                                        flag8 = tileData2.isValidTileAnchor((int)tileSafely.type);
                                    }
                                }
                                if (!flag8 && (anchorData.type & AnchorType.Tree) == AnchorType.Tree && tileSafely.type == 5)
                                {
                                    flag8 = true;
                                    if (num32 == 0)
                                    {
                                        num24 += 1f;
                                        Tile tileSafely4 = Framing.GetTileSafely(num7 + num31, num8 + num33 - 1);
                                        if (tileSafely4.nactive() && tileSafely4.type == 5)
                                        {
                                            num23 += 1f;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num31 + num9, num33 + num10 - 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num31 + num9, num33 + num10 - 1] = 2;
                                        }
                                    }
                                    if (num32 == anchorData.tileCount - 1)
                                    {
                                        num24 += 1f;
                                        Tile tileSafely5 = Framing.GetTileSafely(num7 + num31, num8 + num33 + 1);
                                        if (tileSafely5.nactive() && tileSafely5.type == 5)
                                        {
                                            num23 += 1f;
                                            if (onlyCheck)
                                            {
                                                TileObject.objectPreview[num31 + num9, num33 + num10 + 1] = 1;
                                            }
                                        }
                                        else if (onlyCheck)
                                        {
                                            TileObject.objectPreview[num31 + num9, num33 + num10 + 1] = 2;
                                        }
                                    }
                                }
                                if (!flag8 && (anchorData.type & AnchorType.AlternateTile) == AnchorType.AlternateTile && tileData2.isValidAlternateAnchor((int)tileSafely.type))
                                {
                                    flag8 = true;
                                }
                            }
                            else if (!flag8 && (anchorData.type & AnchorType.EmptyTile) == AnchorType.EmptyTile)
                            {
                                flag8 = true;
                            }
                            if (!flag8)
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num31 + num9, num33 + num10] = 2;
                                }
                            }
                            else
                            {
                                if (onlyCheck)
                                {
                                    TileObject.objectPreview[num31 + num9, num33 + num10] = 1;
                                }
                                num23 += 1f;
                            }
                        }
                    }
                    if (tileData2.HookCheck.hook != null)
                    {
                        if (tileData2.HookCheck.processedCoordinates)
                        {
                            Point16 arg_103B_0 = tileData2.Origin;
                            Point16 arg_1043_0 = tileData2.Origin;
                        }
                        if (tileData2.HookCheck.hook(x, y, type, style, dir) == tileData2.HookCheck.badReturn && tileData2.HookCheck.badResponse == 0)
                        {
                            num23 = 0f;
                            num21 = 0f;
                            TileObject.objectPreview.AllInvalid();
                        }
                    }
                    float num34 = num23 / num24;
                    float num35 = num21 / num22;
                    if (num35 == 1f && num24 == 0f)
                    {
                        num34 = 1f;
                        num35 = 1f;
                    }
                    if (num34 == 1f && num35 == 1f)
                    {
                        num4           = 1f;
                        num5           = 1f;
                        num6           = i;
                        tileObjectData = tileData2;
                        break;
                    }
                    if (num34 > num4 || (num34 == num4 && num35 > num5))
                    {
                        TileObjectPreviewData.placementCache.CopyFrom(TileObject.objectPreview);
                        num4           = num34;
                        num5           = num35;
                        tileObjectData = tileData2;
                        num6           = i;
                    }
                }
            }
            int num36 = -1;

            if (flag)
            {
                if (TileObjectPreviewData.randomCache == null)
                {
                    TileObjectPreviewData.randomCache = new TileObjectPreviewData();
                }
                bool flag9 = false;
                if ((int)TileObjectPreviewData.randomCache.Type == type)
                {
                    Point16 arg_116E_0  = TileObjectPreviewData.randomCache.Coordinates;
                    Point16 objectStart = TileObjectPreviewData.randomCache.ObjectStart;
                    int     num37       = (int)(arg_116E_0.X + objectStart.X);
                    int     num38       = (int)(arg_116E_0.Y + objectStart.Y);
                    int     num39       = x - (int)tileData.Origin.X;
                    int     num40       = y - (int)tileData.Origin.Y;
                    if (num37 != num39 || num38 != num40)
                    {
                        flag9 = true;
                    }
                }
                else
                {
                    flag9 = true;
                }
                if (flag9)
                {
                    num36 = Main.rand.Next(tileData.RandomStyleRange);
                }
                else
                {
                    num36 = TileObjectPreviewData.randomCache.Random;
                }
            }
            if (onlyCheck)
            {
                if (num4 != 1f || num5 != 1f)
                {
                    TileObject.objectPreview.CopyFrom(TileObjectPreviewData.placementCache);
                    i = num6;
                }
                TileObject.objectPreview.Random = num36;
                if (tileData.RandomStyleRange > 0)
                {
                    TileObjectPreviewData.randomCache.CopyFrom(TileObject.objectPreview);
                }
            }
            if (!onlyCheck)
            {
                objectData.xCoord    = x - (int)tileObjectData.Origin.X;
                objectData.yCoord    = y - (int)tileObjectData.Origin.Y;
                objectData.type      = type;
                objectData.style     = style;
                objectData.alternate = i;
                objectData.random    = num36;
            }
            return(num4 == 1f && num5 == 1f);
        }