public void SendChunksForKnownPosition(bool force = false) { int centerX = (int)Coordinates.X >> 4; int centerZ = (int)Coordinates.Z >> 4; if (!force && IsSpawned && _currentChunkPosition == new Vector2(centerX, centerZ)) return; _currentChunkPosition.X = centerX; _currentChunkPosition.Z = centerZ; new Thread(() => { int counted = 0; foreach ( var chunk in PluginGlobals.Level[0].GenerateChunks(new ChunkCoordinates((int) Coordinates.X, (int) Coordinates.Z), force ? new Dictionary<Tuple<int, int>, ChunkColumn>() : _chunksUsed)) { PcChunkColumn pcchunk = new PcChunkColumn {X = chunk.x, Z = chunk.z}; pcchunk.Pe2Pc(chunk); new ChunkData(Wrapper, new MsgBuffer(Wrapper)) {Chunk = pcchunk}.Write(); //new ChunkData().Write(Wrapper, new MSGBuffer(Wrapper), new object[]{ chunk.GetBytes() }); Thread.Yield(); if (counted >= 5 && !IsSpawned) { new PlayerPositionAndLook(Wrapper).Write(); IsSpawned = true; PluginGlobals.PcPlayers.Add(this); foreach (var targetPlayer in PluginGlobals.Level[0].Players) { targetPlayer.SendPackage( new McpeAddPlayer { clientId = 0, username = Username, entityId = PluginGlobals.PcidOffset + EntityId, x = (float)Coordinates.X, y = (float)Coordinates.Y, z = (float)Coordinates.Z, yaw = (byte)Yaw, pitch = (byte)Pitch, metadata = new byte[0] }); PluginGlobals.Level[0].RelayBroadcast(new McpeAddEntity { entityType = -1, entityId = PluginGlobals.PcidOffset + EntityId, x = (float)Coordinates.X, y = (float)Coordinates.Y, z = (float)Coordinates.Z, }); } foreach (var player2 in PluginGlobals.GetPlayers()) { new PlayerListItem(Wrapper) { Action = 0, Username = player2.Username, Gamemode = player2.Gamemode, UUID = player2.Uuid }.Write(); if (player2 != this) { new SpawnPlayer(Wrapper) { Player = player2 }.Write(); } } SendMovePlayer(); PluginGlobals.Level[0].BroadcastTextMessage(Username + " joined the game!"); } counted++; } }).Start(); }
public static void SendChunk(ChunkCoordinates position) { ChunkColumn targetchunk = Level[0]._worldProvider.GenerateChunkColumn(position); PcChunkColumn converted = new PcChunkColumn {X = position.X, Z = position.Z}; converted.Pe2Pc(targetchunk); foreach (var player in PcPlayers) { //new BlockChange(player.Wrapper, new MSGBuffer(player.Wrapper)) {BlockID = data.block, MetaData = data.meta, Location = new Vector3(data.x, data.y, data.z)}.Write(); new ChunkData(player.Wrapper) { Chunk = converted, Quee = false}.Write(); } }