/// <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(); }); }
/// <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); } } }