public void Send <T>(Offset <T> message) where T : struct, IFlatbufferObject
    {
        ClientServerMessage.StartClientServerMessage(builder);

        if (message is Offset <GetVersionMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.GetVersionMessage);
        }
        else if (message is Offset <EnterQueueMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.EnterQueueMessage);
        }
        else if (message is Offset <LeaveQueueMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.LeaveQueueMessage);
        }

        else if (message is Offset <CreateRoomMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.CreateRoomMessage);
        }
        else if (message is Offset <LeaveRoomMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.LeaveRoomMessage);
        }
        else if (message is Offset <EnterRoomMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.EnterRoomMessage);
        }
        else if (message is Offset <StartRoomMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.StartRoomMessage);
        }
        else if (message is Offset <SelectTeamMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.SelectTeamMessage);
        }

        else if (message is Offset <ConnectMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.ConnectMessage);
        }
        else if (message is Offset <ClientReadyMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.ClientReadyMessage);
        }
        else if (message is Offset <ClientInputMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.ClientInputMessage);
        }
        else if (message is Offset <ClientActionMessage> )
        {
            ClientServerMessage.AddContentType(builder, ClientServerMessageContent.ClientActionMessage);
        }
        else
        {
            throw new NotImplementedException("Message type not implemented!");
        }

        ClientServerMessage.AddContent(builder, message.Value);
        var clientServerMessage = ClientServerMessage.EndClientServerMessage(builder);

        builder.Finish(clientServerMessage.Value);

        byte[] buf = builder.SizedByteArray();

        if (message is Offset <ClientInputMessage> )
        {
            netClient.SendUnreliable(buf, Convert.ToUInt16(buf.Length));
        }
        else
        {
            netClient.SendReliable(buf, Convert.ToUInt16(buf.Length));
        }

        builder.Clear();
    }