public void HandleLeaveDungeonRequest(LeavesDungeonRequestMessage message, int connectID)
    {
        PlayerData playerData  = serverDataHolder.players.Find(x => x.playerIndex == connectID);
        RoomData   currentRoom = serverDataHolder.rooms[playerData.roomID[0], playerData.roomID[1]];

        Debug.Log("leave dungeon id = " + connectID);

        //check if player can leave dungeon
        if (!currentRoom.containsExit)
        {
            RequestDenied(message, connectID);
            return;
        }

        Debug.Log("leave ID = " + connectID);

        //edit the list
        serverDataHolder.activePlayerIDs.Remove(connectID); //needs testing
        playerData.activeInDungeon = false;

        //send message to all players the player left dungeon
        PLayerLeftDungeonMessage leftMessage = new PLayerLeftDungeonMessage()
        {
            PlayerID = connectID
        };

        SendMessageToAll(leftMessage);

        //next turn
        NextPlayerTurn();
    }
    void Update()
    {
        networkJobHandle.Complete();

        for (int i = 0; i < connections.Length; ++i)
        {
            if (!connections[i].IsCreated)
            {
                connections.RemoveAtSwapBack(i);
                --i;
            }
        }

        NetworkConnection newConnection;

        while ((newConnection = networkDriver.Accept()) != default)
        {
            if (connections.Length >= 4)
            {
                return;
            }
            connections.Add(newConnection);
            //Debug.Log("Accepted new connection");


            //new player data is set
            //Color col = Random.ColorHSV();
            Color col = ColorExtensions.colors[(ColorExtensions.RandomStartIndex + newConnection.InternalId) % ColorExtensions.colors.Length];
            col.a = 1;
            var colour         = (Color32)col;
            var playerID       = newConnection.InternalId;
            var welcomeMessage = new WelcomeMessage
            {
                PlayerID = playerID,
                Colour   = ((uint)colour.r << 24) | ((uint)colour.g << 16) | ((uint)colour.b << 8) | colour.a
            };
            SendMessage(welcomeMessage, newConnection);

            //save it to list
            PlayerData newData = new PlayerData();
            newData.color       = colour;
            newData.playerIndex = playerID;
            if (serverDataHolder.players == null)
            {
                serverDataHolder.players = new List <PlayerData>();
            }
            serverDataHolder.players.Add(newData);

            //Debug.Log("server data holder players count: " + serverDataHolder.players.Count);
        }

        DataStreamReader reader;

        for (int i = 0; i < connections.Length; ++i)
        {
            if (!connections[i].IsCreated)
            {
                continue;
            }

            NetworkEvent.Type cmd;
            while ((cmd = networkDriver.PopEventForConnection(connections[i], out reader)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    var messageType = (MessageHeader.MessageType)reader.ReadUShort();
                    switch (messageType)
                    {
                    case MessageHeader.MessageType.none:
                        StayAlive(i);
                        break;

                    case MessageHeader.MessageType.newPlayer:
                        break;

                    case MessageHeader.MessageType.welcome:
                        break;

                    case MessageHeader.MessageType.setName:
                        var message = new SetNameMessage();
                        message.DeserializeObject(ref reader);
                        messagesQueue.Enqueue(message);

                        PlayerData newPlayerData = GetPlayerData(connections[i]);
                        newPlayerData.name = message.Name;

                        NewPlayerJoined(connections[i]);

                        break;

                    case MessageHeader.MessageType.playerLeft:
                        break;

                    case MessageHeader.MessageType.moveRequest:
                        var moveRequest = new MoverequestMessage();
                        moveRequest.DeserializeObject(ref reader);
                        //messagesQueue.Enqueue(moveRequest);
                        bool canmove = HandleMoveRequest(moveRequest, i);
                        if (canmove)
                        {
                            NextPlayerTurn();
                        }
                        break;

                    case MessageHeader.MessageType.claimTreasureRequest:

                        var treasureRquest = new ClaimTreasureRequestMessage();
                        treasureRquest.DeserializeObject(ref reader);
                        HandleTreasureClaim(treasureRquest, i);
                        break;

                    case MessageHeader.MessageType.leaveDungeonRequest:
                        var leaveDungeonRequest = new LeavesDungeonRequestMessage();
                        leaveDungeonRequest.DeserializeObject(ref reader);
                        HandleLeaveDungeonRequest(leaveDungeonRequest, i);
                        break;

                    case MessageHeader.MessageType.defendRequest:
                        var defendRequest = new DefendRequestMessage();
                        defendRequest.DeserializeObject(ref reader);
                        HandleDefendRequest(defendRequest, i);
                        break;

                    case MessageHeader.MessageType.attackRequest:
                        var attackRequest = new AttackRequestMessage();
                        attackRequest.DeserializeObject(ref reader);
                        HandleAttackRequest(attackRequest, i);
                        break;

                    default:
                        break;
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    PlayerLeftMessage playerLeftMessage = new PlayerLeftMessage
                    {
                        PlayerLeftID = i
                    };

                    SendMessageToAll(playerLeftMessage);
                    Debug.Log("Client disconnected");
                    connections[i] = default;
                }
            }
        }

        networkJobHandle = networkDriver.ScheduleUpdate();

        ProcessMessagesQueue();
    }
Exemplo n.º 3
0
    public void TryTOExitDungeon()
    {
        LeavesDungeonRequestMessage message = new LeavesDungeonRequestMessage();

        dataHolder.client.SendMessage(message);
    }