From b5ba81d7277f010dad1bdb8f1d6ce3960b2b700a Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 4 Dec 2020 09:23:27 +0000 Subject: [PATCH] add more stuff --- QSB/Animation/Events/QSBAnimationMessage.cs | 9 +- .../Events/QSBAnimationParametersMessage.cs | 9 +- .../Events/QSBAnimationTriggerMessage.cs | 9 +- QSB/Animation/QSBNetworkAnimator.cs | 24 +- .../Events/ConversationMessage.cs | 5 +- .../Events/ConversationStartEndMessage.cs | 5 +- QSB/MessagesCore/EnumMessage.cs | 5 +- QSB/MessagesCore/FloatMessage.cs | 5 +- QSB/MessagesCore/MessageHandler.cs | 3 +- QSB/MessagesCore/PlayerMessage.cs | 9 +- QSB/MessagesCore/ToggleMessage.cs | 7 +- QSB/Player/Events/PlayerJoinMessage.cs | 5 +- QSB/Player/Events/PlayerLeaveMessage.cs | 5 +- QSB/Player/Events/PlayerStateMessage.cs | 5 +- QSB/QSB.csproj | 17 + QSB/QSBNetworkManager.cs | 29 + QSB/QuantumUNET/QSBAddPlayerMessage.cs | 37 + QSB/QuantumUNET/QSBCRCMessage.cs | 6 +- QSB/QuantumUNET/QSBChannelBuffer.cs | 10 +- QSB/QuantumUNET/QSBClientAuthorityMessage.cs | 6 +- QSB/QuantumUNET/QSBClientScene.cs | 28 +- QSB/QuantumUNET/QSBEmptyMessage.cs | 19 + QSB/QuantumUNET/QSBErrorMessage.cs | 23 + QSB/QuantumUNET/QSBFloatConversion.cs | 32 + QSB/QuantumUNET/QSBLocalClient.cs | 8 +- QSB/QuantumUNET/QSBMessageBase.cs | 19 + QSB/QuantumUNET/QSBNetworkBehaviour.cs | 135 +-- QSB/QuantumUNET/QSBNetworkClient.cs | 18 +- QSB/QuantumUNET/QSBNetworkConnection.cs | 79 +- QSB/QuantumUNET/QSBNetworkIdentity.cs | 90 +- QSB/QuantumUNET/QSBNetworkManagerUNET.cs | 22 +- QSB/QuantumUNET/QSBNetworkMessage.cs | 6 +- QSB/QuantumUNET/QSBNetworkMigrationManager.cs | 50 +- QSB/QuantumUNET/QSBNetworkReader.cs | 568 +++++++++++ QSB/QuantumUNET/QSBNetworkServer.cs | 74 +- QSB/QuantumUNET/QSBNetworkServerSimple.cs | 8 +- QSB/QuantumUNET/QSBNetworkTransform.cs | 897 +++--------------- QSB/QuantumUNET/QSBNetworkWriter.cs | 541 +++++++++++ QSB/QuantumUNET/QSBNotReadyMessage.cs | 11 + QSB/QuantumUNET/QSBObjectDestroyMessage.cs | 6 +- .../QSBObjectSpawnFinishedMessage.cs | 6 +- QSB/QuantumUNET/QSBObjectSpawnMessage.cs | 6 +- QSB/QuantumUNET/QSBObjectSpawnSceneMessage.cs | 6 +- QSB/QuantumUNET/QSBOwnerMessage.cs | 6 +- QSB/QuantumUNET/QSBPeerAuthorityMessage.cs | 31 + QSB/QuantumUNET/QSBPeerInfoMessage.cs | 84 ++ QSB/QuantumUNET/QSBPeerInfoPlayer.cs | 15 + QSB/QuantumUNET/QSBPeerListMessage.cs | 38 + QSB/QuantumUNET/QSBReadyMessage.cs | 11 + QSB/QuantumUNET/QSBReconnectMessage.cs | 38 + QSB/QuantumUNET/QSBRemovePlayerMessage.cs | 6 +- QSB/QuantumUNET/QSBStringMessage.cs | 32 + QSB/QuantumUNET/QSBUIntDecimal.cs | 16 + QSB/QuantumUNET/QSBUIntFloat.cs | 18 + .../QSBULocalConnectionToClient.cs | 8 +- .../QSBULocalConnectionToServer.cs | 8 +- QSB/TimeSync/Events/ServerTimeMessage.cs | 5 +- .../Events/BoolWorldObjectMessage.cs | 7 +- QSB/WorldSync/Events/WorldObjectMessage.cs | 5 +- 59 files changed, 2032 insertions(+), 1158 deletions(-) create mode 100644 QSB/QuantumUNET/QSBAddPlayerMessage.cs create mode 100644 QSB/QuantumUNET/QSBEmptyMessage.cs create mode 100644 QSB/QuantumUNET/QSBErrorMessage.cs create mode 100644 QSB/QuantumUNET/QSBFloatConversion.cs create mode 100644 QSB/QuantumUNET/QSBMessageBase.cs create mode 100644 QSB/QuantumUNET/QSBNetworkReader.cs create mode 100644 QSB/QuantumUNET/QSBNetworkWriter.cs create mode 100644 QSB/QuantumUNET/QSBNotReadyMessage.cs create mode 100644 QSB/QuantumUNET/QSBPeerAuthorityMessage.cs create mode 100644 QSB/QuantumUNET/QSBPeerInfoMessage.cs create mode 100644 QSB/QuantumUNET/QSBPeerInfoPlayer.cs create mode 100644 QSB/QuantumUNET/QSBPeerListMessage.cs create mode 100644 QSB/QuantumUNET/QSBReadyMessage.cs create mode 100644 QSB/QuantumUNET/QSBReconnectMessage.cs create mode 100644 QSB/QuantumUNET/QSBStringMessage.cs create mode 100644 QSB/QuantumUNET/QSBUIntDecimal.cs create mode 100644 QSB/QuantumUNET/QSBUIntFloat.cs diff --git a/QSB/Animation/Events/QSBAnimationMessage.cs b/QSB/Animation/Events/QSBAnimationMessage.cs index c4de8231..1f292673 100644 --- a/QSB/Animation/Events/QSBAnimationMessage.cs +++ b/QSB/Animation/Events/QSBAnimationMessage.cs @@ -1,15 +1,16 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.Animation.Events { - internal class QSBAnimationMessage : MessageBase + internal class QSBAnimationMessage : QSBMessageBase { public NetworkInstanceId netId; public int stateHash; public float normalizedTime; public byte[] parameters; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { netId = reader.ReadNetworkId(); stateHash = (int)reader.ReadPackedUInt32(); @@ -17,7 +18,7 @@ namespace QSB.Animation.Events parameters = reader.ReadBytesAndSize(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(netId); writer.WritePackedUInt32((uint)stateHash); diff --git a/QSB/Animation/Events/QSBAnimationParametersMessage.cs b/QSB/Animation/Events/QSBAnimationParametersMessage.cs index 93a5694a..08adf4ce 100644 --- a/QSB/Animation/Events/QSBAnimationParametersMessage.cs +++ b/QSB/Animation/Events/QSBAnimationParametersMessage.cs @@ -1,19 +1,20 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.Animation.Events { - internal class QSBAnimationParametersMessage : MessageBase + internal class QSBAnimationParametersMessage : QSBMessageBase { public NetworkInstanceId netId; public byte[] parameters; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { netId = reader.ReadNetworkId(); parameters = reader.ReadBytesAndSize(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(netId); if (parameters == null) diff --git a/QSB/Animation/Events/QSBAnimationTriggerMessage.cs b/QSB/Animation/Events/QSBAnimationTriggerMessage.cs index ea2ad058..8890207c 100644 --- a/QSB/Animation/Events/QSBAnimationTriggerMessage.cs +++ b/QSB/Animation/Events/QSBAnimationTriggerMessage.cs @@ -1,19 +1,20 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.Animation.Events { - internal class QSBAnimationTriggerMessage : MessageBase + internal class QSBAnimationTriggerMessage : QSBMessageBase { public NetworkInstanceId netId; public int hash; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { netId = reader.ReadNetworkId(); hash = (int)reader.ReadPackedUInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(netId); writer.WritePackedUInt32((uint)hash); diff --git a/QSB/Animation/QSBNetworkAnimator.cs b/QSB/Animation/QSBNetworkAnimator.cs index b09cb0c3..a6806160 100644 --- a/QSB/Animation/QSBNetworkAnimator.cs +++ b/QSB/Animation/QSBNetworkAnimator.cs @@ -17,7 +17,7 @@ namespace QSB.Animation private uint m_ParameterSendBits; private int m_AnimationHash; private int m_TransitionHash; - private NetworkWriter m_ParameterWriter; + private QSBNetworkWriter m_ParameterWriter; private float m_SendTimer; public Animator animator @@ -48,7 +48,7 @@ namespace QSB.Animation public override void OnStartAuthority() { - m_ParameterWriter = new NetworkWriter(); + m_ParameterWriter = new QSBNetworkWriter(); } private void FixedUpdate() @@ -143,7 +143,7 @@ namespace QSB.Animation } } - internal void HandleAnimMsg(QSBAnimationMessage msg, NetworkReader reader) + internal void HandleAnimMsg(QSBAnimationMessage msg, QSBNetworkReader reader) { if (HasAuthority) { @@ -156,7 +156,7 @@ namespace QSB.Animation ReadParameters(reader, false); } - internal void HandleAnimParamsMsg(QSBAnimationParametersMessage msg, NetworkReader reader) + internal void HandleAnimParamsMsg(QSBAnimationParametersMessage msg, QSBNetworkReader reader) { if (HasAuthority) { @@ -170,7 +170,7 @@ namespace QSB.Animation m_Animator.SetTrigger(hash); } - private void WriteParameters(NetworkWriter writer, bool autoSend) + private void WriteParameters(QSBNetworkWriter writer, bool autoSend) { for (int index = 0; index < m_Animator.parameters.Length; ++index) { @@ -195,7 +195,7 @@ namespace QSB.Animation } } - private void ReadParameters(NetworkReader reader, bool autoSend) + private void ReadParameters(QSBNetworkReader reader, bool autoSend) { for (int index = 0; index < m_Animator.parameters.Length; ++index) { @@ -227,7 +227,7 @@ namespace QSB.Animation } } - public override bool OnSerialize(NetworkWriter writer, bool forceAll) + public override bool OnSerialize(QSBNetworkWriter writer, bool forceAll) { if (!forceAll) { @@ -249,7 +249,7 @@ namespace QSB.Animation return true; } - public override void OnDeserialize(NetworkReader reader, bool initialState) + public override void OnDeserialize(QSBNetworkReader reader, bool initialState) { if (!initialState) { @@ -305,7 +305,7 @@ namespace QSB.Animation return; } var component = localObject.GetComponent(); - var reader = new NetworkReader(AnimationMessage.parameters); + var reader = new QSBNetworkReader(AnimationMessage.parameters); component?.HandleAnimMsg(AnimationMessage, reader); QSBNetworkServer.SendToReady(localObject, 40, AnimationMessage); } @@ -319,7 +319,7 @@ namespace QSB.Animation return; } var component = localObject.GetComponent(); - var reader = new NetworkReader(ParametersMessage.parameters); + var reader = new QSBNetworkReader(ParametersMessage.parameters); component?.HandleAnimParamsMsg(ParametersMessage, reader); QSBNetworkServer.SendToReady(localObject, 41, ParametersMessage); } @@ -346,7 +346,7 @@ namespace QSB.Animation var component = localObject.GetComponent(); if (component == null) return; - var reader = new NetworkReader(AnimationMessage.parameters); + var reader = new QSBNetworkReader(AnimationMessage.parameters); component.HandleAnimMsg(AnimationMessage, reader); } @@ -359,7 +359,7 @@ namespace QSB.Animation var component = localObject.GetComponent(); if (component == null) return; - var reader = new NetworkReader(ParametersMessage.parameters); + var reader = new QSBNetworkReader(ParametersMessage.parameters); component.HandleAnimParamsMsg(ParametersMessage, reader); } diff --git a/QSB/ConversationSync/Events/ConversationMessage.cs b/QSB/ConversationSync/Events/ConversationMessage.cs index e1dbcd7b..87716606 100644 --- a/QSB/ConversationSync/Events/ConversationMessage.cs +++ b/QSB/ConversationSync/Events/ConversationMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.ConversationSync.Events @@ -9,7 +10,7 @@ namespace QSB.ConversationSync.Events public int ObjectId { get; set; } public string Message { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); ObjectId = reader.ReadInt32(); @@ -17,7 +18,7 @@ namespace QSB.ConversationSync.Events Message = reader.ReadString(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(ObjectId); diff --git a/QSB/ConversationSync/Events/ConversationStartEndMessage.cs b/QSB/ConversationSync/Events/ConversationStartEndMessage.cs index fe80e9a0..b0b1d823 100644 --- a/QSB/ConversationSync/Events/ConversationStartEndMessage.cs +++ b/QSB/ConversationSync/Events/ConversationStartEndMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.ConversationSync.Events @@ -9,7 +10,7 @@ namespace QSB.ConversationSync.Events public uint PlayerId { get; set; } public bool State { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); CharacterId = reader.ReadInt32(); @@ -17,7 +18,7 @@ namespace QSB.ConversationSync.Events State = reader.ReadBoolean(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(CharacterId); diff --git a/QSB/MessagesCore/EnumMessage.cs b/QSB/MessagesCore/EnumMessage.cs index d110adb5..bcc7d9b3 100644 --- a/QSB/MessagesCore/EnumMessage.cs +++ b/QSB/MessagesCore/EnumMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.MessagesCore @@ -7,13 +8,13 @@ namespace QSB.MessagesCore { public T Value; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); Value = (T)(object)reader.ReadInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write((int)(object)Value); diff --git a/QSB/MessagesCore/FloatMessage.cs b/QSB/MessagesCore/FloatMessage.cs index 9cc74f21..70b35334 100644 --- a/QSB/MessagesCore/FloatMessage.cs +++ b/QSB/MessagesCore/FloatMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.MessagesCore @@ -7,13 +8,13 @@ namespace QSB.MessagesCore { public float Value; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); Value = reader.ReadSingle(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(Value); diff --git a/QSB/MessagesCore/MessageHandler.cs b/QSB/MessagesCore/MessageHandler.cs index 24a2e864..c8726ccc 100644 --- a/QSB/MessagesCore/MessageHandler.cs +++ b/QSB/MessagesCore/MessageHandler.cs @@ -9,7 +9,7 @@ using UnityEngine.Networking; namespace QSB.Messaging { // Extend this to create new message handlers. - public class MessageHandler where T : MessageBase, new() + public class MessageHandler where T : QSBMessageBase, new() { public event Action OnClientReceiveMessage; @@ -63,6 +63,7 @@ namespace QSB.Messaging private void OnClientReceiveMessageHandler(QSBNetworkMessage netMsg) { var message = netMsg.ReadMessage(); + DebugLog.DebugWrite($"receive message {message.GetType()}"); OnClientReceiveMessage?.Invoke(message); } diff --git a/QSB/MessagesCore/PlayerMessage.cs b/QSB/MessagesCore/PlayerMessage.cs index f39073fb..858ddc33 100644 --- a/QSB/MessagesCore/PlayerMessage.cs +++ b/QSB/MessagesCore/PlayerMessage.cs @@ -1,19 +1,20 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.Messaging { - public class PlayerMessage : MessageBase + public class PlayerMessage : QSBMessageBase { public uint FromId { get; set; } public uint AboutId { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { FromId = reader.ReadUInt32(); AboutId = reader.ReadUInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(FromId); writer.Write(AboutId); diff --git a/QSB/MessagesCore/ToggleMessage.cs b/QSB/MessagesCore/ToggleMessage.cs index 8e2f0292..895df45a 100644 --- a/QSB/MessagesCore/ToggleMessage.cs +++ b/QSB/MessagesCore/ToggleMessage.cs @@ -1,4 +1,5 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.Messaging { @@ -6,13 +7,13 @@ namespace QSB.Messaging { public bool ToggleValue { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); ToggleValue = reader.ReadBoolean(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(ToggleValue); diff --git a/QSB/Player/Events/PlayerJoinMessage.cs b/QSB/Player/Events/PlayerJoinMessage.cs index d313e050..82257f9e 100644 --- a/QSB/Player/Events/PlayerJoinMessage.cs +++ b/QSB/Player/Events/PlayerJoinMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.Player.Events @@ -7,13 +8,13 @@ namespace QSB.Player.Events { public string PlayerName { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); PlayerName = reader.ReadString(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(PlayerName); diff --git a/QSB/Player/Events/PlayerLeaveMessage.cs b/QSB/Player/Events/PlayerLeaveMessage.cs index d4c559ab..89e571a4 100644 --- a/QSB/Player/Events/PlayerLeaveMessage.cs +++ b/QSB/Player/Events/PlayerLeaveMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using System; using System.Linq; using UnityEngine.Networking; @@ -9,13 +10,13 @@ namespace QSB.Player.Events { public uint[] NetIds { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); NetIds = reader.ReadString().Split(',').Select(x => Convert.ToUInt32(x)).ToArray(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(string.Join(",", NetIds.Select(x => x.ToString()).ToArray())); diff --git a/QSB/Player/Events/PlayerStateMessage.cs b/QSB/Player/Events/PlayerStateMessage.cs index d966f3f6..7f784da0 100644 --- a/QSB/Player/Events/PlayerStateMessage.cs +++ b/QSB/Player/Events/PlayerStateMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.Player.Events @@ -11,7 +12,7 @@ namespace QSB.Player.Events public Sector.Name SectorID { get; set; } public string SectorName { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); PlayerName = reader.ReadString(); @@ -21,7 +22,7 @@ namespace QSB.Player.Events SectorName = reader.ReadString(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(PlayerName); diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index f4bc7be4..8031489f 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -132,9 +132,14 @@ + + + + + @@ -185,18 +190,30 @@ + + + + + + + + + + + + diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 19dbee33..511e2a8c 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -52,6 +52,12 @@ namespace QSB ident.LocalPlayerAuthority = true; ident.SetValue("m_AssetId", playerPrefab.GetComponent().assetId); ident.SetValue("m_SceneId", playerPrefab.GetComponent().sceneId); + Destroy(playerPrefab.GetComponent()); + Destroy(playerPrefab.GetComponent()); + DebugLog.DebugWrite(ident.LocalPlayerAuthority.ToString()); + var transform = playerPrefab.AddComponent(); + transform.SendInterval = 0.1f; + transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ; playerPrefab.AddComponent(); playerPrefab.AddComponent(); playerPrefab.AddComponent(); @@ -62,6 +68,12 @@ namespace QSB ident.LocalPlayerAuthority = true; ident.SetValue("m_AssetId", _shipPrefab.GetComponent().assetId); ident.SetValue("m_SceneId", _shipPrefab.GetComponent().sceneId); + Destroy(_shipPrefab.GetComponent()); + Destroy(_shipPrefab.GetComponent()); + DebugLog.DebugWrite(ident.LocalPlayerAuthority.ToString()); + transform = _shipPrefab.AddComponent(); + transform.SendInterval = 0.1f; + transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ; _shipPrefab.AddComponent(); spawnPrefabs.Add(_shipPrefab); @@ -70,6 +82,12 @@ namespace QSB ident.LocalPlayerAuthority = true; ident.SetValue("m_AssetId", _cameraPrefab.GetComponent().assetId); ident.SetValue("m_SceneId", _cameraPrefab.GetComponent().sceneId); + Destroy(_cameraPrefab.GetComponent()); + Destroy(_cameraPrefab.GetComponent()); + DebugLog.DebugWrite(ident.LocalPlayerAuthority.ToString()); + transform = _cameraPrefab.AddComponent(); + transform.SendInterval = 0.1f; + transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ; _cameraPrefab.AddComponent(); spawnPrefabs.Add(_cameraPrefab); @@ -78,6 +96,12 @@ namespace QSB ident.LocalPlayerAuthority = true; ident.SetValue("m_AssetId", _probePrefab.GetComponent().assetId); ident.SetValue("m_SceneId", _probePrefab.GetComponent().sceneId); + Destroy(_probePrefab.GetComponent()); + Destroy(_probePrefab.GetComponent()); + DebugLog.DebugWrite(ident.LocalPlayerAuthority.ToString()); + transform = _probePrefab.AddComponent(); + transform.SendInterval = 0.1f; + transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ; _probePrefab.AddComponent(); spawnPrefabs.Add(_probePrefab); @@ -86,6 +110,11 @@ namespace QSB ident.LocalPlayerAuthority = true; ident.SetValue("m_AssetId", OrbPrefab.GetComponent().assetId); ident.SetValue("m_SceneId", OrbPrefab.GetComponent().sceneId); + Destroy(OrbPrefab.GetComponent()); + Destroy(OrbPrefab.GetComponent()); + transform = OrbPrefab.AddComponent(); + transform.SendInterval = 0.1f; + transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ; OrbPrefab.AddComponent(); spawnPrefabs.Add(OrbPrefab); diff --git a/QSB/QuantumUNET/QSBAddPlayerMessage.cs b/QSB/QuantumUNET/QSBAddPlayerMessage.cs new file mode 100644 index 00000000..a6b919b3 --- /dev/null +++ b/QSB/QuantumUNET/QSBAddPlayerMessage.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + class QSBAddPlayerMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.playerControllerId = (short)reader.ReadUInt16(); + this.msgData = reader.ReadBytesAndSize(); + if (this.msgData == null) + { + this.msgSize = 0; + } + else + { + this.msgSize = this.msgData.Length; + } + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.Write((ushort)this.playerControllerId); + writer.WriteBytesAndSize(this.msgData, this.msgSize); + } + + public short playerControllerId; + + public int msgSize; + + public byte[] msgData; + } +} diff --git a/QSB/QuantumUNET/QSBCRCMessage.cs b/QSB/QuantumUNET/QSBCRCMessage.cs index faa8913f..02277a16 100644 --- a/QSB/QuantumUNET/QSBCRCMessage.cs +++ b/QSB/QuantumUNET/QSBCRCMessage.cs @@ -2,11 +2,11 @@ namespace QSB.QuantumUNET { - internal class QSBCRCMessage : MessageBase + internal class QSBCRCMessage : QSBMessageBase { public QSBCRCMessageEntry[] scripts; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { var num = (int)reader.ReadUInt16(); scripts = new QSBCRCMessageEntry[num]; @@ -19,7 +19,7 @@ namespace QSB.QuantumUNET } } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write((ushort)scripts.Length); for (var i = 0; i < scripts.Length; i++) diff --git a/QSB/QuantumUNET/QSBChannelBuffer.cs b/QSB/QuantumUNET/QSBChannelBuffer.cs index f8523180..75221474 100644 --- a/QSB/QuantumUNET/QSBChannelBuffer.cs +++ b/QSB/QuantumUNET/QSBChannelBuffer.cs @@ -32,8 +32,8 @@ namespace QSB.QuantumUNET private static List _freePackets; internal static int _pendingPacketCount; private float _lastBufferedMessageCountTimer = Time.realtimeSinceStartup; - private static NetworkWriter _sendWriter = new NetworkWriter(); - private static NetworkWriter _fragmentWriter = new NetworkWriter(); + private static QSBNetworkWriter _sendWriter = new QSBNetworkWriter(); + private static QSBNetworkWriter _fragmentWriter = new QSBNetworkWriter(); private const int _packetHeaderReserveSize = 100; private bool _disposed; internal QSBNetBuffer _fragmentBuffer = new QSBNetBuffer(); @@ -174,13 +174,13 @@ namespace QSB.QuantumUNET } } - public bool SendWriter(NetworkWriter writer) + public bool SendWriter(QSBNetworkWriter writer) { var arraySegment = (ArraySegment)writer.GetType().GetMethod("AsArraySegment", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic).Invoke(writer, null); return SendBytes(arraySegment.Array, arraySegment.Count); } - public bool Send(short msgType, MessageBase msg) + public bool Send(short msgType, QSBMessageBase msg) { _sendWriter.StartMessage(msgType); msg.Serialize(_sendWriter); @@ -189,7 +189,7 @@ namespace QSB.QuantumUNET return SendWriter(_sendWriter); } - internal bool HandleFragment(NetworkReader reader) + internal bool HandleFragment(QSBNetworkReader reader) { bool result; if (reader.ReadByte() == 0) diff --git a/QSB/QuantumUNET/QSBClientAuthorityMessage.cs b/QSB/QuantumUNET/QSBClientAuthorityMessage.cs index f22187be..779f1909 100644 --- a/QSB/QuantumUNET/QSBClientAuthorityMessage.cs +++ b/QSB/QuantumUNET/QSBClientAuthorityMessage.cs @@ -2,18 +2,18 @@ namespace QSB.QuantumUNET { - internal class QSBClientAuthorityMessage : MessageBase + internal class QSBClientAuthorityMessage : QSBMessageBase { public NetworkInstanceId netId; public bool authority; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { netId = reader.ReadNetworkId(); authority = reader.ReadBoolean(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(netId); writer.Write(authority); diff --git a/QSB/QuantumUNET/QSBClientScene.cs b/QSB/QuantumUNET/QSBClientScene.cs index a7a24c67..4eed6e95 100644 --- a/QSB/QuantumUNET/QSBClientScene.cs +++ b/QSB/QuantumUNET/QSBClientScene.cs @@ -11,7 +11,7 @@ namespace QSB.QuantumUNET { private static bool HasMigrationPending() => reconnectId != -1; - public static void SetReconnectId(int newReconnectId, PeerInfoMessage[] peers) + public static void SetReconnectId(int newReconnectId, QSBPeerInfoMessage[] peers) { reconnectId = newReconnectId; s_Peers = peers; @@ -110,7 +110,7 @@ namespace QSB.QuantumUNET public static bool AddPlayer(QSBNetworkConnection readyConn, short playerControllerId) => AddPlayer(readyConn, playerControllerId, null); - public static bool AddPlayer(QSBNetworkConnection readyConn, short playerControllerId, MessageBase extraMessage) + public static bool AddPlayer(QSBNetworkConnection readyConn, short playerControllerId, QSBMessageBase extraMessage) { bool result; if (playerControllerId < 0) @@ -188,13 +188,13 @@ namespace QSB.QuantumUNET } if (!HasMigrationPending()) { - var addPlayerMessage = new AddPlayerMessage + var addPlayerMessage = new QSBAddPlayerMessage { playerControllerId = playerControllerId }; if (extraMessage != null) { - var networkWriter = new NetworkWriter(); + var networkWriter = new QSBNetworkWriter(); extraMessage.Serialize(networkWriter); addPlayerMessage.msgData = networkWriter.ToArray(); addPlayerMessage.msgSize = (int)networkWriter.Position; @@ -210,7 +210,7 @@ namespace QSB.QuantumUNET return result; } - public static bool SendReconnectMessage(MessageBase extraMessage) + public static bool SendReconnectMessage(QSBMessageBase extraMessage) { bool result; if (!HasMigrationPending()) @@ -243,7 +243,7 @@ namespace QSB.QuantumUNET { for (var j = 0; j < peerInfoMessage.playerIds.Length; j++) { - var reconnectMessage = new ReconnectMessage + var reconnectMessage = new QSBReconnectMessage { oldConnectionId = reconnectId, netId = peerInfoMessage.playerIds[j].netId, @@ -251,7 +251,7 @@ namespace QSB.QuantumUNET }; if (extraMessage != null) { - var networkWriter = new NetworkWriter(); + var networkWriter = new QSBNetworkWriter(); extraMessage.Serialize(networkWriter); reconnectMessage.msgData = networkWriter.ToArray(); reconnectMessage.msgSize = (int)networkWriter.Position; @@ -284,9 +284,9 @@ namespace QSB.QuantumUNET bool result; if (readyConnection.GetPlayerController(playerControllerId, out var playerController)) { - var removePlayerMessage = new RemovePlayerMessage + var removePlayerMessage = new QSBRemovePlayerMessage { - playerControllerId = playerControllerId + PlayerControllerId = playerControllerId }; readyConnection.Send(38, removePlayerMessage); readyConnection.RemovePlayerController(playerControllerId); @@ -324,8 +324,9 @@ namespace QSB.QuantumUNET } if (conn != null) { - var msg = new ReadyMessage(); + var msg = new QSBReadyMessage(); conn.Send(35, msg); + DebugLog.DebugWrite("SENDING READY"); ready = true; readyConnection = conn; readyConnection.isReady = true; @@ -484,7 +485,7 @@ namespace QSB.QuantumUNET uv.transform.position = position; if (payload != null && payload.Length > 0) { - var reader = new NetworkReader(payload); + var reader = new QSBNetworkReader(payload); uv.OnUpdateVars(reader, true); } if (!(newGameObject == null)) @@ -502,6 +503,7 @@ namespace QSB.QuantumUNET private static void OnObjectSpawn(QSBNetworkMessage netMsg) { + DebugLog.DebugWrite("OnObjectSpawn"); netMsg.ReadMessage(s_ObjectSpawnMessage); if (!s_ObjectSpawnMessage.assetId.IsValid()) { @@ -736,7 +738,7 @@ namespace QSB.QuantumUNET private static void OnUpdateVarsMessage(QSBNetworkMessage netMsg) { var networkInstanceId = netMsg.Reader.ReadNetworkId(); - Debug.Log(string.Concat(new object[] + DebugLog.DebugWrite(string.Concat(new object[] { "ClientScene::OnUpdateVarsMessage ", networkInstanceId, @@ -921,7 +923,7 @@ namespace QSB.QuantumUNET public const int ReconnectIdHost = 0; - private static PeerInfoMessage[] s_Peers; + private static QSBPeerInfoMessage[] s_Peers; private static List s_PendingOwnerIds = new List(); diff --git a/QSB/QuantumUNET/QSBEmptyMessage.cs b/QSB/QuantumUNET/QSBEmptyMessage.cs new file mode 100644 index 00000000..646f07ba --- /dev/null +++ b/QSB/QuantumUNET/QSBEmptyMessage.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBEmptyMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + } + + public override void Serialize(QSBNetworkWriter writer) + { + } + } +} diff --git a/QSB/QuantumUNET/QSBErrorMessage.cs b/QSB/QuantumUNET/QSBErrorMessage.cs new file mode 100644 index 00000000..387987ad --- /dev/null +++ b/QSB/QuantumUNET/QSBErrorMessage.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBErrorMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.errorCode = (int)reader.ReadUInt16(); + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.Write((ushort)this.errorCode); + } + + public int errorCode; + } +} diff --git a/QSB/QuantumUNET/QSBFloatConversion.cs b/QSB/QuantumUNET/QSBFloatConversion.cs new file mode 100644 index 00000000..81a8e02d --- /dev/null +++ b/QSB/QuantumUNET/QSBFloatConversion.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.QuantumUNET +{ + internal class QSBFloatConversion + { + public static float ToSingle(uint value) + { + QSBUIntFloat uintFloat = default(QSBUIntFloat); + uintFloat.intValue = value; + return uintFloat.floatValue; + } + + public static double ToDouble(ulong value) + { + QSBUIntFloat uintFloat = default(QSBUIntFloat); + uintFloat.longValue = value; + return uintFloat.doubleValue; + } + + public static decimal ToDecimal(ulong value1, ulong value2) + { + QSBUIntDecimal uintDecimal = default(QSBUIntDecimal); + uintDecimal.longValue1 = value1; + uintDecimal.longValue2 = value2; + return uintDecimal.decimalValue; + } + } +} diff --git a/QSB/QuantumUNET/QSBLocalClient.cs b/QSB/QuantumUNET/QSBLocalClient.cs index 6be7a2ab..d0f56e75 100644 --- a/QSB/QuantumUNET/QSBLocalClient.cs +++ b/QSB/QuantumUNET/QSBLocalClient.cs @@ -83,7 +83,7 @@ namespace QSB.QuantumUNET private void PostInternalMessage(short msgType) { - var networkWriter = new NetworkWriter(); + var networkWriter = new QSBNetworkWriter(); networkWriter.StartMessage(msgType); networkWriter.FinishMessage(); PostInternalMessage(networkWriter.AsArray(), 0); @@ -100,7 +100,7 @@ namespace QSB.QuantumUNET var t = internalMsgs[i]; if (s_InternalMessage.Reader == null) { - s_InternalMessage.Reader = new NetworkReader(t.buffer); + s_InternalMessage.Reader = new QSBNetworkReader(t.buffer); } else { @@ -124,9 +124,9 @@ namespace QSB.QuantumUNET } } - internal void InvokeHandlerOnClient(short msgType, MessageBase msg, int channelId) + internal void InvokeHandlerOnClient(short msgType, QSBMessageBase msg, int channelId) { - var networkWriter = new NetworkWriter(); + var networkWriter = new QSBNetworkWriter(); networkWriter.StartMessage(msgType); msg.Serialize(networkWriter); networkWriter.FinishMessage(); diff --git a/QSB/QuantumUNET/QSBMessageBase.cs b/QSB/QuantumUNET/QSBMessageBase.cs new file mode 100644 index 00000000..5e52ed5f --- /dev/null +++ b/QSB/QuantumUNET/QSBMessageBase.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public abstract class QSBMessageBase + { + public virtual void Deserialize(QSBNetworkReader reader) + { + } + + public virtual void Serialize(QSBNetworkWriter writer) + { + } + } +} diff --git a/QSB/QuantumUNET/QSBNetworkBehaviour.cs b/QSB/QuantumUNET/QSBNetworkBehaviour.cs index 2cd05641..f650af6b 100644 --- a/QSB/QuantumUNET/QSBNetworkBehaviour.cs +++ b/QSB/QuantumUNET/QSBNetworkBehaviour.cs @@ -1,4 +1,6 @@ -using System; +using OWML.Common; +using QSB.Utility; +using System; using System.Collections.Generic; using System.Net.Sockets; using UnityEngine; @@ -45,7 +47,7 @@ namespace QSB.QuantumUNET } } - protected void SendCommandInternal(NetworkWriter writer, int channelId, string cmdName) + protected void SendCommandInternal(QSBNetworkWriter writer, int channelId, string cmdName) { if (!IsLocalPlayer && !HasAuthority) { @@ -62,55 +64,49 @@ namespace QSB.QuantumUNET } } - public virtual bool InvokeCommand(int cmdHash, NetworkReader reader) => InvokeCommandDelegate(cmdHash, reader); + public virtual bool InvokeCommand(int cmdHash, QSBNetworkReader reader) => InvokeCommandDelegate(cmdHash, reader); - protected void SendRPCInternal(NetworkWriter writer, int channelId, string rpcName) + protected void SendRPCInternal(QSBNetworkWriter writer, int channelId, string rpcName) { if (!IsServer) { if (LogFilter.logWarn) { Debug.LogWarning("ClientRpc call on un-spawned object"); + return; } } - else - { - writer.FinishMessage(); - QSBNetworkServer.SendWriterToReady(base.gameObject, writer, channelId); - } + writer.FinishMessage(); + QSBNetworkServer.SendWriterToReady(base.gameObject, writer, channelId); } - protected void SendTargetRPCInternal(NetworkConnection conn, NetworkWriter writer, int channelId, string rpcName) + protected void SendTargetRPCInternal(QSBNetworkConnection conn, QSBNetworkWriter writer, int channelId, string rpcName) { if (!IsServer) { Debug.LogWarning("TargetRpc call on un-spawned object"); + return; } - else - { - writer.FinishMessage(); - conn.SendWriter(writer, channelId); - } + writer.FinishMessage(); + conn.SendWriter(writer, channelId); } - public virtual bool InvokeRPC(int cmdHash, NetworkReader reader) => InvokeRpcDelegate(cmdHash, reader); + public virtual bool InvokeRPC(int cmdHash, QSBNetworkReader reader) => InvokeRpcDelegate(cmdHash, reader); - protected void SendEventInternal(NetworkWriter writer, int channelId, string eventName) + protected void SendEventInternal(QSBNetworkWriter writer, int channelId, string eventName) { if (!QSBNetworkServer.active) { - Debug.LogWarning("SendEvent no server?"); - } - else - { - writer.FinishMessage(); - QSBNetworkServer.SendWriterToReady(gameObject, writer, channelId); + DebugLog.ToConsole($"Error - Tried to send event {eventName} on channel {channelId} but QSBNetworkServer isn't active.", MessageType.Error); + return; } + writer.FinishMessage(); + QSBNetworkServer.SendWriterToReady(gameObject, writer, channelId); } - public virtual bool InvokeSyncEvent(int cmdHash, NetworkReader reader) => InvokeSyncEventDelegate(cmdHash, reader); + public virtual bool InvokeSyncEvent(int cmdHash, QSBNetworkReader reader) => InvokeSyncEventDelegate(cmdHash, reader); - public virtual bool InvokeSyncList(int cmdHash, NetworkReader reader) => InvokeSyncListDelegate(cmdHash, reader); + public virtual bool InvokeSyncList(int cmdHash, QSBNetworkReader reader) => InvokeSyncListDelegate(cmdHash, reader); protected static void RegisterCommandDelegate(Type invokeClass, int cmdHash, CmdDelegate func) { @@ -123,13 +119,6 @@ namespace QSB.QuantumUNET invokeFunction = func }; s_CmdHandlerDelegates[cmdHash] = invoker; - Debug.Log(string.Concat(new object[] - { - "RegisterCommandDelegate hash:", - cmdHash, - " ", - func.GetMethodName() - })); } } @@ -144,13 +133,6 @@ namespace QSB.QuantumUNET invokeFunction = func }; s_CmdHandlerDelegates[cmdHash] = invoker; - Debug.Log(string.Concat(new object[] - { - "RegisterRpcDelegate hash:", - cmdHash, - " ", - func.GetMethodName() - })); } } @@ -165,13 +147,6 @@ namespace QSB.QuantumUNET invokeFunction = func }; s_CmdHandlerDelegates[cmdHash] = invoker; - Debug.Log(string.Concat(new object[] - { - "RegisterEventDelegate hash:", - cmdHash, - " ", - func.GetMethodName() - })); } } @@ -186,13 +161,6 @@ namespace QSB.QuantumUNET invokeFunction = func }; s_CmdHandlerDelegates[cmdHash] = invoker; - Debug.Log(string.Concat(new object[] - { - "RegisterSyncListDelegate hash:", - cmdHash, - " ", - func.GetMethodName() - })); } } @@ -278,7 +246,7 @@ namespace QSB.QuantumUNET internal bool ContainsCommandDelegate(int cmdHash) => s_CmdHandlerDelegates.ContainsKey(cmdHash); - internal bool InvokeCommandDelegate(int cmdHash, NetworkReader reader) + internal bool InvokeCommandDelegate(int cmdHash, QSBNetworkReader reader) { bool result; if (!s_CmdHandlerDelegates.ContainsKey(cmdHash)) @@ -308,7 +276,7 @@ namespace QSB.QuantumUNET return result; } - internal bool InvokeRpcDelegate(int cmdHash, NetworkReader reader) + internal bool InvokeRpcDelegate(int cmdHash, QSBNetworkReader reader) { bool result; if (!s_CmdHandlerDelegates.ContainsKey(cmdHash)) @@ -338,7 +306,7 @@ namespace QSB.QuantumUNET return result; } - internal bool InvokeSyncEventDelegate(int cmdHash, NetworkReader reader) + internal bool InvokeSyncEventDelegate(int cmdHash, QSBNetworkReader reader) { bool result; if (!s_CmdHandlerDelegates.ContainsKey(cmdHash)) @@ -361,7 +329,7 @@ namespace QSB.QuantumUNET return result; } - internal bool InvokeSyncListDelegate(int cmdHash, NetworkReader reader) + internal bool InvokeSyncListDelegate(int cmdHash, QSBNetworkReader reader) { bool result; if (!s_CmdHandlerDelegates.ContainsKey(cmdHash)) @@ -495,6 +463,7 @@ namespace QSB.QuantumUNET { flag = !value.Equals(fieldValue); } + if (flag) { Debug.Log(string.Concat(new object[] @@ -508,6 +477,7 @@ namespace QSB.QuantumUNET "->", value })); + SetDirtyBit(dirtyBit); fieldValue = value; } @@ -533,7 +503,7 @@ namespace QSB.QuantumUNET return -1; } - public virtual bool OnSerialize(NetworkWriter writer, bool initialState) + public virtual bool OnSerialize(QSBNetworkWriter writer, bool initialState) { if (!initialState) { @@ -542,7 +512,7 @@ namespace QSB.QuantumUNET return false; } - public virtual void OnDeserialize(NetworkReader reader, bool initialState) + public virtual void OnDeserialize(QSBNetworkReader reader, bool initialState) { if (!initialState) { @@ -550,44 +520,17 @@ namespace QSB.QuantumUNET } } - public virtual void PreStartClient() - { - } - - public virtual void OnNetworkDestroy() - { - } - - public virtual void OnStartServer() - { - } - - public virtual void OnStartClient() - { - } - - public virtual void OnStartLocalPlayer() - { - } - - public virtual void OnStartAuthority() - { - } - - public virtual void OnStopAuthority() - { - } - + public virtual void PreStartClient() { } + public virtual void OnNetworkDestroy() { } + public virtual void OnStartServer() { } + public virtual void OnStartClient() { } + public virtual void OnStartLocalPlayer() { } + public virtual void OnStartAuthority() { } + public virtual void OnStopAuthority() { } public virtual bool OnRebuildObservers(HashSet observers, bool initialize) => false; - - public virtual void OnSetLocalVisibility(bool vis) - { - } - + public virtual void OnSetLocalVisibility(bool vis) { } public virtual bool OnCheckObserver(QSBNetworkConnection conn) => true; - public virtual int GetNetworkChannel() => 0; - public virtual float GetNetworkSendInterval() => 0.1f; private float m_LastSendTime; @@ -595,9 +538,9 @@ namespace QSB.QuantumUNET private static readonly Dictionary s_CmdHandlerDelegates = new Dictionary(); - public delegate void CmdDelegate(QSBNetworkBehaviour obj, NetworkReader reader); + public delegate void CmdDelegate(QSBNetworkBehaviour obj, QSBNetworkReader reader); - protected delegate void EventDelegate(List targets, NetworkReader reader); + protected delegate void EventDelegate(List targets, QSBNetworkReader reader); protected enum UNetInvokeType { diff --git a/QSB/QuantumUNET/QSBNetworkClient.cs b/QSB/QuantumUNET/QSBNetworkClient.cs index c364f244..53699b44 100644 --- a/QSB/QuantumUNET/QSBNetworkClient.cs +++ b/QSB/QuantumUNET/QSBNetworkClient.cs @@ -614,7 +614,7 @@ namespace QSB.QuantumUNET } } - public bool Send(short msgType, MessageBase msg) + public bool Send(short msgType, QSBMessageBase msg) { bool result; if (m_Connection != null) @@ -643,7 +643,7 @@ namespace QSB.QuantumUNET return result; } - public bool SendWriter(NetworkWriter writer, int channelId) + public bool SendWriter(QSBNetworkWriter writer, int channelId) { bool result; if (m_Connection != null) @@ -701,7 +701,7 @@ namespace QSB.QuantumUNET return result; } - public bool SendUnreliable(short msgType, MessageBase msg) + public bool SendUnreliable(short msgType, QSBMessageBase msg) { bool result; if (m_Connection != null) @@ -730,7 +730,7 @@ namespace QSB.QuantumUNET return result; } - public bool SendByChannel(short msgType, MessageBase msg, int channelId) + public bool SendByChannel(short msgType, QSBMessageBase msg, int channelId) { bool result; if (m_Connection != null) @@ -835,7 +835,7 @@ namespace QSB.QuantumUNET } if (networkEventType != NetworkEventType.Nothing) { - Debug.Log(string.Concat(new object[] + DebugLog.DebugWrite(string.Concat(new object[] { "Client event: host=", m_ClientId, @@ -968,12 +968,12 @@ namespace QSB.QuantumUNET } if (handler != null) { - ErrorMessage errorMessage = new ErrorMessage(); + QSBErrorMessage errorMessage = new QSBErrorMessage(); errorMessage.errorCode = error; byte[] buffer = new byte[200]; - NetworkWriter writer = new NetworkWriter(buffer); + QSBNetworkWriter writer = new QSBNetworkWriter(buffer); errorMessage.Serialize(writer); - NetworkReader reader = new NetworkReader(buffer); + QSBNetworkReader reader = new QSBNetworkReader(buffer); handler(new QSBNetworkMessage { MsgType = 34, @@ -1057,11 +1057,13 @@ namespace QSB.QuantumUNET public void RegisterHandler(short msgType, QSBNetworkMessageDelegate handler) { + DebugLog.DebugWrite($"Register event id {msgType}"); m_MessageHandlers.RegisterHandler(msgType, handler); } public void RegisterHandlerSafe(short msgType, QSBNetworkMessageDelegate handler) { + DebugLog.DebugWrite($"Safe register event id {msgType}"); m_MessageHandlers.RegisterHandlerSafe(msgType, handler); } diff --git a/QSB/QuantumUNET/QSBNetworkConnection.cs b/QSB/QuantumUNET/QSBNetworkConnection.cs index 6eef5a4a..eba1864d 100644 --- a/QSB/QuantumUNET/QSBNetworkConnection.cs +++ b/QSB/QuantumUNET/QSBNetworkConnection.cs @@ -1,4 +1,5 @@ -using System; +using QSB.Utility; +using System; using System.Collections.Generic; using System.Text; using UnityEngine; @@ -10,7 +11,7 @@ namespace QSB.QuantumUNET { public QSBNetworkConnection() { - m_Writer = new NetworkWriter(); + m_Writer = new QSBNetworkWriter(); } internal HashSet VisList { get; } = new HashSet(); @@ -27,7 +28,7 @@ namespace QSB.QuantumUNET public virtual void Initialize(string networkAddress, int networkHostId, int networkConnectionId, HostTopology hostTopology) { - m_Writer = new NetworkWriter(); + m_Writer = new QSBNetworkWriter(); address = networkAddress; hostId = networkHostId; connectionId = networkConnectionId; @@ -115,7 +116,7 @@ namespace QSB.QuantumUNET public bool InvokeHandlerNoData(short msgType) => InvokeHandler(msgType, null, 0); - public bool InvokeHandler(short msgType, NetworkReader reader, int channelId) + public bool InvokeHandler(short msgType, QSBNetworkReader reader, int channelId) { bool result; if (m_MessageHandlersDict.ContainsKey(msgType)) @@ -162,14 +163,14 @@ namespace QSB.QuantumUNET return result; } - internal void HandleFragment(NetworkReader reader, int channelId) + internal void HandleFragment(QSBNetworkReader reader, int channelId) { if (channelId >= 0 && channelId < m_Channels.Length) { var channelBuffer = m_Channels[channelId]; if (channelBuffer.HandleFragment(reader)) { - var networkReader = new NetworkReader(channelBuffer._fragmentBuffer.AsArraySegment().Array); + var networkReader = new QSBNetworkReader(channelBuffer._fragmentBuffer.AsArraySegment().Array); networkReader.ReadInt16(); var msgType = networkReader.ReadInt16(); InvokeHandler(msgType, networkReader, channelId); @@ -252,11 +253,11 @@ namespace QSB.QuantumUNET } } - public virtual bool Send(short msgType, MessageBase msg) => SendByChannel(msgType, msg, 0); + public virtual bool Send(short msgType, QSBMessageBase msg) => SendByChannel(msgType, msg, 0); - public virtual bool SendUnreliable(short msgType, MessageBase msg) => SendByChannel(msgType, msg, 1); + public virtual bool SendUnreliable(short msgType, QSBMessageBase msg) => SendByChannel(msgType, msg, 1); - public virtual bool SendByChannel(short msgType, MessageBase msg, int channelId) + public virtual bool SendByChannel(short msgType, QSBMessageBase msg, int channelId) { m_Writer.StartMessage(msgType); msg.Serialize(m_Writer); @@ -273,7 +274,7 @@ namespace QSB.QuantumUNET return CheckChannel(channelId) && m_Channels[channelId].SendBytes(bytes, numBytes); } - public virtual bool SendWriter(NetworkWriter writer, int channelId) + public virtual bool SendWriter(QSBNetworkWriter writer, int channelId) { if (logNetworkMessages) { @@ -353,52 +354,48 @@ namespace QSB.QuantumUNET protected void HandleReader(NetworkReader reader, int receivedSize, int channelId) { - while ((ulong)reader.Position < (ulong)((long)receivedSize)) + DebugLog.DebugWrite($"handle reader size:{receivedSize}"); + while (reader.Position < receivedSize) { var num = reader.ReadUInt16(); var num2 = reader.ReadInt16(); var array = reader.ReadBytes((int)num); - var reader2 = new NetworkReader(array); - if (logNetworkMessages) + var reader2 = new QSBNetworkReader(array); + var stringBuilder = new StringBuilder(); + for (var i = 0; i < (int)num; i++) { - var stringBuilder = new StringBuilder(); - for (var i = 0; i < (int)num; i++) + stringBuilder.AppendFormat("{0:X2}", array[i]); + if (i > 150) { - stringBuilder.AppendFormat("{0:X2}", array[i]); - if (i > 150) - { - break; - } + break; } - Debug.Log(string.Concat(new object[] - { - "ConnectionRecv con:", - connectionId, - " bytes:", - num, - " msgId:", - num2, - " ", - stringBuilder - })); } + DebugLog.DebugWrite(string.Concat(new object[] + { + "ConnectionRecv con:", + connectionId, + " bytes:", + num, + " msgId:", + num2, + " ", + stringBuilder + })); QSBNetworkMessageDelegate networkMessageDelegate = null; if (m_MessageHandlersDict.ContainsKey(num2)) { networkMessageDelegate = m_MessageHandlersDict[num2]; + DebugLog.DebugWrite(networkMessageDelegate.GetMethodName()); } if (networkMessageDelegate == null) { - if (LogFilter.logError) + DebugLog.ToConsole(string.Concat(new object[] { - Debug.LogError(string.Concat(new object[] - { - "Unknown message ID ", - num2, - " connId:", - connectionId - })); - } + "Unknown message ID ", + num2, + " connId:", + connectionId + })); break; } m_NetMsg.MsgType = num2; @@ -501,7 +498,7 @@ namespace QSB.QuantumUNET private QSBChannelBuffer[] m_Channels; private readonly QSBNetworkMessage m_NetMsg = new QSBNetworkMessage(); - private NetworkWriter m_Writer; + private QSBNetworkWriter m_Writer; private Dictionary m_MessageHandlersDict; diff --git a/QSB/QuantumUNET/QSBNetworkIdentity.cs b/QSB/QuantumUNET/QSBNetworkIdentity.cs index a9e5998b..d4a3b7e3 100644 --- a/QSB/QuantumUNET/QSBNetworkIdentity.cs +++ b/QSB/QuantumUNET/QSBNetworkIdentity.cs @@ -1,4 +1,5 @@ -using QSB.Utility; +using OWML.Common; +using QSB.Utility; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -325,8 +326,9 @@ namespace QSB.QuantumUNET return true; } - internal void UNetSerializeAllVars(NetworkWriter writer) + internal void UNetSerializeAllVars(QSBNetworkWriter writer) { + DebugLog.DebugWrite($"Sync all vars (NetId:{NetId}, Gameobject:{gameObject.name})"); for (var i = 0; i < m_NetworkBehaviours.Length; i++) { var networkBehaviour = m_NetworkBehaviours[i]; @@ -383,7 +385,7 @@ namespace QSB.QuantumUNET return result; } - internal void HandleSyncEvent(int cmdHash, NetworkReader reader) + internal void HandleSyncEvent(int cmdHash, QSBNetworkReader reader) { if (base.gameObject == null) { @@ -429,7 +431,7 @@ namespace QSB.QuantumUNET } } - internal void HandleSyncList(int cmdHash, NetworkReader reader) + internal void HandleSyncList(int cmdHash, QSBNetworkReader reader) { if (base.gameObject == null) { @@ -475,7 +477,7 @@ namespace QSB.QuantumUNET } } - internal void HandleCommand(int cmdHash, NetworkReader reader) + internal void HandleCommand(int cmdHash, QSBNetworkReader reader) { if (base.gameObject == null) { @@ -521,7 +523,7 @@ namespace QSB.QuantumUNET } } - internal void HandleRPC(int cmdHash, NetworkReader reader) + internal void HandleRPC(int cmdHash, QSBNetworkReader reader) { if (base.gameObject == null) { @@ -586,6 +588,7 @@ namespace QSB.QuantumUNET { if ((num & (1U << j)) != 0U) { + DebugLog.DebugWrite("sending update vars message"); s_UpdateWriter.StartMessage(8); s_UpdateWriter.Write(NetId); var flag = false; @@ -621,6 +624,7 @@ namespace QSB.QuantumUNET } if (flag) { + DebugLog.DebugWrite("FINISH MESSAGE"); s_UpdateWriter.FinishMessage(); QSBNetworkServer.SendWriterToReady(base.gameObject, s_UpdateWriter, j); } @@ -633,7 +637,7 @@ namespace QSB.QuantumUNET } } - internal void OnUpdateVars(NetworkReader reader, bool initialState) + internal void OnUpdateVars(QSBNetworkReader reader, bool initialState) { if (initialState && m_NetworkBehaviours == null) { @@ -854,81 +858,71 @@ namespace QSB.QuantumUNET public bool RemoveClientAuthority(QSBNetworkConnection conn) { - bool result; if (!IsServer) { - Debug.LogError("RemoveClientAuthority can only be call on the server for spawned objects."); - result = false; + DebugLog.ToConsole($"Warning - Cannot remove authority on client-side. (NetId:{NetId}, Gameobject:{gameObject.name})", MessageType.Warning); + return false; } else if (ConnectionToClient != null) { Debug.LogError("RemoveClientAuthority cannot remove authority for a player object"); - result = false; + return false; } else if (ClientAuthorityOwner == null) { Debug.LogError("RemoveClientAuthority for " + base.gameObject + " has no clientAuthority owner."); - result = false; + return false; } else if (ClientAuthorityOwner != conn) { Debug.LogError("RemoveClientAuthority for " + base.gameObject + " has different owner."); - result = false; + return false; } - else + ClientAuthorityOwner.RemoveOwnedObject(this); + ClientAuthorityOwner = null; + ForceAuthority(true); + conn.Send(15, new QSBClientAuthorityMessage { - ClientAuthorityOwner.RemoveOwnedObject(this); - ClientAuthorityOwner = null; - ForceAuthority(true); - conn.Send(15, new QSBClientAuthorityMessage - { - netId = NetId, - authority = false - }); - clientAuthorityCallback?.Invoke(conn, this, false); - result = true; - } - return result; + netId = NetId, + authority = false + }); + clientAuthorityCallback?.Invoke(conn, this, false); + return true; } public bool AssignClientAuthority(QSBNetworkConnection conn) { - bool result; if (!IsServer) { - Debug.LogError("AssignClientAuthority can only be call on the server for spawned objects."); - result = false; + DebugLog.ToConsole($"Warning - Cannot assign authority on client-side. (NetId:{NetId}, Gameobject:{gameObject.name})", MessageType.Warning); + return false; } else if (!LocalPlayerAuthority) { - Debug.LogError("AssignClientAuthority can only be used for NetworkIdentity component with LocalPlayerAuthority set."); - result = false; + DebugLog.ToConsole($"Warning - Cannot assign authority on object without LocalPlayerAuthority. (NetId:{NetId}, Gameobject:{gameObject.name})", MessageType.Warning); + return false; } else if (ClientAuthorityOwner != null && conn != ClientAuthorityOwner) { Debug.LogError("AssignClientAuthority for " + base.gameObject + " already has an owner. Use RemoveClientAuthority() first."); - result = false; + return false; } else if (conn == null) { Debug.LogError("AssignClientAuthority for " + base.gameObject + " owner cannot be null. Use RemoveClientAuthority() instead."); - result = false; + return false; } - else - { - ClientAuthorityOwner = conn; - ClientAuthorityOwner.AddOwnedObject(this); + ClientAuthorityOwner = conn; + ClientAuthorityOwner.AddOwnedObject(this); - ForceAuthority(false); - conn.Send(15, new QSBClientAuthorityMessage - { - netId = NetId, - authority = true - }); - clientAuthorityCallback?.Invoke(conn, this, true); - result = true; - } - return result; + ForceAuthority(false); + conn.Send(15, new QSBClientAuthorityMessage + { + netId = NetId, + authority = true + }); + clientAuthorityCallback?.Invoke(conn, this, true); + return true; } internal void MarkForReset() => m_Reset = true; @@ -981,7 +975,7 @@ namespace QSB.QuantumUNET private static uint s_NextNetworkId = 1U; - private static readonly NetworkWriter s_UpdateWriter = new NetworkWriter(); + private static readonly QSBNetworkWriter s_UpdateWriter = new QSBNetworkWriter(); public static ClientAuthorityCallback clientAuthorityCallback; diff --git a/QSB/QuantumUNET/QSBNetworkManagerUNET.cs b/QSB/QuantumUNET/QSBNetworkManagerUNET.cs index 6c6fec0e..4d7831d5 100644 --- a/QSB/QuantumUNET/QSBNetworkManagerUNET.cs +++ b/QSB/QuantumUNET/QSBNetworkManagerUNET.cs @@ -902,7 +902,7 @@ namespace QSB.QuantumUNET QSBNetworkServer.SetAllClientsNotReady(); networkSceneName = newSceneName; s_LoadingSceneAsync = SceneManager.LoadSceneAsync(newSceneName); - StringMessage msg = new StringMessage(networkSceneName); + QSBStringMessage msg = new QSBStringMessage(networkSceneName); QSBNetworkServer.SendToAll(39, msg); s_StartPositionIndex = 0; s_StartPositions.Clear(); @@ -1069,7 +1069,7 @@ namespace QSB.QuantumUNET } if (networkSceneName != "" && networkSceneName != m_OfflineScene) { - StringMessage msg = new StringMessage(networkSceneName); + QSBStringMessage msg = new QSBStringMessage(networkSceneName); netMsg.Connection.Send(39, msg); } if (m_MigrationManager != null) @@ -1107,7 +1107,7 @@ namespace QSB.QuantumUNET { Debug.Log("NetworkManager:OnServerAddPlayerMessageInternal"); } - netMsg.ReadMessage(s_AddPlayerMessage); + netMsg.ReadMessage(s_AddPlayerMessage); if (s_AddPlayerMessage.msgSize != 0) { NetworkReader extraMessageReader = new NetworkReader(s_AddPlayerMessage.msgData); @@ -1129,11 +1129,11 @@ namespace QSB.QuantumUNET { Debug.Log("NetworkManager:OnServerRemovePlayerMessageInternal"); } - netMsg.ReadMessage(s_RemovePlayerMessage); + netMsg.ReadMessage(s_RemovePlayerMessage); QSBPlayerController player; - netMsg.Connection.GetPlayerController(s_RemovePlayerMessage.playerControllerId, out player); + netMsg.Connection.GetPlayerController(s_RemovePlayerMessage.PlayerControllerId, out player); OnServerRemovePlayer(netMsg.Connection, player); - netMsg.Connection.RemovePlayerController(s_RemovePlayerMessage.playerControllerId); + netMsg.Connection.RemovePlayerController(s_RemovePlayerMessage.PlayerControllerId); if (m_MigrationManager != null) { m_MigrationManager.SendPeerInfo(); @@ -1146,7 +1146,7 @@ namespace QSB.QuantumUNET { Debug.Log("NetworkManager:OnServerErrorInternal"); } - netMsg.ReadMessage(s_ErrorMessage); + netMsg.ReadMessage(s_ErrorMessage); this.OnServerError(netMsg.Connection, s_ErrorMessage.errorCode); } @@ -1209,7 +1209,7 @@ namespace QSB.QuantumUNET { Debug.Log("NetworkManager:OnClientErrorInternal"); } - netMsg.ReadMessage(s_ErrorMessage); + netMsg.ReadMessage(s_ErrorMessage); this.OnClientError(netMsg.Connection, s_ErrorMessage.errorCode); } @@ -1697,11 +1697,11 @@ namespace QSB.QuantumUNET public static QSBNetworkManagerUNET singleton; - private static AddPlayerMessage s_AddPlayerMessage = new AddPlayerMessage(); + private static QSBAddPlayerMessage s_AddPlayerMessage = new QSBAddPlayerMessage(); - private static RemovePlayerMessage s_RemovePlayerMessage = new RemovePlayerMessage(); + private static QSBRemovePlayerMessage s_RemovePlayerMessage = new QSBRemovePlayerMessage(); - private static ErrorMessage s_ErrorMessage = new ErrorMessage(); + private static QSBErrorMessage s_ErrorMessage = new QSBErrorMessage(); private static AsyncOperation s_LoadingSceneAsync; diff --git a/QSB/QuantumUNET/QSBNetworkMessage.cs b/QSB/QuantumUNET/QSBNetworkMessage.cs index 93311b2c..e4bf47d7 100644 --- a/QSB/QuantumUNET/QSBNetworkMessage.cs +++ b/QSB/QuantumUNET/QSBNetworkMessage.cs @@ -8,17 +8,17 @@ namespace QSB.QuantumUNET public const int MaxMessageSize = 65535; public short MsgType; public QSBNetworkConnection Connection; - public NetworkReader Reader; + public QSBNetworkReader Reader; public int ChannelId; - public TMsg ReadMessage() where TMsg : MessageBase, new() + public TMsg ReadMessage() where TMsg : QSBMessageBase, new() { var result = Activator.CreateInstance(); result.Deserialize(Reader); return result; } - public void ReadMessage(TMsg msg) where TMsg : MessageBase + public void ReadMessage(TMsg msg) where TMsg : QSBMessageBase { msg.Deserialize(Reader); } diff --git a/QSB/QuantumUNET/QSBNetworkMigrationManager.cs b/QSB/QuantumUNET/QSBNetworkMigrationManager.cs index eed887c4..614e5672 100644 --- a/QSB/QuantumUNET/QSBNetworkMigrationManager.cs +++ b/QSB/QuantumUNET/QSBNetworkMigrationManager.cs @@ -169,7 +169,7 @@ namespace QSB.QuantumUNET } } - public PeerInfoMessage[] peers + public QSBPeerInfoMessage[] peers { get { @@ -206,7 +206,7 @@ namespace QSB.QuantumUNET internal void AssignAuthorityCallback(QSBNetworkConnection conn, QSBNetworkIdentity uv, bool authorityState) { - PeerAuthorityMessage peerAuthorityMessage = new PeerAuthorityMessage(); + QSBPeerAuthorityMessage peerAuthorityMessage = new QSBPeerAuthorityMessage(); peerAuthorityMessage.connectionId = conn.connectionId; peerAuthorityMessage.netId = uv.NetId; peerAuthorityMessage.authorityState = authorityState; @@ -241,12 +241,12 @@ namespace QSB.QuantumUNET { for (int i = 0; i < this.m_Peers.Length; i++) { - PeerInfoMessage peerInfoMessage = this.m_Peers[i]; + QSBPeerInfoMessage peerInfoMessage = this.m_Peers[i]; if (peerInfoMessage.playerIds != null) { for (int j = 0; j < peerInfoMessage.playerIds.Length; j++) { - PeerInfoPlayer peerInfoPlayer = peerInfoMessage.playerIds[j]; + QSBPeerInfoPlayer peerInfoPlayer = peerInfoMessage.playerIds[j]; Debug.Log(string.Concat(new object[] { "DisablePlayerObjects disable player for ", @@ -282,14 +282,14 @@ namespace QSB.QuantumUNET { if (this.m_HostMigration) { - PeerListMessage peerListMessage = new PeerListMessage(); - List list = new List(); + QSBPeerListMessage peerListMessage = new QSBPeerListMessage(); + List list = new List(); for (int i = 0; i < QSBNetworkServer.connections.Count; i++) { QSBNetworkConnection networkConnection = QSBNetworkServer.connections[i]; if (networkConnection != null) { - PeerInfoMessage peerInfoMessage = new PeerInfoMessage(); + QSBPeerInfoMessage peerInfoMessage = new QSBPeerInfoMessage(); string address; int port; NetworkID networkID; @@ -309,13 +309,13 @@ namespace QSB.QuantumUNET peerInfoMessage.address = address; peerInfoMessage.isHost = false; } - List list2 = new List(); + List list2 = new List(); for (int j = 0; j < networkConnection.PlayerControllers.Count; j++) { QSBPlayerController playerController = networkConnection.PlayerControllers[j]; if (playerController != null && playerController.UnetView != null) { - PeerInfoPlayer item; + QSBPeerInfoPlayer item; item.netId = playerController.UnetView.NetId; item.playerControllerId = playerController.UnetView.PlayerControllerId; list2.Add(item); @@ -331,7 +331,7 @@ namespace QSB.QuantumUNET QSBNetworkIdentity component = gameObject.GetComponent(); if (component.PlayerControllerId == -1) { - PeerInfoPlayer item2; + QSBPeerInfoPlayer item2; item2.netId = netId; item2.playerControllerId = -1; list2.Add(item2); @@ -361,7 +361,7 @@ namespace QSB.QuantumUNET private void OnPeerClientAuthority(QSBNetworkMessage netMsg) { - PeerAuthorityMessage peerAuthorityMessage = netMsg.ReadMessage(); + QSBPeerAuthorityMessage peerAuthorityMessage = netMsg.ReadMessage(); if (LogFilter.logDebug) { Debug.Log("OnPeerClientAuthority for netId:" + peerAuthorityMessage.netId); @@ -370,12 +370,12 @@ namespace QSB.QuantumUNET { for (int i = 0; i < this.m_Peers.Length; i++) { - PeerInfoMessage peerInfoMessage = this.m_Peers[i]; + QSBPeerInfoMessage peerInfoMessage = this.m_Peers[i]; if (peerInfoMessage.connectionId == peerAuthorityMessage.connectionId) { if (peerInfoMessage.playerIds == null) { - peerInfoMessage.playerIds = new PeerInfoPlayer[0]; + peerInfoMessage.playerIds = new QSBPeerInfoPlayer[0]; } if (peerAuthorityMessage.authorityState) { @@ -386,10 +386,10 @@ namespace QSB.QuantumUNET return; } } - PeerInfoPlayer item = default(PeerInfoPlayer); + QSBPeerInfoPlayer item = default(QSBPeerInfoPlayer); item.netId = peerAuthorityMessage.netId; item.playerControllerId = -1; - peerInfoMessage.playerIds = new List(peerInfoMessage.playerIds) + peerInfoMessage.playerIds = new List(peerInfoMessage.playerIds) { item }.ToArray(); @@ -400,7 +400,7 @@ namespace QSB.QuantumUNET { if (peerInfoMessage.playerIds[k].netId == peerAuthorityMessage.netId) { - List list = new List(peerInfoMessage.playerIds); + List list = new List(peerInfoMessage.playerIds); list.RemoveAt(k); peerInfoMessage.playerIds = list.ToArray(); break; @@ -420,7 +420,7 @@ namespace QSB.QuantumUNET { Debug.Log("OnPeerInfo"); } - netMsg.ReadMessage(this.m_PeerListMessage); + netMsg.ReadMessage(this.m_PeerListMessage); this.m_Peers = this.m_PeerListMessage.peers; this.m_OldServerConnectionId = this.m_PeerListMessage.oldServerConnectionId; for (int i = 0; i < this.m_Peers.Length; i++) @@ -446,7 +446,7 @@ namespace QSB.QuantumUNET private void OnServerReconnectPlayerMessage(QSBNetworkMessage netMsg) { - ReconnectMessage reconnectMessage = netMsg.ReadMessage(); + QSBReconnectMessage reconnectMessage = netMsg.ReadMessage(); Debug.Log(string.Concat(new object[] { "OnReconnectMessage: connId=", @@ -762,7 +762,7 @@ namespace QSB.QuantumUNET this.ReconnectObjectForConnection(newConnection, oldObject, oldConnectionId); } - protected virtual void OnPeersUpdated(PeerListMessage peers) + protected virtual void OnPeersUpdated(QSBPeerListMessage peers) { Debug.Log("NetworkMigrationManager NumPeers " + peers.peers.Length); } @@ -780,7 +780,7 @@ namespace QSB.QuantumUNET })); } - public virtual bool FindNewHost(out PeerInfoMessage newHostInfo, out bool youAreNewHost) + public virtual bool FindNewHost(out QSBPeerInfoMessage newHostInfo, out bool youAreNewHost) { bool result; if (this.m_Peers == null) @@ -796,7 +796,7 @@ namespace QSB.QuantumUNET else { Debug.Log("NetworkMigrationManager FindLowestHost"); - newHostInfo = new PeerInfoMessage(); + newHostInfo = new QSBPeerInfoMessage(); newHostInfo.connectionId = 50000; newHostInfo.address = ""; newHostInfo.port = 0; @@ -810,7 +810,7 @@ namespace QSB.QuantumUNET { for (int i = 0; i < this.m_Peers.Length; i++) { - PeerInfoMessage peerInfoMessage = this.m_Peers[i]; + QSBPeerInfoMessage peerInfoMessage = this.m_Peers[i]; if (peerInfoMessage.connectionId != 0) { if (!peerInfoMessage.isHost) @@ -1036,11 +1036,11 @@ namespace QSB.QuantumUNET private string m_NewHostAddress; - private PeerInfoMessage m_NewHostInfo = new PeerInfoMessage(); + private QSBPeerInfoMessage m_NewHostInfo = new QSBPeerInfoMessage(); - private PeerListMessage m_PeerListMessage = new PeerListMessage(); + private QSBPeerListMessage m_PeerListMessage = new QSBPeerListMessage(); - private PeerInfoMessage[] m_Peers; + private QSBPeerInfoMessage[] m_Peers; private Dictionary m_PendingPlayers = new Dictionary(); diff --git a/QSB/QuantumUNET/QSBNetworkReader.cs b/QSB/QuantumUNET/QSBNetworkReader.cs new file mode 100644 index 00000000..a519c99a --- /dev/null +++ b/QSB/QuantumUNET/QSBNetworkReader.cs @@ -0,0 +1,568 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBNetworkReader + { + public QSBNetworkReader() + { + this.m_buf = new QSBNetBuffer(); + QSBNetworkReader.Initialize(); + } + + public QSBNetworkReader(QSBNetworkWriter writer) + { + this.m_buf = new QSBNetBuffer(writer.AsArray()); + QSBNetworkReader.Initialize(); + } + + public QSBNetworkReader(byte[] buffer) + { + this.m_buf = new QSBNetBuffer(buffer); + QSBNetworkReader.Initialize(); + } + + private static void Initialize() + { + if (QSBNetworkReader.s_Encoding == null) + { + QSBNetworkReader.s_StringReaderBuffer = new byte[1024]; + QSBNetworkReader.s_Encoding = new UTF8Encoding(); + } + } + + public uint Position + { + get + { + return this.m_buf.Position; + } + } + + public int Length + { + get + { + return this.m_buf.Length; + } + } + + public void SeekZero() + { + this.m_buf.SeekZero(); + } + + internal void Replace(byte[] buffer) + { + this.m_buf.Replace(buffer); + } + + public uint ReadPackedUInt32() + { + byte b = this.ReadByte(); + uint result; + if (b < 241) + { + result = (uint)b; + } + else + { + byte b2 = this.ReadByte(); + if (b >= 241 && b <= 248) + { + result = 240U + 256U * (uint)(b - 241) + (uint)b2; + } + else + { + byte b3 = this.ReadByte(); + if (b == 249) + { + result = 2288U + 256U * (uint)b2 + (uint)b3; + } + else + { + byte b4 = this.ReadByte(); + if (b == 250) + { + result = (uint)((int)b2 + ((int)b3 << 8) + ((int)b4 << 16)); + } + else + { + byte b5 = this.ReadByte(); + if (b < 251) + { + throw new IndexOutOfRangeException("ReadPackedUInt32() failure: " + b); + } + result = (uint)((int)b2 + ((int)b3 << 8) + ((int)b4 << 16) + ((int)b5 << 24)); + } + } + } + } + return result; + } + + public ulong ReadPackedUInt64() + { + byte b = this.ReadByte(); + ulong result; + if (b < 241) + { + result = (ulong)b; + } + else + { + byte b2 = this.ReadByte(); + if (b >= 241 && b <= 248) + { + result = 240UL + 256UL * ((ulong)b - 241UL) + (ulong)b2; + } + else + { + byte b3 = this.ReadByte(); + if (b == 249) + { + result = 2288UL + 256UL * (ulong)b2 + (ulong)b3; + } + else + { + byte b4 = this.ReadByte(); + if (b == 250) + { + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16); + } + else + { + byte b5 = this.ReadByte(); + if (b == 251) + { + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24); + } + else + { + byte b6 = this.ReadByte(); + if (b == 252) + { + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24) + ((ulong)b6 << 32); + } + else + { + byte b7 = this.ReadByte(); + if (b == 253) + { + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24) + ((ulong)b6 << 32) + ((ulong)b7 << 40); + } + else + { + byte b8 = this.ReadByte(); + if (b == 254) + { + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24) + ((ulong)b6 << 32) + ((ulong)b7 << 40) + ((ulong)b8 << 48); + } + else + { + byte b9 = this.ReadByte(); + if (b != 255) + { + throw new IndexOutOfRangeException("ReadPackedUInt64() failure: " + b); + } + result = (ulong)b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24) + ((ulong)b6 << 32) + ((ulong)b7 << 40) + ((ulong)b8 << 48) + ((ulong)b9 << 56); + } + } + } + } + } + } + } + } + return result; + } + + public NetworkInstanceId ReadNetworkId() + { + return new NetworkInstanceId(this.ReadPackedUInt32()); + } + + public NetworkSceneId ReadSceneId() + { + return new NetworkSceneId(this.ReadPackedUInt32()); + } + + public byte ReadByte() + { + return this.m_buf.ReadByte(); + } + + public sbyte ReadSByte() + { + return (sbyte)this.m_buf.ReadByte(); + } + + public short ReadInt16() + { + ushort num = 0; + num |= (ushort)this.m_buf.ReadByte(); + num |= (ushort)(this.m_buf.ReadByte() << 8); + return (short)num; + } + + public ushort ReadUInt16() + { + return (ushort)((uint)(ushort)(0U | (uint)this.m_buf.ReadByte()) | (uint)(ushort)((uint)this.m_buf.ReadByte() << 8)); + } + + public int ReadInt32() + { + uint num = 0U; + num |= (uint)this.m_buf.ReadByte(); + num |= (uint)((uint)this.m_buf.ReadByte() << 8); + num |= (uint)((uint)this.m_buf.ReadByte() << 16); + return (int)(num | (uint)((uint)this.m_buf.ReadByte() << 24)); + } + + public uint ReadUInt32() + { + uint num = 0U; + num |= (uint)this.m_buf.ReadByte(); + num |= (uint)((uint)this.m_buf.ReadByte() << 8); + num |= (uint)((uint)this.m_buf.ReadByte() << 16); + return num | (uint)((uint)this.m_buf.ReadByte() << 24); + } + + public long ReadInt64() + { + ulong num = 0UL; + ulong num2 = (ulong)this.m_buf.ReadByte(); + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 8; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 16; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 24; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 32; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 40; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 48; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 56; + return (long)(num | num2); + } + + public ulong ReadUInt64() + { + ulong num = 0UL; + ulong num2 = (ulong)this.m_buf.ReadByte(); + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 8; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 16; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 24; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 32; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 40; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 48; + num |= num2; + num2 = (ulong)this.m_buf.ReadByte() << 56; + return num | num2; + } + + public decimal ReadDecimal() + { + return new decimal(new int[] + { + this.ReadInt32(), + this.ReadInt32(), + this.ReadInt32(), + this.ReadInt32() + }); + } + + public float ReadSingle() + { + uint value = this.ReadUInt32(); + return QSBFloatConversion.ToSingle(value); + } + + public double ReadDouble() + { + ulong value = this.ReadUInt64(); + return QSBFloatConversion.ToDouble(value); + } + + public string ReadString() + { + ushort num = this.ReadUInt16(); + string result; + if (num == 0) + { + result = ""; + } + else + { + if (num >= 32768) + { + throw new IndexOutOfRangeException("ReadString() too long: " + num); + } + while ((int)num > QSBNetworkReader.s_StringReaderBuffer.Length) + { + QSBNetworkReader.s_StringReaderBuffer = new byte[QSBNetworkReader.s_StringReaderBuffer.Length * 2]; + } + this.m_buf.ReadBytes(QSBNetworkReader.s_StringReaderBuffer, (uint)num); + char[] chars = QSBNetworkReader.s_Encoding.GetChars(QSBNetworkReader.s_StringReaderBuffer, 0, (int)num); + result = new string(chars); + } + return result; + } + + public char ReadChar() + { + return (char)this.m_buf.ReadByte(); + } + + public bool ReadBoolean() + { + int num = (int)this.m_buf.ReadByte(); + return num == 1; + } + + public byte[] ReadBytes(int count) + { + if (count < 0) + { + throw new IndexOutOfRangeException("NetworkReader ReadBytes " + count); + } + byte[] array = new byte[count]; + this.m_buf.ReadBytes(array, (uint)count); + return array; + } + + public byte[] ReadBytesAndSize() + { + ushort num = this.ReadUInt16(); + byte[] result; + if (num == 0) + { + result = new byte[0]; + } + else + { + result = this.ReadBytes((int)num); + } + return result; + } + + public Vector2 ReadVector2() + { + return new Vector2(this.ReadSingle(), this.ReadSingle()); + } + + public Vector3 ReadVector3() + { + return new Vector3(this.ReadSingle(), this.ReadSingle(), this.ReadSingle()); + } + + public Vector4 ReadVector4() + { + return new Vector4(this.ReadSingle(), this.ReadSingle(), this.ReadSingle(), this.ReadSingle()); + } + + public Color ReadColor() + { + return new Color(this.ReadSingle(), this.ReadSingle(), this.ReadSingle(), this.ReadSingle()); + } + + public Color32 ReadColor32() + { + return new Color32(this.ReadByte(), this.ReadByte(), this.ReadByte(), this.ReadByte()); + } + + public Quaternion ReadQuaternion() + { + return new Quaternion(this.ReadSingle(), this.ReadSingle(), this.ReadSingle(), this.ReadSingle()); + } + + public Rect ReadRect() + { + return new Rect(this.ReadSingle(), this.ReadSingle(), this.ReadSingle(), this.ReadSingle()); + } + + public Plane ReadPlane() + { + return new Plane(this.ReadVector3(), this.ReadSingle()); + } + + public Ray ReadRay() + { + return new Ray(this.ReadVector3(), this.ReadVector3()); + } + + public Matrix4x4 ReadMatrix4x4() + { + return new Matrix4x4 + { + m00 = this.ReadSingle(), + m01 = this.ReadSingle(), + m02 = this.ReadSingle(), + m03 = this.ReadSingle(), + m10 = this.ReadSingle(), + m11 = this.ReadSingle(), + m12 = this.ReadSingle(), + m13 = this.ReadSingle(), + m20 = this.ReadSingle(), + m21 = this.ReadSingle(), + m22 = this.ReadSingle(), + m23 = this.ReadSingle(), + m30 = this.ReadSingle(), + m31 = this.ReadSingle(), + m32 = this.ReadSingle(), + m33 = this.ReadSingle() + }; + } + + public NetworkHash128 ReadNetworkHash128() + { + NetworkHash128 result; + result.i0 = this.ReadByte(); + result.i1 = this.ReadByte(); + result.i2 = this.ReadByte(); + result.i3 = this.ReadByte(); + result.i4 = this.ReadByte(); + result.i5 = this.ReadByte(); + result.i6 = this.ReadByte(); + result.i7 = this.ReadByte(); + result.i8 = this.ReadByte(); + result.i9 = this.ReadByte(); + result.i10 = this.ReadByte(); + result.i11 = this.ReadByte(); + result.i12 = this.ReadByte(); + result.i13 = this.ReadByte(); + result.i14 = this.ReadByte(); + result.i15 = this.ReadByte(); + return result; + } + + public Transform ReadTransform() + { + NetworkInstanceId networkInstanceId = this.ReadNetworkId(); + Transform result; + if (networkInstanceId.IsEmpty()) + { + result = null; + } + else + { + GameObject gameObject = ClientScene.FindLocalObject(networkInstanceId); + if (gameObject == null) + { + if (LogFilter.logDebug) + { + Debug.Log("ReadTransform netId:" + networkInstanceId); + } + result = null; + } + else + { + result = gameObject.transform; + } + } + return result; + } + + public GameObject ReadGameObject() + { + NetworkInstanceId networkInstanceId = this.ReadNetworkId(); + GameObject result; + if (networkInstanceId.IsEmpty()) + { + result = null; + } + else + { + GameObject gameObject; + if (QSBNetworkServer.active) + { + gameObject = QSBNetworkServer.FindLocalObject(networkInstanceId); + } + else + { + gameObject = QSBClientScene.FindLocalObject(networkInstanceId); + } + if (gameObject == null) + { + if (LogFilter.logDebug) + { + Debug.Log("ReadGameObject netId:" + networkInstanceId + "go: null"); + } + } + result = gameObject; + } + return result; + } + + public QSBNetworkIdentity ReadNetworkIdentity() + { + NetworkInstanceId networkInstanceId = this.ReadNetworkId(); + QSBNetworkIdentity result; + if (networkInstanceId.IsEmpty()) + { + result = null; + } + else + { + GameObject gameObject; + if (QSBNetworkServer.active) + { + gameObject = QSBNetworkServer.FindLocalObject(networkInstanceId); + } + else + { + gameObject = QSBClientScene.FindLocalObject(networkInstanceId); + } + if (gameObject == null) + { + if (LogFilter.logDebug) + { + Debug.Log("ReadNetworkIdentity netId:" + networkInstanceId + "go: null"); + } + result = null; + } + else + { + result = gameObject.GetComponent(); + } + } + return result; + } + + public override string ToString() + { + return this.m_buf.ToString(); + } + + public TMsg ReadMessage() where TMsg : QSBMessageBase, new() + { + TMsg result = Activator.CreateInstance(); + result.Deserialize(this); + return result; + } + + private QSBNetBuffer m_buf; + + private const int k_MaxStringLength = 32768; + + private const int k_InitialStringBufferSize = 1024; + + private static byte[] s_StringReaderBuffer; + + private static Encoding s_Encoding; + } +} diff --git a/QSB/QuantumUNET/QSBNetworkServer.cs b/QSB/QuantumUNET/QSBNetworkServer.cs index add02953..6b960dcf 100644 --- a/QSB/QuantumUNET/QSBNetworkServer.cs +++ b/QSB/QuantumUNET/QSBNetworkServer.cs @@ -235,7 +235,7 @@ namespace QSB.QuantumUNET { m_SimpleServerSimple.RegisterHandlerSafe((short)35, new QSBNetworkMessageDelegate(OnClientReadyMessage)); m_SimpleServerSimple.RegisterHandlerSafe((short)5, new QSBNetworkMessageDelegate(OnCommandMessage)); - m_SimpleServerSimple.RegisterHandlerSafe((short)6, new QSBNetworkMessageDelegate(QSBNetworkTransform.HandleTransform)); + m_SimpleServerSimple.RegisterHandlerSafe(6, new QSBNetworkMessageDelegate(QSBNetworkTransform.HandleTransform)); //m_SimpleServerSimple.RegisterHandlerSafe((short)16, new QSBNetworkMessageDelegate(NetworkTransformChild.HandleChildTransform)); m_SimpleServerSimple.RegisterHandlerSafe((short)38, new QSBNetworkMessageDelegate(OnRemovePlayerMessage)); m_SimpleServerSimple.RegisterHandlerSafe((short)40, new QSBNetworkMessageDelegate(QSBNetworkAnimator.OnAnimationServerMessage)); @@ -282,12 +282,12 @@ namespace QSB.QuantumUNET return true; } - public static QSBNetworkClient BecomeHost(QSBNetworkClient oldClient, int port, MatchInfo matchInfo, int oldConnectionId, PeerInfoMessage[] peers) + public static QSBNetworkClient BecomeHost(QSBNetworkClient oldClient, int port, MatchInfo matchInfo, int oldConnectionId, QSBPeerInfoMessage[] peers) { return instance.BecomeHostInternal(oldClient, port, matchInfo, oldConnectionId, peers); } - internal QSBNetworkClient BecomeHostInternal(QSBNetworkClient oldClient, int port, MatchInfo matchInfo, int oldConnectionId, PeerInfoMessage[] peers) + internal QSBNetworkClient BecomeHostInternal(QSBNetworkClient oldClient, int port, MatchInfo matchInfo, int oldConnectionId, QSBPeerInfoMessage[] peers) { QSBNetworkClient result; if (s_Active) @@ -442,7 +442,7 @@ namespace QSB.QuantumUNET } } - public static bool SendToAll(short msgType, MessageBase msg) + public static bool SendToAll(short msgType, QSBMessageBase msg) { Debug.Log("Server.SendToAll msgType:" + msgType); var flag = true; @@ -457,7 +457,7 @@ namespace QSB.QuantumUNET return flag; } - private static bool SendToObservers(GameObject contextObj, short msgType, MessageBase msg) + private static bool SendToObservers(GameObject contextObj, short msgType, QSBMessageBase msg) { Debug.Log("Server.SendToObservers id:" + msgType); var flag = true; @@ -480,7 +480,7 @@ namespace QSB.QuantumUNET return result; } - public static bool SendToReady(GameObject contextObj, short msgType, MessageBase msg) + public static bool SendToReady(GameObject contextObj, short msgType, QSBMessageBase msg) { Debug.Log("Server.SendToReady id:" + msgType); bool result; @@ -521,18 +521,21 @@ namespace QSB.QuantumUNET return result; } - public static void SendWriterToReady(GameObject contextObj, NetworkWriter writer, int channelId) + public static void SendWriterToReady(GameObject contextObj, QSBNetworkWriter writer, int channelId) { + DebugLog.DebugWrite("send writer to ready"); var arraySegment = (ArraySegment)writer.GetType().GetMethod("AsArraySegment").Invoke(writer, null); if (arraySegment.Count > 32767) { throw new UnityException("NetworkWriter used buffer is too big!"); } + DebugLog.DebugWrite("pre send bytes"); SendBytesToReady(contextObj, arraySegment.Array, arraySegment.Count, channelId); } public static void SendBytesToReady(GameObject contextObj, byte[] buffer, int numBytes, int channelId) { + DebugLog.DebugWrite("send bytes to ready"); if (contextObj == null) { var flag = true; @@ -541,18 +544,20 @@ namespace QSB.QuantumUNET var networkConnection = connections[i]; if (networkConnection != null && networkConnection.isReady) { + DebugLog.DebugWrite($"sending bytes to connection {networkConnection.connectionId}"); if (!networkConnection.SendBytes(buffer, numBytes, channelId)) { flag = false; } } + else + { + DebugLog.DebugWrite($"- Connection {networkConnection.connectionId} is not ready!"); + } } if (!flag) { - if (LogFilter.logWarn) - { - Debug.LogWarning("SendBytesToReady failed"); - } + DebugLog.DebugWrite("SendBytesToReady failed"); } } else @@ -567,26 +572,25 @@ namespace QSB.QuantumUNET var networkConnection2 = component.Observers[j]; if (networkConnection2.isReady) { + DebugLog.DebugWrite($"sending bytes to connection {networkConnection2.connectionId}"); if (!networkConnection2.SendBytes(buffer, numBytes, channelId)) { flag2 = false; } } + else + { + DebugLog.DebugWrite($"- Connection {networkConnection2.connectionId} is not ready!"); + } } if (!flag2) { - if (LogFilter.logWarn) - { - Debug.LogWarning("SendBytesToReady failed for " + contextObj); - } + DebugLog.DebugWrite("SendBytesToReady failed for " + contextObj); } } catch (NullReferenceException) { - if (LogFilter.logWarn) - { - Debug.LogWarning("SendBytesToReady object " + contextObj + " has not been spawned"); - } + DebugLog.DebugWrite("SendBytesToReady object " + contextObj + " has not been spawned"); } } } @@ -610,7 +614,7 @@ namespace QSB.QuantumUNET } } - public static bool SendUnreliableToAll(short msgType, MessageBase msg) + public static bool SendUnreliableToAll(short msgType, QSBMessageBase msg) { Debug.Log("Server.SendUnreliableToAll msgType:" + msgType); var flag = true; @@ -625,7 +629,7 @@ namespace QSB.QuantumUNET return flag; } - public static bool SendUnreliableToReady(GameObject contextObj, short msgType, MessageBase msg) + public static bool SendUnreliableToReady(GameObject contextObj, short msgType, QSBMessageBase msg) { Debug.Log("Server.SendUnreliableToReady id:" + msgType); bool result; @@ -659,7 +663,7 @@ namespace QSB.QuantumUNET return result; } - public static bool SendByChannelToAll(short msgType, MessageBase msg, int channelId) + public static bool SendByChannelToAll(short msgType, QSBMessageBase msg, int channelId) { Debug.Log("Server.SendByChannelToAll id:" + msgType); var flag = true; @@ -674,7 +678,7 @@ namespace QSB.QuantumUNET return flag; } - public static bool SendByChannelToReady(GameObject contextObj, short msgType, MessageBase msg, int channelId) + public static bool SendByChannelToReady(GameObject contextObj, short msgType, QSBMessageBase msg, int channelId) { Debug.Log("Server.SendByChannelToReady msgType:" + msgType); bool result; @@ -857,11 +861,11 @@ namespace QSB.QuantumUNET { if (handlers.ContainsKey(34)) { - var errorMessage = new ErrorMessage(); + var errorMessage = new QSBErrorMessage(); errorMessage.errorCode = error; - var writer = new NetworkWriter(); + var writer = new QSBNetworkWriter(); errorMessage.Serialize(writer); - var reader = new NetworkReader(writer); + var reader = new QSBNetworkReader(writer); conn.InvokeHandler(34, reader, 0); } } @@ -928,7 +932,7 @@ namespace QSB.QuantumUNET } } - public static void SendToClientOfPlayer(GameObject player, short msgType, MessageBase msg) + public static void SendToClientOfPlayer(GameObject player, short msgType, QSBMessageBase msg) { for (var i = 0; i < connections.Count; i++) { @@ -952,7 +956,7 @@ namespace QSB.QuantumUNET } } - public static void SendToClient(int connectionId, short msgType, MessageBase msg) + public static void SendToClient(int connectionId, short msgType, QSBMessageBase msg) { if (connectionId < connections.Count) { @@ -1361,7 +1365,7 @@ namespace QSB.QuantumUNET } conn.isReady = false; conn.RemoveObservers(); - var msg = new NotReadyMessage(); + var msg = new QSBNotReadyMessage(); conn.Send(36, msg); } } @@ -1491,7 +1495,7 @@ namespace QSB.QuantumUNET objectSpawnMessage.assetId = uv.AssetId; objectSpawnMessage.Position = uv.transform.position; objectSpawnMessage.Rotation = uv.transform.rotation; - var networkWriter = new NetworkWriter(); + var networkWriter = new QSBNetworkWriter(); uv.UNetSerializeAllVars(networkWriter); if (networkWriter.Position > 0) { @@ -1512,7 +1516,7 @@ namespace QSB.QuantumUNET objectSpawnSceneMessage.NetId = uv.NetId; objectSpawnSceneMessage.SceneId = uv.SceneId; objectSpawnSceneMessage.Position = uv.transform.position; - var networkWriter2 = new NetworkWriter(); + var networkWriter2 = new QSBNetworkWriter(); uv.UNetSerializeAllVars(networkWriter2); if (networkWriter2.Position > 0) { @@ -1736,7 +1740,7 @@ namespace QSB.QuantumUNET internal bool InvokeBytes(QSBULocalConnectionToServer conn, byte[] buffer, int numBytes, int channelId) { - var networkReader = new NetworkReader(buffer); + var networkReader = new QSBNetworkReader(buffer); networkReader.ReadInt16(); var num = networkReader.ReadInt16(); bool result; @@ -1752,14 +1756,14 @@ namespace QSB.QuantumUNET return result; } - internal bool InvokeHandlerOnServer(QSBULocalConnectionToServer conn, short msgType, MessageBase msg, int channelId) + internal bool InvokeHandlerOnServer(QSBULocalConnectionToServer conn, short msgType, QSBMessageBase msg, int channelId) { bool result; if (handlers.ContainsKey(msgType) && m_LocalConnection != null) { - var writer = new NetworkWriter(); + var writer = new QSBNetworkWriter(); msg.Serialize(writer); - var reader = new NetworkReader(writer); + var reader = new QSBNetworkReader(writer); m_LocalConnection.InvokeHandler(msgType, reader, channelId); result = true; } diff --git a/QSB/QuantumUNET/QSBNetworkServerSimple.cs b/QSB/QuantumUNET/QSBNetworkServerSimple.cs index dc798162..af00b21f 100644 --- a/QSB/QuantumUNET/QSBNetworkServerSimple.cs +++ b/QSB/QuantumUNET/QSBNetworkServerSimple.cs @@ -1,4 +1,5 @@ -using System; +using QSB.Utility; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using UnityEngine; @@ -235,7 +236,8 @@ namespace QSB.QuantumUNET internal void RegisterHandlerSafe(short msgType, QSBNetworkMessageDelegate handler) { - this.m_MessageHandlers.RegisterHandlerSafe(msgType, handler); + DebugLog.DebugWrite($"Registering message {msgType}."); + m_MessageHandlers.RegisterHandlerSafe(msgType, handler); } public void RegisterHandler(short msgType, QSBNetworkMessageDelegate handler) @@ -498,7 +500,7 @@ namespace QSB.QuantumUNET } } - public void SendWriterTo(int connectionId, NetworkWriter writer, int channelId) + public void SendWriterTo(int connectionId, QSBNetworkWriter writer, int channelId) { QSBNetworkConnection networkConnection = this.FindConnection(connectionId); if (networkConnection != null) diff --git a/QSB/QuantumUNET/QSBNetworkTransform.cs b/QSB/QuantumUNET/QSBNetworkTransform.cs index 1c2dac6e..efbf316c 100644 --- a/QSB/QuantumUNET/QSBNetworkTransform.cs +++ b/QSB/QuantumUNET/QSBNetworkTransform.cs @@ -1,4 +1,5 @@ -using System; +using QSB.Utility; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,179 +10,33 @@ namespace QSB.QuantumUNET { public class QSBNetworkTransform : QSBNetworkBehaviour { - public TransformSyncMode transformSyncMode - { - get - { - return this.m_TransformSyncMode; - } - set - { - this.m_TransformSyncMode = value; - } - } + public float SendInterval { get; set; } = 0.1f; - public float sendInterval - { - get - { - return this.m_SendInterval; - } - set - { - this.m_SendInterval = value; - } - } + public AxisSyncMode SyncRotationAxis { get; set; } = AxisSyncMode.AxisXYZ; - public AxisSyncMode syncRotationAxis - { - get - { - return this.m_SyncRotationAxis; - } - set - { - this.m_SyncRotationAxis = value; - } - } + public CompressionSyncMode RotationSyncCompression { get; set; } = CompressionSyncMode.None; - public CompressionSyncMode rotationSyncCompression - { - get - { - return this.m_RotationSyncCompression; - } - set - { - this.m_RotationSyncCompression = value; - } - } + public bool SyncSpin { get; set; } - public bool syncSpin - { - get - { - return this.m_SyncSpin; - } - set - { - this.m_SyncSpin = value; - } - } + public float MovementTheshold { get; set; } = 0.001f; - public float movementTheshold - { - get - { - return this.m_MovementTheshold; - } - set - { - this.m_MovementTheshold = value; - } - } + public float velocityThreshold { get; set; } = 0.0001f; - public float velocityThreshold - { - get - { - return this.m_VelocityThreshold; - } - set - { - this.m_VelocityThreshold = value; - } - } + public float SnapThreshold { get; set; } = 5f; - public float snapThreshold - { - get - { - return this.m_SnapThreshold; - } - set - { - this.m_SnapThreshold = value; - } - } + public float InterpolateRotation { get; set; } = 1f; - public float interpolateRotation - { - get - { - return this.m_InterpolateRotation; - } - set - { - this.m_InterpolateRotation = value; - } - } + public float InterpolateMovement { get; set; } = 1f; - public float interpolateMovement - { - get - { - return this.m_InterpolateMovement; - } - set - { - this.m_InterpolateMovement = value; - } - } + public ClientMoveCallback3D clientMoveCallback3D { get; set; } - public ClientMoveCallback3D clientMoveCallback3D - { - get - { - return this.m_ClientMoveCallback3D; - } - set - { - this.m_ClientMoveCallback3D = value; - } - } + public float LastSyncTime { get; private set; } - public ClientMoveCallback2D clientMoveCallback2D + public Vector3 TargetSyncPosition { get { - return this.m_ClientMoveCallback2D; - } - set - { - this.m_ClientMoveCallback2D = value; - } - } - - public CharacterController characterContoller - { - get - { - return this.m_CharacterController; - } - } - - public Rigidbody rigidbody3D - { - get - { - return this.m_RigidBody3D; - } - } - - public float lastSyncTime - { - get - { - return this.m_LastClientSyncTime; - } - } - - public Vector3 targetSyncPosition - { - get - { - return this.m_TargetSyncPosition; + return m_TargetSyncPosition; } } @@ -189,7 +44,7 @@ namespace QSB.QuantumUNET { get { - return this.m_TargetSyncVelocity; + return m_TargetSyncVelocity; } } @@ -197,200 +52,90 @@ namespace QSB.QuantumUNET { get { - return this.m_TargetSyncRotation3D; + return m_TargetSyncRotation3D; } } - public bool grounded - { - get - { - return this.m_Grounded; - } - set - { - this.m_Grounded = value; - } - } + public bool Grounded { get; set; } = true; private void OnValidate() { - if (this.m_TransformSyncMode < TransformSyncMode.SyncNone || this.m_TransformSyncMode > TransformSyncMode.SyncCharacterController) + if (SendInterval < 0f) { - this.m_TransformSyncMode = TransformSyncMode.SyncTransform; + SendInterval = 0f; } - if (this.m_SendInterval < 0f) + if (SyncRotationAxis < AxisSyncMode.None || SyncRotationAxis > AxisSyncMode.AxisXYZ) { - this.m_SendInterval = 0f; + SyncRotationAxis = AxisSyncMode.None; } - if (this.m_SyncRotationAxis < AxisSyncMode.None || this.m_SyncRotationAxis > AxisSyncMode.AxisXYZ) + if (MovementTheshold < 0f) { - this.m_SyncRotationAxis = AxisSyncMode.None; + MovementTheshold = 0f; } - if (this.m_MovementTheshold < 0f) + if (velocityThreshold < 0f) { - this.m_MovementTheshold = 0f; + velocityThreshold = 0f; } - if (this.m_VelocityThreshold < 0f) + if (SnapThreshold < 0f) { - this.m_VelocityThreshold = 0f; + SnapThreshold = 0.01f; } - if (this.m_SnapThreshold < 0f) + if (InterpolateRotation < 0f) { - this.m_SnapThreshold = 0.01f; + InterpolateRotation = 0.01f; } - if (this.m_InterpolateRotation < 0f) + if (InterpolateMovement < 0f) { - this.m_InterpolateRotation = 0.01f; - } - if (this.m_InterpolateMovement < 0f) - { - this.m_InterpolateMovement = 0.01f; + InterpolateMovement = 0.01f; } } private void Awake() { - this.m_RigidBody3D = base.GetComponent(); - this.m_CharacterController = base.GetComponent(); - this.m_PrevPosition = base.transform.position; - this.m_PrevRotation = base.transform.rotation; - this.m_PrevVelocity = 0f; - if (base.LocalPlayerAuthority) + m_PrevPosition = transform.position; + m_PrevRotation = transform.rotation; + if (LocalPlayerAuthority) { - this.m_LocalTransformWriter = new NetworkWriter(); + m_LocalTransformWriter = new QSBNetworkWriter(); } } public override void OnStartServer() { - this.m_LastClientSyncTime = 0f; + LastSyncTime = 0f; } - public override bool OnSerialize(NetworkWriter writer, bool initialState) + public override bool OnSerialize(QSBNetworkWriter writer, bool initialState) { if (!initialState) { - if (base.SyncVarDirtyBits == 0U) + if (SyncVarDirtyBits == 0U) { + DebugLog.DebugWrite("dirty bits = 0, abort"); writer.WritePackedUInt32(0U); return false; } writer.WritePackedUInt32(1U); } - switch (this.transformSyncMode) - { - case TransformSyncMode.SyncNone: - return false; - case TransformSyncMode.SyncTransform: - this.SerializeModeTransform(writer); - break; - case TransformSyncMode.SyncRigidbody3D: - this.SerializeMode3D(writer); - break; - case TransformSyncMode.SyncCharacterController: - this.SerializeModeCharacterController(writer); - break; - } + SerializeModeTransform(writer); return true; } - private void SerializeModeTransform(NetworkWriter writer) + private void SerializeModeTransform(QSBNetworkWriter writer) { - writer.Write(base.transform.position); - if (this.m_SyncRotationAxis != AxisSyncMode.None) + DebugLog.DebugWrite("serialize"); + writer.Write(transform.position); + if (SyncRotationAxis != AxisSyncMode.None) { - SerializeRotation3D(writer, base.transform.rotation, this.syncRotationAxis, this.rotationSyncCompression); + SerializeRotation3D(writer, transform.rotation, SyncRotationAxis, RotationSyncCompression); } - this.m_PrevPosition = base.transform.position; - this.m_PrevRotation = base.transform.rotation; - this.m_PrevVelocity = 0f; + m_PrevPosition = transform.position; + m_PrevRotation = transform.rotation; } - private void VerifySerializeComponentExists() + public override void OnDeserialize(QSBNetworkReader reader, bool initialState) { - bool flag = false; - Type type = null; - TransformSyncMode transformSyncMode = this.transformSyncMode; - if (transformSyncMode != TransformSyncMode.SyncCharacterController) - { - if (transformSyncMode == TransformSyncMode.SyncRigidbody3D) - { - if (!this.m_RigidBody3D && !(this.m_RigidBody3D = base.GetComponent())) - { - flag = true; - type = typeof(Rigidbody); - } - } - } - else if (!this.m_CharacterController && !(this.m_CharacterController = base.GetComponent())) - { - flag = true; - type = typeof(CharacterController); - } - if (flag && type != null) - { - throw new InvalidOperationException(string.Format("transformSyncMode set to {0} but no {1} component was found, did you call QSBNetworkServer.Spawn on a prefab?", this.transformSyncMode, type.Name)); - } - } - - private void SerializeMode3D(NetworkWriter writer) - { - this.VerifySerializeComponentExists(); - if (base.IsServer && this.m_LastClientSyncTime != 0f) - { - writer.Write(this.m_TargetSyncPosition); - SerializeVelocity3D(writer, this.m_TargetSyncVelocity, NetworkTransform.CompressionSyncMode.None); - if (this.syncRotationAxis != AxisSyncMode.None) - { - SerializeRotation3D(writer, this.m_TargetSyncRotation3D, this.syncRotationAxis, this.rotationSyncCompression); - } - } - else - { - writer.Write(this.m_RigidBody3D.position); - NetworkTransform.SerializeVelocity3D(writer, this.m_RigidBody3D.velocity, NetworkTransform.CompressionSyncMode.None); - if (this.syncRotationAxis != AxisSyncMode.None) - { - SerializeRotation3D(writer, this.m_RigidBody3D.rotation, this.syncRotationAxis, this.rotationSyncCompression); - } - } - if (this.m_SyncSpin) - { - SerializeSpin3D(writer, this.m_RigidBody3D.angularVelocity, this.syncRotationAxis, this.rotationSyncCompression); - } - this.m_PrevPosition = this.m_RigidBody3D.position; - this.m_PrevRotation = base.transform.rotation; - this.m_PrevVelocity = this.m_RigidBody3D.velocity.sqrMagnitude; - } - - private void SerializeModeCharacterController(NetworkWriter writer) - { - this.VerifySerializeComponentExists(); - if (base.IsServer && this.m_LastClientSyncTime != 0f) - { - writer.Write(this.m_TargetSyncPosition); - if (this.syncRotationAxis != AxisSyncMode.None) - { - SerializeRotation3D(writer, this.m_TargetSyncRotation3D, this.syncRotationAxis, this.rotationSyncCompression); - } - } - else - { - writer.Write(base.transform.position); - if (this.syncRotationAxis != AxisSyncMode.None) - { - SerializeRotation3D(writer, base.transform.rotation, this.syncRotationAxis, this.rotationSyncCompression); - } - } - this.m_PrevPosition = base.transform.position; - this.m_PrevRotation = base.transform.rotation; - this.m_PrevVelocity = 0f; - } - - public override void OnDeserialize(NetworkReader reader, bool initialState) - { - if (!base.IsServer || !QSBNetworkServer.localClientActive) + if (!IsServer || !QSBNetworkServer.localClientActive) { if (!initialState) { @@ -399,317 +144,70 @@ namespace QSB.QuantumUNET return; } } - switch (this.transformSyncMode) - { - case TransformSyncMode.SyncNone: - return; - case TransformSyncMode.SyncTransform: - this.UnserializeModeTransform(reader, initialState); - break; - case TransformSyncMode.SyncRigidbody3D: - this.UnserializeMode3D(reader, initialState); - break; - case TransformSyncMode.SyncCharacterController: - this.UnserializeModeCharacterController(reader, initialState); - break; - } - this.m_LastClientSyncTime = Time.time; + UnserializeModeTransform(reader, initialState); + LastSyncTime = Time.time; } } - private void UnserializeModeTransform(NetworkReader reader, bool initialState) + private void UnserializeModeTransform(QSBNetworkReader reader, bool initialState) { - if (base.HasAuthority) + if (HasAuthority) { reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) + if (SyncRotationAxis != AxisSyncMode.None) { - UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); + UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); } } - else if (base.IsServer && this.m_ClientMoveCallback3D != null) + else if (IsServer && clientMoveCallback3D != null) { - Vector3 position = reader.ReadVector3(); - Vector3 zero = Vector3.zero; - Quaternion rotation = Quaternion.identity; - if (this.syncRotationAxis != AxisSyncMode.None) + var position = reader.ReadVector3(); + var zero = Vector3.zero; + var rotation = Quaternion.identity; + if (SyncRotationAxis != AxisSyncMode.None) { - rotation = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); + rotation = UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); } - if (this.m_ClientMoveCallback3D(ref position, ref zero, ref rotation)) + if (clientMoveCallback3D(ref position, ref zero, ref rotation)) { - base.transform.position = position; - if (this.syncRotationAxis != AxisSyncMode.None) + transform.position = position; + if (SyncRotationAxis != AxisSyncMode.None) { - base.transform.rotation = rotation; + transform.rotation = rotation; } } } else { - base.transform.position = reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) + transform.position = reader.ReadVector3(); + if (SyncRotationAxis != AxisSyncMode.None) { - base.transform.rotation = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - } - } - - private void UnserializeMode3D(NetworkReader reader, bool initialState) - { - if (base.HasAuthority) - { - reader.ReadVector3(); - reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) - { - UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - if (this.syncSpin) - { - UnserializeSpin3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - } - else - { - if (base.IsServer && this.m_ClientMoveCallback3D != null) - { - Vector3 targetSyncPosition = reader.ReadVector3(); - Vector3 targetSyncVelocity = reader.ReadVector3(); - Quaternion targetSyncRotation3D = Quaternion.identity; - if (this.syncRotationAxis != AxisSyncMode.None) - { - targetSyncRotation3D = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - if (!this.m_ClientMoveCallback3D(ref targetSyncPosition, ref targetSyncVelocity, ref targetSyncRotation3D)) - { - return; - } - this.m_TargetSyncPosition = targetSyncPosition; - this.m_TargetSyncVelocity = targetSyncVelocity; - if (this.syncRotationAxis != AxisSyncMode.None) - { - this.m_TargetSyncRotation3D = targetSyncRotation3D; - } - } - else - { - this.m_TargetSyncPosition = reader.ReadVector3(); - this.m_TargetSyncVelocity = reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) - { - this.m_TargetSyncRotation3D = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - } - if (this.syncSpin) - { - this.m_TargetSyncAngularVelocity3D = UnserializeSpin3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - if (!(this.m_RigidBody3D == null)) - { - if (base.IsServer && !base.IsClient) - { - this.m_RigidBody3D.MovePosition(this.m_TargetSyncPosition); - this.m_RigidBody3D.MoveRotation(this.m_TargetSyncRotation3D); - this.m_RigidBody3D.velocity = this.m_TargetSyncVelocity; - } - else if (this.GetNetworkSendInterval() == 0f) - { - this.m_RigidBody3D.MovePosition(this.m_TargetSyncPosition); - this.m_RigidBody3D.velocity = this.m_TargetSyncVelocity; - if (this.syncRotationAxis != AxisSyncMode.None) - { - this.m_RigidBody3D.MoveRotation(this.m_TargetSyncRotation3D); - } - if (this.syncSpin) - { - this.m_RigidBody3D.angularVelocity = this.m_TargetSyncAngularVelocity3D; - } - } - else - { - float magnitude = (this.m_RigidBody3D.position - this.m_TargetSyncPosition).magnitude; - if (magnitude > this.snapThreshold) - { - this.m_RigidBody3D.position = this.m_TargetSyncPosition; - this.m_RigidBody3D.velocity = this.m_TargetSyncVelocity; - } - if (this.interpolateRotation == 0f && this.syncRotationAxis != AxisSyncMode.None) - { - this.m_RigidBody3D.rotation = this.m_TargetSyncRotation3D; - if (this.syncSpin) - { - this.m_RigidBody3D.angularVelocity = this.m_TargetSyncAngularVelocity3D; - } - } - if (this.m_InterpolateMovement == 0f) - { - this.m_RigidBody3D.position = this.m_TargetSyncPosition; - } - if (initialState && this.syncRotationAxis != AxisSyncMode.None) - { - this.m_RigidBody3D.rotation = this.m_TargetSyncRotation3D; - } - } - } - } - } - - private void UnserializeModeCharacterController(NetworkReader reader, bool initialState) - { - if (base.HasAuthority) - { - reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) - { - UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - } - else - { - if (base.IsServer && this.m_ClientMoveCallback3D != null) - { - Vector3 targetSyncPosition = reader.ReadVector3(); - Quaternion targetSyncRotation3D = Quaternion.identity; - if (this.syncRotationAxis != AxisSyncMode.None) - { - targetSyncRotation3D = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - if (this.m_CharacterController == null) - { - return; - } - Vector3 velocity = this.m_CharacterController.velocity; - if (!this.m_ClientMoveCallback3D(ref targetSyncPosition, ref velocity, ref targetSyncRotation3D)) - { - return; - } - this.m_TargetSyncPosition = targetSyncPosition; - this.m_TargetSyncVelocity = velocity; - if (this.syncRotationAxis != AxisSyncMode.None) - { - this.m_TargetSyncRotation3D = targetSyncRotation3D; - } - } - else - { - this.m_TargetSyncPosition = reader.ReadVector3(); - if (this.syncRotationAxis != AxisSyncMode.None) - { - this.m_TargetSyncRotation3D = UnserializeRotation3D(reader, this.syncRotationAxis, this.rotationSyncCompression); - } - } - if (!(this.m_CharacterController == null)) - { - Vector3 a = this.m_TargetSyncPosition - base.transform.position; - Vector3 a2 = a / this.GetNetworkSendInterval(); - this.m_FixedPosDiff = a2 * Time.fixedDeltaTime; - if (base.IsServer && !base.IsClient) - { - base.transform.position = this.m_TargetSyncPosition; - base.transform.rotation = this.m_TargetSyncRotation3D; - } - else if (this.GetNetworkSendInterval() == 0f) - { - base.transform.position = this.m_TargetSyncPosition; - if (this.syncRotationAxis != AxisSyncMode.None) - { - base.transform.rotation = this.m_TargetSyncRotation3D; - } - } - else - { - float magnitude = (base.transform.position - this.m_TargetSyncPosition).magnitude; - if (magnitude > this.snapThreshold) - { - base.transform.position = this.m_TargetSyncPosition; - } - if (this.interpolateRotation == 0f && this.syncRotationAxis != AxisSyncMode.None) - { - base.transform.rotation = this.m_TargetSyncRotation3D; - } - if (this.m_InterpolateMovement == 0f) - { - base.transform.position = this.m_TargetSyncPosition; - } - if (initialState && this.syncRotationAxis != AxisSyncMode.None) - { - base.transform.rotation = this.m_TargetSyncRotation3D; - } - } + transform.rotation = UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); } } } private void FixedUpdate() { - if (base.IsServer) + if (IsServer) { - this.FixedUpdateServer(); - } - if (base.IsClient) - { - this.FixedUpdateClient(); + FixedUpdateServer(); } } private void FixedUpdateServer() { - if (base.SyncVarDirtyBits == 0U) + if (SyncVarDirtyBits == 0U) { if (QSBNetworkServer.active) { - if (base.IsServer) + if (IsServer) { - if (this.GetNetworkSendInterval() != 0f) + if (GetNetworkSendInterval() != 0f) { - float num = (base.transform.position - this.m_PrevPosition).magnitude; - if (num < this.movementTheshold) + if (HasMoved()) { - num = Quaternion.Angle(this.m_PrevRotation, base.transform.rotation); - if (num < this.movementTheshold) - { - if (!this.CheckVelocityChanged()) - { - return; - } - } - } - base.SetDirtyBit(1U); - } - } - } - } - } - - private bool CheckVelocityChanged() - { - TransformSyncMode transformSyncMode = this.transformSyncMode; - bool result = (transformSyncMode == TransformSyncMode.SyncRigidbody3D && (this.m_RigidBody3D && this.m_VelocityThreshold > 0f) && Mathf.Abs(this.m_RigidBody3D.velocity.sqrMagnitude - this.m_PrevVelocity) >= this.m_VelocityThreshold); - return result; - } - - private void FixedUpdateClient() - { - if (this.m_LastClientSyncTime != 0f) - { - if (QSBNetworkServer.active || QSBNetworkClient.active) - { - if (base.IsServer || base.IsClient) - { - if (this.GetNetworkSendInterval() != 0f) - { - if (!base.HasAuthority) - { - switch (this.transformSyncMode) - { - case TransformSyncMode.SyncRigidbody3D: - this.InterpolateTransformMode3D(); - break; - case TransformSyncMode.SyncCharacterController: - this.InterpolateTransformModeCharacterController(); - break; - } + SetDirtyBit(1U); } } } @@ -717,53 +215,18 @@ namespace QSB.QuantumUNET } } - private void InterpolateTransformMode3D() - { - if (this.m_InterpolateMovement != 0f) - { - Vector3 velocity = (this.m_TargetSyncPosition - this.m_RigidBody3D.position) * this.m_InterpolateMovement / this.GetNetworkSendInterval(); - this.m_RigidBody3D.velocity = velocity; - } - if (this.interpolateRotation != 0f) - { - this.m_RigidBody3D.MoveRotation(Quaternion.Slerp(this.m_RigidBody3D.rotation, this.m_TargetSyncRotation3D, Time.fixedDeltaTime * this.interpolateRotation)); - } - this.m_TargetSyncPosition += this.m_TargetSyncVelocity * Time.fixedDeltaTime * 0.1f; - } - - private void InterpolateTransformModeCharacterController() - { - if (!(this.m_FixedPosDiff == Vector3.zero) || !(this.m_TargetSyncRotation3D == base.transform.rotation)) - { - if (this.m_InterpolateMovement != 0f) - { - this.m_CharacterController.Move(this.m_FixedPosDiff * this.m_InterpolateMovement); - } - if (this.interpolateRotation != 0f) - { - base.transform.rotation = Quaternion.Slerp(base.transform.rotation, this.m_TargetSyncRotation3D, Time.fixedDeltaTime * this.interpolateRotation * 10f); - } - if (Time.time - this.m_LastClientSyncTime > this.GetNetworkSendInterval()) - { - this.m_FixedPosDiff = Vector3.zero; - Vector3 motion = this.m_TargetSyncPosition - base.transform.position; - this.m_CharacterController.Move(motion); - } - } - } - private void Update() { - if (base.HasAuthority) + if (HasAuthority) { - if (base.LocalPlayerAuthority) + if (LocalPlayerAuthority) { if (!QSBNetworkServer.active) { - if (Time.time - this.m_LastClientSendTime > this.GetNetworkSendInterval()) + if (Time.time - m_LastClientSendTime > GetNetworkSendInterval()) { - this.SendTransform(); - this.m_LastClientSendTime = Time.time; + SendTransform(); + m_LastClientSendTime = Time.time; } } } @@ -772,15 +235,7 @@ namespace QSB.QuantumUNET private bool HasMoved() { - float num; - if (this.m_RigidBody3D != null) - { - num = (this.m_RigidBody3D.position - this.m_PrevPosition).magnitude; - } - else - { - num = (base.transform.position - this.m_PrevPosition).magnitude; - } + var num = (transform.position - m_PrevPosition).magnitude; bool result; if (num > 1E-05f) { @@ -788,24 +243,13 @@ namespace QSB.QuantumUNET } else { - if (this.m_RigidBody3D != null) - { - num = Quaternion.Angle(this.m_RigidBody3D.rotation, this.m_PrevRotation); - } - else - { - num = Quaternion.Angle(base.transform.rotation, this.m_PrevRotation); - } + num = Quaternion.Angle(transform.rotation, m_PrevRotation); if (num > 1E-05f) { result = true; } else { - if (this.m_RigidBody3D != null) - { - num = Mathf.Abs(this.m_RigidBody3D.velocity.sqrMagnitude - this.m_PrevVelocity); - } result = (num > 1E-05f); } } @@ -815,101 +259,55 @@ namespace QSB.QuantumUNET [Client] private void SendTransform() { - if (this.HasMoved() && QSBClientScene.readyConnection != null) + if (HasMoved() && QSBClientScene.readyConnection != null) { - this.m_LocalTransformWriter.StartMessage(6); - this.m_LocalTransformWriter.Write(base.NetId); - switch (this.transformSyncMode) - { - case TransformSyncMode.SyncNone: - return; - case TransformSyncMode.SyncTransform: - this.SerializeModeTransform(this.m_LocalTransformWriter); - break; - case TransformSyncMode.SyncRigidbody3D: - this.SerializeMode3D(this.m_LocalTransformWriter); - break; - case TransformSyncMode.SyncCharacterController: - this.SerializeModeCharacterController(this.m_LocalTransformWriter); - break; - } - if (this.m_RigidBody3D != null) - { - this.m_PrevPosition = this.m_RigidBody3D.position; - this.m_PrevRotation = this.m_RigidBody3D.rotation; - this.m_PrevVelocity = this.m_RigidBody3D.velocity.sqrMagnitude; - } - else - { - this.m_PrevPosition = base.transform.position; - this.m_PrevRotation = base.transform.rotation; - } - this.m_LocalTransformWriter.FinishMessage(); - QSBClientScene.readyConnection.SendWriter(this.m_LocalTransformWriter, this.GetNetworkChannel()); + m_LocalTransformWriter.StartMessage(6); + m_LocalTransformWriter.Write(NetId); + SerializeModeTransform(m_LocalTransformWriter); + m_PrevPosition = transform.position; + m_PrevRotation = transform.rotation; + m_LocalTransformWriter.FinishMessage(); + QSBClientScene.readyConnection.SendWriter(m_LocalTransformWriter, GetNetworkChannel()); } } public static void HandleTransform(QSBNetworkMessage netMsg) { - NetworkInstanceId networkInstanceId = netMsg.Reader.ReadNetworkId(); - GameObject gameObject = QSBNetworkServer.FindLocalObject(networkInstanceId); + DebugLog.DebugWrite("handle transform"); + var networkInstanceId = netMsg.Reader.ReadNetworkId(); + var gameObject = QSBNetworkServer.FindLocalObject(networkInstanceId); if (gameObject == null) { - if (LogFilter.logError) - { - Debug.LogError("Received NetworkTransform data for GameObject that doesn't exist"); - } + DebugLog.DebugWrite("Received NetworkTransform data for GameObject that doesn't exist"); } else { - QSBNetworkTransform component = gameObject.GetComponent(); + var component = gameObject.GetComponent(); if (component == null) { - if (LogFilter.logError) - { - Debug.LogError("HandleTransform null target"); - } + DebugLog.DebugWrite("HandleTransform null target"); } else if (!component.LocalPlayerAuthority) { - if (LogFilter.logError) - { - Debug.LogError("HandleTransform no localPlayerAuthority"); - } + DebugLog.DebugWrite("HandleTransform no localPlayerAuthority"); } else if (netMsg.Connection.ClientOwnedObjects == null) { - if (LogFilter.logError) - { - Debug.LogError("HandleTransform object not owned by connection"); - } + DebugLog.DebugWrite("HandleTransform object not owned by connection"); } else if (netMsg.Connection.ClientOwnedObjects.Contains(networkInstanceId)) { - switch (component.transformSyncMode) - { - case TransformSyncMode.SyncNone: - return; - case TransformSyncMode.SyncTransform: - component.UnserializeModeTransform(netMsg.Reader, false); - break; - case TransformSyncMode.SyncRigidbody3D: - component.UnserializeMode3D(netMsg.Reader, false); - break; - case TransformSyncMode.SyncCharacterController: - component.UnserializeModeCharacterController(netMsg.Reader, false); - break; - } - component.m_LastClientSyncTime = Time.time; + component.UnserializeModeTransform(netMsg.Reader, false); + component.LastSyncTime = Time.time; } else if (LogFilter.logWarn) { - Debug.LogWarning("HandleTransform netId:" + networkInstanceId + " is not for a valid player"); + DebugLog.DebugWrite("HandleTransform netId:" + networkInstanceId + " is not for a valid player"); } } } - private static void WriteAngle(NetworkWriter writer, float angle, CompressionSyncMode compression) + private static void WriteAngle(QSBNetworkWriter writer, float angle, CompressionSyncMode compression) { if (compression != CompressionSyncMode.None) { @@ -931,7 +329,7 @@ namespace QSB.QuantumUNET } } - private static float ReadAngle(NetworkReader reader, CompressionSyncMode compression) + private static float ReadAngle(QSBNetworkReader reader, CompressionSyncMode compression) { float result; if (compression != CompressionSyncMode.None) @@ -959,12 +357,12 @@ namespace QSB.QuantumUNET return result; } - public static void SerializeVelocity3D(NetworkWriter writer, Vector3 velocity, NetworkTransform.CompressionSyncMode compression) + public static void SerializeVelocity3D(QSBNetworkWriter writer, Vector3 velocity, CompressionSyncMode compression) { writer.Write(velocity); } - public static void SerializeRotation3D(NetworkWriter writer, Quaternion rot, AxisSyncMode mode, CompressionSyncMode compression) + public static void SerializeRotation3D(QSBNetworkWriter writer, Quaternion rot, AxisSyncMode mode, CompressionSyncMode compression) { switch (mode) { @@ -997,7 +395,7 @@ namespace QSB.QuantumUNET } } - public static void SerializeSpin3D(NetworkWriter writer, Vector3 angularVelocity, AxisSyncMode mode, CompressionSyncMode compression) + public static void SerializeSpin3D(QSBNetworkWriter writer, Vector3 angularVelocity, AxisSyncMode mode, CompressionSyncMode compression) { switch (mode) { @@ -1030,15 +428,15 @@ namespace QSB.QuantumUNET } } - public static Vector3 UnserializeVelocity3D(NetworkReader reader, NetworkTransform.CompressionSyncMode compression) + public static Vector3 UnserializeVelocity3D(QSBNetworkReader reader, CompressionSyncMode compression) { return reader.ReadVector3(); } - public static Quaternion UnserializeRotation3D(NetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) + public static Quaternion UnserializeRotation3D(QSBNetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) { - Quaternion identity = Quaternion.identity; - Vector3 zero = Vector3.zero; + var identity = Quaternion.identity; + var zero = Vector3.zero; switch (mode) { case AxisSyncMode.AxisX: @@ -1073,9 +471,9 @@ namespace QSB.QuantumUNET return identity; } - public static Vector3 UnserializeSpin3D(NetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) + public static Vector3 UnserializeSpin3D(QSBNetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) { - Vector3 zero = Vector3.zero; + var zero = Vector3.zero; switch (mode) { case AxisSyncMode.AxisX: @@ -1110,56 +508,14 @@ namespace QSB.QuantumUNET public override float GetNetworkSendInterval() { - return this.m_SendInterval; + return SendInterval; } public override void OnStartAuthority() { - this.m_LastClientSyncTime = 0f; + LastSyncTime = 0f; } - [SerializeField] - private TransformSyncMode m_TransformSyncMode = TransformSyncMode.SyncNone; - - [SerializeField] - private float m_SendInterval = 0.1f; - - [SerializeField] - private AxisSyncMode m_SyncRotationAxis = AxisSyncMode.AxisXYZ; - - [SerializeField] - private CompressionSyncMode m_RotationSyncCompression = CompressionSyncMode.None; - - [SerializeField] - private bool m_SyncSpin; - - [SerializeField] - private float m_MovementTheshold = 0.001f; - - [SerializeField] - private float m_VelocityThreshold = 0.0001f; - - [SerializeField] - private float m_SnapThreshold = 5f; - - [SerializeField] - private float m_InterpolateRotation = 1f; - - [SerializeField] - private float m_InterpolateMovement = 1f; - - [SerializeField] - private ClientMoveCallback3D m_ClientMoveCallback3D; - - [SerializeField] - private ClientMoveCallback2D m_ClientMoveCallback2D; - - private Rigidbody m_RigidBody3D; - - private CharacterController m_CharacterController; - - private bool m_Grounded = true; - private Vector3 m_TargetSyncPosition; private Vector3 m_TargetSyncVelocity; @@ -1169,23 +525,12 @@ namespace QSB.QuantumUNET private Quaternion m_TargetSyncRotation3D; private Vector3 m_TargetSyncAngularVelocity3D; - - private float m_TargetSyncRotation2D; - - private float m_TargetSyncAngularVelocity2D; - - private float m_LastClientSyncTime; - private float m_LastClientSendTime; private Vector3 m_PrevPosition; private Quaternion m_PrevRotation; - private float m_PrevRotation2D; - - private float m_PrevVelocity; - private const float k_LocalMovementThreshold = 1E-05f; private const float k_LocalRotationThreshold = 1E-05f; @@ -1194,15 +539,7 @@ namespace QSB.QuantumUNET private const float k_MoveAheadRatio = 0.1f; - private NetworkWriter m_LocalTransformWriter; - - public enum TransformSyncMode - { - SyncNone, - SyncTransform, - SyncRigidbody3D, - SyncCharacterController - } + private QSBNetworkWriter m_LocalTransformWriter; public enum AxisSyncMode { @@ -1224,7 +561,5 @@ namespace QSB.QuantumUNET } public delegate bool ClientMoveCallback3D(ref Vector3 position, ref Vector3 velocity, ref Quaternion rotation); - - public delegate bool ClientMoveCallback2D(ref Vector2 position, ref Vector2 velocity, ref float rotation); } } diff --git a/QSB/QuantumUNET/QSBNetworkWriter.cs b/QSB/QuantumUNET/QSBNetworkWriter.cs new file mode 100644 index 00000000..2ac7b115 --- /dev/null +++ b/QSB/QuantumUNET/QSBNetworkWriter.cs @@ -0,0 +1,541 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBNetworkWriter + { + public QSBNetworkWriter() + { + this.m_Buffer = new QSBNetBuffer(); + if (s_Encoding == null) + { + s_Encoding = new UTF8Encoding(); + s_StringWriteBuffer = new byte[32768]; + } + } + + public QSBNetworkWriter(byte[] buffer) + { + this.m_Buffer = new QSBNetBuffer(buffer); + if (s_Encoding == null) + { + s_Encoding = new UTF8Encoding(); + s_StringWriteBuffer = new byte[32768]; + } + } + + public short Position + { + get + { + return (short)this.m_Buffer.Position; + } + } + + public byte[] ToArray() + { + byte[] array = new byte[this.m_Buffer.AsArraySegment().Count]; + Array.Copy(this.m_Buffer.AsArraySegment().Array, array, this.m_Buffer.AsArraySegment().Count); + return array; + } + + public byte[] AsArray() + { + return this.AsArraySegment().Array; + } + + internal ArraySegment AsArraySegment() + { + return this.m_Buffer.AsArraySegment(); + } + + public void WritePackedUInt32(uint value) + { + if (value <= 240U) + { + this.Write((byte)value); + } + else if (value <= 2287U) + { + this.Write((byte)((value - 240U) / 256U + 241U)); + this.Write((byte)((value - 240U) % 256U)); + } + else if (value <= 67823U) + { + this.Write(249); + this.Write((byte)((value - 2288U) / 256U)); + this.Write((byte)((value - 2288U) % 256U)); + } + else if (value <= 16777215U) + { + this.Write(250); + this.Write((byte)(value & 255U)); + this.Write((byte)(value >> 8 & 255U)); + this.Write((byte)(value >> 16 & 255U)); + } + else + { + this.Write(251); + this.Write((byte)(value & 255U)); + this.Write((byte)(value >> 8 & 255U)); + this.Write((byte)(value >> 16 & 255U)); + this.Write((byte)(value >> 24 & 255U)); + } + } + + public void WritePackedUInt64(ulong value) + { + if (value <= 240UL) + { + this.Write((byte)value); + } + else if (value <= 2287UL) + { + this.Write((byte)((value - 240UL) / 256UL + 241UL)); + this.Write((byte)((value - 240UL) % 256UL)); + } + else if (value <= 67823UL) + { + this.Write(249); + this.Write((byte)((value - 2288UL) / 256UL)); + this.Write((byte)((value - 2288UL) % 256UL)); + } + else if (value <= 16777215UL) + { + this.Write(250); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + } + else if (value <= uint.MaxValue) + { + this.Write(251); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + this.Write((byte)(value >> 24 & 255UL)); + } + else if (value <= 1099511627775UL) + { + this.Write(252); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + this.Write((byte)(value >> 24 & 255UL)); + this.Write((byte)(value >> 32 & 255UL)); + } + else if (value <= 281474976710655UL) + { + this.Write(253); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + this.Write((byte)(value >> 24 & 255UL)); + this.Write((byte)(value >> 32 & 255UL)); + this.Write((byte)(value >> 40 & 255UL)); + } + else if (value <= 72057594037927935UL) + { + this.Write(254); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + this.Write((byte)(value >> 24 & 255UL)); + this.Write((byte)(value >> 32 & 255UL)); + this.Write((byte)(value >> 40 & 255UL)); + this.Write((byte)(value >> 48 & 255UL)); + } + else + { + this.Write(byte.MaxValue); + this.Write((byte)(value & 255UL)); + this.Write((byte)(value >> 8 & 255UL)); + this.Write((byte)(value >> 16 & 255UL)); + this.Write((byte)(value >> 24 & 255UL)); + this.Write((byte)(value >> 32 & 255UL)); + this.Write((byte)(value >> 40 & 255UL)); + this.Write((byte)(value >> 48 & 255UL)); + this.Write((byte)(value >> 56 & 255UL)); + } + } + + public void Write(NetworkInstanceId value) + { + this.WritePackedUInt32(value.Value); + } + + public void Write(NetworkSceneId value) + { + this.WritePackedUInt32(value.Value); + } + + public void Write(char value) + { + this.m_Buffer.WriteByte((byte)value); + } + + public void Write(byte value) + { + this.m_Buffer.WriteByte(value); + } + + public void Write(sbyte value) + { + this.m_Buffer.WriteByte((byte)value); + } + + public void Write(short value) + { + this.m_Buffer.WriteByte2((byte)(value & 255), (byte)(value >> 8 & 255)); + } + + public void Write(ushort value) + { + this.m_Buffer.WriteByte2((byte)(value & 255), (byte)(value >> 8 & 255)); + } + + public void Write(int value) + { + this.m_Buffer.WriteByte4((byte)(value & 255), (byte)(value >> 8 & 255), (byte)(value >> 16 & 255), (byte)(value >> 24 & 255)); + } + + public void Write(uint value) + { + this.m_Buffer.WriteByte4((byte)(value & 255U), (byte)(value >> 8 & 255U), (byte)(value >> 16 & 255U), (byte)(value >> 24 & 255U)); + } + + public void Write(long value) + { + this.m_Buffer.WriteByte8((byte)(value & 255L), (byte)(value >> 8 & 255L), (byte)(value >> 16 & 255L), (byte)(value >> 24 & 255L), (byte)(value >> 32 & 255L), (byte)(value >> 40 & 255L), (byte)(value >> 48 & 255L), (byte)(value >> 56 & 255L)); + } + + public void Write(ulong value) + { + this.m_Buffer.WriteByte8((byte)(value & 255UL), (byte)(value >> 8 & 255UL), (byte)(value >> 16 & 255UL), (byte)(value >> 24 & 255UL), (byte)(value >> 32 & 255UL), (byte)(value >> 40 & 255UL), (byte)(value >> 48 & 255UL), (byte)(value >> 56 & 255UL)); + } + + public void Write(float value) + { + s_FloatConverter.floatValue = value; + this.Write(s_FloatConverter.intValue); + } + + public void Write(double value) + { + s_FloatConverter.doubleValue = value; + this.Write(s_FloatConverter.longValue); + } + + public void Write(decimal value) + { + int[] bits = decimal.GetBits(value); + this.Write(bits[0]); + this.Write(bits[1]); + this.Write(bits[2]); + this.Write(bits[3]); + } + + public void Write(string value) + { + if (value == null) + { + this.m_Buffer.WriteByte2(0, 0); + } + else + { + int byteCount = s_Encoding.GetByteCount(value); + if (byteCount >= 32768) + { + throw new IndexOutOfRangeException("Serialize(string) too long: " + value.Length); + } + this.Write((ushort)byteCount); + int bytes = s_Encoding.GetBytes(value, 0, value.Length, s_StringWriteBuffer, 0); + this.m_Buffer.WriteBytes(s_StringWriteBuffer, (ushort)bytes); + } + } + + public void Write(bool value) + { + if (value) + { + this.m_Buffer.WriteByte(1); + } + else + { + this.m_Buffer.WriteByte(0); + } + } + + public void Write(byte[] buffer, int count) + { + if (count > 65535) + { + if (LogFilter.logError) + { + Debug.LogError("NetworkWriter Write: buffer is too large (" + count + ") bytes. The maximum buffer size is 64K bytes."); + } + } + else + { + this.m_Buffer.WriteBytes(buffer, (ushort)count); + } + } + + public void Write(byte[] buffer, int offset, int count) + { + if (count > 65535) + { + if (LogFilter.logError) + { + Debug.LogError("NetworkWriter Write: buffer is too large (" + count + ") bytes. The maximum buffer size is 64K bytes."); + } + } + else + { + this.m_Buffer.WriteBytesAtOffset(buffer, (ushort)offset, (ushort)count); + } + } + + public void WriteBytesAndSize(byte[] buffer, int count) + { + if (buffer == null || count == 0) + { + this.Write(0); + } + else if (count > 65535) + { + if (LogFilter.logError) + { + Debug.LogError("NetworkWriter WriteBytesAndSize: buffer is too large (" + count + ") bytes. The maximum buffer size is 64K bytes."); + } + } + else + { + this.Write((ushort)count); + this.m_Buffer.WriteBytes(buffer, (ushort)count); + } + } + + public void WriteBytesFull(byte[] buffer) + { + if (buffer == null) + { + this.Write(0); + } + else if (buffer.Length > 65535) + { + if (LogFilter.logError) + { + Debug.LogError("NetworkWriter WriteBytes: buffer is too large (" + buffer.Length + ") bytes. The maximum buffer size is 64K bytes."); + } + } + else + { + this.Write((ushort)buffer.Length); + this.m_Buffer.WriteBytes(buffer, (ushort)buffer.Length); + } + } + + public void Write(Vector2 value) + { + this.Write(value.x); + this.Write(value.y); + } + + public void Write(Vector3 value) + { + this.Write(value.x); + this.Write(value.y); + this.Write(value.z); + } + + public void Write(Vector4 value) + { + this.Write(value.x); + this.Write(value.y); + this.Write(value.z); + this.Write(value.w); + } + + public void Write(Color value) + { + this.Write(value.r); + this.Write(value.g); + this.Write(value.b); + this.Write(value.a); + } + + public void Write(Color32 value) + { + this.Write(value.r); + this.Write(value.g); + this.Write(value.b); + this.Write(value.a); + } + + public void Write(Quaternion value) + { + this.Write(value.x); + this.Write(value.y); + this.Write(value.z); + this.Write(value.w); + } + + public void Write(Rect value) + { + this.Write(value.xMin); + this.Write(value.yMin); + this.Write(value.width); + this.Write(value.height); + } + + public void Write(Plane value) + { + this.Write(value.normal); + this.Write(value.distance); + } + + public void Write(Ray value) + { + this.Write(value.direction); + this.Write(value.origin); + } + + public void Write(Matrix4x4 value) + { + this.Write(value.m00); + this.Write(value.m01); + this.Write(value.m02); + this.Write(value.m03); + this.Write(value.m10); + this.Write(value.m11); + this.Write(value.m12); + this.Write(value.m13); + this.Write(value.m20); + this.Write(value.m21); + this.Write(value.m22); + this.Write(value.m23); + this.Write(value.m30); + this.Write(value.m31); + this.Write(value.m32); + this.Write(value.m33); + } + + public void Write(NetworkHash128 value) + { + this.Write(value.i0); + this.Write(value.i1); + this.Write(value.i2); + this.Write(value.i3); + this.Write(value.i4); + this.Write(value.i5); + this.Write(value.i6); + this.Write(value.i7); + this.Write(value.i8); + this.Write(value.i9); + this.Write(value.i10); + this.Write(value.i11); + this.Write(value.i12); + this.Write(value.i13); + this.Write(value.i14); + this.Write(value.i15); + } + + public void Write(NetworkIdentity value) + { + if (value == null) + { + this.WritePackedUInt32(0U); + } + else + { + this.Write(value.netId); + } + } + + public void Write(Transform value) + { + if (value == null || value.gameObject == null) + { + this.WritePackedUInt32(0U); + } + else + { + NetworkIdentity component = value.gameObject.GetComponent(); + if (component != null) + { + this.Write(component.netId); + } + else + { + if (LogFilter.logWarn) + { + Debug.LogWarning("NetworkWriter " + value + " has no NetworkIdentity"); + } + this.WritePackedUInt32(0U); + } + } + } + + public void Write(GameObject value) + { + if (value == null) + { + this.WritePackedUInt32(0U); + } + else + { + QSBNetworkIdentity component = value.GetComponent(); + if (component != null) + { + this.Write(component.NetId); + } + else + { + if (LogFilter.logWarn) + { + Debug.LogWarning("NetworkWriter " + value + " has no NetworkIdentity"); + } + this.WritePackedUInt32(0U); + } + } + } + + public void Write(QSBMessageBase msg) + { + msg.Serialize(this); + } + + public void SeekZero() + { + this.m_Buffer.SeekZero(); + } + + public void StartMessage(short msgType) + { + this.SeekZero(); + this.m_Buffer.WriteByte2(0, 0); + this.Write(msgType); + } + + public void FinishMessage() + { + this.m_Buffer.FinishMessage(); + } + + private const int k_MaxStringLength = 32768; + + private QSBNetBuffer m_Buffer; + + private static Encoding s_Encoding; + + private static byte[] s_StringWriteBuffer; + + private static QSBUIntFloat s_FloatConverter; + } +} diff --git a/QSB/QuantumUNET/QSBNotReadyMessage.cs b/QSB/QuantumUNET/QSBNotReadyMessage.cs new file mode 100644 index 00000000..093ca57a --- /dev/null +++ b/QSB/QuantumUNET/QSBNotReadyMessage.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.QuantumUNET +{ + public class QSBNotReadyMessage : QSBEmptyMessage + { + } +} diff --git a/QSB/QuantumUNET/QSBObjectDestroyMessage.cs b/QSB/QuantumUNET/QSBObjectDestroyMessage.cs index d873d1ca..f4aefd3f 100644 --- a/QSB/QuantumUNET/QSBObjectDestroyMessage.cs +++ b/QSB/QuantumUNET/QSBObjectDestroyMessage.cs @@ -2,16 +2,16 @@ namespace QSB.QuantumUNET { - internal class QSBObjectDestroyMessage : MessageBase + internal class QSBObjectDestroyMessage : QSBMessageBase { public NetworkInstanceId NetId; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { NetId = reader.ReadNetworkId(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(NetId); } diff --git a/QSB/QuantumUNET/QSBObjectSpawnFinishedMessage.cs b/QSB/QuantumUNET/QSBObjectSpawnFinishedMessage.cs index adc1789f..e893ffd6 100644 --- a/QSB/QuantumUNET/QSBObjectSpawnFinishedMessage.cs +++ b/QSB/QuantumUNET/QSBObjectSpawnFinishedMessage.cs @@ -2,16 +2,16 @@ namespace QSB.QuantumUNET { - internal class QSBObjectSpawnFinishedMessage : MessageBase + internal class QSBObjectSpawnFinishedMessage : QSBMessageBase { public uint State; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { State = reader.ReadPackedUInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.WritePackedUInt32(State); } diff --git a/QSB/QuantumUNET/QSBObjectSpawnMessage.cs b/QSB/QuantumUNET/QSBObjectSpawnMessage.cs index 18bed6cb..fa077d43 100644 --- a/QSB/QuantumUNET/QSBObjectSpawnMessage.cs +++ b/QSB/QuantumUNET/QSBObjectSpawnMessage.cs @@ -3,7 +3,7 @@ using UnityEngine.Networking; namespace QSB.QuantumUNET { - internal class QSBObjectSpawnMessage : MessageBase + internal class QSBObjectSpawnMessage : QSBMessageBase { public NetworkInstanceId NetId; public NetworkHash128 assetId; @@ -11,7 +11,7 @@ namespace QSB.QuantumUNET public byte[] Payload; public Quaternion Rotation; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { NetId = reader.ReadNetworkId(); assetId = reader.ReadNetworkHash128(); @@ -23,7 +23,7 @@ namespace QSB.QuantumUNET } } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(NetId); writer.Write(assetId); diff --git a/QSB/QuantumUNET/QSBObjectSpawnSceneMessage.cs b/QSB/QuantumUNET/QSBObjectSpawnSceneMessage.cs index 582e75fe..99b4a6ca 100644 --- a/QSB/QuantumUNET/QSBObjectSpawnSceneMessage.cs +++ b/QSB/QuantumUNET/QSBObjectSpawnSceneMessage.cs @@ -3,14 +3,14 @@ using UnityEngine.Networking; namespace QSB.QuantumUNET { - internal class QSBObjectSpawnSceneMessage : MessageBase + internal class QSBObjectSpawnSceneMessage : QSBMessageBase { public NetworkInstanceId NetId; public NetworkSceneId SceneId; public Vector3 Position; public byte[] Payload; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { NetId = reader.ReadNetworkId(); SceneId = reader.ReadSceneId(); @@ -18,7 +18,7 @@ namespace QSB.QuantumUNET Payload = reader.ReadBytesAndSize(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(NetId); writer.Write(SceneId); diff --git a/QSB/QuantumUNET/QSBOwnerMessage.cs b/QSB/QuantumUNET/QSBOwnerMessage.cs index 8b505371..4a081030 100644 --- a/QSB/QuantumUNET/QSBOwnerMessage.cs +++ b/QSB/QuantumUNET/QSBOwnerMessage.cs @@ -2,18 +2,18 @@ namespace QSB.QuantumUNET { - internal class QSBOwnerMessage : MessageBase + internal class QSBOwnerMessage : QSBMessageBase { public NetworkInstanceId NetId; public short PlayerControllerId; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { NetId = reader.ReadNetworkId(); PlayerControllerId = (short)reader.ReadPackedUInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write(NetId); writer.WritePackedUInt32((uint)PlayerControllerId); diff --git a/QSB/QuantumUNET/QSBPeerAuthorityMessage.cs b/QSB/QuantumUNET/QSBPeerAuthorityMessage.cs new file mode 100644 index 00000000..8836bd1d --- /dev/null +++ b/QSB/QuantumUNET/QSBPeerAuthorityMessage.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBPeerAuthorityMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.connectionId = (int)reader.ReadPackedUInt32(); + this.netId = reader.ReadNetworkId(); + this.authorityState = reader.ReadBoolean(); + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.WritePackedUInt32((uint)this.connectionId); + writer.Write(this.netId); + writer.Write(this.authorityState); + } + + public int connectionId; + + public NetworkInstanceId netId; + + public bool authorityState; + } +} diff --git a/QSB/QuantumUNET/QSBPeerInfoMessage.cs b/QSB/QuantumUNET/QSBPeerInfoMessage.cs new file mode 100644 index 00000000..45a3ba38 --- /dev/null +++ b/QSB/QuantumUNET/QSBPeerInfoMessage.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBPeerInfoMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.connectionId = (int)reader.ReadPackedUInt32(); + this.address = reader.ReadString(); + this.port = (int)reader.ReadPackedUInt32(); + this.isHost = reader.ReadBoolean(); + this.isYou = reader.ReadBoolean(); + uint num = reader.ReadPackedUInt32(); + if (num > 0U) + { + List list = new List(); + for (uint num2 = 0U; num2 < num; num2 += 1U) + { + QSBPeerInfoPlayer item; + item.netId = reader.ReadNetworkId(); + item.playerControllerId = (short)reader.ReadPackedUInt32(); + list.Add(item); + } + this.playerIds = list.ToArray(); + } + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.WritePackedUInt32((uint)this.connectionId); + writer.Write(this.address); + writer.WritePackedUInt32((uint)this.port); + writer.Write(this.isHost); + writer.Write(this.isYou); + if (this.playerIds == null) + { + writer.WritePackedUInt32(0U); + } + else + { + writer.WritePackedUInt32((uint)this.playerIds.Length); + for (int i = 0; i < this.playerIds.Length; i++) + { + writer.Write(this.playerIds[i].netId); + writer.WritePackedUInt32((uint)this.playerIds[i].playerControllerId); + } + } + } + + public override string ToString() + { + return string.Concat(new object[] + { + "PeerInfo conn:", + this.connectionId, + " addr:", + this.address, + ":", + this.port, + " host:", + this.isHost, + " isYou:", + this.isYou + }); + } + + public int connectionId; + + public string address; + + public int port; + + public bool isHost; + + public bool isYou; + + public QSBPeerInfoPlayer[] playerIds; + } +} diff --git a/QSB/QuantumUNET/QSBPeerInfoPlayer.cs b/QSB/QuantumUNET/QSBPeerInfoPlayer.cs new file mode 100644 index 00000000..3fe1256c --- /dev/null +++ b/QSB/QuantumUNET/QSBPeerInfoPlayer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public struct QSBPeerInfoPlayer + { + public NetworkInstanceId netId; + + public short playerControllerId; + } +} diff --git a/QSB/QuantumUNET/QSBPeerListMessage.cs b/QSB/QuantumUNET/QSBPeerListMessage.cs new file mode 100644 index 00000000..86f20a8f --- /dev/null +++ b/QSB/QuantumUNET/QSBPeerListMessage.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBPeerListMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.oldServerConnectionId = (int)reader.ReadPackedUInt32(); + int num = (int)reader.ReadUInt16(); + this.peers = new QSBPeerInfoMessage[num]; + for (int i = 0; i < this.peers.Length; i++) + { + QSBPeerInfoMessage peerInfoMessage = new QSBPeerInfoMessage(); + peerInfoMessage.Deserialize(reader); + this.peers[i] = peerInfoMessage; + } + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.WritePackedUInt32((uint)this.oldServerConnectionId); + writer.Write((ushort)this.peers.Length); + for (int i = 0; i < this.peers.Length; i++) + { + this.peers[i].Serialize(writer); + } + } + + public QSBPeerInfoMessage[] peers; + + public int oldServerConnectionId; + } +} diff --git a/QSB/QuantumUNET/QSBReadyMessage.cs b/QSB/QuantumUNET/QSBReadyMessage.cs new file mode 100644 index 00000000..03440c05 --- /dev/null +++ b/QSB/QuantumUNET/QSBReadyMessage.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.QuantumUNET +{ + public class QSBReadyMessage : QSBEmptyMessage + { + } +} diff --git a/QSB/QuantumUNET/QSBReconnectMessage.cs b/QSB/QuantumUNET/QSBReconnectMessage.cs new file mode 100644 index 00000000..6afe4d7e --- /dev/null +++ b/QSB/QuantumUNET/QSBReconnectMessage.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBReconnectMessage : QSBMessageBase + { + public override void Deserialize(QSBNetworkReader reader) + { + this.oldConnectionId = (int)reader.ReadPackedUInt32(); + this.playerControllerId = (short)reader.ReadPackedUInt32(); + this.netId = reader.ReadNetworkId(); + this.msgData = reader.ReadBytesAndSize(); + this.msgSize = this.msgData.Length; + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.WritePackedUInt32((uint)this.oldConnectionId); + writer.WritePackedUInt32((uint)this.playerControllerId); + writer.Write(this.netId); + writer.WriteBytesAndSize(this.msgData, this.msgSize); + } + + public int oldConnectionId; + + public short playerControllerId; + + public NetworkInstanceId netId; + + public int msgSize; + + public byte[] msgData; + } +} diff --git a/QSB/QuantumUNET/QSBRemovePlayerMessage.cs b/QSB/QuantumUNET/QSBRemovePlayerMessage.cs index 46b74f65..f988f0be 100644 --- a/QSB/QuantumUNET/QSBRemovePlayerMessage.cs +++ b/QSB/QuantumUNET/QSBRemovePlayerMessage.cs @@ -2,16 +2,16 @@ namespace QSB.QuantumUNET { - public class QSBRemovePlayerMessage : MessageBase + public class QSBRemovePlayerMessage : QSBMessageBase { public short PlayerControllerId; - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { PlayerControllerId = (short)reader.ReadUInt16(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { writer.Write((ushort)PlayerControllerId); } diff --git a/QSB/QuantumUNET/QSBStringMessage.cs b/QSB/QuantumUNET/QSBStringMessage.cs new file mode 100644 index 00000000..a8d37e85 --- /dev/null +++ b/QSB/QuantumUNET/QSBStringMessage.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine.Networking; + +namespace QSB.QuantumUNET +{ + public class QSBStringMessage : QSBMessageBase + { + public QSBStringMessage() + { + } + + public QSBStringMessage(string v) + { + this.value = v; + } + + public override void Deserialize(QSBNetworkReader reader) + { + this.value = reader.ReadString(); + } + + public override void Serialize(QSBNetworkWriter writer) + { + writer.Write(this.value); + } + + public string value; + } +} diff --git a/QSB/QuantumUNET/QSBUIntDecimal.cs b/QSB/QuantumUNET/QSBUIntDecimal.cs new file mode 100644 index 00000000..4ae45154 --- /dev/null +++ b/QSB/QuantumUNET/QSBUIntDecimal.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.QuantumUNET +{ + internal struct QSBUIntDecimal + { + public ulong longValue1; + + public ulong longValue2; + + public decimal decimalValue; + } +} diff --git a/QSB/QuantumUNET/QSBUIntFloat.cs b/QSB/QuantumUNET/QSBUIntFloat.cs new file mode 100644 index 00000000..b0d9e295 --- /dev/null +++ b/QSB/QuantumUNET/QSBUIntFloat.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.QuantumUNET +{ + internal struct QSBUIntFloat + { + public float floatValue; + + public uint intValue; + + public double doubleValue; + + public ulong longValue; + } +} diff --git a/QSB/QuantumUNET/QSBULocalConnectionToClient.cs b/QSB/QuantumUNET/QSBULocalConnectionToClient.cs index 0595f420..40afb84e 100644 --- a/QSB/QuantumUNET/QSBULocalConnectionToClient.cs +++ b/QSB/QuantumUNET/QSBULocalConnectionToClient.cs @@ -18,19 +18,19 @@ namespace QSB.QuantumUNET } } - public override bool Send(short msgType, MessageBase msg) + public override bool Send(short msgType, QSBMessageBase msg) { m_LocalClient.InvokeHandlerOnClient(msgType, msg, 0); return true; } - public override bool SendUnreliable(short msgType, MessageBase msg) + public override bool SendUnreliable(short msgType, QSBMessageBase msg) { m_LocalClient.InvokeHandlerOnClient(msgType, msg, 1); return true; } - public override bool SendByChannel(short msgType, MessageBase msg, int channelId) + public override bool SendByChannel(short msgType, QSBMessageBase msg, int channelId) { m_LocalClient.InvokeHandlerOnClient(msgType, msg, channelId); return true; @@ -42,7 +42,7 @@ namespace QSB.QuantumUNET return true; } - public override bool SendWriter(NetworkWriter writer, int channelId) + public override bool SendWriter(QSBNetworkWriter writer, int channelId) { m_LocalClient.InvokeBytesOnClient(writer.AsArray(), channelId); return true; diff --git a/QSB/QuantumUNET/QSBULocalConnectionToServer.cs b/QSB/QuantumUNET/QSBULocalConnectionToServer.cs index a1c56956..9bf4bedb 100644 --- a/QSB/QuantumUNET/QSBULocalConnectionToServer.cs +++ b/QSB/QuantumUNET/QSBULocalConnectionToServer.cs @@ -11,17 +11,17 @@ namespace QSB.QuantumUNET m_LocalServer = localServer; } - public override bool Send(short msgType, MessageBase msg) + public override bool Send(short msgType, QSBMessageBase msg) { return m_LocalServer.InvokeHandlerOnServer(this, msgType, msg, 0); } - public override bool SendUnreliable(short msgType, MessageBase msg) + public override bool SendUnreliable(short msgType, QSBMessageBase msg) { return m_LocalServer.InvokeHandlerOnServer(this, msgType, msg, 1); } - public override bool SendByChannel(short msgType, MessageBase msg, int channelId) + public override bool SendByChannel(short msgType, QSBMessageBase msg, int channelId) { return m_LocalServer.InvokeHandlerOnServer(this, msgType, msg, channelId); } @@ -44,7 +44,7 @@ namespace QSB.QuantumUNET return result; } - public override bool SendWriter(NetworkWriter writer, int channelId) + public override bool SendWriter(QSBNetworkWriter writer, int channelId) { return m_LocalServer.InvokeBytes(this, writer.AsArray(), (int)((short)writer.AsArray().Length), channelId); } diff --git a/QSB/TimeSync/Events/ServerTimeMessage.cs b/QSB/TimeSync/Events/ServerTimeMessage.cs index 8f31071a..f7d36dd2 100644 --- a/QSB/TimeSync/Events/ServerTimeMessage.cs +++ b/QSB/TimeSync/Events/ServerTimeMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.TimeSync.Events @@ -8,14 +9,14 @@ namespace QSB.TimeSync.Events public float ServerTime { get; set; } public int LoopCount { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); ServerTime = reader.ReadSingle(); LoopCount = reader.ReadInt16(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(ServerTime); diff --git a/QSB/WorldSync/Events/BoolWorldObjectMessage.cs b/QSB/WorldSync/Events/BoolWorldObjectMessage.cs index c3fba654..8c04a187 100644 --- a/QSB/WorldSync/Events/BoolWorldObjectMessage.cs +++ b/QSB/WorldSync/Events/BoolWorldObjectMessage.cs @@ -1,4 +1,5 @@ -using UnityEngine.Networking; +using QSB.QuantumUNET; +using UnityEngine.Networking; namespace QSB.WorldSync.Events { @@ -6,13 +7,13 @@ namespace QSB.WorldSync.Events { public bool State { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); State = reader.ReadBoolean(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(State); diff --git a/QSB/WorldSync/Events/WorldObjectMessage.cs b/QSB/WorldSync/Events/WorldObjectMessage.cs index e8644217..38450900 100644 --- a/QSB/WorldSync/Events/WorldObjectMessage.cs +++ b/QSB/WorldSync/Events/WorldObjectMessage.cs @@ -1,4 +1,5 @@ using QSB.Messaging; +using QSB.QuantumUNET; using UnityEngine.Networking; namespace QSB.WorldSync.Events @@ -7,13 +8,13 @@ namespace QSB.WorldSync.Events { public int ObjectId { get; set; } - public override void Deserialize(NetworkReader reader) + public override void Deserialize(QSBNetworkReader reader) { base.Deserialize(reader); ObjectId = reader.ReadInt32(); } - public override void Serialize(NetworkWriter writer) + public override void Serialize(QSBNetworkWriter writer) { base.Serialize(writer); writer.Write(ObjectId);