/// <summary> /// Event invocator for receiving a message /// </summary> protected virtual void OnEventMessageReceived(EventMessage eventmessage) { EventMessageReceivedEventArgs args = new EventMessageReceivedEventArgs { QueueName = QueueName, TopicExpressions = Topics }; EventMessageReceived?.Invoke(eventmessage, args); }
private void InstanceOnMainLoopRun(ref bool didWork) { if (!Started) { return; } for (; ;) { vx_message_base_t m = VivoxUnity.Helper.NextMessage(); if (m == null) { break; } didWork = true; if (m.type == vx_message_type.msg_event) { EventMessageReceived?.Invoke((vx_evt_base_t)m); } else if (m.type == vx_message_type.msg_response) { var r = (vx_resp_base_t)m; string key = r.request.cookie; AsyncResult <vx_resp_base_t> result = null; lock (_pendingRequests) { if (_pendingRequests.ContainsKey(key)) { result = _pendingRequests[key]; _pendingRequests.Remove(key); } } result?.SetComplete(r); } } }
public void Update() { NetIncomingMessage msg; while ((msg = NetworkClient.ReadMessage()) != null) { float packetTime = (float)DateTime.UtcNow.Subtract(_lastPacketTime).TotalMilliseconds; if (packetTime > 3f) { _averagePacketTimes.Add(packetTime); if (_averagePacketTimes.Count > 300) { _averagePacketTimes.RemoveAt(0); } Tickrate = (float)Math.Round(1000f / _averagePacketTimes.Average(), 2); } _lastPacketTime = DateTime.UtcNow; switch (msg.MessageType) { case NetIncomingMessageType.StatusChanged: { NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); if (status == NetConnectionStatus.Connected && !Connected) { Connected = true; ConnectedToServerHub?.Invoke(); } else { Misc.Logger.Info("New connection state: " + status); } } break; case NetIncomingMessageType.Data: { CommandType commandType = (CommandType)msg.PeekByte(); if (commandType == CommandType.Disconnect) { #if DEBUG Misc.Logger.Info("Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel.Invoke(msg); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Method.Name} on message received event: {e}"); } } return; } else if (commandType == CommandType.SendEventMessage) { string header = msg.ReadString(); string data = msg.ReadString(); #if DEBUG Misc.Logger.Info($"Received event message! Header=\"{header}\", Data=\"{data}\""); #endif EventMessageReceived?.Invoke(header, data); } else { foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel.Invoke(msg); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Method.Name} on message received event: {e}"); } } } if (commandType == CommandType.JoinRoom) { msg.Position = 8; if (msg.PeekByte() == 0) { ClientJoinedRoom?.Invoke(); } } else if (commandType == CommandType.StartLevel) { if (playerInfo.playerState == PlayerState.Room) { ClientLevelStarted?.Invoke(); } } }; break; case NetIncomingMessageType.WarningMessage: Misc.Logger.Warning(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Misc.Logger.Error(msg.ReadString()); break; #if DEBUG case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: Misc.Logger.Info(msg.ReadString()); break; default: Misc.Logger.Info("Unhandled message type: " + msg.MessageType); break; #endif } NetworkClient.Recycle(msg); } }
public void Update() { if (NetworkClient.ReadMessages(_receivedMessages) > 0) { try { if (_receivedMessages.Any(x => x.PeekByte() != (byte)CommandType.UpdateVoIPData)) { float packetTime = (float)DateTime.UtcNow.Subtract(_lastPacketTime).TotalMilliseconds; if (packetTime > 2f) { _averagePacketTimes.Add(packetTime); if (_averagePacketTimes.Count > 150) { _averagePacketTimes.RemoveAt(0); } Tickrate = (float)Math.Round(1000f / _averagePacketTimes.Where(x => x > 2f).Average(), 2); } _lastPacketTime = DateTime.UtcNow; } NetIncomingMessage lastUpdate = _receivedMessages.LastOrDefault(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.UpdatePlayerInfo); if (lastUpdate != null) { foreach (NetIncomingMessage msg in _receivedMessages.Where(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.UpdatePlayerInfo)) { foreach (Action <NetIncomingMessage> nextDel in PlayerInfoUpdateReceived.GetInvocationList()) { try { msg.Position = 0; nextDel.Invoke(msg); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on update received event: {e}"); } } } _receivedMessages.RemoveAll(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.UpdatePlayerInfo); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { lastUpdate.Position = 0; nextDel.Invoke(lastUpdate); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } } } foreach (NetIncomingMessage msg in _receivedMessages) { switch (msg.MessageType) { case NetIncomingMessageType.StatusChanged: { NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); if (status == NetConnectionStatus.Connected && !Connected) { Connected = true; ConnectedToServerHub?.Invoke(); } else if (status == NetConnectionStatus.Disconnected && Connected) { #if DEBUG Misc.Logger.Info("Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { nextDel.Invoke(null); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } } } else if (status == NetConnectionStatus.Disconnected && !Connected) { Misc.Logger.Info("ServerHub refused connection! Reason: " + msg.ReadString()); } } break; case NetIncomingMessageType.Data: { CommandType commandType = (CommandType)msg.PeekByte(); if (commandType == CommandType.Disconnect) { #if DEBUG Misc.Logger.Info("Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel.Invoke(msg); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } } return; } else if (commandType == CommandType.SendEventMessage) { string header = msg.ReadString(); string data = msg.ReadString(); #if DEBUG Misc.Logger.Info($"Received event message! Header=\"{header}\", Data=\"{data}\""); #endif foreach (Action <string, string> nextDel in EventMessageReceived.GetInvocationList()) { try { nextDel.Invoke(header, data); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on event message received event: {e}"); } } } else { if (MessageReceived != null) { foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel.Invoke(msg); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } } } } if (commandType == CommandType.JoinRoom) { msg.Position = 8; if (msg.PeekByte() == 0 && ClientJoinedRoom != null) { foreach (Action nextDel in ClientJoinedRoom.GetInvocationList()) { try { nextDel.Invoke(); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client joined room event: {e}"); } } } } else if (commandType == CommandType.StartLevel) { if (playerInfo.playerState == PlayerState.Room) { foreach (Action nextDel in ClientLevelStarted.GetInvocationList()) { try { nextDel.Invoke(); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client level started event: {e}"); } } } } }; break; case NetIncomingMessageType.WarningMessage: Misc.Logger.Warning(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Misc.Logger.Error(msg.ReadString()); break; #if DEBUG case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: Misc.Logger.Info(msg.ReadString()); break; default: Misc.Logger.Info("Unhandled message type: " + msg.MessageType); break; #endif } NetworkClient.Recycle(msg); } }catch (Exception e) { #if DEBUG Misc.Logger.Exception($"Exception on message received event: {e}"); #endif } _receivedMessages.Clear(); } if (Connected && NetworkClient.ConnectionsCount == 0) { #if DEBUG Misc.Logger.Info("Connection lost! Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { nextDel.Invoke(null); } catch (Exception e) { Misc.Logger.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } } } }
private static void HubLoop(object sender, HighResolutionTimerElapsedEventArgs e) { if (_ticksLength.Count > 30) { _ticksLength.RemoveAt(0); } _ticksLength.Add(DateTime.UtcNow.Subtract(_lastTick).Ticks / (float)TimeSpan.TicksPerMillisecond); _lastTick = DateTime.UtcNow; List <RoomInfo> roomsList = RoomsController.GetRoomInfosList(); string titleBuffer = $"ServerHub v{Assembly.GetEntryAssembly().GetName().Version}: {roomsList.Count} rooms, {hubClients.Count} clients in lobby, {roomsList.Select(x => x.players).Sum() + hubClients.Count} clients total {(Settings.Instance.Server.ShowTickrateInTitle ? $", {Tickrate.ToString("0.0")} tickrate" : "")}"; if (_currentTitle != titleBuffer) { _currentTitle = titleBuffer; Console.Title = _currentTitle; } List <Client> allClients = hubClients.Concat(RoomsController.GetRoomsList().SelectMany(x => x.roomClients)).Concat(RadioController.radioChannels.SelectMany(x => x.radioClients)).ToList(); NetIncomingMessage msg; while ((msg = ListenerServer.ReadMessage()) != null) { try { Program.networkBytesInNow += msg.LengthBytes; switch (msg.MessageType) { case NetIncomingMessageType.ConnectionApproval: { byte[] versionBytes = msg.PeekBytes(4); byte[] version = msg.ReadBytes(4); if (version[0] == 0 && version[1] == 0) { uint versionUint = BitConverter.ToUInt32(version, 0); uint serverVersionUint = ((uint)Assembly.GetEntryAssembly().GetName().Version.Major).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Minor).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Build).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Revision); msg.SenderConnection.Deny($"Version mismatch!\nServer:{serverVersionUint}\nClient:{versionUint}"); Logger.Instance.Log($"Client version v{versionUint} tried to connect"); break; } byte[] serverVersion = new byte[4] { (byte)Assembly.GetEntryAssembly().GetName().Version.Major, (byte)Assembly.GetEntryAssembly().GetName().Version.Minor, (byte)Assembly.GetEntryAssembly().GetName().Version.Build, (byte)Assembly.GetEntryAssembly().GetName().Version.Revision }; if (version[0] != serverVersion[0] || version[1] != serverVersion[1] || version[2] != serverVersion[2]) { msg.SenderConnection.Deny($"Version mismatch|{string.Join('.', serverVersion)}|{string.Join('.', version)}"); Logger.Instance.Log($"Client version v{string.Join('.', version)} tried to connect"); break; } PlayerInfo playerInfo = new PlayerInfo(msg); if (Settings.Instance.Access.WhitelistEnabled) { if (!IsWhitelisted(msg.SenderConnection.RemoteEndPoint, playerInfo)) { msg.SenderConnection.Deny("You are not whitelisted on this ServerHub!"); Logger.Instance.Warning($"Client {playerInfo.playerName}({playerInfo.playerId})@{msg.SenderConnection.RemoteEndPoint.Address} is not whitelisted!"); break; } } if (IsBlacklisted(msg.SenderConnection.RemoteEndPoint, playerInfo)) { msg.SenderConnection.Deny("You are banned on this ServerHub!"); Logger.Instance.Warning($"Client {playerInfo.playerName}({playerInfo.playerId})@{msg.SenderConnection.RemoteEndPoint.Address} is banned!"); break; } msg.SenderConnection.Approve(); Client client = new Client(msg.SenderConnection, playerInfo); client.playerInfo.playerState = PlayerState.Lobby; client.ClientDisconnected += ClientDisconnected; hubClients.Add(client); allClients.Add(client); Logger.Instance.Log($"{playerInfo.playerName} connected!"); }; break; case NetIncomingMessageType.Data: { Client client = allClients.FirstOrDefault(x => x.playerConnection.RemoteEndPoint.Equals(msg.SenderEndPoint)); switch ((CommandType)msg.ReadByte()) { case CommandType.Disconnect: { if (client != null) { allClients.Remove(client); ClientDisconnected(client); } } break; case CommandType.UpdatePlayerInfo: { if (client != null) { client.playerInfo = new PlayerInfo(msg); if (Settings.Instance.Misc.PlayerColors.ContainsKey(client.playerInfo.playerId)) { client.playerInfo.playerNameColor = Settings.Instance.Misc.PlayerColors[client.playerInfo.playerId]; } } } break; case CommandType.UpdateVoIPData: { if (!Settings.Instance.Server.AllowVoiceChat) { return; } if (client != null) { UnityVOIP.VoipFragment data = new UnityVOIP.VoipFragment(msg); if (data.playerId == client.playerInfo.playerId) { client.playerVoIPQueue.Enqueue(data); } } } break; case CommandType.JoinRoom: { if (client != null) { uint roomId = msg.ReadUInt32(); BaseRoom room = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == roomId); if (room != null) { if (room.roomSettings.UsePassword) { if (RoomsController.ClientJoined(client, roomId, msg.ReadString())) { if (hubClients.Contains(client)) { hubClients.Remove(client); } client.joinedRoomID = roomId; } } else { if (RoomsController.ClientJoined(client, roomId, "")) { if (hubClients.Contains(client)) { hubClients.Remove(client); } client.joinedRoomID = roomId; } } } else { RoomsController.ClientJoined(client, roomId, ""); } } } break; case CommandType.LeaveRoom: { if (client != null) { RoomsController.ClientLeftRoom(client); client.joinedRoomID = 0; client.playerInfo.playerState = PlayerState.Lobby; if (!hubClients.Contains(client)) { hubClients.Add(client); } } } break; case CommandType.GetRooms: { NetOutgoingMessage outMsg = ListenerServer.CreateMessage(); outMsg.Write((byte)CommandType.GetRooms); RoomsController.AddRoomListToMessage(outMsg); msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0); Program.networkBytesOutNow += outMsg.LengthBytes; } break; case CommandType.CreateRoom: { if (client != null) { uint roomId = RoomsController.CreateRoom(new RoomSettings(msg), client.playerInfo); NetOutgoingMessage outMsg = ListenerServer.CreateMessage(5); outMsg.Write((byte)CommandType.CreateRoom); outMsg.Write(roomId); msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0); Program.networkBytesOutNow += outMsg.LengthBytes; } } break; case CommandType.GetRoomInfo: { if (client != null) { #if DEBUG Logger.Instance.Log("GetRoomInfo: Client room=" + client.joinedRoomID); #endif if (client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { NetOutgoingMessage outMsg = ListenerServer.CreateMessage(); outMsg.Write((byte)CommandType.GetRoomInfo); joinedRoom.GetRoomInfo().AddToMessage(outMsg); msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0); Program.networkBytesOutNow += outMsg.LengthBytes; } } } } break; case CommandType.SetSelectedSong: { if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { if (msg.LengthBytes < 16) { joinedRoom.SetSelectedSong(client.playerInfo, null); } else { joinedRoom.SetSelectedSong(client.playerInfo, new SongInfo(msg)); } } } } break; case CommandType.SetLevelOptions: { if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { joinedRoom.SetLevelOptions(client.playerInfo, new StartLevelInfo(msg)); } } } break; case CommandType.StartLevel: { #if DEBUG Logger.Instance.Log("Received command StartLevel"); #endif if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { StartLevelInfo options = new StartLevelInfo(msg); SongInfo song = new SongInfo(msg); song.songDuration += 2.5f; joinedRoom.StartLevel(client.playerInfo, options, song); } } } break; case CommandType.DestroyRoom: { if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { joinedRoom.DestroyRoom(client.playerInfo); } } } break; case CommandType.TransferHost: { if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { joinedRoom.TransferHost(client.playerInfo, new PlayerInfo(msg)); } } } break; case CommandType.PlayerReady: { if (client != null && client.joinedRoomID != 0) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { joinedRoom.ReadyStateChanged(client.playerInfo, msg.ReadBoolean()); } } } break; case CommandType.SendEventMessage: { if (client != null && client.joinedRoomID != 0 && Settings.Instance.Server.AllowEventMessages) { BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID); if (joinedRoom != null) { string header = msg.ReadString(); string data = msg.ReadString(); joinedRoom.BroadcastEventMessage(header, data, new List <Client>() { client }); joinedRoom.BroadcastWebSocket(CommandType.SendEventMessage, new EventMessage(header, data)); EventMessageReceived?.Invoke(client, header, data); #if DEBUG Logger.Instance.Log($"Received event message! Header=\"{header}\", Data=\"{data}\""); #endif } } } break; case CommandType.GetChannelInfo: { if (Settings.Instance.Radio.EnableRadio && RadioController.radioStarted) { int channelId = msg.ReadInt32(); NetOutgoingMessage outMsg = ListenerServer.CreateMessage(); outMsg.Write((byte)CommandType.GetChannelInfo); if (RadioController.radioChannels.Count > channelId) { RadioController.radioChannels[channelId].channelInfo.AddToMessage(outMsg); } else { new ChannelInfo() { channelId = -1, currentSong = new SongInfo() { levelId = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" } }.AddToMessage(outMsg); } msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0); Program.networkBytesOutNow += outMsg.LengthBytes; } } break; case CommandType.JoinChannel: { int channelId = msg.ReadInt32(); NetOutgoingMessage outMsg = ListenerServer.CreateMessage(); outMsg.Write((byte)CommandType.JoinChannel); if (RadioController.ClientJoinedChannel(client, channelId)) { outMsg.Write((byte)0); hubClients.Remove(client); } else { outMsg.Write((byte)1); } msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0); Program.networkBytesOutNow += outMsg.LengthBytes; } break; case CommandType.GetSongDuration: { foreach (RadioChannel channel in RadioController.radioChannels) { if (channel.radioClients.Contains(client) && channel.requestingSongDuration) { SongInfo info = new SongInfo(msg); if (info.levelId == channel.channelInfo.currentSong.levelId) { channel.songDurationResponses.TryAdd(client, info.songDuration); } } } } break; case CommandType.LeaveChannel: { if (RadioController.radioStarted && client != null) { RadioController.ClientLeftChannel(client); } }; break; } }; break; case NetIncomingMessageType.WarningMessage: Logger.Instance.Warning(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Logger.Instance.Error(msg.ReadString()); break; case NetIncomingMessageType.StatusChanged: { NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); Client client = allClients.FirstOrDefault(x => x.playerConnection.RemoteEndPoint.Equals(msg.SenderEndPoint)); if (client != null) { if (status == NetConnectionStatus.Disconnected) { allClients.Remove(client); ClientDisconnected(client); } } } break; #if DEBUG case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: Logger.Instance.Log(msg.ReadString()); break; default: Logger.Instance.Log("Unhandled message type: " + msg.MessageType); break; #endif } }catch (Exception ex) { Logger.Instance.Log($"Exception on message received: {ex}"); } ListenerServer.Recycle(msg); } }
public void Update() { if (_receivedMessages.Count > 0) { networkClient.Recycle(_receivedMessages); _receivedMessages.Clear(); } if (networkClient.ReadMessages(_receivedMessages) > 0) { for (int i = _receivedMessages.Count - 1; i >= 0; i--) { if (_receivedMessages[i].MessageType == NetIncomingMessageType.Data && _receivedMessages[i].PeekByte() == (byte)CommandType.UpdatePlayerInfo) { if (_packets > 150) { _averagePacketTime = 0f; _packets = 0; } if (Time.realtimeSinceStartup - _lastPacketTime < 0.2f) { _averagePacketTime += Time.realtimeSinceStartup - _lastPacketTime; _packets++; if (_averagePacketTime != 0f && _packets != 0) { tickrate = 1f / (_averagePacketTime / _packets); } } else { _averagePacketTime = 0f; _packets = 0; } _lastPacketTime = Time.realtimeSinceStartup; MessageReceived?.Invoke(_receivedMessages[i]); _receivedMessages[i].Position = 0; break; } } if (Config.Instance.SpectatorMode) { for (int i = 0; i < _receivedMessages.Count; i++) { _receivedMessages[i].Position = 0; if (_receivedMessages[i].MessageType == NetIncomingMessageType.Data && _receivedMessages[i].PeekByte() == (byte)CommandType.GetPlayerUpdates) { PlayerInfoUpdateReceived?.Invoke(_receivedMessages[i]); _receivedMessages[i].Position = 0; } } } foreach (NetIncomingMessage msg in _receivedMessages) { switch (msg.MessageType) { case NetIncomingMessageType.StatusChanged: { NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); if (status == NetConnectionStatus.Connected && !connected) { connected = true; ConnectedToServerHub?.Invoke(); } else if (status == NetConnectionStatus.Disconnected && connected) { #if DEBUG Plugin.log.Info("Disconnecting..."); #endif Disconnect(); MessageReceived?.Invoke(null); } else if (status == NetConnectionStatus.Disconnected && !connected) { Plugin.log.Error("ServerHub refused connection! Reason: " + msg.ReadString()); } } break; case NetIncomingMessageType.Data: { CommandType commandType = (CommandType)msg.PeekByte(); switch (commandType) { case CommandType.Disconnect: { #if DEBUG Plugin.log.Info("Disconnecting..."); #endif Disconnect(); MessageReceived?.Invoke(msg); } break; case CommandType.SendEventMessage: { string header = msg.ReadString(); string data = msg.ReadString(); #if DEBUG Plugin.log.Info($"Received event message! Header=\"{header}\", Data=\"{data}\""); #endif foreach (Action <string, string> nextDel in EventMessageReceived.GetInvocationList()) { try { nextDel?.Invoke(header, data); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on event message received event: {e}"); } else { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on event message received event: {e}"); } } } } break; case CommandType.JoinRoom: { msg.Position = 8; if (msg.PeekByte() == 0 && ClientJoinedRoom != null) { foreach (Action nextDel in ClientJoinedRoom.GetInvocationList()) { try { nextDel?.Invoke(); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client joined room event: {e}"); } else { Plugin.log.Error($"Exception on client joined room event: {e}"); } } } } MessageReceived?.Invoke(msg); } break; case CommandType.StartLevel: { #if DEBUG startNewDump = true; packetsBuffer.Clear(); msg.Position = 8; LevelOptionsInfo levelInfo = new LevelOptionsInfo(msg); SongInfo songInfo = new SongInfo(msg); List <byte> buffer = new List <byte>(); buffer.AddRange(levelInfo.ToBytes()); buffer.AddRange(HexConverter.ConvertHexToBytesX(songInfo.hash)); Plugin.log.Info("LevelID: " + songInfo.levelId + ", Bytes: " + BitConverter.ToString(buffer.ToArray())); packetsBuffer.Enqueue(buffer.ToArray()); msg.Position = 0; #endif if (playerInfo != null && playerInfo.updateInfo.playerState == PlayerState.Room && ClientLevelStarted != null) { foreach (Action nextDel in ClientLevelStarted.GetInvocationList()) { try { nextDel?.Invoke(); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client level started event: {e}"); } else { Plugin.log.Error($"Exception on client level started event: {e}"); } } } } MessageReceived?.Invoke(msg); } break; case CommandType.UpdatePlayerInfo: break; default: { MessageReceived?.Invoke(msg); } break; } }; break; case NetIncomingMessageType.WarningMessage: Plugin.log.Warn(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Plugin.log.Error(msg.ReadString()); break; #if DEBUG case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: Plugin.log.Info(msg.ReadString()); break; default: Plugin.log.Info("Unhandled message type: " + msg.MessageType); break; #endif } } networkClient.Recycle(_receivedMessages); _receivedMessages.Clear(); } if (connected && networkClient.ConnectionsCount == 0) { #if DEBUG Plugin.log.Info("Connection lost! Disconnecting..."); #endif Disconnect(); MessageReceived?.Invoke(null); } if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && Input.GetKeyDown(KeyCode.F1)) { GarbageCollector.GCMode = GarbageCollector.GCMode == GarbageCollector.Mode.Enabled ? GarbageCollector.Mode.Disabled : GarbageCollector.Mode.Enabled; Plugin.log.Notice($"Garbage collector {GarbageCollector.GCMode.ToString()}!"); } }
public void Update() { if (networkClient.ReadMessages(_receivedMessages) > 0) { try { if (_receivedMessages.Any(x => x.PeekByte() != (byte)CommandType.UpdateVoIPData)) { float packetTime = (float)DateTime.UtcNow.Subtract(_lastPacketTime).TotalMilliseconds; if (packetTime > 2f) { _averagePacketTimes.Add(packetTime); if (_averagePacketTimes.Count > 150) { _averagePacketTimes.RemoveAt(0); } tickrate = (float)Math.Round(1000f / _averagePacketTimes.Where(x => x > 2f).Average(), 2); } _lastPacketTime = DateTime.UtcNow; } try { if (Config.Instance.SpectatorMode) { foreach (var lastPlayerHistoryUpdates in _receivedMessages.Where(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.GetPlayerUpdates)) { foreach (Action <NetIncomingMessage> nextDel in PlayerInfoUpdateReceived.GetInvocationList()) { try { lastPlayerHistoryUpdates.Position = 0; nextDel?.Invoke(lastPlayerHistoryUpdates); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on update received event: {e}"); } else { Plugin.log.Error($"Exception on update received event: {e}"); } } } lastPlayerHistoryUpdates.Position = 0; } } }catch (Exception e) { Plugin.log.Error("Unable to parse GetPlayerUpdates message! Exception: " + e); } try { NetIncomingMessage lastUpdate = _receivedMessages.LastOrDefault(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.UpdatePlayerInfo); if (lastUpdate != null) { _receivedMessages.RemoveAll(x => x.MessageType == NetIncomingMessageType.Data && x.PeekByte() == (byte)CommandType.UpdatePlayerInfo); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { lastUpdate.Position = 0; nextDel?.Invoke(lastUpdate); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on update received event: {e}"); } else { Plugin.log.Error($"Exception on update received event: {e}"); } } } lastUpdate.Position = 0; } }catch (Exception e) { Plugin.log.Error("Unable to parse UpdatePlayerInfo message! Exception: " + e); } foreach (NetIncomingMessage msg in _receivedMessages) { switch (msg.MessageType) { case NetIncomingMessageType.StatusChanged: { NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); if (status == NetConnectionStatus.Connected && !connected) { connected = true; ConnectedToServerHub?.Invoke(); } else if (status == NetConnectionStatus.Disconnected && connected) { #if DEBUG Plugin.log.Info("Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { nextDel?.Invoke(null); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } else { Plugin.log.Error($"Exception on message received event: {e}"); } } } } else if (status == NetConnectionStatus.Disconnected && !connected) { Plugin.log.Error("ServerHub refused connection! Reason: " + msg.ReadString()); } } break; case NetIncomingMessageType.Data: { CommandType commandType = (CommandType)msg.PeekByte(); if (commandType == CommandType.Disconnect) { #if DEBUG Plugin.log.Info("Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel?.Invoke(msg); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } else { Plugin.log.Error($"Exception on message received event: {e}"); } } } return; } else if (commandType == CommandType.SendEventMessage) { string header = msg.ReadString(); string data = msg.ReadString(); #if DEBUG Plugin.log.Info($"Received event message! Header=\"{header}\", Data=\"{data}\""); #endif foreach (Action <string, string> nextDel in EventMessageReceived.GetInvocationList()) { try { nextDel?.Invoke(header, data); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on event message received event: {e}"); } else { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on event message received event: {e}"); } } } } else { if (MessageReceived != null) { foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { msg.Position = 0; nextDel?.Invoke(msg); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } else { Plugin.log.Error($"Exception on message received event: {e}"); } } } } } if (commandType == CommandType.JoinRoom) { msg.Position = 8; if (msg.PeekByte() == 0 && ClientJoinedRoom != null) { foreach (Action nextDel in ClientJoinedRoom.GetInvocationList()) { try { nextDel?.Invoke(); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client joined room event: {e}"); } else { Plugin.log.Error($"Exception on client joined room event: {e}"); } } } } } else if (commandType == CommandType.StartLevel) { #if DEBUG startNewDump = true; packetsBuffer.Clear(); msg.Position = 8; LevelOptionsInfo levelInfo = new LevelOptionsInfo(msg); SongInfo songInfo = new SongInfo(msg); List <byte> buffer = new List <byte>(); buffer.AddRange(levelInfo.ToBytes()); buffer.AddRange(HexConverter.ConvertHexToBytesX(songInfo.levelId)); Plugin.log.Info("LevelID: " + songInfo.levelId + ", Bytes: " + BitConverter.ToString(buffer.ToArray())); packetsBuffer.Enqueue(buffer.ToArray()); msg.Position = 0; #endif if (playerInfo.playerState == PlayerState.Room) { foreach (Action nextDel in ClientLevelStarted.GetInvocationList()) { try { nextDel?.Invoke(); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on client level started event: {e}"); } else { Plugin.log.Error($"Exception on client level started event: {e}"); } } } } } }; break; case NetIncomingMessageType.WarningMessage: Plugin.log.Warn(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Plugin.log.Error(msg.ReadString()); break; #if DEBUG case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: Plugin.log.Info(msg.ReadString()); break; default: Plugin.log.Info("Unhandled message type: " + msg.MessageType); break; #endif } networkClient.Recycle(msg); } }catch (Exception e) { #if DEBUG Plugin.log.Critical($"Exception on message received event: {e}"); #endif } _receivedMessages.Clear(); } if (connected && networkClient.ConnectionsCount == 0) { #if DEBUG Plugin.log.Info("Connection lost! Disconnecting..."); #endif Disconnect(); foreach (Action <NetIncomingMessage> nextDel in MessageReceived.GetInvocationList()) { try { nextDel.Invoke(null); } catch (Exception e) { if (nextDel != null) { Plugin.log.Error($"Exception in {nextDel.Target.GetType()}.{nextDel.Method.Name} on message received event: {e}"); } else { Plugin.log.Error($"Exception on message received event: {e}"); } } } } }