//Application Handlers void OnRequestChunkData(NetworkMessage netMsg) { int blocksPerResponse = 200; var msg = netMsg.ReadMessage <MessaageTypes.RequestChunkDataMessage>(); //Debug.Log("Client requested block data for chunk: " + msg.pos.x + "," + msg.pos.y + "," + msg.pos.z); Chunk chunk = LoadChunk(msg.pos); //Load chunk //Find number of messages chunk data needs to be split into (Sending a complete chunk will require about 20 msgs) int numMsgs = Mathf.FloorToInt(chunk.modifiedBlocks.Count / 200f); List <KeyValuePair <WorldPos, Block> > blocks = chunk.modifiedBlocks.ToList(); for (int msgNum = 0; msgNum <= numMsgs; msgNum++) { List <MessaageTypes.MsgBlock> msgBlocks = new List <MessaageTypes.MsgBlock>(); for (int i = numMsgs * blocksPerResponse; numMsgs < (numMsgs + 1) * blocksPerResponse; i++) { if (i >= blocks.Count) { break; } msgBlocks.Add(new MessaageTypes.MsgBlock((byte)blocks[i].Key.x, (byte)blocks[i].Key.y, (byte)blocks[i].Key.z, BlockIDManager.GetID(blocks[i].Value))); } var response = new MessaageTypes.ChunkDataMessage(); response.blocks = msgBlocks.ToArray(); response.chunkPos = msg.pos; netMsg.conn.Send(MessaageTypes.ChunkDataID, response); } }
void OnSetBlock(NetworkMessage netMsg) { var msg = netMsg.ReadMessage <MessaageTypes.SetBlockMessage>(); Debug.Log("Client Set block"); //Update block on server Chunk chunk = LoadChunk(msg.pos); WorldPos pos = GetBlockPosInChunk(msg.pos); chunk.SetBlock(pos.x, pos.y, pos.z, BlockIDManager.GetBlock(msg.blockID)); //Send data to all clients to update clients chunk var response = new MessaageTypes.ChunkDataMessage(); response.blocks = new MessaageTypes.MsgBlock[1]; response.blocks[0] = new MessaageTypes.MsgBlock((byte)pos.x, (byte)pos.y, (byte)pos.z, msg.blockID); response.chunkPos = chunk.pos; //netMsg.conn.Send(MessaageTypes.ChunkDataID, response); NetworkServer.SendToAll(MessaageTypes.ChunkDataID, response); }