public override void OnBeforeMoveTile(Position movingTo) { // Inform the server i moved UnityClient.TcpClient.Send(new EntityMovePacket() { UID = UnityClient.Player.UID, To = movingTo }); var playerPos = UnityClient.Player.Position; var currentChunk = UnityClient.Map.GetChunkByTilePosition(playerPos.X, playerPos.Y); var newChunk = UnityClient.Map.GetChunkByTilePosition(movingTo.X, movingTo.Y); if (currentChunk.x != newChunk.x || currentChunk.y != newChunk.y) { var currentChunkX = playerPos.X >> 4; var currentChunkY = playerPos.Y >> 4; var newChunkX = movingTo.X >> 4; var newChunkY = movingTo.Y >> 4; var currentChunkParents = PositionExtensions.GetSquared3x3Around(new Position(currentChunkX, currentChunkY)).ToList(); var newChunkParents = PositionExtensions.GetSquared3x3Around(new Position(newChunkX, newChunkY)).ToList(); foreach (var cc in currentChunkParents.Except(newChunkParents)) { var chunk = UnityClient.Map.GetChunkByChunkPosition(cc.X, cc.Y); if (chunk != null) { chunk.GameObject.SetActive(false); } } foreach (var nc in newChunkParents.Except(currentChunkParents)) { var chunk = UnityClient.Map.GetChunkByChunkPosition(nc.X, nc.Y); if (chunk != null) { chunk.GameObject.SetActive(true); } } } }
public static List <OnlinePlayer> GetPlayersNear(this Entity player) { List <OnlinePlayer> near = new List <OnlinePlayer>(); var chunk = player.GetChunk(); var radius = PositionExtensions.GetSquared3x3Around(new Position(chunk.x, chunk.y)); foreach (var position in radius) { var chunkThere = Server.Map.GetChunkByChunkPosition(position.X, position.Y); if (chunkThere != null) { foreach (var playerInChunk in chunkThere.EntitiesInChunk[EntityType.PLAYER]) { if (playerInChunk.UID != player.UID) { near.Add((OnlinePlayer)playerInChunk); } } } } return(near); }
public static void CheckChunks(this OnlinePlayer player) { var client = player.Tcp; if (client.OnlinePlayer != null && client.OnlinePlayer.AssetsReady) { var chunkX = client.OnlinePlayer.Position.X >> 4; var chunkY = client.OnlinePlayer.Position.Y >> 4; var shouldBeLoaded = PositionExtensions.GetSquared3x3Around(new Position(chunkX, chunkY)); foreach (var position in shouldBeLoaded) { var chunkKey = $"{position.X}_{position.Y}"; if (!client.ChunksLoaded.Contains(chunkKey)) { if (Server.Map.Chunks.ContainsKey(chunkKey)) { client.ChunksLoaded.Add(chunkKey); var chunk = Server.Map.Chunks[chunkKey]; client.Send(new ChunkPacket() { X = position.X, Y = position.Y, ChunkData = chunk.TilePacketData }); foreach (var entity in chunk.EntitiesInChunk[EntityType.MONSTER]) { var monsterInstance = (Monster)entity; client.Send(monsterInstance.ToPacket()); } } } } } }