public void Update()
    {
        networkJobHandle.Complete();

        if (!connection.IsCreated)
        {
            return;
        }

        DataStreamReader reader;

        NetworkEvent.Type cmd;
        while ((cmd = connection.PopEvent(networkDriver, out reader)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                Debug.Log("Connected to server");
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                var messageType = (Message.MessageType)reader.ReadUShort();
                Debug.Log("Client Received: " + messageType + " from Host");

                Message message = null;
                switch (messageType)
                {
                case Message.MessageType.None: break;

                case Message.MessageType.NewPlayer: message = new NewPlayerMessage(); break;

                case Message.MessageType.Welcome: message = new WelcomeMessage(); break;

                case Message.MessageType.RequestDenied: message = new RequestDeniedMessage(); break;

                case Message.MessageType.PlayerLeft: message = new PlayerLeftMessage(); break;

                case Message.MessageType.StartGame: message = new StartGameMessage(); break;

                case Message.MessageType.PlayerTurn: message = new PlayerTurnMessage(); break;

                case Message.MessageType.RoomInfo: message = new RoomInfoMessage(); break;

                case Message.MessageType.PlayerEnterRoom: message = new PlayerEnterRoomMessage(); break;

                case Message.MessageType.PlayerLeaveRoom: message = new PlayerLeaveRoomMessage(); break;

                case Message.MessageType.ObtainTreasure: message = new ObtainTreasureMessage(); break;

                case Message.MessageType.HitMonster: message = new HitMonserMessage(); break;

                case Message.MessageType.HitByMonster: message = new HitByMonserMessage(); break;

                case Message.MessageType.PlayerDefends: message = new PlayerDefendsMessage(); break;

                case Message.MessageType.PlayerLeftDungeon: message = new PlayerLeftDungeonMessage(); break;

                case Message.MessageType.PlayerDies: message = new PlayerDiesMessage(); break;

                case Message.MessageType.EndGame:   break;

                default: break;
                }
                if (message != null)
                {
                    message.DeserializeObject(ref reader);
                    receivedMessagesQueue.Enqueue(message);
                }
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Disconnected from server");
                connection = default;
            }
        }
        ProcessMessagesQueue();

        if (Time.time - lastSendTime > STAY_ALIVE_AFTER_SECONDS)
        {
            SendMessage(new NoneMessage());
        }
        networkJobHandle = networkDriver.ScheduleUpdate();
    }
        internal void HandleHitMonster(Message message)
        {
            HitMonserMessage hitMonserMessage = (HitMonserMessage)message;

            Menu.Singleton.gameWindow.OutputText(lobby.players[hitMonserMessage.PlayerID].PlayerTextWithColorTag() + " Hit a monster for " + hitMonserMessage.damage + " damage");
        }