actually generic events

This commit is contained in:
Aleksander Waage 2020-08-09 09:37:32 +02:00
parent b60d79cb39
commit 005ce09ac1
12 changed files with 111 additions and 135 deletions

View File

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

View File

@ -1,21 +1,17 @@
using System.Collections.Generic;
namespace QSB.Events
namespace QSB.Events
{
public static class EventSender
{
public static List<QSBEvent> EventList = new List<QSBEvent>();
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();
}
}
}

View File

@ -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);
}

View File

@ -2,22 +2,22 @@
namespace QSB.Events
{
class PlayerFlashlightEvent : QSBEvent
class PlayerFlashlightEvent : QSBEvent<ToggleMessage>
{
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();
}

View File

@ -4,27 +4,27 @@ using QSB.Utility;
namespace QSB.Events
{
class PlayerJoinEvent : QSBEvent
class PlayerJoinEvent : QSBEvent<PlayerJoinMessage>
{
public override MessageType Type => MessageType.PlayerJoin;
public override void SetupListener()
{
GlobalMessenger<string>.AddListener("QSBPlayerJoin", var => SendEvent(PlayerTransformSync.LocalInstance.netId.Value, var));
GlobalMessenger<string>.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!");
}

View File

@ -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);
}
}
}

View File

@ -2,22 +2,22 @@
namespace QSB.Events
{
class PlayerProbeLauncherEvent : QSBEvent
class PlayerProbeLauncherEvent : QSBEvent<ToggleMessage>
{
public override MessageType Type => MessageType.ProbeLauncherActiveChange;
public override void SetupListener()
{
GlobalMessenger<ProbeLauncher>.AddListener("ProbeLauncherEquipped", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, true));
GlobalMessenger<ProbeLauncher>.AddListener("ProbeLauncherUnequipped", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, false));
GlobalMessenger<ProbeLauncher>.AddListener("ProbeLauncherEquipped", var => SendEvent(new ToggleMessage { On = true }));
GlobalMessenger<ProbeLauncher>.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();
}

View File

@ -2,22 +2,22 @@
namespace QSB.Events
{
class PlayerSignalscopeEvent : QSBEvent
class PlayerSignalscopeEvent : QSBEvent<ToggleMessage>
{
public override MessageType Type => MessageType.SignalscopeActiveChange;
public override void SetupListener()
{
GlobalMessenger<Signalscope>.AddListener("EquipSignalscope", var => SendEvent(PlayerRegistry.LocalPlayer.NetId, true));
GlobalMessenger.AddListener("UnequipSignalscope", () => SendEvent(PlayerRegistry.LocalPlayer.NetId, false));
GlobalMessenger<Signalscope>.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();
}

View File

@ -2,22 +2,22 @@
namespace QSB.Events
{
class PlayerTrasnlatorEvent : QSBEvent
class PlayerTranslatorEvent : QSBEvent<ToggleMessage>
{
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();
}

View File

@ -4,56 +4,53 @@ using QSB.Utility;
namespace QSB.Events
{
public abstract class QSBEvent
public abstract class QSBEvent<T> 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<EventMessage> _eventHandler;
public void SendEvent(T message)
{
UnityHelper.Instance.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => Send(message));
}
private readonly MessageHandler<T> _eventHandler;
protected QSBEvent()
{
_eventHandler = new MessageHandler<EventMessage>(Type);
_eventHandler = new MessageHandler<T>(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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -119,6 +119,8 @@
<Compile Include="Events\PlayerSignalscopeEvent.cs" />
<Compile Include="Events\PlayerTranslatorEvent.cs" />
<Compile Include="Events\QSBEvent.cs" />
<Compile Include="Events\PlayerJoinMessage.cs" />
<Compile Include="Events\ToggleMessage.cs" />
<Compile Include="Tools\QSBFlashlight.cs" />
<Compile Include="Tools\QSBProbe.cs" />
<Compile Include="Tools\QSBTool.cs" />
@ -129,7 +131,6 @@
<Compile Include="Events\FullStateMessage.cs" />
<Compile Include="Events\FullStateRequest.cs" />
<Compile Include="Events\GameState.cs" />
<Compile Include="Events\EventMessage.cs" />
<Compile Include="Events\Necronomicon.cs" />
<Compile Include="Events\LeaveMessage.cs" />
<Compile Include="Events\PlayerLeave.cs" />