2020-12-19 12:51:15 +00:00
|
|
|
|
using OWML.Common;
|
|
|
|
|
using QSB.Messaging;
|
2020-11-03 21:33:48 +00:00
|
|
|
|
using QSB.Player;
|
2021-04-11 16:05:02 +00:00
|
|
|
|
using QSB.Player.TransformSync;
|
2020-12-19 12:51:15 +00:00
|
|
|
|
using QSB.Utility;
|
2020-12-04 22:15:41 +00:00
|
|
|
|
using QuantumUNET;
|
2020-12-19 12:51:15 +00:00
|
|
|
|
using QuantumUNET.Components;
|
2020-08-07 23:08:44 +00:00
|
|
|
|
|
2020-12-14 16:24:52 +00:00
|
|
|
|
namespace QSB.Events
|
2020-08-07 23:08:44 +00:00
|
|
|
|
{
|
2020-12-02 21:29:53 +00:00
|
|
|
|
public abstract class QSBEvent<T> : IQSBEvent where T : PlayerMessage, new()
|
|
|
|
|
{
|
|
|
|
|
public abstract EventType Type { get; }
|
2020-12-14 21:20:53 +00:00
|
|
|
|
public uint LocalPlayerId => QSBPlayerManager.LocalPlayerId;
|
2020-12-14 20:41:56 +00:00
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
private readonly MessageHandler<T> _eventHandler;
|
2020-08-10 13:48:40 +00:00
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
protected QSBEvent()
|
|
|
|
|
{
|
2021-02-12 13:29:01 +00:00
|
|
|
|
if (UnitTestDetector.IsInUnitTest)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-06-18 21:38:32 +00:00
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
_eventHandler = new MessageHandler<T>(Type);
|
2020-12-14 20:41:56 +00:00
|
|
|
|
_eventHandler.OnClientReceiveMessage += message => OnReceive(false, message);
|
|
|
|
|
_eventHandler.OnServerReceiveMessage += message => OnReceive(true, message);
|
2020-12-02 21:29:53 +00:00
|
|
|
|
}
|
2020-08-10 13:40:06 +00:00
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
public abstract void SetupListener();
|
|
|
|
|
public abstract void CloseListener();
|
2020-08-15 19:32:58 +00:00
|
|
|
|
|
2020-12-11 22:42:21 +00:00
|
|
|
|
public virtual void OnReceiveRemote(bool server, T message) { }
|
|
|
|
|
public virtual void OnReceiveLocal(bool server, T message) { }
|
2020-08-09 07:37:32 +00:00
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
public void SendEvent(T message)
|
|
|
|
|
{
|
|
|
|
|
message.FromId = QSBPlayerManager.LocalPlayerId;
|
2021-03-13 10:17:52 +00:00
|
|
|
|
QSBCore.UnityEvents.RunWhen(
|
2020-12-19 10:56:25 +00:00
|
|
|
|
() => PlayerTransformSync.LocalInstance != null,
|
|
|
|
|
() => _eventHandler.SendToServer(message));
|
2020-12-02 21:29:53 +00:00
|
|
|
|
}
|
2020-08-15 19:32:58 +00:00
|
|
|
|
|
2021-01-30 10:09:27 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Checks whether the message should be processed by the executing client/server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>True if the message should be processed.</returns>
|
|
|
|
|
public virtual bool CheckMessage(bool isServer, T message) => true;
|
|
|
|
|
|
2020-12-19 10:56:25 +00:00
|
|
|
|
private void OnReceive(bool isServer, T message)
|
2020-12-02 21:29:53 +00:00
|
|
|
|
{
|
2020-12-19 10:56:25 +00:00
|
|
|
|
/* Explanation :
|
|
|
|
|
* if <isServer> is true, this message has been received on the server *server*.
|
|
|
|
|
* Therefore, we don't want to do any event handling code - that should be dealt
|
|
|
|
|
* with on the server *client* and any other client. So just forward the message
|
|
|
|
|
* onto all clients. This way, the server *server* just acts as the ditribution
|
|
|
|
|
* hub for all events.
|
|
|
|
|
*/
|
2021-01-30 10:09:27 +00:00
|
|
|
|
|
|
|
|
|
if (!CheckMessage(isServer, message))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-19 10:56:25 +00:00
|
|
|
|
if (isServer)
|
2020-12-02 21:29:53 +00:00
|
|
|
|
{
|
|
|
|
|
_eventHandler.SendToAll(message);
|
2020-12-19 10:56:25 +00:00
|
|
|
|
return;
|
2020-12-02 21:29:53 +00:00
|
|
|
|
}
|
2020-08-09 07:17:00 +00:00
|
|
|
|
|
2020-12-23 12:58:45 +00:00
|
|
|
|
if (message.OnlySendToServer && !QNetworkServer.active)
|
2020-12-13 22:25:23 +00:00
|
|
|
|
{
|
2020-12-19 10:56:25 +00:00
|
|
|
|
return;
|
2020-12-13 22:25:23 +00:00
|
|
|
|
}
|
2020-12-19 10:56:25 +00:00
|
|
|
|
|
2020-12-23 12:58:45 +00:00
|
|
|
|
if (PlayerTransformSync.LocalInstance == null || PlayerTransformSync.LocalInstance.GetComponent<QNetworkIdentity>() == null)
|
2020-12-19 12:51:15 +00:00
|
|
|
|
{
|
|
|
|
|
DebugLog.ToConsole($"Warning - Tried to handle message of type <{message.GetType().Name}> before localplayer was established.", MessageType.Warning);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-02 21:29:53 +00:00
|
|
|
|
if (message.FromId == QSBPlayerManager.LocalPlayerId ||
|
2021-03-09 16:43:41 +00:00
|
|
|
|
QSBPlayerManager.IsBelongingToLocalPlayer(message.FromId))
|
2020-12-02 21:29:53 +00:00
|
|
|
|
{
|
2020-12-23 12:58:45 +00:00
|
|
|
|
OnReceiveLocal(QNetworkServer.active, message);
|
2020-12-02 21:29:53 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2020-08-09 07:37:32 +00:00
|
|
|
|
|
2020-12-23 12:58:45 +00:00
|
|
|
|
OnReceiveRemote(QNetworkServer.active, message);
|
2020-12-02 21:29:53 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-03 08:28:05 +00:00
|
|
|
|
}
|