示例#1
0
        ////////////////

        public static void ClearBramblesWithinArea(Rectangle area, bool syncFromServer)
        {
            if (syncFromServer && Main.netMode == NetmodeID.MultiplayerClient)
            {
                return;
            }

            int brambleType = ModContent.TileType <CursedBrambleTile>();

            for (int i = area.Left; i < area.Right; i++)
            {
                for (int j = area.Top; j < area.Bottom; j++)
                {
                    Tile tile = Main.tile[i, j];
                    if (tile?.active() != true || tile.type != brambleType)
                    {
                        continue;
                    }

                    TileLibraries.KillTile(i, j, false, false, true, false, syncFromServer);
                    //if( syncFromServer ) {
                    //} else {
                    //	WorldGen.KillTile( i, j );
                    //	WorldGen.SquareTileFrame( i, j );
                    //}
                }
            }
        }
示例#2
0
        public static void TeleportTile(int tileX, int tileY)
        {
            var config = FMCConfig.Instance;

            (int newTileX, int newTileY)tileAt;
            TilePattern pattern = ModContent.GetInstance <FMCWorld>().ManaCrystalShardPattern;
            int         rad     = config.Get <int>(nameof(FMCConfig.ManaCrystalShardTeleportRadius));

            var within = new Rectangle(
                (int)MathHelper.Clamp(tileX - rad, 64, (Main.maxTilesX - 64) - (rad + rad)),
                (int)MathHelper.Clamp(tileY - rad, 64, (Main.maxTilesY - 64) - (rad + rad)),
                rad + rad,
                rad + rad
                );

            if (FindableManaCrystalsWorldGenPass.GetRandomShardAttachableTile(within, 100, pattern, out tileAt))
            {
                TileLibraries.Swap1x1Synced(tileX, tileY, tileAt.newTileX, tileAt.newTileY, true, true, true);

                for (int i = 0; i < 4; i++)
                {
                    Dust.NewDust(
                        Position: new Vector2(tileX << 4, tileY << 4),
                        Width: 16,
                        Height: 17,
                        Type: 229
                        );
                }
            }
        }
示例#3
0
        private static bool ValidateBeneathFloor(int leftTileX, int floorTileY)
        {
            int maxX             = leftTileX + ScaffoldingErectorKitItem.ScaffoldWidth;
            int maxY             = ScaffoldingErectorKitItem.GetFurthestAllowedGroundTileY(floorTileY);
            int framingPlankType = ModContent.TileType <FramingPlankTile>();

            // Find at least one 'earth' tile beneath
            for (int x = leftTileX; x < maxX; x++)
            {
                for (int y = floorTileY; y < maxY; y++)
                {
                    Tile tile = Main.tile[x, y];
                    if (tile?.active() != true)
                    {
                        continue;
                    }

                    if (TileLibraries.IsSolid(tile, false, false) && tile.type != framingPlankType)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        private static void ErodeBramblesAtRandomly(int tileX, int tileY)
        {
            int minTicks    = 3;
            int maxTicks    = 60 * 60;
            int brambleType = ModContent.TileType <CursedBrambleTile>();

            Timers.SetTimer(TmlLibraries.SafelyGetRand().Next(minTicks, maxTicks), false, () => {
                Tile tile = Framing.GetTileSafely(tileX, tileY);

                if (tile.active() && tile.type == brambleType)
                {
                    TileLibraries.KillTile(tileX, tileY, false, false, true);
                }
                return(false);
            });
        }
        private bool UpdateGround(Gore gore, out bool lockFrames)
        {
            lockFrames = false;

            if (gore.drawOffset.X == 0f)
            {
//Main.NewText("bounce "+gore.GetHashCode());
                gore.drawOffset.X = 0.001f;
                SoundLibraries.PlaySound(TMRMod.Instance, "ShellBounce", gore.position);
            }

            int  tileX = (int)gore.position.X >> 4;
            int  tileY = (int)gore.position.Y >> 4;
            Tile tile  = Main.tile[tileX, tileY];

            if (TileLibraries.IsSolid(tile, false, false))
            {
                if (tile.slope() != 0)
                {
                    return(false);
                }

                tile = Main.tile[tileX, tileY - 1];
                if (!TileLibraries.IsSolid(tile, false, false))
                {
                    gore.drawOffset.Y = 8f;
                    gore.position.Y  -= 16f;
                }
                else
                {
                    return(false);
                }
            }

            gore.rotation = (float)Math.PI * 0.5f;

            if (gore.velocity.X == 0)
            {
                lockFrames        = true;
                gore.frameCounter = 2;
            }

            return(true);
        }
        /// <summary>
        /// Attempts to remove a random bramble within a given (tile) area.
        /// </summary>
        /// <param name="minTileX"></param>
        /// <param name="minTileY"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="adjacentRadius"></param>
        /// <param name="sync"></param>
        /// <returns>`true` if a bramble was found and removed.</returns>
        public static bool ErodeRandomBrambleWithinArea(
            int minTileX,
            int minTileY,
            int width,
            int height,
            int adjacentRadius,
            bool sync)
        {
            int randTileX = minTileX + TmlLibraries.SafelyGetRand().Next(width);
            int randTileY = minTileY + TmlLibraries.SafelyGetRand().Next(height);

            Tile tile = Framing.GetTileSafely(randTileX, randTileY);

            if (!tile.active() || tile.type != ModContent.TileType <CursedBrambleTile>())
            {
                return(false);
            }

            if (!sync)
            {
                WorldGen.KillTile(
                    i: randTileX,
                    j: randTileY,
                    fail: false,
                    effectOnly: false,
                    noItem: true
                    );
                WorldGen.SquareTileFrame(randTileX, randTileY);
            }
            else
            {
                TileLibraries.KillTile(
                    tileX: randTileX,
                    tileY: randTileY,
                    effectOnly: false,
                    dropsItem: false,
                    forceSyncIfUnchanged: true
                    );
            }

            CursedBrambleTile.ErodeBramblesWithinAreaRadiusRandomly(minTileX, minTileY, adjacentRadius);

            return(true);
        }
示例#7
0
        ////

        private static int FindScaffoldFloorY(int leftTileX, int tileY, int width, int height)
        {
            int maxX = leftTileX + width;
            int maxY = Math.Min(tileY + (height + 1), Main.maxTilesY);

            // Find immediate 'ground' (any solid, non-actuated matter)
            for (int y = tileY; y < maxY; y++)
            {
                for (int x = leftTileX; x < maxX; x++)
                {
                    if (TileLibraries.IsSolid(Main.tile[x, y], true, false))
                    {
                        return(y);
                    }
                }
            }

            return(maxY);
        }
        ////////////////

        private static bool ApplyBarrierCollision_SoulBarriers_WeakRef(
            object rawBarrier,
            int tileX,
            int tileY,
            double damage)
        {
            var wldHitAt = new Vector2(tileX * 16, tileY * 16);
            var barrier  = rawBarrier as SoulBarriers.Barriers.BarrierTypes.Barrier;

            if (!barrier.IsActive)
            {
                return(false);
            }

            barrier.ApplyMetaphysicalHit(wldHitAt, damage, true);

            TileLibraries.KillTile(tileX, tileY, false, false, true);

            return(true);
        }
示例#9
0
        ////

        public override bool TileFrame(int i, int j, ref bool resetFrame, ref bool noBreak)
        {
            Tile  tile   = Main.tile[i, j];
            short frameY = ManaCrystalShardTile.PickFrameY(i, j);

            if (tile.frameY != frameY)
            {
                if (frameY == -1)
                {
                    TileLibraries.KillTileSynced(i, j, false, true, true);
                }
                else
                {
                    tile.frameY = frameY;
                    resetFrame  = true;
                }
            }

            return(false);
        }
        ////////////////

        /// <summary>
        /// Attempts to remove a random bramble within a given (tile) radius of a given tile.
        /// </summary>
        /// <param name="tileX"></param>
        /// <param name="tileY"></param>
        /// <param name="radius"></param>
        /// <param name="adjacentRadius"></param>
        /// <returns>`true` if a bramble was found and removed.</returns>
        public static bool ErodeRandomBrambleWithinRadius(int tileX, int tileY, int radius, int adjacentRadius)
        {
            int randX     = TmlLibraries.SafelyGetRand().Next(radius * 2);
            int randY     = TmlLibraries.SafelyGetRand().Next(radius * 2);
            int randTileX = tileX + (randX - radius);
            int randTileY = tileY + (randY - radius);

            Tile tile = Framing.GetTileSafely(randTileX, randTileY);

            if (!tile.active() || tile.type != ModContent.TileType <CursedBrambleTile>())
            {
                return(false);
            }

            TileLibraries.KillTile(randTileX, randTileY, false, false, true);

            CursedBrambleTile.ErodeBramblesWithinAreaRadiusRandomly(tileX, tileY, adjacentRadius);

            return(true);
        }
        /// <summary>
        /// Attempts to remove a bramble at a given tile.
        /// </summary>
        /// <param name="tileX"></param>
        /// <param name="tileY"></param>
        /// <param name="sync"></param>
        /// <returns>`true` if a bramble was found and removed.</returns>
        public static bool ErodeBrambleAt(int tileX, int tileY, bool sync)
        {
            int  brambleType = ModContent.TileType <CursedBrambleTile>();
            Tile tile        = Framing.GetTileSafely(tileX, tileY);

            if (!tile.active() || tile.type != brambleType)
            {
                return(false);
            }

            return(TileLibraries.KillTile(
                       tileX: tileX,
                       tileY: tileY,
                       effectOnly: false,
                       dropsItem: false,
                       forceSyncIfUnchanged: false,
                       syncIfClient: sync,
                       syncIfServer: sync
                       ));
        }
        public static void MakeScaffold(int leftTileX, int floorTileY)
        {
            int width  = ScaffoldingErectorKitItem.ScaffoldWidth;
            int height = ScaffoldingErectorKitItem.ScaffoldHeight;
            var rect   = new Rectangle(
                leftTileX,
                floorTileY - height,
                width,
                height
                );

            var postTileDef = new TileDrawDefinition {
                NotActive = true,
                WallType  = WallID.RichMahoganyFence
            };
            var platTileDef = new TileDrawDefinition {
                SkipWall = true,
                TileType = TileID.Platforms
            };

            //

            int findFloor(int myTileX, int myTileY)
            {
                int y;

                for (y = myTileY; !TileLibraries.IsSolid(Main.tile[myTileX, y], true, true); y++)
                {
                    if (y >= Main.maxTilesY - 1)
                    {
                        break;
                    }
                }
                return(y);
            }

            //

            int rightTileX  = rect.X + rect.Width - 1;
            int lPostFloorY = findFloor(leftTileX, rect.Bottom);
            int rPostFloorY = findFloor(rightTileX, rect.Bottom);

            // Posts
            if (Main.tile[leftTileX - 1, rect.Y].wall != WallID.RichMahoganyFence)
            {
                TileDrawPrimitivesLibraries.DrawRectangle(
                    filter: TilePattern.NonSolid,
                    area: new Rectangle(leftTileX, rect.Y, 1, lPostFloorY - rect.Y),
                    hollow: null,
                    place: (x, y) => postTileDef
                    );
            }
            if (Main.tile[rightTileX + 1, rect.Y].wall != WallID.RichMahoganyFence)
            {
                TileDrawPrimitivesLibraries.DrawRectangle(
                    filter: TilePattern.NonSolid,
                    area: new Rectangle(rightTileX, rect.Y, 1, rPostFloorY - rect.Y),
                    hollow: null,
                    place: (x, y) => postTileDef
                    );
            }

            // Platforms
            TileDrawPrimitivesLibraries.DrawRectangle(
                filter: TilePattern.NonSolid,
                area: new Rectangle(rect.X, rect.Y, width, 1),
                hollow: null,
                place: (x, y) => platTileDef
                );

            //

            Main.PlaySound(SoundID.Item69, rect.Center.ToVector2() * 16);

            //

            if (Main.netMode == NetmodeID.Server)
            {
//LogLibraries.Log( "!!!MakeScaffold " + rect.ToString() );
                TileRectangleModPacketProtocol.Send(rect);
            }
        }