From 005ce09ac119f0dc91e72cc5d1093ec83f2c188c Mon Sep 17 00:00:00 2001 From: Aleksander Waage Date: Sun, 9 Aug 2020 09:37:32 +0200 Subject: [PATCH] actually generic events --- QSB/Events/EventMessage.cs | 61 -------------------------- QSB/Events/EventSender.cs | 22 ++++------ QSB/Events/GameState.cs | 3 +- QSB/Events/PlayerFlashlightEvent.cs | 16 +++---- QSB/Events/PlayerJoinEvent.cs | 12 ++--- QSB/Events/PlayerJoinMessage.cs | 21 +++++++++ QSB/Events/PlayerProbeLauncherEvent.cs | 16 +++---- QSB/Events/PlayerSignalscopeEvent.cs | 16 +++---- QSB/Events/PlayerTranslatorEvent.cs | 16 +++---- QSB/Events/QSBEvent.cs | 39 ++++++++-------- QSB/Events/ToggleMessage.cs | 21 +++++++++ QSB/QSB.csproj | 3 +- 12 files changed, 111 insertions(+), 135 deletions(-) delete mode 100644 QSB/Events/EventMessage.cs create mode 100644 QSB/Events/PlayerJoinMessage.cs create mode 100644 QSB/Events/ToggleMessage.cs diff --git a/QSB/Events/EventMessage.cs b/QSB/Events/EventMessage.cs deleted file mode 100644 index 8f3b2676..00000000 --- a/QSB/Events/EventMessage.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; -using UnityEngine.Networking; - -namespace QSB.Events -{ - public class EventMessage : PlayerMessage - { - public int EventType { get; set; } - public object[] Data { get; set; } - - public override void Deserialize(NetworkReader reader) - { - base.Deserialize(reader); - EventType = reader.ReadInt32(); - var guff = reader.ReadString(); - var strings = guff.Split('|'); - var temp = new List(); - foreach (var item in strings) - { - temp.Add(StringToObject(item)); - } - Data = temp.ToArray(); - } - - public override void Serialize(NetworkWriter writer) - { - base.Serialize(writer); - writer.Write(EventType); - var data = ""; - foreach (var item in Data) - { - data += "|" + ObjectToString(item); - } - data = data.TrimStart('|'); - writer.Write(data); - } - - public string ObjectToString(object obj) - { - using (var ms = new MemoryStream()) - { - new BinaryFormatter().Serialize(ms, obj); - return Convert.ToBase64String(ms.ToArray()); - } - } - - public object StringToObject(string base64String) - { - byte[] bytes = Convert.FromBase64String(base64String); - using (var ms = new MemoryStream(bytes, 0, bytes.Length)) - { - ms.Write(bytes, 0, bytes.Length); - ms.Position = 0; - return new BinaryFormatter().Deserialize(ms); - } - } - } -} diff --git a/QSB/Events/EventSender.cs b/QSB/Events/EventSender.cs index 3135908f..f4271b61 100644 --- a/QSB/Events/EventSender.cs +++ b/QSB/Events/EventSender.cs @@ -1,21 +1,17 @@ -using System.Collections.Generic; - -namespace QSB.Events +namespace QSB.Events { public static class EventSender { - public static List EventList = new List(); - public static void Init() { - EventList.Add(new PlayerFlashlightEvent()); - EventList.Add(new PlayerSignalscopeEvent()); - EventList.Add(new PlayerTrasnlatorEvent()); - EventList.Add(new PlayerProbeLauncherEvent()); - //EventList.Add(new PlayerProbeEvent()); - //EventList.Add(new PlayerSectorChange()); - EventList.Add(new PlayerJoinEvent()); - //EventList.Add(new PlayerLeaveEvent()); + new PlayerFlashlightEvent(); + new PlayerSignalscopeEvent(); + new PlayerTranslatorEvent(); + new PlayerProbeLauncherEvent(); + //new PlayerProbeEvent(); + //new PlayerSectorChange(); + new PlayerJoinEvent(); + //new PlayerLeaveEvent(); } } } diff --git a/QSB/Events/GameState.cs b/QSB/Events/GameState.cs index bc3ae9ce..a3c36ea2 100644 --- a/QSB/Events/GameState.cs +++ b/QSB/Events/GameState.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.TransformSync; using QSB.Utility; using UnityEngine.Networking; @@ -20,7 +21,7 @@ namespace QSB.Events private void OnClientReceiveMessage(FullStateMessage message) { - DebugLog.ToConsole($"Received game state id {PlayerRegistry.LocalPlayer.NetId}"); + DebugLog.ToConsole($"Received game state id for {PlayerTransformSync.LocalInstance.netId.Value}"); PlayerRegistry.HandleFullStateMessage(message); } diff --git a/QSB/Events/PlayerFlashlightEvent.cs b/QSB/Events/PlayerFlashlightEvent.cs index 93f67d17..5e23be38 100644 --- a/QSB/Events/PlayerFlashlightEvent.cs +++ b/QSB/Events/PlayerFlashlightEvent.cs @@ -2,22 +2,22 @@ namespace QSB.Events { - class PlayerFlashlightEvent : QSBEvent + class PlayerFlashlightEvent : QSBEvent { public override MessageType Type => MessageType.FlashlightActiveChange; public override void SetupListener() { - GlobalMessenger.AddListener("TurnOnFlashlight", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, true)); - GlobalMessenger.AddListener("TurnOffFlashlight", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, false)); + GlobalMessenger.AddListener("TurnOnFlashlight", () => SendEvent(new ToggleMessage { On = true })); + GlobalMessenger.AddListener("TurnOffFlashlight", () => SendEvent(new ToggleMessage { On = false })); } - public override void OnReceive(uint sender, object[] data) + public override void OnReceive(uint sender, ToggleMessage message) { var player = PlayerRegistry.GetPlayer(sender); var tool = player.FlashLight; - player.UpdateState(State.Flashlight, (bool)data[0]); - if ((bool)data[0] == true) + player.UpdateState(State.Flashlight, message.On); + if (message.On) { tool.TurnOn(); } @@ -27,10 +27,10 @@ namespace QSB.Events } } - public override void OnReceiveLocal(object[] data) + public override void OnReceiveLocal(ToggleMessage message) { var tool = PlayerRegistry.LocalPlayer.FlashLight; - if ((bool)data[0] == true) + if (message.On) { tool.TurnOn(); } diff --git a/QSB/Events/PlayerJoinEvent.cs b/QSB/Events/PlayerJoinEvent.cs index 917a5f2f..416a8e04 100644 --- a/QSB/Events/PlayerJoinEvent.cs +++ b/QSB/Events/PlayerJoinEvent.cs @@ -4,27 +4,27 @@ using QSB.Utility; namespace QSB.Events { - class PlayerJoinEvent : QSBEvent + class PlayerJoinEvent : QSBEvent { public override MessageType Type => MessageType.PlayerJoin; public override void SetupListener() { - GlobalMessenger.AddListener("QSBPlayerJoin", var => SendEvent(PlayerTransformSync.LocalInstance.netId.Value, var)); + GlobalMessenger.AddListener("QSBPlayerJoin", name => SendEvent(new PlayerJoinMessage { PlayerName = name })); } - public override void OnReceive(uint sender, object[] data) + public override void OnReceive(uint sender, PlayerJoinMessage message) { var player = PlayerRegistry.CreatePlayer(sender); - player.Name = (string)data[0]; + player.Name = message.PlayerName; player.IsReady = true; DebugLog.ToAll($"{player.Name} joined!"); } - public override void OnReceiveLocal(object[] data) + public override void OnReceiveLocal(PlayerJoinMessage message) { var player = PlayerRegistry.CreatePlayer(PlayerTransformSync.LocalInstance.netId.Value); - player.Name = (string)data[0]; + player.Name = message.PlayerName; player.IsReady = true; DebugLog.ToAll($"{player.Name} joined!"); } diff --git a/QSB/Events/PlayerJoinMessage.cs b/QSB/Events/PlayerJoinMessage.cs new file mode 100644 index 00000000..5c8d27c2 --- /dev/null +++ b/QSB/Events/PlayerJoinMessage.cs @@ -0,0 +1,21 @@ +using UnityEngine.Networking; + +namespace QSB.Events +{ + public class PlayerJoinMessage : PlayerMessage + { + public string PlayerName { get; set; } + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + PlayerName = reader.ReadString(); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerName); + } + } +} \ No newline at end of file diff --git a/QSB/Events/PlayerProbeLauncherEvent.cs b/QSB/Events/PlayerProbeLauncherEvent.cs index 7e0da710..95ff016e 100644 --- a/QSB/Events/PlayerProbeLauncherEvent.cs +++ b/QSB/Events/PlayerProbeLauncherEvent.cs @@ -2,22 +2,22 @@ namespace QSB.Events { - class PlayerProbeLauncherEvent : QSBEvent + class PlayerProbeLauncherEvent : QSBEvent { public override MessageType Type => MessageType.ProbeLauncherActiveChange; public override void SetupListener() { - GlobalMessenger.AddListener("ProbeLauncherEquipped", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, true)); - GlobalMessenger.AddListener("ProbeLauncherUnequipped", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, false)); + GlobalMessenger.AddListener("ProbeLauncherEquipped", var => SendEvent(new ToggleMessage { On = true })); + GlobalMessenger.AddListener("ProbeLauncherUnequipped", var => SendEvent(new ToggleMessage { On = false })); } - public override void OnReceive(uint sender, object[] data) + public override void OnReceive(uint sender, ToggleMessage message) { var player = PlayerRegistry.GetPlayer(sender); var tool = player.ProbeLauncher; - player.UpdateState(State.ProbeLauncher, (bool)data[0]); - if ((bool)data[0] == true) + player.UpdateState(State.ProbeLauncher, message.On); + if (message.On) { tool.EquipTool(); } @@ -27,10 +27,10 @@ namespace QSB.Events } } - public override void OnReceiveLocal(object[] data) + public override void OnReceiveLocal(ToggleMessage message) { var tool = PlayerRegistry.LocalPlayer.ProbeLauncher; - if ((bool)data[0] == true) + if (message.On) { tool.EquipTool(); } diff --git a/QSB/Events/PlayerSignalscopeEvent.cs b/QSB/Events/PlayerSignalscopeEvent.cs index 07a87a9e..d58c3bfb 100644 --- a/QSB/Events/PlayerSignalscopeEvent.cs +++ b/QSB/Events/PlayerSignalscopeEvent.cs @@ -2,22 +2,22 @@ namespace QSB.Events { - class PlayerSignalscopeEvent : QSBEvent + class PlayerSignalscopeEvent : QSBEvent { public override MessageType Type => MessageType.SignalscopeActiveChange; public override void SetupListener() { - GlobalMessenger.AddListener("EquipSignalscope", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, true)); - GlobalMessenger.AddListener("UnequipSignalscope", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, false)); + GlobalMessenger.AddListener("EquipSignalscope", var => SendEvent(new ToggleMessage { On = true })); + GlobalMessenger.AddListener("UnequipSignalscope", () => SendEvent(new ToggleMessage { On = false })); } - public override void OnReceive(uint sender, object[] data) + public override void OnReceive(uint sender, ToggleMessage message) { var player = PlayerRegistry.GetPlayer(sender); var tool = player.Signalscope; - player.UpdateState(State.Signalscope, (bool)data[0]); - if ((bool)data[0] == true) + player.UpdateState(State.Signalscope, message.On); + if (message.On) { tool.EquipTool(); } @@ -27,10 +27,10 @@ namespace QSB.Events } } - public override void OnReceiveLocal(object[] data) + public override void OnReceiveLocal(ToggleMessage message) { var tool = PlayerRegistry.LocalPlayer.Signalscope; - if ((bool)data[0] == true) + if (message.On) { tool.EquipTool(); } diff --git a/QSB/Events/PlayerTranslatorEvent.cs b/QSB/Events/PlayerTranslatorEvent.cs index ee35cd1c..e4d86431 100644 --- a/QSB/Events/PlayerTranslatorEvent.cs +++ b/QSB/Events/PlayerTranslatorEvent.cs @@ -2,22 +2,22 @@ namespace QSB.Events { - class PlayerTrasnlatorEvent : QSBEvent + class PlayerTranslatorEvent : QSBEvent { public override MessageType Type => MessageType.TranslatorActiveChange; public override void SetupListener() { - GlobalMessenger.AddListener("EquipTranslator", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, true)); - GlobalMessenger.AddListener("UnequipTranslator", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, false)); + GlobalMessenger.AddListener("EquipTranslator", () => SendEvent(new ToggleMessage { On = true })); + GlobalMessenger.AddListener("UnequipTranslator", () => SendEvent(new ToggleMessage { On = false })); } - public override void OnReceive(uint sender, object[] data) + public override void OnReceive(uint sender, ToggleMessage message) { var player = PlayerRegistry.GetPlayer(sender); var tool = player.Translator; - player.UpdateState(State.Translator, (bool)data[0]); - if ((bool)data[0] == true) + player.UpdateState(State.Translator, message.On); + if (message.On) { tool.EquipTool(); } @@ -27,10 +27,10 @@ namespace QSB.Events } } - public override void OnReceiveLocal(object[] data) + public override void OnReceiveLocal(ToggleMessage message) { var tool = PlayerRegistry.LocalPlayer.Translator; - if ((bool)data[0] == true) + if (message.On) { tool.EquipTool(); } diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index 121c9014..2b758f6d 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -4,56 +4,53 @@ using QSB.Utility; namespace QSB.Events { - public abstract class QSBEvent + public abstract class QSBEvent where T : PlayerMessage, new() + { public abstract MessageType Type { get; } public abstract void SetupListener(); - public abstract void OnReceive(uint sender, object[] data); - public virtual void OnReceiveLocal(object[] data) { } + public abstract void OnReceive(uint sender, T message); - public void SendEvent(uint sender, params object[] data) + public virtual void OnReceiveLocal(T message) { - var message = new EventMessage - { - SenderId = sender, - EventType = (int)Type, - Data = data - }; - Send(message); } - private readonly MessageHandler _eventHandler; + public void SendEvent(T message) + { + UnityHelper.Instance.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => Send(message)); + } + + private readonly MessageHandler _eventHandler; protected QSBEvent() { - _eventHandler = new MessageHandler(Type); + _eventHandler = new MessageHandler(Type); _eventHandler.OnClientReceiveMessage += OnClientReceiveMessage; _eventHandler.OnServerReceiveMessage += OnServerReceiveMessage; SetupListener(); } - public void Send(EventMessage message) + private void Send(T message) { - UnityHelper.Instance.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => - { - _eventHandler.SendToServer(message); - }); + message.SenderId = PlayerTransformSync.LocalInstance.netId.Value; + _eventHandler.SendToServer(message); } - private void OnServerReceiveMessage(EventMessage message) + private void OnServerReceiveMessage(T message) { _eventHandler.SendToAll(message); } - private void OnClientReceiveMessage(EventMessage message) + private void OnClientReceiveMessage(T message) { if (message.SenderId == PlayerRegistry.LocalPlayer?.NetId) { return; } - OnReceive(message.SenderId, message.Data); + + OnReceive(message.SenderId, message); } } } diff --git a/QSB/Events/ToggleMessage.cs b/QSB/Events/ToggleMessage.cs new file mode 100644 index 00000000..455bef67 --- /dev/null +++ b/QSB/Events/ToggleMessage.cs @@ -0,0 +1,21 @@ +using UnityEngine.Networking; + +namespace QSB.Events +{ + public class ToggleMessage : PlayerMessage + { + public bool On { get; set; } + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + On = reader.ReadBoolean(); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + writer.Write(On); + } + } +} \ No newline at end of file diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index bfb44559..142f6622 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -119,6 +119,8 @@ + + @@ -129,7 +131,6 @@ -