コード例 #1
0
    //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);
        }
    }
コード例 #2
0
    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);
    }