示例#1
0
        /// <summary>
        /// Invoked when the game has been started.
        /// </summary>
        private void HandleStartGame(MessageReader message)
        {
            OnTalkingEnd?.Invoke();

            _connection.SendReliableMessage(writer =>
            {
                writer.StartMessage((byte)MMTags.GameData);
                writer.Write(_lobbyCode);

                writer.StartMessage((byte)GameDataTags.Ready);
                writer.WritePacked(_clientId);
                writer.EndMessage();

                writer.EndMessage();
            });
        }
示例#2
0
        /// <summary>
        /// Handles an RPC game packet, dispatching the results when appropriate.
        /// </summary>
        private void HandleRPC(MessageReader reader)
        {
            reader.ReadPackedInt32(); // rpc target
            var action = (RPCCalls)reader.ReadByte();

            if (action == RPCCalls.Close)
            {
                OnTalkingEnd?.Invoke();
            }
            else if (action == RPCCalls.StartMeeting)
            {
                OnTalkingStart?.Invoke();
            }
            else if (action == RPCCalls.UpdateGameData)
            {
                if (!_hasReconnectedAfterPlayerData)
                {
                    return;                                  // don't handle UpdateGameData earlier.
                }
                foreach (var dataEntry in reader.Messages())
                {
                    UpdateOrCreatePlayerData(dataEntry, dataEntry.Tag);
                }

                OnPlayerDataUpdate?.Invoke(_playerData);
            }
            else if (action == RPCCalls.MurderPlayer)
            {
                var victim         = reader.ReadPackedInt32();
                var victimPlayerId = _playerControlNetIdToPlayerId[victim];

                _playerData.Find(x => x.id == victimPlayerId).statusBitField |= 4; // dead
                OnPlayerDataUpdate?.Invoke(_playerData);
            }
            else if (action == RPCCalls.VotingComplete)
            {
                reader.ReadBytesAndSize(); // voting data
                var victim = reader.ReadByte();
                if (victim != 0xFF)
                {
                    _playerData.Find(x => x.id == victim).statusBitField |= 4; // dead
                    OnPlayerDataUpdate?.Invoke(_playerData);
                }
            }
        }