//////////////// 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 ); //} } } }
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 ); } } }
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); }
//// 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); }
//// 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); } }