예제 #1
0
    public void QueueAttack(int attackId, Vector2Int targetTile)
    {
        AttackRequestMessage attackMessage = new AttackRequestMessage();

        attackMessage.attackId    = attackId;
        attackMessage.targetTileX = targetTile.x;
        attackMessage.targetTileY = targetTile.y;
        client.Send(CustomNetMsg.AttackRequest, attackMessage);
    }
예제 #2
0
파일: Server.cs 프로젝트: mserier/vrar
    //The attack request ignores action queue stuff and auto accepts, so I dont have to rewrite the queue system that seems to only work for movement
    void GotAttackRequest(NetworkMessage netMsg)
    {
        AttackRequestMessage attackRequest = netMsg.ReadMessage <AttackRequestMessage>();

        AttackMessage attackMessage = new AttackMessage();

        attackMessage.id          = netMsg.conn.connectionId;
        attackMessage.attackId    = attackRequest.attackId;
        attackMessage.targetTileX = attackRequest.targetTileX;
        attackMessage.targetTileY = attackRequest.targetTileY;
        //FOr now we will do random damage
        attackMessage.result = Random.Range(5, 9);

        NetworkServer.SendToAll(CustomNetMsg.Attack, attackMessage);
        handleAttack(attackMessage.id, attackMessage.attackId, attackMessage.targetTileX, attackMessage.targetTileY, attackMessage.result);
    }
    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();
    }
예제 #4
0
        public void OnProcessAttackAction(NetworkMessage msg)
        {
            AttackRequestMessage message = msg.ReadMessage <AttackRequestMessage>();

            if (_gameState.SubActionNumber != message.SubActionNumber || _gameState.ActionNumber != message.ActionNumber)
            {
                SendToAll(CustomMessageTypes.GameStateSync, new GameStateSyncMessage
                {
                    ActionNumber                = _gameState.ActionNumber,
                    SubActionNumber             = _gameState.SubActionNumber,
                    Message                     = "Game State Sync",
                    HostMonsterState            = JsonConvert.SerializeObject(_gameState.HostMonsters.Select(m => new { m.MonsterTypeId, m.CurrentNode.Id }).ToDictionary(k => k.MonsterTypeId, v => v.Id)),
                    GuestMonsterState           = JsonConvert.SerializeObject(_gameState.GuestMonsters.Select(m => new { m.MonsterTypeId, m.CurrentNode.Id }).ToDictionary(k => k.MonsterTypeId, v => v.Id)),
                    SelectedMonsterTypeId       = _gameState.SelectedMonster != null ? _gameState.SelectedMonster.MonsterTypeId : 0,
                    MovementPathIds             = _gameState.SelectedMovementPath != null ? JsonConvert.SerializeObject(_gameState.SelectedMovementPath.PathToDestination.Select(n => n.Id).ToArray()) : null,
                    DestinationNodeId           = _gameState.SelectedMovementPath != null ? _gameState.SelectedMovementPath.DestinationNode.Id : 0,
                    SelectedAttackNodeId        = _gameState.SelectedAttackNode != null ? _gameState.SelectedAttackNode.Id : 0,
                    AvailablePushDestinationIds = JsonConvert.SerializeObject(_gameState.AvailablePushDestinations.Select(n => n.Id))
                });
                return;
            }

            _gameState.ProcessAttackAction(message.AttackingMonsterTypeId, message.DefendingMonsterTypeId);
        }
    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();
    }
예제 #6
0
    /// <summary>
    /// Attackig the player
    /// </summary>
    public void SendAttackRequest()
    {
        AttackRequestMessage attackRequest = new AttackRequestMessage();

        clientBehaviour.SendRequest(attackRequest);
    }
예제 #7
0
    public void RequestAttackMonster()
    {
        AttackRequestMessage message = new AttackRequestMessage();

        dataHolder.client.SendMessage(message);
    }
    public void Update()
    {
        networkJobHandle.Complete();

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

        NetworkConnection c;

        while (!serverManager.game.started && serverManager.lobby.players.Count < ServerManager.maxPlayers && (c = networkDriver.Accept()) != default)
        {
            connections.Add(c);
            Debug.Log("Accepted connection");
            serverManager.HandleNewConnection(c.InternalId);
        }

        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 = (Message.MessageType)reader.ReadUShort();
                    Debug.Log("Host Received: " + messageType + " from " + connections[i].InternalId);

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

                    case Message.MessageType.SetName: message = new SetNameMessage(); break;

                    case Message.MessageType.MoveRequest: message = new MoveRequestMessage(); break;

                    case Message.MessageType.AttackRequest: message = new AttackRequestMessage(); break;

                    case Message.MessageType.DefendRequest: message = new DefendRequestMessage(); break;

                    case Message.MessageType.ClaimTreasureRequest: message = new ClaimTreasureRequestMessage(); break;

                    case Message.MessageType.LeaveDungeonRequest: message = new LeaveDungeonRequestMessage(); break;

                    default: break;
                    }
                    if (message != null)
                    {
                        message.DeserializeObject(ref reader);
                        receivedMessagesQueue.Enqueue(new AdressedMessage(message, connections[i].InternalId));
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    Debug.Log("Client disconnected");
                    serverManager.HandleDisconnect(connections[i].InternalId);
                    connections[i] = default;
                }
            }
        }

        ProcessMessagesQueue();

        //order slightly wrong but will be sent next cycle
        foreach (KeyValuePair <int, float> lastSendTime in lastSendTimes)
        {
            if (Time.time - lastSendTime.Value > STAY_ALIVE_AFTER_SECONDS)
            {
                QeueMessage(new AdressedMessage(new NoneMessage(), lastSendTime.Key));
            }
        }
        networkJobHandle = networkDriver.ScheduleUpdate();
    }