use FormatterServices.GetUninitializedObject

This commit is contained in:
JohnCorby 2021-12-26 18:57:07 -08:00
parent 7acd63e339
commit 3d4cada243

View File

@ -13,6 +13,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
namespace QSB.Messaging
{
@ -66,7 +67,7 @@ namespace QSB.Messaging
private static void OnServerReceiveRaw(QNetworkMessage netMsg)
{
var msgType = netMsg.MsgType;
var msg = (QSBMessageRaw)Activator.CreateInstance(_msgTypeToType[msgType]);
var msg = (QSBMessageRaw)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]);
netMsg.ReadMessage(msg);
QNetworkServer.SendToAll(msgType, msg);
@ -75,7 +76,7 @@ namespace QSB.Messaging
private static void OnClientReceiveRaw(QNetworkMessage netMsg)
{
var msgType = netMsg.MsgType;
var msg = (QSBMessageRaw)Activator.CreateInstance(_msgTypeToType[msgType]);
var msg = (QSBMessageRaw)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]);
netMsg.ReadMessage(msg);
msg.OnReceive();
@ -84,7 +85,7 @@ namespace QSB.Messaging
private static void OnServerReceive(QNetworkMessage netMsg)
{
var msgType = netMsg.MsgType;
var msg = (QSBMessage)Activator.CreateInstance(_msgTypeToType[msgType]);
var msg = (QSBMessage)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]);
netMsg.ReadMessage(msg);
if (msg.To == uint.MaxValue)
@ -110,7 +111,7 @@ namespace QSB.Messaging
private static void OnClientReceive(QNetworkMessage netMsg)
{
var msgType = netMsg.MsgType;
var msg = (QSBMessage)Activator.CreateInstance(_msgTypeToType[msgType]);
var msg = (QSBMessage)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]);
netMsg.ReadMessage(msg);
if (PlayerTransformSync.LocalInstance == null)
@ -124,9 +125,9 @@ namespace QSB.Messaging
var player = QSBPlayerManager.GetPlayer(msg.From);
if (!player.IsReady
&& player.PlayerId != QSBPlayerManager.LocalPlayerId
&& player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem
&& msg is not (PlayerInformationMessage or PlayerReadyMessage or RequestStateResyncMessage or ServerStateMessage))
&& player.PlayerId != QSBPlayerManager.LocalPlayerId
&& player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem
&& msg is not (PlayerInformationMessage or PlayerReadyMessage or RequestStateResyncMessage or ServerStateMessage))
{
DebugLog.ToConsole($"Warning - Got message {msg} from player {msg.From}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning);
new RequestStateResyncMessage().Send();
@ -159,21 +160,21 @@ namespace QSB.Messaging
public static void SendRaw<M>(this M msg)
where M : QSBMessageRaw, new()
where M : QSBMessageRaw
{
var msgType = _typeToMsgType[typeof(M)];
QNetworkManager.singleton.client.Send(msgType, msg);
}
public static void ServerSendRaw<M>(this M msg, QNetworkConnection conn)
where M : QSBMessageRaw, new()
where M : QSBMessageRaw
{
var msgType = _typeToMsgType[typeof(M)];
conn.Send(msgType, msg);
}
public static void Send<M>(this M msg)
where M : QSBMessage, new()
where M : QSBMessage
{
if (PlayerTransformSync.LocalInstance == null)
{
@ -188,7 +189,7 @@ namespace QSB.Messaging
public static void SendMessage<T, M>(this T worldObject, M msg)
where T : IWorldObject
where M : QSBWorldObjectMessage<T>, new()
where M : QSBWorldObjectMessage<T>
{
msg.ObjectId = worldObject.ObjectId;
Send(msg);