public void HitMonster(ref DataStreamReader reader)
    {
        var message = new HitMonsterMessage();

        message.DeserializeObject(ref reader);
        dataHolder.game.cRoom.roomData.monsterHP -= message.damageDealt;
        Debug.Log("Hitting monster...");
        if (dataHolder.game.cRoom.roomData.monsterHP <= 0)
        {
            dataHolder.game.cRoom.roomData.containsMonster = false;
        }
        dataHolder.game.cRoom.UpdateHPText();
        dataHolder.game.cRoom.UpdateRoom();
    }
Esempio n. 2
0
    /// <summary>
    /// Send to all clients when a monster gets hit.
    /// </summary>
    private void SendHitMonster(int dmg)
    {
        Client activeClient;

        inverseActiveDictionary.TryGetValue(currentActivePlayer, out activeClient);
        var message = new HitMonsterMessage()
        {
            PlayerID    = activeClient.PlayerID,
            DamageDealt = (ushort)dmg
        };

        foreach (Client c in clientList)
        {
            server.SendMessage(message, c.Connection);
        }
    }
    public void HandleAttackRequest(AttackRequestMessage message, int connectID)
    {
        PlayerData playerData  = serverDataHolder.players.Find(x => x.playerIndex == connectID);
        RoomData   currentRoom = serverDataHolder.rooms[playerData.roomID[0], playerData.roomID[1]];

        //monster adds player to target list
        Monster monster = serverDataHolder.activeMonsters.Find(x => x.roomID == playerData.roomID);

        if (!monster.targetPlayers.Contains(playerData.playerIndex))
        {
            monster.targetPlayers.Add(playerData.playerIndex);
        }


        //check treasure even has ammount
        if (currentRoom.containsMonster == false)
        {
            //if not then send request denied
            RequestDenied(message, connectID);
            return;
        }

        //then update data in room
        currentRoom.monsterHP -= 6;
        if (currentRoom.monsterHP <= 0)
        {
            currentRoom.containsMonster = false;
            serverDataHolder.activeMonsters.Remove(serverDataHolder.activeMonsters.Find(x => x.roomID == playerData.roomID));
        }

        //send hit message back to all players in room
        List <int> ids = serverDataHolder.GetOtherPlayerIDsInSameRoom(playerData);

        ids.Add(connectID);
        HitMonsterMessage hitMessage = new HitMonsterMessage()
        {
            PlayerID    = connectID,
            damageDealt = 6
        };

        foreach (int id in ids)
        {
            SendMessage(hitMessage, connections[serverDataHolder.players.Find(x => x.playerIndex == id).playerIndex]);
        }

        NextPlayerTurn();
    }
Esempio n. 4
0
    void Update()
    {
        networkJobHandle.Complete();
        for (int i = 0; i < connections.Length; ++i)
        {
            if (!connections[i].IsCreated)
            {
                connections.RemoveAtSwapBack(i);
                --i;
            }
        }

        NetworkConnection c;

        while ((c = networkDriver.Accept()) != default)
        {
            if (GameHasStarted)
            {
                MakeRequestDeniedMessage(c, 0);
                c.Disconnect(networkDriver);
                return;
            }

            if (connections.Length > 4)
            {
                MakeRequestDeniedMessage(c, 1);
                c.Disconnect(networkDriver);
                return;
            }

            //Accepted Connection
            connections.Add(c);

            var colour         = (Color32)UnityEngine.Random.ColorHSV();
            var welcomeMessage = new WelcomeMessage
            {
                PlayerID = playerID,
                Colour   = ((uint)colour.r << 24) | ((uint)colour.g << 16) | ((uint)colour.b << 8) | colour.a
            };

            PlayerManager.Instance.Players.Add(new Players(playerID, "", welcomeMessage.Colour));
            playerID++;
            NetworkManager.SendMessage(networkDriver, welcomeMessage, c);
        }

        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:
                        var noneMessage = NetworkManager.ReadMessage <StayAliveMessage>(reader, ServerMessageQueue);
                        NetworkManager.SendMessage(networkDriver, noneMessage, connections[i]);
                        break;

                    case MessageHeader.MessageType.SetName:
                        SetNameMessage setNameMessage = NetworkManager.ReadMessage <SetNameMessage>(reader, ServerMessageQueue) as SetNameMessage;
                        PlayerManager.Instance.Players[i].clientName = setNameMessage.Name;

                        var newPlayerMessage = new NewPlayerMessage()
                        {
                            PlayerID    = PlayerManager.Instance.Players[i].playerID,
                            PlayerColor = PlayerManager.Instance.Players[i].clientColor,
                            PlayerName  = setNameMessage.Name
                        };

                        //looping through all the connections to send the new player message
                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (j != i)
                            {
                                NetworkManager.SendMessage(networkDriver, newPlayerMessage, connections[j]);

                                var connectedPlayersMessage = new NewPlayerMessage()
                                {
                                    PlayerID    = PlayerManager.Instance.Players[j].playerID,
                                    PlayerColor = PlayerManager.Instance.Players[j].clientColor,
                                    PlayerName  = PlayerManager.Instance.Players[j].clientName
                                };
                                NetworkManager.SendMessage(networkDriver, connectedPlayersMessage, connections[i]);
                            }
                        }

                        break;

                    case MessageHeader.MessageType.PlayerLeft:
                        PlayerLeftMessage leftMessage = NetworkManager.ReadMessage <PlayerLeftMessage>(reader, ServerMessageQueue) as PlayerLeftMessage;
                        leftMessage.playerLeftID = (uint)i;

                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (leftMessage.playerLeftID != PlayerManager.Instance.Players[i].playerID)
                            {
                                NetworkManager.SendMessage(networkDriver, leftMessage, connections[i]);
                            }
                        }
                        connections[i] = default;
                        break;

                    case MessageHeader.MessageType.MoveRequest:
                        var moveRequest = NetworkManager.ReadMessage <MoveRequest>(reader, ServerMessageQueue);
                        Debug.Log("MoveRequest");
                        if (CheckTileContent(i, TileContent.Monster) || CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 2);
                            SendNewRoomInfo();
                            return;
                        }

                        MakeLeaveRoomMessage(i);
                        PlayerManager.Instance.MovePlayer(moveRequest, i);
                        MakeEnterRoommessage(i);

                        SendNewRoomInfo();
                        MonsterTurn();
                        NewTurnMessage();
                        break;

                    case MessageHeader.MessageType.AttackRequest:
                        var request = NetworkManager.ReadMessage <AttackRequestMessage>(reader, serverMessagesQueue);
                        Debug.Log(DebugTileContent(i));

                        if (!CheckTileContent(i, TileContent.Monster) && !CheckTileContent(i, TileContent.Both))
                        {
                            Debug.Log(CheckTileContent(i, TileContent.Monster));
                            Debug.Log(CheckTileContent(i, TileContent.Both));

                            MakeRequestDeniedMessage(i, 4);
                            SendNewRoomInfo();
                            return;
                        }

                        if (CheckTileContent(i, TileContent.Monster))
                        {
                            SetTileContent(i, TileContent.None);
                        }
                        if (CheckTileContent(i, TileContent.Both))
                        {
                            SetTileContent(i, TileContent.Treasure);
                        }


                        var message = new HitMonsterMessage();
                        NetworkManager.SendMessage(networkDriver, message, connections[i]);
                        SendNewRoomInfo();
                        NewTurnMessage();
                        MonsterTurn();
                        break;

                    case MessageHeader.MessageType.DefendRequest:
                        NetworkManager.ReadMessage <DefendRequestMessage>(reader, serverMessagesQueue);
                        PlayerManager.Instance.Players[i].DefendOneTurn = true;
                        var playerDefendMessage = new PlayerDefendsMessage()
                        {
                            PlayerID = PlayerManager.Instance.Players[i].playerID
                        };

                        Debug.Log(connections.Length);
                        for (int j = 0; j < connections.Length; j++)
                        {
                            NetworkManager.SendMessage(networkDriver, playerDefendMessage, connections[j]);
                        }

                        SendNewRoomInfo();
                        NewTurnMessage();
                        MonsterTurn();
                        break;

                    case MessageHeader.MessageType.ObtainTreasureRequest:
                        NetworkManager.ReadMessage <ClaimTreasureRequestMessage>(reader, serverMessagesQueue);

                        if (!CheckTileContent(i, TileContent.Treasure) && !CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 5);
                            SendNewRoomInfo();
                            return;
                        }
                        if (CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 6);
                            SendNewRoomInfo();
                            return;
                        }

                        Dictionary <Players, uint> players = PlayerManager.Instance.ClaimTreasureDivideItForPlayers(i);

                        uint amount;

                        int SendedItem = 0;

                        foreach (KeyValuePair <Players, uint> item in players)
                        {
                            amount = item.Value;
                            ObtainTreasureMessage obtainTreasure = new ObtainTreasureMessage()
                            {
                                Amount = (ushort)amount
                            };

                            for (int j = 0; j < PlayerManager.Instance.Players.Count; j++)
                            {
                                if (PlayerManager.Instance.Players[j].playerID == item.Key.playerID)
                                {
                                    NetworkManager.SendMessage(networkDriver, obtainTreasure, connections[j]);
                                    SendedItem++;
                                }
                            }
                        }

                        SetTileContent(i, TileContent.None);
                        SendNewRoomInfo();
                        MonsterTurn();
                        NewTurnMessage();
                        break;


                    case MessageHeader.MessageType.LeaveDungeonRequest:
                        NetworkManager.ReadMessage <LeaveDungeonRequest>(reader, serverMessagesQueue);
                        PlayerManager.Instance.PlayersWhoLeft.Add(PlayerManager.Instance.Players[i]);

                        PlayerLeftDungeonMessage playerLeftDungeonMessage = new PlayerLeftDungeonMessage()
                        {
                            playerID = i
                        };

                        PlayerManager.Instance.Players.RemoveAt(i);

                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (i != j)
                            {
                                NetworkManager.SendMessage(networkDriver, playerLeftDungeonMessage, connections[j]);
                            }
                        }

                        if (PlayerManager.Instance.Players.Count < 1)
                        {
                            EndGameMessage endGameMessage = new EndGameMessage();
                            for (int j = 0; j < PlayerManager.Instance.PlayersWhoLeft.Count; j++)
                            {
                                endGameMessage.playerID.Add(PlayerManager.Instance.PlayersWhoLeft[j].playerID);
                                endGameMessage.highScorePairs.Add((ushort)PlayerManager.Instance.PlayersWhoLeft[j].treasureAmount);
                                NetworkManager.SendMessage(networkDriver, endGameMessage, connections[j]);
                                connections[j].Disconnect(networkDriver);
                            }
                        }
                        else
                        {
                            MonsterTurn();
                            SendNewRoomInfo();
                            NewTurnMessage();
                        }
                        break;
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    PlayerLeftMessage leftMessage = new PlayerLeftMessage();
                    leftMessage.playerLeftID = (uint)i;

                    for (int j = 0; j < connections.Length; j++)
                    {
                        if (leftMessage.playerLeftID != PlayerManager.Instance.Players[j].playerID)
                        {
                            NetworkManager.SendMessage(networkDriver, leftMessage, connections[j]);
                        }
                    }

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

        networkJobHandle = networkDriver.ScheduleUpdate();

        ProcessMessagesQueue();
    }