diff --git a/QSB/Anglerfish/AnglerManager.cs b/QSB/Anglerfish/AnglerManager.cs index c5abe84b..2631868c 100644 --- a/QSB/Anglerfish/AnglerManager.cs +++ b/QSB/Anglerfish/AnglerManager.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; -using QSB.Anglerfish.WorldObjects; +using QSB.Anglerfish.WorldObjects; using QSB.WorldSync; +using System.Collections.Generic; namespace QSB.Anglerfish { diff --git a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs b/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs deleted file mode 100644 index f5d0673f..00000000 --- a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs +++ /dev/null @@ -1,67 +0,0 @@ -using QSB.Anglerfish.WorldObjects; -using QSB.Events; -using QSB.Player; -using QSB.WorldSync; -using UnityEngine; - -namespace QSB.Anglerfish.Events -{ - public class AnglerChangeStateEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBAnglerChangeState, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBAnglerChangeState, Handler); - - private void Handler(QSBAngler qsbAngler) => SendEvent(CreateMessage(qsbAngler)); - - private AnglerChangeStateMessage CreateMessage(QSBAngler qsbAngler) => new() - { - ObjectId = qsbAngler.ObjectId, - EnumValue = qsbAngler.AttachedObject._currentState, - TargetId = TargetToId(qsbAngler.TargetTransform), - LocalDisturbancePos = qsbAngler.AttachedObject._localDisturbancePos - }; - - public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message) - { - var qsbAngler = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbAngler.TargetTransform = IdToTarget(message.TargetId); - qsbAngler.AttachedObject._localDisturbancePos = message.LocalDisturbancePos; - qsbAngler.AttachedObject.ChangeState(message.EnumValue); - } - - private static uint TargetToId(Transform transform) - { - if (transform == null) - { - return uint.MaxValue; - } - - if (transform == Locator.GetShipTransform()) - { - return uint.MaxValue - 1; - } - - return QSBPlayerManager.LocalPlayerId; - } - - private static Transform IdToTarget(uint id) - { - if (id == uint.MaxValue) - { - return null; - } - - if (id == uint.MaxValue - 1) - { - return Locator.GetShipTransform(); - } - - return QSBPlayerManager.GetPlayer(id).Body.transform; - } - } -} diff --git a/QSB/Anglerfish/Events/AnglerChangeStateMessage.cs b/QSB/Anglerfish/Events/AnglerChangeStateMessage.cs deleted file mode 100644 index 0615153d..00000000 --- a/QSB/Anglerfish/Events/AnglerChangeStateMessage.cs +++ /dev/null @@ -1,26 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.Anglerfish.Events -{ - public class AnglerChangeStateMessage : EnumWorldObjectMessage - { - public uint TargetId; - public Vector3 LocalDisturbancePos; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - TargetId = reader.ReadUInt32(); - LocalDisturbancePos = reader.ReadVector3(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(TargetId); - writer.Write(LocalDisturbancePos); - } - } -} diff --git a/QSB/Anglerfish/Messages/AnglerChangeStateMessage.cs b/QSB/Anglerfish/Messages/AnglerChangeStateMessage.cs new file mode 100644 index 00000000..1cf8977c --- /dev/null +++ b/QSB/Anglerfish/Messages/AnglerChangeStateMessage.cs @@ -0,0 +1,72 @@ +using QSB.Anglerfish.WorldObjects; +using QSB.Messaging; +using QSB.Player; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.Anglerfish.Messages +{ + public class AnglerChangeStateMessage : QSBEnumWorldObjectMessage + { + private uint TargetId; + private Vector3 LocalDisturbancePos; + + public AnglerChangeStateMessage(QSBAngler qsbAngler) + { + Value = qsbAngler.AttachedObject._currentState; + TargetId = TargetToId(qsbAngler.TargetTransform); + LocalDisturbancePos = qsbAngler.AttachedObject._localDisturbancePos; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(TargetId); + writer.Write(LocalDisturbancePos); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + TargetId = reader.ReadUInt32(); + LocalDisturbancePos = reader.ReadVector3(); + } + + public override void OnReceiveRemote() + { + WorldObject.TargetTransform = IdToTarget(TargetId); + WorldObject.AttachedObject._localDisturbancePos = LocalDisturbancePos; + WorldObject.AttachedObject.ChangeState(Value); + } + + private static uint TargetToId(Transform transform) + { + if (transform == null) + { + return uint.MaxValue; + } + + if (transform == Locator.GetShipTransform()) + { + return uint.MaxValue - 1; + } + + return QSBPlayerManager.LocalPlayerId; + } + + private static Transform IdToTarget(uint id) + { + if (id == uint.MaxValue) + { + return null; + } + + if (id == uint.MaxValue - 1) + { + return Locator.GetShipTransform(); + } + + return QSBPlayerManager.GetPlayer(id).Body.transform; + } + } +} \ No newline at end of file diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index c492b9dc..5cdfda1d 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -1,9 +1,8 @@ using HarmonyLib; +using QSB.Anglerfish.Messages; using QSB.Anglerfish.WorldObjects; -using QSB.AuthoritySync; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; -using QSB.Utility; using QSB.WorldSync; using UnityEngine; @@ -17,7 +16,7 @@ namespace QSB.Anglerfish.Patches [HarmonyPatch(typeof(AnglerfishController), nameof(AnglerfishController.GetTargetPosition))] public static bool GetTargetPosition(AnglerfishController __instance, ref Vector3 __result) { - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); if (qsbAngler.TargetTransform != null) { @@ -35,12 +34,12 @@ namespace QSB.Anglerfish.Patches public static bool OnSectorOccupantRemoved(AnglerfishController __instance, SectorDetector sectorDetector) { - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); if (qsbAngler.TargetTransform != null && sectorDetector.GetAttachedOWRigidbody().transform == qsbAngler.TargetTransform) { qsbAngler.TargetTransform = null; - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } return false; @@ -54,7 +53,7 @@ namespace QSB.Anglerfish.Patches { return true; } - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); switch (__instance._currentState) { @@ -62,7 +61,7 @@ namespace QSB.Anglerfish.Patches if ((__instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos) - __instance._anglerBody.GetPosition()).sqrMagnitude < __instance._arrivalDistance * __instance._arrivalDistance) { __instance.ChangeState(AnglerfishController.AnglerState.Lurking); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } break; @@ -70,14 +69,14 @@ namespace QSB.Anglerfish.Patches if (qsbAngler.TargetTransform == null) { __instance.ChangeState(AnglerfishController.AnglerState.Lurking); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } if ((qsbAngler.TargetTransform.position - __instance._anglerBody.GetPosition()).sqrMagnitude > __instance._escapeDistance * __instance._escapeDistance) { qsbAngler.TargetTransform = null; __instance.ChangeState(AnglerfishController.AnglerState.Lurking); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } break; @@ -87,7 +86,7 @@ namespace QSB.Anglerfish.Patches if (qsbAngler.TargetTransform == null) { __instance.ChangeState(AnglerfishController.AnglerState.Lurking); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } var num = Time.time - __instance._consumeStartTime; @@ -117,7 +116,7 @@ namespace QSB.Anglerfish.Patches else { qsbAngler.TargetTransform = null; - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } break; case AnglerfishController.AnglerState.Stunned: @@ -127,11 +126,11 @@ namespace QSB.Anglerfish.Patches if (qsbAngler.TargetTransform != null) { __instance.ChangeState(AnglerfishController.AnglerState.Chasing); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } __instance.ChangeState(AnglerfishController.AnglerState.Lurking); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } break; default: @@ -149,7 +148,7 @@ namespace QSB.Anglerfish.Patches { return true; } - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); qsbAngler.UpdateTargetVelocity(); if (__instance._anglerBody.GetVelocity().sqrMagnitude > Mathf.Pow(__instance._chaseSpeed * 1.5f, 2f)) @@ -228,7 +227,7 @@ namespace QSB.Anglerfish.Patches public static bool OnImpact(AnglerfishController __instance, ImpactData impact) { - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); var attachedOWRigidbody = impact.otherCollider.GetAttachedOWRigidbody(); if ((attachedOWRigidbody.CompareTag("Player") || attachedOWRigidbody.CompareTag("Ship")) @@ -237,7 +236,7 @@ namespace QSB.Anglerfish.Patches { qsbAngler.TargetTransform = attachedOWRigidbody.transform; __instance.ChangeState(AnglerfishController.AnglerState.Chasing); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } @@ -249,7 +248,7 @@ namespace QSB.Anglerfish.Patches public static bool OnClosestAudibleNoise(AnglerfishController __instance, NoiseMaker noiseMaker) { - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); if (__instance._currentState is AnglerfishController.AnglerState.Consuming or AnglerfishController.AnglerState.Stunned) { @@ -264,7 +263,7 @@ namespace QSB.Anglerfish.Patches { __instance.ChangeState(AnglerfishController.AnglerState.Chasing); } - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } } @@ -275,7 +274,7 @@ namespace QSB.Anglerfish.Patches { __instance.ChangeState(AnglerfishController.AnglerState.Investigating); } - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } return false; @@ -286,7 +285,7 @@ namespace QSB.Anglerfish.Patches public static bool OnCaughtObject(AnglerfishController __instance, OWRigidbody caughtBody) { - var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbAngler = __instance.GetWorldObject(); if (__instance._currentState == AnglerfishController.AnglerState.Consuming) { @@ -301,7 +300,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.TargetTransform = caughtBody.transform; __instance._consumeStartTime = Time.time; __instance.ChangeState(AnglerfishController.AnglerState.Consuming); - QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } return false; diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index f3820f0b..0e0f6e34 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -1,9 +1,9 @@ using QSB.Anglerfish.WorldObjects; +using QSB.AuthoritySync; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.WorldSync; using QuantumUNET.Transport; using System.Collections.Generic; -using QSB.AuthoritySync; using UnityEngine; namespace QSB.Anglerfish.TransformSync @@ -43,7 +43,7 @@ namespace QSB.Anglerfish.TransformSync protected override void Init() { - _qsbAngler = QSBWorldSync.GetWorldFromUnity(AnglerManager.Anglers[_instances.IndexOf(this)]); + _qsbAngler = AnglerManager.Anglers[_instances.IndexOf(this)].GetWorldObject(); _qsbAngler.TransformSync = this; base.Init(); @@ -55,11 +55,11 @@ namespace QSB.Anglerfish.TransformSync } AttachedObject.OnUnsuspendOWRigidbody += OnUnsuspend; AttachedObject.OnSuspendOWRigidbody += OnSuspend; - NetIdentity.FireAuthQueue(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); + NetIdentity.SendAuthQueueMessage(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); } - private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Add); - private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Remove); + private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Add); + private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Remove); private bool _shouldUpdate; diff --git a/QSB/Animation/NPC/AnimationEvent.cs b/QSB/Animation/NPC/AnimationEvent.cs deleted file mode 100644 index 8c8da774..00000000 --- a/QSB/Animation/NPC/AnimationEvent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace QSB.Animation.NPC -{ - internal enum AnimationEvent - { - StartConversation, - EndConversation - } -} diff --git a/QSB/Animation/NPC/Events/NpcAnimationEvent.cs b/QSB/Animation/NPC/Events/NpcAnimationEvent.cs deleted file mode 100644 index ffde6557..00000000 --- a/QSB/Animation/NPC/Events/NpcAnimationEvent.cs +++ /dev/null @@ -1,37 +0,0 @@ -using QSB.Animation.NPC.WorldObjects; -using QSB.Events; -using QSB.WorldSync; - -namespace QSB.Animation.NPC.Events -{ - internal class NpcAnimationEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBNpcAnimEvent, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBNpcAnimEvent, Handler); - - private void Handler(AnimationEvent animEvent, int index) => SendEvent(CreateMessage(animEvent, index)); - - private NpcAnimationMessage CreateMessage(AnimationEvent animEvent, int index) => new() - { - AboutId = LocalPlayerId, - AnimationEvent = animEvent, - AnimControllerIndex = index - }; - - public override void OnReceiveRemote(bool server, NpcAnimationMessage message) - { - var qsbObj = QSBWorldSync.GetWorldFromId(message.AnimControllerIndex); - switch (message.AnimationEvent) - { - case AnimationEvent.StartConversation: - qsbObj.StartConversation(); - break; - case AnimationEvent.EndConversation: - qsbObj.EndConversation(); - break; - } - } - } -} diff --git a/QSB/Animation/NPC/Events/NpcAnimationMessage.cs b/QSB/Animation/NPC/Events/NpcAnimationMessage.cs deleted file mode 100644 index 727889c9..00000000 --- a/QSB/Animation/NPC/Events/NpcAnimationMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.Animation.NPC.Events -{ - internal class NpcAnimationMessage : PlayerMessage - { - public AnimationEvent AnimationEvent { get; set; } - public int AnimControllerIndex { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - AnimationEvent = (AnimationEvent)reader.ReadInt32(); - AnimControllerIndex = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write((int)AnimationEvent); - writer.Write(AnimControllerIndex); - } - } -} diff --git a/QSB/Animation/NPC/Messages/NpcAnimationMessage.cs b/QSB/Animation/NPC/Messages/NpcAnimationMessage.cs new file mode 100644 index 00000000..e0c3ac44 --- /dev/null +++ b/QSB/Animation/NPC/Messages/NpcAnimationMessage.cs @@ -0,0 +1,22 @@ +using QSB.Animation.NPC.WorldObjects; +using QSB.Messaging; + +namespace QSB.Animation.NPC.Messages +{ + internal class NpcAnimationMessage : QSBBoolWorldObjectMessage + { + public NpcAnimationMessage(bool start) => Value = start; + + public override void OnReceiveRemote() + { + if (Value) + { + WorldObject.StartConversation(); + } + else + { + WorldObject.EndConversation(); + } + } + } +} diff --git a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs index 16203540..2337ea54 100644 --- a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs +++ b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs @@ -1,10 +1,12 @@ using HarmonyLib; using OWML.Common; +using QSB.Animation.NPC.Messages; using QSB.Animation.NPC.WorldObjects; using QSB.ConversationSync; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; +using QSB.Player.Messages; using QSB.Utility; using QSB.WorldSync; using System.Linq; @@ -20,27 +22,19 @@ namespace QSB.Animation.NPC.Patches [HarmonyPrefix] [HarmonyPatch(typeof(CharacterAnimController), nameof(CharacterAnimController.OnAnimatorIK))] public static bool AnimatorIKReplacement( - CharacterAnimController __instance, - float ___headTrackingWeight, - bool ___lookOnlyWhenTalking, - bool ____inConversation, - ref float ____currentLookWeight, - ref Vector3 ____currentLookTarget, - DampedSpring3D ___lookSpring, - Animator ____animator, - CharacterDialogueTree ____dialogueTree) + CharacterAnimController __instance) { if (!WorldObjectManager.AllObjectsReady || ConversationManager.Instance == null) { return false; } - var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree); + var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(__instance._dialogueTree); var player = QSBPlayerManager.GetPlayer(playerId); - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); // OPTIMIZE : maybe cache this somewhere... or assess how slow this is + var qsbObj = __instance.GetWorldObject(); // OPTIMIZE : maybe cache this somewhere... or assess how slow this is PlayerInfo playerToUse = null; - if (____inConversation) + if (__instance._inConversation) { if (playerId == uint.MaxValue) { @@ -54,7 +48,7 @@ namespace QSB.Animation.NPC.Patches : player; } } - else if (!___lookOnlyWhenTalking && qsbObj.GetPlayersInHeadZone().Count != 0) // IDEA : maybe this would be more fun if characters looked between players at random times? :P + else if (!__instance.lookOnlyWhenTalking && qsbObj.GetPlayersInHeadZone().Count != 0) // IDEA : maybe this would be more fun if characters looked between players at random times? :P { playerToUse = QSBPlayerManager.GetClosestPlayerToWorldPoint(qsbObj.GetPlayersInHeadZone(), __instance.transform.position); } @@ -64,13 +58,13 @@ namespace QSB.Animation.NPC.Patches } var localPosition = playerToUse != null - ? ____animator.transform.InverseTransformPoint(playerToUse.CameraBody.transform.position) + ? __instance._animator.transform.InverseTransformPoint(playerToUse.CameraBody.transform.position) : Vector3.zero; - var targetWeight = ___headTrackingWeight; - if (___lookOnlyWhenTalking) + var targetWeight = __instance.headTrackingWeight; + if (__instance.lookOnlyWhenTalking) { - if (!____inConversation + if (!__instance._inConversation || qsbObj.GetPlayersInHeadZone().Count == 0 || !qsbObj.GetPlayersInHeadZone().Contains(playerToUse)) { @@ -86,10 +80,10 @@ namespace QSB.Animation.NPC.Patches } } - ____currentLookWeight = Mathf.Lerp(____currentLookWeight, targetWeight, Time.deltaTime * 2f); - ____currentLookTarget = ___lookSpring.Update(____currentLookTarget, localPosition, Time.deltaTime); - ____animator.SetLookAtPosition(____animator.transform.TransformPoint(____currentLookTarget)); - ____animator.SetLookAtWeight(____currentLookWeight); + __instance._currentLookWeight = Mathf.Lerp(__instance._currentLookWeight, targetWeight, Time.deltaTime * 2f); + __instance._currentLookTarget = __instance.lookSpring.Update(__instance._currentLookTarget, localPosition, Time.deltaTime); + __instance._animator.SetLookAtPosition(__instance._animator.transform.TransformPoint(__instance._currentLookTarget)); + __instance._animator.SetLookAtWeight(__instance._currentLookWeight); return false; } @@ -100,8 +94,8 @@ namespace QSB.Animation.NPC.Patches { if (input.CompareTag("PlayerDetector")) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBExitNonNomaiHeadZone, qsbObj.ObjectId); + var qsbObj = __instance.GetWorldObject(); + new EnterLeaveMessage(EnterLeaveType.ExitNonNomaiHeadZone, qsbObj.ObjectId).Send(); } return false; @@ -113,8 +107,8 @@ namespace QSB.Animation.NPC.Patches { if (input.CompareTag("PlayerDetector")) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBEnterNonNomaiHeadZone, qsbObj.ObjectId); + var qsbObj = __instance.GetWorldObject(); + new EnterLeaveMessage(EnterLeaveType.EnterNonNomaiHeadZone, qsbObj.ObjectId).Send(); } return false; } @@ -153,8 +147,7 @@ namespace QSB.Animation.NPC.Patches return true; } - var id = ownerOfThis.ObjectId; - QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.StartConversation, id); + ownerOfThis.SendMessage(new NpcAnimationMessage(true)); return true; } @@ -169,8 +162,7 @@ namespace QSB.Animation.NPC.Patches return true; } - var id = ownerOfThis.ObjectId; - QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.EndConversation, id); + ownerOfThis.SendMessage(new NpcAnimationMessage(false)); return true; } diff --git a/QSB/Animation/NPC/Patches/SolanumPatches.cs b/QSB/Animation/NPC/Patches/SolanumPatches.cs index a798d361..3bd3cc54 100644 --- a/QSB/Animation/NPC/Patches/SolanumPatches.cs +++ b/QSB/Animation/NPC/Patches/SolanumPatches.cs @@ -1,8 +1,9 @@ using HarmonyLib; using QSB.Animation.NPC.WorldObjects; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; +using QSB.Player.Messages; using QSB.WorldSync; using System.Linq; using UnityEngine; @@ -24,7 +25,7 @@ namespace QSB.Animation.NPC.Patches __instance._animatorStateEvents.OnEnterState += __instance.OnEnterAnimatorState; } - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbObj = __instance.GetWorldObject(); var playersInHeadZone = qsbObj.GetPlayersInHeadZone(); var targetCamera = playersInHeadZone == null || playersInHeadZone.Count == 0 @@ -46,8 +47,8 @@ namespace QSB.Animation.NPC.Patches { if (hitObj.CompareTag("PlayerDetector")) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance._solanumAnimController); - QSBEventManager.FireEvent(EventNames.QSBEnterNomaiHeadZone, qsbObj.ObjectId); + var qsbObj = __instance._solanumAnimController.GetWorldObject(); + new EnterLeaveMessage(EnterLeaveType.EnterNomaiHeadZone, qsbObj.ObjectId).Send(); } return false; @@ -59,8 +60,8 @@ namespace QSB.Animation.NPC.Patches { if (hitObj.CompareTag("PlayerDetector")) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance._solanumAnimController); - QSBEventManager.FireEvent(EventNames.QSBExitNomaiHeadZone, qsbObj.ObjectId); + var qsbObj = __instance._solanumAnimController.GetWorldObject(); + new EnterLeaveMessage(EnterLeaveType.ExitNomaiHeadZone, qsbObj.ObjectId).Send(); } return false; } @@ -69,7 +70,7 @@ namespace QSB.Animation.NPC.Patches [HarmonyPatch(typeof(NomaiConversationManager), nameof(NomaiConversationManager.Update))] public static bool ReplacementUpdate(NomaiConversationManager __instance) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance._solanumAnimController); + var qsbObj = __instance._solanumAnimController.GetWorldObject(); __instance._playerInWatchVolume = qsbObj.GetPlayersInHeadZone().Any(); if (!__instance._initialized) diff --git a/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs b/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs index 04a9fe85..7f448135 100644 --- a/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs +++ b/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs @@ -6,98 +6,112 @@ using UnityEngine; namespace QSB.Animation.NPC.Patches { - [HarmonyPatch(typeof(TravelerController))] public class TravelerControllerPatches : QSBPatch { public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; [HarmonyPrefix] - [HarmonyPatch(nameof(TravelerController.OnStartConversation))] + [HarmonyPatch(typeof(TravelerController), nameof(TravelerController.OnStartConversation))] public static bool OnStartConversation(TravelerController __instance) { __instance._talking = true; - - if (__instance is GabbroTravelerController gabbro) - { - if (gabbro._animator.enabled) - { - gabbro._animator.CrossFadeInFixedTime("Gabbro_Talking", 1.8f); - gabbro._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Talking", 1.8f); - } - - Locator.GetTravelerAudioManager().StopTravelerAudio(gabbro.name); - } - else - { - if (__instance._animator != null && __instance._animator.enabled) - { - __instance._playingAnimID = __instance._animator.IsInTransition(0) - ? __instance._animator.GetNextAnimatorStateInfo(0).fullPathHash - : __instance._animator.GetCurrentAnimatorStateInfo(0).fullPathHash; - - __instance._animator.SetTrigger("Talking"); - } - - Locator.GetTravelerAudioManager().StopTravelerAudio(__instance.name); - - if (__instance is ChertTravelerController chert) - { - chert._moodWeight = (float)chert._mood; - } - } + // call directly instead of firing event + __instance.StartConversation(); return false; } [HarmonyPrefix] - [HarmonyPatch(nameof(TravelerController.OnEndConversation))] + [HarmonyPatch(typeof(TravelerController), nameof(TravelerController.OnEndConversation))] public static bool OnEndConversation(TravelerController __instance) { - if (__instance is GabbroTravelerController gabbro) - { - if (gabbro._animator.enabled) - { - gabbro._animator.CrossFadeInFixedTime("Gabbro_Playing", gabbro._delayToRestartAudio, -1, -gabbro._delayToRestartAudio); - gabbro._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Playing", gabbro._delayToRestartAudio, -1, -gabbro._delayToRestartAudio); - } - - Locator.GetTravelerAudioManager().PlayTravelerAudio(gabbro.name, gabbro._delayToRestartAudio); - if (DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_REMINDER") || DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION")) - { - var conditionState = DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION"); - DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_REMINDER"); - DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_ATTENTION"); - GlobalMessenger.FireEvent("TriggerMapPromptReminder", conditionState); - } - } - else - { - if (__instance._animator != null && __instance._animator.enabled) - { - if (__instance._delayToRestartAudio > 0f) - { - __instance._animator.CrossFadeInFixedTime(__instance._playingAnimID, __instance._delayToRestartAudio, -1, -__instance._delayToRestartAudio); - } - else - { - __instance._animator.SetTrigger("Playing"); - } - } - - Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance.name, __instance._delayToRestartAudio); - } - + // call directly instead of firing event + __instance.EndConversation(__instance._delayToRestartAudio); __instance._talking = false; return false; } + + + [HarmonyPrefix] + [HarmonyPatch(typeof(TravelerController), nameof(TravelerController.StartConversation))] + public static bool StartConversation(TravelerController __instance) + { + if (__instance._animator != null && __instance._animator.enabled) + { + __instance._playingAnimID = __instance._animator.IsInTransition(0) + ? __instance._animator.GetNextAnimatorStateInfo(0).fullPathHash + : __instance._animator.GetCurrentAnimatorStateInfo(0).fullPathHash; + __instance._animator.SetTrigger("Talking"); + } + Locator.GetTravelerAudioManager().StopTravelerAudio(__instance); + + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(GabbroTravelerController), nameof(GabbroTravelerController.StartConversation))] + public static bool StartConversation(GabbroTravelerController __instance) + { + if (__instance._animator.enabled) + { + __instance._animator.CrossFadeInFixedTime("Gabbro_Talking", 1.8f); + __instance._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Talking", 1.8f); + } + Locator.GetTravelerAudioManager().StopTravelerAudio(__instance); + + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(TravelerController), nameof(TravelerController.EndConversation))] + public static bool EndConversation(TravelerController __instance, float audioDelay) + { + if (__instance._animator != null && __instance._animator.enabled) + { + if (audioDelay > 0f) + { + __instance._animator.CrossFadeInFixedTime(__instance._playingAnimID, audioDelay, -1, -audioDelay); + } + else + { + __instance._animator.SetTrigger("Playing"); + } + } + Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance, audioDelay); + + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(GabbroTravelerController), nameof(GabbroTravelerController.EndConversation))] + public static bool EndConversation(GabbroTravelerController __instance, float audioDelay) + { + if (__instance._animator.enabled) + { + __instance._animator.CrossFadeInFixedTime("Gabbro_Playing", audioDelay, -1, -audioDelay); + __instance._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Playing", audioDelay, -1, -audioDelay); + } + Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance, audioDelay); + if (DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_REMINDER") || DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION")) + { + var conditionState = DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION"); + DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_REMINDER"); + DialogueConditionManager.SharedInstance.SetConditionState("MAP_PROMPT_ATTENTION"); + GlobalMessenger.FireEvent("TriggerMapPromptReminder", conditionState); + } + + return false; + } } internal static class TravelerAudioManagerExtensions { /// bad, but works great - private static SignalName TravelerToSignal(string name) + private static SignalName TravelerToSignalName(TravelerController traveler) { + var name = traveler.name; + if (name.Contains("Esker")) { return SignalName.Traveler_Esker; @@ -136,27 +150,27 @@ namespace QSB.Animation.NPC.Patches throw new ArgumentOutOfRangeException(nameof(name), name, null); } - internal static void StopTravelerAudio(this TravelerAudioManager manager, string name) + internal static void StopTravelerAudio(this TravelerAudioManager manager, TravelerController traveler) { - var signalName = TravelerToSignal(name); - var audioSignal = manager._signals.First(x => x.GetName() == signalName); + var signalName = TravelerToSignalName(traveler); + var signal = manager._signals.First(x => x.GetName() == signalName); - audioSignal.GetOWAudioSource().FadeOut(0.5f); + signal.GetOWAudioSource().FadeOut(0.5f); } - internal static void PlayTravelerAudio(this TravelerAudioManager manager, string name, float audioDelay) + internal static void PlayTravelerAudio(this TravelerAudioManager manager, TravelerController traveler, float audioDelay) { - var signalName = TravelerToSignal(name); - var audioSignal = manager._signals.First(x => x.GetName() == signalName); + var signalName = TravelerToSignalName(traveler); + var signal = manager._signals.First(x => x.GetName() == signalName); manager._playAfterDelay = false; manager._playAudioTime = Time.time + audioDelay; QSBCore.UnityEvents.RunWhen(() => Time.time >= manager._playAudioTime, () => { - if (!audioSignal.IsOnlyAudibleToScope() || audioSignal.GetOWAudioSource().isPlaying) + if (!signal.IsOnlyAudibleToScope() || signal.GetOWAudioSource().isPlaying) { - audioSignal.GetOWAudioSource().FadeIn(0.5f); - audioSignal.GetOWAudioSource().timeSamples = 0; + signal.GetOWAudioSource().FadeIn(0.5f); + signal.GetOWAudioSource().timeSamples = 0; } }); } diff --git a/QSB/Animation/NPC/WorldObjects/NpcAnimController.cs b/QSB/Animation/NPC/WorldObjects/NpcAnimController.cs index 7285dc47..1b4dd97e 100644 --- a/QSB/Animation/NPC/WorldObjects/NpcAnimController.cs +++ b/QSB/Animation/NPC/WorldObjects/NpcAnimController.cs @@ -10,10 +10,10 @@ namespace QSB.Animation.NPC.WorldObjects public abstract CharacterDialogueTree GetDialogueTree(); public virtual void StartConversation() - => GetDialogueTree().RaiseEvent("OnStartConversation"); + => GetDialogueTree().RaiseEvent(nameof(CharacterDialogueTree.OnStartConversation)); public virtual void EndConversation() - => GetDialogueTree().RaiseEvent("OnEndConversation"); + => GetDialogueTree().RaiseEvent(nameof(CharacterDialogueTree.OnEndConversation)); public virtual bool InConversation() => false; diff --git a/QSB/Animation/Player/AnimControllerPatch.cs b/QSB/Animation/Player/AnimControllerPatch.cs deleted file mode 100644 index 17fe35fe..00000000 --- a/QSB/Animation/Player/AnimControllerPatch.cs +++ /dev/null @@ -1,26 +0,0 @@ -using OWML.Utils; -using UnityEngine; - -namespace QSB.Animation.Player -{ - public static class AnimControllerPatch - { - public static RuntimeAnimatorController SuitedAnimController { get; private set; } - - public static void Init() - { - QSBCore.Helper.Events.Subscribe(OWML.Common.Events.BeforeStart); - QSBCore.Helper.Events.Event += OnEvent; - } - - private static void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) - { - if (behaviour is PlayerAnimController playerAnimController && - ev == OWML.Common.Events.BeforeStart && - SuitedAnimController == null) - { - SuitedAnimController = playerAnimController.GetValue("_baseAnimController"); - } - } - } -} \ No newline at end of file diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index 806b80df..95773279 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -1,7 +1,7 @@ using OWML.Common; -using OWML.Utils; +using QSB.Animation.Player.Messages; using QSB.Animation.Player.Thrusters; -using QSB.Events; +using QSB.Messaging; using QSB.Player; using QSB.Utility; using QuantumUNET.Components; @@ -83,10 +83,10 @@ namespace QSB.Animation.Player } var playerAnimController = body.GetComponent(); - _suitedAnimController = AnimControllerPatch.SuitedAnimController; - _unsuitedAnimController = playerAnimController.GetValue("_unsuitedAnimOverride"); - _suitedGraphics = playerAnimController.GetValue("_suitedGroup"); - _unsuitedGraphics = playerAnimController.GetValue("_unsuitedGroup"); + _suitedAnimController = playerAnimController._baseAnimController; + _unsuitedAnimController = playerAnimController._unsuitedAnimOverride; + _suitedGraphics = playerAnimController._suitedGroup; + _unsuitedGraphics = playerAnimController._unsuitedGroup; } public void InitLocal(Transform body) @@ -106,13 +106,13 @@ namespace QSB.Animation.Player var playerAnimController = body.GetComponent(); playerAnimController.enabled = false; - playerAnimController.SetValue("_suitedGroup", new GameObject()); - playerAnimController.SetValue("_unsuitedGroup", new GameObject()); - playerAnimController.SetValue("_baseAnimController", null); - playerAnimController.SetValue("_unsuitedAnimOverride", null); - playerAnimController.SetValue("_rightArmHidden", false); + playerAnimController._suitedGroup = new GameObject(); + playerAnimController._unsuitedGroup = new GameObject(); + playerAnimController._baseAnimController = null; + playerAnimController._unsuitedAnimOverride = null; + playerAnimController._rightArmHidden = false; - var rightArmObjects = playerAnimController.GetValue("_rightArmObjects").ToList(); + var rightArmObjects = playerAnimController._rightArmObjects.ToList(); rightArmObjects.ForEach(rightArmObject => rightArmObject.layer = LayerMask.NameToLayer("Default")); body.Find("player_mesh_noSuit:Traveller_HEA_Player/player_mesh_noSuit:Player_Head").gameObject.layer = 0; @@ -143,13 +143,13 @@ namespace QSB.Animation.Player private void SuitUp() { - QSBEventManager.FireEvent(EventNames.QSBChangeAnimType, PlayerId, AnimationType.PlayerSuited); + new ChangeAnimTypeMessage(PlayerId, AnimationType.PlayerSuited).Send(); SetAnimationType(AnimationType.PlayerSuited); } private void SuitDown() { - QSBEventManager.FireEvent(EventNames.QSBChangeAnimType, PlayerId, AnimationType.PlayerUnsuited); + new ChangeAnimTypeMessage(PlayerId, AnimationType.PlayerUnsuited).Send(); SetAnimationType(AnimationType.PlayerUnsuited); } @@ -206,12 +206,12 @@ namespace QSB.Animation.Player { _unsuitedGraphics?.SetActive(false); } - + if (_suitedGraphics != null) { _suitedGraphics?.SetActive(true); } - + break; case AnimationType.PlayerUnsuited: @@ -273,7 +273,7 @@ namespace QSB.Animation.Player { VisibleAnimator.SetTrigger("Playing"); } - + if (InvisibleAnimator != null) { InvisibleAnimator.SetTrigger("Playing"); diff --git a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs deleted file mode 100644 index 4aac7220..00000000 --- a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using QSB.Events; -using QSB.Player; - -namespace QSB.Animation.Player.Events -{ - internal class AnimationTriggerEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBAnimTrigger, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBAnimTrigger, Handler); - - private void Handler(uint attachedNetId, string name) => SendEvent(CreateMessage(attachedNetId, name)); - - private AnimationTriggerMessage CreateMessage(uint attachedNetId, string name) => new() - { - AboutId = LocalPlayerId, - AttachedNetId = attachedNetId, - Name = name - }; - - public override void OnReceiveRemote(bool server, AnimationTriggerMessage message) - { - var animationSync = QSBPlayerManager.GetSyncObject(message.AttachedNetId); - if (animationSync == null) - { - return; - } - - if (animationSync.VisibleAnimator == null) - { - return; - } - - animationSync.VisibleAnimator.SetTrigger(message.Name); - } - } -} diff --git a/QSB/Animation/Player/Events/AnimationTriggerMessage.cs b/QSB/Animation/Player/Events/AnimationTriggerMessage.cs deleted file mode 100644 index 09aabbfb..00000000 --- a/QSB/Animation/Player/Events/AnimationTriggerMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.Animation.Player.Events -{ - public class AnimationTriggerMessage : PlayerMessage - { - public uint AttachedNetId { get; set; } - public string Name { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - AttachedNetId = reader.ReadUInt32(); - Name = reader.ReadString(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(AttachedNetId); - writer.Write(Name); - } - } -} diff --git a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs deleted file mode 100644 index 3fbf03fe..00000000 --- a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs +++ /dev/null @@ -1,34 +0,0 @@ -using QSB.Events; -using QSB.Instruments; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Animation.Player.Events -{ - public class ChangeAnimTypeEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBChangeAnimType, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBChangeAnimType, Handler); - - private void Handler(uint player, AnimationType type) => SendEvent(CreateMessage(player, type)); - - private EnumMessage CreateMessage(uint player, AnimationType type) => new() - { - AboutId = player, - EnumValue = type - }; - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - if (!QSBPlayerManager.GetPlayer(message.AboutId).IsReady) - { - return; - } - - QSBPlayerManager.GetPlayer(message.AboutId).AnimationSync.SetAnimationType(message.EnumValue); - QSBPlayerManager.GetSyncObject(message.AboutId).CheckInstrumentProps(message.EnumValue); - } - } -} \ No newline at end of file diff --git a/QSB/Animation/Player/Events/PlayerSuitEvent.cs b/QSB/Animation/Player/Events/PlayerSuitEvent.cs deleted file mode 100644 index 329adb0a..00000000 --- a/QSB/Animation/Player/Events/PlayerSuitEvent.cs +++ /dev/null @@ -1,55 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Animation.Player.Events -{ - public class PlayerSuitEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.SuitUp, HandleSuitUp); - GlobalMessenger.AddListener(EventNames.RemoveSuit, HandleSuitDown); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.SuitUp, HandleSuitUp); - GlobalMessenger.RemoveListener(EventNames.RemoveSuit, HandleSuitDown); - } - - private void HandleSuitUp() => SendEvent(CreateMessage(true)); - private void HandleSuitDown() => SendEvent(CreateMessage(false)); - - private ToggleMessage CreateMessage(bool value) => new() - { - AboutId = LocalPlayerId, - ToggleValue = value - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.SuitedUp = message.ToggleValue; - - if (!player.IsReady) - { - return; - } - - var animator = player.AnimationSync; - var type = message.ToggleValue ? AnimationType.PlayerSuited : AnimationType.PlayerUnsuited; - animator.SetAnimationType(type); - } - - public override void OnReceiveLocal(bool server, ToggleMessage message) - { - QSBPlayerManager.LocalPlayer.SuitedUp = message.ToggleValue; - var animator = QSBPlayerManager.LocalPlayer.AnimationSync; - var type = message.ToggleValue ? AnimationType.PlayerSuited : AnimationType.PlayerUnsuited; - animator.CurrentType = type; - } - } -} \ No newline at end of file diff --git a/QSB/Animation/Player/Messages/AnimationTriggerMessage.cs b/QSB/Animation/Player/Messages/AnimationTriggerMessage.cs new file mode 100644 index 00000000..0000c1a2 --- /dev/null +++ b/QSB/Animation/Player/Messages/AnimationTriggerMessage.cs @@ -0,0 +1,51 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.Animation.Player.Messages +{ + internal class AnimationTriggerMessage : QSBMessage + { + private uint AttachedNetId; + private string Name; + + public AnimationTriggerMessage(uint attachedNetId, string name) + { + AttachedNetId = attachedNetId; + Name = name; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(AttachedNetId); + writer.Write(Name); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + AttachedNetId = reader.ReadUInt32(); + Name = reader.ReadString(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var animationSync = QSBPlayerManager.GetSyncObject(AttachedNetId); + if (animationSync == null) + { + return; + } + + if (animationSync.VisibleAnimator == null) + { + return; + } + + animationSync.VisibleAnimator.SetTrigger(Name); + } + } +} diff --git a/QSB/Animation/Player/Messages/ChangeAnimTypeMessage.cs b/QSB/Animation/Player/Messages/ChangeAnimTypeMessage.cs new file mode 100644 index 00000000..89d32f1e --- /dev/null +++ b/QSB/Animation/Player/Messages/ChangeAnimTypeMessage.cs @@ -0,0 +1,45 @@ +using QSB.Instruments; +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.Animation.Player.Messages +{ + public class ChangeAnimTypeMessage : QSBEnumMessage + { + private uint PlayerId; + + public ChangeAnimTypeMessage(uint playerId, AnimationType type) + { + PlayerId = playerId; + Value = type; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerId = reader.ReadUInt32(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(PlayerId); + if (!player.IsReady) + { + return; + } + + player.AnimationSync.SetAnimationType(Value); + QSBPlayerManager.GetSyncObject(PlayerId).CheckInstrumentProps(Value); + } + } +} \ No newline at end of file diff --git a/QSB/Animation/Player/Messages/PlayerSuitMessage.cs b/QSB/Animation/Player/Messages/PlayerSuitMessage.cs new file mode 100644 index 00000000..4ced435a --- /dev/null +++ b/QSB/Animation/Player/Messages/PlayerSuitMessage.cs @@ -0,0 +1,48 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; + +namespace QSB.Animation.Player.Messages +{ + public class PlayerSuitMessage : QSBBoolMessage + { + static PlayerSuitMessage() + { + GlobalMessenger.AddListener(OWEvents.SuitUp, () => Handle(true)); + GlobalMessenger.AddListener(OWEvents.RemoveSuit, () => Handle(false)); + } + + private static void Handle(bool on) + { + if (PlayerTransformSync.LocalInstance) + { + new PlayerSuitMessage(on).Send(); + } + } + + private PlayerSuitMessage(bool on) => Value = on; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.SuitedUp = Value; + + if (!player.IsReady) + { + return; + } + + var animator = player.AnimationSync; + var type = Value ? AnimationType.PlayerSuited : AnimationType.PlayerUnsuited; + animator.SetAnimationType(type); + } + + public override void OnReceiveLocal() + { + QSBPlayerManager.LocalPlayer.SuitedUp = Value; + var animator = QSBPlayerManager.LocalPlayer.AnimationSync; + var type = Value ? AnimationType.PlayerSuited : AnimationType.PlayerUnsuited; + animator.CurrentType = type; + } + } +} \ No newline at end of file diff --git a/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs b/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs index a181fcd8..d2d0beb4 100644 --- a/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs +++ b/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs @@ -1,11 +1,12 @@ using HarmonyLib; -using QSB.Events; +using QSB.Animation.Player.Messages; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using QSB.Utility; using UnityEngine; -namespace QSB.Animation.Patches +namespace QSB.Animation.Player.Patches { [HarmonyPatch] internal class PlayerAnimationPatches : QSBPatch @@ -15,28 +16,16 @@ namespace QSB.Animation.Patches [HarmonyPrefix] [HarmonyPatch(typeof(PlayerAnimController), nameof(PlayerAnimController.LateUpdate))] public static bool LateUpdateReplacement( - PlayerAnimController __instance, - PlayerCharacterController ____playerController, - ThrusterModel ____playerJetpack, - ref float ____ungroundedTime, - Animator ____animator, - ref bool ____justBecameGrounded, - ref bool ____justTookFallDamage, - ref bool ____leftFootGrounded, - ref bool ____rightFootGrounded, - ref bool ____rightArmHidden, - GameObject[] ____rightArmObjects, - int ____defaultLayer, - int ____probeOnlyLayer) + PlayerAnimController __instance) { - var isGrounded = ____playerController.IsGrounded(); + var isGrounded = __instance._playerController.IsGrounded(); var isAttached = PlayerState.IsAttached(); var isInZeroG = PlayerState.InZeroG(); - var isFlying = ____playerJetpack.GetLocalAcceleration().y > 0f; + var isFlying = __instance._playerJetpack.GetLocalAcceleration().y > 0f; var movementVector = Vector3.zero; if (!isAttached) { - movementVector = ____playerController.GetRelativeGroundVelocity(); + movementVector = __instance._playerController.GetRelativeGroundVelocity(); } if (Mathf.Abs(movementVector.x) < 0.05f) @@ -51,77 +40,77 @@ namespace QSB.Animation.Patches if (isFlying) { - ____ungroundedTime = Time.time; + __instance._ungroundedTime = Time.time; } var freefallMagnitude = 0f; var timeInFreefall = 0f; - var lastGroundBody = ____playerController.GetLastGroundBody(); + var lastGroundBody = __instance._playerController.GetLastGroundBody(); if (!isGrounded && !isAttached && !isInZeroG && lastGroundBody != null) { - freefallMagnitude = (____playerController.GetAttachedOWRigidbody(false).GetVelocity() - lastGroundBody.GetPointVelocity(____playerController.transform.position)).magnitude; - timeInFreefall = Time.time - ____ungroundedTime; + freefallMagnitude = (__instance._playerController.GetAttachedOWRigidbody().GetVelocity() - lastGroundBody.GetPointVelocity(__instance._playerController.transform.position)).magnitude; + timeInFreefall = Time.time - __instance._ungroundedTime; } - ____animator.SetFloat("RunSpeedX", movementVector.x / 3f); - ____animator.SetFloat("RunSpeedY", movementVector.z / 3f); - ____animator.SetFloat("TurnSpeed", ____playerController.GetTurning()); - ____animator.SetBool("Grounded", isGrounded || isAttached || PlayerState.IsRecentlyDetached()); - ____animator.SetLayerWeight(1, ____playerController.GetJumpCrouchFraction()); - ____animator.SetFloat("FreefallSpeed", freefallMagnitude / 15f * (timeInFreefall / 3f)); - ____animator.SetBool("InZeroG", isInZeroG || isFlying); - ____animator.SetBool("UsingJetpack", isInZeroG && PlayerState.IsWearingSuit()); - if (____justBecameGrounded) + __instance._animator.SetFloat("RunSpeedX", movementVector.x / 3f); + __instance._animator.SetFloat("RunSpeedY", movementVector.z / 3f); + __instance._animator.SetFloat("TurnSpeed", __instance._playerController.GetTurning()); + __instance._animator.SetBool("Grounded", isGrounded || isAttached || PlayerState.IsRecentlyDetached()); + __instance._animator.SetLayerWeight(1, __instance._playerController.GetJumpCrouchFraction()); + __instance._animator.SetFloat("FreefallSpeed", freefallMagnitude / 15f * (timeInFreefall / 3f)); + __instance._animator.SetBool("InZeroG", isInZeroG || isFlying); + __instance._animator.SetBool("UsingJetpack", isInZeroG && PlayerState.IsWearingSuit()); + if (__instance._justBecameGrounded) { var playerAnimationSync = QSBPlayerManager.LocalPlayer.AnimationSync; - if (____justTookFallDamage) + if (__instance._justTookFallDamage) { - ____animator.SetTrigger("LandHard"); - QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "LandHard"); + __instance._animator.SetTrigger("LandHard"); + new AnimationTriggerMessage(playerAnimationSync.AttachedNetId, "LandHard").Send(); } else { - ____animator.SetTrigger("Land"); - QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "Land"); + __instance._animator.SetTrigger("Land"); + new AnimationTriggerMessage(playerAnimationSync.AttachedNetId, "Land").Send(); } } if (isGrounded) { - var leftFootLift = ____animator.GetFloat("LeftFootLift"); - if (!____leftFootGrounded && leftFootLift < 0.333f) + var leftFootLift = __instance._animator.GetFloat("LeftFootLift"); + if (!__instance._leftFootGrounded && leftFootLift < 0.333f) { - ____leftFootGrounded = true; - __instance.RaiseEvent("OnLeftFootGrounded"); + __instance._leftFootGrounded = true; + __instance.RaiseEvent(nameof(__instance.OnLeftFootGrounded)); } - else if (____leftFootGrounded && leftFootLift > 0.666f) + else if (__instance._leftFootGrounded && leftFootLift > 0.666f) { - ____leftFootGrounded = false; - __instance.RaiseEvent("OnLeftFootLift"); + __instance._leftFootGrounded = false; + __instance.RaiseEvent(nameof(__instance.OnLeftFootLift)); } - var rightFootLift = ____animator.GetFloat("RightFootLift"); - if (!____rightFootGrounded && rightFootLift < 0.333f) + var rightFootLift = __instance._animator.GetFloat("RightFootLift"); + if (!__instance._rightFootGrounded && rightFootLift < 0.333f) { - ____rightFootGrounded = true; - __instance.RaiseEvent("OnRightFootGrounded"); + __instance._rightFootGrounded = true; + __instance.RaiseEvent(nameof(__instance.OnRightFootGrounded)); } - else if (____rightFootGrounded && rightFootLift > 0.666f) + else if (__instance._rightFootGrounded && rightFootLift > 0.666f) { - ____rightFootGrounded = false; - __instance.RaiseEvent("OnRightFootLift"); + __instance._rightFootGrounded = false; + __instance.RaiseEvent(nameof(__instance.OnRightFootLift)); } } - ____justBecameGrounded = false; - ____justTookFallDamage = false; + __instance._justBecameGrounded = false; + __instance._justTookFallDamage = false; var usingTool = Locator.GetToolModeSwapper().GetToolMode() != ToolMode.None; - if ((usingTool && !____rightArmHidden) || (!usingTool && ____rightArmHidden)) + if ((usingTool && !__instance._rightArmHidden) || (!usingTool && __instance._rightArmHidden)) { - ____rightArmHidden = usingTool; - for (var i = 0; i < ____rightArmObjects.Length; i++) + __instance._rightArmHidden = usingTool; + for (var i = 0; i < __instance._rightArmObjects.Length; i++) { - ____rightArmObjects[i].layer = (!____rightArmHidden) ? ____defaultLayer : ____probeOnlyLayer; + __instance._rightArmObjects[i].layer = (!__instance._rightArmHidden) ? __instance._defaultLayer : __instance._probeOnlyLayer; } } @@ -140,7 +129,7 @@ namespace QSB.Animation.Patches __instance._animator.SetTrigger("Jump"); var playerAnimationSync = QSBPlayerManager.LocalPlayer.AnimationSync; - QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "Jump"); + new AnimationTriggerMessage(playerAnimationSync.AttachedNetId, "Jump").Send(); return false; } } diff --git a/QSB/Animation/Player/Thrusters/ThrusterManager.cs b/QSB/Animation/Player/Thrusters/ThrusterManager.cs index e8870a03..bd76a0d3 100644 --- a/QSB/Animation/Player/Thrusters/ThrusterManager.cs +++ b/QSB/Animation/Player/Thrusters/ThrusterManager.cs @@ -1,5 +1,4 @@ -using OWML.Utils; -using QSB.Player; +using QSB.Player; using QSB.Utility; using UnityEngine; @@ -45,8 +44,8 @@ namespace QSB.Animation.Player.Thrusters foreach (var controller in existingControllers) { var gameObject = controller.gameObject; - var oldThruster = controller.GetValue("_thruster"); - var oldLight = controller.GetValue("_light"); + var oldThruster = controller._thruster; + var oldLight = controller._light; var localPos = oldThruster switch { Thruster.Up_RightThruster or Thruster.Up_LeftThruster => new Vector3(0, 0, 3), @@ -55,9 +54,9 @@ namespace QSB.Animation.Player.Thrusters }; oldLight.transform.localPosition = localPos; - var oldAnimCurve = controller.GetValue("_scaleByThrust"); - var oldScaleSpring = controller.GetValue("_scaleSpring"); - var oldScalar = controller.GetValue("_belowMaxThrustScalar"); + var oldAnimCurve = controller._scaleByThrust; + var oldScaleSpring = controller._scaleSpring; + var oldScalar = controller._belowMaxThrustScalar; var oldBase = oldLight.range; Object.Destroy(controller); var newObj = gameObject.AddComponent(); @@ -82,9 +81,9 @@ namespace QSB.Animation.Player.Thrusters private static void CreateThrusterWashController(GameObject root, PlayerInfo player) { var old = root.GetComponent(); - var oldDistanceScale = old.GetValue("_emissionDistanceScale"); - var oldThrusterScale = old.GetValue("_emissionThrusterScale"); - var defaultParticleSystem = old.GetValue("_defaultParticleSystem"); + var oldDistanceScale = old._emissionDistanceScale; + var oldThrusterScale = old._emissionThrusterScale; + var defaultParticleSystem = old._defaultParticleSystem; Object.Destroy(old); diff --git a/QSB/Audio/QSBPlayerAudioController.cs b/QSB/Audio/QSBPlayerAudioController.cs index 810342e7..964ad84a 100644 --- a/QSB/Audio/QSBPlayerAudioController.cs +++ b/QSB/Audio/QSBPlayerAudioController.cs @@ -23,16 +23,16 @@ namespace QSB.Audio } public void PlayEquipTool() - => _oneShotExternalSource.PlayOneShot(AudioType.ToolTranslatorEquip, 1f); + => _oneShotExternalSource.PlayOneShot(AudioType.ToolTranslatorEquip); public void PlayUnequipTool() - => _oneShotExternalSource.PlayOneShot(AudioType.ToolTranslatorUnequip, 1f); + => _oneShotExternalSource.PlayOneShot(AudioType.ToolTranslatorUnequip); public void PlayTurnOnFlashlight() - => _oneShotExternalSource.PlayOneShot(AudioType.ToolFlashlightOn, 1f); + => _oneShotExternalSource.PlayOneShot(AudioType.ToolFlashlightOn); public void PlayTurnOffFlashlight() - => _oneShotExternalSource.PlayOneShot(AudioType.ToolFlashlightOff, 1f); + => _oneShotExternalSource.PlayOneShot(AudioType.ToolFlashlightOff); private OWAudioSource CreateBaseAudio( Transform parent, diff --git a/QSB/AuthoritySync/AuthQueueEvent.cs b/QSB/AuthoritySync/AuthQueueEvent.cs deleted file mode 100644 index bdefd1bc..00000000 --- a/QSB/AuthoritySync/AuthQueueEvent.cs +++ /dev/null @@ -1,34 +0,0 @@ -using QSB.Events; -using QuantumUNET.Components; - -namespace QSB.AuthoritySync -{ - public class AuthQueueEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => - GlobalMessenger.AddListener(EventNames.QSBAuthQueue, Handler); - - public override void CloseListener() => - GlobalMessenger.RemoveListener(EventNames.QSBAuthQueue, Handler); - - private void Handler(QNetworkIdentity identity, AuthQueueAction action) => SendEvent(CreateMessage(identity, action)); - - private AuthQueueMessage CreateMessage(QNetworkIdentity identity, AuthQueueAction action) => new() - { - OnlySendToHost = true, - Identity = identity, - EnumValue = action - }; - - - public override void OnReceiveLocal(bool isHost, AuthQueueMessage message) => OnReceive(message); - public override void OnReceiveRemote(bool isHost, AuthQueueMessage message) => OnReceive(message); - - private static void OnReceive(AuthQueueMessage message) - { - message.Identity.UpdateAuthQueue(message.FromId, message.EnumValue); - } - } -} diff --git a/QSB/AuthoritySync/AuthQueueMessage.cs b/QSB/AuthoritySync/AuthQueueMessage.cs index 889383ac..d0f7649b 100644 --- a/QSB/AuthoritySync/AuthQueueMessage.cs +++ b/QSB/AuthoritySync/AuthQueueMessage.cs @@ -1,38 +1,53 @@ using QSB.Messaging; -using QuantumUNET.Components; +using QSB.WorldSync; +using QuantumUNET; using QuantumUNET.Transport; namespace QSB.AuthoritySync { - public class AuthQueueMessage : EnumMessage + /// + /// always sent to host + /// + public class AuthQueueMessage : QSBEnumMessage { - public QNetworkIdentity Identity; + private QNetworkInstanceId NetId; - public override void Deserialize(QNetworkReader reader) + public AuthQueueMessage(QNetworkInstanceId netId, AuthQueueAction action) { - base.Deserialize(reader); - Identity = reader.ReadNetworkIdentity(); + To = 0; + NetId = netId; + Value = action; } public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); - writer.Write(Identity); + writer.Write(NetId); } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + NetId = reader.ReadNetworkId(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + public override void OnReceiveLocal() => OnReceiveRemote(); + public override void OnReceiveRemote() => QNetworkServer.objects[NetId].UpdateAuthQueue(From, Value); } public enum AuthQueueAction { /// - /// add identity to the queue + /// add player to the queue /// Add, /// - /// remove identity from the queue + /// remove player from the queue /// Remove, /// - /// add identity to the queue and force it to the front + /// add player to the queue and force them to the front /// Force } diff --git a/QSB/AuthoritySync/AuthorityManager.cs b/QSB/AuthoritySync/AuthorityManager.cs index 2a875253..987e1f3d 100644 --- a/QSB/AuthoritySync/AuthorityManager.cs +++ b/QSB/AuthoritySync/AuthorityManager.cs @@ -1,4 +1,4 @@ -using QSB.Events; +using QSB.Messaging; using QSB.Utility; using QuantumUNET; using QuantumUNET.Components; @@ -88,8 +88,8 @@ namespace QSB.AuthoritySync #region any client - public static void FireAuthQueue(this QNetworkIdentity identity, AuthQueueAction action) => - QSBEventManager.FireEvent(EventNames.QSBAuthQueue, identity, action); + public static void SendAuthQueueMessage(this QNetworkIdentity identity, AuthQueueAction action) => + new AuthQueueMessage(identity.NetId, action).Send(); #endregion } diff --git a/QSB/CampfireSync/Events/CampfireStateEvent.cs b/QSB/CampfireSync/Events/CampfireStateEvent.cs deleted file mode 100644 index ef3b813b..00000000 --- a/QSB/CampfireSync/Events/CampfireStateEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using QSB.CampfireSync.WorldObjects; -using QSB.Events; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.CampfireSync.Events -{ - internal class CampfireStateEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBCampfireState, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBCampfireState, Handler); - - private void Handler(int objId, Campfire.State state) => SendEvent(CreateMessage(objId, state)); - - private EnumWorldObjectMessage CreateMessage(int objId, Campfire.State state) => new() - { - AboutId = LocalPlayerId, - ObjectId = objId, - EnumValue = state - }; - - public override void OnReceiveRemote(bool server, EnumWorldObjectMessage message) - { - var campfireObj = QSBWorldSync.GetWorldFromId(message.ObjectId); - campfireObj.SetState(message.EnumValue); - } - } -} diff --git a/QSB/CampfireSync/Messages/CampfireStateMessage.cs b/QSB/CampfireSync/Messages/CampfireStateMessage.cs new file mode 100644 index 00000000..34765909 --- /dev/null +++ b/QSB/CampfireSync/Messages/CampfireStateMessage.cs @@ -0,0 +1,12 @@ +using QSB.CampfireSync.WorldObjects; +using QSB.Messaging; + +namespace QSB.CampfireSync.Messages +{ + internal class CampfireStateMessage : QSBEnumWorldObjectMessage + { + public CampfireStateMessage(Campfire.State state) => Value = state; + + public override void OnReceiveRemote() => WorldObject.SetState(Value); + } +} diff --git a/QSB/CampfireSync/Patches/CampfirePatches.cs b/QSB/CampfireSync/Patches/CampfirePatches.cs index 3a0c8bc7..86852c46 100644 --- a/QSB/CampfireSync/Patches/CampfirePatches.cs +++ b/QSB/CampfireSync/Patches/CampfirePatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; +using QSB.CampfireSync.Messages; using QSB.CampfireSync.WorldObjects; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.WorldSync; @@ -15,7 +16,7 @@ namespace QSB.CampfireSync.Patches [HarmonyPatch(typeof(Campfire), nameof(Campfire.OnPressInteract))] public static bool LightCampfireEvent(Campfire __instance) { - var qsbCampfire = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbCampfire = __instance.GetWorldObject(); if (__instance._state == Campfire.State.LIT) { qsbCampfire.StartRoasting(); @@ -23,7 +24,7 @@ namespace QSB.CampfireSync.Patches else { qsbCampfire.SetState(Campfire.State.LIT); - QSBEventManager.FireEvent(EventNames.QSBCampfireState, qsbCampfire.ObjectId, Campfire.State.LIT); + qsbCampfire.SendMessage(new CampfireStateMessage(Campfire.State.LIT)); Locator.GetFlashlight().TurnOff(false); } diff --git a/QSB/CampfireSync/WorldObjects/QSBCampfire.cs b/QSB/CampfireSync/WorldObjects/QSBCampfire.cs index 60e08cbd..58a751a0 100644 --- a/QSB/CampfireSync/WorldObjects/QSBCampfire.cs +++ b/QSB/CampfireSync/WorldObjects/QSBCampfire.cs @@ -1,15 +1,11 @@ using QSB.WorldSync; -using System.Reflection; namespace QSB.CampfireSync.WorldObjects { public class QSBCampfire : WorldObject { public void StartRoasting() - => AttachedObject - .GetType() - .GetMethod("StartRoasting", BindingFlags.NonPublic | BindingFlags.Instance) - .Invoke(AttachedObject, null); + => AttachedObject.StartRoasting(); public Campfire.State GetState() => AttachedObject.GetState(); diff --git a/QSB/ClientServerStateSync/ClientStateManager.cs b/QSB/ClientServerStateSync/ClientStateManager.cs index 75af39a7..e7f7f32d 100644 --- a/QSB/ClientServerStateSync/ClientStateManager.cs +++ b/QSB/ClientServerStateSync/ClientStateManager.cs @@ -1,4 +1,5 @@ -using QSB.Events; +using QSB.ClientServerStateSync.Messages; +using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; using QSB.Utility; @@ -19,13 +20,17 @@ namespace QSB.ClientServerStateSync private void Start() { QSBSceneManager.OnSceneLoaded += OnSceneLoaded; - QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => QSBEventManager.FireEvent(EventNames.QSBClientState, ForceGetCurrentState())); + QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, + () => new ClientStateMessage(ForceGetCurrentState()).Send()); } - public void FireChangeClientStateEvent(ClientState newState) + private void OnDestroy() => + QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; + + public void SendChangeClientStateMessage(ClientState newState) { ChangeClientState(newState); - QSBEventManager.FireEvent(EventNames.QSBClientState, newState); + new ClientStateMessage(newState).Send(); } public void ChangeClientState(ClientState newState) @@ -137,7 +142,7 @@ namespace QSB.ClientServerStateSync } } - FireChangeClientStateEvent(newState); + SendChangeClientStateMessage(newState); } public void OnDeath() @@ -145,7 +150,7 @@ namespace QSB.ClientServerStateSync var currentScene = QSBSceneManager.CurrentScene; if (currentScene == OWScene.SolarSystem) { - FireChangeClientStateEvent(ClientState.DeadInSolarSystem); + SendChangeClientStateMessage(ClientState.DeadInSolarSystem); } else if (currentScene == OWScene.EyeOfTheUniverse) { @@ -164,7 +169,7 @@ namespace QSB.ClientServerStateSync if (currentScene == OWScene.SolarSystem) { DebugLog.DebugWrite($"RESPAWN!"); - FireChangeClientStateEvent(ClientState.AliveInSolarSystem); + SendChangeClientStateMessage(ClientState.AliveInSolarSystem); } else { diff --git a/QSB/ClientServerStateSync/Events/ClientStateEvent.cs b/QSB/ClientServerStateSync/Events/ClientStateEvent.cs deleted file mode 100644 index 1b3a37cd..00000000 --- a/QSB/ClientServerStateSync/Events/ClientStateEvent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; -using QSB.Utility; - -namespace QSB.ClientServerStateSync.Events -{ - internal class ClientStateEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBClientState, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBClientState, Handler); - - private void Handler(ClientState state) => SendEvent(CreateMessage(state)); - - private EnumMessage CreateMessage(ClientState state) => new() - { - AboutId = LocalPlayerId, - EnumValue = state - }; - - public override void OnReceiveLocal(bool server, EnumMessage message) - => ClientStateManager.Instance.ChangeClientState(message.EnumValue); - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - if (message.AboutId == uint.MaxValue) - { - DebugLog.ToConsole($"Error - ID is uint.MaxValue!", OWML.Common.MessageType.Error); - return; - } - - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.State = message.EnumValue; - } - } -} diff --git a/QSB/ClientServerStateSync/Events/ServerStateEvent.cs b/QSB/ClientServerStateSync/Events/ServerStateEvent.cs deleted file mode 100644 index bfbfdfa6..00000000 --- a/QSB/ClientServerStateSync/Events/ServerStateEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.ClientServerStateSync.Events -{ - internal class ServerStateEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBServerState, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBServerState, Handler); - - private void Handler(ServerState state) => SendEvent(CreateMessage(state)); - - private EnumMessage CreateMessage(ServerState state) => new() - { - AboutId = LocalPlayerId, - EnumValue = state - }; - - public override void OnReceiveLocal(bool server, EnumMessage message) - => OnReceiveRemote(server, message); - - public override void OnReceiveRemote(bool server, EnumMessage message) - => ServerStateManager.Instance.ChangeServerState(message.EnumValue); - } -} diff --git a/QSB/ClientServerStateSync/Messages/ClientStateMessage.cs b/QSB/ClientServerStateSync/Messages/ClientStateMessage.cs new file mode 100644 index 00000000..a42a6d1e --- /dev/null +++ b/QSB/ClientServerStateSync/Messages/ClientStateMessage.cs @@ -0,0 +1,27 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Player; +using QSB.Utility; + +namespace QSB.ClientServerStateSync.Messages +{ + internal class ClientStateMessage : QSBEnumMessage + { + public ClientStateMessage(ClientState state) => Value = state; + + public override void OnReceiveLocal() + => ClientStateManager.Instance.ChangeClientState(Value); + + public override void OnReceiveRemote() + { + if (From == uint.MaxValue) + { + DebugLog.ToConsole($"Error - ID is uint.MaxValue!", MessageType.Error); + return; + } + + var player = QSBPlayerManager.GetPlayer(From); + player.State = Value; + } + } +} diff --git a/QSB/ClientServerStateSync/Messages/ServerStateMessage.cs b/QSB/ClientServerStateSync/Messages/ServerStateMessage.cs new file mode 100644 index 00000000..ee8c7fe9 --- /dev/null +++ b/QSB/ClientServerStateSync/Messages/ServerStateMessage.cs @@ -0,0 +1,13 @@ +using QSB.Messaging; + +namespace QSB.ClientServerStateSync.Messages +{ + internal class ServerStateMessage : QSBEnumMessage + { + public ServerStateMessage(ServerState state) => Value = state; + + public override void OnReceiveLocal() => OnReceiveRemote(); + public override void OnReceiveRemote() + => ServerStateManager.Instance.ChangeServerState(Value); + } +} diff --git a/QSB/ClientServerStateSync/ServerStateManager.cs b/QSB/ClientServerStateSync/ServerStateManager.cs index 0309d399..13af1727 100644 --- a/QSB/ClientServerStateSync/ServerStateManager.cs +++ b/QSB/ClientServerStateSync/ServerStateManager.cs @@ -1,4 +1,6 @@ -using QSB.Events; +using QSB.ClientServerStateSync.Messages; +using QSB.DeathSync.Messages; +using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; using QSB.Utility; @@ -30,13 +32,20 @@ namespace QSB.ClientServerStateSync QSBSceneManager.OnSceneLoaded += OnSceneLoaded; GlobalMessenger.AddListener("TriggerSupernova", OnTriggerSupernova); - QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => QSBEventManager.FireEvent(EventNames.QSBServerState, ForceGetCurrentState())); + QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, + () => new ServerStateMessage(ForceGetCurrentState()).Send()); } - public void FireChangeServerStateEvent(ServerState newState) + private void OnDestroy() + { + QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; + GlobalMessenger.RemoveListener("TriggerSupernova", OnTriggerSupernova); + } + + public void SendChangeServerStateMessage(ServerState newState) { ChangeServerState(newState); - QSBEventManager.FireEvent(EventNames.QSBServerState, newState); + new ServerStateMessage(newState).Send(); } public void ChangeServerState(ServerState newState) @@ -60,34 +69,34 @@ namespace QSB.ClientServerStateSync case OWScene.Credits_Fast: case OWScene.Credits_Final: case OWScene.PostCreditsScene: - FireChangeServerStateEvent(ServerState.Credits); + SendChangeServerStateMessage(ServerState.Credits); break; case OWScene.TitleScreen: - FireChangeServerStateEvent(ServerState.NotLoaded); + SendChangeServerStateMessage(ServerState.NotLoaded); break; case OWScene.SolarSystem: if (oldScene == OWScene.SolarSystem) { - FireChangeServerStateEvent(ServerState.WaitingForAllPlayersToReady); + SendChangeServerStateMessage(ServerState.WaitingForAllPlayersToReady); } else { - FireChangeServerStateEvent(ServerState.InSolarSystem); + SendChangeServerStateMessage(ServerState.InSolarSystem); } break; case OWScene.EyeOfTheUniverse: - FireChangeServerStateEvent(ServerState.WaitingForAllPlayersToReady); + SendChangeServerStateMessage(ServerState.WaitingForAllPlayersToReady); break; case OWScene.None: case OWScene.Undefined: default: DebugLog.ToConsole($"Warning - newScene is {newScene}!", OWML.Common.MessageType.Warning); - FireChangeServerStateEvent(ServerState.NotLoaded); + SendChangeServerStateMessage(ServerState.NotLoaded); break; } } @@ -96,17 +105,24 @@ namespace QSB.ClientServerStateSync { if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) { - FireChangeServerStateEvent(ServerState.WaitingForAllPlayersToDie); + SendChangeServerStateMessage(ServerState.WaitingForAllPlayersToDie); } } - private static ServerState ForceGetCurrentState() - => QSBSceneManager.CurrentScene switch + private ServerState ForceGetCurrentState() + { + var currentScene = LoadManager.GetCurrentScene(); + + switch (currentScene) { - OWScene.SolarSystem => ServerState.InSolarSystem, - OWScene.EyeOfTheUniverse => ServerState.InEye, - _ => ServerState.NotLoaded - }; + case OWScene.SolarSystem: + return ServerState.InSolarSystem; + case OWScene.EyeOfTheUniverse: + return ServerState.InEye; + default: + return ServerState.NotLoaded; + } + } private void Update() { @@ -124,24 +140,24 @@ namespace QSB.ClientServerStateSync if (_currentState == ServerState.WaitingForAllPlayersToReady) { if (QSBPlayerManager.PlayerList.All(x - => x.State is ClientState.WaitingForOthersToBeReady - or ClientState.AliveInSolarSystem - or ClientState.AliveInEye)) + => x.State is ClientState.WaitingForOthersToBeReady + or ClientState.AliveInSolarSystem + or ClientState.AliveInEye)) { DebugLog.DebugWrite($"All ready!!"); - QSBEventManager.FireEvent(EventNames.QSBStartLoop); + new StartLoopMessage().Send(); if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) { - FireChangeServerStateEvent(ServerState.InSolarSystem); + SendChangeServerStateMessage(ServerState.InSolarSystem); } else if (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) { - FireChangeServerStateEvent(ServerState.InEye); + SendChangeServerStateMessage(ServerState.InEye); } else { DebugLog.ToConsole($"Error - All players were ready in non-universe scene!?", OWML.Common.MessageType.Error); - FireChangeServerStateEvent(ServerState.NotLoaded); + SendChangeServerStateMessage(ServerState.NotLoaded); } _blockNextCheck = true; diff --git a/QSB/ConversationSync/ConversationManager.cs b/QSB/ConversationSync/ConversationManager.cs index c69712be..820f81dc 100644 --- a/QSB/ConversationSync/ConversationManager.cs +++ b/QSB/ConversationSync/ConversationManager.cs @@ -1,6 +1,7 @@ using OWML.Common; +using QSB.ConversationSync.Messages; using QSB.ConversationSync.WorldObjects; -using QSB.Events; +using QSB.Messaging; using QSB.Player; using QSB.Utility; using QSB.WorldSync; @@ -48,7 +49,7 @@ namespace QSB.ConversationSync } public void SendPlayerOption(string text) => - QSBEventManager.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, text, ConversationType.Player); + new ConversationMessage(ConversationType.Player, (int)QSBPlayerManager.LocalPlayerId, text).Send(); public void SendCharacterDialogue(int id, string text) { @@ -58,14 +59,14 @@ namespace QSB.ConversationSync return; } - QSBEventManager.FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character); + new ConversationMessage(ConversationType.Character, id, text).Send(); } public void CloseBoxPlayer() => - QSBEventManager.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, "", ConversationType.ClosePlayer); + new ConversationMessage(ConversationType.ClosePlayer, (int)QSBPlayerManager.LocalPlayerId).Send(); public void CloseBoxCharacter(int id) => - QSBEventManager.FireEvent(EventNames.QSBConversation, (uint)id, "", ConversationType.CloseCharacter); + new ConversationMessage(ConversationType.CloseCharacter, id).Send(); public void SendConvState(int charId, bool state) { @@ -75,7 +76,7 @@ namespace QSB.ConversationSync return; } - QSBEventManager.FireEvent(EventNames.QSBConversationStartEnd, charId, QSBPlayerManager.LocalPlayerId, state); + new ConversationStartEndMessage(charId, QSBPlayerManager.LocalPlayerId, state).Send(); } public void DisplayPlayerConversationBox(uint playerId, string text) diff --git a/QSB/ConversationSync/Events/ConversationEvent.cs b/QSB/ConversationSync/Events/ConversationEvent.cs deleted file mode 100644 index 3cd9f853..00000000 --- a/QSB/ConversationSync/Events/ConversationEvent.cs +++ /dev/null @@ -1,55 +0,0 @@ -using QSB.Events; -using QSB.Player; -using QSB.WorldSync; -using System.Text.RegularExpressions; - -namespace QSB.ConversationSync.Events -{ - public class ConversationEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBConversation, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBConversation, Handler); - - private void Handler(uint id, string message, ConversationType type) => SendEvent(CreateMessage(id, message, type)); - - private ConversationMessage CreateMessage(uint id, string message, ConversationType type) => new() - { - AboutId = LocalPlayerId, - ObjectId = (int)id, - EnumValue = type, - Message = message - }; - - public override void OnReceiveRemote(bool server, ConversationMessage message) - { - switch (message.EnumValue) - { - case ConversationType.Character: - var translated = TextTranslation.Translate(message.Message).Trim(); - translated = Regex.Replace(translated, @"<[Pp]ause=?\d*\.?\d*\s?\/?>", ""); - ConversationManager.Instance.DisplayCharacterConversationBox(message.ObjectId, translated); - break; - - case ConversationType.Player: - ConversationManager.Instance.DisplayPlayerConversationBox((uint)message.ObjectId, message.Message); - break; - - case ConversationType.CloseCharacter: - if (message.ObjectId == -1) - { - break; - } - - var tree = QSBWorldSync.OldDialogueTrees[message.ObjectId]; - UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]); - break; - - case ConversationType.ClosePlayer: - UnityEngine.Object.Destroy(QSBPlayerManager.GetPlayer((uint)message.ObjectId).CurrentDialogueBox); - break; - } - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Events/ConversationMessage.cs b/QSB/ConversationSync/Events/ConversationMessage.cs deleted file mode 100644 index 46f927db..00000000 --- a/QSB/ConversationSync/Events/ConversationMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.ConversationSync.Events -{ - public class ConversationMessage : EnumWorldObjectMessage - { - public string Message { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Message = reader.ReadString(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Message); - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Events/ConversationStartEndEvent.cs b/QSB/ConversationSync/Events/ConversationStartEndEvent.cs deleted file mode 100644 index 6b14cdbf..00000000 --- a/QSB/ConversationSync/Events/ConversationStartEndEvent.cs +++ /dev/null @@ -1,63 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.Player; -using QSB.Utility; -using QSB.WorldSync; - -namespace QSB.ConversationSync.Events -{ - public class ConversationStartEndEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBConversationStartEnd, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBConversationStartEnd, Handler); - - private void Handler(int objId, uint playerId, bool state) => SendEvent(CreateMessage(objId, playerId, state)); - - private ConversationStartEndMessage CreateMessage(int objId, uint playerId, bool state) => new() - { - AboutId = LocalPlayerId, - TreeId = objId, - PlayerId = playerId, - State = state - }; - - public override void OnReceiveRemote(bool server, ConversationStartEndMessage message) - { - if (message.TreeId == -1) - { - DebugLog.ToConsole("Warning - Received conv. start/end event with char id -1.", MessageType.Warning); - return; - } - - var dialogueTree = QSBWorldSync.OldDialogueTrees[message.TreeId]; - - if (message.State) - { - StartConversation(message.PlayerId, message.TreeId, dialogueTree); - } - else - { - EndConversation(message.PlayerId, dialogueTree); - } - } - - private void StartConversation( - uint playerId, - int dialogueTreeId, - CharacterDialogueTree tree) - { - QSBPlayerManager.GetPlayer(playerId).CurrentCharacterDialogueTreeId = dialogueTreeId; - tree.GetInteractVolume().DisableInteraction(); - } - - private void EndConversation( - uint playerId, - CharacterDialogueTree tree) - { - QSBPlayerManager.GetPlayer(playerId).CurrentCharacterDialogueTreeId = -1; - tree.GetInteractVolume().EnableInteraction(); - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Events/ConversationStartEndMessage.cs b/QSB/ConversationSync/Events/ConversationStartEndMessage.cs deleted file mode 100644 index bb7070f9..00000000 --- a/QSB/ConversationSync/Events/ConversationStartEndMessage.cs +++ /dev/null @@ -1,28 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.ConversationSync.Events -{ - public class ConversationStartEndMessage : PlayerMessage - { - public int TreeId { get; set; } - public uint PlayerId { get; set; } - public bool State { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - TreeId = reader.ReadInt32(); - PlayerId = reader.ReadUInt32(); - State = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(TreeId); - writer.Write(PlayerId); - writer.Write(State); - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Events/DialogueConditionEvent.cs b/QSB/ConversationSync/Events/DialogueConditionEvent.cs deleted file mode 100644 index cbdffd07..00000000 --- a/QSB/ConversationSync/Events/DialogueConditionEvent.cs +++ /dev/null @@ -1,40 +0,0 @@ -using QSB.Events; -using QSB.WorldSync; - -namespace QSB.ConversationSync.Events -{ - public class DialogueConditionEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.DialogueConditionChanged, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.DialogueConditionChanged, Handler); - - private void Handler(string name, bool state) => SendEvent(CreateMessage(name, state)); - - private DialogueConditionMessage CreateMessage(string name, bool state) => new() - { - AboutId = LocalPlayerId, - ConditionName = name, - ConditionState = state - }; - - public override void OnReceiveLocal(bool server, DialogueConditionMessage message) - { - if (server) - { - QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState); - } - } - - public override void OnReceiveRemote(bool server, DialogueConditionMessage message) - { - if (server) - { - QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState); - } - - DialogueConditionManager.SharedInstance.SetConditionState(message.ConditionName, message.ConditionState); - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Events/DialogueConditionMessage.cs b/QSB/ConversationSync/Events/DialogueConditionMessage.cs deleted file mode 100644 index 6083d690..00000000 --- a/QSB/ConversationSync/Events/DialogueConditionMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.ConversationSync.Events -{ - public class DialogueConditionMessage : PlayerMessage - { - public string ConditionName { get; set; } - public bool ConditionState { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - ConditionName = reader.ReadString(); - ConditionState = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(ConditionName); - writer.Write(ConditionState); - } - } -} diff --git a/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs b/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs deleted file mode 100644 index b685535e..00000000 --- a/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using QSB.ConversationSync.WorldObjects; -using QSB.Events; -using QSB.WorldSync; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace QSB.ConversationSync.Events -{ - internal class EnterRemoteDialogueEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBEnterRemoteDialogue, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBEnterRemoteDialogue, Handler); - - private void Handler(QSBRemoteDialogueTrigger remoteTrigger, int activatedIndex, int listIndex) => SendEvent(CreateMessage(remoteTrigger, activatedIndex, listIndex)); - - private EnterRemoteDialogueMessage CreateMessage(QSBRemoteDialogueTrigger remoteTrigger, int activatedIndex, int listIndex) => new() - { - AboutId = LocalPlayerId, - ObjectId = remoteTrigger.ObjectId, - ActivatedDialogueIndex = activatedIndex, - ListDialoguesIndex = listIndex - }; - - public override void OnReceiveRemote(bool isHost, EnterRemoteDialogueMessage message) - { - var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbObj.RemoteEnterDialogue(message.ActivatedDialogueIndex, message.ListDialoguesIndex); - } - } -} diff --git a/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs b/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs deleted file mode 100644 index 3ba5087a..00000000 --- a/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.ConversationSync.Events -{ - public class EnterRemoteDialogueMessage : WorldObjectMessage - { - public int ActivatedDialogueIndex { get; set; } - public int ListDialoguesIndex { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - ActivatedDialogueIndex = reader.ReadInt32(); - ListDialoguesIndex = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(ActivatedDialogueIndex); - writer.Write(ListDialoguesIndex); - } - } -} \ No newline at end of file diff --git a/QSB/ConversationSync/Messages/ConversationMessage.cs b/QSB/ConversationSync/Messages/ConversationMessage.cs new file mode 100644 index 00000000..61ac9673 --- /dev/null +++ b/QSB/ConversationSync/Messages/ConversationMessage.cs @@ -0,0 +1,68 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; +using QuantumUNET.Transport; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace QSB.ConversationSync.Messages +{ + public class ConversationMessage : QSBEnumMessage + { + private int Id; + private string Message; + + public ConversationMessage(ConversationType type, int id, string message = "") + { + Value = type; + Id = id; + Message = message; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(Id); + writer.Write(Message); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + Id = reader.ReadInt32(); + Message = reader.ReadString(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + switch (Value) + { + case ConversationType.Character: + var translated = TextTranslation.Translate(Message).Trim(); + translated = Regex.Replace(translated, @"<[Pp]ause=?\d*\.?\d*\s?\/?>", ""); + ConversationManager.Instance.DisplayCharacterConversationBox(Id, translated); + break; + + case ConversationType.Player: + ConversationManager.Instance.DisplayPlayerConversationBox((uint)Id, Message); + break; + + case ConversationType.CloseCharacter: + if (Id == -1) + { + break; + } + + var tree = QSBWorldSync.OldDialogueTrees[Id]; + Object.Destroy(ConversationManager.Instance.BoxMappings[tree]); + break; + + case ConversationType.ClosePlayer: + Object.Destroy(QSBPlayerManager.GetPlayer((uint)Id).CurrentDialogueBox); + break; + } + } + } +} \ No newline at end of file diff --git a/QSB/ConversationSync/Messages/ConversationStartEndMessage.cs b/QSB/ConversationSync/Messages/ConversationStartEndMessage.cs new file mode 100644 index 00000000..b352dc74 --- /dev/null +++ b/QSB/ConversationSync/Messages/ConversationStartEndMessage.cs @@ -0,0 +1,77 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Player; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.ConversationSync.Messages +{ + public class ConversationStartEndMessage : QSBBoolMessage + { + private int TreeId; + private uint PlayerId; + + public ConversationStartEndMessage(int treeId, uint playerId, bool start) + { + TreeId = treeId; + PlayerId = playerId; + Value = start; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(TreeId); + writer.Write(PlayerId); + writer.Write(Value); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + TreeId = reader.ReadInt32(); + PlayerId = reader.ReadUInt32(); + Value = reader.ReadBoolean(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + if (TreeId == -1) + { + DebugLog.ToConsole("Warning - Received conv. start/end event with char id -1.", MessageType.Warning); + return; + } + + var dialogueTree = QSBWorldSync.OldDialogueTrees[TreeId]; + + if (Value) + { + StartConversation(PlayerId, TreeId, dialogueTree); + } + else + { + EndConversation(PlayerId, dialogueTree); + } + } + + private static void StartConversation( + uint playerId, + int treeId, + CharacterDialogueTree tree) + { + QSBPlayerManager.GetPlayer(playerId).CurrentCharacterDialogueTreeId = treeId; + tree.GetInteractVolume().DisableInteraction(); + } + + private static void EndConversation( + uint playerId, + CharacterDialogueTree tree) + { + QSBPlayerManager.GetPlayer(playerId).CurrentCharacterDialogueTreeId = -1; + tree.GetInteractVolume().EnableInteraction(); + } + } +} \ No newline at end of file diff --git a/QSB/ConversationSync/Messages/DialogueConditionMessage.cs b/QSB/ConversationSync/Messages/DialogueConditionMessage.cs new file mode 100644 index 00000000..b9371f44 --- /dev/null +++ b/QSB/ConversationSync/Messages/DialogueConditionMessage.cs @@ -0,0 +1,61 @@ +using QSB.Messaging; +using QSB.Player.TransformSync; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.ConversationSync.Messages +{ + public class DialogueConditionMessage : QSBMessage + { + static DialogueConditionMessage() => GlobalMessenger.AddListener(OWEvents.DialogueConditionChanged, Handler); + + private static void Handler(string name, bool state) + { + if (PlayerTransformSync.LocalInstance) + { + new DialogueConditionMessage(name, state).Send(); + } + } + + private string ConditionName; + private bool ConditionState; + + public DialogueConditionMessage(string name, bool state) + { + ConditionName = name; + ConditionState = state; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ConditionName); + writer.Write(ConditionState); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ConditionName = reader.ReadString(); + ConditionState = reader.ReadBoolean(); + } + + public override void OnReceiveRemote() + { + if (QSBCore.IsHost) + { + QSBWorldSync.SetDialogueCondition(ConditionName, ConditionState); + } + + DialogueConditionManager.SharedInstance.SetConditionState(ConditionName, ConditionState); + } + + public override void OnReceiveLocal() + { + if (QSBCore.IsHost) + { + QSBWorldSync.SetDialogueCondition(ConditionName, ConditionState); + } + } + } +} \ No newline at end of file diff --git a/QSB/ConversationSync/Messages/EnterRemoteDialogueMessage.cs b/QSB/ConversationSync/Messages/EnterRemoteDialogueMessage.cs new file mode 100644 index 00000000..ab345b6a --- /dev/null +++ b/QSB/ConversationSync/Messages/EnterRemoteDialogueMessage.cs @@ -0,0 +1,35 @@ +using QSB.ConversationSync.WorldObjects; +using QSB.Messaging; +using QuantumUNET.Transport; + +namespace QSB.ConversationSync.Messages +{ + internal class EnterRemoteDialogueMessage : QSBWorldObjectMessage + { + private int ActivatedDialogueIndex; + private int ListDialoguesIndex; + + public EnterRemoteDialogueMessage(int activatedIndex, int listIndex) + { + ActivatedDialogueIndex = activatedIndex; + ListDialoguesIndex = listIndex; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ActivatedDialogueIndex); + writer.Write(ListDialoguesIndex); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ActivatedDialogueIndex = reader.ReadInt32(); + ListDialoguesIndex = reader.ReadInt32(); + } + + public override void OnReceiveRemote() + => WorldObject.RemoteEnterDialogue(ActivatedDialogueIndex, ListDialoguesIndex); + } +} \ No newline at end of file diff --git a/QSB/ConversationSync/Patches/ConversationPatches.cs b/QSB/ConversationSync/Patches/ConversationPatches.cs index b288462e..59f889e9 100644 --- a/QSB/ConversationSync/Patches/ConversationPatches.cs +++ b/QSB/ConversationSync/Patches/ConversationPatches.cs @@ -1,13 +1,12 @@ using HarmonyLib; using OWML.Common; +using QSB.ConversationSync.Messages; using QSB.ConversationSync.WorldObjects; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using QSB.Utility; using QSB.WorldSync; -using System.Collections.Generic; -using UnityEngine; namespace QSB.ConversationSync.Patches { @@ -54,7 +53,7 @@ namespace QSB.ConversationSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.InputDialogueOption))] - public static bool CharacterDialogueTree_InputDialogueOption(int optionIndex, DialogueBoxVer2 ____currentDialogueBox) + public static bool CharacterDialogueTree_InputDialogueOption(CharacterDialogueTree __instance, int optionIndex) { if (optionIndex < 0) { @@ -63,16 +62,16 @@ namespace QSB.ConversationSync.Patches return true; } - var selectedOption = ____currentDialogueBox.OptionFromUIIndex(optionIndex); + var selectedOption = __instance._currentDialogueBox.OptionFromUIIndex(optionIndex); ConversationManager.Instance.SendPlayerOption(selectedOption.Text); return true; } [HarmonyPostfix] [HarmonyPatch(typeof(DialogueNode), nameof(DialogueNode.GetNextPage))] - public static void DialogueNode_GetNextPage(string ____name, List ____listPagesToDisplay, int ____currentPage) + public static void DialogueNode_GetNextPage(DialogueNode __instance) { - var key = ____name + ____listPagesToDisplay[____currentPage]; + var key = __instance._name + __instance._listPagesToDisplay[__instance._currentPage]; // Sending key so translation can be done on client side - should make different language-d clients compatible QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId != -1, () => ConversationManager.Instance.SendCharacterDialogue(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId, key)); @@ -139,10 +138,8 @@ namespace QSB.ConversationSync.Patches __instance._activatedDialogues[num] = true; - QSBEventManager.FireEvent(EventNames.QSBEnterRemoteDialogue, - QSBWorldSync.GetWorldFromUnity(__instance), - num, - __instance._listDialogues.IndexOf(dialogue)); + __instance.GetWorldObject() + .SendMessage(new EnterRemoteDialogueMessage(num, __instance._listDialogues.IndexOf(dialogue))); __result = true; return false; diff --git a/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs index 44f8d946..df3c4686 100644 --- a/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs +++ b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs @@ -1,5 +1,4 @@ -using QSB.Utility; -using QSB.WorldSync; +using QSB.WorldSync; namespace QSB.ConversationSync.WorldObjects { diff --git a/QSB/DeathSync/EndLoopReason.cs b/QSB/DeathSync/EndLoopReason.cs deleted file mode 100644 index ef85c7cb..00000000 --- a/QSB/DeathSync/EndLoopReason.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace QSB.DeathSync -{ - public enum EndLoopReason - { - AllPlayersDead = 0 - } -} diff --git a/QSB/DeathSync/Events/EndLoopEvent.cs b/QSB/DeathSync/Events/EndLoopEvent.cs deleted file mode 100644 index f8b5ffc7..00000000 --- a/QSB/DeathSync/Events/EndLoopEvent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Messaging; -using QSB.Patches; -using QSB.Utility; - -namespace QSB.DeathSync.Events -{ - internal class EndLoopEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBEndLoop, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBEndLoop, Handler); - - private void Handler(EndLoopReason type) => SendEvent(CreateMessage(type)); - - private EnumMessage CreateMessage(EndLoopReason type) => new() - { - AboutId = LocalPlayerId, - EnumValue = type - }; - - public override void OnReceiveLocal(bool server, EnumMessage message) - => OnReceiveRemote(server, message); - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - DebugLog.DebugWrite($" ~~~~ END LOOP - Reason:{message.EnumValue} ~~~~ "); - switch (message.EnumValue) - { - case EndLoopReason.AllPlayersDead: - if (ServerStateManager.Instance.GetServerState() == ServerState.WaitingForAllPlayersToDie) - { - break; - } - - QSBPatchManager.DoUnpatchType(QSBPatchTypes.RespawnTime); - - Locator.GetDeathManager().KillPlayer(DeathType.TimeLoop); - if (QSBCore.IsHost) - { - ServerStateManager.Instance.FireChangeServerStateEvent(ServerState.WaitingForAllPlayersToDie); - } - - break; - } - } - } -} diff --git a/QSB/DeathSync/Events/PlayerDeathEvent.cs b/QSB/DeathSync/Events/PlayerDeathEvent.cs deleted file mode 100644 index d4efc18a..00000000 --- a/QSB/DeathSync/Events/PlayerDeathEvent.cs +++ /dev/null @@ -1,45 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Player; -using QSB.RespawnSync; -using QSB.Utility; - -namespace QSB.DeathSync.Events -{ - public class PlayerDeathEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerDeath, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerDeath, Handler); - - private void Handler(DeathType type) => SendEvent(CreateMessage(type)); - - private PlayerDeathMessage CreateMessage(DeathType type) => new() - { - AboutId = LocalPlayerId, - EnumValue = type, - NecronomiconIndex = Necronomicon.GetRandomIndex(type) - }; - - public override void OnReceiveLocal(bool server, PlayerDeathMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - RespawnManager.Instance.OnPlayerDeath(player); - ClientStateManager.Instance.OnDeath(); - } - - public override void OnReceiveRemote(bool server, PlayerDeathMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - var playerName = player.Name; - var deathMessage = Necronomicon.GetPhrase(message.EnumValue, message.NecronomiconIndex); - if (deathMessage != string.Empty) - { - DebugLog.ToAll(string.Format(deathMessage, playerName)); - } - - RespawnManager.Instance.OnPlayerDeath(player); - } - } -} \ No newline at end of file diff --git a/QSB/DeathSync/Events/PlayerDeathMessage.cs b/QSB/DeathSync/Events/PlayerDeathMessage.cs deleted file mode 100644 index 9c5ced27..00000000 --- a/QSB/DeathSync/Events/PlayerDeathMessage.cs +++ /dev/null @@ -1,24 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.DeathSync.Events -{ - public class PlayerDeathMessage : EnumMessage - { - public int NecronomiconIndex { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - EnumValue = (DeathType)reader.ReadInt32(); - NecronomiconIndex = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write((int)EnumValue); - writer.Write(NecronomiconIndex); - } - } -} diff --git a/QSB/DeathSync/Events/StartLoopEvent.cs b/QSB/DeathSync/Events/StartLoopEvent.cs deleted file mode 100644 index d23037c8..00000000 --- a/QSB/DeathSync/Events/StartLoopEvent.cs +++ /dev/null @@ -1,43 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Messaging; -using QSB.Utility; - -namespace QSB.DeathSync.Events -{ - internal class StartLoopEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBStartLoop, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBStartLoop, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveLocal(bool server, PlayerMessage message) - => OnReceiveRemote(server, message); - - public override void OnReceiveRemote(bool server, PlayerMessage message) - { - DebugLog.DebugWrite($" ~~~ LOOP START ~~~"); - if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) - { - ClientStateManager.Instance.FireChangeClientStateEvent(ClientState.AliveInSolarSystem); - } - else if (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) - { - ClientStateManager.Instance.FireChangeClientStateEvent(ClientState.AliveInEye); - } - else - { - DebugLog.ToConsole($"Error - Got StartLoop event when not in universe!", OWML.Common.MessageType.Error); - ClientStateManager.Instance.FireChangeClientStateEvent(ClientState.NotLoaded); - } - } - } -} diff --git a/QSB/DeathSync/Messages/EndLoopMessage.cs b/QSB/DeathSync/Messages/EndLoopMessage.cs new file mode 100644 index 00000000..e987ab4c --- /dev/null +++ b/QSB/DeathSync/Messages/EndLoopMessage.cs @@ -0,0 +1,30 @@ +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.Patches; +using QSB.Utility; + +namespace QSB.DeathSync.Messages +{ + // when all players die + internal class EndLoopMessage : QSBMessage + { + public override void OnReceiveLocal() => OnReceiveRemote(); + + public override void OnReceiveRemote() + { + DebugLog.DebugWrite($" ~~~~ END LOOP - all players are dead ~~~~ "); + if (ServerStateManager.Instance.GetServerState() == ServerState.WaitingForAllPlayersToDie) + { + return; + } + + QSBPatchManager.DoUnpatchType(QSBPatchTypes.RespawnTime); + + Locator.GetDeathManager().KillPlayer(DeathType.TimeLoop); + if (QSBCore.IsHost) + { + ServerStateManager.Instance.SendChangeServerStateMessage(ServerState.WaitingForAllPlayersToDie); + } + } + } +} \ No newline at end of file diff --git a/QSB/DeathSync/Messages/PlayerDeathMessage.cs b/QSB/DeathSync/Messages/PlayerDeathMessage.cs new file mode 100644 index 00000000..f6b97b9b --- /dev/null +++ b/QSB/DeathSync/Messages/PlayerDeathMessage.cs @@ -0,0 +1,48 @@ +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.Player; +using QSB.RespawnSync; +using QSB.Utility; +using QuantumUNET.Transport; + +namespace QSB.DeathSync.Messages +{ + public class PlayerDeathMessage : QSBEnumMessage + { + private int NecronomiconIndex; + + public PlayerDeathMessage(DeathType type) => NecronomiconIndex = Necronomicon.GetRandomIndex(type); + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(NecronomiconIndex); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + NecronomiconIndex = reader.ReadInt32(); + } + + public override void OnReceiveLocal() + { + var player = QSBPlayerManager.GetPlayer(From); + RespawnManager.Instance.OnPlayerDeath(player); + ClientStateManager.Instance.OnDeath(); + } + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + var playerName = player.Name; + var deathMessage = Necronomicon.GetPhrase(Value, NecronomiconIndex); + if (deathMessage != string.Empty) + { + DebugLog.ToAll(string.Format(deathMessage, playerName)); + } + + RespawnManager.Instance.OnPlayerDeath(player); + } + } +} \ No newline at end of file diff --git a/QSB/DeathSync/Messages/StartLoopMessage.cs b/QSB/DeathSync/Messages/StartLoopMessage.cs new file mode 100644 index 00000000..30f4c6ef --- /dev/null +++ b/QSB/DeathSync/Messages/StartLoopMessage.cs @@ -0,0 +1,30 @@ +using OWML.Common; +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.Utility; + +namespace QSB.DeathSync.Messages +{ + internal class StartLoopMessage : QSBMessage + { + public override void OnReceiveLocal() => OnReceiveRemote(); + + public override void OnReceiveRemote() + { + DebugLog.DebugWrite($" ~~~ LOOP START ~~~"); + if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) + { + ClientStateManager.Instance.SendChangeClientStateMessage(ClientState.AliveInSolarSystem); + } + else if (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) + { + ClientStateManager.Instance.SendChangeClientStateMessage(ClientState.AliveInEye); + } + else + { + DebugLog.ToConsole($"Error - Got StartLoop event when not in universe!", MessageType.Error); + ClientStateManager.Instance.SendChangeClientStateMessage(ClientState.NotLoaded); + } + } + } +} \ No newline at end of file diff --git a/QSB/DeathSync/Patches/DeathPatches.cs b/QSB/DeathSync/Patches/DeathPatches.cs index 55147d2c..99a6aaf4 100644 --- a/QSB/DeathSync/Patches/DeathPatches.cs +++ b/QSB/DeathSync/Patches/DeathPatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; -using QSB.Events; +using QSB.DeathSync.Messages; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using QSB.ShipSync; @@ -40,7 +41,7 @@ namespace QSB.DeathSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(PlayerResources), nameof(PlayerResources.OnImpact))] - public static bool PlayerResources_OnImpact(ImpactData impact, PlayerResources __instance, float ____currentHealth) + public static bool PlayerResources_OnImpact(PlayerResources __instance, ImpactData impact) { if (PlayerState.IsInsideShip()) { @@ -49,7 +50,7 @@ namespace QSB.DeathSync.Patches var speed = Mathf.Clamp01((impact.speed - __instance.GetMinImpactSpeed()) / (__instance.GetMaxImpactSpeed() - __instance.GetMinImpactSpeed())); var tookDamage = __instance.ApplyInstantDamage(100f * speed, InstantDamageType.Impact); - if (tookDamage && ____currentHealth <= 0f && !PlayerState.IsDead()) + if (tookDamage && __instance._currentHealth <= 0f && !PlayerState.IsDead()) { Locator.GetDeathManager().SetImpactDeathSpeed(impact.speed); Locator.GetDeathManager().KillPlayer(DeathType.Impact); @@ -61,73 +62,63 @@ namespace QSB.DeathSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(HighSpeedImpactSensor), nameof(HighSpeedImpactSensor.FixedUpdate))] public static bool HighSpeedImpactSensor_FixedUpdate( - HighSpeedImpactSensor __instance, - bool ____isPlayer, - ref bool ____dead, - ref bool ____dieNextUpdate, - OWRigidbody ____body, - ref float ____impactSpeed, - float ____sqrCheckSpeedThreshold, - RaycastHit[] ____raycastHits, - SectorDetector ____sectorDetector, - float ____radius, - Vector3 ____localOffset + HighSpeedImpactSensor __instance ) { - if (____isPlayer && (PlayerState.IsAttached() || PlayerState.IsInsideShuttle() || PlayerState.UsingNomaiRemoteCamera())) + if (__instance._isPlayer && (PlayerState.IsAttached() || PlayerState.IsInsideShuttle() || PlayerState.UsingNomaiRemoteCamera())) { return false; } - if (____dieNextUpdate && !____dead) + if (__instance._dieNextUpdate && !__instance._dead) { - ____dead = true; - ____dieNextUpdate = false; + __instance._dead = true; + __instance._dieNextUpdate = false; if (__instance.gameObject.CompareTag("Player")) { - Locator.GetDeathManager().SetImpactDeathSpeed(____impactSpeed); + Locator.GetDeathManager().SetImpactDeathSpeed(__instance._impactSpeed); Locator.GetDeathManager().KillPlayer(DeathType.Impact); } else if (__instance.gameObject.CompareTag("Ship")) { - __instance.GetComponent().Explode(false); + __instance.GetComponent().Explode(); } } - if (____isPlayer && PlayerState.IsInsideShip()) + if (__instance._isPlayer && PlayerState.IsInsideShip()) { var shipCenter = Locator.GetShipTransform().position + (Locator.GetShipTransform().up * 2f); - var distanceFromShip = Vector3.Distance(____body.GetPosition(), shipCenter); + var distanceFromShip = Vector3.Distance(__instance._body.GetPosition(), shipCenter); if (distanceFromShip > 8f) { - ____body.SetPosition(shipCenter); + __instance._body.SetPosition(shipCenter); } - if (!____dead) + if (!__instance._dead) { - var a = ____body.GetVelocity() - Locator.GetShipBody().GetPointVelocity(____body.GetPosition()); - if (a.sqrMagnitude > ____sqrCheckSpeedThreshold) + var a = __instance._body.GetVelocity() - Locator.GetShipBody().GetPointVelocity(__instance._body.GetPosition()); + if (a.sqrMagnitude > __instance._sqrCheckSpeedThreshold) { - ____impactSpeed = a.magnitude; - ____body.AddVelocityChange(-a); + __instance._impactSpeed = a.magnitude; + __instance._body.AddVelocityChange(-a); } } return false; } - var passiveReferenceFrame = ____sectorDetector.GetPassiveReferenceFrame(); - if (!____dead && passiveReferenceFrame != null) + var passiveReferenceFrame = __instance._sectorDetector.GetPassiveReferenceFrame(); + if (!__instance._dead && passiveReferenceFrame != null) { - var relativeVelocity = ____body.GetVelocity() - passiveReferenceFrame.GetOWRigidBody().GetPointVelocity(____body.GetPosition()); - if (relativeVelocity.sqrMagnitude > ____sqrCheckSpeedThreshold) + var relativeVelocity = __instance._body.GetVelocity() - passiveReferenceFrame.GetOWRigidBody().GetPointVelocity(__instance._body.GetPosition()); + if (relativeVelocity.sqrMagnitude > __instance._sqrCheckSpeedThreshold) { - var hitCount = Physics.RaycastNonAlloc(__instance.transform.TransformPoint(____localOffset), relativeVelocity, ____raycastHits, (relativeVelocity.magnitude * Time.deltaTime) + ____radius, OWLayerMask.physicalMask, QueryTriggerInteraction.Ignore); + var hitCount = Physics.RaycastNonAlloc(__instance.transform.TransformPoint(__instance._localOffset), relativeVelocity, __instance._raycastHits, (relativeVelocity.magnitude * Time.deltaTime) + __instance._radius, OWLayerMask.physicalMask, QueryTriggerInteraction.Ignore); for (var i = 0; i < hitCount; i++) { - if (____raycastHits[i].rigidbody.mass > 10f && !____raycastHits[i].rigidbody.Equals(____body.GetRigidbody())) + if (__instance._raycastHits[i].rigidbody.mass > 10f && !__instance._raycastHits[i].rigidbody.Equals(__instance._body.GetRigidbody())) { - var owRigidbody = ____raycastHits[i].rigidbody.GetComponent(); + var owRigidbody = __instance._raycastHits[i].rigidbody.GetComponent(); if (owRigidbody == null) { DebugLog.ToConsole("Rigidbody does not have attached OWRigidbody!!!", OWML.Common.MessageType.Error); @@ -135,15 +126,15 @@ namespace QSB.DeathSync.Patches } else { - relativeVelocity = ____body.GetVelocity() - owRigidbody.GetPointVelocity(____body.GetPosition()); - var a2 = Vector3.Project(relativeVelocity, ____raycastHits[i].normal); - if (a2.sqrMagnitude > ____sqrCheckSpeedThreshold) + relativeVelocity = __instance._body.GetVelocity() - owRigidbody.GetPointVelocity(__instance._body.GetPosition()); + var a2 = Vector3.Project(relativeVelocity, __instance._raycastHits[i].normal); + if (a2.sqrMagnitude > __instance._sqrCheckSpeedThreshold) { - ____body.AddVelocityChange(-a2); - ____impactSpeed = a2.magnitude; + __instance._body.AddVelocityChange(-a2); + __instance._impactSpeed = a2.magnitude; if (!PlayerState.IsInsideTheEye()) { - ____dieNextUpdate = true; + __instance._dieNextUpdate = true; } break; @@ -180,7 +171,7 @@ namespace QSB.DeathSync.Patches if (deadPlayersCount == QSBPlayerManager.PlayerList.Count - 1) { - QSBEventManager.FireEvent(EventNames.QSBEndLoop, EndLoopReason.AllPlayersDead); + new EndLoopMessage().Send(); return true; } @@ -195,18 +186,18 @@ namespace QSB.DeathSync.Patches if (!QSBPlayerManager.LocalPlayer.IsDead) { QSBPlayerManager.LocalPlayer.IsDead = true; - QSBEventManager.FireEvent(EventNames.QSBPlayerDeath, deathType); + new PlayerDeathMessage(deathType).Send(); } } [HarmonyPostfix] [HarmonyPatch(typeof(ShipDamageController), nameof(ShipDamageController.Awake))] - public static void ShipDamageController_Awake(ref bool ____exploded) - => ____exploded = true; + public static void ShipDamageController_Awake(ShipDamageController __instance) + => __instance._exploded = true; [HarmonyPrefix] [HarmonyPatch(typeof(DestructionVolume), nameof(DestructionVolume.VanishShip))] - public static bool DestructionVolume_VanishShip(DeathType ____deathType) + public static bool DestructionVolume_VanishShip(DestructionVolume __instance) { if (RespawnOnDeath.Instance == null) { @@ -220,7 +211,7 @@ namespace QSB.DeathSync.Patches if (PlayerState.IsInsideShip() || PlayerState.UsingShipComputer() || PlayerState.AtFlightConsole()) { - Locator.GetDeathManager().KillPlayer(____deathType); + Locator.GetDeathManager().KillPlayer(__instance._deathType); } return true; diff --git a/QSB/DeathSync/Patches/MapPatches.cs b/QSB/DeathSync/Patches/MapPatches.cs index c07aef21..2b10f8e0 100644 --- a/QSB/DeathSync/Patches/MapPatches.cs +++ b/QSB/DeathSync/Patches/MapPatches.cs @@ -12,151 +12,86 @@ namespace QSB.DeathSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(MapController), nameof(MapController.EnterMapView))] public static bool MapController_EnterMapView( - MapController __instance, - ref bool ____isMapMode, - OWAudioSource ____audioSource, - MapMarkerManager ____mapMarkerManager, - OWCamera ____mapCamera, - OWCamera ____activeCam, - MeshRenderer ____gridRenderer, - ref Transform ____targetTransform, - ref bool ____lockedToTargetTransform, - ref Vector3 ____position, - ref float ____yaw, - ref float ____pitch, - ref float ____zoom, - ref float ____targetZoom, - ref bool ____interpPosition, - ref bool ____interpPitch, - ref bool ____interpZoom, - ref bool ____framingPlayer, - ref float ____lockTimer, - float ____defaultYawAngle, - float ____initialPitchAngle, - float ____initialZoomDist, - float ____defaultZoomDist, - float ____lockOnMoveLength, - ref float ____gridOverrideSize, - ref bool ____gridOverride, - ref float ____gridTimer, - ref float ____revealLength, - ReferenceFrame ____currentRFrame, - float ____gridLockOnLength, - ref float ____revealTimer + MapController __instance ) { - if (____isMapMode) + if (__instance._isMapMode) { return false; } - ____mapMarkerManager.SetVisible(true); + __instance._mapMarkerManager.SetVisible(true); GlobalMessenger.FireEvent("EnterMapView"); - GlobalMessenger.FireEvent("SwitchActiveCamera", ____mapCamera); - if (____audioSource.isPlaying) + GlobalMessenger.FireEvent("SwitchActiveCamera", __instance._mapCamera); + if (__instance._audioSource.isPlaying) { - ____audioSource.Stop(); - ____audioSource.SetLocalVolume(1f); - ____audioSource.Play(); + __instance._audioSource.Stop(); + __instance._audioSource.SetLocalVolume(1f); + __instance._audioSource.Play(); } else { - ____audioSource.SetLocalVolume(1f); - ____audioSource.Play(); + __instance._audioSource.SetLocalVolume(1f); + __instance._audioSource.Play(); } Locator.GetAudioMixer().MixMap(); - ____activeCam.enabled = false; - ____mapCamera.enabled = true; - ____gridRenderer.enabled = false; - ____targetTransform = null; - ____lockedToTargetTransform = false; - ____position = RespawnOnDeath.Instance.DeathPositionWorld - Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition(); - ____position.y = 0f; - ____yaw = ____defaultYawAngle; - ____pitch = ____initialPitchAngle; - ____zoom = ____initialZoomDist; - ____targetZoom = ____defaultZoomDist; + __instance._activeCam.enabled = false; + __instance._mapCamera.enabled = true; + __instance._gridRenderer.enabled = false; + __instance._targetTransform = null; + __instance._lockedToTargetTransform = false; + __instance._position = RespawnOnDeath.Instance.DeathPositionWorld - Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition(); + __instance._position.y = 0f; + __instance._yaw = __instance._defaultYawAngle; + __instance._pitch = __instance._initialPitchAngle; + __instance._zoom = __instance._initialZoomDist; + __instance._targetZoom = __instance._defaultZoomDist; __instance.transform.rotation = Quaternion.LookRotation(-RespawnOnDeath.Instance.DeathPlayerUpVector, RespawnOnDeath.Instance.DeathPlayerForwardVector); __instance.transform.position = RespawnOnDeath.Instance.DeathPositionWorld; - ____interpPosition = true; - ____interpPitch = true; - ____interpZoom = true; - ____framingPlayer = ____lockedToTargetTransform; - ____lockTimer = ____lockOnMoveLength; - ____gridOverrideSize = (____currentRFrame == null) ? 0f : ____currentRFrame.GetAutopilotArrivalDistance(); - ____gridOverride = ____gridOverrideSize > 0f; - ____gridTimer = (!____gridOverride) ? 0f : ____gridLockOnLength; - ____revealLength = 20f; - ____revealTimer = 0f; - ____isMapMode = true; + __instance._interpPosition = true; + __instance._interpPitch = true; + __instance._interpZoom = true; + __instance._framingPlayer = __instance._lockedToTargetTransform; + __instance._lockTimer = __instance._lockOnMoveLength; + __instance._gridOverrideSize = (__instance._currentRFrame == null) ? 0f : __instance._currentRFrame.GetAutopilotArrivalDistance(); + __instance._gridOverride = __instance._gridOverrideSize > 0f; + __instance._gridTimer = (!__instance._gridOverride) ? 0f : __instance._gridLockOnLength; + __instance._revealLength = 20f; + __instance._revealTimer = 0f; + __instance._isMapMode = true; return false; } [HarmonyPrefix] [HarmonyPatch(typeof(MapController), nameof(MapController.LateUpdate))] public static bool MapController_LateUpdate( - MapController __instance, - ref float ____observatoryRevealTwist, - ref float ____defaultPitchAngle, - ref float ____initialPitchAngle, - OWCamera ____mapCamera, - ref float ____lockTimer, - ref float ____revealTimer, - float ____lockOnMoveLength, - float ____revealLength, - ref bool ____screenPromptsVisible, - bool ____isPaused, - ScreenPrompt ____closePrompt, - ScreenPrompt ____panPrompt, - ScreenPrompt ____rotatePrompt, - ScreenPrompt ____zoomPrompt, - ref bool ____lockedToTargetTransform, - ref bool ____interpPosition, - ref bool ____interpPitch, - ref bool ____interpZoom, - OWCamera ____activeCam, - ref Vector3 ____position, - float ____panSpeed, - ref float ____zoom, - float ____maxPanDistance, - float ____yawSpeed, - ref float ____yaw, - float ____pitchSpeed, - ref float ____pitch, - float ____minPitchAngle, - float ____maxPitchAngle, - ref float ____targetZoom, - float ____minZoomDistance, - float ____maxZoomDistance, - float ____initialZoomDist, - float ____zoomSpeed, - float ____observatoryRevealDist + MapController __instance ) { - ____lockTimer = Mathf.Min(____lockTimer + Time.deltaTime, ____lockOnMoveLength); - ____revealTimer = Mathf.Min(____revealTimer + Time.deltaTime, ____revealLength); + __instance._lockTimer = Mathf.Min(__instance._lockTimer + Time.deltaTime, __instance._lockOnMoveLength); + __instance._revealTimer = Mathf.Min(__instance._revealTimer + Time.deltaTime, __instance._revealLength); - var revealFraction = Mathf.Clamp01(____revealTimer / ____revealLength); + var revealFraction = Mathf.Clamp01(__instance._revealTimer / __instance._revealLength); var smoothedRevealFraction = Mathf.SmoothStep(0f, 1f, revealFraction); - var canInteractWith = ____revealTimer > 18f; + var canInteractWith = __instance._revealTimer > 18f; - if (____screenPromptsVisible && ____isPaused) + if (__instance._screenPromptsVisible && __instance._isPaused) { - ____closePrompt.SetVisibility(false); - ____panPrompt.SetVisibility(false); - ____rotatePrompt.SetVisibility(false); - ____zoomPrompt.SetVisibility(false); - ____screenPromptsVisible = false; + __instance._closePrompt.SetVisibility(false); + __instance._panPrompt.SetVisibility(false); + __instance._rotatePrompt.SetVisibility(false); + __instance._zoomPrompt.SetVisibility(false); + __instance._screenPromptsVisible = false; } - else if (!____screenPromptsVisible && canInteractWith && !____isPaused) + else if (!__instance._screenPromptsVisible && canInteractWith && !__instance._isPaused) { - ____closePrompt.SetVisibility(false); - ____panPrompt.SetVisibility(true); - ____rotatePrompt.SetVisibility(true); - ____zoomPrompt.SetVisibility(true); - ____screenPromptsVisible = true; + __instance._closePrompt.SetVisibility(false); + __instance._panPrompt.SetVisibility(true); + __instance._rotatePrompt.SetVisibility(true); + __instance._zoomPrompt.SetVisibility(true); + __instance._screenPromptsVisible = true; } var XZinput = Vector2.zero; @@ -164,61 +99,61 @@ namespace QSB.DeathSync.Patches var zoomInput = 0f; if (canInteractWith) { - XZinput = OWInput.GetAxisValue(InputLibrary.moveXZ, InputMode.All); + XZinput = OWInput.GetAxisValue(InputLibrary.moveXZ); lookInput = InputLibrary.look.GetAxisValue(false); - zoomInput = OWInput.GetValue(InputLibrary.mapZoomIn, InputMode.All) - OWInput.GetValue(InputLibrary.mapZoomOut, InputMode.All); + zoomInput = OWInput.GetValue(InputLibrary.mapZoomIn) - OWInput.GetValue(InputLibrary.mapZoomOut); lookInput.y *= -1f; zoomInput *= -1f; } - ____lockedToTargetTransform &= XZinput.sqrMagnitude < 0.01f; - ____interpPosition &= XZinput.sqrMagnitude < 0.01f; - ____interpPitch &= Mathf.Abs(lookInput.y) < 0.1f; - ____interpZoom &= Mathf.Abs(zoomInput) < 0.1f; + __instance._lockedToTargetTransform &= XZinput.sqrMagnitude < 0.01f; + __instance._interpPosition &= XZinput.sqrMagnitude < 0.01f; + __instance._interpPitch &= Mathf.Abs(lookInput.y) < 0.1f; + __instance._interpZoom &= Mathf.Abs(zoomInput) < 0.1f; - if (____interpPosition) + if (__instance._interpPosition) { - var a = ____activeCam.transform.position - Locator.GetCenterOfTheUniverse().GetOffsetPosition(); + var a = __instance._activeCam.transform.position - Locator.GetCenterOfTheUniverse().GetOffsetPosition(); var b = Vector3.zero; - ____position = Vector3.Lerp(a, b, smoothedRevealFraction); + __instance._position = Vector3.Lerp(a, b, smoothedRevealFraction); } else { var normalized = Vector3.Scale(__instance.transform.forward + __instance.transform.up, new Vector3(1f, 0f, 1f)).normalized; var a2 = (__instance.transform.right * XZinput.x) + (normalized * XZinput.y); - ____position += a2 * ____panSpeed * ____zoom * Time.deltaTime; - ____position.y = 0f; - if (____position.sqrMagnitude > ____maxPanDistance * ____maxPanDistance) + __instance._position += a2 * __instance._panSpeed * __instance._zoom * Time.deltaTime; + __instance._position.y = 0f; + if (__instance._position.sqrMagnitude > __instance._maxPanDistance * __instance._maxPanDistance) { - ____position = ____position.normalized * ____maxPanDistance; + __instance._position = __instance._position.normalized * __instance._maxPanDistance; } } - ____yaw += lookInput.x * ____yawSpeed * Time.deltaTime; - ____yaw = OWMath.WrapAngle(____yaw); - if (____interpPitch) + __instance._yaw += lookInput.x * __instance._yawSpeed * Time.deltaTime; + __instance._yaw = OWMath.WrapAngle(__instance._yaw); + if (__instance._interpPitch) { - ____pitch = Mathf.Lerp(____initialPitchAngle, ____defaultPitchAngle, smoothedRevealFraction); + __instance._pitch = Mathf.Lerp(__instance._initialPitchAngle, __instance._defaultPitchAngle, smoothedRevealFraction); } else { - ____pitch += lookInput.y * ____pitchSpeed * Time.deltaTime; - ____pitch = Mathf.Clamp(____pitch, ____minPitchAngle, ____maxPitchAngle); + __instance._pitch += lookInput.y * __instance._pitchSpeed * Time.deltaTime; + __instance._pitch = Mathf.Clamp(__instance._pitch, __instance._minPitchAngle, __instance._maxPitchAngle); } - if (____interpZoom) + if (__instance._interpZoom) { - ____zoom = Mathf.Lerp(____initialZoomDist, ____targetZoom, smoothedRevealFraction); + __instance._zoom = Mathf.Lerp(__instance._initialZoomDist, __instance._targetZoom, smoothedRevealFraction); } else { - ____zoom += zoomInput * ____zoomSpeed * Time.deltaTime; - ____zoom = Mathf.Clamp(____zoom, ____minZoomDistance, ____maxZoomDistance); + __instance._zoom += zoomInput * __instance._zoomSpeed * Time.deltaTime; + __instance._zoom = Mathf.Clamp(__instance._zoom, __instance._minZoomDistance, __instance._maxZoomDistance); } - ____mapCamera.nearClipPlane = Mathf.Lerp(0.1f, 1f, smoothedRevealFraction); + __instance._mapCamera.nearClipPlane = Mathf.Lerp(0.1f, 1f, smoothedRevealFraction); - var finalRotation = Quaternion.Euler(____pitch, ____yaw, 0f); + var finalRotation = Quaternion.Euler(__instance._pitch, __instance._yaw, 0f); var num4 = revealFraction * (2f - revealFraction); @@ -229,15 +164,15 @@ namespace QSB.DeathSync.Patches // Get starting position - distance above player var startingPosition = RespawnOnDeath.Instance.DeathPositionWorld; - startingPosition += RespawnOnDeath.Instance.DeathPlayerUpVector * num5 * ____observatoryRevealDist; + startingPosition += RespawnOnDeath.Instance.DeathPlayerUpVector * num5 * __instance._observatoryRevealDist; // Lerp to final rotation __instance.transform.rotation = Quaternion.Lerp(lookingDownAtPlayer, finalRotation, num5); // Lerp reveal twist - __instance.transform.rotation *= Quaternion.AngleAxis(Mathf.Lerp(____observatoryRevealTwist, 0f, num4), Vector3.forward); + __instance.transform.rotation *= Quaternion.AngleAxis(Mathf.Lerp(__instance._observatoryRevealTwist, 0f, num4), Vector3.forward); - var endPosition = ____position + (-__instance.transform.forward * ____zoom) + Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition(); + var endPosition = __instance._position + (-__instance.transform.forward * __instance._zoom) + Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition(); // Lerp to final position __instance.transform.position = Vector3.Lerp(startingPosition, endPosition, num5); diff --git a/QSB/DeathSync/RespawnOnDeath.cs b/QSB/DeathSync/RespawnOnDeath.cs index 883adbfe..a77e3bc7 100644 --- a/QSB/DeathSync/RespawnOnDeath.cs +++ b/QSB/DeathSync/RespawnOnDeath.cs @@ -1,6 +1,4 @@ using OWML.Common; -using QSB.Events; -using QSB.Player; using QSB.Player.TransformSync; using QSB.RespawnSync; using QSB.Utility; diff --git a/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs b/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs index 41ec66de..0f8e6922 100644 --- a/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs +++ b/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs @@ -65,7 +65,7 @@ namespace QSB.EchoesOfTheEye.LightSensorSync.Patches var position = Locator.GetPlayerCamera().transform.position; var to = __instance.transform.position - position; if (Vector3.Angle(Locator.GetPlayerCamera().transform.forward, to) <= __instance._maxSpotHalfAngle - && !__instance.CheckOcclusion(position, vector, sensorWorldDir, true)) + && !__instance.CheckOcclusion(position, vector, sensorWorldDir)) { __instance._illuminated = true; } @@ -77,7 +77,7 @@ namespace QSB.EchoesOfTheEye.LightSensorSync.Patches var position = player.Camera.transform.position; var to = __instance.transform.position - position; if (Vector3.Angle(player.Camera.transform.forward, to) <= __instance._maxSpotHalfAngle - && !__instance.CheckOcclusion(position, vector, sensorWorldDir, true)) + && !__instance.CheckOcclusion(position, vector, sensorWorldDir)) { __instance._illuminated = true; } @@ -92,7 +92,7 @@ namespace QSB.EchoesOfTheEye.LightSensorSync.Patches && probe.IsLaunched() && !probe.IsRetrieving() && probe.CheckIlluminationAtPoint(vector, __instance._sensorRadius, __instance._maxDistance) - && !__instance.CheckOcclusion(probe.GetLightSourcePosition(), vector, sensorWorldDir, true)) + && !__instance.CheckOcclusion(probe.GetLightSourcePosition(), vector, sensorWorldDir)) { __instance._illuminated = true; } @@ -110,7 +110,7 @@ namespace QSB.EchoesOfTheEye.LightSensorSync.Patches if (dreamLanternController.IsLit() && dreamLanternController.IsFocused(__instance._lanternFocusThreshold) && dreamLanternController.CheckIlluminationAtPoint(vector, __instance._sensorRadius, __instance._maxDistance) - && !__instance.CheckOcclusion(dreamLanternController.GetLightPosition(), vector, sensorWorldDir, true)) + && !__instance.CheckOcclusion(dreamLanternController.GetLightPosition(), vector, sensorWorldDir)) { __instance._illuminatingDreamLanternList.Add(dreamLanternController); __instance._illuminated = true; diff --git a/QSB/ElevatorSync/Events/ElevatorEvent.cs b/QSB/ElevatorSync/Events/ElevatorEvent.cs deleted file mode 100644 index 2c919606..00000000 --- a/QSB/ElevatorSync/Events/ElevatorEvent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using QSB.ElevatorSync.WorldObjects; -using QSB.Events; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ElevatorSync.Events -{ - public class ElevatorEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBStartLift, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBStartLift, Handler); - - private void Handler(int id, bool isGoingUp) => SendEvent(CreateMessage(id, isGoingUp)); - - private BoolWorldObjectMessage CreateMessage(int id, bool isGoingUp) => new() - { - State = isGoingUp, - ObjectId = id - }; - - public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) - { - var elevator = QSBWorldSync.GetWorldFromId(message.ObjectId); - elevator?.RemoteCall(message.State); - } - } -} \ No newline at end of file diff --git a/QSB/ElevatorSync/Messages/ElevatorMessage.cs b/QSB/ElevatorSync/Messages/ElevatorMessage.cs new file mode 100644 index 00000000..d9384f23 --- /dev/null +++ b/QSB/ElevatorSync/Messages/ElevatorMessage.cs @@ -0,0 +1,12 @@ +using QSB.ElevatorSync.WorldObjects; +using QSB.Messaging; + +namespace QSB.ElevatorSync.Messages +{ + public class ElevatorMessage : QSBBoolWorldObjectMessage + { + public ElevatorMessage(bool isGoingUp) => Value = isGoingUp; + + public override void OnReceiveRemote() => WorldObject.RemoteCall(Value); + } +} \ No newline at end of file diff --git a/QSB/ElevatorSync/Patches/ElevatorPatches.cs b/QSB/ElevatorSync/Patches/ElevatorPatches.cs index 1b218863..23367c90 100644 --- a/QSB/ElevatorSync/Patches/ElevatorPatches.cs +++ b/QSB/ElevatorSync/Patches/ElevatorPatches.cs @@ -1,7 +1,7 @@ using HarmonyLib; -using OWML.Utils; +using QSB.ElevatorSync.Messages; using QSB.ElevatorSync.WorldObjects; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.WorldSync; @@ -16,9 +16,9 @@ namespace QSB.ElevatorSync.Patches [HarmonyPatch(typeof(Elevator), nameof(Elevator.StartLift))] public static void Elevator_StartLift(Elevator __instance) { - var isGoingUp = __instance.GetValue("_goingToTheEnd"); - var id = QSBWorldSync.GetIdFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBStartLift, id, isGoingUp); + var isGoingUp = __instance._goingToTheEnd; + var qsbElevator = __instance.GetWorldObject(); + qsbElevator.SendMessage(new ElevatorMessage(isGoingUp)); } } } \ No newline at end of file diff --git a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs index 75d736e9..70e1d904 100644 --- a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs +++ b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs @@ -43,9 +43,9 @@ namespace QSB.ElevatorSync.WorldObjects AttachedObject._attachPoint.AttachPlayer(); - if (Locator.GetPlayerSuit().IsWearingSuit(true) && Locator.GetPlayerSuit().IsTrainingSuit()) + if (Locator.GetPlayerSuit().IsWearingSuit() && Locator.GetPlayerSuit().IsTrainingSuit()) { - Locator.GetPlayerSuit().RemoveSuit(false); + Locator.GetPlayerSuit().RemoveSuit(); } RemoteStartLift(); diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs deleted file mode 100644 index 5d3fbda0..00000000 --- a/QSB/Events/EventNames.cs +++ /dev/null @@ -1,113 +0,0 @@ -namespace QSB.Events -{ - public static class EventNames - { - // Built into Outer Wilds -- don't change unless they change in-game! - public const string TurnOnFlashlight = nameof(TurnOnFlashlight); - public const string TurnOffFlashlight = nameof(TurnOffFlashlight); - public const string ProbeLauncherEquipped = nameof(ProbeLauncherEquipped); - public const string ProbeLauncherUnequipped = nameof(ProbeLauncherUnequipped); - public const string EquipSignalscope = nameof(EquipSignalscope); - public const string UnequipSignalscope = nameof(UnequipSignalscope); - public const string SuitUp = nameof(SuitUp); - public const string RemoveSuit = nameof(RemoveSuit); - public const string EquipTranslator = nameof(EquipTranslator); - public const string UnequipTranslator = nameof(UnequipTranslator); - public const string WakeUp = nameof(WakeUp); - public const string DialogueConditionChanged = nameof(DialogueConditionChanged); - public const string PlayerEnterQuantumMoon = nameof(PlayerEnterQuantumMoon); - public const string PlayerExitQuantumMoon = nameof(PlayerExitQuantumMoon); - public const string EnterRoastingMode = nameof(EnterRoastingMode); - public const string ExitRoastingMode = nameof(ExitRoastingMode); - public const string EnterFlightConsole = nameof(EnterFlightConsole); - public const string ExitFlightConsole = nameof(ExitFlightConsole); - public const string EnterShip = nameof(EnterShip); - public const string ExitShip = nameof(ExitShip); - public const string EyeStateChanged = nameof(EyeStateChanged); - - // Custom event names -- change if you want! These can be anything, as long as both - // sides of the GlobalMessenger (fireevent and addlistener) reference the same thing. - public const string QSBPlayerDeath = nameof(QSBPlayerDeath); - public const string QSBPlayerJoin = nameof(QSBPlayerJoin); - public const string QSBPlayerReady = nameof(QSBPlayerReady); - public const string QSBRequestStateResync = nameof(QSBRequestStateResync); - public const string QSBServerTime = nameof(QSBServerTime); - public const string QSBStartLift = nameof(QSBStartLift); - public const string QSBGeyserState = nameof(QSBGeyserState); - public const string QSBOrbSlot = nameof(QSBOrbSlot); - public const string QSBOrbDrag = nameof(QSBOrbDrag); - public const string QSBConversation = nameof(QSBConversation); - public const string QSBConversationStartEnd = nameof(QSBConversationStartEnd); - public const string QSBChangeAnimType = nameof(QSBChangeAnimType); - public const string QSBPlayerInformation = nameof(QSBPlayerInformation); - public const string QSBRevealFact = nameof(QSBRevealFact); - public const string QSBSocketStateChange = nameof(QSBSocketStateChange); - public const string QSBMultiStateChange = nameof(QSBMultiStateChange); - public const string QSBQuantumShuffle = nameof(QSBQuantumShuffle); - public const string QSBQuantumAuthority = nameof(QSBQuantumAuthority); - public const string QSBMoonStateChange = nameof(QSBMoonStateChange); - public const string QSBIdentifyFrequency = nameof(QSBIdentifyFrequency); - public const string QSBIdentifySignal = nameof(QSBIdentifySignal); - public const string QSBTextTranslated = nameof(QSBTextTranslated); - public const string QSBEnterShrine = nameof(QSBEnterShrine); - public const string QSBExitShrine = nameof(QSBExitShrine); - public const string QSBPlayerEntangle = nameof(QSBPlayerEntangle); - public const string QSBDropItem = nameof(QSBDropItem); - public const string QSBSocketItem = nameof(QSBSocketItem); - public const string QSBMoveToCarry = nameof(QSBMoveToCarry); - public const string QSBStartStatue = nameof(QSBStartStatue); - public const string QSBPlayerKick = nameof(QSBPlayerKick); - public const string QSBEnterPlatform = nameof(QSBEnterPlatform); - public const string QSBExitPlatform = nameof(QSBExitPlatform); - public const string QSBCampfireState = nameof(QSBCampfireState); - public const string QSBMarshmallowEvent = nameof(QSBMarshmallowEvent); - public const string QSBAnimTrigger = nameof(QSBAnimTrigger); - public const string QSBEnterNonNomaiHeadZone = nameof(QSBEnterNonNomaiHeadZone); - public const string QSBExitNonNomaiHeadZone = nameof(QSBExitNonNomaiHeadZone); - public const string QSBNpcAnimEvent = nameof(QSBNpcAnimEvent); - public const string QSBHatchState = nameof(QSBHatchState); - public const string QSBEnableFunnel = nameof(QSBEnableFunnel); - public const string QSBHullImpact = nameof(QSBHullImpact); - public const string QSBHullDamaged = nameof(QSBHullDamaged); - public const string QSBHullChangeIntegrity = nameof(QSBHullChangeIntegrity); - public const string QSBHullRepaired = nameof(QSBHullRepaired); - public const string QSBHullRepairTick = nameof(QSBHullRepairTick); - public const string QSBComponentDamaged = nameof(QSBComponentDamaged); - public const string QSBComponentRepaired = nameof(QSBComponentRepaired); - public const string QSBComponentRepairTick = nameof(QSBComponentRepairTick); - public const string QSBPlayerRespawn = nameof(QSBPlayerRespawn); - public const string QSBProbeEvent = nameof(QSBProbeEvent); - public const string QSBProbeStartRetrieve = nameof(QSBProbeStartRetrieve); - public const string QSBRetrieveProbe = nameof(QSBRetrieveProbe); - public const string QSBPlayerRetrieveProbe = nameof(QSBPlayerRetrieveProbe); - public const string QSBLaunchProbe = nameof(QSBLaunchProbe); - public const string QSBPlayerLaunchProbe = nameof(QSBPlayerLaunchProbe); - public const string QSBEndLoop = nameof(QSBEndLoop); - public const string QSBStartLoop = nameof(QSBStartLoop); - public const string QSBServerState = nameof(QSBServerState); - public const string QSBClientState = nameof(QSBClientState); - public const string QSBDebugEvent = nameof(QSBDebugEvent); - public const string QSBEnterNomaiHeadZone = nameof(QSBEnterNomaiHeadZone); - public const string QSBExitNomaiHeadZone = nameof(QSBExitNomaiHeadZone); - public const string QSBEnterSatelliteCamera = nameof(QSBEnterSatelliteCamera); - public const string QSBExitSatelliteCamera = nameof(QSBExitSatelliteCamera); - public const string QSBSatelliteSnapshot = nameof(QSBSatelliteSnapshot); - public const string QSBAnglerChangeState = nameof(QSBAnglerChangeState); - public const string QSBMeteorPreLaunch = nameof(QSBMeteorPreLaunch); - public const string QSBMeteorLaunch = nameof(QSBMeteorLaunch); - public const string QSBMeteorSpecialImpact = nameof(QSBMeteorSpecialImpact); - public const string QSBFragmentDamage = nameof(QSBFragmentDamage); - public const string QSBFragmentResync = nameof(QSBFragmentResync); - public const string QSBLearnLaunchCodes = nameof(QSBLearnLaunchCodes); - public const string QSBSatelliteRepairTick = nameof(QSBSatelliteRepairTick); - public const string QSBSatelliteRepaired = nameof(QSBSatelliteRepairTick); - public const string QSBAuthQueue = nameof(QSBAuthQueue); - public const string QSBJellyfishRising = nameof(QSBJellyfishRising); - public const string QSBTornadoFormState = nameof(QSBTornadoFormState); - public const string QSBRequestGameDetails = nameof(QSBRequestGameDetails); - public const string QSBGameDetails = nameof(QSBGameDetails); - public const string QSBEnterRemoteDialogue = nameof(QSBEnterRemoteDialogue); - public const string QSBGatherInstrument = nameof(QSBGatherInstrument); - public const string QSBZoomOut = nameof(QSBZoomOut); - } -} diff --git a/QSB/Events/IQSBEvent.cs b/QSB/Events/IQSBEvent.cs deleted file mode 100644 index 9a635885..00000000 --- a/QSB/Events/IQSBEvent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace QSB.Events -{ - public interface IQSBEvent - { - void SetupListener(); - void CloseListener(); - } -} diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs deleted file mode 100644 index 575a85eb..00000000 --- a/QSB/Events/QSBEvent.cs +++ /dev/null @@ -1,99 +0,0 @@ -using JetBrains.Annotations; -using OWML.Utils; -using QSB.Messaging; -using QSB.Player; -using QSB.WorldSync; -using QuantumUNET.Transport; -using System; -using QSB.Utility; - -namespace QSB.Events -{ - public abstract class QSBEvent : IQSBEvent where T : PlayerMessage, new() - { - public uint LocalPlayerId => QSBPlayerManager.LocalPlayerId; - - [UsedImplicitly] - private Type _messageType => typeof(T); - - [UsedImplicitly] - private readonly int _msgType; - - protected QSBEvent() - { - _msgType = QSBEventManager._eventList.Count; - } - - public abstract void SetupListener(); - public abstract void CloseListener(); - - [UsedImplicitly] - public virtual void OnReceiveRemote(bool isHost, T message) { } - - [UsedImplicitly] - public virtual void OnReceiveLocal(bool isHost, T message) { } - - public abstract bool RequireWorldObjectsReady { get; } - - public void SendEvent(T message) - { - message.FromId = LocalPlayerId; - if (QSBEventManager.ForIdOverride != uint.MaxValue) - { - message.ForId = QSBEventManager.ForIdOverride; - } - if (message.OnlySendToHost) - { - if (QSBEventManager.ForIdOverride != uint.MaxValue) - { - DebugLog.ToConsole($"Warning - {typeof(T).Name} is OnlySendToHost, but we are trying to ForIdOverride!"); - } - message.ForId = 0; - } - new QSBEventRelay - { - To = message.ForId, - Event = this, - Message = message - }.Send(); - } - - /// - /// Checks whether the message should be processed by the executing client. - /// - /// True if the message should be processed. - [UsedImplicitly] - public virtual bool CheckMessage(T message) - => !RequireWorldObjectsReady || WorldObjectManager.AllObjectsReady; - } - - internal class QSBEventRelay : QSBMessage - { - public IQSBEvent Event; - public PlayerMessage Message; - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - var msgType = Event.GetValue("_msgType"); - writer.Write(msgType); - Message.Serialize(writer); - } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - var msgType = reader.ReadInt32(); - Event = QSBEventManager._eventList[msgType]; - var messageType = Event.GetValue("_messageType"); - Message = (PlayerMessage)Activator.CreateInstance(messageType); - Message.Deserialize(reader); - } - - public override bool ShouldReceive => Event.Invoke("CheckMessage", Message); - public override void OnReceiveRemote() => Event.Invoke("OnReceiveRemote", QSBCore.IsHost, Message); - public override void OnReceiveLocal() => Event.Invoke("OnReceiveLocal", QSBCore.IsHost, Message); - - public override string ToString() => Event.GetType().Name; - } -} diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs deleted file mode 100644 index 7bc1c623..00000000 --- a/QSB/Events/QSBEventManager.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using OWML.Common; -using QSB.Utility; - -namespace QSB.Events -{ - public static class QSBEventManager - { - public static bool Ready { get; private set; } - - private static readonly Type[] _types = typeof(IQSBEvent).GetDerivedTypes().ToArray(); - internal static readonly List _eventList = new(); - - public static void Init() - { - foreach (var type in _types) - { - _eventList.Add((IQSBEvent)Activator.CreateInstance(type)); - } - - if (UnitTestDetector.IsInUnitTest) - { - return; - } - - _eventList.ForEach(ev => ev.SetupListener()); - - Ready = true; - - DebugLog.DebugWrite("Event Manager ready.", MessageType.Success); - } - - public static void Reset() - { - Ready = false; - _eventList.ForEach(ev => ev.CloseListener()); - _eventList.Clear(); - } - - public static void FireEvent(string eventName) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName); - } - - public static void FireEvent(string eventName, T arg) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg); - } - - public static void FireEvent(string eventName, T arg1, U arg2) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg1, arg2); - } - - public static void FireEvent(string eventName, T arg1, U arg2, V arg3) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3); - } - - public static void FireEvent(string eventName, T arg1, U arg2, V arg3, W arg4) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4); - } - - public static void FireEvent(string eventName, T arg1, U arg2, V arg3, W arg4, X arg5) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5); - } - - public static void FireEvent(string eventName, T arg1, U arg2, V arg3, W arg4, X arg5, Y arg6) - { - if (!QSBCore.IsInMultiplayer) - { - DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); - return; - } - - GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5, arg6); - } - - /// used to force set ForId for every sent event - public static uint ForIdOverride = uint.MaxValue; - } -} diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Events/EyeStateEvent.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Events/EyeStateEvent.cs deleted file mode 100644 index baaab764..00000000 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Events/EyeStateEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.EyeOfTheUniverse.EyeStateSync.Events -{ - internal class EyeStateEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.EyeStateChanged, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.EyeStateChanged, Handler); - - private void Handler(EyeState state) => SendEvent(CreateMessage(state)); - - private EnumMessage CreateMessage(EyeState state) => new() - { - AboutId = LocalPlayerId, - EnumValue = state - }; - - public override void OnReceiveLocal(bool isHost, EnumMessage message) - { - QSBPlayerManager.LocalPlayer.EyeState = message.EnumValue; - } - - public override void OnReceiveRemote(bool isHost, EnumMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.EyeState = message.EnumValue; - } - } -} diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs new file mode 100644 index 00000000..90406d4d --- /dev/null +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -0,0 +1,36 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; +using QSB.WorldSync; + +namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages +{ + internal class EyeStateMessage : QSBEnumMessage + { + static EyeStateMessage() => GlobalMessenger.AddListener(OWEvents.EyeStateChanged, Handler); + + private static void Handler(EyeState state) + { + if (PlayerTransformSync.LocalInstance) + { + new EyeStateMessage(state).Send(); + } + } + + + private EyeStateMessage(EyeState state) => Value = state; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() + { + QSBPlayerManager.LocalPlayer.EyeState = Value; + } + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.EyeState = Value; + } + } +} \ No newline at end of file diff --git a/QSB/EyeOfTheUniverse/GalaxyMap/Events/ZoomOutEvent.cs b/QSB/EyeOfTheUniverse/GalaxyMap/Messages/ZoomOutMessage.cs similarity index 53% rename from QSB/EyeOfTheUniverse/GalaxyMap/Events/ZoomOutEvent.cs rename to QSB/EyeOfTheUniverse/GalaxyMap/Messages/ZoomOutMessage.cs index 8cbca88f..d73452b8 100644 --- a/QSB/EyeOfTheUniverse/GalaxyMap/Events/ZoomOutEvent.cs +++ b/QSB/EyeOfTheUniverse/GalaxyMap/Messages/ZoomOutMessage.cs @@ -1,25 +1,14 @@ -using QSB.Events; -using QSB.Messaging; +using QSB.Messaging; using QSB.WorldSync; using System.Linq; -namespace QSB.EyeOfTheUniverse.GalaxyMap.Events +namespace QSB.EyeOfTheUniverse.GalaxyMap.Messages { - internal class ZoomOutEvent : QSBEvent + internal class ZoomOutMessage : QSBMessage { - public override bool RequireWorldObjectsReady => true; + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBZoomOut, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBZoomOut, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveRemote(bool isHost, PlayerMessage message) + public override void OnReceiveRemote() { var controller = QSBWorldSync.GetUnityObjects().First(); controller.enabled = true; diff --git a/QSB/EyeOfTheUniverse/GalaxyMap/Patches/GalaxyMapPatches.cs b/QSB/EyeOfTheUniverse/GalaxyMap/Patches/GalaxyMapPatches.cs index 0489ab14..aa11e580 100644 --- a/QSB/EyeOfTheUniverse/GalaxyMap/Patches/GalaxyMapPatches.cs +++ b/QSB/EyeOfTheUniverse/GalaxyMap/Patches/GalaxyMapPatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; -using QSB.Events; +using QSB.EyeOfTheUniverse.GalaxyMap.Messages; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using System.Linq; @@ -30,7 +31,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap.Patches { if (QSBPlayerManager.PlayerList.All(x => x.EyeState == EyeState.Observatory)) { - QSBEventManager.FireEvent(EventNames.QSBZoomOut); + new ZoomOutMessage().Send(); } } } diff --git a/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs b/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs index a18182ab..388f1d3c 100644 --- a/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs +++ b/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs @@ -82,7 +82,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap { if (_currentDialogueBox != null && OWInput.GetInputMode() == InputMode.Dialogue) { - if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.All) || OWInput.IsNewlyPressed(InputLibrary.cancel, InputMode.All) || OWInput.IsNewlyPressed(InputLibrary.enter, InputMode.All) || OWInput.IsNewlyPressed(InputLibrary.enter2, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.interact) || OWInput.IsNewlyPressed(InputLibrary.cancel) || OWInput.IsNewlyPressed(InputLibrary.enter) || OWInput.IsNewlyPressed(InputLibrary.enter2)) { if (!_currentDialogueBox.AreTextEffectsComplete()) { @@ -104,13 +104,13 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap } else { - if (OWInput.IsNewlyPressed(InputLibrary.down, InputMode.All) || OWInput.IsNewlyPressed(InputLibrary.down2, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.down) || OWInput.IsNewlyPressed(InputLibrary.down2)) { _currentDialogueBox.OnDownPressed(); return; } - if (OWInput.IsNewlyPressed(InputLibrary.up, InputMode.All) || OWInput.IsNewlyPressed(InputLibrary.up2, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.up) || OWInput.IsNewlyPressed(InputLibrary.up2)) { _currentDialogueBox.OnUpPressed(); } @@ -180,7 +180,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap dialogueNode.ListEntryCondition.Add(xelement5.Value); if (!sharedInstance.ConditionExists(xelement5.Value)) { - sharedInstance.AddCondition(xelement5.Value, false); + sharedInstance.AddCondition(xelement5.Value); } } } @@ -256,7 +256,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap dialogueOption.ConditionRequirement = xelement13.Element("RequiredCondition").Value; if (!sharedInstance.ConditionExists(dialogueOption.ConditionRequirement)) { - sharedInstance.AddCondition(dialogueOption.ConditionRequirement, false); + sharedInstance.AddCondition(dialogueOption.ConditionRequirement); } } @@ -270,7 +270,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap dialogueOption.CancelledRequirement = xelement13.Element("CancelledCondition").Value; if (!sharedInstance.ConditionExists(dialogueOption.CancelledRequirement)) { - sharedInstance.AddCondition(dialogueOption.CancelledRequirement, false); + sharedInstance.AddCondition(dialogueOption.CancelledRequirement); } } @@ -289,7 +289,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap dialogueOption.ConditionToSet = xelement13.Element("ConditionToSet").Value; if (!sharedInstance.ConditionExists(dialogueOption.ConditionToSet)) { - sharedInstance.AddCondition(dialogueOption.ConditionToSet, false); + sharedInstance.AddCondition(dialogueOption.ConditionToSet); } } @@ -298,7 +298,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap dialogueOption.ConditionToCancel = xelement13.Element("ConditionToCancel").Value; if (!sharedInstance.ConditionExists(dialogueOption.ConditionToCancel)) { - sharedInstance.AddCondition(dialogueOption.ConditionToCancel, false); + sharedInstance.AddCondition(dialogueOption.ConditionToCancel); } } @@ -368,12 +368,12 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap _currentDialogueBox = DisplayDialogueBox2(); if (_attentionPoint != null && !PlayerState.InZeroG()) { - Locator.GetPlayerTransform().GetRequiredComponent().LockOn(_attentionPoint, _attentionPointOffset, 2f, false, 1f); + Locator.GetPlayerTransform().GetRequiredComponent().LockOn(_attentionPoint, _attentionPointOffset, 2f); } if (PlayerState.InZeroG() && !_timeFrozen) { - Locator.GetPlayerBody().GetComponent().StartMatchVelocity(this.GetAttachedOWRigidbody(false).GetReferenceFrame(), false); + Locator.GetPlayerBody().GetComponent().StartMatchVelocity(this.GetAttachedOWRigidbody().GetReferenceFrame()); } } @@ -497,7 +497,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap if (selectedOption.ConditionToCancel != string.Empty) { - DialogueConditionManager.SharedInstance.SetConditionState(selectedOption.ConditionToCancel, false); + DialogueConditionManager.SharedInstance.SetConditionState(selectedOption.ConditionToCancel); } if (selectedOption.TargetName == string.Empty) diff --git a/QSB/EyeOfTheUniverse/GalaxyMap/QSBDialogueNode.cs b/QSB/EyeOfTheUniverse/GalaxyMap/QSBDialogueNode.cs index a3806066..dbb5d39c 100644 --- a/QSB/EyeOfTheUniverse/GalaxyMap/QSBDialogueNode.cs +++ b/QSB/EyeOfTheUniverse/GalaxyMap/QSBDialogueNode.cs @@ -149,12 +149,12 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap if (PersistentConditionToDisable != string.Empty) { PlayerData.SetPersistentCondition(PersistentConditionToDisable, false); - sharedInstance.SetConditionState(PersistentConditionToDisable, false); + sharedInstance.SetConditionState(PersistentConditionToDisable); } for (var j = 0; j < DBEntriesToSet.Length; j++) { - Locator.GetShipLogManager().RevealFact(DBEntriesToSet[j], true, true); + Locator.GetShipLogManager().RevealFact(DBEntriesToSet[j]); } } } diff --git a/QSB/EyeOfTheUniverse/InstrumentSync/Event/GatherInstrumentEvent.cs b/QSB/EyeOfTheUniverse/InstrumentSync/Event/GatherInstrumentEvent.cs deleted file mode 100644 index 0eb55b56..00000000 --- a/QSB/EyeOfTheUniverse/InstrumentSync/Event/GatherInstrumentEvent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using QSB.Events; -using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.EyeOfTheUniverse.InstrumentSync.Event -{ - internal class GatherInstrumentEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGatherInstrument, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGatherInstrument, Handler); - - private void Handler(QSBQuantumInstrument instrument) => SendEvent(CreateMessage(instrument)); - - private BoolWorldObjectMessage CreateMessage(QSBQuantumInstrument instrument) => new() - { - AboutId = LocalPlayerId, - ObjectId = instrument.ObjectId - }; - - public override void OnReceiveRemote(bool isHost, WorldObjectMessage message) - { - var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbObj.AttachedObject.Gather(); - } - } -} diff --git a/QSB/EyeOfTheUniverse/InstrumentSync/Messages/GatherInstrumentMessage.cs b/QSB/EyeOfTheUniverse/InstrumentSync/Messages/GatherInstrumentMessage.cs new file mode 100644 index 00000000..aff15c49 --- /dev/null +++ b/QSB/EyeOfTheUniverse/InstrumentSync/Messages/GatherInstrumentMessage.cs @@ -0,0 +1,10 @@ +using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects; +using QSB.Messaging; + +namespace QSB.EyeOfTheUniverse.InstrumentSync.Messages +{ + internal class GatherInstrumentMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.AttachedObject.Gather(); + } +} diff --git a/QSB/EyeOfTheUniverse/InstrumentSync/Patches/QuantumInstrumentPatches.cs b/QSB/EyeOfTheUniverse/InstrumentSync/Patches/QuantumInstrumentPatches.cs index f3e2b051..134396ed 100644 --- a/QSB/EyeOfTheUniverse/InstrumentSync/Patches/QuantumInstrumentPatches.cs +++ b/QSB/EyeOfTheUniverse/InstrumentSync/Patches/QuantumInstrumentPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.EyeOfTheUniverse.InstrumentSync.Messages; using QSB.EyeOfTheUniverse.InstrumentSync.WorldObjects; +using QSB.Messaging; using QSB.Patches; using QSB.WorldSync; using UnityEngine; @@ -14,7 +15,7 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync.Patches [HarmonyPostfix] [HarmonyPatch(typeof(QuantumInstrument), nameof(QuantumInstrument.OnPressInteract))] public static void OnPressInteract(QuantumInstrument __instance) - => QSBEventManager.FireEvent(EventNames.QSBGatherInstrument, QSBWorldSync.GetWorldFromUnity(__instance)); + => __instance.GetWorldObject().SendMessage(new GatherInstrumentMessage()); [HarmonyPrefix] [HarmonyPatch(typeof(QuantumInstrument), nameof(QuantumInstrument.Update))] @@ -27,10 +28,10 @@ namespace QSB.EyeOfTheUniverse.InstrumentSync.Patches && Vector3.Angle(__instance.transform.position - Locator.GetPlayerCamera().transform.position, Locator.GetPlayerCamera().transform.forward) < 1f) { __instance._scopeGatherPrompt.SetVisibility(true); - if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.interact)) { __instance.Gather(); - QSBEventManager.FireEvent(EventNames.QSBGatherInstrument, QSBWorldSync.GetWorldFromUnity(__instance)); + __instance.GetWorldObject().SendMessage(new GatherInstrumentMessage()); Locator.GetPromptManager().RemoveScreenPrompt(__instance._scopeGatherPrompt); } } diff --git a/QSB/GeyserSync/Events/GeyserEvent.cs b/QSB/GeyserSync/Events/GeyserEvent.cs deleted file mode 100644 index 77cd18b3..00000000 --- a/QSB/GeyserSync/Events/GeyserEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using QSB.Events; -using QSB.GeyserSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.GeyserSync.Events -{ - public class GeyserEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGeyserState, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGeyserState, Handler); - - private void Handler(int id, bool state) => SendEvent(CreateMessage(id, state)); - - private BoolWorldObjectMessage CreateMessage(int id, bool state) => new() - { - AboutId = LocalPlayerId, - ObjectId = id, - State = state - }; - - public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) - { - var geyser = QSBWorldSync.GetWorldFromId(message.ObjectId); - geyser?.SetState(message.State); - } - } -} \ No newline at end of file diff --git a/QSB/GeyserSync/Messages/GeyserMessage.cs b/QSB/GeyserSync/Messages/GeyserMessage.cs new file mode 100644 index 00000000..64b54078 --- /dev/null +++ b/QSB/GeyserSync/Messages/GeyserMessage.cs @@ -0,0 +1,12 @@ +using QSB.GeyserSync.WorldObjects; +using QSB.Messaging; + +namespace QSB.GeyserSync.Messages +{ + public class GeyserMessage : QSBBoolWorldObjectMessage + { + public GeyserMessage(bool state) => Value = state; + + public override void OnReceiveRemote() => WorldObject.SetState(Value); + } +} \ No newline at end of file diff --git a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs index 34ef9b94..aead4cfd 100644 --- a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs +++ b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs @@ -1,4 +1,5 @@ -using QSB.Events; +using QSB.GeyserSync.Messages; +using QSB.Messaging; using QSB.WorldSync; using QuantumUNET; @@ -16,7 +17,7 @@ namespace QSB.GeyserSync.WorldObjects { if (QNetworkServer.active) { - QSBEventManager.FireEvent(EventNames.QSBGeyserState, ObjectId, state); + this.SendMessage(new GeyserMessage(state)); } } diff --git a/QSB/Inputs/QSBInputManager.cs b/QSB/Inputs/QSBInputManager.cs index dcf06a1b..f43579dc 100644 --- a/QSB/Inputs/QSBInputManager.cs +++ b/QSB/Inputs/QSBInputManager.cs @@ -1,5 +1,4 @@ -using QSB.Utility; -using UnityEngine; +using UnityEngine; namespace QSB.Inputs { diff --git a/QSB/Instruments/InstrumentsManager.cs b/QSB/Instruments/InstrumentsManager.cs index 9a2c67f7..3df9df6f 100644 --- a/QSB/Instruments/InstrumentsManager.cs +++ b/QSB/Instruments/InstrumentsManager.cs @@ -1,7 +1,8 @@ using OWML.Common; using QSB.Animation.Player; -using QSB.Events; +using QSB.Animation.Player.Messages; using QSB.Instruments.QSBCamera; +using QSB.Messaging; using QSB.Player; using QSB.Utility; using UnityEngine; @@ -119,7 +120,7 @@ namespace QSB.Instruments public void SwitchToType(AnimationType type) { - QSBEventManager.FireEvent(EventNames.QSBChangeAnimType, QSBPlayerManager.LocalPlayerId, type); + new ChangeAnimTypeMessage(QSBPlayerManager.LocalPlayerId, type).Send(); QSBPlayerManager.LocalPlayer.AnimationSync.SetAnimationType(type); CheckInstrumentProps(type); } diff --git a/QSB/Instruments/QSBCamera/CameraManager.cs b/QSB/Instruments/QSBCamera/CameraManager.cs index d45df327..5f4da79b 100644 --- a/QSB/Instruments/QSBCamera/CameraManager.cs +++ b/QSB/Instruments/QSBCamera/CameraManager.cs @@ -1,5 +1,4 @@ using OWML.Common; -using QSB.Events; using QSB.Utility; using UnityEngine; using UnityEngine.PostProcessing; @@ -84,7 +83,7 @@ namespace QSB.Instruments.QSBCamera } OWInput.ChangeInputMode(InputMode.None); - QSBEventManager.FireEvent("SwitchActiveCamera", _owCamera); + GlobalMessenger.FireEvent("SwitchActiveCamera", _owCamera); Locator.GetPlayerCamera().mainCamera.enabled = false; if (_cameraObj.GetComponent() == null) { @@ -113,7 +112,7 @@ namespace QSB.Instruments.QSBCamera } OWInput.ChangeInputMode(InputMode.Character); - QSBEventManager.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera()); + GlobalMessenger.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera()); Locator.GetActiveCamera().mainCamera.enabled = true; _camera.enabled = false; Mode = CameraMode.FirstPerson; diff --git a/QSB/ItemSync/Events/DropItemEvent.cs b/QSB/ItemSync/Events/DropItemEvent.cs deleted file mode 100644 index ffb3f40b..00000000 --- a/QSB/ItemSync/Events/DropItemEvent.cs +++ /dev/null @@ -1,40 +0,0 @@ -using QSB.Events; -using QSB.ItemSync.WorldObjects.Items; -using QSB.Player; -using QSB.Utility; -using QSB.WorldSync; -using UnityEngine; - -namespace QSB.ItemSync.Events -{ - internal class DropItemEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBDropItem, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBDropItem, Handler); - - private void Handler(int objectId, Vector3 position, Vector3 normal, Sector sector) - => SendEvent(CreateMessage(objectId, position, normal, sector)); - - private DropItemMessage CreateMessage(int objectId, Vector3 position, Vector3 normal, Sector sector) => new() - { - ObjectId = objectId, - Position = position, - Normal = normal, - Sector = sector - }; - - public override void OnReceiveRemote(bool server, DropItemMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.DropItem(message.Position, message.Normal, message.Sector); - - var player = QSBPlayerManager.GetPlayer(message.FromId); - player.HeldItem = worldObject; - } - } -} diff --git a/QSB/ItemSync/Events/DropItemMessage.cs b/QSB/ItemSync/Events/DropItemMessage.cs deleted file mode 100644 index 2771cc32..00000000 --- a/QSB/ItemSync/Events/DropItemMessage.cs +++ /dev/null @@ -1,36 +0,0 @@ -using QSB.Messaging; -using QSB.SectorSync.WorldObjects; -using QSB.WorldSync; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.ItemSync.Events -{ - public class DropItemMessage : PlayerMessage - { - public int ObjectId { get; set; } - public Vector3 Position { get; set; } - public Vector3 Normal { get; set; } - public Sector Sector { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - ObjectId = reader.ReadInt32(); - Position = reader.ReadVector3(); - Normal = reader.ReadVector3(); - var sectorId = reader.ReadInt32(); - Sector = QSBWorldSync.GetWorldFromId(sectorId).AttachedObject; - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(ObjectId); - writer.Write(Position); - writer.Write(Normal); - var qsbSector = QSBWorldSync.GetWorldFromUnity(Sector); - writer.Write(qsbSector.ObjectId); - } - } -} diff --git a/QSB/ItemSync/Events/MoveToCarryEvent.cs b/QSB/ItemSync/Events/MoveToCarryEvent.cs deleted file mode 100644 index 3c9e4f47..00000000 --- a/QSB/ItemSync/Events/MoveToCarryEvent.cs +++ /dev/null @@ -1,51 +0,0 @@ -using QSB.Events; -using QSB.ItemSync.WorldObjects.Items; -using QSB.Player; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ItemSync.Events -{ - internal class MoveToCarryEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBMoveToCarry, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBMoveToCarry, Handler); - - private void Handler(int itemId) - => SendEvent(CreateMessage(itemId)); - - private WorldObjectMessage CreateMessage(int itemid) => new() - { - AboutId = QSBPlayerManager.LocalPlayerId, - ObjectId = itemid - }; - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - var itemObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - var itemType = itemObject.GetItemType(); - - player.HeldItem = itemObject; - var itemSocket = itemType switch - { - ItemType.Scroll => player.ScrollSocket, - ItemType.SharedStone => player.SharedStoneSocket, - ItemType.WarpCore => ((QSBWarpCoreItem)itemObject).IsVesselCoreType() - ? player.VesselCoreSocket - : player.WarpCoreSocket, - ItemType.Lantern => player.SimpleLanternSocket, - ItemType.DreamLantern => player.DreamLanternSocket, - ItemType.SlideReel => player.SlideReelSocket, - ItemType.VisionTorch => player.VisionTorchSocket, - _ => player.ItemSocket, - }; - itemObject.PickUpItem(itemSocket, message.AboutId); - } - } -} diff --git a/QSB/ItemSync/Events/SocketItemEvent.cs b/QSB/ItemSync/Events/SocketItemEvent.cs deleted file mode 100644 index 21291410..00000000 --- a/QSB/ItemSync/Events/SocketItemEvent.cs +++ /dev/null @@ -1,64 +0,0 @@ -using QSB.Events; -using QSB.ItemSync.WorldObjects.Items; -using QSB.ItemSync.WorldObjects.Sockets; -using QSB.Player; -using QSB.Utility; -using QSB.WorldSync; - -namespace QSB.ItemSync.Events -{ - internal class SocketItemEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBSocketItem, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBSocketItem, Handler); - - private void Handler(int socketId, int itemId, SocketEventType type) - => SendEvent(CreateMessage(socketId, itemId, type)); - - private SocketItemMessage CreateMessage(int socketId, int itemId, SocketEventType type) => new() - { - AboutId = QSBPlayerManager.LocalPlayerId, - SocketId = socketId, - ItemId = itemId, - SocketType = type - }; - - public override void OnReceiveRemote(bool server, SocketItemMessage message) - { - IQSBOWItemSocket socketWorldObject; - IQSBOWItem itemWorldObject; - var player = QSBPlayerManager.GetPlayer(message.FromId); - player.HeldItem = null; - switch (message.SocketType) - { - case SocketEventType.Socket: - socketWorldObject = QSBWorldSync.GetWorldFromId(message.SocketId); - itemWorldObject = QSBWorldSync.GetWorldFromId(message.ItemId); - - socketWorldObject.PlaceIntoSocket(itemWorldObject); - return; - case SocketEventType.StartUnsocket: - socketWorldObject = QSBWorldSync.GetWorldFromId(message.SocketId); - - if (!socketWorldObject.IsSocketOccupied()) - { - DebugLog.ToConsole($"Warning - Trying to start unsocket on socket that is unoccupied! Socket:{socketWorldObject.Name}"); - return; - } - - socketWorldObject.RemoveFromSocket(); - return; - case SocketEventType.CompleteUnsocket: - itemWorldObject = QSBWorldSync.GetWorldFromId(message.ItemId); - - itemWorldObject.OnCompleteUnsocket(); - return; - } - } - } -} diff --git a/QSB/ItemSync/Events/SocketItemMessage.cs b/QSB/ItemSync/Events/SocketItemMessage.cs deleted file mode 100644 index e60591b8..00000000 --- a/QSB/ItemSync/Events/SocketItemMessage.cs +++ /dev/null @@ -1,28 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.ItemSync.Events -{ - public class SocketItemMessage : PlayerMessage - { - public int SocketId { get; set; } - public int ItemId { get; set; } - public SocketEventType SocketType { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - SocketId = reader.ReadInt32(); - ItemId = reader.ReadInt32(); - SocketType = (SocketEventType)reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(SocketId); - writer.Write(ItemId); - writer.Write((int)SocketType); - } - } -} diff --git a/QSB/ItemSync/Messages/DropItemMessage.cs b/QSB/ItemSync/Messages/DropItemMessage.cs new file mode 100644 index 00000000..6e7d049a --- /dev/null +++ b/QSB/ItemSync/Messages/DropItemMessage.cs @@ -0,0 +1,49 @@ +using QSB.ItemSync.WorldObjects.Items; +using QSB.Messaging; +using QSB.Player; +using QSB.SectorSync.WorldObjects; +using QSB.WorldSync; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.ItemSync.Messages +{ + internal class DropItemMessage : QSBWorldObjectMessage + { + private Vector3 Position; + private Vector3 Normal; + private int SectorId; + + public DropItemMessage(Vector3 position, Vector3 normal, Sector sector) + { + Position = position; + Normal = normal; + SectorId = sector.GetWorldObject().ObjectId; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(Position); + writer.Write(Normal); + writer.Write(SectorId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + Position = reader.ReadVector3(); + Normal = reader.ReadVector3(); + SectorId = reader.ReadInt32(); + } + + public override void OnReceiveRemote() + { + var sector = SectorId.GetWorldObject().AttachedObject; + WorldObject.DropItem(Position, Normal, sector); + + var player = QSBPlayerManager.GetPlayer(From); + player.HeldItem = WorldObject; + } + } +} diff --git a/QSB/ItemSync/Messages/MoveToCarryMessage.cs b/QSB/ItemSync/Messages/MoveToCarryMessage.cs new file mode 100644 index 00000000..91ab4ad5 --- /dev/null +++ b/QSB/ItemSync/Messages/MoveToCarryMessage.cs @@ -0,0 +1,31 @@ +using QSB.ItemSync.WorldObjects.Items; +using QSB.Messaging; +using QSB.Player; + +namespace QSB.ItemSync.Messages +{ + internal class MoveToCarryMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + var itemType = WorldObject.GetItemType(); + + player.HeldItem = WorldObject; + var itemSocket = itemType switch + { + ItemType.Scroll => player.ScrollSocket, + ItemType.SharedStone => player.SharedStoneSocket, + ItemType.WarpCore => ((QSBWarpCoreItem)WorldObject).IsVesselCoreType() + ? player.VesselCoreSocket + : player.WarpCoreSocket, + ItemType.Lantern => player.SimpleLanternSocket, + ItemType.DreamLantern => player.DreamLanternSocket, + ItemType.SlideReel => player.SlideReelSocket, + ItemType.VisionTorch => player.VisionTorchSocket, + _ => player.ItemSocket, + }; + WorldObject.PickUpItem(itemSocket, From); + } + } +} diff --git a/QSB/ItemSync/Messages/SocketItemMessage.cs b/QSB/ItemSync/Messages/SocketItemMessage.cs new file mode 100644 index 00000000..a23dca00 --- /dev/null +++ b/QSB/ItemSync/Messages/SocketItemMessage.cs @@ -0,0 +1,72 @@ +using QSB.ItemSync.WorldObjects.Items; +using QSB.ItemSync.WorldObjects.Sockets; +using QSB.Messaging; +using QSB.Player; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.ItemSync.Messages +{ + internal class SocketItemMessage : QSBEnumMessage + { + private int SocketId; + private int ItemId; + + public SocketItemMessage(SocketMessageType type, int socketId = -1, int itemId = -1) + { + Value = type; + SocketId = socketId; + ItemId = itemId; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(SocketId); + writer.Write(ItemId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + SocketId = reader.ReadInt32(); + ItemId = reader.ReadInt32(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + IQSBOWItemSocket socketWorldObject; + IQSBOWItem itemWorldObject; + var player = QSBPlayerManager.GetPlayer(From); + player.HeldItem = null; + switch (Value) + { + case SocketMessageType.Socket: + socketWorldObject = SocketId.GetWorldObject(); + itemWorldObject = ItemId.GetWorldObject(); + + socketWorldObject.PlaceIntoSocket(itemWorldObject); + return; + case SocketMessageType.StartUnsocket: + socketWorldObject = SocketId.GetWorldObject(); + + if (!socketWorldObject.IsSocketOccupied()) + { + DebugLog.ToConsole($"Warning - Trying to start unsocket on socket that is unoccupied! Socket:{socketWorldObject.Name}"); + return; + } + + socketWorldObject.RemoveFromSocket(); + return; + case SocketMessageType.CompleteUnsocket: + itemWorldObject = ItemId.GetWorldObject(); + + itemWorldObject.OnCompleteUnsocket(); + return; + } + } + } +} diff --git a/QSB/ItemSync/Patches/ItemPatches.cs b/QSB/ItemSync/Patches/ItemPatches.cs index ef59d941..f0353688 100644 --- a/QSB/ItemSync/Patches/ItemPatches.cs +++ b/QSB/ItemSync/Patches/ItemPatches.cs @@ -1,8 +1,9 @@ using HarmonyLib; using OWML.Common; -using QSB.Events; +using QSB.ItemSync.Messages; using QSB.ItemSync.WorldObjects.Items; using QSB.ItemSync.WorldObjects.Sockets; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using QSB.Utility; @@ -20,22 +21,21 @@ namespace QSB.ItemSync.Patches [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.MoveItemToCarrySocket))] public static bool ItemTool_MoveItemToCarrySocket(OWItem item) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(item); - var itemId = qsbObj.ObjectId; + var qsbObj = item.GetWorldObject(); QSBPlayerManager.LocalPlayer.HeldItem = qsbObj; - QSBEventManager.FireEvent(EventNames.QSBMoveToCarry, itemId); + qsbObj.SendMessage(new MoveToCarryMessage()); return true; } [HarmonyPrefix] [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.SocketItem))] - public static bool ItemTool_SocketItem(OWItem ____heldItem, OWItemSocket socket) + public static bool ItemTool_SocketItem(ItemTool __instance, OWItemSocket socket) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(____heldItem); - var socketId = QSBWorldSync.GetWorldFromUnity(socket).ObjectId; + var qsbObj = __instance._heldItem.GetWorldObject(); + var socketId = socket.GetWorldObject().ObjectId; var itemId = qsbObj.ObjectId; QSBPlayerManager.LocalPlayer.HeldItem = null; - QSBEventManager.FireEvent(EventNames.QSBSocketItem, socketId, itemId, SocketEventType.Socket); + new SocketItemMessage(SocketMessageType.Socket, socketId, itemId).Send(); return true; } @@ -43,27 +43,27 @@ namespace QSB.ItemSync.Patches [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.StartUnsocketItem))] public static bool ItemTool_StartUnsocketItem(OWItemSocket socket) { - var item = QSBWorldSync.GetWorldFromUnity(socket.GetSocketedItem()); + var item = socket.GetSocketedItem().GetWorldObject(); QSBPlayerManager.LocalPlayer.HeldItem = item; - var socketId = QSBWorldSync.GetWorldFromUnity(socket).ObjectId; - QSBEventManager.FireEvent(EventNames.QSBSocketItem, socketId, 0, SocketEventType.StartUnsocket); + var socketId = socket.GetWorldObject().ObjectId; + new SocketItemMessage(SocketMessageType.StartUnsocket, socketId).Send(); return true; } [HarmonyPrefix] [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.CompleteUnsocketItem))] - public static bool ItemTool_CompleteUnsocketItem(OWItem ____heldItem) + public static bool ItemTool_CompleteUnsocketItem(ItemTool __instance) { - var itemId = QSBWorldSync.GetWorldFromUnity(____heldItem).ObjectId; - QSBEventManager.FireEvent(EventNames.QSBSocketItem, 0, itemId, SocketEventType.CompleteUnsocket); + var itemId = __instance._heldItem.GetWorldObject().ObjectId; + new SocketItemMessage(SocketMessageType.CompleteUnsocket, itemId: itemId).Send(); return true; } [HarmonyPrefix] [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.DropItem))] - public static bool ItemTool_DropItem(RaycastHit hit, OWRigidbody targetRigidbody, IItemDropTarget customDropTarget, ref OWItem ____heldItem) + public static bool ItemTool_DropItem(ItemTool __instance, RaycastHit hit, OWRigidbody targetRigidbody, IItemDropTarget customDropTarget) { - Locator.GetPlayerAudioController().PlayDropItem(____heldItem.GetItemType()); + Locator.GetPlayerAudioController().PlayDropItem(__instance._heldItem.GetItemType()); var hitGameObject = hit.collider.gameObject; var gameObject2 = hitGameObject; var sectorGroup = gameObject2.GetComponent(); @@ -77,9 +77,9 @@ namespace QSB.ItemSync.Patches if (sectorGroup != null) { sector = sectorGroup.GetSector(); - if (sector == null && sectorGroup is SectorCullGroup) + if (sector == null && sectorGroup is SectorCullGroup sectorCullGroup) { - var controllingProxy = (sectorGroup as SectorCullGroup).GetControllingProxy(); + var controllingProxy = sectorCullGroup.GetControllingProxy(); if (controllingProxy != null) { sector = controllingProxy.GetSector(); @@ -90,16 +90,16 @@ namespace QSB.ItemSync.Patches var parent = (customDropTarget == null) ? targetRigidbody.transform : customDropTarget.GetItemDropTargetTransform(hit.collider.gameObject); - var objectId = QSBWorldSync.GetWorldFromUnity(____heldItem).ObjectId; - ____heldItem.DropItem(hit.point, hit.normal, parent, sector, customDropTarget); - ____heldItem = null; + var qsbItem = __instance._heldItem.GetWorldObject(); + __instance._heldItem.DropItem(hit.point, hit.normal, parent, sector, customDropTarget); + __instance._heldItem = null; QSBPlayerManager.LocalPlayer.HeldItem = null; Locator.GetToolModeSwapper().UnequipTool(); var parentSector = parent.GetComponentInChildren(); if (parentSector != null) { var localPos = parentSector.transform.InverseTransformPoint(hit.point); - QSBEventManager.FireEvent(EventNames.QSBDropItem, objectId, localPos, hit.normal, parentSector); + qsbItem.SendMessage(new DropItemMessage(localPos, hit.normal, parentSector)); return false; } diff --git a/QSB/ItemSync/SocketEventType.cs b/QSB/ItemSync/SocketMessageType.cs similarity index 72% rename from QSB/ItemSync/SocketEventType.cs rename to QSB/ItemSync/SocketMessageType.cs index 0d4c54d9..c09b1ba7 100644 --- a/QSB/ItemSync/SocketEventType.cs +++ b/QSB/ItemSync/SocketMessageType.cs @@ -1,6 +1,6 @@ namespace QSB.ItemSync { - public enum SocketEventType + public enum SocketMessageType { StartUnsocket, CompleteUnsocket, diff --git a/QSB/ItemSync/WorldObjects/Items/QSBOWItem.cs b/QSB/ItemSync/WorldObjects/Items/QSBOWItem.cs index 7e0ee773..1a27ad04 100644 --- a/QSB/ItemSync/WorldObjects/Items/QSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/Items/QSBOWItem.cs @@ -36,7 +36,7 @@ namespace QSB.ItemSync.WorldObjects.Items var initialSector = AttachedObject.GetSector(); if (initialSector != null) { - InitialSector = QSBWorldSync.GetWorldFromUnity(initialSector); + InitialSector = initialSector.GetWorldObject(); } if (InitialParent == null) @@ -46,7 +46,7 @@ namespace QSB.ItemSync.WorldObjects.Items if (InitialParent?.GetComponent() != null) { - var qsbObj = QSBWorldSync.GetWorldFromUnity(InitialParent.GetComponent()); + var qsbObj = InitialParent.GetComponent().GetWorldObject(); InitialSocket = qsbObj; } }); diff --git a/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemDoubleSocket.cs b/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemDoubleSocket.cs index 9aaa0571..f74850a6 100644 --- a/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemDoubleSocket.cs +++ b/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemDoubleSocket.cs @@ -20,6 +20,6 @@ namespace QSB.ItemSync.WorldObjects.Sockets => AttachedObject.PlaceIntoSocket((OWItem)item.ReturnObject()); public virtual IQSBOWItem RemoveFromSocket() - => QSBWorldSync.GetWorldFromUnity(AttachedObject.RemoveFromSocket()); + => AttachedObject.RemoveFromSocket().GetWorldObject(); } } diff --git a/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemSocket.cs b/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemSocket.cs index a0ef9b9b..d9f1a52e 100644 --- a/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemSocket.cs +++ b/QSB/ItemSync/WorldObjects/Sockets/QSBOWItemSocket.cs @@ -20,6 +20,6 @@ namespace QSB.ItemSync.WorldObjects.Sockets => AttachedObject.PlaceIntoSocket((OWItem)item.ReturnObject()); public virtual IQSBOWItem RemoveFromSocket() - => QSBWorldSync.GetWorldFromUnity(AttachedObject.RemoveFromSocket()); + => AttachedObject.RemoveFromSocket().GetWorldObject(); } } diff --git a/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs b/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs deleted file mode 100644 index b0642c94..00000000 --- a/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.Events; -using QSB.JellyfishSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.JellyfishSync.Events -{ - public class JellyfishRisingEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBJellyfishRising, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBJellyfishRising, Handler); - - private void Handler(QSBJellyfish qsbJellyfish) => SendEvent(CreateMessage(qsbJellyfish)); - - private BoolWorldObjectMessage CreateMessage(QSBJellyfish qsbJellyfish) => new() - { - ObjectId = qsbJellyfish.ObjectId, - State = qsbJellyfish.IsRising - }; - - public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) - { - var qsbJellyfish = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbJellyfish.IsRising = message.State; - } - } -} diff --git a/QSB/JellyfishSync/JellyfishManager.cs b/QSB/JellyfishSync/JellyfishManager.cs index 369c9e22..4ad7f964 100644 --- a/QSB/JellyfishSync/JellyfishManager.cs +++ b/QSB/JellyfishSync/JellyfishManager.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; -using QSB.JellyfishSync.WorldObjects; +using QSB.JellyfishSync.WorldObjects; using QSB.WorldSync; +using System.Collections.Generic; namespace QSB.JellyfishSync { diff --git a/QSB/JellyfishSync/Messages/JellyfishRisingMessage.cs b/QSB/JellyfishSync/Messages/JellyfishRisingMessage.cs new file mode 100644 index 00000000..01d60b8e --- /dev/null +++ b/QSB/JellyfishSync/Messages/JellyfishRisingMessage.cs @@ -0,0 +1,13 @@ +using QSB.JellyfishSync.WorldObjects; +using QSB.Messaging; + +namespace QSB.JellyfishSync.Messages +{ + public class JellyfishRisingMessage : QSBBoolWorldObjectMessage + { + public JellyfishRisingMessage(bool isRising) => Value = isRising; + + public override void OnReceiveRemote() => WorldObject.IsRising = Value; + + } +} diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs index ef6205d8..f84f1bb0 100644 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -1,7 +1,7 @@ using HarmonyLib; -using QSB.AuthoritySync; -using QSB.Events; +using QSB.JellyfishSync.Messages; using QSB.JellyfishSync.WorldObjects; +using QSB.Messaging; using QSB.Patches; using QSB.WorldSync; @@ -19,7 +19,7 @@ namespace QSB.JellyfishSync.Patches { return true; } - var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbJellyfish = __instance.GetWorldObject(); var sqrMagnitude = (__instance._jellyfishBody.GetPosition() - __instance._planetBody.GetPosition()).sqrMagnitude; if (qsbJellyfish.IsRising) @@ -28,7 +28,8 @@ namespace QSB.JellyfishSync.Patches if (sqrMagnitude > __instance._upperLimit * __instance._upperLimit) { qsbJellyfish.IsRising = false; - QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); + + qsbJellyfish.SendMessage(new JellyfishRisingMessage(qsbJellyfish.IsRising)); } } else @@ -37,7 +38,7 @@ namespace QSB.JellyfishSync.Patches if (sqrMagnitude < __instance._lowerLimit * __instance._lowerLimit) { qsbJellyfish.IsRising = true; - QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); + qsbJellyfish.SendMessage(new JellyfishRisingMessage(qsbJellyfish.IsRising)); } } diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index fa9c20e6..76ab390c 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -1,10 +1,10 @@ -using QSB.JellyfishSync.WorldObjects; +using QSB.AuthoritySync; +using QSB.JellyfishSync.WorldObjects; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; using System.Collections.Generic; -using QSB.AuthoritySync; using UnityEngine; namespace QSB.JellyfishSync.TransformSync @@ -44,7 +44,7 @@ namespace QSB.JellyfishSync.TransformSync protected override void Init() { - _qsbJellyfish = QSBWorldSync.GetWorldFromUnity(JellyfishManager.Jellyfish[_instances.IndexOf(this)]); + _qsbJellyfish = JellyfishManager.Jellyfish[_instances.IndexOf(this)].GetWorldObject(); _qsbJellyfish.TransformSync = this; base.Init(); @@ -56,11 +56,11 @@ namespace QSB.JellyfishSync.TransformSync } AttachedObject.OnUnsuspendOWRigidbody += OnUnsuspend; AttachedObject.OnSuspendOWRigidbody += OnSuspend; - NetIdentity.FireAuthQueue(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); + NetIdentity.SendAuthQueueMessage(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); } - private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Add); - private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Remove); + private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Add); + private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Remove); public override void SerializeTransform(QNetworkWriter writer, bool initialState) { diff --git a/QSB/LogSync/Events/RevealFactEvent.cs b/QSB/LogSync/Events/RevealFactEvent.cs deleted file mode 100644 index fa32fa46..00000000 --- a/QSB/LogSync/Events/RevealFactEvent.cs +++ /dev/null @@ -1,46 +0,0 @@ -using QSB.Events; -using QSB.WorldSync; - -namespace QSB.LogSync.Events -{ - public class RevealFactEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBRevealFact, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBRevealFact, Handler); - - private void Handler(string id, bool saveGame, bool showNotification) => SendEvent(CreateMessage(id, saveGame, showNotification)); - - private RevealFactMessage CreateMessage(string id, bool saveGame, bool showNotification) => new() - { - AboutId = LocalPlayerId, - FactId = id, - SaveGame = saveGame, - ShowNotification = showNotification - }; - - public override void OnReceiveLocal(bool server, RevealFactMessage message) - { - if (server) - { - QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification); - } - } - - public override void OnReceiveRemote(bool server, RevealFactMessage message) - { - if (server) - { - QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification); - } - - if (!WorldObjectManager.AllObjectsReady) - { - return; - } - - Locator.GetShipLogManager().RevealFact(message.FactId, message.SaveGame, message.ShowNotification); - } - } -} diff --git a/QSB/LogSync/Events/RevealFactMessage.cs b/QSB/LogSync/Events/RevealFactMessage.cs deleted file mode 100644 index 4b0eb598..00000000 --- a/QSB/LogSync/Events/RevealFactMessage.cs +++ /dev/null @@ -1,28 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.LogSync.Events -{ - public class RevealFactMessage : PlayerMessage - { - public string FactId { get; set; } - public bool SaveGame { get; set; } - public bool ShowNotification { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - FactId = reader.ReadString(); - SaveGame = reader.ReadBoolean(); - ShowNotification = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(FactId); - writer.Write(SaveGame); - writer.Write(ShowNotification); - } - } -} diff --git a/QSB/WorldSync/FactReveal.cs b/QSB/LogSync/FactReveal.cs similarity index 57% rename from QSB/WorldSync/FactReveal.cs rename to QSB/LogSync/FactReveal.cs index 6d8c4290..49edf086 100644 --- a/QSB/WorldSync/FactReveal.cs +++ b/QSB/LogSync/FactReveal.cs @@ -1,9 +1,8 @@ -namespace QSB.WorldSync +namespace QSB.LogSync { public struct FactReveal { public string Id; public bool SaveGame; - public bool ShowNotification; } } \ No newline at end of file diff --git a/QSB/LogSync/Messages/RevealFactMessage.cs b/QSB/LogSync/Messages/RevealFactMessage.cs new file mode 100644 index 00000000..68304301 --- /dev/null +++ b/QSB/LogSync/Messages/RevealFactMessage.cs @@ -0,0 +1,61 @@ +using QSB.Messaging; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.LogSync.Messages +{ + public class RevealFactMessage : QSBMessage + { + private string FactId; + private bool SaveGame; + private bool ShowNotification; + + public RevealFactMessage(string id, bool saveGame, bool showNotification) + { + FactId = id; + SaveGame = saveGame; + ShowNotification = showNotification; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(FactId); + writer.Write(SaveGame); + writer.Write(ShowNotification); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + FactId = reader.ReadString(); + SaveGame = reader.ReadBoolean(); + ShowNotification = reader.ReadBoolean(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() + { + if (QSBCore.IsHost) + { + QSBWorldSync.AddFactReveal(FactId, SaveGame); + } + } + + public override void OnReceiveRemote() + { + if (QSBCore.IsHost) + { + QSBWorldSync.AddFactReveal(FactId, SaveGame); + } + + if (!WorldObjectManager.AllObjectsReady) + { + return; + } + + Locator.GetShipLogManager().RevealFact(FactId, SaveGame, ShowNotification); + } + } +} \ No newline at end of file diff --git a/QSB/LogSync/Patches/LogPatches.cs b/QSB/LogSync/Patches/LogPatches.cs index c619d2fd..906d0237 100644 --- a/QSB/LogSync/Patches/LogPatches.cs +++ b/QSB/LogSync/Patches/LogPatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; -using QSB.Events; +using QSB.LogSync.Messages; +using QSB.Messaging; using QSB.Patches; namespace QSB.LogSync.Patches @@ -18,7 +19,7 @@ namespace QSB.LogSync.Patches return; } - QSBEventManager.FireEvent(EventNames.QSBRevealFact, id, saveGame, showNotification); + new RevealFactMessage(id, saveGame, showNotification).Send(); } } } \ No newline at end of file diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 7f7fa505..63794541 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -1,6 +1,7 @@ -using QSB.Events; +using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; +using QSB.SaveSync.Messages; using QSB.Utility; using System.Linq; using System.Text; @@ -73,8 +74,8 @@ namespace QSB.Menus private void Update() { if (QSBCore.IsInMultiplayer - && (LoadManager.GetLoadingScene() == OWScene.SolarSystem || LoadManager.GetLoadingScene() == OWScene.EyeOfTheUniverse) - && _loadingText != null) + && (LoadManager.GetLoadingScene() == OWScene.SolarSystem || LoadManager.GetLoadingScene() == OWScene.EyeOfTheUniverse) + && _loadingText != null) { var num = LoadManager.GetAsyncLoadProgress(); num = num < 0.1f @@ -132,7 +133,7 @@ namespace QSB.Menus if (QSBSceneManager.IsInUniverse) { - LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f, true); + LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f); } } @@ -261,7 +262,7 @@ namespace QSB.Menus OWInput.RestorePreviousInputs(); - LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f, true); + LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f); } private void Host() @@ -312,10 +313,8 @@ namespace QSB.Menus return; } - QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null, () => - { - QSBEventManager.FireEvent(EventNames.QSBRequestGameDetails); - }); + QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, + () => new RequestGameStateMessage().Send()); } public void OnKicked(KickReason reason) @@ -388,4 +387,4 @@ namespace QSB.Menus OpenInfoPopup(text, "OK"); } } -} +} \ No newline at end of file diff --git a/QSB/Messaging/BoolMessage.cs b/QSB/Messaging/BoolMessage.cs deleted file mode 100644 index 58933fff..00000000 --- a/QSB/Messaging/BoolMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.Messaging -{ - public class BoolMessage : PlayerMessage - { - public bool Value; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Value = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Value); - } - } -} \ No newline at end of file diff --git a/QSB/Messaging/EnumMessage.cs b/QSB/Messaging/EnumMessage.cs deleted file mode 100644 index bbaaab86..00000000 --- a/QSB/Messaging/EnumMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.Messaging -{ - public class EnumMessage : PlayerMessage - { - public T EnumValue; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - EnumValue = (T)(object)reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write((int)(object)EnumValue); - } - } -} \ No newline at end of file diff --git a/QSB/Messaging/FloatMessage.cs b/QSB/Messaging/FloatMessage.cs deleted file mode 100644 index 7e65a30c..00000000 --- a/QSB/Messaging/FloatMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.Messaging -{ - public class FloatMessage : PlayerMessage - { - public float Value; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Value = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Value); - } - } -} \ No newline at end of file diff --git a/QSB/Messaging/OWEvents.cs b/QSB/Messaging/OWEvents.cs new file mode 100644 index 00000000..10885c86 --- /dev/null +++ b/QSB/Messaging/OWEvents.cs @@ -0,0 +1,33 @@ +namespace QSB.Messaging +{ + /// + /// global messenger events built into outer wilds + /// that are also listened to with network messages. + /// + /// don't change unless they change in-game! + /// + public static class OWEvents + { + public const string TurnOnFlashlight = nameof(TurnOnFlashlight); + public const string TurnOffFlashlight = nameof(TurnOffFlashlight); + public const string ProbeLauncherEquipped = nameof(ProbeLauncherEquipped); + public const string ProbeLauncherUnequipped = nameof(ProbeLauncherUnequipped); + public const string EquipSignalscope = nameof(EquipSignalscope); + public const string UnequipSignalscope = nameof(UnequipSignalscope); + public const string SuitUp = nameof(SuitUp); + public const string RemoveSuit = nameof(RemoveSuit); + public const string EquipTranslator = nameof(EquipTranslator); + public const string UnequipTranslator = nameof(UnequipTranslator); + public const string WakeUp = nameof(WakeUp); + public const string DialogueConditionChanged = nameof(DialogueConditionChanged); + public const string PlayerEnterQuantumMoon = nameof(PlayerEnterQuantumMoon); + public const string PlayerExitQuantumMoon = nameof(PlayerExitQuantumMoon); + public const string EnterRoastingMode = nameof(EnterRoastingMode); + public const string ExitRoastingMode = nameof(ExitRoastingMode); + public const string EnterFlightConsole = nameof(EnterFlightConsole); + public const string ExitFlightConsole = nameof(ExitFlightConsole); + public const string EnterShip = nameof(EnterShip); + public const string ExitShip = nameof(ExitShip); + public const string EyeStateChanged = nameof(EyeStateChanged); + } +} diff --git a/QSB/Messaging/PlayerMessage.cs b/QSB/Messaging/PlayerMessage.cs deleted file mode 100644 index b14eb553..00000000 --- a/QSB/Messaging/PlayerMessage.cs +++ /dev/null @@ -1,53 +0,0 @@ -using QuantumUNET.Messages; -using QuantumUNET.Transport; - -namespace QSB.Messaging -{ - public class PlayerMessage : QMessageBase - { - /// - /// The Player ID that is sending this message - /// - public uint FromId { get; set; } - - /// - /// The Player ID that this message is about - /// - public uint AboutId { get; set; } - - /// - /// If true, only send this message to the host of the current session - /// (OnReceiveLocal/Remote is not called on any other client) - /// - public bool OnlySendToHost { get; set; } - - /// - /// The Player ID that this message is for. - /// By default, this is uint.MaxValue, - /// which means this is ignored and the message is sent to all clients - /// - public uint ForId { get; set; } = uint.MaxValue; - - public override void Deserialize(QNetworkReader reader) - { - FromId = reader.ReadUInt32(); - AboutId = reader.ReadUInt32(); - OnlySendToHost = reader.ReadBoolean(); - if (!OnlySendToHost) - { - reader.ReadUInt32(); - } - } - - public override void Serialize(QNetworkWriter writer) - { - writer.Write(FromId); - writer.Write(AboutId); - writer.Write(OnlySendToHost); - if (!OnlySendToHost) - { - writer.Write(ForId); - } - } - } -} diff --git a/QSB/Messaging/QSBMessage.cs b/QSB/Messaging/QSBMessage.cs index a7e55c5b..989cc0c0 100644 --- a/QSB/Messaging/QSBMessage.cs +++ b/QSB/Messaging/QSBMessage.cs @@ -1,44 +1,56 @@ -using System; -using QSB.Player; -using QuantumUNET.Messages; +using QuantumUNET.Messages; using QuantumUNET.Transport; +using System; namespace QSB.Messaging { public abstract class QSBMessage : QMessageBase { - /// set automatically when sending a message - public uint From; /// - /// uint.MaxValue = send to everyone
+ /// set automatically by Send + ///
+ internal uint From; + /// + /// (default) uint.MaxValue = send to everyone
/// 0 = send to host ///
public uint To = uint.MaxValue; + /// /// call the base method when overriding + /// public override void Serialize(QNetworkWriter writer) { writer.Write(From); writer.Write(To); } + /// /// call the base method when overriding + /// + /// note: no constructor is called before this, + /// so fields won't be initialized. + /// public override void Deserialize(QNetworkReader reader) { From = reader.ReadUInt32(); To = reader.ReadUInt32(); } + /// /// checked before calling either OnReceive + /// public virtual bool ShouldReceive => true; - public virtual void OnReceiveRemote() { } public virtual void OnReceiveLocal() { } + public virtual void OnReceiveRemote() { } + + public override string ToString() => GetType().Name; } public abstract class QSBBoolMessage : QSBMessage { - public bool Value; + protected bool Value; public override void Serialize(QNetworkWriter writer) { @@ -55,7 +67,7 @@ namespace QSB.Messaging public abstract class QSBFloatMessage : QSBMessage { - public float Value; + protected float Value; public override void Serialize(QNetworkWriter writer) { @@ -72,7 +84,7 @@ namespace QSB.Messaging public abstract class QSBEnumMessage : QSBMessage where E : Enum { - public E Value; + protected E Value; public override void Serialize(QNetworkWriter writer) { diff --git a/QSB/Messaging/QSBMessageManager.cs b/QSB/Messaging/QSBMessageManager.cs index 94b4a128..07383042 100644 --- a/QSB/Messaging/QSBMessageManager.cs +++ b/QSB/Messaging/QSBMessageManager.cs @@ -1,18 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using OWML.Common; +using OWML.Common; using QSB.ClientServerStateSync; -using QSB.ClientServerStateSync.Events; -using QSB.Events; +using QSB.ClientServerStateSync.Messages; using QSB.Player; -using QSB.Player.Events; +using QSB.Player.Messages; using QSB.Player.TransformSync; using QSB.Utility; using QSB.WorldSync; using QuantumUNET; using QuantumUNET.Components; using QuantumUNET.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; namespace QSB.Messaging { @@ -40,6 +41,9 @@ namespace QSB.Messaging _msgTypeToType.Add(msgType, types[i]); _typeToMsgType.Add(types[i], msgType); + + // call static constructor of message if needed + RuntimeHelpers.RunClassConstructor(types[i].TypeHandle); } } @@ -63,7 +67,7 @@ namespace QSB.Messaging private static void OnServerReceiveRaw(QNetworkMessage netMsg) { var msgType = netMsg.MsgType; - var msg = (QSBMessageRaw)Activator.CreateInstance(_msgTypeToType[msgType]); + var msg = (QSBMessageRaw)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]); netMsg.ReadMessage(msg); QNetworkServer.SendToAll(msgType, msg); @@ -72,7 +76,7 @@ namespace QSB.Messaging private static void OnClientReceiveRaw(QNetworkMessage netMsg) { var msgType = netMsg.MsgType; - var msg = (QSBMessageRaw)Activator.CreateInstance(_msgTypeToType[msgType]); + var msg = (QSBMessageRaw)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]); netMsg.ReadMessage(msg); msg.OnReceive(); @@ -81,7 +85,7 @@ namespace QSB.Messaging private static void OnServerReceive(QNetworkMessage netMsg) { var msgType = netMsg.MsgType; - var msg = (QSBMessage)Activator.CreateInstance(_msgTypeToType[msgType]); + var msg = (QSBMessage)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]); netMsg.ReadMessage(msg); if (msg.To == uint.MaxValue) @@ -107,7 +111,7 @@ namespace QSB.Messaging private static void OnClientReceive(QNetworkMessage netMsg) { var msgType = netMsg.MsgType; - var msg = (QSBMessage)Activator.CreateInstance(_msgTypeToType[msgType]); + var msg = (QSBMessage)FormatterServices.GetUninitializedObject(_msgTypeToType[msgType]); netMsg.ReadMessage(msg); if (PlayerTransformSync.LocalInstance == null) @@ -121,12 +125,12 @@ namespace QSB.Messaging var player = QSBPlayerManager.GetPlayer(msg.From); if (!player.IsReady - && player.PlayerId != QSBPlayerManager.LocalPlayerId - && player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem - && msg is not QSBEventRelay { Event: PlayerInformationEvent or PlayerReadyEvent or RequestStateResyncEvent or ServerStateEvent }) + && player.PlayerId != QSBPlayerManager.LocalPlayerId + && player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem + && msg is not (PlayerInformationMessage or PlayerReadyMessage or RequestStateResyncMessage or ServerStateMessage)) { DebugLog.ToConsole($"Warning - Got message {msg} from player {msg.From}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning); - QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); + new RequestStateResyncMessage().Send(); } } @@ -156,14 +160,21 @@ namespace QSB.Messaging public static void SendRaw(this M msg) - where M : QSBMessageRaw, new() + where M : QSBMessageRaw { var msgType = _typeToMsgType[typeof(M)]; QNetworkManager.singleton.client.Send(msgType, msg); } + public static void ServerSendRaw(this M msg, QNetworkConnection conn) + where M : QSBMessageRaw + { + var msgType = _typeToMsgType[typeof(M)]; + conn.Send(msgType, msg); + } + public static void Send(this M msg) - where M : QSBMessage, new() + where M : QSBMessage { if (PlayerTransformSync.LocalInstance == null) { @@ -178,7 +189,7 @@ namespace QSB.Messaging public static void SendMessage(this T worldObject, M msg) where T : IWorldObject - where M : QSBWorldObjectMessage, new() + where M : QSBWorldObjectMessage { msg.ObjectId = worldObject.ObjectId; Send(msg); diff --git a/QSB/Messaging/QSBWorldObjectMessage.cs b/QSB/Messaging/QSBWorldObjectMessage.cs index a2bc9958..ccea9e7b 100644 --- a/QSB/Messaging/QSBWorldObjectMessage.cs +++ b/QSB/Messaging/QSBWorldObjectMessage.cs @@ -1,13 +1,19 @@ -using System; -using QSB.WorldSync; +using QSB.WorldSync; using QuantumUNET.Transport; +using System; namespace QSB.Messaging { public abstract class QSBWorldObjectMessage : QSBMessage where T : IWorldObject { - public int ObjectId; - public T WorldObject { get; private set; } + /// + /// set automatically by SendMessage + /// + internal int ObjectId; + /// + /// set automatically by ShouldReceive + /// + protected T WorldObject { get; private set; } public override void Serialize(QNetworkWriter writer) { @@ -30,7 +36,7 @@ namespace QSB.Messaging return false; } - WorldObject = QSBWorldSync.GetWorldFromId(ObjectId); + WorldObject = ObjectId.GetWorldObject(); return true; } } @@ -39,7 +45,7 @@ namespace QSB.Messaging public abstract class QSBBoolWorldObjectMessage : QSBWorldObjectMessage where T : IWorldObject { - public bool Value; + protected bool Value; public override void Serialize(QNetworkWriter writer) { @@ -56,7 +62,7 @@ namespace QSB.Messaging public abstract class QSBFloatWorldObjectMessage : QSBWorldObjectMessage where T : IWorldObject { - public float Value; + protected float Value; public override void Serialize(QNetworkWriter writer) { @@ -75,7 +81,7 @@ namespace QSB.Messaging where T : IWorldObject where E : Enum { - public E Value; + protected E Value; public override void Serialize(QNetworkWriter writer) { diff --git a/QSB/Messaging/ToggleMessage.cs b/QSB/Messaging/ToggleMessage.cs deleted file mode 100644 index 001cac97..00000000 --- a/QSB/Messaging/ToggleMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.Messaging -{ - public class ToggleMessage : PlayerMessage - { - public bool ToggleValue { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - ToggleValue = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(ToggleValue); - } - } -} \ No newline at end of file diff --git a/QSB/MeteorSync/Events/FragmentDamageEvent.cs b/QSB/MeteorSync/Events/FragmentDamageEvent.cs deleted file mode 100644 index fc74c411..00000000 --- a/QSB/MeteorSync/Events/FragmentDamageEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.MeteorSync.Events -{ - public class FragmentDamageEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBFragmentDamage, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBFragmentDamage, Handler); - - private void Handler(QSBFragment qsbFragment, float damage) => - SendEvent(CreateMessage(qsbFragment, damage)); - - private FragmentDamageMessage CreateMessage(QSBFragment qsbFragment, float damage) => new() - { - ObjectId = qsbFragment.ObjectId, - Damage = damage - }; - - public override void OnReceiveRemote(bool isHost, FragmentDamageMessage message) - { - var qsbFragment = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbFragment.AddDamage(message.Damage); - } - } -} diff --git a/QSB/MeteorSync/Events/FragmentDamageMessage.cs b/QSB/MeteorSync/Events/FragmentDamageMessage.cs deleted file mode 100644 index 4ee08897..00000000 --- a/QSB/MeteorSync/Events/FragmentDamageMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.MeteorSync.Events -{ - public class FragmentDamageMessage : WorldObjectMessage - { - public float Damage; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Damage = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Damage); - } - } -} diff --git a/QSB/MeteorSync/Events/FragmentResyncEvent.cs b/QSB/MeteorSync/Events/FragmentResyncEvent.cs deleted file mode 100644 index 918f8b4d..00000000 --- a/QSB/MeteorSync/Events/FragmentResyncEvent.cs +++ /dev/null @@ -1,117 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.Syncs; -using QSB.Utility; -using QSB.WorldSync; - -namespace QSB.MeteorSync.Events -{ - /// called when we request a resync on client join - /// pain - public class FragmentResyncEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBFragmentResync, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBFragmentResync, Handler); - - private void Handler(QSBFragment qsbFragment) => SendEvent(CreateMessage(qsbFragment)); - - private FragmentResyncMessage CreateMessage(QSBFragment qsbFragment) - { - var msg = new FragmentResyncMessage - { - ObjectId = qsbFragment.ObjectId, - Integrity = qsbFragment.AttachedObject._integrity, - OrigIntegrity = qsbFragment.AttachedObject._origIntegrity, - LeashLength = qsbFragment.LeashLength, - IsDetached = qsbFragment.IsDetached - }; - - if (msg.IsDetached) - { - msg.IsThruWhiteHole = qsbFragment.IsThruWhiteHole; - - var body = qsbFragment.Body; - var refBody = qsbFragment.RefBody; - var pos = body.GetPosition(); - msg.Pos = refBody.transform.ToRelPos(pos); - msg.Rot = refBody.transform.ToRelRot(body.GetRotation()); - msg.Vel = refBody.ToRelVel(body.GetVelocity(), pos); - msg.AngVel = refBody.ToRelAngVel(body.GetAngularVelocity()); - } - - return msg; - } - - public override void OnReceiveRemote(bool isHost, FragmentResyncMessage msg) - { - var qsbFragment = QSBWorldSync.GetWorldFromId(msg.ObjectId); - qsbFragment.AttachedObject._integrity = msg.Integrity; - qsbFragment.AttachedObject._origIntegrity = msg.OrigIntegrity; - qsbFragment.LeashLength = msg.LeashLength; - qsbFragment.AttachedObject.CallOnTakeDamage(); - - if (msg.IsDetached) - { - // the detach is delayed, so wait until that happens - QSBCore.UnityEvents.RunWhen(() => qsbFragment.IsDetached, () => - { - var body = qsbFragment.Body; - - if (msg.IsThruWhiteHole && !qsbFragment.IsThruWhiteHole) - { - var whiteHoleVolume = MeteorManager.WhiteHoleVolume; - var attachedFluidDetector = body.GetAttachedFluidDetector(); - var attachedForceDetector = body.GetAttachedForceDetector(); - if (attachedFluidDetector is not null and ConstantFluidDetector constantFluidDetector) - { - constantFluidDetector.SetDetectableFluid(whiteHoleVolume._fluidVolume); - } - - if (attachedForceDetector is not null and ConstantForceDetector constantForceDetector) - { - constantForceDetector.ClearAllFields(); - } - - qsbFragment.DetachableFragment.ChangeFragmentSector(whiteHoleVolume._whiteHoleSector, - whiteHoleVolume._whiteHoleProxyShadowSuperGroup); - - qsbFragment.DetachableFragment.EndWarpScaling(); - body.gameObject.AddComponent().Init(whiteHoleVolume._whiteHoleBody, qsbFragment.LeashLength); - whiteHoleVolume._ejectedBodyList.Add(body); - } - else if (!msg.IsThruWhiteHole && qsbFragment.IsThruWhiteHole) - { - // should only happen if client is way too far ahead and they try to connect. we fail here. - DebugLog.ToConsole($"{qsbFragment.LogName} is thru white hole, but msg is not. fuck", MessageType.Error); - return; - } - - if (qsbFragment.IsThruWhiteHole) - { - var debrisLeash = body.GetComponent(); - debrisLeash._deccelerating = false; - debrisLeash.enabled = true; - } - - var refBody = qsbFragment.RefBody; - var pos = refBody.transform.FromRelPos(msg.Pos); - body.SetPosition(pos); - body.SetRotation(refBody.transform.FromRelRot(msg.Rot)); - body.SetVelocity(refBody.FromRelVel(msg.Vel, pos)); - body.SetAngularVelocity(refBody.FromRelAngVel(msg.AngVel)); - }); - } - else if (!msg.IsDetached && qsbFragment.IsDetached) - { - // should only happen if client is way too far ahead and they try to connect. we fail here. - DebugLog.ToConsole($"{qsbFragment.LogName} is detached, but msg is not. fuck", MessageType.Error); - } - } - } -} diff --git a/QSB/MeteorSync/Events/FragmentResyncMessage.cs b/QSB/MeteorSync/Events/FragmentResyncMessage.cs deleted file mode 100644 index 4971452f..00000000 --- a/QSB/MeteorSync/Events/FragmentResyncMessage.cs +++ /dev/null @@ -1,54 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.MeteorSync.Events -{ - public class FragmentResyncMessage : WorldObjectMessage - { - public float Integrity; - public float OrigIntegrity; - public float LeashLength; - public bool IsDetached; - - public bool IsThruWhiteHole; - public Vector3 Pos; - public Quaternion Rot; - public Vector3 Vel; - public Vector3 AngVel; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Integrity = reader.ReadSingle(); - OrigIntegrity = reader.ReadSingle(); - LeashLength = reader.ReadSingle(); - IsDetached = reader.ReadBoolean(); - if (IsDetached) - { - IsThruWhiteHole = reader.ReadBoolean(); - Pos = reader.ReadVector3(); - Rot = reader.ReadQuaternion(); - Vel = reader.ReadVector3(); - AngVel = reader.ReadVector3(); - } - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Integrity); - writer.Write(OrigIntegrity); - writer.Write(LeashLength); - writer.Write(IsDetached); - if (IsDetached) - { - writer.Write(IsThruWhiteHole); - writer.Write(Pos); - writer.Write(Rot); - writer.Write(Vel); - writer.Write(AngVel); - } - } - } -} diff --git a/QSB/MeteorSync/Events/MeteorLaunchEvent.cs b/QSB/MeteorSync/Events/MeteorLaunchEvent.cs deleted file mode 100644 index 40d3233f..00000000 --- a/QSB/MeteorSync/Events/MeteorLaunchEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.MeteorSync.Events -{ - public class MeteorLaunchEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBMeteorLaunch, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBMeteorLaunch, Handler); - - private void Handler(QSBMeteorLauncher qsbMeteorLauncher) => - SendEvent(CreateMessage(qsbMeteorLauncher)); - - private MeteorLaunchMessage CreateMessage(QSBMeteorLauncher qsbMeteorLauncher) => new() - { - ObjectId = qsbMeteorLauncher.ObjectId, - MeteorId = qsbMeteorLauncher.MeteorId, - LaunchSpeed = qsbMeteorLauncher.LaunchSpeed, - }; - - public override void OnReceiveRemote(bool isHost, MeteorLaunchMessage message) - { - var qsbMeteorLauncher = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbMeteorLauncher.LaunchMeteor(message.MeteorId, message.LaunchSpeed); - } - } -} diff --git a/QSB/MeteorSync/Events/MeteorLaunchMessage.cs b/QSB/MeteorSync/Events/MeteorLaunchMessage.cs deleted file mode 100644 index 68698ad8..00000000 --- a/QSB/MeteorSync/Events/MeteorLaunchMessage.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.MeteorSync.Events -{ - public class MeteorLaunchMessage : WorldObjectMessage - { - public int MeteorId; - public float LaunchSpeed; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - MeteorId = reader.ReadInt32(); - LaunchSpeed = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(MeteorId); - writer.Write(LaunchSpeed); - } - } -} diff --git a/QSB/MeteorSync/Events/MeteorPreLaunchEvent.cs b/QSB/MeteorSync/Events/MeteorPreLaunchEvent.cs deleted file mode 100644 index 385e909a..00000000 --- a/QSB/MeteorSync/Events/MeteorPreLaunchEvent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.MeteorSync.Events -{ - public class MeteorPreLaunchEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBMeteorPreLaunch, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBMeteorPreLaunch, Handler); - - private void Handler(QSBMeteorLauncher qsbMeteorLauncher) => SendEvent(CreateMessage(qsbMeteorLauncher)); - - private WorldObjectMessage CreateMessage(QSBMeteorLauncher qsbMeteorLauncher) => new() - { - ObjectId = qsbMeteorLauncher.ObjectId - }; - - public override void OnReceiveRemote(bool isHost, WorldObjectMessage message) - { - var qsbMeteorLauncher = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbMeteorLauncher.PreLaunchMeteor(); - } - } -} diff --git a/QSB/MeteorSync/Events/MeteorSpecialImpactEvent.cs b/QSB/MeteorSync/Events/MeteorSpecialImpactEvent.cs deleted file mode 100644 index 32273d6a..00000000 --- a/QSB/MeteorSync/Events/MeteorSpecialImpactEvent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.MeteorSync.Events -{ - public class MeteorSpecialImpactEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBMeteorSpecialImpact, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBMeteorSpecialImpact, Handler); - - private void Handler(QSBMeteor qsbMeteor) => SendEvent(CreateMessage(qsbMeteor)); - - private WorldObjectMessage CreateMessage(QSBMeteor qsbMeteor) => new() - { - ObjectId = qsbMeteor.ObjectId - }; - - public override void OnReceiveRemote(bool isHost, WorldObjectMessage message) - { - var qsbMeteor = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbMeteor.SpecialImpact(); - } - } -} diff --git a/QSB/MeteorSync/Messages/FragmentDamageMessage.cs b/QSB/MeteorSync/Messages/FragmentDamageMessage.cs new file mode 100644 index 00000000..4a2773e1 --- /dev/null +++ b/QSB/MeteorSync/Messages/FragmentDamageMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.MeteorSync.WorldObjects; + +namespace QSB.MeteorSync.Messages +{ + public class FragmentDamageMessage : QSBFloatWorldObjectMessage + { + public FragmentDamageMessage(float damage) => Value = damage; + + public override void OnReceiveRemote() => WorldObject.AddDamage(Value); + } +} \ No newline at end of file diff --git a/QSB/MeteorSync/Messages/FragmentResyncMessage.cs b/QSB/MeteorSync/Messages/FragmentResyncMessage.cs new file mode 100644 index 00000000..cfef690e --- /dev/null +++ b/QSB/MeteorSync/Messages/FragmentResyncMessage.cs @@ -0,0 +1,147 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.MeteorSync.WorldObjects; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.MeteorSync.Messages +{ + /// called when we request a resync on client join + /// pain + public class FragmentResyncMessage : QSBWorldObjectMessage + { + private float Integrity; + private float OrigIntegrity; + private float LeashLength; + private bool IsDetached; + + private bool IsThruWhiteHole; + private Vector3 Pos; + private Quaternion Rot; + private Vector3 Vel; + private Vector3 AngVel; + + public FragmentResyncMessage(QSBFragment qsbFragment) + { + Integrity = qsbFragment.AttachedObject._integrity; + OrigIntegrity = qsbFragment.AttachedObject._origIntegrity; + LeashLength = qsbFragment.LeashLength; + IsDetached = qsbFragment.IsDetached; + + if (IsDetached) + { + IsThruWhiteHole = qsbFragment.IsThruWhiteHole; + + var body = qsbFragment.Body; + var refBody = qsbFragment.RefBody; + var pos = body.GetPosition(); + Pos = refBody.transform.ToRelPos(pos); + Rot = refBody.transform.ToRelRot(body.GetRotation()); + Vel = refBody.ToRelVel(body.GetVelocity(), pos); + AngVel = refBody.ToRelAngVel(body.GetAngularVelocity()); + } + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(Integrity); + writer.Write(OrigIntegrity); + writer.Write(LeashLength); + writer.Write(IsDetached); + if (IsDetached) + { + writer.Write(IsThruWhiteHole); + writer.Write(Pos); + writer.Write(Rot); + writer.Write(Vel); + writer.Write(AngVel); + } + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + Integrity = reader.ReadSingle(); + OrigIntegrity = reader.ReadSingle(); + LeashLength = reader.ReadSingle(); + IsDetached = reader.ReadBoolean(); + if (IsDetached) + { + IsThruWhiteHole = reader.ReadBoolean(); + Pos = reader.ReadVector3(); + Rot = reader.ReadQuaternion(); + Vel = reader.ReadVector3(); + AngVel = reader.ReadVector3(); + } + } + + public override void OnReceiveRemote() + { + var qsbFragment = ObjectId.GetWorldObject(); + qsbFragment.AttachedObject._integrity = Integrity; + qsbFragment.AttachedObject._origIntegrity = OrigIntegrity; + qsbFragment.LeashLength = LeashLength; + qsbFragment.AttachedObject.CallOnTakeDamage(); + + if (IsDetached) + { + // the detach is delayed, so wait until that happens + QSBCore.UnityEvents.RunWhen(() => qsbFragment.IsDetached, () => + { + var body = qsbFragment.Body; + + if (IsThruWhiteHole && !qsbFragment.IsThruWhiteHole) + { + var whiteHoleVolume = MeteorManager.WhiteHoleVolume; + var attachedFluidDetector = body.GetAttachedFluidDetector(); + var attachedForceDetector = body.GetAttachedForceDetector(); + if (attachedFluidDetector is ConstantFluidDetector constantFluidDetector) + { + constantFluidDetector.SetDetectableFluid(whiteHoleVolume._fluidVolume); + } + + if (attachedForceDetector is ConstantForceDetector constantForceDetector) + { + constantForceDetector.ClearAllFields(); + } + + qsbFragment.DetachableFragment.ChangeFragmentSector(whiteHoleVolume._whiteHoleSector, + whiteHoleVolume._whiteHoleProxyShadowSuperGroup); + + qsbFragment.DetachableFragment.EndWarpScaling(); + body.gameObject.AddComponent().Init(whiteHoleVolume._whiteHoleBody, qsbFragment.LeashLength); + whiteHoleVolume._ejectedBodyList.Add(body); + } + else if (!IsThruWhiteHole && qsbFragment.IsThruWhiteHole) + { + // should only happen if client is way too far ahead and they try to connect. we fail here. + DebugLog.ToConsole($"{qsbFragment.LogName} is thru white hole, but msg is not. fuck", MessageType.Error); + return; + } + + if (qsbFragment.IsThruWhiteHole) + { + var debrisLeash = body.GetComponent(); + debrisLeash._deccelerating = false; + debrisLeash.enabled = true; + } + + var refBody = qsbFragment.RefBody; + var pos = refBody.transform.FromRelPos(Pos); + body.SetPosition(pos); + body.SetRotation(refBody.transform.FromRelRot(Rot)); + body.SetVelocity(refBody.FromRelVel(Vel, pos)); + body.SetAngularVelocity(refBody.FromRelAngVel(AngVel)); + }); + } + else if (!IsDetached && qsbFragment.IsDetached) + { + // should only happen if client is way too far ahead and they try to connect. we fail here. + DebugLog.ToConsole($"{qsbFragment.LogName} is detached, but msg is not. fuck", MessageType.Error); + } + } + } +} \ No newline at end of file diff --git a/QSB/MeteorSync/Messages/MeteorLaunchMessage.cs b/QSB/MeteorSync/Messages/MeteorLaunchMessage.cs new file mode 100644 index 00000000..8f9a0e2c --- /dev/null +++ b/QSB/MeteorSync/Messages/MeteorLaunchMessage.cs @@ -0,0 +1,34 @@ +using QSB.Messaging; +using QSB.MeteorSync.WorldObjects; +using QuantumUNET.Transport; + +namespace QSB.MeteorSync.Messages +{ + public class MeteorLaunchMessage : QSBWorldObjectMessage + { + private int MeteorId; + private float LaunchSpeed; + + public MeteorLaunchMessage(QSBMeteorLauncher qsbMeteorLauncher) + { + MeteorId = qsbMeteorLauncher.MeteorId; + LaunchSpeed = qsbMeteorLauncher.LaunchSpeed; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(MeteorId); + writer.Write(LaunchSpeed); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + MeteorId = reader.ReadInt32(); + LaunchSpeed = reader.ReadSingle(); + } + + public override void OnReceiveRemote() => WorldObject.LaunchMeteor(MeteorId, LaunchSpeed); + } +} diff --git a/QSB/MeteorSync/Messages/MeteorPreLaunchMessage.cs b/QSB/MeteorSync/Messages/MeteorPreLaunchMessage.cs new file mode 100644 index 00000000..4ff7647c --- /dev/null +++ b/QSB/MeteorSync/Messages/MeteorPreLaunchMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.MeteorSync.WorldObjects; + +namespace QSB.MeteorSync.Messages +{ + public class MeteorPreLaunchMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.PreLaunchMeteor(); + } +} diff --git a/QSB/MeteorSync/Messages/MeteorSpecialImpactMessage.cs b/QSB/MeteorSync/Messages/MeteorSpecialImpactMessage.cs new file mode 100644 index 00000000..2147c604 --- /dev/null +++ b/QSB/MeteorSync/Messages/MeteorSpecialImpactMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.MeteorSync.WorldObjects; + +namespace QSB.MeteorSync.Messages +{ + public class MeteorSpecialImpactMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SpecialImpact(); + } +} diff --git a/QSB/MeteorSync/MeteorManager.cs b/QSB/MeteorSync/MeteorManager.cs index 7ddfbc9d..53c914a1 100644 --- a/QSB/MeteorSync/MeteorManager.cs +++ b/QSB/MeteorSync/MeteorManager.cs @@ -14,7 +14,7 @@ namespace QSB.MeteorSync { // wait for all late initializers (which includes meteor launchers) to finish StartDelayedReady(); - QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.s_lateInitializers.Count == 0, () => + QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.isDoneInitializing, () => { FinishDelayedReady(); WhiteHoleVolume = QSBWorldSync.GetUnityObjects().First(); diff --git a/QSB/MeteorSync/Patches/MeteorClientPatches.cs b/QSB/MeteorSync/Patches/MeteorClientPatches.cs deleted file mode 100644 index 90f7f3d7..00000000 --- a/QSB/MeteorSync/Patches/MeteorClientPatches.cs +++ /dev/null @@ -1,192 +0,0 @@ -using HarmonyLib; -using OWML.Common; -using QSB.Events; -using QSB.MeteorSync.WorldObjects; -using QSB.Patches; -using QSB.Utility; -using QSB.WorldSync; -using UnityEngine; - -namespace QSB.MeteorSync.Patches -{ - public class MeteorClientPatches : QSBPatch - { - public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect; - - [HarmonyPrefix] - [HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.FixedUpdate))] - public static bool FixedUpdate(MeteorLauncher __instance) - => false; - - [HarmonyPrefix] - [HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.LaunchMeteor))] - public static bool LaunchMeteor(MeteorLauncher __instance) - { - var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity(__instance); - - MeteorController meteorController = null; - QSBMeteor qsbMeteor; - - bool MeteorMatches(MeteorController x) - { - qsbMeteor = QSBWorldSync.GetWorldFromUnity(x); - return qsbMeteor.ObjectId == qsbMeteorLauncher.MeteorId; - } - - if (__instance._meteorPool != null) - { - meteorController = __instance._meteorPool.Find(MeteorMatches); - if (meteorController != null) - { - meteorController.Initialize(__instance.transform, __instance._detectableField, __instance._detectableFluid); - } - } - else if (__instance._dynamicMeteorPool != null) - { - meteorController = __instance._dynamicMeteorPool.Find(MeteorMatches); - if (meteorController != null) - { - meteorController.Initialize(__instance.transform, null, null); - } - } - - if (meteorController != null) - { - var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + (__instance.transform.TransformDirection(__instance._launchDirection) * qsbMeteorLauncher.LaunchSpeed); - var angularVelocity = __instance.transform.forward * 2f; - meteorController.Launch(null, __instance.transform.position, __instance.transform.rotation, linearVelocity, angularVelocity); - if (__instance._audioSector.ContainsOccupant(DynamicOccupant.Player)) - { - __instance._launchSource.pitch = Random.Range(0.4f, 0.6f); - __instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch); - } - } - else - { - DebugLog.ToConsole($"{qsbMeteorLauncher.LogName} - could not find meteor {qsbMeteorLauncher.MeteorId} in pool", MessageType.Warning); - } - - return false; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Impact))] - public static bool Impact(MeteorController __instance, - GameObject hitObject, Vector3 impactPoint, Vector3 impactVel) - { - __instance._intactRenderer.enabled = false; - __instance._impactLight.enabled = true; - __instance._impactLight.intensity = __instance._impactLightCurve.Evaluate(0f); - var rotation = Quaternion.LookRotation(impactVel); - foreach (var particleSystem in __instance._impactParticles) - { - particleSystem.transform.rotation = rotation; - particleSystem.Play(); - } - - __instance._impactSource.PlayOneShot(AudioType.BH_MeteorImpact); - foreach (var owCollider in __instance._owColliders) - { - owCollider.SetActivation(false); - } - - __instance._owRigidbody.MakeKinematic(); - __instance.transform.SetParent(hitObject.GetAttachedOWRigidbody().transform); - FragmentSurfaceProxy.UntrackMeteor(__instance); - FragmentCollisionProxy.UntrackMeteor(__instance); - __instance._ignoringCollisions = false; - __instance._hasImpacted = true; - __instance._impactTime = Time.time; - - var qsbMeteor = QSBWorldSync.GetWorldFromUnity(__instance); - if (QSBMeteor.IsSpecialImpact(hitObject)) - { - QSBEventManager.FireEvent(EventNames.QSBMeteorSpecialImpact, qsbMeteor); - } - - return false; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(DetachableFragment), nameof(DetachableFragment.Detach))] - public static void Detach_Prefix(DetachableFragment __instance, out FragmentIntegrity __state) => - // this gets set to null in Detach, so store it here and and then restore it in postfix - __state = __instance._fragmentIntegrity; - - [HarmonyPostfix] - [HarmonyPatch(typeof(DetachableFragment), nameof(DetachableFragment.Detach))] - public static void Detach_Postfix(DetachableFragment __instance, FragmentIntegrity __state) => - __instance._fragmentIntegrity = __state; - - [HarmonyPrefix] - [HarmonyPatch(typeof(DebrisLeash), nameof(DebrisLeash.MoveByDistance))] - public static bool MoveByDistance(DebrisLeash __instance, - float distance) - { - if (__instance._detachableFragment == null || __instance._detachableFragment._fragmentIntegrity == null) - { - return true; - } - - var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); - - if (__instance.enabled) - { - var vector = __instance._attachedBody.GetPosition() - __instance._anchorBody.GetPosition(); - var d = Mathf.Min(distance, qsbFragment.LeashLength - vector.magnitude); - __instance._attachedBody.SetPosition(__instance._anchorBody.GetPosition() + (vector.normalized * d)); - } - - return false; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(DebrisLeash), nameof(DebrisLeash.FixedUpdate))] - public static bool FixedUpdate(DebrisLeash __instance) - { - if (__instance._detachableFragment == null || __instance._detachableFragment._fragmentIntegrity == null) - { - return true; - } - if (!WorldObjectManager.AllObjectsReady) - { - return true; - } - - var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); - - if (!__instance._deccelerating) - { - var num = Vector3.Distance(__instance._attachedBody.GetPosition(), __instance._anchorBody.GetPosition()); - var num2 = Mathf.Pow(__instance._attachedBody.GetVelocity().magnitude, 2f) / (2f * __instance._deccel); - var vector = __instance._attachedBody.GetVelocity() - __instance._anchorBody.GetVelocity(); - if (num >= qsbFragment.LeashLength - num2 && vector.magnitude > 0.1f) - { - __instance._deccelerating = true; - return false; - } - } - else - { - var vector2 = __instance._attachedBody.GetVelocity() - __instance._anchorBody.GetVelocity(); - var velocityChange = -vector2.normalized * Mathf.Min(__instance._deccel * Time.deltaTime, vector2.magnitude); - if (velocityChange.magnitude < 0.01f) - { - __instance._attachedBody.SetVelocity(__instance._anchorBody.GetVelocity()); - __instance._deccelerating = false; - if (__instance._detachableFragment != null) - { - __instance._detachableFragment.ComeToRest(__instance._anchorBody); - } - - __instance.enabled = false; - return false; - } - - __instance._attachedBody.AddVelocityChange(velocityChange); - } - - return false; - } - } -} diff --git a/QSB/MeteorSync/Patches/MeteorServerPatches.cs b/QSB/MeteorSync/Patches/MeteorPatches.cs similarity index 62% rename from QSB/MeteorSync/Patches/MeteorServerPatches.cs rename to QSB/MeteorSync/Patches/MeteorPatches.cs index c909b10d..d67881a8 100644 --- a/QSB/MeteorSync/Patches/MeteorServerPatches.cs +++ b/QSB/MeteorSync/Patches/MeteorPatches.cs @@ -1,12 +1,18 @@ using HarmonyLib; -using QSB.Events; +using OWML.Common; +using QSB.Messaging; +using QSB.MeteorSync.Messages; using QSB.MeteorSync.WorldObjects; using QSB.Patches; +using QSB.Utility; using QSB.WorldSync; using UnityEngine; namespace QSB.MeteorSync.Patches { + /// + /// server only + /// public class MeteorServerPatches : QSBPatch { public override QSBPatchTypes Type => QSBPatchTypes.OnServerClientConnect; @@ -62,8 +68,8 @@ namespace QSB.MeteorSync.Patches particleSystem.Play(); } - var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBMeteorPreLaunch, qsbMeteorLauncher); + var qsbMeteorLauncher = __instance.GetWorldObject(); + qsbMeteorLauncher.SendMessage(new MeteorPreLaunchMessage()); } if (Time.time > __instance._lastLaunchTime + __instance._launchDelay + 2.3f) @@ -119,8 +125,8 @@ namespace QSB.MeteorSync.Patches if (meteorController != null) { - var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity(__instance); - var qsbMeteor = QSBWorldSync.GetWorldFromUnity(meteorController); + var qsbMeteorLauncher = __instance.GetWorldObject(); + var qsbMeteor = meteorController.GetWorldObject(); qsbMeteorLauncher.MeteorId = qsbMeteor.ObjectId; qsbMeteorLauncher.LaunchSpeed = Random.Range(__instance._minLaunchSpeed, __instance._maxLaunchSpeed); @@ -134,7 +140,7 @@ namespace QSB.MeteorSync.Patches __instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch); } - QSBEventManager.FireEvent(EventNames.QSBMeteorLaunch, qsbMeteorLauncher); + qsbMeteorLauncher.SendMessage(new MeteorLaunchMessage(qsbMeteorLauncher)); } return false; @@ -145,10 +151,10 @@ namespace QSB.MeteorSync.Patches public static void Impact(MeteorController __instance, GameObject hitObject, Vector3 impactPoint, Vector3 impactVel) { - var qsbMeteor = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbMeteor = __instance.GetWorldObject(); if (QSBMeteor.IsSpecialImpact(hitObject)) { - QSBEventManager.FireEvent(EventNames.QSBMeteorSpecialImpact, qsbMeteor); + qsbMeteor.SendMessage(new MeteorSpecialImpactMessage()); } } @@ -157,9 +163,121 @@ namespace QSB.MeteorSync.Patches public static void AddDamage(FragmentIntegrity __instance, float damage) { - var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBFragmentDamage, qsbFragment, damage); + var qsbFragment = __instance.GetWorldObject(); + qsbFragment.SendMessage(new FragmentDamageMessage(damage)); } + } + + + /// + /// client only + /// + public class MeteorClientPatches : QSBPatch + { + public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect; + + [HarmonyPrefix] + [HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.FixedUpdate))] + public static bool FixedUpdate(MeteorLauncher __instance) + => false; + + [HarmonyPrefix] + [HarmonyPatch(typeof(MeteorLauncher), nameof(MeteorLauncher.LaunchMeteor))] + public static bool LaunchMeteor(MeteorLauncher __instance) + { + var qsbMeteorLauncher = __instance.GetWorldObject(); + + MeteorController meteorController = null; + QSBMeteor qsbMeteor; + + bool MeteorMatches(MeteorController x) + { + qsbMeteor = x.GetWorldObject(); + return qsbMeteor.ObjectId == qsbMeteorLauncher.MeteorId; + } + + if (__instance._meteorPool != null) + { + meteorController = __instance._meteorPool.Find(MeteorMatches); + if (meteorController != null) + { + meteorController.Initialize(__instance.transform, __instance._detectableField, __instance._detectableFluid); + } + } + else if (__instance._dynamicMeteorPool != null) + { + meteorController = __instance._dynamicMeteorPool.Find(MeteorMatches); + if (meteorController != null) + { + meteorController.Initialize(__instance.transform, null, null); + } + } + + if (meteorController != null) + { + var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + (__instance.transform.TransformDirection(__instance._launchDirection) * qsbMeteorLauncher.LaunchSpeed); + var angularVelocity = __instance.transform.forward * 2f; + meteorController.Launch(null, __instance.transform.position, __instance.transform.rotation, linearVelocity, angularVelocity); + if (__instance._audioSector.ContainsOccupant(DynamicOccupant.Player)) + { + __instance._launchSource.pitch = Random.Range(0.4f, 0.6f); + __instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch); + } + } + else + { + DebugLog.ToConsole($"{qsbMeteorLauncher.LogName} - could not find meteor {qsbMeteorLauncher.MeteorId} in pool", MessageType.Warning); + } + + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Impact))] + public static bool Impact(MeteorController __instance, + GameObject hitObject, Vector3 impactPoint, Vector3 impactVel) + { + __instance._intactRenderer.enabled = false; + __instance._impactLight.enabled = true; + __instance._impactLight.intensity = __instance._impactLightCurve.Evaluate(0f); + var rotation = Quaternion.LookRotation(impactVel); + foreach (var particleSystem in __instance._impactParticles) + { + particleSystem.transform.rotation = rotation; + particleSystem.Play(); + } + + __instance._impactSource.PlayOneShot(AudioType.BH_MeteorImpact); + foreach (var owCollider in __instance._owColliders) + { + owCollider.SetActivation(false); + } + + __instance._owRigidbody.MakeKinematic(); + __instance.transform.SetParent(hitObject.GetAttachedOWRigidbody().transform); + FragmentSurfaceProxy.UntrackMeteor(__instance); + FragmentCollisionProxy.UntrackMeteor(__instance); + __instance._ignoringCollisions = false; + __instance._hasImpacted = true; + __instance._impactTime = Time.time; + + var qsbMeteor = __instance.GetWorldObject(); + if (QSBMeteor.IsSpecialImpact(hitObject)) + { + qsbMeteor.SendMessage(new MeteorSpecialImpactMessage()); + } + + return false; + } + } + + + /// + /// both server and client + /// + public class MeteorPatches : QSBPatch + { + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; [HarmonyPrefix] [HarmonyPatch(typeof(DetachableFragment), nameof(DetachableFragment.Detach))] @@ -182,7 +300,7 @@ namespace QSB.MeteorSync.Patches return true; } - var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); + var qsbFragment = __instance._detachableFragment._fragmentIntegrity.GetWorldObject(); if (__instance.enabled) { @@ -207,7 +325,7 @@ namespace QSB.MeteorSync.Patches return true; } - var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); + var qsbFragment = __instance._detachableFragment._fragmentIntegrity.GetWorldObject(); if (!__instance._deccelerating) { @@ -243,4 +361,4 @@ namespace QSB.MeteorSync.Patches return false; } } -} +} \ No newline at end of file diff --git a/QSB/OrbSync/Events/OrbDragEvent.cs b/QSB/OrbSync/Events/OrbDragEvent.cs deleted file mode 100644 index 88612ad5..00000000 --- a/QSB/OrbSync/Events/OrbDragEvent.cs +++ /dev/null @@ -1,46 +0,0 @@ -using QSB.AuthoritySync; -using QSB.Events; -using QSB.WorldSync.Events; -using QSB.OrbSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.OrbSync.Events -{ - public class OrbDragEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBOrbDrag, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBOrbDrag, Handler); - - private void Handler(QSBOrb qsbOrb, bool isDragging) => SendEvent(CreateMessage(qsbOrb, isDragging)); - - private BoolWorldObjectMessage CreateMessage(QSBOrb qsbOrb, bool isDragging) => new() - { - ObjectId = qsbOrb.ObjectId, - State = isDragging - }; - - public override void OnReceiveLocal(bool isHost, BoolWorldObjectMessage message) - { - var qsbOrb = QSBWorldSync.GetWorldFromId(message.ObjectId); - - if (isHost && message.State) - { - qsbOrb.TransformSync.NetIdentity.UpdateAuthQueue(message.FromId, AuthQueueAction.Force); - } - } - - public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) - { - var qsbOrb = QSBWorldSync.GetWorldFromId(message.ObjectId); - - if (isHost && message.State) - { - qsbOrb.TransformSync.NetIdentity.UpdateAuthQueue(message.FromId, AuthQueueAction.Force); - } - - qsbOrb.SetDragging(message.State); - } - } -} diff --git a/QSB/OrbSync/Events/OrbSlotEvent.cs b/QSB/OrbSync/Events/OrbSlotEvent.cs deleted file mode 100644 index 15064db4..00000000 --- a/QSB/OrbSync/Events/OrbSlotEvent.cs +++ /dev/null @@ -1,28 +0,0 @@ -using QSB.Events; -using QSB.OrbSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.OrbSync.Events -{ - public class OrbSlotEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBOrbSlot, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBOrbSlot, Handler); - - private void Handler(QSBOrb qsbOrb, int slotIndex) => SendEvent(CreateMessage(qsbOrb, slotIndex)); - - private OrbSlotMessage CreateMessage(QSBOrb qsbOrb, int slotIndex) => new() - { - ObjectId = qsbOrb.ObjectId, - SlotIndex = slotIndex - }; - - public override void OnReceiveRemote(bool server, OrbSlotMessage message) - { - var qsbOrb = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbOrb.SetSlot(message.SlotIndex); - } - } -} diff --git a/QSB/OrbSync/Events/OrbSlotMessage.cs b/QSB/OrbSync/Events/OrbSlotMessage.cs deleted file mode 100644 index 5672d50c..00000000 --- a/QSB/OrbSync/Events/OrbSlotMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.OrbSync.Events -{ - public class OrbSlotMessage : WorldObjectMessage - { - public int SlotIndex; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - SlotIndex = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(SlotIndex); - } - } -} diff --git a/QSB/OrbSync/Messages/OrbDragMessage.cs b/QSB/OrbSync/Messages/OrbDragMessage.cs new file mode 100644 index 00000000..e8298ac5 --- /dev/null +++ b/QSB/OrbSync/Messages/OrbDragMessage.cs @@ -0,0 +1,34 @@ +using QSB.AuthoritySync; +using QSB.Messaging; +using QSB.OrbSync.WorldObjects; +using QSB.WorldSync; + +namespace QSB.OrbSync.Messages +{ + public class OrbDragMessage : QSBBoolWorldObjectMessage + { + public OrbDragMessage(bool isDragging) => Value = isDragging; + + public override void OnReceiveLocal() + { + var qsbOrb = ObjectId.GetWorldObject(); + + if (QSBCore.IsHost && Value) + { + qsbOrb.TransformSync.NetIdentity.UpdateAuthQueue(From, AuthQueueAction.Force); + } + } + + public override void OnReceiveRemote() + { + var qsbOrb = ObjectId.GetWorldObject(); + + if (QSBCore.IsHost && Value) + { + qsbOrb.TransformSync.NetIdentity.UpdateAuthQueue(From, AuthQueueAction.Force); + } + + qsbOrb.SetDragging(Value); + } + } +} \ No newline at end of file diff --git a/QSB/OrbSync/Messages/OrbSlotMessage.cs b/QSB/OrbSync/Messages/OrbSlotMessage.cs new file mode 100644 index 00000000..4a57acda --- /dev/null +++ b/QSB/OrbSync/Messages/OrbSlotMessage.cs @@ -0,0 +1,27 @@ +using QSB.Messaging; +using QSB.OrbSync.WorldObjects; +using QuantumUNET.Transport; + +namespace QSB.OrbSync.Messages +{ + public class OrbSlotMessage : QSBWorldObjectMessage + { + private int SlotIndex; + + public OrbSlotMessage(int slotIndex) => SlotIndex = slotIndex; + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(SlotIndex); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + SlotIndex = reader.ReadInt32(); + } + + public override void OnReceiveRemote() => WorldObject.SetSlot(SlotIndex); + } +} \ No newline at end of file diff --git a/QSB/OrbSync/Patches/OrbPatches.cs b/QSB/OrbSync/Patches/OrbPatches.cs index 9d93735a..a6aa22bd 100644 --- a/QSB/OrbSync/Patches/OrbPatches.cs +++ b/QSB/OrbSync/Patches/OrbPatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; +using QSB.OrbSync.Messages; using QSB.OrbSync.WorldObjects; using QSB.Patches; using QSB.WorldSync; @@ -24,8 +25,8 @@ namespace QSB.OrbSync.Patches { return; } - var qsbOrb = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBOrbDrag, qsbOrb, true); + var qsbOrb = __instance.GetWorldObject(); + qsbOrb.SendMessage(new OrbDragMessage(true)); } [HarmonyPrefix] @@ -40,12 +41,12 @@ namespace QSB.OrbSync.Patches { return false; } - var qsbOrb = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbOrb = __instance.GetWorldObject(); if (!qsbOrb.TransformSync.HasAuthority) { return false; } - QSBEventManager.FireEvent(EventNames.QSBOrbDrag, qsbOrb, false); + qsbOrb.SendMessage(new OrbDragMessage(false)); return true; } @@ -57,7 +58,7 @@ namespace QSB.OrbSync.Patches { return true; } - var qsbOrb = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbOrb = __instance.GetWorldObject(); if (!qsbOrb.TransformSync.HasAuthority) { return false; @@ -80,7 +81,7 @@ namespace QSB.OrbSync.Patches { __instance._orbAudio.PlaySlotActivatedClip(); } - QSBEventManager.FireEvent(EventNames.QSBOrbSlot, qsbOrb, slotIndex); + qsbOrb.SendMessage(new OrbSlotMessage(slotIndex)); break; } } @@ -88,7 +89,7 @@ namespace QSB.OrbSync.Patches else if ((!__instance._occupiedSlot.IsAttractive() || __instance._isBeingDragged) && !__instance._occupiedSlot.CheckOrbCollision(__instance)) { __instance._occupiedSlot = null; - QSBEventManager.FireEvent(EventNames.QSBOrbSlot, qsbOrb, -1); + qsbOrb.SendMessage(new OrbSlotMessage(-1)); } __instance._owCollider.SetActivation(__instance._occupiedSlot == null || !__instance._occupiedSlot.IsAttractive() || __instance._isBeingDragged); diff --git a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs index e6548f17..155dc21f 100644 --- a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs @@ -1,10 +1,10 @@ using OWML.Common; +using QSB.AuthoritySync; +using QSB.OrbSync.WorldObjects; using QSB.Syncs.Unsectored.Transforms; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; -using QSB.AuthoritySync; -using QSB.OrbSync.WorldObjects; using UnityEngine; namespace QSB.OrbSync.TransformSync @@ -50,7 +50,7 @@ namespace QSB.OrbSync.TransformSync DebugLog.ToConsole($"Error - No orb at index {index}.", MessageType.Error); return; } - _qsbOrb = QSBWorldSync.GetWorldFromUnity(orb); + _qsbOrb = orb.GetWorldObject(); _qsbOrb.TransformSync = this; base.Init(); @@ -70,10 +70,10 @@ namespace QSB.OrbSync.TransformSync } _attachedBody.OnUnsuspendOWRigidbody += OnUnsuspend; _attachedBody.OnSuspendOWRigidbody += OnSuspend; - NetIdentity.FireAuthQueue(_attachedBody.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); + NetIdentity.SendAuthQueueMessage(_attachedBody.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); } - private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Add); - private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.FireAuthQueue(AuthQueueAction.Remove); + private void OnUnsuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Add); + private void OnSuspend(OWRigidbody suspendedBody) => NetIdentity.SendAuthQueueMessage(AuthQueueAction.Remove); } } diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index 04832658..b4423ce1 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -1,9 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; using HarmonyLib; using OWML.Common; using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; namespace QSB.Patches { diff --git a/QSB/Player/Events/EnterLeaveEvent.cs b/QSB/Player/Events/EnterLeaveEvent.cs deleted file mode 100644 index 92722cb2..00000000 --- a/QSB/Player/Events/EnterLeaveEvent.cs +++ /dev/null @@ -1,107 +0,0 @@ -using QSB.Animation.NPC.WorldObjects; -using QSB.Events; -using QSB.PoolSync; -using QSB.ShipSync; -using QSB.Utility; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.Player.Events -{ - internal class EnterLeaveEvent : QSBEvent> - { - // TODO : sync the things that dont need the worldobjects some other way - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.PlayerEnterQuantumMoon, () => Handler(EnterLeaveType.EnterMoon)); - GlobalMessenger.AddListener(EventNames.PlayerExitQuantumMoon, () => Handler(EnterLeaveType.ExitMoon)); - GlobalMessenger.AddListener(EventNames.QSBEnterShrine, () => Handler(EnterLeaveType.EnterShrine)); - GlobalMessenger.AddListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine)); - GlobalMessenger.AddListener(EventNames.QSBEnterPlatform, (int id) => Handler(EnterLeaveType.EnterPlatform, id)); - GlobalMessenger.AddListener(EventNames.QSBExitPlatform, (int id) => Handler(EnterLeaveType.ExitPlatform, id)); - GlobalMessenger.AddListener(EventNames.QSBEnterNonNomaiHeadZone, (int id) => Handler(EnterLeaveType.EnterNonNomaiHeadZone, id)); - GlobalMessenger.AddListener(EventNames.QSBExitNonNomaiHeadZone, (int id) => Handler(EnterLeaveType.ExitNonNomaiHeadZone, id)); - GlobalMessenger.AddListener(EventNames.QSBEnterNomaiHeadZone, (int id) => Handler(EnterLeaveType.EnterNomaiHeadZone, id)); - GlobalMessenger.AddListener(EventNames.QSBExitNomaiHeadZone, (int id) => Handler(EnterLeaveType.ExitNomaiHeadZone, id)); - GlobalMessenger.AddListener(EventNames.EnterShip, () => Handler(EnterLeaveType.EnterShip)); - GlobalMessenger.AddListener(EventNames.ExitShip, () => Handler(EnterLeaveType.ExitShip)); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.PlayerEnterQuantumMoon, () => Handler(EnterLeaveType.EnterMoon)); - GlobalMessenger.RemoveListener(EventNames.PlayerExitQuantumMoon, () => Handler(EnterLeaveType.ExitMoon)); - GlobalMessenger.RemoveListener(EventNames.QSBEnterShrine, () => Handler(EnterLeaveType.EnterShrine)); - GlobalMessenger.RemoveListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine)); - GlobalMessenger.RemoveListener(EventNames.QSBEnterPlatform, (int id) => Handler(EnterLeaveType.EnterPlatform, id)); - GlobalMessenger.RemoveListener(EventNames.QSBExitPlatform, (int id) => Handler(EnterLeaveType.ExitPlatform, id)); - GlobalMessenger.RemoveListener(EventNames.QSBEnterNonNomaiHeadZone, (int id) => Handler(EnterLeaveType.EnterNonNomaiHeadZone, id)); - GlobalMessenger.RemoveListener(EventNames.QSBExitNonNomaiHeadZone, (int id) => Handler(EnterLeaveType.ExitNonNomaiHeadZone, id)); - GlobalMessenger.RemoveListener(EventNames.EnterShip, () => Handler(EnterLeaveType.EnterShip)); - GlobalMessenger.RemoveListener(EventNames.ExitShip, () => Handler(EnterLeaveType.ExitShip)); - } - - private void Handler(EnterLeaveType type, int objectId = -1) => SendEvent(CreateMessage(type, objectId)); - - private EnumWorldObjectMessage CreateMessage(EnterLeaveType type, int objectId) => new() - { - AboutId = LocalPlayerId, - EnumValue = type, - ObjectId = objectId - }; - - public override void OnReceiveLocal(bool server, EnumWorldObjectMessage message) - => OnReceiveRemote(server, message); - - public override void OnReceiveRemote(bool server, EnumWorldObjectMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.FromId); - switch (message.EnumValue) - { - case EnterLeaveType.EnterMoon: - player.IsInMoon = true; - break; - case EnterLeaveType.ExitMoon: - player.IsInMoon = false; - break; - case EnterLeaveType.EnterShrine: - player.IsInShrine = true; - break; - case EnterLeaveType.ExitShrine: - player.IsInShrine = false; - break; - case EnterLeaveType.EnterPlatform: - CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId] - .OnRemotePlayerEnter(message.AboutId); - break; - case EnterLeaveType.ExitPlatform: - CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId] - .OnRemotePlayerExit(message.AboutId); - break; - case EnterLeaveType.EnterNonNomaiHeadZone: - QSBWorldSync.GetWorldFromId(message.ObjectId).AddPlayerToHeadZone(player); - break; - case EnterLeaveType.ExitNonNomaiHeadZone: - QSBWorldSync.GetWorldFromId(message.ObjectId).RemovePlayerFromHeadZone(player); - break; - case EnterLeaveType.EnterNomaiHeadZone: - QSBWorldSync.GetWorldFromId(message.ObjectId).AddPlayerToHeadZone(player); - break; - case EnterLeaveType.ExitNomaiHeadZone: - QSBWorldSync.GetWorldFromId(message.ObjectId).RemovePlayerFromHeadZone(player); - break; - case EnterLeaveType.EnterShip: - ShipManager.Instance.AddPlayerToShip(player); - break; - case EnterLeaveType.ExitShip: - ShipManager.Instance.RemovePlayerFromShip(player); - break; - default: - DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.EnumValue}", OWML.Common.MessageType.Warning); - break; - } - } - } -} diff --git a/QSB/Player/Events/LaunchCodesEvent.cs b/QSB/Player/Events/LaunchCodesEvent.cs deleted file mode 100644 index be6fbd2e..00000000 --- a/QSB/Player/Events/LaunchCodesEvent.cs +++ /dev/null @@ -1,40 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.Player.Events -{ - internal class LaunchCodesEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBLearnLaunchCodes, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBLearnLaunchCodes, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveRemote(bool isHost, PlayerMessage message) - { - var flag = false; - if (!PlayerData._currentGameSave.PersistentConditionExists("LAUNCH_CODES_GIVEN")) - { - flag = true; - } - else if (!PlayerData._currentGameSave.GetPersistentCondition("LAUNCH_CODES_GIVEN")) - { - flag = true; - } - - if (flag) - { - DialogueConditionManager.SharedInstance.SetConditionState("SCIENTIST_3", true); - PlayerData._currentGameSave.SetPersistentCondition("LAUNCH_CODES_GIVEN", true); - GlobalMessenger.FireEvent("LearnLaunchCodes"); - } - } - } -} diff --git a/QSB/Player/Events/PlayerEntangledEvent.cs b/QSB/Player/Events/PlayerEntangledEvent.cs deleted file mode 100644 index 2ca7cc48..00000000 --- a/QSB/Player/Events/PlayerEntangledEvent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using QSB.Events; -using QSB.QuantumSync; -using QSB.QuantumSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.Player.Events -{ - internal class PlayerEntangledEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerEntangle, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerEntangle, Handler); - - private void Handler(int id) => SendEvent(CreateMessage(id)); - - private WorldObjectMessage CreateMessage(int id) => new() - { - AboutId = LocalPlayerId, - ObjectId = id - }; - - public override void OnReceiveLocal(bool server, WorldObjectMessage message) - { - var player = QSBPlayerManager.LocalPlayer; - if (message.ObjectId == -1) - { - player.EntangledObject = null; - return; - } - - var quantumObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - player.EntangledObject = quantumObject; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - if (message.ObjectId == -1) - { - player.EntangledObject = null; - return; - } - - var quantumObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - player.EntangledObject = quantumObject; - } - } -} diff --git a/QSB/Player/Events/PlayerInformationEvent.cs b/QSB/Player/Events/PlayerInformationEvent.cs deleted file mode 100644 index 5dda07bc..00000000 --- a/QSB/Player/Events/PlayerInformationEvent.cs +++ /dev/null @@ -1,43 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.Utility; - -namespace QSB.Player.Events -{ - public class PlayerInformationEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerInformation, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerInformation, Handler); - - private void Handler() => SendEvent(CreateMessage(QSBPlayerManager.LocalPlayer)); - - private PlayerInformationMessage CreateMessage(PlayerInfo player) => new() - { - AboutId = player.PlayerId, - PlayerName = player.Name, - IsReady = player.IsReady, - FlashlightActive = player.FlashlightActive, - SuitedUp = player.SuitedUp, - ProbeLauncherEquipped = player.ProbeLauncherEquipped, - SignalscopeEquipped = player.SignalscopeEquipped, - TranslatorEquipped = player.TranslatorEquipped, - ProbeActive = player.ProbeActive, - ClientState = player.State - }; - - public override void OnReceiveRemote(bool server, PlayerInformationMessage message) - { - RequestStateResyncEvent._waitingForEvent = false; - if (QSBPlayerManager.PlayerExists(message.AboutId)) - { - QSBPlayerManager.HandleFullStateMessage(message); - } - else - { - DebugLog.ToConsole($"Warning - got player information message about player that doesnt exist!", MessageType.Warning); - } - } - } -} diff --git a/QSB/Player/Events/PlayerInformationMessage.cs b/QSB/Player/Events/PlayerInformationMessage.cs deleted file mode 100644 index a088a33f..00000000 --- a/QSB/Player/Events/PlayerInformationMessage.cs +++ /dev/null @@ -1,47 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.Player.Events -{ - public class PlayerInformationMessage : PlayerMessage - { - public string PlayerName { get; set; } - public bool IsReady { get; set; } - public bool FlashlightActive { get; set; } - public bool SuitedUp { get; set; } - public bool ProbeLauncherEquipped { get; set; } - public bool SignalscopeEquipped { get; set; } - public bool TranslatorEquipped { get; set; } - public bool ProbeActive { get; set; } - public ClientState ClientState { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - PlayerName = reader.ReadString(); - IsReady = reader.ReadBoolean(); - FlashlightActive = reader.ReadBoolean(); - SuitedUp = reader.ReadBoolean(); - ProbeLauncherEquipped = reader.ReadBoolean(); - SignalscopeEquipped = reader.ReadBoolean(); - TranslatorEquipped = reader.ReadBoolean(); - ProbeActive = reader.ReadBoolean(); - ClientState = (ClientState)reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(PlayerName); - writer.Write(IsReady); - writer.Write(FlashlightActive); - writer.Write(SuitedUp); - writer.Write(ProbeLauncherEquipped); - writer.Write(SignalscopeEquipped); - writer.Write(TranslatorEquipped); - writer.Write(ProbeActive); - writer.Write((int)ClientState); - } - } -} diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs deleted file mode 100644 index d0177a15..00000000 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ /dev/null @@ -1,88 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.Utility; - -namespace QSB.Player.Events -{ - public class PlayerJoinEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerJoin, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerJoin, Handler); - - private void Handler(string name) => SendEvent(CreateMessage(name)); - - private PlayerJoinMessage CreateMessage(string name) => new() - { - AboutId = LocalPlayerId, - PlayerName = name, - QSBVersion = QSBCore.QSBVersion, - GameVersion = QSBCore.GameVersion, - Platform = QSBCore.Platform, - DlcInstalled = QSBCore.DLCInstalled - }; - - public override void OnReceiveRemote(bool server, PlayerJoinMessage message) - { - if (message.QSBVersion != QSBCore.QSBVersion) - { - if (server) - { - DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong QSB version. (Client:{message.QSBVersion}, Server:{QSBCore.QSBVersion})", MessageType.Error); - QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.QSBVersionNotMatching); - } - - return; - } - - if (message.GameVersion != QSBCore.GameVersion) - { - if (server) - { - DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong game version. (Client:{message.GameVersion}, Server:{QSBCore.GameVersion})", MessageType.Error); - QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.GameVersionNotMatching); - } - - return; - } - - if (message.Platform != QSBCore.Platform) - { - if (server) - { - DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong game platform. (Client:{message.Platform}, Server:{QSBCore.Platform})", MessageType.Error); - QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.DLCNotMatching); - } - } - - if (message.DlcInstalled != QSBCore.DLCInstalled) - { - if (server) - { - DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong DLC installation state. (Client:{message.DlcInstalled}, Server:{QSBCore.DLCInstalled})", MessageType.Error); - QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.GamePlatformNotMatching); - } - } - - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.Name = message.PlayerName; - DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); - DebugLog.DebugWrite($"{player.Name} joined. id:{player.PlayerId}, qsbVersion:{message.QSBVersion}, gameVersion:{message.GameVersion}, platform:{message.Platform}. dlcInstalled:{message.DlcInstalled}", MessageType.Info); - } - - public override void OnReceiveLocal(bool server, PlayerJoinMessage message) - { - var player = QSBPlayerManager.GetPlayer(QSBPlayerManager.LocalPlayerId); - player.Name = message.PlayerName; - var text = $"Connected to server as {player.Name}."; - DebugLog.ToAll(text, MessageType.Info); - - if (QSBSceneManager.IsInUniverse) - { - QSBPlayerManager.LocalPlayer.IsReady = true; - QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); - } - } - } -} \ No newline at end of file diff --git a/QSB/Player/Events/PlayerJoinMessage.cs b/QSB/Player/Events/PlayerJoinMessage.cs deleted file mode 100644 index a965cf20..00000000 --- a/QSB/Player/Events/PlayerJoinMessage.cs +++ /dev/null @@ -1,34 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.Player.Events -{ - public class PlayerJoinMessage : PlayerMessage - { - public string PlayerName { get; set; } - public string QSBVersion { get; set; } - public string GameVersion { get; set; } - public GamePlatform Platform { get; set; } - public bool DlcInstalled { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - PlayerName = reader.ReadString(); - QSBVersion = reader.ReadString(); - GameVersion = reader.ReadString(); - Platform = (GamePlatform)reader.ReadInt32(); - DlcInstalled = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(PlayerName); - writer.Write(QSBVersion); - writer.Write(GameVersion); - writer.Write((int)Platform); - writer.Write(DlcInstalled); - } - } -} \ No newline at end of file diff --git a/QSB/Player/Events/PlayerKickEvent.cs b/QSB/Player/Events/PlayerKickEvent.cs deleted file mode 100644 index b75e59b7..00000000 --- a/QSB/Player/Events/PlayerKickEvent.cs +++ /dev/null @@ -1,56 +0,0 @@ -using QSB.Events; -using QSB.Menus; -using QSB.Messaging; -using QSB.Utility; -using QuantumUNET; -using System.Linq; - -namespace QSB.Player.Events -{ - internal class PlayerKickEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerKick, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerKick, Handler); - - private void Handler(uint player, KickReason reason) => SendEvent(CreateMessage(player, reason)); - - private EnumMessage CreateMessage(uint player, KickReason reason) => new() - { - AboutId = player, - EnumValue = reason - }; - - public override void OnReceiveLocal(bool server, EnumMessage message) - { - if (!server) - { - return; - } - - QSBCore.UnityEvents.FireInNUpdates(() => KickPlayer(message.AboutId), 10); - } - - private void KickPlayer(uint id) - => QNetworkServer.connections.First(x => x.GetPlayerId() == id).Disconnect(); - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - if (message.AboutId != QSBPlayerManager.LocalPlayerId) - { - if (QSBPlayerManager.PlayerExists(message.AboutId)) - { - DebugLog.ToAll($"{QSBPlayerManager.GetPlayer(message.AboutId).Name} was kicked."); - return; - } - - DebugLog.ToAll($"Player id:{message.AboutId} was kicked."); - return; - } - - DebugLog.ToAll($"Kicked from server. Reason : {message.EnumValue}"); - MenuManager.Instance.OnKicked(message.EnumValue); - } - } -} diff --git a/QSB/Player/Events/PlayerReadyEvent.cs b/QSB/Player/Events/PlayerReadyEvent.cs deleted file mode 100644 index 2bc21ad5..00000000 --- a/QSB/Player/Events/PlayerReadyEvent.cs +++ /dev/null @@ -1,56 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.Messaging; -using QSB.Utility; - -namespace QSB.Player.Events -{ - public class PlayerReadyEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerReady, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerReady, Handler); - - private void Handler(bool ready) => SendEvent(CreateMessage(ready)); - - private ToggleMessage CreateMessage(bool ready) => new() - { - AboutId = LocalPlayerId, - ToggleValue = ready - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - if (server) - { - HandleServer(message); - } - else - { - HandleClient(message); - } - } - - private static void HandleServer(ToggleMessage message) - { - DebugLog.DebugWrite($"[SERVER] Get ready event from {message.FromId} (ready = {message.ToggleValue})", MessageType.Success); - QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; - QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); - } - - private void HandleClient(ToggleMessage message) - { - DebugLog.DebugWrite($"[CLIENT] Get ready event from {message.FromId} (ready = {message.ToggleValue})", MessageType.Success); - if (!QSBPlayerManager.PlayerExists(message.FromId)) - { - DebugLog.ToConsole( - "Error - Got ready event for non-existent player! Did we not send a PlayerStatesRequestEvent? Or was it not handled?", - MessageType.Error); - return; - } - - QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; - } - } -} \ No newline at end of file diff --git a/QSB/Player/Events/RequestStateResyncEvent.cs b/QSB/Player/Events/RequestStateResyncEvent.cs deleted file mode 100644 index 6e2cc5a6..00000000 --- a/QSB/Player/Events/RequestStateResyncEvent.cs +++ /dev/null @@ -1,170 +0,0 @@ -using System.Linq; -using OWML.Utils; -using QSB.CampfireSync.WorldObjects; -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Messaging; -using QSB.MeteorSync.WorldObjects; -using QSB.OrbSync.WorldObjects; -using QSB.QuantumSync.WorldObjects; -using QSB.Tools.TranslatorTool.TranslationSync; -using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; -using QSB.TornadoSync.WorldObjects; -using QSB.Utility; -using QSB.WorldSync; -using UnityEngine; - -namespace QSB.Player.Events -{ - // Can be sent by any client (including host) to signal they want latest worldobject, player, and server infomation - public class RequestStateResyncEvent : QSBEvent - { - public static bool _waitingForEvent; - - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBRequestStateResync, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBRequestStateResync, Handler); - - private void Handler() - { - if (_waitingForEvent) - { - return; - } - - _waitingForEvent = true; - SendEvent(CreateMessage()); - } - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveLocal(bool isHost, PlayerMessage message) - { - QSBCore.UnityEvents.FireInNUpdates(() => - { - if (_waitingForEvent) - { - DebugLog.ToConsole($"Did not receive PlayerInformationEvent in time. Setting _waitingForEvent to false.", OWML.Common.MessageType.Info); - _waitingForEvent = false; - } - }, 60); - } - - public override void OnReceiveRemote(bool isHost, PlayerMessage message) - { - // send response only to the requesting client - QSBEventManager.ForIdOverride = message.FromId; - try - { - // if host, send worldobject and server states - if (isHost) - { - ServerStateManager.Instance.FireChangeServerStateEvent(ServerStateManager.Instance.GetServerState()); - QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); - - if (WorldObjectManager.AllObjectsReady) - { - SendWorldObjectInfo(); - } - } - // if client, send player and client states - else - { - QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); - } - - if (WorldObjectManager.AllObjectsReady) - { - SendAuthorityObjectInfo(); - } - } - finally - { - QSBEventManager.ForIdOverride = uint.MaxValue; - } - } - - private void SendWorldObjectInfo() - { - QSBWorldSync.DialogueConditions.ForEach(condition - => QSBEventManager.FireEvent(EventNames.DialogueConditionChanged, condition.Key, condition.Value)); - - QSBWorldSync.ShipLogFacts.ForEach(fact - => QSBEventManager.FireEvent(EventNames.QSBRevealFact, fact.Id, fact.SaveGame, false)); - - foreach (var wallText in QSBWorldSync.GetWorldObjects().Where(x => x.AttachedObject.GetValue("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0)) - { - wallText.GetTranslatedIds().ForEach(id - => QSBEventManager.FireEvent(EventNames.QSBTextTranslated, NomaiTextType.WallText, wallText.ObjectId, id)); - } - - foreach (var computer in QSBWorldSync.GetWorldObjects().Where(x => x.AttachedObject.GetValue("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0)) - { - computer.GetTranslatedIds().ForEach(id - => QSBEventManager.FireEvent(EventNames.QSBTextTranslated, NomaiTextType.Computer, computer.ObjectId, id)); - } - - foreach (var vesselComputer in QSBWorldSync.GetWorldObjects().Where(x => x.AttachedObject.GetValue("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0)) - { - vesselComputer.GetTranslatedIds().ForEach(id - => QSBEventManager.FireEvent(EventNames.QSBTextTranslated, NomaiTextType.VesselComputer, vesselComputer.ObjectId, id)); - } - - QSBWorldSync.GetWorldObjects().ForEach(x => - { - QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, x.ObjectId, x.ControllingPlayer); - - if (x is QSBQuantumMoon qsbQuantumMoon) - { - int stateIndex; - Vector3 onUnitSphere; - int orbitAngle; - - var moon = qsbQuantumMoon.AttachedObject; - var moonBody = moon._moonBody; - stateIndex = moon.GetStateIndex(); - var orbit = moon._orbits.First(y => y.GetStateIndex() == stateIndex); - var orbitBody = orbit.GetAttachedOWRigidbody(); - var relPos = moonBody.GetWorldCenterOfMass() - orbitBody.GetWorldCenterOfMass(); - var relVel = moonBody.GetVelocity() - orbitBody.GetVelocity(); - onUnitSphere = relPos.normalized; - var perpendicular = Vector3.Cross(relPos, Vector3.up).normalized; - orbitAngle = (int)OWMath.WrapAngle(OWMath.Angle(perpendicular, relVel, relPos)); - - QSBEventManager.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle); - } - }); - - QSBWorldSync.GetWorldObjects().ForEach(campfire - => QSBEventManager.FireEvent(EventNames.QSBCampfireState, campfire.ObjectId, campfire.GetState())); - - QSBWorldSync.GetWorldObjects().ForEach(fragment - => QSBEventManager.FireEvent(EventNames.QSBFragmentResync, fragment)); - - QSBWorldSync.GetWorldObjects().ForEach(tornado - => QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, tornado)); - } - - /// - /// send info for objects we have authority over - /// - private void SendAuthorityObjectInfo() - { - foreach (var qsbOrb in QSBWorldSync.GetWorldObjects()) - { - if (!qsbOrb.TransformSync.enabled || - !qsbOrb.TransformSync.HasAuthority) - { - continue; - } - - QSBEventManager.FireEvent(EventNames.QSBOrbDrag, qsbOrb, qsbOrb.AttachedObject._isBeingDragged); - QSBEventManager.FireEvent(EventNames.QSBOrbSlot, qsbOrb, qsbOrb.AttachedObject._slots.IndexOf(qsbOrb.AttachedObject._occupiedSlot)); - } - } - } -} diff --git a/QSB/Player/Messages/EnterLeaveMessage.cs b/QSB/Player/Messages/EnterLeaveMessage.cs new file mode 100644 index 00000000..890ffae9 --- /dev/null +++ b/QSB/Player/Messages/EnterLeaveMessage.cs @@ -0,0 +1,105 @@ +using OWML.Common; +using QSB.Animation.NPC.WorldObjects; +using QSB.Messaging; +using QSB.Player.TransformSync; +using QSB.PoolSync; +using QSB.ShipSync; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.Player.Messages +{ + internal class EnterLeaveMessage : QSBEnumMessage + { + static EnterLeaveMessage() + { + GlobalMessenger.AddListener(OWEvents.PlayerEnterQuantumMoon, () => Handler(EnterLeaveType.EnterMoon)); + GlobalMessenger.AddListener(OWEvents.PlayerExitQuantumMoon, () => Handler(EnterLeaveType.ExitMoon)); + GlobalMessenger.AddListener(OWEvents.EnterShip, () => Handler(EnterLeaveType.EnterShip)); + GlobalMessenger.AddListener(OWEvents.ExitShip, () => Handler(EnterLeaveType.ExitShip)); + } + + private static void Handler(EnterLeaveType type, int objectId = -1) + { + if (PlayerTransformSync.LocalInstance) + { + new EnterLeaveMessage(type, objectId).Send(); + } + } + + + private int ObjectId; + + public EnterLeaveMessage(EnterLeaveType type, int objectId = -1) + { + Value = type; + ObjectId = objectId; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ObjectId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ObjectId = reader.ReadInt32(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() => OnReceiveRemote(); + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + switch (Value) + { + case EnterLeaveType.EnterMoon: + player.IsInMoon = true; + break; + case EnterLeaveType.ExitMoon: + player.IsInMoon = false; + break; + case EnterLeaveType.EnterShrine: + player.IsInShrine = true; + break; + case EnterLeaveType.ExitShrine: + player.IsInShrine = false; + break; + case EnterLeaveType.EnterPlatform: + CustomNomaiRemoteCameraPlatform.CustomPlatformList[ObjectId] + .OnRemotePlayerEnter(From); + break; + case EnterLeaveType.ExitPlatform: + CustomNomaiRemoteCameraPlatform.CustomPlatformList[ObjectId] + .OnRemotePlayerExit(From); + break; + case EnterLeaveType.EnterNonNomaiHeadZone: + ObjectId.GetWorldObject().AddPlayerToHeadZone(player); + break; + case EnterLeaveType.ExitNonNomaiHeadZone: + ObjectId.GetWorldObject().RemovePlayerFromHeadZone(player); + break; + case EnterLeaveType.EnterNomaiHeadZone: + ObjectId.GetWorldObject().AddPlayerToHeadZone(player); + break; + case EnterLeaveType.ExitNomaiHeadZone: + ObjectId.GetWorldObject().RemovePlayerFromHeadZone(player); + break; + case EnterLeaveType.EnterShip: + ShipManager.Instance.AddPlayerToShip(player); + break; + case EnterLeaveType.ExitShip: + ShipManager.Instance.RemovePlayerFromShip(player); + break; + default: + DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {Value}", MessageType.Warning); + break; + } + } + } +} \ No newline at end of file diff --git a/QSB/Player/Messages/LaunchCodesMessage.cs b/QSB/Player/Messages/LaunchCodesMessage.cs new file mode 100644 index 00000000..d8f83c66 --- /dev/null +++ b/QSB/Player/Messages/LaunchCodesMessage.cs @@ -0,0 +1,30 @@ +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.Player.Messages +{ + internal class LaunchCodesMessage : QSBMessage + { + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var flag = false; + if (!PlayerData._currentGameSave.PersistentConditionExists("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + else if (!PlayerData._currentGameSave.GetPersistentCondition("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + + if (flag) + { + DialogueConditionManager.SharedInstance.SetConditionState("SCIENTIST_3", true); + PlayerData._currentGameSave.SetPersistentCondition("LAUNCH_CODES_GIVEN", true); + GlobalMessenger.FireEvent("LearnLaunchCodes"); + } + } + } +} diff --git a/QSB/Player/Messages/PlayerEntangledMessage.cs b/QSB/Player/Messages/PlayerEntangledMessage.cs new file mode 100644 index 00000000..261ccdb3 --- /dev/null +++ b/QSB/Player/Messages/PlayerEntangledMessage.cs @@ -0,0 +1,55 @@ +using QSB.Messaging; +using QSB.QuantumSync.WorldObjects; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.Player.Messages +{ + // almost a world object message, but supports null (-1) as well + internal class PlayerEntangledMessage : QSBMessage + { + private int ObjectId; + + public PlayerEntangledMessage(int objectId) => ObjectId = objectId; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() + { + var player = QSBPlayerManager.LocalPlayer; + if (ObjectId == -1) + { + player.EntangledObject = null; + return; + } + + var quantumObject = ObjectId.GetWorldObject(); + player.EntangledObject = quantumObject; + } + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + if (ObjectId == -1) + { + player.EntangledObject = null; + return; + } + + var quantumObject = ObjectId.GetWorldObject(); + player.EntangledObject = quantumObject; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ObjectId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ObjectId = reader.ReadInt32(); + } + } +} diff --git a/QSB/Player/Messages/PlayerInformationMessage.cs b/QSB/Player/Messages/PlayerInformationMessage.cs new file mode 100644 index 00000000..806fb3a4 --- /dev/null +++ b/QSB/Player/Messages/PlayerInformationMessage.cs @@ -0,0 +1,90 @@ +using OWML.Common; +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.Utility; +using QuantumUNET.Transport; + +namespace QSB.Player.Messages +{ + public class PlayerInformationMessage : QSBMessage + { + private string PlayerName; + private bool IsReady; + private bool FlashlightActive; + private bool SuitedUp; + private bool ProbeLauncherEquipped; + private bool SignalscopeEquipped; + private bool TranslatorEquipped; + private bool ProbeActive; + private ClientState ClientState; + + public PlayerInformationMessage() + { + var player = QSBPlayerManager.LocalPlayer; + PlayerName = player.Name; + IsReady = player.IsReady; + FlashlightActive = player.FlashlightActive; + SuitedUp = player.SuitedUp; + ProbeLauncherEquipped = player.ProbeLauncherEquipped; + SignalscopeEquipped = player.SignalscopeEquipped; + TranslatorEquipped = player.TranslatorEquipped; + ProbeActive = player.ProbeActive; + ClientState = player.State; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerName); + writer.Write(IsReady); + writer.Write(FlashlightActive); + writer.Write(SuitedUp); + writer.Write(ProbeLauncherEquipped); + writer.Write(SignalscopeEquipped); + writer.Write(TranslatorEquipped); + writer.Write(ProbeActive); + writer.Write((int)ClientState); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerName = reader.ReadString(); + IsReady = reader.ReadBoolean(); + FlashlightActive = reader.ReadBoolean(); + SuitedUp = reader.ReadBoolean(); + ProbeLauncherEquipped = reader.ReadBoolean(); + SignalscopeEquipped = reader.ReadBoolean(); + TranslatorEquipped = reader.ReadBoolean(); + ProbeActive = reader.ReadBoolean(); + ClientState = (ClientState)reader.ReadInt32(); + } + + public override void OnReceiveRemote() + { + RequestStateResyncMessage._waitingForEvent = false; + if (QSBPlayerManager.PlayerExists(From)) + { + var player = QSBPlayerManager.GetPlayer(From); + player.Name = PlayerName; + player.IsReady = IsReady; + player.FlashlightActive = FlashlightActive; + player.SuitedUp = SuitedUp; + player.ProbeLauncherEquipped = ProbeLauncherEquipped; + player.SignalscopeEquipped = SignalscopeEquipped; + player.TranslatorEquipped = TranslatorEquipped; + player.ProbeActive = ProbeActive; + if (QSBPlayerManager.LocalPlayer.IsReady && player.IsReady) + { + player.UpdateObjectsFromStates(); + } + + player.State = ClientState; + } + else + { + DebugLog.ToConsole($"Warning - got player information message about player that doesnt exist!", MessageType.Warning); + } + } + } +} diff --git a/QSB/Player/Messages/PlayerJoinMessage.cs b/QSB/Player/Messages/PlayerJoinMessage.cs new file mode 100644 index 00000000..6775e230 --- /dev/null +++ b/QSB/Player/Messages/PlayerJoinMessage.cs @@ -0,0 +1,106 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Utility; +using QuantumUNET.Transport; + +namespace QSB.Player.Messages +{ + public class PlayerJoinMessage : QSBMessage + { + private string PlayerName; + private string QSBVersion; + private string GameVersion; + private GamePlatform Platform; + private bool DlcInstalled; + + public PlayerJoinMessage(string name) + { + PlayerName = name; + QSBVersion = QSBCore.QSBVersion; + GameVersion = QSBCore.GameVersion; + Platform = QSBCore.Platform; + DlcInstalled = QSBCore.DLCInstalled; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerName); + writer.Write(QSBVersion); + writer.Write(GameVersion); + writer.Write((int)Platform); + writer.Write(DlcInstalled); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerName = reader.ReadString(); + QSBVersion = reader.ReadString(); + GameVersion = reader.ReadString(); + Platform = (GamePlatform)reader.ReadInt32(); + DlcInstalled = reader.ReadBoolean(); + } + + public override void OnReceiveRemote() + { + if (QSBVersion != QSBCore.QSBVersion) + { + if (QSBCore.IsHost) + { + DebugLog.ToConsole($"Error - Client {PlayerName} connecting with wrong QSB version. (Client:{QSBVersion}, Server:{QSBCore.QSBVersion})", MessageType.Error); + new PlayerKickMessage(From, KickReason.QSBVersionNotMatching).Send(); + } + + return; + } + + if (GameVersion != QSBCore.GameVersion) + { + if (QSBCore.IsHost) + { + DebugLog.ToConsole($"Error - Client {PlayerName} connecting with wrong game version. (Client:{GameVersion}, Server:{QSBCore.GameVersion})", MessageType.Error); + new PlayerKickMessage(From, KickReason.GameVersionNotMatching).Send(); + } + + return; + } + + if (Platform != QSBCore.Platform) + { + if (QSBCore.IsHost) + { + DebugLog.ToConsole($"Error - Client {PlayerName} connecting with wrong game platform. (Client:{Platform}, Server:{QSBCore.Platform})", MessageType.Error); + new PlayerKickMessage(From, KickReason.DLCNotMatching).Send(); + } + } + + if (DlcInstalled != QSBCore.DLCInstalled) + { + if (QSBCore.IsHost) + { + DebugLog.ToConsole($"Error - Client {PlayerName} connecting with wrong DLC installation state. (Client:{DlcInstalled}, Server:{QSBCore.DLCInstalled})", MessageType.Error); + new PlayerKickMessage(From, KickReason.GamePlatformNotMatching).Send(); + } + } + + var player = QSBPlayerManager.GetPlayer(From); + player.Name = PlayerName; + DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); + DebugLog.DebugWrite($"{player.Name} joined. id:{player.PlayerId}, qsbVersion:{QSBVersion}, gameVersion:{GameVersion}, platform:{Platform}. dlcInstalled:{DlcInstalled}", MessageType.Info); + } + + public override void OnReceiveLocal() + { + var player = QSBPlayerManager.GetPlayer(QSBPlayerManager.LocalPlayerId); + player.Name = PlayerName; + DebugLog.ToAll($"Connected to server as {player.Name}.", MessageType.Info); + + if (QSBSceneManager.IsInUniverse) + { + player.IsReady = true; + new PlayerReadyMessage(true).Send(); + } + } + } +} diff --git a/QSB/Player/Messages/PlayerKickMessage.cs b/QSB/Player/Messages/PlayerKickMessage.cs new file mode 100644 index 00000000..5a55a87b --- /dev/null +++ b/QSB/Player/Messages/PlayerKickMessage.cs @@ -0,0 +1,66 @@ +using QSB.Menus; +using QSB.Messaging; +using QSB.Utility; +using QuantumUNET; +using QuantumUNET.Transport; +using System.Linq; + +namespace QSB.Player.Messages +{ + /// + /// always sent by host + /// + internal class PlayerKickMessage : QSBEnumMessage + { + private uint PlayerId; + + public PlayerKickMessage(uint playerId, KickReason reason) + { + PlayerId = playerId; + Value = reason; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerId = reader.ReadUInt32(); + } + + public override void OnReceiveLocal() + { + if (!QSBCore.IsHost) + { + return; + } + + QSBCore.UnityEvents.FireInNUpdates(KickPlayer, 10); + } + + private void KickPlayer() + => QNetworkServer.connections.First(x => PlayerId == x.GetPlayerId()).Disconnect(); + + public override void OnReceiveRemote() + { + if (PlayerId != QSBPlayerManager.LocalPlayerId) + { + if (QSBPlayerManager.PlayerExists(PlayerId)) + { + DebugLog.ToAll($"{QSBPlayerManager.GetPlayer(PlayerId).Name} was kicked."); + return; + } + + DebugLog.ToAll($"Player id:{PlayerId} was kicked."); + return; + } + + DebugLog.ToAll($"Kicked from server. Reason : {Value}"); + MenuManager.Instance.OnKicked(Value); + } + } +} diff --git a/QSB/Player/Messages/PlayerReadyMessage.cs b/QSB/Player/Messages/PlayerReadyMessage.cs new file mode 100644 index 00000000..64f62140 --- /dev/null +++ b/QSB/Player/Messages/PlayerReadyMessage.cs @@ -0,0 +1,44 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Utility; + +namespace QSB.Player.Messages +{ + public class PlayerReadyMessage : QSBBoolMessage + { + public PlayerReadyMessage(bool ready) => Value = ready; + + public override void OnReceiveRemote() + { + if (QSBCore.IsHost) + { + HandleServer(); + } + else + { + HandleClient(); + } + } + + private void HandleServer() + { + DebugLog.DebugWrite($"[SERVER] Get ready event from {From} (ready = {Value})", MessageType.Success); + QSBPlayerManager.GetPlayer(From).IsReady = Value; + new PlayerInformationMessage().Send(); + } + + private void HandleClient() + { + DebugLog.DebugWrite($"[CLIENT] Get ready event from {From} (ready = {Value})", MessageType.Success); + if (!QSBPlayerManager.PlayerExists(From)) + { + DebugLog.ToConsole( + "Error - Got ready event for non-existent player! Did we not send a PlayerStatesRequestEvent? Or was it not handled?", + MessageType.Error); + return; + } + + QSBPlayerManager.GetPlayer(From).IsReady = Value; + } + } +} diff --git a/QSB/Player/Messages/RequestStateResyncMessage.cs b/QSB/Player/Messages/RequestStateResyncMessage.cs new file mode 100644 index 00000000..8c927f12 --- /dev/null +++ b/QSB/Player/Messages/RequestStateResyncMessage.cs @@ -0,0 +1,149 @@ +using OWML.Common; +using QSB.CampfireSync.Messages; +using QSB.CampfireSync.WorldObjects; +using QSB.ClientServerStateSync; +using QSB.ClientServerStateSync.Messages; +using QSB.ConversationSync.Messages; +using QSB.LogSync.Messages; +using QSB.Messaging; +using QSB.MeteorSync.Messages; +using QSB.MeteorSync.WorldObjects; +using QSB.OrbSync.Messages; +using QSB.OrbSync.WorldObjects; +using QSB.QuantumSync.Messages; +using QSB.QuantumSync.WorldObjects; +using QSB.Tools.TranslatorTool.TranslationSync.Messages; +using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; +using QSB.TornadoSync.Messages; +using QSB.TornadoSync.WorldObjects; +using QSB.Utility; +using QSB.WorldSync; +using System.Linq; +using UnityEngine; + +namespace QSB.Player.Messages +{ + // Can be sent by any client (including host) to signal they want latest worldobject, player, and server information + public class RequestStateResyncMessage : QSBMessage + { + /// + /// set to true when we send this, and false when we receive a player info message back.
+ /// this prevents message spam a bit. + ///
+ internal static bool _waitingForEvent; + + /// + /// used instead of QSBMessageManager.Send to do the extra check + /// + public void Send() + { + if (_waitingForEvent) + { + return; + } + + _waitingForEvent = true; + QSBMessageManager.Send(this); + } + + public override void OnReceiveLocal() + { + QSBCore.UnityEvents.FireInNUpdates(() => + { + if (_waitingForEvent) + { + DebugLog.ToConsole($"Did not receive PlayerInformationEvent in time. Setting _waitingForEvent to false.", MessageType.Info); + _waitingForEvent = false; + } + }, 60); + } + + public override void OnReceiveRemote() + { + // if host, send worldobject and server states + if (QSBCore.IsHost) + { + new ServerStateMessage(ServerStateManager.Instance.GetServerState()) { To = From }.Send(); + new PlayerInformationMessage { To = From }.Send(); + + if (WorldObjectManager.AllObjectsReady) + { + SendWorldObjectInfo(); + } + } + // if client, send player and client states + else + { + new PlayerInformationMessage { To = From }.Send(); + } + + if (WorldObjectManager.AllObjectsReady) + { + SendAuthorityObjectInfo(); + } + } + + private void SendWorldObjectInfo() + { + QSBWorldSync.DialogueConditions.ForEach(condition + => new DialogueConditionMessage(condition.Key, condition.Value) { To = From }.Send()); + + QSBWorldSync.ShipLogFacts.ForEach(fact + => new RevealFactMessage(fact.Id, fact.SaveGame, false) { To = From }.Send()); + + foreach (var text in QSBWorldSync.GetWorldObjects()) + { + text.GetTranslatedIds().ForEach(id => + text.SendMessage(new SetAsTranslatedMessage(id) { To = From })); + } + + QSBWorldSync.GetWorldObjects().ForEach(x => + { + x.SendMessage(new QuantumAuthorityMessage(x.ControllingPlayer) { To = From }); + + if (x is QSBQuantumMoon qsbQuantumMoon) + { + var moon = qsbQuantumMoon.AttachedObject; + var moonBody = moon._moonBody; + var stateIndex = moon.GetStateIndex(); + var orbit = moon._orbits.First(y => y.GetStateIndex() == stateIndex); + var orbitBody = orbit.GetAttachedOWRigidbody(); + var relPos = moonBody.GetWorldCenterOfMass() - orbitBody.GetWorldCenterOfMass(); + var relVel = moonBody.GetVelocity() - orbitBody.GetVelocity(); + var onUnitSphere = relPos.normalized; + var perpendicular = Vector3.Cross(relPos, Vector3.up).normalized; + var orbitAngle = (int)OWMath.WrapAngle(OWMath.Angle(perpendicular, relVel, relPos)); + + new MoonStateChangeMessage(stateIndex, onUnitSphere, orbitAngle) { To = From }.Send(); + } + }); + + QSBWorldSync.GetWorldObjects().ForEach(campfire + => campfire.SendMessage(new CampfireStateMessage(campfire.GetState()) { To = From })); + + QSBWorldSync.GetWorldObjects().ForEach(fragment + => fragment.SendMessage(new FragmentResyncMessage(fragment) { To = From })); + + QSBWorldSync.GetWorldObjects().ForEach(tornado + => tornado.SendMessage(new TornadoFormStateMessage(tornado.FormState) { To = From })); + } + + /// + /// send info for objects we have authority over + /// + private void SendAuthorityObjectInfo() + { + foreach (var qsbOrb in QSBWorldSync.GetWorldObjects()) + { + if (!qsbOrb.TransformSync.enabled || + !qsbOrb.TransformSync.HasAuthority) + { + continue; + } + + qsbOrb.SendMessage(new OrbDragMessage(qsbOrb.AttachedObject._isBeingDragged) { To = From }); + qsbOrb.SendMessage(new OrbSlotMessage(qsbOrb.AttachedObject._slots.IndexOf(qsbOrb.AttachedObject._occupiedSlot)) { To = From }); + } + } + } +} diff --git a/QSB/Player/Patches/PlayerPatches.cs b/QSB/Player/Patches/PlayerPatches.cs index 895ae5b0..37af3473 100644 --- a/QSB/Player/Patches/PlayerPatches.cs +++ b/QSB/Player/Patches/PlayerPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.Player.Messages; namespace QSB.Player.Patches { @@ -44,7 +45,7 @@ namespace QSB.Player.Patches DialogueConditionManager.SharedInstance.SetConditionState("SCIENTIST_3", true); PlayerData._currentGameSave.SetPersistentCondition("LAUNCH_CODES_GIVEN", true); GlobalMessenger.FireEvent("LearnLaunchCodes"); - QSBEventManager.FireEvent(EventNames.QSBLearnLaunchCodes); + new LaunchCodesMessage().Send(); } return false; diff --git a/QSB/Player/PlayerEntanglementWatcher.cs b/QSB/Player/PlayerEntanglementWatcher.cs index af38f4de..3ed0e278 100644 --- a/QSB/Player/PlayerEntanglementWatcher.cs +++ b/QSB/Player/PlayerEntanglementWatcher.cs @@ -1,6 +1,5 @@ -using OWML.Utils; -using QSB.Events; -using QSB.QuantumSync; +using QSB.Messaging; +using QSB.Player.Messages; using QSB.QuantumSync.WorldObjects; using QSB.WorldSync; using UnityEngine; @@ -32,13 +31,11 @@ namespace QSB.Player var collidingQuantumObject = controller._collidingQuantumObject; if (_previousCollidingQuantumObject != collidingQuantumObject) { - var objectIndex = (collidingQuantumObject != null) - ? QSBWorldSync.GetWorldFromUnity(collidingQuantumObject).ObjectId + var objectId = collidingQuantumObject != null + ? collidingQuantumObject.GetWorldObject().ObjectId : -1; - QSBEventManager.FireEvent( - EventNames.QSBPlayerEntangle, - objectIndex); + new PlayerEntangledMessage(objectId).Send(); _previousCollidingQuantumObject = collidingQuantumObject; } } diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 26334c60..a94bbc0d 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -4,10 +4,11 @@ using QSB.Animation.Player.Thrusters; using QSB.Audio; using QSB.CampfireSync.WorldObjects; using QSB.ClientServerStateSync; -using QSB.Events; using QSB.ItemSync.WorldObjects.Items; +using QSB.Messaging; +using QSB.Player.Messages; using QSB.Player.TransformSync; -using QSB.QuantumSync; +using QSB.QuantumSync.WorldObjects; using QSB.RoastingSync; using QSB.Tools; using QSB.Tools.FlashlightTool; @@ -15,7 +16,6 @@ using QSB.Tools.ProbeLauncherTool; using QSB.Tools.ProbeTool; using QSB.Utility; using System.Linq; -using QSB.QuantumSync.WorldObjects; using UnityEngine; namespace QSB.Player @@ -230,10 +230,10 @@ namespace QSB.Player else { FlashlightActive = Locator.GetFlashlight()._flashlightOn; - SuitedUp = Locator.GetPlayerBody().GetComponent().IsWearingSuit(true); + SuitedUp = Locator.GetPlayerBody().GetComponent().IsWearingSuit(); } - QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); + new PlayerInformationMessage().Send(); } private QSBTool GetToolByType(ToolType type) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 59a5361c..e9c637d1 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -1,6 +1,5 @@ using OWML.Common; using QSB.ItemSync.WorldObjects.Items; -using QSB.Player.Events; using QSB.Player.TransformSync; using QSB.Tools.FlashlightTool; using QSB.Utility; @@ -77,25 +76,6 @@ namespace QSB.Player public static bool PlayerExists(uint id) => id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id); - public static void HandleFullStateMessage(PlayerInformationMessage message) - { - var player = GetPlayer(message.AboutId); - player.Name = message.PlayerName; - player.IsReady = message.IsReady; - player.FlashlightActive = message.FlashlightActive; - player.SuitedUp = message.SuitedUp; - player.ProbeLauncherEquipped = message.ProbeLauncherEquipped; - player.SignalscopeEquipped = message.SignalscopeEquipped; - player.TranslatorEquipped = message.TranslatorEquipped; - player.ProbeActive = message.ProbeActive; - if (LocalPlayer.IsReady && player.IsReady) - { - player.UpdateObjectsFromStates(); - } - - player.State = message.ClientState; - } - public static IEnumerable GetSyncObjects() where T : PlayerSyncObject => PlayerSyncObjects.OfType().Where(x => x != null); @@ -106,9 +86,6 @@ namespace QSB.Player public static void RemoveSyncObject(PlayerSyncObject obj) => PlayerSyncObjects.Remove(obj); - public static bool IsBelongingToLocalPlayer(uint id) => id == LocalPlayerId || - PlayerSyncObjects.Any(x => x != null && x.AttachedNetId == id && x.IsLocalPlayer); - public static List GetPlayersWithCameras(bool includeLocalCamera = true) { var cameraList = PlayerList.Where(x => x.Camera != null && x.PlayerId != LocalPlayerId).ToList(); diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 3ba83e81..191ed6a5 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -1,8 +1,8 @@ -using OWML.Utils; -using QSB.Animation.Player; +using QSB.Animation.Player; using QSB.Audio; -using QSB.Events; using QSB.Instruments; +using QSB.Messaging; +using QSB.Player.Messages; using QSB.RoastingSync; using QSB.SectorSync; using QSB.Syncs.Sectored.Transforms; @@ -16,8 +16,6 @@ namespace QSB.Player.TransformSync { public class PlayerTransformSync : SectoredTransformSync { - static PlayerTransformSync() => AnimControllerPatch.Init(); - public override bool IsPlayerObject => true; private Transform _visibleCameraRoot; @@ -65,13 +63,13 @@ namespace QSB.Player.TransformSync if (isInUniverse && !_isInitialized) { Player.IsReady = false; - QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); + new PlayerReadyMessage(false).Send(); } if (!isInUniverse) { Player.IsReady = false; - QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); + new PlayerReadyMessage(false).Send(); } base.OnSceneLoaded(oldScene, newScene, isInUniverse); @@ -82,7 +80,7 @@ namespace QSB.Player.TransformSync base.Init(); Player.IsReady = true; - QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); + new PlayerReadyMessage(true).Send(); } protected override void OnDestroy() @@ -123,7 +121,7 @@ namespace QSB.Player.TransformSync _visibleStickPivot = pivot; _visibleStickTip = pivot.Find("Stick_Tip"); - QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); + new RequestStateResyncMessage().Send(); return player; } @@ -215,12 +213,12 @@ namespace QSB.Player.TransformSync // Create new marshmallow var newMarshmallow = mallowRoot.gameObject.AddComponent(); - newMarshmallow._fireRenderer = oldMarshmallow.GetValue("_fireRenderer"); - newMarshmallow._smokeParticles = oldMarshmallow.GetValue("_smokeParticles"); - newMarshmallow._mallowRenderer = oldMarshmallow.GetValue("_mallowRenderer"); - newMarshmallow._rawColor = oldMarshmallow.GetValue("_rawColor"); - newMarshmallow._toastedColor = oldMarshmallow.GetValue("_toastedColor"); - newMarshmallow._burntColor = oldMarshmallow.GetValue("_burntColor"); + newMarshmallow._fireRenderer = oldMarshmallow._fireRenderer; + newMarshmallow._smokeParticles = oldMarshmallow._smokeParticles; + newMarshmallow._mallowRenderer = oldMarshmallow._mallowRenderer; + newMarshmallow._rawColor = oldMarshmallow._rawColor; + newMarshmallow._toastedColor = oldMarshmallow._toastedColor; + newMarshmallow._burntColor = oldMarshmallow._burntColor; Destroy(oldMarshmallow); Player.RoastingStick = REMOTE_Stick_Pivot.gameObject; @@ -265,9 +263,9 @@ namespace QSB.Player.TransformSync base.OnRenderObject(); if (!WorldObjectManager.AllObjectsReady - || !QSBCore.ShowLinesInDebug - || !IsReady - || ReferenceTransform == null) + || !QSBCore.ShowLinesInDebug + || !IsReady + || ReferenceTransform == null) { return; } diff --git a/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs b/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs index dd59607e..f7cd1b1a 100644 --- a/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs +++ b/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs @@ -1,8 +1,8 @@ using OWML.Common; -using OWML.Utils; using QSB.Animation.Player; -using QSB.Events; +using QSB.Messaging; using QSB.Player; +using QSB.Player.Messages; using QSB.Utility; using System.Collections.Generic; using System.Linq; @@ -19,27 +19,27 @@ namespace QSB.PoolSync private static int s_propID_WaveScale; private static int s_propID_Ripple2Position; private static int s_propID_Ripple2Params; - public string _dataPointID => _oldPlatform.GetValue("_dataPointID"); - public Sector _visualSector => _oldPlatform.GetValue("_visualSector"); - public Sector _visualSector2 => _oldPlatform.GetValue("_visualSector2"); - public Shape _connectionBounds => _oldPlatform.GetValue("_connectionBounds"); - public MeshRenderer _poolRenderer => _oldPlatform.GetValue("_poolRenderer"); - public float _poolFillLength => _oldPlatform.GetValue("_poolFillLength"); - public float _poolEmptyLength => _oldPlatform.GetValue("_poolEmptyLength"); - public AnimationCurve _poolHeightCurve => _oldPlatform.GetValue("_poolHeightCurve"); - public AnimationCurve _poolMaskCurve => _oldPlatform.GetValue("_poolMaskCurve"); - public AnimationCurve _poolWaveHeightCurve => _oldPlatform.GetValue("_poolWaveHeightCurve"); - public Renderer[] _transitionRenderers => _oldPlatform.GetValue("_transitionRenderers"); - public PedestalAnimator _transitionPedestalAnimator => _oldPlatform.GetValue("_transitionPedestalAnimator"); - public GameObject _transitionStone => _oldPlatform.GetValue("_transitionStone"); - public GameObject _hologramGroup => _oldPlatform.GetValue("_hologramGroup"); - public Transform _playerHologram => _oldPlatform.GetValue("_playerHologram"); - public Transform _stoneHologram => _oldPlatform.GetValue("_stoneHologram"); - public float _fadeInLength => _oldPlatform.GetValue("_fadeInLength"); - public float _fadeOutLength => _oldPlatform.GetValue("_fadeOutLength"); - public OWAudioSource _ambientAudioSource => _oldPlatform.GetValue("_ambientAudioSource"); - public OWAudioSource _oneShotAudioSource => _oldPlatform.GetValue("_oneShotAudioSource"); - public DarkZone _darkZone => _oldPlatform.GetValue("_darkZone"); + public string _dataPointID => _oldPlatform._dataPointID; + public Sector _visualSector => _oldPlatform._visualSector; + public Sector _visualSector2 => _oldPlatform._visualSector2; + public Shape _connectionBounds => _oldPlatform._connectionBounds; + public MeshRenderer _poolRenderer => _oldPlatform._poolRenderer; + public float _poolFillLength => _oldPlatform._poolFillLength; + public float _poolEmptyLength => _oldPlatform._poolEmptyLength; + public AnimationCurve _poolHeightCurve => _oldPlatform._poolHeightCurve; + public AnimationCurve _poolMaskCurve => _oldPlatform._poolMaskCurve; + public AnimationCurve _poolWaveHeightCurve => _oldPlatform._poolWaveHeightCurve; + public Renderer[] _transitionRenderers => _oldPlatform._transitionRenderers; + public PedestalAnimator _transitionPedestalAnimator => _oldPlatform._transitionPedestalAnimator; + public GameObject _transitionStone => _oldPlatform._transitionStone; + public GameObject _hologramGroup => _oldPlatform._hologramGroup; + public Transform _playerHologram => _oldPlatform._playerHologram; + public Transform _stoneHologram => _oldPlatform._stoneHologram; + public float _fadeInLength => _oldPlatform._fadeInLength; + public float _fadeOutLength => _oldPlatform._fadeOutLength; + public OWAudioSource _ambientAudioSource => _oldPlatform._ambientAudioSource; + public OWAudioSource _oneShotAudioSource => _oldPlatform._oneShotAudioSource; + public DarkZone _darkZone => _oldPlatform._darkZone; private OWCamera _playerCamera; private CustomNomaiRemoteCamera _ownedCamera; private SharedStoneSocket _socket; @@ -60,8 +60,8 @@ namespace QSB.PoolSync private void Awake() { _oldPlatform = GetComponent(); - _id = _oldPlatform.GetValue("_id"); - _sharedStone = _oldPlatform.GetValue("_sharedStone"); + _id = _oldPlatform._id; + _sharedStone = _oldPlatform._sharedStone; _ownedCamera = GetComponentInChildren(); _alreadyOccupiedSectors = new List(16); _cameraState = CameraState.Disconnected; @@ -201,7 +201,7 @@ namespace QSB.PoolSync _slavePlatform.UpdateRendererFade(); SwitchToRemoteCamera(); _hologramGroup.SetActive(true); - _ambientAudioSource.FadeIn(3f, true, false, 1f); + _ambientAudioSource.FadeIn(3f, true); Locator.GetAudioMixer().MixRemoteCameraPlatform(_fadeInLength); _cameraState = CameraState.Connecting_FadeOut; } @@ -382,7 +382,7 @@ namespace QSB.PoolSync { if (_wasLocalInBounds) { - QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); + new EnterLeaveMessage(EnterLeaveType.ExitPlatform, CustomPlatformList.IndexOf(this)).Send(); } if (_slavePlatform == null) @@ -459,7 +459,7 @@ namespace QSB.PoolSync private void SwitchToRemoteCamera() { - QSBEventManager.FireEvent(EventNames.QSBEnterPlatform, CustomPlatformList.IndexOf(this)); + new EnterLeaveMessage(EnterLeaveType.EnterPlatform, CustomPlatformList.IndexOf(this)).Send(); GlobalMessenger.FireEvent("EnterNomaiRemoteCamera"); _slavePlatform.RevealFactID(); _slavePlatform._ownedCamera.Activate(this, _playerCamera); @@ -528,7 +528,7 @@ namespace QSB.PoolSync _slavePlatform._darkZone.RemovePlayerFromZone(true); } - QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); + new EnterLeaveMessage(EnterLeaveType.ExitPlatform, CustomPlatformList.IndexOf(this)).Send(); GlobalMessenger.FireEvent("ExitNomaiRemoteCamera"); _slavePlatform._ownedCamera.Deactivate(); _slavePlatform._ownedCamera.SetImageEffectFade(0f); @@ -538,7 +538,7 @@ namespace QSB.PoolSync { if (_dataPointID.Length > 0) { - Locator.GetShipLogManager().RevealFact(_dataPointID, true, true); + Locator.GetShipLogManager().RevealFact(_dataPointID); } } @@ -562,7 +562,7 @@ namespace QSB.PoolSync _cameraState = CameraState.Connecting_FadeIn; } - _oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraEntry, 1f); + _oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraEntry); enabled = true; } @@ -584,8 +584,8 @@ namespace QSB.PoolSync else { _cameraState = CameraState.Disconnecting_FadeIn; - _ambientAudioSource.FadeOut(0.5f, OWAudioSource.FadeOutCompleteAction.STOP, 0f); - _oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraExit, 1f); + _ambientAudioSource.FadeOut(0.5f); + _oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraExit); Locator.GetAudioMixer().UnmixRemoteCameraPlatform(_fadeOutLength); } } @@ -610,7 +610,7 @@ namespace QSB.PoolSync private void OnLeaveBounds() { DisconnectCamera(); - QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); + new EnterLeaveMessage(EnterLeaveType.ExitPlatform, CustomPlatformList.IndexOf(this)).Send(); if (_anyoneStillOnPlatform) { return; diff --git a/QSB/PoolSync/CustomNomaiRemoteCameraStreaming.cs b/QSB/PoolSync/CustomNomaiRemoteCameraStreaming.cs index 1178a036..a73e12f0 100644 --- a/QSB/PoolSync/CustomNomaiRemoteCameraStreaming.cs +++ b/QSB/PoolSync/CustomNomaiRemoteCameraStreaming.cs @@ -1,14 +1,8 @@ -using OWML.Utils; - -namespace QSB.PoolSync +namespace QSB.PoolSync { internal class CustomNomaiRemoteCameraStreaming : SectoredMonoBehaviour { - public CustomNomaiRemoteCameraPlatform _remoteCameraPlatform - { - get => _oldStreaming.GetValue("_remoteCameraPlatform").GetComponent(); - set => _oldStreaming.SetValue("_remoteCameraPlatform", value.GetComponent()); - } + private CustomNomaiRemoteCameraPlatform _remoteCameraPlatform; private StreamingGroup _streamingGroup; private NomaiRemoteCameraStreaming _oldStreaming; private bool _hasLoadedAssets; @@ -17,6 +11,7 @@ namespace QSB.PoolSync { base.Awake(); _oldStreaming = GetComponent(); + _remoteCameraPlatform = _oldStreaming._remoteCameraPlatform.GetComponent(); SetSector(_oldStreaming.GetSector()); } @@ -42,8 +37,8 @@ namespace QSB.PoolSync { _hasLoadedAssets = true; _streamingGroup = StreamingGroup.GetStreamingGroup(NomaiRemoteCameraStreaming.NomaiRemoteCameraPlatformIDToSceneName(stone.GetRemoteCameraID())); - _streamingGroup.RequestRequiredAssets(0); - _streamingGroup.RequestGeneralAssets(0); + _streamingGroup.RequestRequiredAssets(); + _streamingGroup.RequestGeneralAssets(); } } } diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 0481918b..94a0f886 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -1,15 +1,16 @@ using OWML.Common; -using OWML.Utils; using QSB.Anglerfish.TransformSync; using QSB.AuthoritySync; using QSB.ClientServerStateSync; using QSB.DeathSync; -using QSB.Events; using QSB.JellyfishSync.TransformSync; using QSB.Messaging; +using QSB.OrbSync.Messages; using QSB.OrbSync.TransformSync; +using QSB.OrbSync.WorldObjects; using QSB.Patches; using QSB.Player; +using QSB.Player.Messages; using QSB.Player.TransformSync; using QSB.PoolSync; using QSB.ShipSync.TransformSync; @@ -21,8 +22,6 @@ using QSB.WorldSync; using QuantumUNET; using QuantumUNET.Components; using System; -using System.Linq; -using QSB.OrbSync.WorldObjects; using UnityEngine; using UnityEngine.Networking; @@ -111,7 +110,7 @@ namespace QSB DebugLog.DebugWrite($"MakeNewNetworkObject - prefab id {template.GetInstanceID()} " + $"for {assetId} {name} {transformSyncType.Name}"); template.name = name; - template.GetRequiredComponent().SetValue("m_AssetId", assetId); + template.GetRequiredComponent().m_AssetId = assetId; template.AddComponent(transformSyncType); return template; } @@ -124,7 +123,8 @@ namespace QSB customConfig = true; connectionConfig.AddChannel(QosType.Reliable); connectionConfig.AddChannel(QosType.Unreliable); - this.SetValue("m_MaxBufferedPackets", MaxBufferedPackets); + + m_MaxBufferedPackets = MaxBufferedPackets; channels.Add(QosType.Reliable); channels.Add(QosType.Unreliable); @@ -165,7 +165,6 @@ namespace QSB OnClientConnected?.SafeInvoke(); - QSBEventManager.Init(); QSBMessageManager.Init(); gameObject.AddComponent(); @@ -184,13 +183,13 @@ namespace QSB OnNetworkManagerReady?.SafeInvoke(); IsReady = true; - QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null, - () => QSBEventManager.FireEvent(EventNames.QSBPlayerJoin, PlayerName)); + QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, + () => new PlayerJoinMessage(PlayerName).Send()); if (!QSBCore.IsHost) { - QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null, - () => QSBEventManager.FireEvent(EventNames.QSBRequestStateResync)); + QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance, + () => new RequestStateResyncMessage().Send()); } _everConnected = true; @@ -203,11 +202,12 @@ namespace QSB Destroy(GetComponent()); Destroy(GetComponent()); Destroy(GetComponent()); - QSBEventManager.Reset(); QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove()); RemoveWorldObjects(); + QSBWorldSync.DialogueConditions.Clear(); QSBWorldSync.OldDialogueTrees.Clear(); + QSBWorldSync.ShipLogFacts.Clear(); if (WakeUpSync.LocalInstance != null) { @@ -257,7 +257,7 @@ namespace QSB if (identity.ClientAuthorityOwner == conn) { qsbOrb.SetDragging(false); - QSBEventManager.FireEvent(EventNames.QSBOrbDrag, qsbOrb, false); + qsbOrb.SendMessage(new OrbDragMessage(false)); } } @@ -270,14 +270,13 @@ namespace QSB { DebugLog.DebugWrite("OnStopServer", MessageType.Info); Destroy(GetComponent()); - QSBEventManager.Reset(); DebugLog.ToConsole("Server stopped!", MessageType.Info); QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove()); base.OnStopServer(); } - private void RemoveWorldObjects() + private static void RemoveWorldObjects() { QSBWorldSync.RemoveWorldObjects(); foreach (var platform in QSBWorldSync.GetUnityObjects()) diff --git a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs deleted file mode 100644 index 6f2c82a3..00000000 --- a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs +++ /dev/null @@ -1,73 +0,0 @@ -using OWML.Utils; -using QSB.Events; -using System.Linq; -using System.Reflection; -using UnityEngine; - -namespace QSB.QuantumSync.Events -{ - public class MoonStateChangeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBMoonStateChange, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBMoonStateChange, Handler); - - private void Handler(int stateIndex, Vector3 onUnitSphere, int orbitAngle) => SendEvent(CreateMessage(stateIndex, onUnitSphere, orbitAngle)); - - private MoonStateChangeMessage CreateMessage(int stateIndex, Vector3 onUnitSphere, int orbitAngle) => new() - { - AboutId = LocalPlayerId, - StateIndex = stateIndex, - OnUnitSphere = onUnitSphere, - OrbitAngle = orbitAngle - }; - - public override void OnReceiveRemote(bool server, MoonStateChangeMessage message) - { - var moon = Locator.GetQuantumMoon(); - var wasPlayerEntangled = moon.IsPlayerEntangled(); - var location = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent(), moon.transform); - var moonBody = moon.GetValue("_moonBody"); - var constantFoceDetector = (ConstantForceDetector)moonBody.GetAttachedForceDetector(); - var orbits = moon.GetValue("_orbits"); - var orbit = orbits.First(x => x.GetStateIndex() == message.StateIndex); - var orbitRadius = orbit.GetOrbitRadius(); - var owRigidbody = orbit.GetAttachedOWRigidbody(); - var position = (message.OnUnitSphere * orbitRadius) + owRigidbody.GetWorldCenterOfMass(); - moonBody.transform.position = position; - if (!Physics.autoSyncTransforms) - { - Physics.SyncTransforms(); - } - - constantFoceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true); - moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, message.OrbitAngle) + owRigidbody.GetVelocity()); - moon.SetValue("_stateIndex", message.StateIndex); - - if (moon.IsPlayerInside()) - { - moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { message.StateIndex }); - } - else - { - moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { -1 }); - moon.GetValue("_quantumSignal").SetSignalActivation(message.StateIndex != 5, 2f); - } - - moon.GetValue("_referenceFrameVolume").gameObject.SetActive(message.StateIndex != 5); - moonBody.SetIsTargetable(message.StateIndex != 5); - foreach (var obj in moon.GetValue("_deactivateAtEye")) - { - obj.SetActive(message.StateIndex != 5); - } - - GlobalMessenger.FireEvent("QuantumMoonChangeState", moonBody); - - if (wasPlayerEntangled) - { - Locator.GetPlayerTransform().GetComponent().MoveToRelativeLocation(location, moon.transform); - } - } - } -} diff --git a/QSB/QuantumSync/Events/MoonStateChangeMessage.cs b/QSB/QuantumSync/Events/MoonStateChangeMessage.cs deleted file mode 100644 index 54b6df26..00000000 --- a/QSB/QuantumSync/Events/MoonStateChangeMessage.cs +++ /dev/null @@ -1,29 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.QuantumSync.Events -{ - public class MoonStateChangeMessage : PlayerMessage - { - public int StateIndex { get; set; } - public Vector3 OnUnitSphere { get; set; } - public int OrbitAngle { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - StateIndex = reader.ReadInt32(); - OnUnitSphere = reader.ReadVector3(); - OrbitAngle = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(StateIndex); - writer.Write(OnUnitSphere); - writer.Write(OrbitAngle); - } - } -} diff --git a/QSB/QuantumSync/Events/MultiStateChangeEvent.cs b/QSB/QuantumSync/Events/MultiStateChangeEvent.cs deleted file mode 100644 index e65732f1..00000000 --- a/QSB/QuantumSync/Events/MultiStateChangeEvent.cs +++ /dev/null @@ -1,48 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.QuantumSync.WorldObjects; -using QSB.Utility; -using QSB.WorldSync; - -namespace QSB.QuantumSync.Events -{ - public class MultiStateChangeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBMultiStateChange, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBMultiStateChange, Handler); - - private void Handler(int objid, int stateIndex) => SendEvent(CreateMessage(objid, stateIndex)); - - private MultiStateChangeMessage CreateMessage(int objid, int stateIndex) => new() - { - AboutId = LocalPlayerId, - ObjectId = objid, - StateIndex = stateIndex - }; - - public override void OnReceiveLocal(bool server, MultiStateChangeMessage message) - { - if (!QSBCore.ShowQuantumDebugBoxes) - { - return; - } - - var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbObj.DebugBoxText.text = message.StateIndex.ToString(); - } - - public override void OnReceiveRemote(bool server, MultiStateChangeMessage message) - { - var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); - if (qsbObj.ControllingPlayer != message.FromId) - { - DebugLog.ToConsole($"Error - Got MultiStateChangeEvent for {qsbObj.Name} from {message.FromId}, but it's currently controlled by {qsbObj.ControllingPlayer}!", MessageType.Error); - return; - } - - qsbObj.ChangeState(message.StateIndex); - } - } -} \ No newline at end of file diff --git a/QSB/QuantumSync/Events/MultiStateChangeMessage.cs b/QSB/QuantumSync/Events/MultiStateChangeMessage.cs deleted file mode 100644 index 4f81dd0f..00000000 --- a/QSB/QuantumSync/Events/MultiStateChangeMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.QuantumSync.Events -{ - public class MultiStateChangeMessage : WorldObjectMessage - { - public int StateIndex { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - StateIndex = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(StateIndex); - } - } -} \ No newline at end of file diff --git a/QSB/QuantumSync/Events/QuantumAuthorityEvent.cs b/QSB/QuantumSync/Events/QuantumAuthorityEvent.cs deleted file mode 100644 index 8688b872..00000000 --- a/QSB/QuantumSync/Events/QuantumAuthorityEvent.cs +++ /dev/null @@ -1,62 +0,0 @@ -using QSB.Events; -using QSB.Player; -using QSB.QuantumSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.QuantumSync.Events -{ - internal class QuantumAuthorityEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBQuantumAuthority, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBQuantumAuthority, Handler); - - private void Handler(int objId, uint authorityOwner) => SendEvent(CreateMessage(objId, authorityOwner)); - - private QuantumAuthorityMessage CreateMessage(int objId, uint authorityOwner) => new() - { - AboutId = LocalPlayerId, - ObjectId = objId, - AuthorityOwner = authorityOwner - }; - - public override bool CheckMessage(QuantumAuthorityMessage message) - { - if (!base.CheckMessage(message)) - { - return false; - } - - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - - // Deciding if to change the object's owner - // Message - // | = 0 | > 0 | - // = 0 | No | Yes | - // > 0 | Yes | No | - // if Obj==Message then No - // Obj - - return (obj.ControllingPlayer == 0 || message.AuthorityOwner == 0) - && (obj.ControllingPlayer != message.AuthorityOwner); - } - - public override void OnReceiveLocal(bool server, QuantumAuthorityMessage message) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.ControllingPlayer = message.AuthorityOwner; - } - - public override void OnReceiveRemote(bool server, QuantumAuthorityMessage message) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.ControllingPlayer = message.AuthorityOwner; - if (obj.ControllingPlayer == 0 && obj.IsEnabled) - { - // object has no owner, but is still active for this player. request ownership - QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, message.ObjectId, QSBPlayerManager.LocalPlayerId); - } - } - } -} diff --git a/QSB/QuantumSync/Events/QuantumAuthorityMessage.cs b/QSB/QuantumSync/Events/QuantumAuthorityMessage.cs deleted file mode 100644 index 9a261d7d..00000000 --- a/QSB/QuantumSync/Events/QuantumAuthorityMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.QuantumSync.Events -{ - public class QuantumAuthorityMessage : WorldObjectMessage - { - public uint AuthorityOwner { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - AuthorityOwner = reader.ReadUInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(AuthorityOwner); - } - } -} \ No newline at end of file diff --git a/QSB/QuantumSync/Events/QuantumShuffleEvent.cs b/QSB/QuantumSync/Events/QuantumShuffleEvent.cs deleted file mode 100644 index 91f0bfd1..00000000 --- a/QSB/QuantumSync/Events/QuantumShuffleEvent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using QSB.Events; -using QSB.QuantumSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.QuantumSync.Events -{ - public class QuantumShuffleEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBQuantumShuffle, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBQuantumShuffle, Handler); - - private void Handler(int objid, int[] indexArray) => SendEvent(CreateMessage(objid, indexArray)); - - private QuantumShuffleMessage CreateMessage(int objid, int[] indexArray) => new() - { - AboutId = LocalPlayerId, - ObjectId = objid, - IndexArray = indexArray - }; - - public override void OnReceiveRemote(bool server, QuantumShuffleMessage message) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.ShuffleObjects(message.IndexArray); - } - } -} diff --git a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs b/QSB/QuantumSync/Events/SocketStateChangeEvent.cs deleted file mode 100644 index 3870b9b4..00000000 --- a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs +++ /dev/null @@ -1,39 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.QuantumSync.WorldObjects; -using QSB.Utility; -using QSB.WorldSync; -using UnityEngine; - -namespace QSB.QuantumSync.Events -{ - public class SocketStateChangeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBSocketStateChange, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBSocketStateChange, Handler); - - private void Handler(int objid, int socketid, Quaternion localRotation) => SendEvent(CreateMessage(objid, socketid, localRotation)); - - private SocketStateChangeMessage CreateMessage(int objid, int socketid, Quaternion localRotation) => new() - { - AboutId = LocalPlayerId, - ObjectId = objid, - SocketId = socketid, - LocalRotation = localRotation - }; - - public override void OnReceiveRemote(bool server, SocketStateChangeMessage message) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - if (obj.ControllingPlayer != message.FromId) - { - DebugLog.ToConsole($"Error - Got SocketStateChangeEvent for {obj.Name} from {message.FromId}, but it's currently controlled by {obj.ControllingPlayer}!", MessageType.Error); - return; - } - - obj.MoveToSocket(message); - } - } -} \ No newline at end of file diff --git a/QSB/QuantumSync/Events/SocketStateChangeMessage.cs b/QSB/QuantumSync/Events/SocketStateChangeMessage.cs deleted file mode 100644 index af4d294d..00000000 --- a/QSB/QuantumSync/Events/SocketStateChangeMessage.cs +++ /dev/null @@ -1,26 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.QuantumSync.Events -{ - public class SocketStateChangeMessage : WorldObjectMessage - { - public int SocketId { get; set; } - public Quaternion LocalRotation { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - SocketId = reader.ReadInt32(); - LocalRotation = reader.ReadQuaternion(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(SocketId); - writer.Write(LocalRotation); - } - } -} diff --git a/QSB/QuantumSync/Events/EyeProxyMoonStateChangeMessage.cs b/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs similarity index 64% rename from QSB/QuantumSync/Events/EyeProxyMoonStateChangeMessage.cs rename to QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs index 72dfdb79..033c1c38 100644 --- a/QSB/QuantumSync/Events/EyeProxyMoonStateChangeMessage.cs +++ b/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs @@ -1,33 +1,22 @@ using QSB.Messaging; using QSB.QuantumSync.WorldObjects; using QSB.Utility; -using QSB.WorldSync; using QuantumUNET.Transport; using UnityEngine; -namespace QSB.QuantumSync.Events +namespace QSB.QuantumSync.Messages { internal class EyeProxyMoonStateChangeMessage : QSBWorldObjectMessage { private bool Active; private float Angle; - public EyeProxyMoonStateChangeMessage(QSBEyeProxyQuantumMoon moon, bool active, float angle) + public EyeProxyMoonStateChangeMessage(bool active, float angle) { - ObjectId = moon.ObjectId; Active = active; Angle = angle; } - public EyeProxyMoonStateChangeMessage() { } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Active = reader.ReadBoolean(); - Angle = reader.ReadSingle(); - } - public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); @@ -35,14 +24,20 @@ namespace QSB.QuantumSync.Events writer.Write(Angle); } + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + Active = reader.ReadBoolean(); + Angle = reader.ReadSingle(); + } + public override void OnReceiveRemote() { DebugLog.DebugWrite($"Get moon state active:{Active} angle:{Angle}"); - var moon = QSBWorldSync.GetWorldFromId(ObjectId); - moon.AttachedObject._moonStateRoot.SetActive(Active); + WorldObject.AttachedObject._moonStateRoot.SetActive(Active); if (Angle != -1f) { - moon.AttachedObject.transform.localEulerAngles = new Vector3(0f, Angle, 0f); + WorldObject.AttachedObject.transform.localEulerAngles = new Vector3(0f, Angle, 0f); } } } diff --git a/QSB/QuantumSync/Messages/MoonStateChangeMessage.cs b/QSB/QuantumSync/Messages/MoonStateChangeMessage.cs new file mode 100644 index 00000000..1450c542 --- /dev/null +++ b/QSB/QuantumSync/Messages/MoonStateChangeMessage.cs @@ -0,0 +1,87 @@ +using QSB.Messaging; +using QSB.WorldSync; +using QuantumUNET.Transport; +using System.Linq; +using UnityEngine; + +namespace QSB.QuantumSync.Messages +{ + public class MoonStateChangeMessage : QSBMessage + { + private int StateIndex; + private Vector3 OnUnitSphere; + private int OrbitAngle; + + public MoonStateChangeMessage(int stateIndex, Vector3 onUnitSphere, int orbitAngle) + { + StateIndex = stateIndex; + OnUnitSphere = onUnitSphere; + OrbitAngle = orbitAngle; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(StateIndex); + writer.Write(OnUnitSphere); + writer.Write(OrbitAngle); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + StateIndex = reader.ReadInt32(); + OnUnitSphere = reader.ReadVector3(); + OrbitAngle = reader.ReadInt32(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var moon = Locator.GetQuantumMoon(); + var wasPlayerEntangled = moon.IsPlayerEntangled(); + var location = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent(), moon.transform); + var moonBody = moon._moonBody; + var constantForceDetector = (ConstantForceDetector)moonBody.GetAttachedForceDetector(); + var orbits = moon._orbits; + var orbit = orbits.First(x => x.GetStateIndex() == StateIndex); + var orbitRadius = orbit.GetOrbitRadius(); + var owRigidbody = orbit.GetAttachedOWRigidbody(); + var position = OnUnitSphere * orbitRadius + owRigidbody.GetWorldCenterOfMass(); + moonBody.transform.position = position; + if (!Physics.autoSyncTransforms) + { + Physics.SyncTransforms(); + } + + constantForceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true); + moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, OrbitAngle) + owRigidbody.GetVelocity()); + moon._stateIndex = StateIndex; + + if (moon.IsPlayerInside()) + { + moon.SetSurfaceState(StateIndex); + } + else + { + moon.SetSurfaceState(-1); + moon._quantumSignal.SetSignalActivation(StateIndex != 5); + } + + moon._referenceFrameVolume.gameObject.SetActive(StateIndex != 5); + moonBody.SetIsTargetable(StateIndex != 5); + foreach (var obj in moon._deactivateAtEye) + { + obj.SetActive(StateIndex != 5); + } + + GlobalMessenger.FireEvent("QuantumMoonChangeState", moonBody); + + if (wasPlayerEntangled) + { + Locator.GetPlayerTransform().GetComponent().MoveToRelativeLocation(location, moon.transform); + } + } + } +} diff --git a/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs b/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs new file mode 100644 index 00000000..481e4736 --- /dev/null +++ b/QSB/QuantumSync/Messages/MultiStateChangeMessage.cs @@ -0,0 +1,48 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.QuantumSync.WorldObjects; +using QSB.Utility; +using QuantumUNET.Transport; + +namespace QSB.QuantumSync.Messages +{ + internal class MultiStateChangeMessage : QSBWorldObjectMessage + { + private int StateIndex; + + public MultiStateChangeMessage(int stateIndex) => StateIndex = stateIndex; + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(StateIndex); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + StateIndex = reader.ReadInt32(); + } + + public override void OnReceiveLocal() + { + if (!QSBCore.ShowQuantumDebugBoxes) + { + return; + } + + WorldObject.DebugBoxText.text = StateIndex.ToString(); + } + + public override void OnReceiveRemote() + { + if (WorldObject.ControllingPlayer != From) + { + DebugLog.ToConsole($"Error - Got MultiStateChangeEvent for {WorldObject.Name} from {From}, but it's currently controlled by {WorldObject.ControllingPlayer}!", MessageType.Error); + return; + } + + WorldObject.ChangeState(StateIndex); + } + } +} \ No newline at end of file diff --git a/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs new file mode 100644 index 00000000..cf75e73d --- /dev/null +++ b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs @@ -0,0 +1,60 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.QuantumSync.WorldObjects; +using QuantumUNET.Transport; + +namespace QSB.QuantumSync.Messages +{ + public class QuantumAuthorityMessage : QSBWorldObjectMessage + { + private uint AuthorityOwner; + + public QuantumAuthorityMessage(uint authorityOwner) => AuthorityOwner = authorityOwner; + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(AuthorityOwner); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + AuthorityOwner = reader.ReadUInt32(); + } + + public override bool ShouldReceive + { + get + { + if (!base.ShouldReceive) + { + return false; + } + + // Deciding if to change the object's owner + // Message + // | = 0 | > 0 | + // = 0 | No | Yes | + // > 0 | Yes | No | + // if Obj==Message then No + // Obj + + return (WorldObject.ControllingPlayer == 0 || AuthorityOwner == 0) + && WorldObject.ControllingPlayer != AuthorityOwner; + } + } + + public override void OnReceiveLocal() => WorldObject.ControllingPlayer = AuthorityOwner; + + public override void OnReceiveRemote() + { + WorldObject.ControllingPlayer = AuthorityOwner; + if (WorldObject.ControllingPlayer == 00 && WorldObject.IsEnabled) + { + // object has no owner, but is still active for this player. request ownership + WorldObject.SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); + } + } + } +} diff --git a/QSB/QuantumSync/Events/QuantumShuffleMessage.cs b/QSB/QuantumSync/Messages/QuantumShuffleMessage.cs similarity index 54% rename from QSB/QuantumSync/Events/QuantumShuffleMessage.cs rename to QSB/QuantumSync/Messages/QuantumShuffleMessage.cs index 55fef5ff..1050e48c 100644 --- a/QSB/QuantumSync/Events/QuantumShuffleMessage.cs +++ b/QSB/QuantumSync/Messages/QuantumShuffleMessage.cs @@ -1,19 +1,16 @@ -using QSB.WorldSync.Events; +using QSB.Messaging; +using QSB.QuantumSync.WorldObjects; using QuantumUNET.Transport; using System; using System.Linq; -namespace QSB.QuantumSync.Events +namespace QSB.QuantumSync.Messages { - public class QuantumShuffleMessage : WorldObjectMessage + internal class QuantumShuffleMessage : QSBWorldObjectMessage { - public int[] IndexArray { get; set; } + private int[] IndexArray; - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - IndexArray = Array.ConvertAll(reader.ReadBytesAndSize(), Convert.ToInt32); - } + public QuantumShuffleMessage(int[] indexArray) => IndexArray = indexArray; public override void Serialize(QNetworkWriter writer) { @@ -21,5 +18,13 @@ namespace QSB.QuantumSync.Events var temp = IndexArray.Select(x => (byte)x).ToArray(); writer.WriteBytesAndSize(temp, temp.Length); } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + IndexArray = Array.ConvertAll(reader.ReadBytesAndSize(), Convert.ToInt32); + } + + public override void OnReceiveRemote() => WorldObject.ShuffleObjects(IndexArray); } } diff --git a/QSB/QuantumSync/Messages/SocketStateChangeMessage.cs b/QSB/QuantumSync/Messages/SocketStateChangeMessage.cs new file mode 100644 index 00000000..70a9aed8 --- /dev/null +++ b/QSB/QuantumSync/Messages/SocketStateChangeMessage.cs @@ -0,0 +1,46 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.QuantumSync.WorldObjects; +using QSB.Utility; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.QuantumSync.Messages +{ + internal class SocketStateChangeMessage : QSBWorldObjectMessage + { + private int SocketId; + private Quaternion LocalRotation; + + public SocketStateChangeMessage(int socketId, Quaternion localRotation) + { + SocketId = socketId; + LocalRotation = localRotation; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(SocketId); + writer.Write(LocalRotation); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + SocketId = reader.ReadInt32(); + LocalRotation = reader.ReadQuaternion(); + } + + public override void OnReceiveRemote() + { + if (WorldObject.ControllingPlayer != From) + { + DebugLog.ToConsole($"Error - Got SocketStateChangeEvent for {WorldObject.Name} from {From}, but it's currently controlled by {WorldObject.ControllingPlayer}!", MessageType.Error); + return; + } + + WorldObject.MoveToSocket(From, SocketId, LocalRotation); + } + } +} \ No newline at end of file diff --git a/QSB/QuantumSync/Patches/QuantumPatches.cs b/QSB/QuantumSync/Patches/QuantumPatches.cs index e8508604..f1b99f60 100644 --- a/QSB/QuantumSync/Patches/QuantumPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumPatches.cs @@ -1,14 +1,15 @@ using HarmonyLib; using OWML.Common; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; +using QSB.Player.Messages; +using QSB.QuantumSync.Messages; using QSB.QuantumSync.WorldObjects; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; using System.Linq; -using System.Reflection; using UnityEngine; namespace QSB.QuantumSync.Patches @@ -36,7 +37,7 @@ namespace QSB.QuantumSync.Patches { if (WorldObjectManager.AllObjectsReady) { - var socketedWorldObject = QSBWorldSync.GetWorldFromUnity(__instance); + var socketedWorldObject = __instance.GetWorldObject(); if (socketedWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) { return false; @@ -150,8 +151,8 @@ namespace QSB.QuantumSync.Patches return; } - var objectWorldObject = QSBWorldSync.GetWorldFromUnity(__instance); - var socketWorldObject = QSBWorldSync.GetWorldFromUnity(socket); + var objectWorldObject = __instance.GetWorldObject(); + var socketWorldObject = socket.GetWorldObject(); if (objectWorldObject == null) { @@ -164,11 +165,9 @@ namespace QSB.QuantumSync.Patches return; } - QSBEventManager.FireEvent( - EventNames.QSBSocketStateChange, - objectWorldObject.ObjectId, - socketWorldObject.ObjectId, - __instance.transform.localRotation); + objectWorldObject.SendMessage(new SocketStateChangeMessage( + socketWorldObject.ObjectId, + __instance.transform.localRotation)); } [HarmonyPrefix] @@ -180,7 +179,7 @@ namespace QSB.QuantumSync.Patches QSBQuantumShuffleObject shuffleWorldObject = default; if (WorldObjectManager.AllObjectsReady) { - shuffleWorldObject = QSBWorldSync.GetWorldFromUnity(__instance); + shuffleWorldObject = __instance.GetWorldObject(); if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) { return false; @@ -204,10 +203,7 @@ namespace QSB.QuantumSync.Patches if (WorldObjectManager.AllObjectsReady) { - QSBEventManager.FireEvent( - EventNames.QSBQuantumShuffle, - shuffleWorldObject.ObjectId, - __instance._indexList.ToArray()); + shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray())); __result = true; } @@ -223,7 +219,7 @@ namespace QSB.QuantumSync.Patches return true; } - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbObj = __instance.GetWorldObject(); if (qsbObj.ControllingPlayer == 0) { return true; @@ -259,7 +255,7 @@ namespace QSB.QuantumSync.Patches return true; } - var qsbObj = QSBWorldSync.GetWorldFromUnity(__instance); + var qsbObj = __instance.GetWorldObject(); if (qsbObj.ControllingPlayer == 0 && qsbObj.CurrentState == -1) { return true; @@ -284,7 +280,7 @@ namespace QSB.QuantumSync.Patches } var allMultiStates = QSBWorldSync.GetWorldObjects(); - var stateObject = QSBWorldSync.GetWorldFromUnity(__instance); + var stateObject = __instance.GetWorldObject(); var owner = allMultiStates.FirstOrDefault(x => x.QuantumStates.Contains(stateObject)); if (owner == default) { @@ -298,10 +294,7 @@ namespace QSB.QuantumSync.Patches } var stateIndex = owner.QuantumStates.IndexOf(stateObject); - QSBEventManager.FireEvent( - EventNames.QSBMultiStateChange, - owner.ObjectId, - stateIndex); + owner.SendMessage(new MultiStateChangeMessage(stateIndex)); } [HarmonyPrefix] @@ -356,7 +349,7 @@ namespace QSB.QuantumSync.Patches [HarmonyPatch(typeof(QuantumShrine), nameof(QuantumShrine.ChangeQuantumState))] public static bool QuantumShrine_ChangeQuantumState(QuantumShrine __instance) { - var shrineWorldObject = QSBWorldSync.GetWorldFromUnity(__instance); + var shrineWorldObject = __instance.GetWorldObject(); var isInControl = shrineWorldObject.ControllingPlayer == QSBPlayerManager.LocalPlayerId; return isInControl; } @@ -372,7 +365,7 @@ namespace QSB.QuantumSync.Patches __instance._isPlayerInside = true; __instance._fading = true; __instance._exteriorLightController.FadeTo(0f, 1f); - QSBEventManager.FireEvent(EventNames.QSBEnterShrine); + new EnterLeaveMessage(EnterLeaveType.EnterShrine).Send(); } else if (hitObj.CompareTag("ProbeDetector")) { @@ -393,7 +386,7 @@ namespace QSB.QuantumSync.Patches __instance._isPlayerInside = false; __instance._fading = true; __instance._exteriorLightController.FadeTo(1f, 1f); - QSBEventManager.FireEvent(EventNames.QSBExitShrine); + new EnterLeaveMessage(EnterLeaveType.ExitShrine).Send(); } else if (hitObj.CompareTag("ProbeDetector")) { @@ -420,8 +413,8 @@ namespace QSB.QuantumSync.Patches { __instance._isPlayerInside = true; __instance.SetSurfaceState(__instance._stateIndex); - Locator.GetShipLogManager().RevealFact(__instance._revealFactID, true, true); - QSBEventManager.FireEvent("PlayerEnterQuantumMoon"); + Locator.GetShipLogManager().RevealFact(__instance._revealFactID); + GlobalMessenger.FireEvent(OWEvents.PlayerEnterQuantumMoon); } else { @@ -443,7 +436,7 @@ namespace QSB.QuantumSync.Patches } __instance.SetSurfaceState(-1); - QSBEventManager.FireEvent("PlayerExitQuantumMoon"); + GlobalMessenger.FireEvent(OWEvents.PlayerExitQuantumMoon); } else { diff --git a/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs b/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs index 184b6194..282b42ff 100644 --- a/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs @@ -3,7 +3,6 @@ using QSB.Patches; using QSB.Player; using QSB.Utility; using System.Linq; -using System.Reflection; using UnityEngine; namespace QSB.QuantumSync.Patches @@ -16,12 +15,12 @@ namespace QSB.QuantumSync.Patches [HarmonyPostfix] [HarmonyPatch(typeof(Shape), nameof(Shape.OnEnable))] public static void Shape_OnEnable(Shape __instance) - => __instance.RaiseEvent("OnShapeActivated", __instance); + => __instance.RaiseEvent(nameof(__instance.OnShapeActivated), __instance); [HarmonyPostfix] [HarmonyPatch(typeof(Shape), nameof(Shape.OnDisable))] public static void Shape_OnDisable(Shape __instance) - => __instance.RaiseEvent("OnShapeDeactivated", __instance); + => __instance.RaiseEvent(nameof(__instance.OnShapeDeactivated), __instance); // ShapeVisibilityTracker patches @@ -45,14 +44,12 @@ namespace QSB.QuantumSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(RendererVisibilityTracker), nameof(RendererVisibilityTracker.IsVisibleUsingCameraFrustum))] - public static bool RendererVisibilityTracker_IsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result, Renderer ____renderer, bool ____checkFrustumOcclusion) + public static bool RendererVisibilityTracker_IsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result) { __result = QSBPlayerManager.GetPlayersWithCameras() - .Any(x => GeometryUtility.TestPlanesAABB(x.Camera.GetFrustumPlanes(), ____renderer.bounds)) - && (!____checkFrustumOcclusion || QSBPlayerManager.GetPlayersWithCameras() - .Any(x => !(bool)__instance.GetType() - .GetMethod("IsOccludedFromPosition", BindingFlags.NonPublic | BindingFlags.Instance) - .Invoke(__instance, new object[] { x.Camera.transform.position }))); + .Any(x => GeometryUtility.TestPlanesAABB(x.Camera.GetFrustumPlanes(), __instance._renderer.bounds)) + && (!__instance._checkFrustumOcclusion || QSBPlayerManager.GetPlayersWithCameras() + .Any(x => !__instance.IsOccludedFromPosition(x.Camera.transform.position))); return false; } @@ -60,50 +57,50 @@ namespace QSB.QuantumSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(VisibilityObject), nameof(VisibilityObject.CheckIllumination))] - public static bool VisibilityObject_CheckIllumination(VisibilityObject __instance, ref bool __result, bool ____checkIllumination, Vector3 ____localIlluminationOffset, float ____illuminationRadius, Light[] ____lightSources) + public static bool VisibilityObject_CheckIllumination(VisibilityObject __instance, ref bool __result) { - if (!____checkIllumination) + if (!__instance._checkIllumination) { __result = true; return false; } - var point = __instance.transform.TransformPoint(____localIlluminationOffset); + var point = __instance.transform.TransformPoint(__instance._localIlluminationOffset); var tupleFlashlights = QSBPlayerManager.GetPlayerFlashlights(); var localFlashlight = tupleFlashlights.Item1; var playerFlashlights = tupleFlashlights.Item2; // local player flashlight - if (localFlashlight.CheckIlluminationAtPoint(point, ____illuminationRadius)) + if (localFlashlight.CheckIlluminationAtPoint(point, __instance._illuminationRadius)) { __result = true; return false; } // all other player flashlights - if (playerFlashlights.Any(x => x.CheckIlluminationAtPoint(point, ____illuminationRadius))) + if (playerFlashlights.Any(x => x.CheckIlluminationAtPoint(point, __instance._illuminationRadius))) { __result = true; return false; } // BUG : Implement checking for other probes! - if (Locator.GetProbe() != null && Locator.GetProbe().IsLaunched() && Locator.GetProbe().CheckIlluminationAtPoint(point, ____illuminationRadius)) + if (Locator.GetProbe() != null && Locator.GetProbe().IsLaunched() && Locator.GetProbe().CheckIlluminationAtPoint(point, __instance._illuminationRadius)) { __result = true; return false; } // BUG : Implement checking for other player's thrusters! - if (Locator.GetThrusterLightTracker().CheckIlluminationAtPoint(point, ____illuminationRadius)) + if (Locator.GetThrusterLightTracker().CheckIlluminationAtPoint(point, __instance._illuminationRadius)) { __result = true; return false; } - if (____lightSources != null) + if (__instance._lightSources != null) { - foreach (var light in ____lightSources) + foreach (var light in __instance._lightSources) { if (light.intensity > 0f && light.range > 0f) { diff --git a/QSB/QuantumSync/Patches/ServerQuantumPatches.cs b/QSB/QuantumSync/Patches/ServerQuantumPatches.cs index af28b701..916e05d7 100644 --- a/QSB/QuantumSync/Patches/ServerQuantumPatches.cs +++ b/QSB/QuantumSync/Patches/ServerQuantumPatches.cs @@ -1,11 +1,9 @@ using HarmonyLib; -using QSB.Events; using QSB.Messaging; using QSB.Patches; using QSB.Player; -using QSB.QuantumSync.Events; +using QSB.QuantumSync.Messages; using QSB.QuantumSync.WorldObjects; -using QSB.Utility; using QSB.WorldSync; using System.Linq; using UnityEngine; @@ -21,11 +19,16 @@ namespace QSB.QuantumSync.Patches [HarmonyPatch(typeof(EyeProxyQuantumMoon), nameof(EyeProxyQuantumMoon.ChangeQuantumState))] public static bool EyeProxyQuantumMoon_ChangeQuantumState(EyeProxyQuantumMoon __instance, ref bool __result, bool skipInstantVisibilityCheck) { + if (!WorldObjectManager.AllObjectsReady) + { + return true; + } + + var qsbEyeProxyQuantumMoon = __instance.GetWorldObject(); if (TimeLoop.GetSecondsRemaining() > 0f && Random.value > 0.3f) { __instance._moonStateRoot.SetActive(false); - DebugLog.DebugWrite($"Disable"); - new EyeProxyMoonStateChangeMessage(QSBWorldSync.GetWorldFromUnity(__instance), false, -1f).Send(); + qsbEyeProxyQuantumMoon.SendMessage(new EyeProxyMoonStateChangeMessage(false, -1f)); __result = true; return false; } @@ -37,8 +40,7 @@ namespace QSB.QuantumSync.Patches __instance.transform.localEulerAngles = new Vector3(0f, angle, 0f); if (skipInstantVisibilityCheck || !__instance.CheckVisibilityInstantly()) { - DebugLog.DebugWrite($"Send active angle:{angle}"); - new EyeProxyMoonStateChangeMessage(QSBWorldSync.GetWorldFromUnity(__instance), true, angle).Send(); + qsbEyeProxyQuantumMoon.SendMessage(new EyeProxyMoonStateChangeMessage(true, angle)); __result = true; return false; } @@ -227,7 +229,7 @@ namespace QSB.QuantumSync.Patches : (__instance._stateSkipCounts[k] + 1); } - QSBEventManager.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle); + new MoonStateChangeMessage(stateIndex, onUnitSphere, orbitAngle).Send(); } private static void DealWithNewPosition(QuantumMoon __instance) @@ -239,7 +241,7 @@ namespace QSB.QuantumSync.Patches else { __instance.SetSurfaceState(-1); - __instance._quantumSignal.SetSignalActivation(__instance._stateIndex != 5, 2f); + __instance._quantumSignal.SetSignalActivation(__instance._stateIndex != 5); } __instance._referenceFrameVolume.gameObject.SetActive(__instance._stateIndex != 5); diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index 879e9a94..42ff464f 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -1,13 +1,13 @@ using OWML.Common; -using QSB.Events; +using QSB.Messaging; using QSB.Player; +using QSB.QuantumSync.Messages; using QSB.QuantumSync.WorldObjects; using QSB.Utility; using QSB.WorldSync; using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using UnityEngine; namespace QSB.QuantumSync @@ -17,12 +17,10 @@ namespace QSB.QuantumSync public override WorldObjectType WorldObjectType => WorldObjectType.Both; public static QuantumShrine Shrine { get; private set; } - public static QuantumManager Instance { get; private set; } public override void Awake() { base.Awake(); - Instance = this; QSBPlayerManager.OnRemovePlayer += PlayerLeave; } @@ -55,14 +53,11 @@ namespace QSB.QuantumSync return; } - var quantumObjects = QSBWorldSync.GetWorldObjects().ToList(); - for (var i = 0; i < quantumObjects.Count; i++) + foreach (var obj in QSBWorldSync.GetWorldObjects()) { - var obj = quantumObjects[i]; if (obj.ControllingPlayer == playerId) { - var idToSend = obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : 0u; - QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, i, idToSend); + obj.SendMessage(new QuantumAuthorityMessage(obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : 0u)); } } } @@ -118,8 +113,6 @@ namespace QSB.QuantumSync return new Tuple>(false, new List()); } - var frustumMethod = tracker.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance); - var playersWhoCanSee = new List(); var foundPlayers = false; foreach (var player in playersWithCameras) @@ -130,7 +123,7 @@ namespace QSB.QuantumSync continue; } - var isInFrustum = (bool)frustumMethod.Invoke(tracker, new object[] { player.Camera.GetFrustumPlanes() }); + var isInFrustum = tracker.IsInFrustum(player.Camera.GetFrustumPlanes()); if (isInFrustum) { playersWhoCanSee.Add(player); @@ -142,19 +135,19 @@ namespace QSB.QuantumSync } public static bool IsVisible(ShapeVisibilityTracker tracker, bool ignoreLocalCamera) => tracker.gameObject.activeInHierarchy - && IsVisibleUsingCameraFrustum(tracker, ignoreLocalCamera).Item1 - && QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera) - .Any(x => VisibilityOccluder.CanYouSee(tracker, x.Camera.mainCamera.transform.position)); + && IsVisibleUsingCameraFrustum(tracker, ignoreLocalCamera).Item1 + && QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera) + .Any(x => VisibilityOccluder.CanYouSee(tracker, x.Camera.mainCamera.transform.position)); public static IEnumerable GetEntangledPlayers(QuantumObject obj) { - if (!WorldObjectManager.AllObjectsReady) + if (!AllObjectsReady) { return Enumerable.Empty(); } - var worldObj = QSBWorldSync.GetWorldFromUnity(obj); + var worldObj = obj.GetWorldObject(); return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj); } } -} +} \ No newline at end of file diff --git a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs index 71ecf9ce..b18912fd 100644 --- a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs @@ -35,7 +35,7 @@ namespace QSB.QuantumSync.WorldObjects { FinishDelayedReady(); - QuantumStates = AttachedObject._states.Select(QSBWorldSync.GetWorldFromUnity).ToList(); + QuantumStates = AttachedObject._states.Select(QSBWorldSync.GetWorldObject).ToList(); if (QuantumStates.Any(x => x == null)) { diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index 68b70870..d4a4c28b 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -1,6 +1,7 @@ using OWML.Common; -using QSB.Events; +using QSB.Messaging; using QSB.Player; +using QSB.QuantumSync.Messages; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; @@ -173,9 +174,8 @@ namespace QSB.QuantumSync.WorldObjects return; } - var id = ObjectId; // no one is controlling this object right now, request authority - QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); } private void OnDisable(Shape s) @@ -204,7 +204,7 @@ namespace QSB.QuantumSync.WorldObjects var id = ObjectId; // send event to other players that we're releasing authority - QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, 0u); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); } } } diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumShuffleObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumShuffleObject.cs index b02fed69..5b4ad95b 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumShuffleObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumShuffleObject.cs @@ -1,14 +1,11 @@ -using OWML.Utils; -using UnityEngine; - -namespace QSB.QuantumSync.WorldObjects +namespace QSB.QuantumSync.WorldObjects { internal class QSBQuantumShuffleObject : QSBQuantumObject { public void ShuffleObjects(int[] indexArray) { - var shuffledObjects = AttachedObject.GetValue("_shuffledObjects"); - var localPositions = AttachedObject.GetValue("_localPositions"); + var shuffledObjects = AttachedObject._shuffledObjects; + var localPositions = AttachedObject._localPositions; for (var i = 0; i < shuffledObjects.Length; i++) { shuffledObjects[i].localPosition = localPositions[indexArray[i]]; diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumSocket.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumSocket.cs index 5c1d2336..23e7d857 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumSocket.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumSocket.cs @@ -1,13 +1,8 @@ -using OWML.Utils; -using QSB.WorldSync; +using QSB.WorldSync; namespace QSB.QuantumSync.WorldObjects { internal class QSBQuantumSocket : WorldObject { - public override void Init() - { - AttachedObject.GetType().SetValue("_randomYRotation", false); - } } -} \ No newline at end of file +} diff --git a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs index 89f38cfd..4669bf54 100644 --- a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs @@ -1,9 +1,7 @@ using OWML.Common; using QSB.Player; -using QSB.QuantumSync.Events; using QSB.Utility; using QSB.WorldSync; -using System.Reflection; using UnityEngine; using UnityEngine.UI; @@ -16,6 +14,7 @@ namespace QSB.QuantumSync.WorldObjects public override void Init() { base.Init(); + AttachedObject._randomYRotation = false; if (QSBCore.ShowQuantumDebugBoxes) { DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, $"Socketed\r\nid:{ObjectId}").GetComponent(); @@ -31,19 +30,19 @@ namespace QSB.QuantumSync.WorldObjects } } - public void MoveToSocket(SocketStateChangeMessage message) + public void MoveToSocket(uint playerId, int socketId, Quaternion localRotation) { - var qsbSocket = QSBWorldSync.GetWorldFromId(message.SocketId); + var qsbSocket = socketId.GetWorldObject(); if (qsbSocket == null) { - DebugLog.ToConsole($"Couldn't find socket id {message.SocketId}", MessageType.Error); + DebugLog.ToConsole($"Couldn't find socket id {socketId}", MessageType.Error); return; } var socket = qsbSocket.AttachedObject; if (socket == null) { - DebugLog.ToConsole($"QSBSocket id {message.SocketId} has no attached socket.", MessageType.Error); + DebugLog.ToConsole($"QSBSocket id {socketId} has no attached socket.", MessageType.Error); return; } @@ -51,7 +50,7 @@ namespace QSB.QuantumSync.WorldObjects var component = Locator.GetPlayerTransform().GetComponent(); var location = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent(), AttachedObject.transform); - AttachedObject.GetType().GetMethod("MoveToSocket", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(AttachedObject, new object[] { socket }); + AttachedObject.MoveToSocket(socket); if (wasEntangled) { @@ -60,11 +59,11 @@ namespace QSB.QuantumSync.WorldObjects if (QuantumManager.Shrine != AttachedObject) { - AttachedObject.transform.localRotation = message.LocalRotation; + AttachedObject.transform.localRotation = localRotation; } else { - var playerToShrine = QSBPlayerManager.GetPlayer(message.FromId).Body.transform.position - AttachedObject.transform.position; + var playerToShrine = QSBPlayerManager.GetPlayer(playerId).Body.transform.position - AttachedObject.transform.position; var projectOnPlace = Vector3.ProjectOnPlane(playerToShrine, AttachedObject.transform.up); var angle = OWMath.Angle(AttachedObject.transform.forward, projectOnPlace, AttachedObject.transform.up); angle = OWMath.RoundToNearestMultiple(angle, 120f); diff --git a/QSB/RespawnSync/Events/PlayerRespawnEvent.cs b/QSB/RespawnSync/Events/PlayerRespawnEvent.cs deleted file mode 100644 index e5951b8d..00000000 --- a/QSB/RespawnSync/Events/PlayerRespawnEvent.cs +++ /dev/null @@ -1,39 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.RespawnSync.Events -{ - internal class PlayerRespawnEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBPlayerRespawn, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBPlayerRespawn, Handler); - - private void Handler(uint playerId) => SendEvent(CreateMessage(playerId)); - - private PlayerMessage CreateMessage(uint playerId) => new() - { - AboutId = playerId - }; - - public override void OnReceiveLocal(bool server, PlayerMessage message) - => OnReceiveRemote(server, message); - - public override void OnReceiveRemote(bool server, PlayerMessage message) - { - if (message.AboutId == LocalPlayerId) - { - RespawnManager.Instance.Respawn(); - ClientStateManager.Instance.OnRespawn(); - } - - RespawnManager.Instance.OnPlayerRespawn(QSBPlayerManager.GetPlayer(message.AboutId)); - } - } -} diff --git a/QSB/RespawnSync/Messages/PlayerRespawnMessage.cs b/QSB/RespawnSync/Messages/PlayerRespawnMessage.cs new file mode 100644 index 00000000..e9c3a632 --- /dev/null +++ b/QSB/RespawnSync/Messages/PlayerRespawnMessage.cs @@ -0,0 +1,39 @@ +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.Player; +using QuantumUNET.Transport; + +namespace QSB.RespawnSync.Messages +{ + internal class PlayerRespawnMessage : QSBMessage + { + private uint PlayerId; + + public PlayerRespawnMessage(uint playerId) => PlayerId = playerId; + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerId = reader.ReadUInt32(); + } + + public override void OnReceiveLocal() => OnReceiveRemote(); + + public override void OnReceiveRemote() + { + if (PlayerId == QSBPlayerManager.LocalPlayerId) + { + RespawnManager.Instance.Respawn(); + ClientStateManager.Instance.OnRespawn(); + } + + RespawnManager.Instance.OnPlayerRespawn(QSBPlayerManager.GetPlayer(PlayerId)); + } + } +} \ No newline at end of file diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index 2fe268d8..c3aa0177 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -1,8 +1,9 @@ -using QSB.DeathSync; -using QSB.Events; +using QSB.DeathSync.Messages; +using QSB.Messaging; using QSB.Patches; using QSB.Player; using QSB.Player.TransformSync; +using QSB.RespawnSync.Messages; using QSB.Utility; using System.Collections.Generic; using System.Linq; @@ -128,7 +129,7 @@ namespace QSB.RespawnSync mapController.ExitMapView(); var cameraEffectController = Locator.GetPlayerCamera().GetComponent(); - cameraEffectController.OpenEyes(1f, false); + cameraEffectController.OpenEyes(1f); } public void OnPlayerDeath(PlayerInfo player) @@ -148,7 +149,7 @@ namespace QSB.RespawnSync if (deadPlayersCount == QSBPlayerManager.PlayerList.Count) { - QSBEventManager.FireEvent(EventNames.QSBEndLoop, EndLoopReason.AllPlayersDead); + new EndLoopMessage().Send(); return; } @@ -174,7 +175,7 @@ namespace QSB.RespawnSync public void RespawnSomePlayer() { var playerToRespawn = _playersPendingRespawn.First(); - QSBEventManager.FireEvent(EventNames.QSBPlayerRespawn, playerToRespawn.PlayerId); + new PlayerRespawnMessage(playerToRespawn.PlayerId).Send(); } private void UpdateRespawnNotification() diff --git a/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs b/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs deleted file mode 100644 index ccb0c7fd..00000000 --- a/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs +++ /dev/null @@ -1,60 +0,0 @@ -using QSB.CampfireSync.WorldObjects; -using QSB.Events; -using QSB.Player; -using QSB.Utility; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.RoastingSync.Events -{ - internal class EnterExitRoastingEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.EnterRoastingMode, (Campfire fire) => Handler(fire, true)); - GlobalMessenger.AddListener(EventNames.ExitRoastingMode, () => Handler(null, false)); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.EnterRoastingMode, (Campfire fire) => Handler(fire, true)); - GlobalMessenger.RemoveListener(EventNames.ExitRoastingMode, () => Handler(null, false)); - } - - private void Handler(Campfire campfire, bool roasting) - { - if (campfire == null) - { - SendEvent(CreateMessage(-1, roasting)); - return; - } - - var qsbObj = QSBWorldSync.GetWorldFromUnity(campfire); - SendEvent(CreateMessage(qsbObj.ObjectId, roasting)); - } - - private BoolWorldObjectMessage CreateMessage(int objectId, bool roasting) => new() - { - AboutId = LocalPlayerId, - State = roasting, - ObjectId = objectId - }; - - public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) - { - if (message.State && message.ObjectId == -1) - { - DebugLog.ToConsole($"Error - Null campfire supplied for start roasting event!", OWML.Common.MessageType.Error); - return; - } - - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.RoastingStick.SetActive(message.State); - player.Campfire = message.State - ? QSBWorldSync.GetWorldFromId(message.ObjectId) - : null; - } - } -} diff --git a/QSB/RoastingSync/Events/MarshmallowEventEvent.cs b/QSB/RoastingSync/Events/MarshmallowEventEvent.cs deleted file mode 100644 index 072f6b29..00000000 --- a/QSB/RoastingSync/Events/MarshmallowEventEvent.cs +++ /dev/null @@ -1,86 +0,0 @@ -using OWML.Utils; -using QSB.Events; -using QSB.Messaging; -using QSB.Player; -using QSB.Utility; -using QSB.WorldSync; -using System.Linq; -using UnityEngine; - -namespace QSB.RoastingSync.Events -{ - internal class MarshmallowEventEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBMarshmallowEvent, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBMarshmallowEvent, Handler); - - private void Handler(MarshmallowEventType type) => SendEvent(CreateMessage(type)); - - private EnumMessage CreateMessage(MarshmallowEventType type) => new() - { - AboutId = LocalPlayerId, - EnumValue = type - }; - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - var marshmallow = QSBPlayerManager.GetPlayer(message.AboutId).Marshmallow; - if (marshmallow == null) - { - DebugLog.ToConsole($"Warning - Marshmallow is null for player {message.AboutId}.", OWML.Common.MessageType.Warning); - return; - } - - switch (message.EnumValue) - { - case MarshmallowEventType.Burn: - marshmallow.Burn(); - break; - case MarshmallowEventType.Extinguish: - marshmallow.Extinguish(); - break; - case MarshmallowEventType.Remove: - marshmallow.RemoveMallow(); - break; - case MarshmallowEventType.Replace: - marshmallow.SpawnMallow(); - break; - case MarshmallowEventType.Shrivel: - marshmallow.Shrivel(); - break; - case MarshmallowEventType.Toss: - TossMarshmallow(message.AboutId); - break; - } - } - - private void TossMarshmallow(uint playerId) - { - var player = QSBPlayerManager.GetPlayer(playerId); - var stick = player.RoastingStick; - var stickTip = stick.transform.GetChild(0); - - var mallowPrefab = QSBWorldSync.GetUnityObjects().First().GetValue("_mallowBodyPrefab"); - - var tossedMallow = Object.Instantiate(mallowPrefab, stickTip.position, stickTip.rotation); - var rigidbody = tossedMallow.GetComponent(); - if (player.Campfire == null) - { - DebugLog.ToConsole($"Error - Campfire for {playerId} is null.", OWML.Common.MessageType.Error); - return; - } - - rigidbody.SetVelocity(player.Campfire.AttachedObject.GetAttachedOWRigidbody(false).GetPointVelocity(stickTip.position) + (stickTip.forward * 3f)); - rigidbody.SetAngularVelocity(stickTip.right * 10f); - if (player.Marshmallow == null) - { - DebugLog.ToConsole($"Error - Marshmallow for {playerId} is null.", OWML.Common.MessageType.Error); - return; - } - - tossedMallow.GetComponentInChildren().material.color = player.Marshmallow._burntColor; - } - } -} diff --git a/QSB/RoastingSync/MarshmallowEventType.cs b/QSB/RoastingSync/MarshmallowMessageType.cs similarity index 73% rename from QSB/RoastingSync/MarshmallowEventType.cs rename to QSB/RoastingSync/MarshmallowMessageType.cs index 497380a4..1535821d 100644 --- a/QSB/RoastingSync/MarshmallowEventType.cs +++ b/QSB/RoastingSync/MarshmallowMessageType.cs @@ -1,6 +1,6 @@ namespace QSB.RoastingSync { - public enum MarshmallowEventType + public enum MarshmallowMessageType { Toss, Burn, diff --git a/QSB/RoastingSync/Messages/EnterExitRoastingMessage.cs b/QSB/RoastingSync/Messages/EnterExitRoastingMessage.cs new file mode 100644 index 00000000..5a276ee6 --- /dev/null +++ b/QSB/RoastingSync/Messages/EnterExitRoastingMessage.cs @@ -0,0 +1,68 @@ +using OWML.Common; +using QSB.CampfireSync.WorldObjects; +using QSB.Messaging; +using QSB.Player; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.RoastingSync.Messages +{ + internal class EnterExitRoastingMessage : QSBBoolMessage + { + static EnterExitRoastingMessage() + { + GlobalMessenger.AddListener(OWEvents.EnterRoastingMode, campfire => Handler(campfire, true)); + GlobalMessenger.AddListener(OWEvents.ExitRoastingMode, () => Handler(null, false)); + } + + private static void Handler(Campfire campfire, bool roasting) + { + if (campfire == null) + { + new EnterExitRoastingMessage(-1, roasting).Send(); + return; + } + + var qsbObj = campfire.GetWorldObject(); + new EnterExitRoastingMessage(qsbObj.ObjectId, roasting).Send(); + } + + private int ObjectId; + + private EnterExitRoastingMessage(int objectId, bool roasting) + { + ObjectId = objectId; + Value = roasting; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ObjectId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ObjectId = reader.ReadInt32(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + if (Value && ObjectId == -1) + { + DebugLog.ToConsole($"Error - Null campfire supplied for start roasting event!", MessageType.Error); + return; + } + + var player = QSBPlayerManager.GetPlayer(From); + player.RoastingStick.SetActive(Value); + player.Campfire = Value + ? ObjectId.GetWorldObject() + : null; + } + } +} \ No newline at end of file diff --git a/QSB/RoastingSync/Messages/MarshmallowEventMessage.cs b/QSB/RoastingSync/Messages/MarshmallowEventMessage.cs new file mode 100644 index 00000000..7d8646e7 --- /dev/null +++ b/QSB/RoastingSync/Messages/MarshmallowEventMessage.cs @@ -0,0 +1,75 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Player; +using QSB.Utility; +using QSB.WorldSync; +using System.Linq; +using UnityEngine; + +namespace QSB.RoastingSync.Messages +{ + internal class MarshmallowEventMessage : QSBEnumMessage + { + public MarshmallowEventMessage(MarshmallowMessageType type) => Value = type; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + if (player.Marshmallow == null) + { + DebugLog.ToConsole($"Warning - Marshmallow is null for player {player.PlayerId}.", MessageType.Warning); + return; + } + + switch (Value) + { + case MarshmallowMessageType.Burn: + player.Marshmallow.Burn(); + break; + case MarshmallowMessageType.Extinguish: + player.Marshmallow.Extinguish(); + break; + case MarshmallowMessageType.Remove: + player.Marshmallow.RemoveMallow(); + break; + case MarshmallowMessageType.Replace: + player.Marshmallow.SpawnMallow(); + break; + case MarshmallowMessageType.Shrivel: + player.Marshmallow.Shrivel(); + break; + case MarshmallowMessageType.Toss: + TossMarshmallow(player); + break; + } + } + + private static void TossMarshmallow(PlayerInfo player) + { + var stick = player.RoastingStick; + var stickTip = stick.transform.GetChild(0); + + var mallowPrefab = QSBWorldSync.GetUnityObjects().First()._mallowBodyPrefab; + + var tossedMallow = Object.Instantiate(mallowPrefab, stickTip.position, stickTip.rotation); + var rigidbody = tossedMallow.GetComponent(); + if (player.Campfire == null) + { + DebugLog.ToConsole($"Error - Campfire for {player.PlayerId} is null.", MessageType.Error); + return; + } + + rigidbody.SetVelocity(player.Campfire.AttachedObject.GetAttachedOWRigidbody().GetPointVelocity(stickTip.position) + stickTip.forward * 3f); + rigidbody.SetAngularVelocity(stickTip.right * 10f); + if (player.Marshmallow == null) + { + DebugLog.ToConsole($"Error - Marshmallow for {player.PlayerId} is null.", MessageType.Error); + return; + } + + tossedMallow.GetComponentInChildren().material.color = player.Marshmallow._burntColor; + } + } +} diff --git a/QSB/RoastingSync/Patches/RoastingPatches.cs b/QSB/RoastingSync/Patches/RoastingPatches.cs index 60829919..7402328a 100644 --- a/QSB/RoastingSync/Patches/RoastingPatches.cs +++ b/QSB/RoastingSync/Patches/RoastingPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.RoastingSync.Messages; using UnityEngine; namespace QSB.RoastingSync.Patches @@ -14,27 +15,24 @@ namespace QSB.RoastingSync.Patches [HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.SpawnMallow))] public static bool Marshmallow_SpawnMallow() { - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Replace); + new MarshmallowEventMessage(MarshmallowMessageType.Replace).Send(); return true; } [HarmonyPrefix] [HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.Burn))] public static bool Marshmallow_Burn( - ref Marshmallow.MallowState ____mallowState, - MeshRenderer ____fireRenderer, - ref float ____toastedFraction, - ref float ____initBurnTime, - PlayerAudioController ____audioController) + Marshmallow __instance + ) { - if (____mallowState == Marshmallow.MallowState.Default) + if (__instance._mallowState == Marshmallow.MallowState.Default) { - ____fireRenderer.enabled = true; - ____toastedFraction = 1f; - ____initBurnTime = Time.time; - ____mallowState = Marshmallow.MallowState.Burning; - ____audioController.PlayMarshmallowCatchFire(); - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Burn); + __instance._fireRenderer.enabled = true; + __instance._toastedFraction = 1f; + __instance._initBurnTime = Time.time; + __instance._mallowState = Marshmallow.MallowState.Burning; + __instance._audioController.PlayMarshmallowCatchFire(); + new MarshmallowEventMessage(MarshmallowMessageType.Burn).Send(); } return false; @@ -43,14 +41,14 @@ namespace QSB.RoastingSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.Shrivel))] public static bool Marshmallow_Shrivel( - ref Marshmallow.MallowState ____mallowState, - ref float ____initShrivelTime) + Marshmallow __instance + ) { - if (____mallowState == Marshmallow.MallowState.Burning) + if (__instance._mallowState == Marshmallow.MallowState.Burning) { - ____initShrivelTime = Time.time; - ____mallowState = Marshmallow.MallowState.Shriveling; - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Shrivel); + __instance._initShrivelTime = Time.time; + __instance._mallowState = Marshmallow.MallowState.Shriveling; + new MarshmallowEventMessage(MarshmallowMessageType.Shrivel).Send(); } return false; @@ -59,100 +57,89 @@ namespace QSB.RoastingSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.RemoveMallow))] public static bool Marshmallow_RemoveMallow( - ParticleSystem ____smokeParticles, - MeshRenderer ____fireRenderer, - MeshRenderer ____mallowRenderer, - ref Marshmallow.MallowState ____mallowState, Marshmallow __instance) { - ____smokeParticles.Stop(); - ____fireRenderer.enabled = false; - ____mallowRenderer.enabled = false; - ____mallowState = Marshmallow.MallowState.Gone; + __instance._smokeParticles.Stop(); + __instance._fireRenderer.enabled = false; + __instance._mallowRenderer.enabled = false; + __instance._mallowState = Marshmallow.MallowState.Gone; __instance.enabled = false; - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Remove); + new MarshmallowEventMessage(MarshmallowMessageType.Remove).Send(); return false; } [HarmonyPrefix] [HarmonyPatch(typeof(RoastingStickController), nameof(RoastingStickController.UpdateMarshmallowInput))] public static bool RoastingStickController_UpdateMarshmallowInput( - float ____extendFraction, - Marshmallow ____marshmallow, - GameObject ____mallowBodyPrefab, - Transform ____stickTransform, - Campfire ____campfire, - ref string ____promptText, - ScreenPrompt ____mallowPrompt, - ref bool ____showMallowPrompt, - ref bool ____showRemovePrompt) + RoastingStickController __instance + ) { var changePromptText = false; var showRemovePrompt = false; var text = string.Empty; - if (____extendFraction == 0f) + if (__instance._extendFraction == 0f) { - if (____marshmallow.IsEdible()) + if (__instance._marshmallow.IsEdible()) { text = UITextLibrary.GetString(UITextType.RoastingEatPrompt); changePromptText = true; - if (____marshmallow.IsBurned()) + if (__instance._marshmallow.IsBurned()) { showRemovePrompt = true; if (OWInput.IsNewlyPressed(InputLibrary.cancel, InputMode.Roasting)) { - ____marshmallow.Remove(); + __instance._marshmallow.Remove(); Locator.GetPlayerAudioController().PlayMarshmallowToss(); - var spawnedMarshmallow = UnityEngine.Object.Instantiate(____mallowBodyPrefab, ____stickTransform.position, ____stickTransform.rotation); + var spawnedMarshmallow = Object.Instantiate(__instance._mallowBodyPrefab, __instance._stickTransform.position, __instance._stickTransform.rotation); var rigidbody = spawnedMarshmallow.GetComponent(); - rigidbody.SetVelocity(____campfire.GetAttachedOWRigidbody(false).GetPointVelocity(____stickTransform.position) + (____stickTransform.forward * 3f)); - rigidbody.SetAngularVelocity(____stickTransform.right * 10f); - var burntColor = ____marshmallow.GetBurntColor(); + rigidbody.SetVelocity(__instance._campfire.GetAttachedOWRigidbody().GetPointVelocity(__instance._stickTransform.position) + __instance._stickTransform.forward * 3f); + rigidbody.SetAngularVelocity(__instance._stickTransform.right * 10f); + var burntColor = __instance._marshmallow.GetBurntColor(); spawnedMarshmallow.GetComponentInChildren().material.color = burntColor; - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Toss); + new MarshmallowEventMessage(MarshmallowMessageType.Toss).Send(); } } - if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting) && ____marshmallow.IsEdible()) + if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting) && __instance._marshmallow.IsEdible()) { - ____marshmallow.Eat(); + __instance._marshmallow.Eat(); } } - else if (____marshmallow.GetState() == Marshmallow.MallowState.Burning) + else if (__instance._marshmallow.GetState() == Marshmallow.MallowState.Burning) { text = UITextLibrary.GetString(UITextType.RoastingExtinguishPrompt); changePromptText = true; if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting)) { - ____marshmallow.Extinguish(); - QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Extinguish); + __instance._marshmallow.Extinguish(); + new MarshmallowEventMessage(MarshmallowMessageType.Extinguish).Send(); } } - else if (____marshmallow.GetState() == Marshmallow.MallowState.Gone) + else if (__instance._marshmallow.GetState() == Marshmallow.MallowState.Gone) { text = UITextLibrary.GetString(UITextType.RoastingReplacePrompt); changePromptText = true; if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting)) { - ____marshmallow.SpawnMallow(true); + __instance._marshmallow.SpawnMallow(true); } } - if (changePromptText && ____promptText != text) + if (changePromptText && __instance._promptText != text) { - ____promptText = text; - ____mallowPrompt.SetText(____promptText); + __instance._promptText = text; + __instance._mallowPrompt.SetText(__instance._promptText); } if (OWInput.IsNewlyPressed(InputLibrary.cancel, InputMode.Roasting)) { - ____campfire.StopRoasting(); + __instance._campfire.StopRoasting(); return false; } } - ____showMallowPrompt = changePromptText; - ____showRemovePrompt = showRemovePrompt; + __instance._showMallowPrompt = changePromptText; + __instance._showRemovePrompt = showRemovePrompt; return false; } diff --git a/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs b/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs deleted file mode 100644 index 900ba815..00000000 --- a/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.SatelliteSync.Events -{ - internal class SatelliteProjectorEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.QSBEnterSatelliteCamera, () => Handler(true)); - GlobalMessenger.AddListener(EventNames.QSBExitSatelliteCamera, () => Handler(false)); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.QSBEnterSatelliteCamera, () => Handler(true)); - GlobalMessenger.RemoveListener(EventNames.QSBExitSatelliteCamera, () => Handler(false)); - } - - private void Handler(bool usingProjector) => SendEvent(CreateMessage(usingProjector)); - - private BoolMessage CreateMessage(bool usingProjector) => new() - { - AboutId = LocalPlayerId, - Value = usingProjector - }; - - public override void OnReceiveRemote(bool isHost, BoolMessage message) - { - if (message.Value) - { - SatelliteProjectorManager.Instance.RemoteEnter(); - } - else - { - SatelliteProjectorManager.Instance.RemoteExit(); - } - } - } -} diff --git a/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs b/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs deleted file mode 100644 index 73a98578..00000000 --- a/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.SatelliteSync.Events -{ - internal class SatelliteProjectorSnapshotEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBSatelliteSnapshot, (bool forward) => Handler(forward)); - - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBSatelliteSnapshot, (bool forward) => Handler(forward)); - - private void Handler(bool forward) => SendEvent(CreateMessage(forward)); - - private BoolMessage CreateMessage(bool forward) => new() - { - AboutId = LocalPlayerId, - Value = forward - }; - - public override void OnReceiveRemote(bool isHost, BoolMessage message) => SatelliteProjectorManager.Instance.RemoteTakeSnapshot(message.Value); - } -} diff --git a/QSB/SatelliteSync/Messages/SatelliteProjectorMessage.cs b/QSB/SatelliteSync/Messages/SatelliteProjectorMessage.cs new file mode 100644 index 00000000..e35dd920 --- /dev/null +++ b/QSB/SatelliteSync/Messages/SatelliteProjectorMessage.cs @@ -0,0 +1,21 @@ +using QSB.Messaging; + +namespace QSB.SatelliteSync.Messages +{ + internal class SatelliteProjectorMessage : QSBBoolMessage + { + public SatelliteProjectorMessage(bool usingProjector) => Value = usingProjector; + + public override void OnReceiveRemote() + { + if (Value) + { + SatelliteProjectorManager.Instance.RemoteEnter(); + } + else + { + SatelliteProjectorManager.Instance.RemoteExit(); + } + } + } +} diff --git a/QSB/SatelliteSync/Messages/SatelliteProjectorSnapshotMessage.cs b/QSB/SatelliteSync/Messages/SatelliteProjectorSnapshotMessage.cs new file mode 100644 index 00000000..0b571a96 --- /dev/null +++ b/QSB/SatelliteSync/Messages/SatelliteProjectorSnapshotMessage.cs @@ -0,0 +1,11 @@ +using QSB.Messaging; + +namespace QSB.SatelliteSync.Messages +{ + internal class SatelliteProjectorSnapshotMessage : QSBBoolMessage + { + public SatelliteProjectorSnapshotMessage(bool forward) => Value = forward; + + public override void OnReceiveRemote() => SatelliteProjectorManager.Instance.RemoteTakeSnapshot(Value); + } +} diff --git a/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs b/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs index d8548903..61a8731d 100644 --- a/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs +++ b/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.SatelliteSync.Messages; using UnityEngine; namespace QSB.SatelliteSync.Patches @@ -22,7 +23,7 @@ namespace QSB.SatelliteSync.Patches [HarmonyPatch(typeof(SatelliteSnapshotController), nameof(SatelliteSnapshotController.OnPressInteract))] public static bool UseProjector() { - QSBEventManager.FireEvent(EventNames.QSBEnterSatelliteCamera); + new SatelliteProjectorMessage(true).Send(); return true; } @@ -30,7 +31,7 @@ namespace QSB.SatelliteSync.Patches [HarmonyPatch(typeof(SatelliteSnapshotController), nameof(SatelliteSnapshotController.TurnOffProjector))] public static bool LeaveProjector() { - QSBEventManager.FireEvent(EventNames.QSBExitSatelliteCamera); + new SatelliteProjectorMessage(false).Send(); return true; } @@ -43,23 +44,23 @@ namespace QSB.SatelliteSync.Patches return false; } - if (OWInput.IsNewlyPressed(InputLibrary.toolActionPrimary, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.toolActionPrimary)) { - QSBEventManager.FireEvent(EventNames.QSBSatelliteSnapshot, true); + new SatelliteProjectorSnapshotMessage(true).Send(); __instance._satelliteCamera.transform.localEulerAngles = __instance._initCamLocalRot; __instance.RenderSnapshot(); return false; } - if (__instance._allowRearview && OWInput.IsNewlyPressed(InputLibrary.toolActionSecondary, InputMode.All)) + if (__instance._allowRearview && OWInput.IsNewlyPressed(InputLibrary.toolActionSecondary)) { - QSBEventManager.FireEvent(EventNames.QSBSatelliteSnapshot, false); + new SatelliteProjectorSnapshotMessage(false).Send(); __instance._satelliteCamera.transform.localEulerAngles = __instance._initCamLocalRot + new Vector3(0f, 180f, 0f); __instance.RenderSnapshot(); return false; } - if (OWInput.IsNewlyPressed(InputLibrary.cancel, InputMode.All)) + if (OWInput.IsNewlyPressed(InputLibrary.cancel)) { __instance.TurnOffProjector(); } diff --git a/QSB/SatelliteSync/SatelliteProjectorManager.cs b/QSB/SatelliteSync/SatelliteProjectorManager.cs index 48ca392b..7fa1ab0d 100644 --- a/QSB/SatelliteSync/SatelliteProjectorManager.cs +++ b/QSB/SatelliteSync/SatelliteProjectorManager.cs @@ -74,11 +74,11 @@ namespace QSB.SatelliteSync if (Projector._fadeLight != null) { - Projector._fadeLight.StartFade(0f, 2f, 0f); + Projector._fadeLight.StartFade(0f, 2f); } - var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorActivate, 1f); - Projector._loopingSource.FadeIn(audioClip.length, false, false, 1f); + var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorActivate); + Projector._loopingSource.FadeIn(audioClip.length); } public void RemoteExit() @@ -96,11 +96,11 @@ namespace QSB.SatelliteSync if (Projector._fadeLight != null) { - Projector._fadeLight.StartFade(Projector._initLightIntensity, 2f, 0f); + Projector._fadeLight.StartFade(Projector._initLightIntensity, 2f); } - var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorStop, 1f); - Projector._loopingSource.FadeOut(audioClip.length, OWAudioSource.FadeOutCompleteAction.STOP, 0f); + var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorStop); + Projector._loopingSource.FadeOut(audioClip.length); } public void RemoteTakeSnapshot(bool forward) diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs deleted file mode 100644 index e9c068b6..00000000 --- a/QSB/SaveSync/Events/GameStateEvent.cs +++ /dev/null @@ -1,57 +0,0 @@ -using QSB.Events; -using QSB.Menus; -using QSB.Utility; - -namespace QSB.SaveSync.Events -{ - // only to be sent from host - internal class GameStateEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGameDetails, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGameDetails, Handler); - - private void Handler(uint toId) => SendEvent(CreateMessage(toId)); - - private GameStateMessage CreateMessage(uint toId) - { - var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; - return new() - { - AboutId = LocalPlayerId, - ForId = toId, - WarpedToTheEye = gameSave.warpedToTheEye, - SecondsRemainingOnWarp = gameSave.secondsRemainingOnWarp, - LaunchCodesGiven = PlayerData.KnowsLaunchCodes(), - LoopCount = gameSave.loopCount, - KnownFrequencies = gameSave.knownFrequencies, - KnownSignals = gameSave.knownSignals, - }; - } - - public override void OnReceiveRemote(bool isHost, GameStateMessage message) - { - if (QSBSceneManager.CurrentScene != OWScene.TitleScreen) - { - DebugLog.ToConsole($"Error - Treid to handle GameStateEvent when not in TitleScreen!", OWML.Common.MessageType.Error); - return; - } - - PlayerData.ResetGame(); - - var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; - gameSave.loopCount = message.LoopCount; - gameSave.knownFrequencies = message.KnownFrequencies; - gameSave.knownSignals = message.KnownSignals; - gameSave.warpedToTheEye = message.WarpedToTheEye; - gameSave.secondsRemainingOnWarp = message.SecondsRemainingOnWarp; - - PlayerData.SetPersistentCondition("LAUNCH_CODES_GIVEN", message.LaunchCodesGiven); - - PlayerData.SaveCurrentGame(); - - MenuManager.Instance.JoinGame(message.WarpedToTheEye); - } - } -} diff --git a/QSB/SaveSync/Events/GameStateMessage.cs b/QSB/SaveSync/Events/GameStateMessage.cs deleted file mode 100644 index fdd83dc8..00000000 --- a/QSB/SaveSync/Events/GameStateMessage.cs +++ /dev/null @@ -1,66 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; -using System; -using System.Collections.Generic; - -namespace QSB.SaveSync.Events -{ - internal class GameStateMessage : PlayerMessage - { - public bool WarpedToTheEye { get; set; } - public float SecondsRemainingOnWarp { get; set; } - public bool LaunchCodesGiven { get; set; } - public int LoopCount { get; set; } - public bool[] KnownFrequencies { get; set; } - public Dictionary KnownSignals { get; set; } = new(); - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - WarpedToTheEye = reader.ReadBoolean(); - SecondsRemainingOnWarp = reader.ReadSingle(); - LaunchCodesGiven = reader.ReadBoolean(); - LoopCount = reader.ReadInt32(); - - var frequenciesLength = reader.ReadInt32(); - var knownFrequencies = KnownFrequencies; - Array.Resize(ref knownFrequencies, frequenciesLength); - KnownFrequencies = knownFrequencies; - for (var i = 0; i < frequenciesLength; i++) - { - KnownFrequencies[i] = reader.ReadBoolean(); - } - - var signalsLength = reader.ReadInt32(); - KnownSignals.Clear(); - for (var i = 0; i < signalsLength; i++) - { - var key = reader.ReadInt32(); - var value = reader.ReadBoolean(); - KnownSignals.Add(key, value); - } - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(WarpedToTheEye); - writer.Write(SecondsRemainingOnWarp); - writer.Write(LaunchCodesGiven); - writer.Write(LoopCount); - - writer.Write(KnownFrequencies.Length); - foreach (var item in KnownFrequencies) - { - writer.Write(item); - } - - writer.Write(KnownSignals.Count); - foreach (var item in KnownSignals) - { - writer.Write(item.Key); - writer.Write(item.Value); - } - } - } -} diff --git a/QSB/SaveSync/Events/RequestGameStateEvent.cs b/QSB/SaveSync/Events/RequestGameStateEvent.cs deleted file mode 100644 index 94f78312..00000000 --- a/QSB/SaveSync/Events/RequestGameStateEvent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.SaveSync.Events -{ - internal class RequestGameStateEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBRequestGameDetails, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBRequestGameDetails, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId, - OnlySendToHost = true - }; - - public override void OnReceiveRemote(bool isHost, PlayerMessage message) => QSBEventManager.FireEvent(EventNames.QSBGameDetails, message.FromId); - } -} diff --git a/QSB/SaveSync/Messages/GameStateMessage.cs b/QSB/SaveSync/Messages/GameStateMessage.cs new file mode 100644 index 00000000..d0a49ea8 --- /dev/null +++ b/QSB/SaveSync/Messages/GameStateMessage.cs @@ -0,0 +1,105 @@ +using OWML.Common; +using QSB.Menus; +using QSB.Messaging; +using QSB.Utility; +using QuantumUNET.Transport; +using System.Collections.Generic; + +namespace QSB.SaveSync.Messages +{ + /// + /// always sent by host + /// + internal class GameStateMessage : QSBMessage + { + private bool WarpedToTheEye; + private float SecondsRemainingOnWarp; + private bool LaunchCodesGiven; + private int LoopCount; + private bool[] KnownFrequencies; + private Dictionary KnownSignals; + + public GameStateMessage(uint toId) + { + To = toId; + var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; + WarpedToTheEye = gameSave.warpedToTheEye; + SecondsRemainingOnWarp = gameSave.secondsRemainingOnWarp; + LaunchCodesGiven = PlayerData.KnowsLaunchCodes(); + LoopCount = gameSave.loopCount; + KnownFrequencies = gameSave.knownFrequencies; + KnownSignals = gameSave.knownSignals; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(WarpedToTheEye); + writer.Write(SecondsRemainingOnWarp); + writer.Write(LaunchCodesGiven); + writer.Write(LoopCount); + + writer.Write(KnownFrequencies.Length); + foreach (var item in KnownFrequencies) + { + writer.Write(item); + } + + writer.Write(KnownSignals.Count); + foreach (var (key, value) in KnownSignals) + { + writer.Write(key); + writer.Write(value); + } + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + WarpedToTheEye = reader.ReadBoolean(); + SecondsRemainingOnWarp = reader.ReadSingle(); + LaunchCodesGiven = reader.ReadBoolean(); + LoopCount = reader.ReadInt32(); + + var frequenciesLength = reader.ReadInt32(); + KnownFrequencies = new bool[frequenciesLength]; + for (var i = 0; i < frequenciesLength; i++) + { + KnownFrequencies[i] = reader.ReadBoolean(); + } + + var signalsLength = reader.ReadInt32(); + KnownSignals = new Dictionary(signalsLength); + for (var i = 0; i < signalsLength; i++) + { + var key = reader.ReadInt32(); + var value = reader.ReadBoolean(); + KnownSignals.Add(key, value); + } + } + + public override void OnReceiveRemote() + { + if (QSBSceneManager.CurrentScene != OWScene.TitleScreen) + { + DebugLog.ToConsole($"Error - Tried to handle GameStateEvent when not in TitleScreen!", MessageType.Error); + return; + } + + PlayerData.ResetGame(); + + var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; + gameSave.loopCount = LoopCount; + gameSave.knownFrequencies = KnownFrequencies; + gameSave.knownSignals = KnownSignals; + gameSave.warpedToTheEye = WarpedToTheEye; + gameSave.secondsRemainingOnWarp = SecondsRemainingOnWarp; + + PlayerData.SetPersistentCondition("LAUNCH_CODES_GIVEN", LaunchCodesGiven); + + PlayerData.SaveCurrentGame(); + + MenuManager.Instance.JoinGame(WarpedToTheEye); + } + } +} \ No newline at end of file diff --git a/QSB/SaveSync/Messages/RequestGameStateMessage.cs b/QSB/SaveSync/Messages/RequestGameStateMessage.cs new file mode 100644 index 00000000..479065e1 --- /dev/null +++ b/QSB/SaveSync/Messages/RequestGameStateMessage.cs @@ -0,0 +1,14 @@ +using QSB.Messaging; + +namespace QSB.SaveSync.Messages +{ + /// + /// always sent to host + /// + internal class RequestGameStateMessage : QSBMessage + { + public RequestGameStateMessage() => To = 0; + + public override void OnReceiveRemote() => new GameStateMessage(From).Send(); + } +} diff --git a/QSB/SectorSync/SectorSync.cs b/QSB/SectorSync/SectorSync.cs index 835f5934..ebe7b810 100644 --- a/QSB/SectorSync/SectorSync.cs +++ b/QSB/SectorSync/SectorSync.cs @@ -55,7 +55,7 @@ namespace QSB.SectorSync private void AddSector(Sector sector) { - var worldObject = QSBWorldSync.GetWorldFromUnity(sector); + var worldObject = sector.GetWorldObject(); if (worldObject == null) { DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); @@ -73,7 +73,7 @@ namespace QSB.SectorSync private void RemoveSector(Sector sector) { - var worldObject = QSBWorldSync.GetWorldFromUnity(sector); + var worldObject = sector.GetWorldObject(); if (worldObject == null) { DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); diff --git a/QSB/ShipSync/Events/Component/ComponentDamagedEvent.cs b/QSB/ShipSync/Events/Component/ComponentDamagedEvent.cs deleted file mode 100644 index f7237af7..00000000 --- a/QSB/ShipSync/Events/Component/ComponentDamagedEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ShipSync.Events.Component -{ - internal class ComponentDamagedEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBComponentDamaged, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBComponentDamaged, Handler); - - private void Handler(ShipComponent hull) => SendEvent(CreateMessage(hull)); - - private WorldObjectMessage CreateMessage(ShipComponent hull) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new WorldObjectMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId - }; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.SetDamaged(); - } - } -} diff --git a/QSB/ShipSync/Events/Component/ComponentRepairTickEvent.cs b/QSB/ShipSync/Events/Component/ComponentRepairTickEvent.cs deleted file mode 100644 index 61da422a..00000000 --- a/QSB/ShipSync/Events/Component/ComponentRepairTickEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.ShipSync.Events.Component -{ - internal class ComponentRepairTickEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBComponentRepairTick, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBComponentRepairTick, Handler); - - private void Handler(ShipComponent hull, float repairFraction) => SendEvent(CreateMessage(hull, repairFraction)); - - private RepairTickMessage CreateMessage(ShipComponent hull, float repairFraction) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new RepairTickMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId, - RepairNumber = repairFraction - }; - } - - public override void OnReceiveRemote(bool server, RepairTickMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.RepairTick(message.RepairNumber); - } - } -} diff --git a/QSB/ShipSync/Events/Component/ComponentRepairedEvent.cs b/QSB/ShipSync/Events/Component/ComponentRepairedEvent.cs deleted file mode 100644 index 1e9b4adc..00000000 --- a/QSB/ShipSync/Events/Component/ComponentRepairedEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ShipSync.Events.Component -{ - internal class ComponentRepairedEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBComponentRepaired, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBComponentRepaired, Handler); - - private void Handler(ShipComponent hull) => SendEvent(CreateMessage(hull)); - - private WorldObjectMessage CreateMessage(ShipComponent hull) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new WorldObjectMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId - }; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.SetRepaired(); - } - } -} diff --git a/QSB/ShipSync/Events/FlyShipEvent.cs b/QSB/ShipSync/Events/FlyShipEvent.cs deleted file mode 100644 index 3a8fac7e..00000000 --- a/QSB/ShipSync/Events/FlyShipEvent.cs +++ /dev/null @@ -1,66 +0,0 @@ -using OWML.Utils; -using QSB.AuthoritySync; -using QSB.Events; -using QSB.Messaging; -using QSB.Player; -using QSB.ShipSync.TransformSync; -using UnityEngine; - -namespace QSB.ShipSync.Events -{ - internal class FlyShipEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.EnterFlightConsole, (OWRigidbody rigidbody) => Handler(true)); - GlobalMessenger.AddListener(EventNames.ExitFlightConsole, () => Handler(false)); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.EnterFlightConsole, (OWRigidbody rigidbody) => Handler(true)); - GlobalMessenger.RemoveListener(EventNames.ExitFlightConsole, () => Handler(false)); - } - - private void Handler(bool flying) => SendEvent(CreateMessage(flying)); - - private BoolMessage CreateMessage(bool flying) => new() - { - AboutId = LocalPlayerId, - Value = flying - }; - - public override void OnReceiveLocal(bool server, BoolMessage message) => SetCurrentFlyer(message.Value, message.AboutId); - - public override void OnReceiveRemote(bool server, BoolMessage message) - { - SetCurrentFlyer(message.Value, message.AboutId); - var shipCockpitController = GameObject.Find("ShipCockpitController").GetComponent(); - var interactVolume = shipCockpitController.GetValue("_interactVolume"); - if (message.Value) - { - interactVolume.DisableInteraction(); - } - else - { - interactVolume.EnableInteraction(); - } - } - - private void SetCurrentFlyer(bool isFlying, uint id) - { - ShipManager.Instance.CurrentFlyer = isFlying - ? id - : uint.MaxValue; - - if (QSBCore.IsHost) - { - ShipTransformSync.LocalInstance.NetIdentity.SetAuthority(isFlying - ? id - : QSBPlayerManager.LocalPlayerId); - } - } - } -} diff --git a/QSB/ShipSync/Events/FunnelEnableEvent.cs b/QSB/ShipSync/Events/FunnelEnableEvent.cs deleted file mode 100644 index 45bd3778..00000000 --- a/QSB/ShipSync/Events/FunnelEnableEvent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.ShipSync.Events -{ - internal class FunnelEnableEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBEnableFunnel, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBEnableFunnel, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveRemote(bool server, PlayerMessage message) - => ShipManager.Instance.ShipTractorBeam.ActivateTractorBeam(); - } -} diff --git a/QSB/ShipSync/Events/HatchEvent.cs b/QSB/ShipSync/Events/HatchEvent.cs deleted file mode 100644 index f4f6120d..00000000 --- a/QSB/ShipSync/Events/HatchEvent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using OWML.Utils; -using QSB.Events; -using QSB.Messaging; - -namespace QSB.ShipSync.Events -{ - internal class HatchEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBHatchState, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBHatchState, Handler); - - private void Handler(bool open) => SendEvent(CreateMessage(open)); - - private BoolMessage CreateMessage(bool open) => new() - { - AboutId = LocalPlayerId, - Value = open - }; - - public override void OnReceiveRemote(bool server, BoolMessage message) - { - if (message.Value) - { - ShipManager.Instance.HatchController.Invoke("OpenHatch"); - } - else - { - ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam(); - ShipManager.Instance.HatchController.Invoke("CloseHatch"); - } - } - } -} \ No newline at end of file diff --git a/QSB/ShipSync/Events/Hull/HullChangeIntegrityEvent.cs b/QSB/ShipSync/Events/Hull/HullChangeIntegrityEvent.cs deleted file mode 100644 index bc37b6a6..00000000 --- a/QSB/ShipSync/Events/Hull/HullChangeIntegrityEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.ShipSync.Events.Hull -{ - internal class HullChangeIntegrityEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBHullChangeIntegrity, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBHullChangeIntegrity, Handler); - - private void Handler(ShipHull hull, float integrity) => SendEvent(CreateMessage(hull, integrity)); - - private HullChangeIntegrityMessage CreateMessage(ShipHull hull, float integrity) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new HullChangeIntegrityMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId, - Integrity = integrity - }; - } - - public override void OnReceiveRemote(bool server, HullChangeIntegrityMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.ChangeIntegrity(message.Integrity); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullChangeIntegrityMessage.cs b/QSB/ShipSync/Events/Hull/HullChangeIntegrityMessage.cs deleted file mode 100644 index b3568f83..00000000 --- a/QSB/ShipSync/Events/Hull/HullChangeIntegrityMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.ShipSync.Events.Hull -{ - public class HullChangeIntegrityMessage : WorldObjectMessage - { - public float Integrity { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Integrity = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Integrity); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullDamagedEvent.cs b/QSB/ShipSync/Events/Hull/HullDamagedEvent.cs deleted file mode 100644 index f3414d67..00000000 --- a/QSB/ShipSync/Events/Hull/HullDamagedEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ShipSync.Events.Hull -{ - internal class HullDamagedEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBHullDamaged, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBHullDamaged, Handler); - - private void Handler(ShipHull hull) => SendEvent(CreateMessage(hull)); - - private WorldObjectMessage CreateMessage(ShipHull hull) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new WorldObjectMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId - }; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.SetDamaged(); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullImpactEvent.cs b/QSB/ShipSync/Events/Hull/HullImpactEvent.cs deleted file mode 100644 index 92a10952..00000000 --- a/QSB/ShipSync/Events/Hull/HullImpactEvent.cs +++ /dev/null @@ -1,37 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.ShipSync.Events.Hull -{ - internal class HullImpactEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBHullImpact, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBHullImpact, Handler); - - private void Handler(ShipHull hull, ImpactData data, float damage) => SendEvent(CreateMessage(hull, data, damage)); - - private HullImpactMessage CreateMessage(ShipHull hull, ImpactData data, float damage) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new HullImpactMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId, - Point = data.point, - Normal = data.normal, - Velocity = data.velocity, - Speed = data.speed, - Damage = damage - }; - } - - public override void OnReceiveRemote(bool server, HullImpactMessage message) - { - // TODO : ????????? why did i make this event?? - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullImpactMessage.cs b/QSB/ShipSync/Events/Hull/HullImpactMessage.cs deleted file mode 100644 index 2cd4d3b6..00000000 --- a/QSB/ShipSync/Events/Hull/HullImpactMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.ShipSync.Events.Hull -{ - public class HullImpactMessage : ImpactDataMessage - { - public float Damage { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Damage = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Damage); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullRepairTickEvent.cs b/QSB/ShipSync/Events/Hull/HullRepairTickEvent.cs deleted file mode 100644 index 6291aa8e..00000000 --- a/QSB/ShipSync/Events/Hull/HullRepairTickEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.ShipSync.Events.Hull -{ - internal class HullRepairTickEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBHullRepairTick, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBHullRepairTick, Handler); - - private void Handler(ShipHull hull, float repairFraction) => SendEvent(CreateMessage(hull, repairFraction)); - - private RepairTickMessage CreateMessage(ShipHull hull, float repairFraction) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new RepairTickMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId, - RepairNumber = repairFraction - }; - } - - public override void OnReceiveRemote(bool server, RepairTickMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.RepairTick(message.RepairNumber); - } - } -} diff --git a/QSB/ShipSync/Events/Hull/HullRepairedEvent.cs b/QSB/ShipSync/Events/Hull/HullRepairedEvent.cs deleted file mode 100644 index 616095ca..00000000 --- a/QSB/ShipSync/Events/Hull/HullRepairedEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.ShipSync.Events.Hull -{ - internal class HullRepairedEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBHullRepaired, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBHullRepaired, Handler); - - private void Handler(ShipHull hull) => SendEvent(CreateMessage(hull)); - - private WorldObjectMessage CreateMessage(ShipHull hull) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(hull); - return new WorldObjectMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId - }; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.SetRepaired(); - } - } -} diff --git a/QSB/ShipSync/Events/ImpactDataMessage.cs b/QSB/ShipSync/Events/ImpactDataMessage.cs deleted file mode 100644 index 57e0fb26..00000000 --- a/QSB/ShipSync/Events/ImpactDataMessage.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.ShipSync.Events -{ - public class ImpactDataMessage : WorldObjectMessage - { - public Vector3 Point { get; set; } - public Vector3 Normal { get; set; } - public Vector3 Velocity { get; set; } - public float Speed { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - Point = reader.ReadVector3(); - Normal = reader.ReadVector3(); - Velocity = reader.ReadVector3(); - Speed = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(Point); - writer.Write(Normal); - writer.Write(Velocity); - writer.Write(Speed); - } - } -} diff --git a/QSB/ShipSync/Events/RepairTickMessage.cs b/QSB/ShipSync/Events/RepairTickMessage.cs deleted file mode 100644 index 64867a70..00000000 --- a/QSB/ShipSync/Events/RepairTickMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.ShipSync.Events -{ - internal class RepairTickMessage : WorldObjectMessage - { - public float RepairNumber { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - RepairNumber = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(RepairNumber); - } - } -} diff --git a/QSB/ShipSync/Messages/Component/ComponentDamagedMessage.cs b/QSB/ShipSync/Messages/Component/ComponentDamagedMessage.cs new file mode 100644 index 00000000..ba1cf373 --- /dev/null +++ b/QSB/ShipSync/Messages/Component/ComponentDamagedMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Component +{ + internal class ComponentDamagedMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SetDamaged(); + } +} diff --git a/QSB/ShipSync/Messages/Component/ComponentRepairTickMessage.cs b/QSB/ShipSync/Messages/Component/ComponentRepairTickMessage.cs new file mode 100644 index 00000000..df76c8d1 --- /dev/null +++ b/QSB/ShipSync/Messages/Component/ComponentRepairTickMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Component +{ + internal class ComponentRepairTickMessage : QSBFloatWorldObjectMessage + { + public ComponentRepairTickMessage(float repairFraction) => Value = repairFraction; + + public override void OnReceiveRemote() => WorldObject.RepairTick(Value); + } +} diff --git a/QSB/ShipSync/Messages/Component/ComponentRepairedMessage.cs b/QSB/ShipSync/Messages/Component/ComponentRepairedMessage.cs new file mode 100644 index 00000000..1145c331 --- /dev/null +++ b/QSB/ShipSync/Messages/Component/ComponentRepairedMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Component +{ + internal class ComponentRepairedMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SetRepaired(); + } +} \ No newline at end of file diff --git a/QSB/ShipSync/Messages/FlyShipMessage.cs b/QSB/ShipSync/Messages/FlyShipMessage.cs new file mode 100644 index 00000000..79552e19 --- /dev/null +++ b/QSB/ShipSync/Messages/FlyShipMessage.cs @@ -0,0 +1,61 @@ +using QSB.AuthoritySync; +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; +using QSB.ShipSync.TransformSync; +using QSB.WorldSync; +using UnityEngine; + +namespace QSB.ShipSync.Messages +{ + internal class FlyShipMessage : QSBBoolMessage + { + static FlyShipMessage() + { + GlobalMessenger.AddListener(OWEvents.EnterFlightConsole, _ => Handler(true)); + GlobalMessenger.AddListener(OWEvents.ExitFlightConsole, () => Handler(false)); + } + + private static void Handler(bool flying) + { + if (PlayerTransformSync.LocalInstance) + { + new FlyShipMessage(flying).Send(); + } + } + + public FlyShipMessage(bool flying) => Value = flying; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() => SetCurrentFlyer(From, Value); + + public override void OnReceiveRemote() + { + SetCurrentFlyer(From, Value); + var shipCockpitController = GameObject.Find("ShipCockpitController").GetComponent(); + if (Value) + { + shipCockpitController._interactVolume.DisableInteraction(); + } + else + { + shipCockpitController._interactVolume.EnableInteraction(); + } + } + + private static void SetCurrentFlyer(uint id, bool isFlying) + { + ShipManager.Instance.CurrentFlyer = isFlying + ? id + : uint.MaxValue; + + if (QSBCore.IsHost) + { + ShipTransformSync.LocalInstance.NetIdentity.SetAuthority(isFlying + ? id + : QSBPlayerManager.LocalPlayerId); + } + } + } +} diff --git a/QSB/ShipSync/Messages/FunnelEnableMessage.cs b/QSB/ShipSync/Messages/FunnelEnableMessage.cs new file mode 100644 index 00000000..b2b986a8 --- /dev/null +++ b/QSB/ShipSync/Messages/FunnelEnableMessage.cs @@ -0,0 +1,13 @@ +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.ShipSync.Messages +{ + internal class FunnelEnableMessage : QSBMessage + { + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + => ShipManager.Instance.ShipTractorBeam.ActivateTractorBeam(); + } +} diff --git a/QSB/ShipSync/Messages/HatchMessage.cs b/QSB/ShipSync/Messages/HatchMessage.cs new file mode 100644 index 00000000..9901b2d2 --- /dev/null +++ b/QSB/ShipSync/Messages/HatchMessage.cs @@ -0,0 +1,25 @@ +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.ShipSync.Messages +{ + internal class HatchMessage : QSBBoolMessage + { + public HatchMessage(bool open) => Value = open; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + if (Value) + { + ShipManager.Instance.HatchController.OpenHatch(); + } + else + { + ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam(); + ShipManager.Instance.HatchController.CloseHatch(); + } + } + } +} \ No newline at end of file diff --git a/QSB/ShipSync/Messages/Hull/HullChangeIntegrityMessage.cs b/QSB/ShipSync/Messages/Hull/HullChangeIntegrityMessage.cs new file mode 100644 index 00000000..08b84cfa --- /dev/null +++ b/QSB/ShipSync/Messages/Hull/HullChangeIntegrityMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Hull +{ + internal class HullChangeIntegrityMessage : QSBFloatWorldObjectMessage + { + public HullChangeIntegrityMessage(float integrity) => Value = integrity; + + public override void OnReceiveRemote() => WorldObject.ChangeIntegrity(Value); + } +} diff --git a/QSB/ShipSync/Messages/Hull/HullDamagedMessage.cs b/QSB/ShipSync/Messages/Hull/HullDamagedMessage.cs new file mode 100644 index 00000000..e83a5e77 --- /dev/null +++ b/QSB/ShipSync/Messages/Hull/HullDamagedMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Hull +{ + internal class HullDamagedMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SetDamaged(); + } +} diff --git a/QSB/ShipSync/Messages/Hull/HullRepairTickMessage.cs b/QSB/ShipSync/Messages/Hull/HullRepairTickMessage.cs new file mode 100644 index 00000000..bb855a15 --- /dev/null +++ b/QSB/ShipSync/Messages/Hull/HullRepairTickMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Hull +{ + internal class HullRepairTickMessage : QSBFloatWorldObjectMessage + { + public HullRepairTickMessage(float repairFraction) => Value = repairFraction; + + public override void OnReceiveRemote() => WorldObject.RepairTick(Value); + } +} diff --git a/QSB/ShipSync/Messages/Hull/HullRepairedMessage.cs b/QSB/ShipSync/Messages/Hull/HullRepairedMessage.cs new file mode 100644 index 00000000..91f21618 --- /dev/null +++ b/QSB/ShipSync/Messages/Hull/HullRepairedMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.ShipSync.WorldObjects; + +namespace QSB.ShipSync.Messages.Hull +{ + internal class HullRepairedMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SetRepaired(); + } +} diff --git a/QSB/ShipSync/Patches/ShipPatches.cs b/QSB/ShipSync/Patches/ShipPatches.cs index 4cbaa293..14ca4f47 100644 --- a/QSB/ShipSync/Patches/ShipPatches.cs +++ b/QSB/ShipSync/Patches/ShipPatches.cs @@ -1,11 +1,14 @@ using HarmonyLib; -using OWML.Utils; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.ShipSync.Messages; +using QSB.ShipSync.Messages.Component; +using QSB.ShipSync.Messages.Hull; +using QSB.ShipSync.TransformSync; +using QSB.ShipSync.WorldObjects; using QSB.Utility; using QSB.WorldSync; using System; -using QSB.ShipSync.TransformSync; using UnityEngine; namespace QSB.ShipSync.Patches @@ -22,10 +25,10 @@ namespace QSB.ShipSync.Patches if (!PlayerState.IsInsideShip()) { ShipManager.Instance.ShipTractorBeam.ActivateTractorBeam(); - QSBEventManager.FireEvent(EventNames.QSBEnableFunnel); + new FunnelEnableMessage().Send(); } - QSBEventManager.FireEvent(EventNames.QSBHatchState, true); + new HatchMessage(true).Send(); return true; } @@ -35,7 +38,7 @@ namespace QSB.ShipSync.Patches { if (hitObj.CompareTag("PlayerDetector")) { - QSBEventManager.FireEvent(EventNames.QSBHatchState, false); + new HatchMessage(false).Send(); } return true; @@ -47,9 +50,9 @@ namespace QSB.ShipSync.Patches { if (!__instance._isPlayerInShip && __instance._functional && hitCollider.CompareTag("PlayerDetector") && !ShipManager.Instance.HatchController._hatchObject.activeSelf) { - ShipManager.Instance.HatchController.Invoke("CloseHatch"); + ShipManager.Instance.HatchController.CloseHatch(); ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam(); - QSBEventManager.FireEvent(EventNames.QSBHatchState, false); + new HatchMessage(false).Send(); } return false; @@ -126,24 +129,27 @@ namespace QSB.ShipSync.Patches return false; } + var qsbShipComponent = __instance.GetWorldObject(); if (damaged) { __instance._damaged = true; __instance._repairFraction = 0f; - __instance.GetType().GetAnyMethod("OnComponentDamaged").Invoke(__instance, null); - __instance.RaiseEvent("OnDamaged", __instance); - QSBEventManager.FireEvent(EventNames.QSBComponentDamaged, __instance); + __instance.OnComponentDamaged(); + __instance.RaiseEvent(nameof(__instance.OnDamaged), __instance); + qsbShipComponent + .SendMessage(new ComponentDamagedMessage()); } else { __instance._damaged = false; __instance._repairFraction = 1f; - __instance.GetType().GetAnyMethod("OnComponentRepaired").Invoke(__instance, null); - __instance.RaiseEvent("OnRepaired", __instance); - QSBEventManager.FireEvent(EventNames.QSBComponentRepaired, __instance); + __instance.OnComponentRepaired(); + __instance.RaiseEvent(nameof(__instance.OnRepaired), __instance); + qsbShipComponent + .SendMessage(new ComponentRepairedMessage()); } - __instance.GetType().GetAnyMethod("UpdateColliderState").Invoke(__instance, null); + __instance.UpdateColliderState(); if (__instance._damageEffect) { __instance._damageEffect.SetEffectBlend(1f - __instance._repairFraction); @@ -154,50 +160,53 @@ namespace QSB.ShipSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(ShipHull), nameof(ShipHull.FixedUpdate))] - public static bool ShipHull_FixedUpdate(ShipHull __instance, ref ImpactData ____dominantImpact, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, ShipComponent[] ____components) + public static bool ShipHull_FixedUpdate(ShipHull __instance) { - if (____dominantImpact != null) + if (__instance._dominantImpact != null) { - var damage = Mathf.InverseLerp(30f, 200f, ____dominantImpact.speed); + var damage = Mathf.InverseLerp(30f, 200f, __instance._dominantImpact.speed); if (damage > 0f) { var num2 = 0.15f; - if (damage < num2 && ____integrity > 1f - num2) + if (damage < num2 && __instance._integrity > 1f - num2) { damage = num2; } - ____integrity = Mathf.Max(____integrity - damage, 0f); - if (!____damaged) + __instance._integrity = Mathf.Max(__instance._integrity - damage, 0f); + var qsbShipHull = __instance.GetWorldObject(); + if (!__instance._damaged) { - ____damaged = true; - __instance.RaiseEvent("OnDamaged", __instance); - QSBEventManager.FireEvent(EventNames.QSBHullDamaged, __instance); + __instance._damaged = true; + __instance.RaiseEvent(nameof(__instance.OnDamaged), __instance); + + qsbShipHull + .SendMessage(new HullDamagedMessage()); } - if (____damageEffect != null) + if (__instance._damageEffect != null) { - ____damageEffect.SetEffectBlend(1f - ____integrity); + __instance._damageEffect.SetEffectBlend(1f - __instance._integrity); } - QSBEventManager.FireEvent(EventNames.QSBHullChangeIntegrity, __instance, ____integrity); + qsbShipHull + .SendMessage(new HullChangeIntegrityMessage(__instance._integrity)); } - foreach (var component in ____components) + foreach (var component in __instance._components) { if (!(component == null) && !component.isDamaged) { - if (component.ApplyImpact(____dominantImpact)) + if (component.ApplyImpact(__instance._dominantImpact)) { break; } } } - __instance.RaiseEvent("OnImpact", ____dominantImpact, damage); - QSBEventManager.FireEvent(EventNames.QSBHullImpact, __instance, ____dominantImpact, damage); + __instance.RaiseEvent(nameof(__instance.OnImpact), __instance._dominantImpact, damage); - ____dominantImpact = null; + __instance._dominantImpact = null; } __instance.enabled = false; @@ -211,37 +220,38 @@ namespace QSB.ShipSync.Patches [HarmonyPostfix] [HarmonyPatch(typeof(ShipComponent), nameof(ShipComponent.RepairTick))] - public static void ShipComponent_RepairTick(ShipComponent __instance, float ____repairFraction) - { - QSBEventManager.FireEvent(EventNames.QSBComponentRepairTick, __instance, ____repairFraction); - return; - } + public static void ShipComponent_RepairTick(ShipComponent __instance) => + __instance.GetWorldObject() + .SendMessage(new ComponentRepairTickMessage(__instance._repairFraction)); [HarmonyPrefix] [HarmonyPatch(typeof(ShipHull), nameof(ShipHull.RepairTick))] - public static bool ShipHull_RepairTick(ShipHull __instance, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, float ____repairTime) + public static bool ShipHull_RepairTick(ShipHull __instance) { - if (!____damaged) + if (!__instance._damaged) { return false; } - ____integrity = Mathf.Min(____integrity + (Time.deltaTime / ____repairTime), 1f); - QSBEventManager.FireEvent(EventNames.QSBHullRepairTick, __instance, ____integrity); + __instance._integrity = Mathf.Min(__instance._integrity + (Time.deltaTime / __instance._repairTime), 1f); + var qsbShipHull = __instance.GetWorldObject(); + qsbShipHull + .SendMessage(new HullRepairTickMessage(__instance._integrity)); - if (____integrity >= 1f) + if (__instance._integrity >= 1f) { - ____damaged = false; - __instance.RaiseEvent("OnRepaired", __instance); - QSBEventManager.FireEvent(EventNames.QSBHullRepaired, __instance); + __instance._damaged = false; + __instance.RaiseEvent(nameof(__instance.OnRepaired), __instance); + qsbShipHull + .SendMessage(new HullRepairedMessage()); } - if (____damageEffect != null) + if (__instance._damageEffect != null) { - ____damageEffect.SetEffectBlend(1f - ____integrity); + __instance._damageEffect.SetEffectBlend(1f - __instance._integrity); } return false; } } -} +} \ No newline at end of file diff --git a/QSB/ShipSync/ShipManager.cs b/QSB/ShipSync/ShipManager.cs index ce56b39d..f0da6569 100644 --- a/QSB/ShipSync/ShipManager.cs +++ b/QSB/ShipSync/ShipManager.cs @@ -1,5 +1,4 @@ using OWML.Common; -using OWML.Utils; using QSB.Player; using QSB.ShipSync.TransformSync; using QSB.ShipSync.WorldObjects; @@ -115,8 +114,8 @@ namespace QSB.ShipSync private void UpdateElectricalComponent() { - var electricalSystem = ShipElectricalComponent.GetValue("_electricalSystem"); - var damaged = ShipElectricalComponent.GetValue("_damaged"); + var electricalSystem = ShipElectricalComponent._electricalSystem; + var damaged = ShipElectricalComponent._damaged; if (_playersInShip.Count == 0) { diff --git a/QSB/ShipSync/WorldObjects/QSBShipComponent.cs b/QSB/ShipSync/WorldObjects/QSBShipComponent.cs index 5b193859..7b5d3013 100644 --- a/QSB/ShipSync/WorldObjects/QSBShipComponent.cs +++ b/QSB/ShipSync/WorldObjects/QSBShipComponent.cs @@ -1,5 +1,4 @@ -using OWML.Utils; -using QSB.Utility; +using QSB.Utility; using QSB.WorldSync; namespace QSB.ShipSync.WorldObjects @@ -9,31 +8,31 @@ namespace QSB.ShipSync.WorldObjects public void SetDamaged() { DebugLog.DebugWrite($"[S COMPONENT] {AttachedObject} Set damaged."); - AttachedObject.SetValue("_damaged", true); - AttachedObject.SetValue("_repairFraction", 0f); - AttachedObject.GetType().GetAnyMethod("OnComponentDamaged").Invoke(AttachedObject, null); - AttachedObject.RaiseEvent("OnDamaged", AttachedObject); - AttachedObject.GetType().GetAnyMethod("UpdateColliderState").Invoke(AttachedObject, null); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._damaged = true; + AttachedObject._repairFraction = 0f; + AttachedObject.OnComponentDamaged(); + AttachedObject.RaiseEvent(nameof(AttachedObject.OnDamaged), AttachedObject); + AttachedObject.UpdateColliderState(); + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(1f); } public void SetRepaired() { DebugLog.DebugWrite($"[S COMPONENT] {AttachedObject} Set repaired."); - AttachedObject.SetValue("_damaged", false); - AttachedObject.SetValue("_repairFraction", 1f); - AttachedObject.GetType().GetAnyMethod("OnComponentRepaired").Invoke(AttachedObject, null); - AttachedObject.RaiseEvent("OnRepaired", AttachedObject); - AttachedObject.GetType().GetAnyMethod("UpdateColliderState").Invoke(AttachedObject, null); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._damaged = false; + AttachedObject._repairFraction = 1f; + AttachedObject.OnComponentRepaired(); + AttachedObject.RaiseEvent(nameof(AttachedObject.OnRepaired), AttachedObject); + AttachedObject.UpdateColliderState(); + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(0f); } public void RepairTick(float repairFraction) { - AttachedObject.SetValue("_repairFraction", repairFraction); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._repairFraction = repairFraction; + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(1f - repairFraction); } } diff --git a/QSB/ShipSync/WorldObjects/QSBShipHull.cs b/QSB/ShipSync/WorldObjects/QSBShipHull.cs index 3f928bcc..5dc3682d 100644 --- a/QSB/ShipSync/WorldObjects/QSBShipHull.cs +++ b/QSB/ShipSync/WorldObjects/QSBShipHull.cs @@ -1,5 +1,4 @@ -using OWML.Utils; -using QSB.Utility; +using QSB.Utility; using QSB.WorldSync; namespace QSB.ShipSync.WorldObjects @@ -9,31 +8,31 @@ namespace QSB.ShipSync.WorldObjects public void SetDamaged() { DebugLog.DebugWrite($"[HULL] {AttachedObject} Set damaged."); - AttachedObject.SetValue("_damaged", true); - AttachedObject.RaiseEvent("OnDamaged", AttachedObject); + AttachedObject._damaged = true; + AttachedObject.RaiseEvent(nameof(AttachedObject.OnDamaged), AttachedObject); } public void SetRepaired() { DebugLog.DebugWrite($"[HULL] {AttachedObject} Set repaired."); - AttachedObject.SetValue("_damaged", false); - AttachedObject.RaiseEvent("OnRepaired", AttachedObject); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._damaged = false; + AttachedObject.RaiseEvent(nameof(AttachedObject.OnRepaired), AttachedObject); + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(0f); } public void ChangeIntegrity(float newIntegrity) { DebugLog.DebugWrite($"[HULL] {AttachedObject} Change integrity to {newIntegrity}."); - AttachedObject.SetValue("_integrity", newIntegrity); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._integrity = newIntegrity; + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(1f - newIntegrity); } public void RepairTick(float integrity) { - AttachedObject.SetValue("_integrity", integrity); - var damageEffect = AttachedObject.GetValue("_damageEffect"); + AttachedObject._integrity = integrity; + var damageEffect = AttachedObject._damageEffect; damageEffect.SetEffectBlend(1f - integrity); } } diff --git a/QSB/StatueSync/Events/StartStatueEvent.cs b/QSB/StatueSync/Events/StartStatueEvent.cs deleted file mode 100644 index c6a1bcff..00000000 --- a/QSB/StatueSync/Events/StartStatueEvent.cs +++ /dev/null @@ -1,51 +0,0 @@ -using QSB.ClientServerStateSync; -using QSB.Events; -using QSB.Utility; -using UnityEngine; - -namespace QSB.StatueSync.Events -{ - internal class StartStatueEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBStartStatue, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBStartStatue, Handler); - - private void Handler(Vector3 position, Quaternion rotation, float degrees) - => SendEvent(CreateMessage(position, rotation, degrees)); - - private StartStatueMessage CreateMessage(Vector3 position, Quaternion rotation, float degrees) => new() - { - AboutId = LocalPlayerId, - PlayerPosition = position, - PlayerRotation = rotation, - CameraDegrees = degrees - }; - - public override void OnReceiveLocal(bool server, StartStatueMessage message) - { - if (!QSBCore.IsHost) - { - return; - } - - ServerStateManager.Instance.FireChangeServerStateEvent(ServerState.InStatueCutscene); - } - - public override void OnReceiveRemote(bool server, StartStatueMessage message) - { - StatueManager.Instance.BeginSequence(message.PlayerPosition, message.PlayerRotation, message.CameraDegrees); - - if (!QSBCore.IsHost) - { - return; - } - - ServerStateManager.Instance.FireChangeServerStateEvent(ServerState.InStatueCutscene); - } - } -} diff --git a/QSB/StatueSync/Events/StartStatueMessage.cs b/QSB/StatueSync/Events/StartStatueMessage.cs deleted file mode 100644 index 5e8a203e..00000000 --- a/QSB/StatueSync/Events/StartStatueMessage.cs +++ /dev/null @@ -1,29 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.StatueSync.Events -{ - public class StartStatueMessage : PlayerMessage - { - public Vector3 PlayerPosition { get; set; } - public Quaternion PlayerRotation { get; set; } - public float CameraDegrees { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - PlayerPosition = reader.ReadVector3(); - PlayerRotation = reader.ReadQuaternion(); - CameraDegrees = reader.ReadSingle(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(PlayerPosition); - writer.Write(PlayerRotation); - writer.Write(CameraDegrees); - } - } -} diff --git a/QSB/StatueSync/Messages/StartStatueMessage.cs b/QSB/StatueSync/Messages/StartStatueMessage.cs new file mode 100644 index 00000000..5b1e1727 --- /dev/null +++ b/QSB/StatueSync/Messages/StartStatueMessage.cs @@ -0,0 +1,59 @@ +using QSB.ClientServerStateSync; +using QSB.Messaging; +using QSB.WorldSync; +using QuantumUNET.Transport; +using UnityEngine; + +namespace QSB.StatueSync.Messages +{ + internal class StartStatueMessage : QSBMessage + { + private Vector3 PlayerPosition; + private Quaternion PlayerRotation; + private float CameraDegrees; + + public StartStatueMessage(Vector3 position, Quaternion rotation, float degrees) + { + PlayerPosition = position; + PlayerRotation = rotation; + CameraDegrees = degrees; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerPosition); + writer.Write(PlayerRotation); + writer.Write(CameraDegrees); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + PlayerPosition = reader.ReadVector3(); + PlayerRotation = reader.ReadQuaternion(); + CameraDegrees = reader.ReadSingle(); + } + + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveLocal() + { + if (QSBCore.IsHost) + { + ServerStateManager.Instance.SendChangeServerStateMessage(ServerState.InStatueCutscene); + } + } + + public override void OnReceiveRemote() + { + if (QSBCore.IsHost) + { + ServerStateManager.Instance.SendChangeServerStateMessage(ServerState.InStatueCutscene); + } + + StatueManager.Instance.BeginSequence(PlayerPosition, PlayerRotation, CameraDegrees); + } + } +} \ No newline at end of file diff --git a/QSB/StatueSync/Patches/StatuePatches.cs b/QSB/StatueSync/Patches/StatuePatches.cs index 821ae821..54885553 100644 --- a/QSB/StatueSync/Patches/StatuePatches.cs +++ b/QSB/StatueSync/Patches/StatuePatches.cs @@ -1,7 +1,8 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; +using QSB.StatueSync.Messages; using UnityEngine; namespace QSB.StatueSync.Patches @@ -13,27 +14,27 @@ namespace QSB.StatueSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(MemoryUplinkTrigger), nameof(MemoryUplinkTrigger.Update))] - public static bool MemoryUplinkTrigger_Update(bool ____waitForPlayerGrounded) + public static bool MemoryUplinkTrigger_Update(MemoryUplinkTrigger __instance) { if (StatueManager.Instance.HasStartedStatueLocally) { return true; } - if (!____waitForPlayerGrounded || !Locator.GetPlayerController().IsGrounded()) + if (!__instance._waitForPlayerGrounded || !Locator.GetPlayerController().IsGrounded()) { return true; } var playerBody = Locator.GetPlayerBody().transform; var timberHearth = Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform; - QSBEventManager.FireEvent( - EventNames.QSBStartStatue, + new StartStatueMessage( timberHearth.InverseTransformPoint(playerBody.position), Quaternion.Inverse(timberHearth.rotation) * playerBody.rotation, - Locator.GetPlayerCamera().GetComponent().GetDegreesY()); + Locator.GetPlayerCamera().GetComponent().GetDegreesY() + ).Send(); QSBPlayerManager.HideAllPlayers(); return true; } } -} +} \ No newline at end of file diff --git a/QSB/Syncs/Sectored/BaseSectoredSync.cs b/QSB/Syncs/Sectored/BaseSectoredSync.cs index 6b6d78db..d09b1a8c 100644 --- a/QSB/Syncs/Sectored/BaseSectoredSync.cs +++ b/QSB/Syncs/Sectored/BaseSectoredSync.cs @@ -104,7 +104,7 @@ namespace QSB.Syncs.Sectored var sector = _sectorIdWaitingSlot == -1 ? null - : QSBWorldSync.GetWorldFromId(_sectorIdWaitingSlot); + : _sectorIdWaitingSlot.GetWorldObject(); if (sector != ReferenceSector) { @@ -177,7 +177,7 @@ namespace QSB.Syncs.Sectored sectorId = reader.ReadInt32(); var sector = sectorId == -1 ? null - : QSBWorldSync.GetWorldFromId(sectorId); + : sectorId.GetWorldObject(); if (sector != ReferenceSector) { diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 39acc3a0..2de19ff7 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -15,7 +15,7 @@ namespace QSB.Syncs * God has cursed me for my hubris, and my work is never finished. */ - public abstract class SyncBase : QNetworkTransform where T: Component + public abstract class SyncBase : QNetworkTransform where T : Component { public uint AttachedNetId { diff --git a/QSB/TimeSync/Events/ServerTimeEvent.cs b/QSB/TimeSync/Events/ServerTimeEvent.cs deleted file mode 100644 index 71bc7e6e..00000000 --- a/QSB/TimeSync/Events/ServerTimeEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using QSB.Events; - -namespace QSB.TimeSync.Events -{ - public class ServerTimeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBServerTime, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBServerTime, Handler); - - private void Handler(float time, int count) => SendEvent(CreateMessage(time, count)); - - private ServerTimeMessage CreateMessage(float time, int count) => new() - { - AboutId = LocalPlayerId, - ServerTime = time, - LoopCount = count - }; - - public override void OnReceiveRemote(bool server, ServerTimeMessage message) => - WakeUpSync.LocalInstance.OnClientReceiveMessage(message); - } -} \ No newline at end of file diff --git a/QSB/TimeSync/Events/ServerTimeMessage.cs b/QSB/TimeSync/Messages/ServerTimeMessage.cs similarity index 51% rename from QSB/TimeSync/Events/ServerTimeMessage.cs rename to QSB/TimeSync/Messages/ServerTimeMessage.cs index 1c31a57d..5c3bdd03 100644 --- a/QSB/TimeSync/Events/ServerTimeMessage.cs +++ b/QSB/TimeSync/Messages/ServerTimeMessage.cs @@ -1,18 +1,17 @@ using QSB.Messaging; using QuantumUNET.Transport; -namespace QSB.TimeSync.Events +namespace QSB.TimeSync.Messages { - public class ServerTimeMessage : PlayerMessage + public class ServerTimeMessage : QSBMessage { - public float ServerTime { get; set; } - public int LoopCount { get; set; } + private float ServerTime; + private int LoopCount; - public override void Deserialize(QNetworkReader reader) + public ServerTimeMessage(float time, int count) { - base.Deserialize(reader); - ServerTime = reader.ReadSingle(); - LoopCount = reader.ReadInt16(); + ServerTime = time; + LoopCount = count; } public override void Serialize(QNetworkWriter writer) @@ -21,5 +20,15 @@ namespace QSB.TimeSync.Events writer.Write(ServerTime); writer.Write(LoopCount); } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ServerTime = reader.ReadSingle(); + LoopCount = reader.ReadInt16(); + } + + public override void OnReceiveRemote() + => WakeUpSync.LocalInstance.OnClientReceiveMessage(ServerTime, LoopCount); } } \ No newline at end of file diff --git a/QSB/TimeSync/PreserveTimeScale.cs b/QSB/TimeSync/PreserveTimeScale.cs index 9b9f8bcb..07ea132f 100644 --- a/QSB/TimeSync/PreserveTimeScale.cs +++ b/QSB/TimeSync/PreserveTimeScale.cs @@ -1,5 +1,4 @@ -using OWML.Utils; -using QuantumUNET; +using QuantumUNET; namespace QSB.TimeSync { @@ -19,7 +18,7 @@ namespace QSB.TimeSync var campfires = FindObjectsOfType(); foreach (var campfire in campfires) { - campfire.SetValue("_canSleepHere", false); // Stop players from sleeping at campfires + campfire._canSleepHere = false; // Stop players from sleeping at campfires } } } diff --git a/QSB/TimeSync/TimeSyncUI.cs b/QSB/TimeSync/TimeSyncUI.cs index 4e079f8f..d2ef1833 100644 --- a/QSB/TimeSync/TimeSyncUI.cs +++ b/QSB/TimeSync/TimeSyncUI.cs @@ -1,5 +1,4 @@ -using OWML.Utils; -using QSB.Utility; +using QSB.Utility; using QSB.WorldSync; using System; using System.Linq; @@ -33,8 +32,8 @@ namespace QSB.TimeSync { _isSetUp = true; var obj = QSBWorldSync.GetUnityObjects().First(); - _canvas = obj.GetValue("_canvas"); - _text = obj.GetValue("_text"); + _canvas = obj._canvas; + _text = obj._text; _canvas.enabled = false; } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index 03ae579d..31b27ff9 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -1,11 +1,11 @@ using OWML.Common; -using OWML.Utils; using QSB.ClientServerStateSync; using QSB.DeathSync; -using QSB.Events; using QSB.Inputs; +using QSB.Messaging; using QSB.Player; -using QSB.TimeSync.Events; +using QSB.Player.Messages; +using QSB.TimeSync.Messages; using QSB.Utility; using QuantumUNET; using System; @@ -66,7 +66,7 @@ namespace QSB.TimeSync QSBSceneManager.OnSceneLoaded += OnSceneLoaded; - GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp); + GlobalMessenger.AddListener(OWEvents.WakeUp, OnWakeUp); } public float GetTimeDifference() @@ -89,7 +89,7 @@ namespace QSB.TimeSync public void OnDestroy() { QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; - GlobalMessenger.RemoveListener(EventNames.WakeUp, OnWakeUp); + GlobalMessenger.RemoveListener(OWEvents.WakeUp, OnWakeUp); } private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool isInUniverse) @@ -112,7 +112,7 @@ namespace QSB.TimeSync private void Init() { - QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); + new RequestStateResyncMessage().Send(); CurrentState = State.Loaded; gameObject.GetAddComponent(); if (IsServer) @@ -129,12 +129,12 @@ namespace QSB.TimeSync } private void SendServerTime() - => QSBEventManager.FireEvent(EventNames.QSBServerTime, _serverTime, PlayerData.LoadLoopCount()); + => new ServerTimeMessage(_serverTime, PlayerData.LoadLoopCount()).Send(); - public void OnClientReceiveMessage(ServerTimeMessage message) + public void OnClientReceiveMessage(float time, int count) { - _serverTime = message.ServerTime; - _serverLoopCount = message.LoopCount; + _serverTime = time; + _serverLoopCount = count; } private void WakeUpOrSleep() @@ -228,7 +228,7 @@ namespace QSB.TimeSync Physics.SyncTransforms(); SpinnerUI.Hide(); TimeSyncUI.Stop(); - QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); + new RequestStateResyncMessage().Send(); RespawnOnDeath.Instance.Init(); QSBInputManager.Instance.SetInputsEnabled(true); @@ -240,7 +240,7 @@ namespace QSB.TimeSync } private void WakeUp() - => Locator.GetPlayerCamera().GetComponent().Invoke("WakeUp"); + => Locator.GetPlayerCamera().GetComponent().WakeUp(); public void Update() { @@ -295,7 +295,7 @@ namespace QSB.TimeSync { //? DebugLog.ToConsole($"Warning - Server waiting for players to die, but players waiting for ready signal! Assume players correct.", MessageType.Warning); - ServerStateManager.Instance.FireChangeServerStateEvent(ServerState.WaitingForAllPlayersToReady); + ServerStateManager.Instance.SendChangeServerStateMessage(ServerState.WaitingForAllPlayersToReady); } } diff --git a/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs b/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs deleted file mode 100644 index c2a6693d..00000000 --- a/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.FlashlightTool.Events -{ - public class PlayerFlashlightEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.TurnOnFlashlight, HandleTurnOn); - GlobalMessenger.AddListener(EventNames.TurnOffFlashlight, HandleTurnOff); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.TurnOnFlashlight, HandleTurnOn); - GlobalMessenger.RemoveListener(EventNames.TurnOffFlashlight, HandleTurnOff); - } - - private void HandleTurnOn() => SendEvent(CreateMessage(true)); - private void HandleTurnOff() => SendEvent(CreateMessage(false)); - - private ToggleMessage CreateMessage(bool value) => new() - { - AboutId = LocalPlayerId, - ToggleValue = value - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.FlashlightActive = message.ToggleValue; - player.FlashLight?.UpdateState(message.ToggleValue); - } - - public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.FlashlightActive = message.ToggleValue; - } -} \ No newline at end of file diff --git a/QSB/Tools/FlashlightTool/Messages/PlayerFlashlightMessage.cs b/QSB/Tools/FlashlightTool/Messages/PlayerFlashlightMessage.cs new file mode 100644 index 00000000..8e45cc19 --- /dev/null +++ b/QSB/Tools/FlashlightTool/Messages/PlayerFlashlightMessage.cs @@ -0,0 +1,35 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; + +namespace QSB.Tools.FlashlightTool.Messages +{ + public class PlayerFlashlightMessage : QSBBoolMessage + { + static PlayerFlashlightMessage() + { + GlobalMessenger.AddListener(OWEvents.TurnOnFlashlight, () => Handle(true)); + GlobalMessenger.AddListener(OWEvents.TurnOffFlashlight, () => Handle(false)); + } + + private static void Handle(bool on) + { + if (PlayerTransformSync.LocalInstance) + { + new PlayerFlashlightMessage(on).Send(); + } + } + + private PlayerFlashlightMessage(bool on) => Value = on; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.FlashlightActive = Value; + player.FlashLight?.UpdateState(Value); + } + + public override void OnReceiveLocal() => + QSBPlayerManager.LocalPlayer.FlashlightActive = Value; + } +} \ No newline at end of file diff --git a/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs deleted file mode 100644 index e4f16628..00000000 --- a/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs +++ /dev/null @@ -1,76 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; -using QSB.Utility; - -namespace QSB.Tools.ProbeLauncherTool.Events -{ - public class EquipProbeLauncherEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - private bool _nonPlayerLauncherEquipped; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.ProbeLauncherEquipped, HandleEquip); - GlobalMessenger.AddListener(EventNames.ProbeLauncherUnequipped, HandleUnequip); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.ProbeLauncherEquipped, HandleEquip); - GlobalMessenger.RemoveListener(EventNames.ProbeLauncherUnequipped, HandleUnequip); - } - - private void HandleEquip(ProbeLauncher var) - { - if (var != QSBPlayerManager.LocalPlayer.LocalProbeLauncher) - { - _nonPlayerLauncherEquipped = true; - return; - } - - if (_nonPlayerLauncherEquipped) - { - DebugLog.ToConsole($"Warning - Trying to equip player launcher whilst non player launcher is still equipped?", OWML.Common.MessageType.Warning); - return; - } - - SendEvent(CreateMessage(true)); - } - - private void HandleUnequip(ProbeLauncher var) - { - if (var != QSBPlayerManager.LocalPlayer.LocalProbeLauncher) - { - _nonPlayerLauncherEquipped = false; - return; - } - - if (_nonPlayerLauncherEquipped) - { - DebugLog.ToConsole($"Warning - Trying to de-equip player launcher whilst non player launcher is still equipped?", OWML.Common.MessageType.Warning); - return; - } - - SendEvent(CreateMessage(false)); - } - - private ToggleMessage CreateMessage(bool value) => new() - { - AboutId = LocalPlayerId, - ToggleValue = value - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.ProbeLauncherEquipped = message.ToggleValue; - player.ProbeLauncher?.ChangeEquipState(message.ToggleValue); - } - - public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.ProbeLauncherEquipped = message.ToggleValue; - } -} \ No newline at end of file diff --git a/QSB/Tools/ProbeLauncherTool/Events/LaunchProbeEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/LaunchProbeEvent.cs deleted file mode 100644 index c2a1360f..00000000 --- a/QSB/Tools/ProbeLauncherTool/Events/LaunchProbeEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.Events; -using QSB.Tools.ProbeLauncherTool.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.Tools.ProbeLauncherTool.Events -{ - internal class LaunchProbeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBLaunchProbe, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBLaunchProbe, Handler); - - private void Handler(QSBProbeLauncher launcher) => SendEvent(CreateMessage(launcher)); - - private BoolWorldObjectMessage CreateMessage(QSBProbeLauncher launcher) => new() - { - AboutId = LocalPlayerId, - ObjectId = launcher.ObjectId - }; - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.LaunchProbe(); - } - } -} diff --git a/QSB/Tools/ProbeLauncherTool/Events/PlayerLaunchProbeEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/PlayerLaunchProbeEvent.cs deleted file mode 100644 index d37f9bef..00000000 --- a/QSB/Tools/ProbeLauncherTool/Events/PlayerLaunchProbeEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.ProbeLauncherTool.Events -{ - internal class PlayerLaunchProbeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBPlayerLaunchProbe, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBPlayerLaunchProbe, Handler); - - private void Handler() => SendEvent(CreateMessage()); - - private PlayerMessage CreateMessage() => new() - { - AboutId = LocalPlayerId - }; - - public override void OnReceiveRemote(bool server, PlayerMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.ProbeLauncher.LaunchProbe(); - } - } -} diff --git a/QSB/Tools/ProbeLauncherTool/Events/PlayerRetrieveProbeEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/PlayerRetrieveProbeEvent.cs deleted file mode 100644 index 5ada54c6..00000000 --- a/QSB/Tools/ProbeLauncherTool/Events/PlayerRetrieveProbeEvent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.ProbeLauncherTool.Events -{ - internal class PlayerRetrieveProbeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBPlayerRetrieveProbe, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBPlayerRetrieveProbe, Handler); - - private void Handler(bool playEffects) => SendEvent(CreateMessage(playEffects)); - - private BoolMessage CreateMessage(bool playEffects) => new() - { - AboutId = LocalPlayerId, - Value = playEffects - }; - - public override void OnReceiveRemote(bool server, BoolMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.ProbeLauncher.RetrieveProbe(message.Value); - } - } -} diff --git a/QSB/Tools/ProbeLauncherTool/Events/RetrieveProbeEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/RetrieveProbeEvent.cs deleted file mode 100644 index d22582ee..00000000 --- a/QSB/Tools/ProbeLauncherTool/Events/RetrieveProbeEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.Tools.ProbeLauncherTool.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.Tools.ProbeLauncherTool.Events -{ - internal class RetrieveProbeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBRetrieveProbe, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBRetrieveProbe, Handler); - - private void Handler(QSBProbeLauncher launcher, bool playEffects) => SendEvent(CreateMessage(launcher, playEffects)); - - private BoolWorldObjectMessage CreateMessage(QSBProbeLauncher launcher, bool playEffects) => new() - { - AboutId = LocalPlayerId, - ObjectId = launcher.ObjectId, - State = playEffects - }; - - public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.RetrieveProbe(message.State); - } - } -} diff --git a/QSB/Tools/ProbeLauncherTool/Messages/EquipProbeLauncherMessage.cs b/QSB/Tools/ProbeLauncherTool/Messages/EquipProbeLauncherMessage.cs new file mode 100644 index 00000000..df21ea67 --- /dev/null +++ b/QSB/Tools/ProbeLauncherTool/Messages/EquipProbeLauncherMessage.cs @@ -0,0 +1,51 @@ +using OWML.Common; +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; +using QSB.Utility; + +namespace QSB.Tools.ProbeLauncherTool.Messages +{ + public class EquipProbeLauncherMessage : QSBBoolMessage + { + static EquipProbeLauncherMessage() + { + GlobalMessenger.AddListener(OWEvents.ProbeLauncherEquipped, launcher => Handle(launcher, true)); + GlobalMessenger.AddListener(OWEvents.ProbeLauncherUnequipped, launcher => Handle(launcher, false)); + } + + private static bool _nonPlayerLauncherEquipped; + + private static void Handle(ProbeLauncher launcher, bool equipped) + { + if (PlayerTransformSync.LocalInstance) + { + if (launcher != QSBPlayerManager.LocalPlayer.LocalProbeLauncher) + { + _nonPlayerLauncherEquipped = equipped; + return; + } + + if (_nonPlayerLauncherEquipped) + { + DebugLog.ToConsole($"Warning - Trying to equip/unequip player launcher whilst non player launcher is still equipped?", MessageType.Warning); + return; + } + + new EquipProbeLauncherMessage(equipped).Send(); + } + } + + private EquipProbeLauncherMessage(bool equipped) => Value = equipped; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.ProbeLauncherEquipped = Value; + player.ProbeLauncher?.ChangeEquipState(Value); + } + + public override void OnReceiveLocal() => + QSBPlayerManager.LocalPlayer.ProbeLauncherEquipped = Value; + } +} \ No newline at end of file diff --git a/QSB/Tools/ProbeLauncherTool/Messages/LaunchProbeMessage.cs b/QSB/Tools/ProbeLauncherTool/Messages/LaunchProbeMessage.cs new file mode 100644 index 00000000..6178fc3f --- /dev/null +++ b/QSB/Tools/ProbeLauncherTool/Messages/LaunchProbeMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.Tools.ProbeLauncherTool.WorldObjects; + +namespace QSB.Tools.ProbeLauncherTool.Messages +{ + internal class LaunchProbeMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.LaunchProbe(); + } +} diff --git a/QSB/Tools/ProbeLauncherTool/Messages/PlayerLaunchProbeMessage.cs b/QSB/Tools/ProbeLauncherTool/Messages/PlayerLaunchProbeMessage.cs new file mode 100644 index 00000000..02f043cf --- /dev/null +++ b/QSB/Tools/ProbeLauncherTool/Messages/PlayerLaunchProbeMessage.cs @@ -0,0 +1,17 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; + +namespace QSB.Tools.ProbeLauncherTool.Messages +{ + internal class PlayerLaunchProbeMessage : QSBMessage + { + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.ProbeLauncher.LaunchProbe(); + } + } +} diff --git a/QSB/Tools/ProbeLauncherTool/Messages/PlayerRetrieveProbeMessage.cs b/QSB/Tools/ProbeLauncherTool/Messages/PlayerRetrieveProbeMessage.cs new file mode 100644 index 00000000..5a521f1a --- /dev/null +++ b/QSB/Tools/ProbeLauncherTool/Messages/PlayerRetrieveProbeMessage.cs @@ -0,0 +1,19 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; + +namespace QSB.Tools.ProbeLauncherTool.Messages +{ + internal class PlayerRetrieveProbeMessage : QSBBoolMessage + { + public PlayerRetrieveProbeMessage(bool playEffects) => Value = playEffects; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.ProbeLauncher.RetrieveProbe(Value); + } + } +} diff --git a/QSB/Tools/ProbeLauncherTool/Messages/RetrieveProbeMessage.cs b/QSB/Tools/ProbeLauncherTool/Messages/RetrieveProbeMessage.cs new file mode 100644 index 00000000..1316363b --- /dev/null +++ b/QSB/Tools/ProbeLauncherTool/Messages/RetrieveProbeMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.Tools.ProbeLauncherTool.WorldObjects; + +namespace QSB.Tools.ProbeLauncherTool.Messages +{ + internal class RetrieveProbeMessage : QSBBoolWorldObjectMessage + { + public RetrieveProbeMessage(bool state) => Value = state; + + public override void OnReceiveRemote() => WorldObject.RetrieveProbe(Value); + } +} diff --git a/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs b/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs index 643e4b36..ebb4e8b3 100644 --- a/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs +++ b/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs @@ -1,11 +1,11 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Player; +using QSB.Tools.ProbeLauncherTool.Messages; using QSB.Tools.ProbeLauncherTool.WorldObjects; using QSB.Utility; using QSB.WorldSync; -using UnityEngine; namespace QSB.Tools.ProbeLauncherTool.Patches { @@ -19,50 +19,44 @@ namespace QSB.Tools.ProbeLauncherTool.Patches public static bool ProbeLauncher_RetrieveProbe( ProbeLauncher __instance, bool playEffects, - bool forcedRetrieval, - ref bool ____isRetrieving, - SurveyorProbe ____activeProbe, - NotificationTarget ____notificationFilter, - GameObject ____preLaunchProbeProxy, - ProbeLauncherEffects ____effects, - SingularityWarpEffect ____probeRetrievalEffect, - float ____probeRetrievalLength) + bool forcedRetrieval) { - if (____isRetrieving) + if (__instance._isRetrieving) { return false; } - if (____activeProbe != null) + if (__instance._activeProbe != null) { - if (____activeProbe.IsLaunched() && TimelineObliterationController.IsParadoxProbeActive() && !forcedRetrieval) + if (__instance._activeProbe.IsLaunched() && TimelineObliterationController.IsParadoxProbeActive() && !forcedRetrieval) { - var data = new NotificationData(____notificationFilter, UITextLibrary.GetString(UITextType.NotificationMultProbe), 3f, true); - NotificationManager.SharedInstance.PostNotification(data, false); + var data = new NotificationData(__instance._notificationFilter, UITextLibrary.GetString(UITextType.NotificationMultProbe), 3f); + NotificationManager.SharedInstance.PostNotification(data); Locator.GetPlayerAudioController().PlayNegativeUISound(); return false; } - ____activeProbe.GetRotatingCamera().ResetRotation(); - ____preLaunchProbeProxy.SetActive(true); + __instance._activeProbe.GetRotatingCamera().ResetRotation(); + __instance._preLaunchProbeProxy.SetActive(true); if (playEffects) { - ____effects.PlayRetrievalClip(); - ____probeRetrievalEffect.WarpObjectIn(____probeRetrievalLength); + __instance._effects.PlayRetrievalClip(); + __instance._probeRetrievalEffect.WarpObjectIn(__instance._probeRetrievalLength); } if (__instance != QSBPlayerManager.LocalPlayer.LocalProbeLauncher) { - QSBEventManager.FireEvent(EventNames.QSBRetrieveProbe, QSBWorldSync.GetWorldFromUnity(__instance), playEffects); + __instance.GetWorldObject() + .SendMessage(new RetrieveProbeMessage(playEffects)); } else { - QSBEventManager.FireEvent(EventNames.QSBPlayerRetrieveProbe, playEffects); + new PlayerRetrieveProbeMessage(playEffects).Send(); } - ____activeProbe.Retrieve(____probeRetrievalLength); - ____isRetrieving = true; + __instance._activeProbe.Retrieve(__instance._probeRetrievalLength); + __instance._isRetrieving = true; } return false; diff --git a/QSB/Tools/ProbeLauncherTool/ProbeLauncherListener.cs b/QSB/Tools/ProbeLauncherTool/ProbeLauncherListener.cs index 726c643e..a222b48f 100644 --- a/QSB/Tools/ProbeLauncherTool/ProbeLauncherListener.cs +++ b/QSB/Tools/ProbeLauncherTool/ProbeLauncherListener.cs @@ -1,4 +1,5 @@ -using QSB.Events; +using QSB.Messaging; +using QSB.Tools.ProbeLauncherTool.Messages; using UnityEngine; namespace QSB.Tools.ProbeLauncherTool @@ -13,6 +14,10 @@ namespace QSB.Tools.ProbeLauncherTool _attachedLauncher.OnLaunchProbe += OnLaunchProbe; } - private void OnLaunchProbe(SurveyorProbe probe) => QSBEventManager.FireEvent(EventNames.QSBPlayerLaunchProbe); + private void OnDestroy() => + _attachedLauncher.OnLaunchProbe -= OnLaunchProbe; + + private static void OnLaunchProbe(SurveyorProbe probe) => + new PlayerLaunchProbeMessage().Send(); } } diff --git a/QSB/Tools/ProbeLauncherTool/QSBProbeLauncherTool.cs b/QSB/Tools/ProbeLauncherTool/QSBProbeLauncherTool.cs index b24a0675..8a97b0a6 100644 --- a/QSB/Tools/ProbeLauncherTool/QSBProbeLauncherTool.cs +++ b/QSB/Tools/ProbeLauncherTool/QSBProbeLauncherTool.cs @@ -1,5 +1,4 @@ -using QSB.Utility; -using UnityEngine; +using UnityEngine; namespace QSB.Tools.ProbeLauncherTool { diff --git a/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs b/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs index c3517b02..b6f0ffd8 100644 --- a/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs +++ b/QSB/Tools/ProbeLauncherTool/WorldObjects/QSBProbeLauncher.cs @@ -1,5 +1,5 @@ -using OWML.Utils; -using QSB.Events; +using QSB.Messaging; +using QSB.Tools.ProbeLauncherTool.Messages; using QSB.WorldSync; using UnityEngine; @@ -14,14 +14,20 @@ namespace QSB.Tools.ProbeLauncherTool.WorldObjects public override void Init() { - _probeRetrievalLength = AttachedObject.GetValue("_probeRetrievalLength"); - _preLaunchProbeProxy = AttachedObject.GetValue("_preLaunchProbeProxy"); - _effects = AttachedObject.GetValue("_effects"); - _probeRetrievalEffect = AttachedObject.GetValue("_probeRetrievalEffect"); + _probeRetrievalLength = AttachedObject._probeRetrievalLength; + _preLaunchProbeProxy = AttachedObject._preLaunchProbeProxy; + _effects = AttachedObject._effects; + _probeRetrievalEffect = AttachedObject._probeRetrievalEffect; - AttachedObject.OnLaunchProbe += (SurveyorProbe probe) => QSBEventManager.FireEvent(EventNames.QSBLaunchProbe, this); + AttachedObject.OnLaunchProbe += OnLaunchProbe; } + public override void OnRemoval() => + AttachedObject.OnLaunchProbe -= OnLaunchProbe; + + private void OnLaunchProbe(SurveyorProbe probe) => + this.SendMessage(new LaunchProbeMessage()); + public void RetrieveProbe(bool playEffects) { _preLaunchProbeProxy.SetActive(true); diff --git a/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs b/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs deleted file mode 100644 index b54ff004..00000000 --- a/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.ProbeTool.Events -{ - internal class PlayerProbeEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBProbeEvent, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBProbeEvent, Handler); - - private void Handler(ProbeEvent probeEvent) => SendEvent(CreateMessage(probeEvent)); - - private EnumMessage CreateMessage(ProbeEvent probeEvent) => new() - { - AboutId = LocalPlayerId, - EnumValue = probeEvent - }; - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - if (!player.IsReady || player.Probe == null) - { - return; - } - - var probe = player.Probe; - - probe.HandleEvent(message.EnumValue); - } - } -} diff --git a/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs b/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs deleted file mode 100644 index b66c1a2e..00000000 --- a/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs +++ /dev/null @@ -1,37 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.ProbeTool.Events -{ - internal class ProbeStartRetrieveEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBProbeStartRetrieve, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBProbeStartRetrieve, Handler); - - private void Handler(float duration) => SendEvent(CreateMessage(duration)); - - private FloatMessage CreateMessage(float duration) => new() - { - AboutId = LocalPlayerId, - Value = duration - }; - - public override void OnReceiveRemote(bool server, FloatMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - if (!player.IsReady || player.Probe == null) - { - return; - } - - var probe = player.Probe; - probe.OnStartRetrieve(message.Value); - } - } -} diff --git a/QSB/Tools/ProbeTool/Messages/PlayerProbeEventMessage.cs b/QSB/Tools/ProbeTool/Messages/PlayerProbeEventMessage.cs new file mode 100644 index 00000000..721227c7 --- /dev/null +++ b/QSB/Tools/ProbeTool/Messages/PlayerProbeEventMessage.cs @@ -0,0 +1,25 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; + +namespace QSB.Tools.ProbeTool.Messages +{ + internal class PlayerProbeEventMessage : QSBEnumMessage + { + public PlayerProbeEventMessage(ProbeEvent probeEvent) => Value = probeEvent; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + if (!player.IsReady || player.Probe == null) + { + return; + } + + var probe = player.Probe; + probe.HandleEvent(Value); + } + } +} diff --git a/QSB/Tools/ProbeTool/Messages/ProbeStartRetrieveMessage.cs b/QSB/Tools/ProbeTool/Messages/ProbeStartRetrieveMessage.cs new file mode 100644 index 00000000..537e0994 --- /dev/null +++ b/QSB/Tools/ProbeTool/Messages/ProbeStartRetrieveMessage.cs @@ -0,0 +1,25 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.WorldSync; + +namespace QSB.Tools.ProbeTool.Messages +{ + internal class ProbeStartRetrieveMessage : QSBFloatMessage + { + public ProbeStartRetrieveMessage(float duration) => Value = duration; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + if (!player.IsReady || player.Probe == null) + { + return; + } + + var probe = player.Probe; + probe.OnStartRetrieve(Value); + } + } +} diff --git a/QSB/Tools/ProbeTool/ProbeListener.cs b/QSB/Tools/ProbeTool/ProbeListener.cs index cca659dd..04071b0e 100644 --- a/QSB/Tools/ProbeTool/ProbeListener.cs +++ b/QSB/Tools/ProbeTool/ProbeListener.cs @@ -1,4 +1,5 @@ -using QSB.Events; +using QSB.Messaging; +using QSB.Tools.ProbeTool.Messages; using UnityEngine; namespace QSB.Tools.ProbeTool @@ -33,22 +34,22 @@ namespace QSB.Tools.ProbeTool _attachedProbe.OnStartRetrieveProbe -= OnStartRetrieveProbe; } - private void OnLaunchProbe() - => QSBEventManager.FireEvent(EventNames.QSBProbeEvent, ProbeEvent.Launch); + private static void OnLaunchProbe() + => new PlayerProbeEventMessage(ProbeEvent.Launch).Send(); - private void OnAnchorProbe() - => QSBEventManager.FireEvent(EventNames.QSBProbeEvent, ProbeEvent.Anchor); + private static void OnAnchorProbe() + => new PlayerProbeEventMessage(ProbeEvent.Anchor).Send(); - private void OnUnanchorProbe() - => QSBEventManager.FireEvent(EventNames.QSBProbeEvent, ProbeEvent.Unanchor); + private static void OnUnanchorProbe() + => new PlayerProbeEventMessage(ProbeEvent.Unanchor).Send(); - private void OnRetrieveProbe() - => QSBEventManager.FireEvent(EventNames.QSBProbeEvent, ProbeEvent.Retrieve); + private static void OnRetrieveProbe() + => new PlayerProbeEventMessage(ProbeEvent.Retrieve).Send(); - private void OnProbeDestroyed() - => QSBEventManager.FireEvent(EventNames.QSBProbeEvent, ProbeEvent.Destroy); + private static void OnProbeDestroyed() + => new PlayerProbeEventMessage(ProbeEvent.Destroy).Send(); - private void OnStartRetrieveProbe(float length) - => QSBEventManager.FireEvent(EventNames.QSBProbeStartRetrieve, length); + private static void OnStartRetrieveProbe(float length) + => new ProbeStartRetrieveMessage(length).Send(); } } diff --git a/QSB/Tools/ProbeTool/QSBProbeEffects.cs b/QSB/Tools/ProbeTool/QSBProbeEffects.cs index 2d549084..9741fad6 100644 --- a/QSB/Tools/ProbeTool/QSBProbeEffects.cs +++ b/QSB/Tools/ProbeTool/QSBProbeEffects.cs @@ -35,7 +35,7 @@ namespace QSB.Tools.ProbeTool _probe.OnStartRetrieveProbe -= OnStartRetrieve; } - private void OnLaunch() => _flightLoopAudio.FadeIn(0.1f, true, true, 1f); + private void OnLaunch() => _flightLoopAudio.FadeIn(0.1f, true, true); private void OnAnchor() { @@ -49,14 +49,14 @@ namespace QSB.Tools.ProbeTool //{ _anchorParticles.Play(); //} - _flightLoopAudio.FadeOut(0.5f, OWAudioSource.FadeOutCompleteAction.STOP, 0f); - _anchorAudio.PlayOneShot(AudioType.ToolProbeAttach, 1f); + _flightLoopAudio.FadeOut(0.5f); + _anchorAudio.PlayOneShot(AudioType.ToolProbeAttach); } private void OnUnanchor() - => _flightLoopAudio.FadeIn(0.5f, false, false, 1f); + => _flightLoopAudio.FadeIn(0.5f); private void OnStartRetrieve(float retrieveLength) - => _flightLoopAudio.FadeOut(retrieveLength, OWAudioSource.FadeOutCompleteAction.STOP, 0f); + => _flightLoopAudio.FadeOut(retrieveLength); } } diff --git a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs index cda42af0..e180f3cc 100644 --- a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs +++ b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs @@ -1,7 +1,5 @@ using OWML.Common; -using OWML.Utils; using QSB.SectorSync; -using QSB.Syncs; using QSB.Syncs.Sectored.Transforms; using QSB.Tools.ProbeLauncherTool; using QSB.Utility; @@ -85,7 +83,7 @@ namespace QSB.Tools.ProbeTool.TransformSync var probeLauncher = Player.LocalProbeLauncher; // TODO : make this sync to the *active* probe launcher's _launcherTransform - var launcherTransform = probeLauncher.GetValue("_launcherTransform"); + var launcherTransform = probeLauncher._launcherTransform; probeOWRigidbody.SetPosition(launcherTransform.position); probeOWRigidbody.SetRotation(launcherTransform.rotation); diff --git a/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs b/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs deleted file mode 100644 index abecc140..00000000 --- a/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.SignalscopeTool.Events -{ - public class PlayerSignalscopeEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.EquipSignalscope, HandleEquip); - GlobalMessenger.AddListener(EventNames.UnequipSignalscope, HandleUnequip); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.EquipSignalscope, HandleEquip); - GlobalMessenger.RemoveListener(EventNames.UnequipSignalscope, HandleUnequip); - } - - private void HandleEquip(Signalscope var) => SendEvent(CreateMessage(true)); - private void HandleUnequip() => SendEvent(CreateMessage(false)); - - private ToggleMessage CreateMessage(bool value) => new() - { - AboutId = LocalPlayerId, - ToggleValue = value - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.SignalscopeEquipped = message.ToggleValue; - player.Signalscope?.ChangeEquipState(message.ToggleValue); - } - - public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.SignalscopeEquipped = message.ToggleValue; - } -} \ No newline at end of file diff --git a/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifyFrequencyEvent.cs b/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifyFrequencyEvent.cs deleted file mode 100644 index 1f5a71dc..00000000 --- a/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifyFrequencyEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.SignalscopeTool.FrequencySync.Events -{ - public class IdentifyFrequencyEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBIdentifyFrequency, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBIdentifyFrequency, Handler); - - private void Handler(SignalFrequency frequency) => SendEvent(CreateMessage(frequency)); - - private EnumMessage CreateMessage(SignalFrequency frequency) => new() - { - AboutId = QSBPlayerManager.LocalPlayerId, - EnumValue = frequency - }; - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - PlayerData.LearnFrequency(message.EnumValue); - var displayMsg = $"{UITextLibrary.GetString(UITextType.NotificationNewFreq)} {AudioSignal.FrequencyToString(message.EnumValue, false)}"; - var data = new NotificationData(NotificationTarget.All, displayMsg, 10f, true); - NotificationManager.SharedInstance.PostNotification(data, false); - } - } -} diff --git a/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifySignalEvent.cs b/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifySignalEvent.cs deleted file mode 100644 index 54eccc49..00000000 --- a/QSB/Tools/SignalscopeTool/FrequencySync/Events/IdentifySignalEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.SignalscopeTool.FrequencySync.Events -{ - public class IdentifySignalEvent : QSBEvent> - { - // TODO : fix this with save-sync - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBIdentifySignal, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBIdentifySignal, Handler); - - private void Handler(SignalName name) => SendEvent(CreateMessage(name)); - - private EnumMessage CreateMessage(SignalName name) => new() - { - AboutId = QSBPlayerManager.LocalPlayerId, - EnumValue = name - }; - - public override void OnReceiveRemote(bool server, EnumMessage message) - { - PlayerData.LearnSignal(message.EnumValue); - QSBEventManager.FireEvent("IdentifySignal"); - var displayMsg = $"{UITextLibrary.GetString(UITextType.NotificationSignalIdentified)} {AudioSignal.SignalNameToString(message.EnumValue)}"; - var data = new NotificationData(NotificationTarget.All, displayMsg, 10f, true); - NotificationManager.SharedInstance.PostNotification(data, false); - } - } -} \ No newline at end of file diff --git a/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifyFrequencyMessage.cs b/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifyFrequencyMessage.cs new file mode 100644 index 00000000..408590aa --- /dev/null +++ b/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifyFrequencyMessage.cs @@ -0,0 +1,20 @@ +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.Tools.SignalscopeTool.FrequencySync.Messages +{ + public class IdentifyFrequencyMessage : QSBEnumMessage + { + public IdentifyFrequencyMessage(SignalFrequency frequency) => Value = frequency; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + PlayerData.LearnFrequency(Value); + var displayMsg = $"{UITextLibrary.GetString(UITextType.NotificationNewFreq)} {AudioSignal.FrequencyToString(Value, false)}"; + var data = new NotificationData(NotificationTarget.All, displayMsg, 10f); + NotificationManager.SharedInstance.PostNotification(data); + } + } +} diff --git a/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifySignalMessage.cs b/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifySignalMessage.cs new file mode 100644 index 00000000..dc4b3732 --- /dev/null +++ b/QSB/Tools/SignalscopeTool/FrequencySync/Messages/IdentifySignalMessage.cs @@ -0,0 +1,21 @@ +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.Tools.SignalscopeTool.FrequencySync.Messages +{ + public class IdentifySignalMessage : QSBEnumMessage + { + public IdentifySignalMessage(SignalName name) => Value = name; + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + PlayerData.LearnSignal(Value); + GlobalMessenger.FireEvent("IdentifySignal"); + var displayMsg = $"{UITextLibrary.GetString(UITextType.NotificationSignalIdentified)} {AudioSignal.SignalNameToString(Value)}"; + var data = new NotificationData(NotificationTarget.All, displayMsg, 10f); + NotificationManager.SharedInstance.PostNotification(data); + } + } +} \ No newline at end of file diff --git a/QSB/Tools/SignalscopeTool/FrequencySync/Patches/FrequencyPatches.cs b/QSB/Tools/SignalscopeTool/FrequencySync/Patches/FrequencyPatches.cs index 9a6ac156..f10b26de 100644 --- a/QSB/Tools/SignalscopeTool/FrequencySync/Patches/FrequencyPatches.cs +++ b/QSB/Tools/SignalscopeTool/FrequencySync/Patches/FrequencyPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.Tools.SignalscopeTool.FrequencySync.Messages; namespace QSB.Tools.SignalscopeTool.FrequencySync.Patches { @@ -11,12 +12,12 @@ namespace QSB.Tools.SignalscopeTool.FrequencySync.Patches [HarmonyPostfix] [HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.IdentifyFrequency))] - public static void IdentifyFrequencyEvent(SignalFrequency ____frequency) - => QSBEventManager.FireEvent(EventNames.QSBIdentifyFrequency, ____frequency); + public static void IdentifyFrequencyEvent(AudioSignal __instance) + => new IdentifyFrequencyMessage(__instance._frequency).Send(); [HarmonyPostfix] [HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.IdentifySignal))] - public static void IdentifySignalEvent(SignalName ____name) - => QSBEventManager.FireEvent(EventNames.QSBIdentifySignal, ____name); + public static void IdentifySignalEvent(AudioSignal __instance) + => new IdentifySignalMessage(__instance._name).Send(); } } diff --git a/QSB/Tools/SignalscopeTool/Messages/PlayerSignalscopeMessage.cs b/QSB/Tools/SignalscopeTool/Messages/PlayerSignalscopeMessage.cs new file mode 100644 index 00000000..e4abdaf6 --- /dev/null +++ b/QSB/Tools/SignalscopeTool/Messages/PlayerSignalscopeMessage.cs @@ -0,0 +1,35 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; + +namespace QSB.Tools.SignalscopeTool.Messages +{ + public class PlayerSignalscopeMessage : QSBBoolMessage + { + static PlayerSignalscopeMessage() + { + GlobalMessenger.AddListener(OWEvents.EquipSignalscope, _ => Handle(true)); + GlobalMessenger.AddListener(OWEvents.UnequipSignalscope, () => Handle(false)); + } + + private static void Handle(bool equipped) + { + if (PlayerTransformSync.LocalInstance) + { + new PlayerSignalscopeMessage(equipped).Send(); + } + } + + private PlayerSignalscopeMessage(bool equipped) => Value = equipped; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.SignalscopeEquipped = Value; + player.Signalscope?.ChangeEquipState(Value); + } + + public override void OnReceiveLocal() => + QSBPlayerManager.LocalPlayer.SignalscopeEquipped = Value; + } +} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs b/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs deleted file mode 100644 index 62765d73..00000000 --- a/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using QSB.Events; -using QSB.Messaging; -using QSB.Player; - -namespace QSB.Tools.TranslatorTool.Events -{ - public class PlayerTranslatorEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() - { - GlobalMessenger.AddListener(EventNames.EquipTranslator, HandleEquip); - GlobalMessenger.AddListener(EventNames.UnequipTranslator, HandleUnequip); - } - - public override void CloseListener() - { - GlobalMessenger.RemoveListener(EventNames.EquipTranslator, HandleEquip); - GlobalMessenger.RemoveListener(EventNames.UnequipTranslator, HandleUnequip); - } - - private void HandleEquip() => SendEvent(CreateMessage(true)); - private void HandleUnequip() => SendEvent(CreateMessage(false)); - - private ToggleMessage CreateMessage(bool value) => new() - { - AboutId = LocalPlayerId, - ToggleValue = value - }; - - public override void OnReceiveRemote(bool server, ToggleMessage message) - { - var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.TranslatorEquipped = message.ToggleValue; - player.Translator?.ChangeEquipState(message.ToggleValue); - } - - public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.TranslatorEquipped = message.ToggleValue; - } -} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/Messages/PlayerTranslatorMessage.cs b/QSB/Tools/TranslatorTool/Messages/PlayerTranslatorMessage.cs new file mode 100644 index 00000000..caa57577 --- /dev/null +++ b/QSB/Tools/TranslatorTool/Messages/PlayerTranslatorMessage.cs @@ -0,0 +1,35 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.TransformSync; + +namespace QSB.Tools.TranslatorTool.Messages +{ + public class PlayerTranslatorMessage : QSBBoolMessage + { + static PlayerTranslatorMessage() + { + GlobalMessenger.AddListener(OWEvents.EquipTranslator, () => Handle(true)); + GlobalMessenger.AddListener(OWEvents.UnequipTranslator, () => Handle(false)); + } + + private static void Handle(bool equipped) + { + if (PlayerTransformSync.LocalInstance) + { + new PlayerTranslatorMessage(equipped).Send(); + } + } + + private PlayerTranslatorMessage(bool equipped) => Value = equipped; + + public override void OnReceiveRemote() + { + var player = QSBPlayerManager.GetPlayer(From); + player.TranslatorEquipped = Value; + player.Translator?.ChangeEquipState(Value); + } + + public override void OnReceiveLocal() => + QSBPlayerManager.LocalPlayer.TranslatorEquipped = Value; + } +} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs index c534047a..1578e485 100644 --- a/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs +++ b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs @@ -72,9 +72,9 @@ namespace QSB.Tools.TranslatorTool { tooCloseToTarget = num < _currentNomaiText.GetMinimumReadableDistance(); - if (_currentNomaiText is NomaiWallText) + if (_currentNomaiText is NomaiWallText nomaiWallText) { - var nomaiTextLine = (_currentNomaiText as NomaiWallText).GetClosestTextLineByCenter(raycastHit.point); + var nomaiTextLine = nomaiWallText.GetClosestTextLineByCenter(raycastHit.point); if (_lastLineLocked) { var distToCenter = _lastHighlightedTextLine.GetDistToCenter(raycastHit.point); @@ -119,27 +119,26 @@ namespace QSB.Tools.TranslatorTool _lastLineLocked = false; } } - else if (_currentNomaiText is NomaiComputer) + else if (_currentNomaiText is NomaiComputer nomaiComputer) { - var closestRing = (_currentNomaiText as NomaiComputer).GetClosestRing(raycastHit.point, out var num2); + var closestRing = nomaiComputer.GetClosestRing(raycastHit.point, out var num2); if (closestRing) { distToClosestTextCenter = Mathf.Min(num2 * 2f, 1f); _translatorProp.SetNomaiComputerRing(closestRing); } } - else if (_currentNomaiText is NomaiVesselComputer) + else if (_currentNomaiText is NomaiVesselComputer nomaiVesselComputer) { - var closestRing2 = (_currentNomaiText as NomaiVesselComputer).GetClosestRing(raycastHit.point, out var num3); + var closestRing2 = nomaiVesselComputer.GetClosestRing(raycastHit.point, out var num3); if (closestRing2) { distToClosestTextCenter = Mathf.Min(num3 * 2f, 1f); _translatorProp.SetNomaiVesselComputerRing(closestRing2); } } - else if (_currentNomaiText is GhostWallText) + else if (_currentNomaiText is GhostWallText ghostWallText) { - var ghostWallText = _currentNomaiText as GhostWallText; _translatorProp.SetNomaiTextLine(ghostWallText.GetTextLine()); } } diff --git a/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedEvent.cs b/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedEvent.cs deleted file mode 100644 index 7b4c1bbf..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedEvent.cs +++ /dev/null @@ -1,47 +0,0 @@ -using QSB.Events; -using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.Tools.TranslatorTool.TranslationSync.Events -{ - public class SetAsTranslatedEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBTextTranslated, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBTextTranslated, Handler); - - private void Handler(NomaiTextType type, int objId, int textId) => SendEvent(CreateMessage(type, objId, textId)); - - private SetAsTranslatedMessage CreateMessage(NomaiTextType type, int objId, int textId) => new() - { - AboutId = LocalPlayerId, - ObjectId = objId, - TextId = textId, - EnumValue = type - }; - - public override void OnReceiveRemote(bool server, SetAsTranslatedMessage message) - { - if (message.EnumValue == NomaiTextType.WallText) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.HandleSetAsTranslated(message.TextId); - } - else if (message.EnumValue == NomaiTextType.Computer) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.HandleSetAsTranslated(message.TextId); - } - else if (message.EnumValue == NomaiTextType.VesselComputer) - { - var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); - obj.HandleSetAsTranslated(message.TextId); - } - else - { - throw new System.NotImplementedException($"TextType <{message.EnumValue}> not implemented."); - } - } - } -} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedMessage.cs b/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedMessage.cs deleted file mode 100644 index e27aad02..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/Events/SetAsTranslatedMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.WorldSync.Events; -using QuantumUNET.Transport; - -namespace QSB.Tools.TranslatorTool.TranslationSync.Events -{ - public class SetAsTranslatedMessage : EnumWorldObjectMessage - { - public int TextId { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - TextId = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(TextId); - } - } -} diff --git a/QSB/Tools/TranslatorTool/TranslationSync/Messages/SetAsTranslatedMessage.cs b/QSB/Tools/TranslatorTool/TranslationSync/Messages/SetAsTranslatedMessage.cs new file mode 100644 index 00000000..c79dfa4a --- /dev/null +++ b/QSB/Tools/TranslatorTool/TranslationSync/Messages/SetAsTranslatedMessage.cs @@ -0,0 +1,27 @@ +using QSB.Messaging; +using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; +using QuantumUNET.Transport; + +namespace QSB.Tools.TranslatorTool.TranslationSync.Messages +{ + internal class SetAsTranslatedMessage : QSBWorldObjectMessage + { + private int TextId; + + public SetAsTranslatedMessage(int textId) => TextId = textId; + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(TextId); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + TextId = reader.ReadInt32(); + } + + public override void OnReceiveRemote() => WorldObject.SetAsTranslated(TextId); + } +} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/TranslationSync/NomaiTextType.cs b/QSB/Tools/TranslatorTool/TranslationSync/NomaiTextType.cs deleted file mode 100644 index 2ca81183..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/NomaiTextType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace QSB.Tools.TranslatorTool.TranslationSync -{ - public enum NomaiTextType - { - Computer = 0, - VesselComputer = 1, - WallText = 2 - } -} diff --git a/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs b/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs index 242bb1e5..122d4cb2 100644 --- a/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs +++ b/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs @@ -1,65 +1,31 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.Tools.TranslatorTool.TranslationSync.Messages; using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects; using QSB.WorldSync; namespace QSB.Tools.TranslatorTool.TranslationSync.Patches { - [HarmonyPatch] internal class SpiralPatches : QSBPatch { public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; [HarmonyPrefix] - [HarmonyPatch(typeof(NomaiWallText), nameof(NomaiWallText.SetAsTranslated))] - public static bool NomaiWallText_SetAsTranslated(NomaiWallText __instance, int id) + [HarmonyPatch(typeof(NomaiText), nameof(NomaiText.SetAsTranslated))] + public static void SetAsTranslated(NomaiText __instance, int id) { + if (__instance is GhostWallText) + { + return; + } if (__instance.IsTranslated(id)) { - return true; + return; } - QSBEventManager.FireEvent( - EventNames.QSBTextTranslated, - NomaiTextType.WallText, - QSBWorldSync.GetIdFromUnity(__instance), - id); - return true; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(NomaiComputer), nameof(NomaiWallText.SetAsTranslated))] - public static bool NomaiComputer_SetAsTranslated(NomaiComputer __instance, int id) - { - if (__instance.IsTranslated(id)) - { - return true; - } - - QSBEventManager.FireEvent( - EventNames.QSBTextTranslated, - NomaiTextType.Computer, - QSBWorldSync.GetIdFromUnity(__instance), - id); - return true; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(NomaiVesselComputer), nameof(NomaiWallText.SetAsTranslated))] - public static bool NomaiVesselComputer_SetAsTranslated(NomaiVesselComputer __instance, int id) - { - if (__instance.IsTranslated(id)) - { - return true; - } - - QSBEventManager.FireEvent( - EventNames.QSBTextTranslated, - NomaiTextType.VesselComputer, - QSBWorldSync.GetIdFromUnity(__instance), - id); - return true; + __instance.GetWorldObject() + .SendMessage(new SetAsTranslatedMessage(id)); } } } diff --git a/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs b/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs index 9d3b6bad..bdd13508 100644 --- a/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs +++ b/QSB/Tools/TranslatorTool/TranslationSync/SpiralManager.cs @@ -9,9 +9,13 @@ namespace QSB.Tools.TranslatorTool.TranslationSync protected override void RebuildWorldObjects(OWScene scene) { - QSBWorldSync.Init(); - QSBWorldSync.Init(); - QSBWorldSync.Init(); + // wait for all late initializers (which includes nomai text) to finish + StartDelayedReady(); + QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.isDoneInitializing, () => + { + FinishDelayedReady(); + QSBWorldSync.Init(typeof(GhostWallText)); + }); } } } diff --git a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBComputer.cs b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBComputer.cs deleted file mode 100644 index 7e6cd03d..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBComputer.cs +++ /dev/null @@ -1,40 +0,0 @@ -using OWML.Utils; -using QSB.WorldSync; -using System.Collections.Generic; - -namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects -{ - internal class QSBComputer : WorldObject - { - public void HandleSetAsTranslated(int id) - { - if (AttachedObject.IsTranslated(id)) - { - return; - } - - AttachedObject.SetAsTranslated(id); - } - - public IEnumerable GetTranslatedIds() - { - var activeList = AttachedObject.GetValue>("_activeRingList"); - foreach (var item in activeList) - { - if (AttachedObject.IsTranslated(item.GetEntryID())) - { - yield return item.GetEntryID(); - } - } - - var inactiveList = AttachedObject.GetValue>("_inactiveRingList"); - foreach (var item in inactiveList) - { - if (AttachedObject.IsTranslated(item.GetEntryID())) - { - yield return item.GetEntryID(); - } - } - } - } -} diff --git a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs new file mode 100644 index 00000000..9d907b47 --- /dev/null +++ b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBNomaiText.cs @@ -0,0 +1,25 @@ +using QSB.WorldSync; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects +{ + internal class QSBNomaiText : WorldObject + { + public void SetAsTranslated(int id) => AttachedObject.SetAsTranslated(id); + + public IEnumerable GetTranslatedIds() + { + if (!AttachedObject._initialized) + { + // shouldn't happen, but does anyway sometimes. whatever lol + return Array.Empty(); + } + + return AttachedObject._dictNomaiTextData + .Where(x => x.Value.IsTranslated) + .Select(x => x.Key); + } + } +} diff --git a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBVesselComputer.cs b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBVesselComputer.cs deleted file mode 100644 index f993e914..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBVesselComputer.cs +++ /dev/null @@ -1,28 +0,0 @@ -using OWML.Utils; -using QSB.WorldSync; -using System.Collections.Generic; -using System.Linq; - -namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects -{ - internal class QSBVesselComputer : WorldObject - { - public void HandleSetAsTranslated(int id) - { - if (AttachedObject.IsTranslated(id)) - { - return; - } - - AttachedObject.SetAsTranslated(id); - } - - public IEnumerable GetTranslatedIds() - { - var rings = AttachedObject.GetValue("_computerRings"); - return rings - .Where(ring => AttachedObject.IsTranslated(ring.GetEntryID())) - .Select(ring => ring.GetEntryID()); - } - } -} \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBWallText.cs b/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBWallText.cs deleted file mode 100644 index 2102f50d..00000000 --- a/QSB/Tools/TranslatorTool/TranslationSync/WorldObjects/QSBWallText.cs +++ /dev/null @@ -1,25 +0,0 @@ -using QSB.WorldSync; -using System.Collections.Generic; -using System.Linq; - -namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects -{ - internal class QSBWallText : WorldObject - { - public void HandleSetAsTranslated(int id) - { - if (AttachedObject.IsTranslated(id)) - { - return; - } - - AttachedObject.SetAsTranslated(id); - } - - public IEnumerable GetTranslatedIds() - { - var dict = AttachedObject._idToNodeDict; - return dict.Keys.Where(key => AttachedObject.IsTranslated(key)); - } - } -} diff --git a/QSB/TornadoSync/Events/TornadoFormStateEvent.cs b/QSB/TornadoSync/Events/TornadoFormStateEvent.cs deleted file mode 100644 index 6e5c9c21..00000000 --- a/QSB/TornadoSync/Events/TornadoFormStateEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using QSB.Events; -using QSB.TornadoSync.WorldObjects; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.TornadoSync.Events -{ - public class TornadoFormStateEvent : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() - => GlobalMessenger.AddListener(EventNames.QSBTornadoFormState, Handler); - - public override void CloseListener() - => GlobalMessenger.RemoveListener(EventNames.QSBTornadoFormState, Handler); - - private void Handler(QSBTornado qsbTornado) => SendEvent(CreateMessage(qsbTornado)); - - private BoolWorldObjectMessage CreateMessage(QSBTornado qsbTornado) => new() - { - ObjectId = qsbTornado.ObjectId, - State = qsbTornado.FormState - }; - - public override void OnReceiveRemote(bool isHost, BoolWorldObjectMessage message) - { - var qsbTornado = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbTornado.FormState = message.State; - } - } -} diff --git a/QSB/TornadoSync/Messages/TornadoFormStateMessage.cs b/QSB/TornadoSync/Messages/TornadoFormStateMessage.cs new file mode 100644 index 00000000..f66d305f --- /dev/null +++ b/QSB/TornadoSync/Messages/TornadoFormStateMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.TornadoSync.WorldObjects; + +namespace QSB.TornadoSync.Messages +{ + public class TornadoFormStateMessage : QSBBoolWorldObjectMessage + { + public TornadoFormStateMessage(bool formState) => Value = formState; + + public override void OnReceiveRemote() => WorldObject.FormState = Value; + } +} diff --git a/QSB/TornadoSync/Patches/TornadoPatches.cs b/QSB/TornadoSync/Patches/TornadoPatches.cs index ca6ad2f1..01335064 100644 --- a/QSB/TornadoSync/Patches/TornadoPatches.cs +++ b/QSB/TornadoSync/Patches/TornadoPatches.cs @@ -1,6 +1,7 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; +using QSB.TornadoSync.Messages; using QSB.TornadoSync.WorldObjects; using QSB.WorldSync; using UnityEngine; @@ -21,8 +22,8 @@ namespace QSB.TornadoSync.Patches if (__instance._secondsUntilFormation < 0f) { __instance.StartFormation(); - var qsbTornado = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, qsbTornado); + var qsbTornado = __instance.GetWorldObject(); + qsbTornado.SendMessage(new TornadoFormStateMessage(qsbTornado.FormState)); return false; } } @@ -61,8 +62,8 @@ namespace QSB.TornadoSync.Patches if (QSBCore.IsHost && hitObject.GetComponentInParent().GetMass() > 50f) { __instance.StartCollapse(); - var qsbTornado = QSBWorldSync.GetWorldFromUnity(__instance); - QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, qsbTornado); + var qsbTornado = __instance.GetWorldObject(); + qsbTornado.SendMessage(new TornadoFormStateMessage(qsbTornado.FormState)); } return false; diff --git a/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs b/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs index b8205115..7fc16920 100644 --- a/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs +++ b/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs @@ -1,13 +1,12 @@ -using System.Collections.Generic; -using System.Linq; -using QSB.Player.TransformSync; +using QSB.Player.TransformSync; using QSB.ShipSync.TransformSync; -using QSB.Syncs; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.Tools.ProbeTool.TransformSync; using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; +using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace QSB.TornadoSync.TransformSync diff --git a/QSB/Utility/CustomCallbacks.cs b/QSB/Utility/CustomCallbacks.cs deleted file mode 100644 index 58e3d1b5..00000000 --- a/QSB/Utility/CustomCallbacks.cs +++ /dev/null @@ -1,3 +0,0 @@ -public delegate void Callback(T arg1, U arg2, V arg3, W arg4); -public delegate void Callback(T arg1, U arg2, V arg3, W arg4, X arg5); -public delegate void Callback(T arg1, U arg2, V arg3, W arg4, X arg5, Y arg6); \ No newline at end of file diff --git a/QSB/Utility/DebugActions.cs b/QSB/Utility/DebugActions.cs index 41d758a7..4689fd49 100644 --- a/QSB/Utility/DebugActions.cs +++ b/QSB/Utility/DebugActions.cs @@ -1,8 +1,7 @@ -using OWML.Utils; -using QSB.Events; +using QSB.Messaging; using QSB.Player; using QSB.ShipSync; -using QSB.Utility.Events; +using QSB.Utility.Messages; using System.Linq; using UnityEngine; using UnityEngine.InputSystem; @@ -25,7 +24,7 @@ namespace QSB.Utility var warpCore = GameObject.Find("Prefab_NOM_WarpCoreVessel").GetComponent(); var socket = GameObject.Find("Interactibles_VesselBridge").GetComponentInChildren(); socket.PlaceIntoSocket(warpCore); - var bridgeVolume = FindObjectOfType().GetValue("_bridgeVolume"); + var bridgeVolume = FindObjectOfType()._bridgeVolume; bridgeVolume.AddObjectToVolume(Locator.GetPlayerDetector()); bridgeVolume.AddObjectToVolume(Locator.GetPlayerCameraDetector()); } @@ -90,7 +89,7 @@ namespace QSB.Utility if (Keyboard.current[Key.Numpad5].wasPressedThisFrame) { - QSBEventManager.FireEvent(EventNames.QSBDebugEvent, DebugEventEnum.TriggerSupernova); + new DebugMessage(DebugMessageEnum.TriggerSupernova).Send(); } if (Keyboard.current[Key.Numpad7].wasPressedThisFrame) diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 4973f05a..2d81d19e 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -1,15 +1,13 @@ using QSB.ClientServerStateSync; -using QSB.OrbSync.TransformSync; +using QSB.OrbSync; using QSB.Player; -using QSB.QuantumSync; +using QSB.QuantumSync.WorldObjects; using QSB.ShipSync; using QSB.ShipSync.TransformSync; using QSB.ShipSync.WorldObjects; using QSB.TimeSync; using QSB.WorldSync; using System.Linq; -using QSB.OrbSync; -using QSB.QuantumSync.WorldObjects; using UnityEngine; namespace QSB.Utility diff --git a/QSB/Utility/DebugLog.cs b/QSB/Utility/DebugLog.cs index 065fcc74..d5b38c70 100644 --- a/QSB/Utility/DebugLog.cs +++ b/QSB/Utility/DebugLog.cs @@ -34,10 +34,9 @@ namespace QSB.Utility } } - private static string GetCallingType(StackTrace frame) - { - var stackFrame = frame.GetFrames().First(x => x.GetMethod().DeclaringType.Name != "DebugLog"); - return stackFrame.GetMethod().DeclaringType.Name; - } + private static string GetCallingType(StackTrace frame) => + frame.GetFrames()! + .Select(x => x.GetMethod().DeclaringType!.Name) + .First(x => x == nameof(DebugLog)); } } \ No newline at end of file diff --git a/QSB/Utility/Events/DebugEvent.cs b/QSB/Utility/Events/DebugEvent.cs deleted file mode 100644 index 753fe7b4..00000000 --- a/QSB/Utility/Events/DebugEvent.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.Messaging; - -namespace QSB.Utility.Events -{ - public class DebugEvent : QSBEvent> - { - public override bool RequireWorldObjectsReady => false; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBDebugEvent, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBDebugEvent, Handler); - - private void Handler(DebugEventEnum type) => SendEvent(CreateMessage(type)); - - private EnumMessage CreateMessage(DebugEventEnum type) => new() - { - AboutId = LocalPlayerId, - EnumValue = type - }; - - public override void OnReceiveLocal(bool isHost, EnumMessage message) => OnReceiveRemote(isHost, message); - - public override void OnReceiveRemote(bool isHost, EnumMessage message) - { - switch (message.EnumValue) - { - case DebugEventEnum.TriggerSupernova: - TimeLoop.SetSecondsRemaining(0f); - break; - } - } - } -} diff --git a/QSB/Utility/Events/DebugEventEnum.cs b/QSB/Utility/Events/DebugEventEnum.cs deleted file mode 100644 index 1f74bc9c..00000000 --- a/QSB/Utility/Events/DebugEventEnum.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace QSB.Utility.Events -{ - public enum DebugEventEnum - { - TriggerSupernova - } -} \ No newline at end of file diff --git a/QSB/Utility/Extensions.cs b/QSB/Utility/Extensions.cs index d56e0804..72829c87 100644 --- a/QSB/Utility/Extensions.cs +++ b/QSB/Utility/Extensions.cs @@ -7,24 +7,13 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; +using Object = UnityEngine.Object; namespace QSB.Utility { public static class Extensions { - // UNITY - public static void Show(this GameObject gameObject) => SetVisibility(gameObject, true); - - public static void Hide(this GameObject gameObject) => SetVisibility(gameObject, false); - - private static void SetVisibility(GameObject gameObject, bool isVisible) - { - var renderers = gameObject.GetComponentsInChildren(); - foreach (var renderer in renderers) - { - renderer.enabled = isVisible; - } - } + #region UNITY public static Quaternion TransformRotation(this Transform transform, Quaternion localRotation) => transform.rotation * localRotation; @@ -32,7 +21,7 @@ namespace QSB.Utility public static GameObject InstantiateInactive(this GameObject original) { original.SetActive(false); - var copy = UnityEngine.Object.Instantiate(original); + var copy = Object.Instantiate(original); original.SetActive(true); return copy; } @@ -40,7 +29,10 @@ namespace QSB.Utility public static Transform InstantiateInactive(this Transform original) => original.gameObject.InstantiateInactive().transform; - // QNET + #endregion + + #region QNET + public static uint GetPlayerId(this QNetworkConnection connection) { if (connection == null) @@ -84,7 +76,10 @@ namespace QSB.Utility QNetworkServer.SpawnWithClientAuthority(go, QSBPlayerManager.LocalPlayer.TransformSync.gameObject); } - // C# + #endregion + + #region C# + public static void SafeInvoke(this MulticastDelegate multicast, params object[] args) { foreach (var del in multicast.GetInvocationList()) @@ -95,7 +90,7 @@ namespace QSB.Utility } catch (TargetInvocationException ex) { - DebugLog.ToConsole($"Error invoking delegate! Message : {ex.InnerException.Message} Stack Trace : {ex.InnerException.StackTrace}", MessageType.Error); + DebugLog.ToConsole($"Error invoking delegate! Message : {ex.InnerException!.Message} Stack Trace : {ex.InnerException.StackTrace}", MessageType.Error); } } } @@ -133,16 +128,15 @@ namespace QSB.Utility return true; } - private const BindingFlags Flags = BindingFlags.Instance - | BindingFlags.Static - | BindingFlags.Public - | BindingFlags.NonPublic - | BindingFlags.DeclaredOnly; - public static void RaiseEvent(this T instance, string eventName, params object[] args) { + const BindingFlags flags = BindingFlags.Instance + | BindingFlags.Static + | BindingFlags.Public + | BindingFlags.NonPublic + | BindingFlags.DeclaredOnly; if (typeof(T) - .GetField(eventName, Flags)? + .GetField(eventName, flags)? .GetValue(instance) is not MulticastDelegate multiDelegate) { return; @@ -154,9 +148,6 @@ namespace QSB.Utility public static IEnumerable GetDerivedTypes(this Type type) => type.Assembly.GetTypes() .Where(x => !x.IsInterface && !x.IsAbstract && type.IsAssignableFrom(x)); - // OW - - public static Vector3 GetRelativeAngularVelocity(this OWRigidbody baseBody, OWRigidbody relativeBody) - => baseBody.GetAngularVelocity() - relativeBody.GetAngularVelocity(); + #endregion } } diff --git a/QSB/Utility/GlobalMessenger4Args.cs b/QSB/Utility/GlobalMessenger4Args.cs deleted file mode 100644 index ffa849ac..00000000 --- a/QSB/Utility/GlobalMessenger4Args.cs +++ /dev/null @@ -1,82 +0,0 @@ -using OWML.Common; -using System; -using System.Collections.Generic; - -namespace QSB.Utility -{ - public static class GlobalMessenger - { - public static void AddListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (!_eventTable.TryGetValue(eventType, out var eventData)) - { - eventData = new EventData(); - _eventTable.Add(eventType, eventData); - } - - eventData.Callbacks.Add(handler); - } - } - - public static void RemoveListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - var num = eventData.Callbacks.IndexOf(handler); - if (num >= 0) - { - eventData.Callbacks[num] = eventData.Callbacks[eventData.Callbacks.Count - 1]; - eventData.Callbacks.RemoveAt(eventData.Callbacks.Count - 1); - } - } - } - } - - public static void FireEvent(string eventType, T arg1, U arg2, V arg3, W arg4) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - if (eventData.IsInvoking) - { - throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); - } - - eventData.IsInvoking = true; - eventData.Temp.AddRange(eventData.Callbacks); - for (var i = 0; i < eventData.Temp.Count; i++) - { - try - { - eventData.Temp[i](arg1, arg2, arg3, arg4); - } - catch (Exception exception) - { - DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); - } - } - - eventData.Temp.Clear(); - eventData.IsInvoking = false; - } - } - } - - private static readonly IDictionary _eventTable = new Dictionary(ComparerLibrary.stringEqComparer); - - private class EventData - { - public List> Callbacks = new(); - public List> Temp = new(); - public bool IsInvoking; - } - } -} diff --git a/QSB/Utility/GlobalMessenger5Args.cs b/QSB/Utility/GlobalMessenger5Args.cs deleted file mode 100644 index 00752f13..00000000 --- a/QSB/Utility/GlobalMessenger5Args.cs +++ /dev/null @@ -1,82 +0,0 @@ -using OWML.Common; -using System; -using System.Collections.Generic; - -namespace QSB.Utility -{ - public static class GlobalMessenger - { - public static void AddListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (!_eventTable.TryGetValue(eventType, out var eventData)) - { - eventData = new EventData(); - _eventTable.Add(eventType, eventData); - } - - eventData.Callbacks.Add(handler); - } - } - - public static void RemoveListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - var num = eventData.Callbacks.IndexOf(handler); - if (num >= 0) - { - eventData.Callbacks[num] = eventData.Callbacks[eventData.Callbacks.Count - 1]; - eventData.Callbacks.RemoveAt(eventData.Callbacks.Count - 1); - } - } - } - } - - public static void FireEvent(string eventType, T arg1, U arg2, V arg3, W arg4, X arg5) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - if (eventData.IsInvoking) - { - throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); - } - - eventData.IsInvoking = true; - eventData.Temp.AddRange(eventData.Callbacks); - for (var i = 0; i < eventData.Temp.Count; i++) - { - try - { - eventData.Temp[i](arg1, arg2, arg3, arg4, arg5); - } - catch (Exception exception) - { - DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); - } - } - - eventData.Temp.Clear(); - eventData.IsInvoking = false; - } - } - } - - private static readonly IDictionary _eventTable = new Dictionary(ComparerLibrary.stringEqComparer); - - private class EventData - { - public List> Callbacks = new(); - public List> Temp = new(); - public bool IsInvoking; - } - } -} diff --git a/QSB/Utility/GlobalMessenger6Args.cs b/QSB/Utility/GlobalMessenger6Args.cs deleted file mode 100644 index e7448e27..00000000 --- a/QSB/Utility/GlobalMessenger6Args.cs +++ /dev/null @@ -1,82 +0,0 @@ -using OWML.Common; -using System; -using System.Collections.Generic; - -namespace QSB.Utility -{ - public static class GlobalMessenger - { - public static void AddListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (!_eventTable.TryGetValue(eventType, out var eventData)) - { - eventData = new EventData(); - _eventTable.Add(eventType, eventData); - } - - eventData.Callbacks.Add(handler); - } - } - - public static void RemoveListener(string eventType, Callback handler) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - var num = eventData.Callbacks.IndexOf(handler); - if (num >= 0) - { - eventData.Callbacks[num] = eventData.Callbacks[eventData.Callbacks.Count - 1]; - eventData.Callbacks.RemoveAt(eventData.Callbacks.Count - 1); - } - } - } - } - - public static void FireEvent(string eventType, T arg1, U arg2, V arg3, W arg4, X arg5, Y arg6) - { - object obj = _eventTable; - lock (obj) - { - if (_eventTable.TryGetValue(eventType, out var eventData)) - { - if (eventData.IsInvoking) - { - throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); - } - - eventData.IsInvoking = true; - eventData.Temp.AddRange(eventData.Callbacks); - for (var i = 0; i < eventData.Temp.Count; i++) - { - try - { - eventData.Temp[i](arg1, arg2, arg3, arg4, arg5, arg6); - } - catch (Exception exception) - { - DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); - } - } - - eventData.Temp.Clear(); - eventData.IsInvoking = false; - } - } - } - - private static readonly IDictionary _eventTable = new Dictionary(ComparerLibrary.stringEqComparer); - - private class EventData - { - public List> Callbacks = new(); - public List> Temp = new(); - public bool IsInvoking; - } - } -} diff --git a/QSB/Utility/Messages/DebugMessage.cs b/QSB/Utility/Messages/DebugMessage.cs new file mode 100644 index 00000000..e3332e87 --- /dev/null +++ b/QSB/Utility/Messages/DebugMessage.cs @@ -0,0 +1,21 @@ +using QSB.Messaging; + +namespace QSB.Utility.Messages +{ + public class DebugMessage : QSBEnumMessage + { + public DebugMessage(DebugMessageEnum type) => Value = type; + + public override void OnReceiveLocal() => OnReceiveRemote(); + + public override void OnReceiveRemote() + { + switch (Value) + { + case DebugMessageEnum.TriggerSupernova: + TimeLoop.SetSecondsRemaining(0f); + break; + } + } + } +} diff --git a/QSB/Utility/Messages/DebugMessageEnum.cs b/QSB/Utility/Messages/DebugMessageEnum.cs new file mode 100644 index 00000000..6ab9f289 --- /dev/null +++ b/QSB/Utility/Messages/DebugMessageEnum.cs @@ -0,0 +1,7 @@ +namespace QSB.Utility.Messages +{ + public enum DebugMessageEnum + { + TriggerSupernova + } +} \ No newline at end of file diff --git a/QSB/Utility/UnitTestDetector.cs b/QSB/Utility/UnitTestDetector.cs index 44fe5dd2..0d90da39 100644 --- a/QSB/Utility/UnitTestDetector.cs +++ b/QSB/Utility/UnitTestDetector.cs @@ -5,11 +5,11 @@ namespace QSB.Utility { public static class UnitTestDetector { - public static bool IsInUnitTest { get; private set; } + public static readonly bool IsInUnitTest; static UnitTestDetector() { - var testAssemblyName = "Microsoft.VisualStudio.TestPlatform.TestFramework"; + const string testAssemblyName = "Microsoft.VisualStudio.TestPlatform.TestFramework"; IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies() .Any(a => a.FullName.StartsWith(testAssemblyName)); } diff --git a/QSB/Utility/VariableSync/BaseVariableSyncer.cs b/QSB/Utility/VariableSync/BaseVariableSyncer.cs index 5d9a34c2..fe57cc5d 100644 --- a/QSB/Utility/VariableSync/BaseVariableSyncer.cs +++ b/QSB/Utility/VariableSync/BaseVariableSyncer.cs @@ -1,7 +1,7 @@ -using System.Collections.Generic; -using QuantumUNET; +using QuantumUNET; using QuantumUNET.Messages; using QuantumUNET.Transport; +using System.Collections.Generic; using UnityEngine; namespace QSB.Utility.VariableSync diff --git a/QSB/WorldSync/Events/BoolWorldObjectMessage.cs b/QSB/WorldSync/Events/BoolWorldObjectMessage.cs deleted file mode 100644 index f0549d03..00000000 --- a/QSB/WorldSync/Events/BoolWorldObjectMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.WorldSync.Events -{ - public class BoolWorldObjectMessage : WorldObjectMessage - { - public bool State { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - State = reader.ReadBoolean(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(State); - } - } -} \ No newline at end of file diff --git a/QSB/WorldSync/Events/EnumWorldObjectMessage.cs b/QSB/WorldSync/Events/EnumWorldObjectMessage.cs deleted file mode 100644 index 8e58934d..00000000 --- a/QSB/WorldSync/Events/EnumWorldObjectMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using QuantumUNET.Transport; - -namespace QSB.WorldSync.Events -{ - public class EnumWorldObjectMessage : WorldObjectMessage - { - public T EnumValue; - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - EnumValue = (T)(object)reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write((int)(object)EnumValue); - } - } -} diff --git a/QSB/WorldSync/Events/WorldObjectMessage.cs b/QSB/WorldSync/Events/WorldObjectMessage.cs deleted file mode 100644 index a265be0e..00000000 --- a/QSB/WorldSync/Events/WorldObjectMessage.cs +++ /dev/null @@ -1,22 +0,0 @@ -using QSB.Messaging; -using QuantumUNET.Transport; - -namespace QSB.WorldSync.Events -{ - public class WorldObjectMessage : PlayerMessage - { - public int ObjectId { get; set; } - - public override void Deserialize(QNetworkReader reader) - { - base.Deserialize(reader); - ObjectId = reader.ReadInt32(); - } - - public override void Serialize(QNetworkWriter writer) - { - base.Serialize(writer); - writer.Write(ObjectId); - } - } -} \ No newline at end of file diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index 03edba0a..dbfad045 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using QSB.LogSync; using QSB.Utility; using System; using System.Collections.Generic; @@ -20,25 +21,25 @@ namespace QSB.WorldSync where TWorldObject : IWorldObject => WorldObjects.OfType(); - public static TWorldObject GetWorldFromId(int id) + public static TWorldObject GetWorldObject(this int objectId) where TWorldObject : IWorldObject { - if (!WorldObjects.IsInRange(id)) + if (!WorldObjects.IsInRange(objectId)) { - DebugLog.ToConsole($"Warning - Tried to find {typeof(TWorldObject).Name} id {id}. Count is {WorldObjects.Count}.", MessageType.Warning); + DebugLog.ToConsole($"Warning - Tried to find {typeof(TWorldObject).Name} id {objectId}. Count is {WorldObjects.Count}.", MessageType.Warning); return default; } - if (WorldObjects[id] is not TWorldObject worldObject) + if (WorldObjects[objectId] is not TWorldObject worldObject) { - DebugLog.ToConsole($"Error - {typeof(TWorldObject).Name} id {id} is actually {WorldObjects[id].GetType().Name}.", MessageType.Error); + DebugLog.ToConsole($"Error - {typeof(TWorldObject).Name} id {objectId} is actually {WorldObjects[objectId].GetType().Name}.", MessageType.Error); return default; } return worldObject; } - public static TWorldObject GetWorldFromUnity(MonoBehaviour unityObject) + public static TWorldObject GetWorldObject(this MonoBehaviour unityObject) where TWorldObject : IWorldObject { if (unityObject == null) @@ -68,10 +69,6 @@ namespace QSB.WorldSync return (TWorldObject)worldObject; } - public static int GetIdFromUnity(MonoBehaviour unityObject) - where TWorldObject : IWorldObject - => GetWorldFromUnity(unityObject).ObjectId; - public static void RemoveWorldObjects() { if (WorldObjects.Count == 0) @@ -147,7 +144,7 @@ namespace QSB.WorldSync DialogueConditions[name] = state; } - public static void AddFactReveal(string id, bool saveGame, bool showNotification) + public static void AddFactReveal(string id, bool saveGame) { if (!QSBCore.IsHost) { @@ -163,8 +160,7 @@ namespace QSB.WorldSync ShipLogFacts.Add(new FactReveal { Id = id, - SaveGame = saveGame, - ShowNotification = showNotification + SaveGame = saveGame }); } } diff --git a/QSB/ZeroGCaveSync/Events/SatelliteNodeRepairTick.cs b/QSB/ZeroGCaveSync/Events/SatelliteNodeRepairTick.cs deleted file mode 100644 index 31dde831..00000000 --- a/QSB/ZeroGCaveSync/Events/SatelliteNodeRepairTick.cs +++ /dev/null @@ -1,34 +0,0 @@ -using QSB.Events; -using QSB.ShipSync.Events; -using QSB.WorldSync; -using QSB.ZeroGCaveSync.WorldObjects; - -namespace QSB.ZeroGCaveSync.Events -{ - internal class SatelliteNodeRepairTick : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBSatelliteRepairTick, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBSatelliteRepairTick, Handler); - - private void Handler(SatelliteNode node, float repairFraction) => SendEvent(CreateMessage(node, repairFraction)); - - private RepairTickMessage CreateMessage(SatelliteNode node, float repairFraction) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(node); - return new RepairTickMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId, - RepairNumber = repairFraction - }; - } - - public override void OnReceiveRemote(bool server, RepairTickMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.RepairTick(message.RepairNumber); - } - } -} diff --git a/QSB/ZeroGCaveSync/Events/SatelliteNodeRepaired.cs b/QSB/ZeroGCaveSync/Events/SatelliteNodeRepaired.cs deleted file mode 100644 index efdb9f82..00000000 --- a/QSB/ZeroGCaveSync/Events/SatelliteNodeRepaired.cs +++ /dev/null @@ -1,33 +0,0 @@ -using QSB.Events; -using QSB.WorldSync; -using QSB.WorldSync.Events; -using QSB.ZeroGCaveSync.WorldObjects; - -namespace QSB.ZeroGCaveSync.Events -{ - internal class SatelliteNodeRepaired : QSBEvent - { - public override bool RequireWorldObjectsReady => true; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBSatelliteRepaired, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBSatelliteRepaired, Handler); - - private void Handler(SatelliteNode node) => SendEvent(CreateMessage(node)); - - private WorldObjectMessage CreateMessage(SatelliteNode node) - { - var worldObject = QSBWorldSync.GetWorldFromUnity(node); - return new WorldObjectMessage - { - AboutId = LocalPlayerId, - ObjectId = worldObject.ObjectId - }; - } - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - var worldObject = QSBWorldSync.GetWorldFromId(message.ObjectId); - worldObject.SetRepaired(); - } - } -} diff --git a/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairTickMessage.cs b/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairTickMessage.cs new file mode 100644 index 00000000..8cc46e42 --- /dev/null +++ b/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairTickMessage.cs @@ -0,0 +1,12 @@ +using QSB.Messaging; +using QSB.ZeroGCaveSync.WorldObjects; + +namespace QSB.ZeroGCaveSync.Messages +{ + internal class SatelliteNodeRepairTickMessage : QSBFloatWorldObjectMessage + { + public SatelliteNodeRepairTickMessage(float repairFraction) => Value = repairFraction; + + public override void OnReceiveRemote() => WorldObject.RepairTick(Value); + } +} diff --git a/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairedMessage.cs b/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairedMessage.cs new file mode 100644 index 00000000..b5b75978 --- /dev/null +++ b/QSB/ZeroGCaveSync/Messages/SatelliteNodeRepairedMessage.cs @@ -0,0 +1,10 @@ +using QSB.Messaging; +using QSB.ZeroGCaveSync.WorldObjects; + +namespace QSB.ZeroGCaveSync.Messages +{ + internal class SatelliteNodeRepairedMessage : QSBWorldObjectMessage + { + public override void OnReceiveRemote() => WorldObject.SetRepaired(); + } +} \ No newline at end of file diff --git a/QSB/ZeroGCaveSync/Patches/ZeroGCavePatches.cs b/QSB/ZeroGCaveSync/Patches/ZeroGCavePatches.cs index a2975a6c..23d6f0c0 100644 --- a/QSB/ZeroGCaveSync/Patches/ZeroGCavePatches.cs +++ b/QSB/ZeroGCaveSync/Patches/ZeroGCavePatches.cs @@ -1,7 +1,10 @@ using HarmonyLib; -using QSB.Events; +using QSB.Messaging; using QSB.Patches; using QSB.Utility; +using QSB.WorldSync; +using QSB.ZeroGCaveSync.Messages; +using QSB.ZeroGCaveSync.WorldObjects; using UnityEngine; namespace QSB.ZeroGCaveSync.Patches @@ -21,12 +24,14 @@ namespace QSB.ZeroGCaveSync.Patches } __instance._repairFraction = Mathf.Clamp01(__instance._repairFraction + (Time.deltaTime / __instance._repairTime)); + var qsbSatelliteNode = __instance.GetWorldObject(); if (__instance._repairFraction >= 1f) { - QSBEventManager.FireEvent(EventNames.QSBSatelliteRepaired, __instance); + qsbSatelliteNode + .SendMessage(new SatelliteNodeRepairedMessage()); __instance._damaged = false; var component = Locator.GetPlayerTransform().GetComponent(); - if (component.GetReferenceFrame(true) == __instance._rfVolume.GetReferenceFrame()) + if (component.GetReferenceFrame() == __instance._rfVolume.GetReferenceFrame()) { component.UntargetReferenceFrame(); } @@ -48,7 +53,7 @@ namespace QSB.ZeroGCaveSync.Patches __instance._lanternEmissiveRenderer.sharedMaterials = __instance._lanternMaterials; } - __instance.RaiseEvent("OnRepaired", __instance); + __instance.RaiseEvent(nameof(__instance.OnRepaired), __instance); } if (__instance._damageEffect != null) @@ -56,7 +61,8 @@ namespace QSB.ZeroGCaveSync.Patches __instance._damageEffect.SetEffectBlend(1f - __instance._repairFraction); } - QSBEventManager.FireEvent(EventNames.QSBSatelliteRepairTick, __instance, __instance._repairFraction); + qsbSatelliteNode + .SendMessage(new SatelliteNodeRepairTickMessage(__instance._repairFraction)); return false; } } diff --git a/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs b/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs index 0598d3be..672f2e22 100644 --- a/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs +++ b/QSB/ZeroGCaveSync/WorldObjects/QSBSatelliteNode.cs @@ -10,7 +10,7 @@ namespace QSB.ZeroGCaveSync.WorldObjects DebugLog.DebugWrite($"[SATELLITE NODE] {AttachedObject} Set repaired."); AttachedObject._damaged = false; var component = Locator.GetPlayerTransform().GetComponent(); - if (component.GetReferenceFrame(true) == AttachedObject._rfVolume.GetReferenceFrame()) + if (component.GetReferenceFrame() == AttachedObject._rfVolume.GetReferenceFrame()) { component.UntargetReferenceFrame(); } @@ -32,7 +32,7 @@ namespace QSB.ZeroGCaveSync.WorldObjects AttachedObject._lanternEmissiveRenderer.sharedMaterials = AttachedObject._lanternMaterials; } - AttachedObject.RaiseEvent("OnRepaired", AttachedObject); + AttachedObject.RaiseEvent(nameof(AttachedObject.OnRepaired), AttachedObject); } public void RepairTick(float repairFraction) diff --git a/QuantumUNET/Components/QNetworkIdentity.cs b/QuantumUNET/Components/QNetworkIdentity.cs index 069e6531..c6401e33 100644 --- a/QuantumUNET/Components/QNetworkIdentity.cs +++ b/QuantumUNET/Components/QNetworkIdentity.cs @@ -794,7 +794,7 @@ namespace QuantumUNET.Components private QNetworkSceneId m_SceneId; [SerializeField] - private int m_AssetId; + public int m_AssetId; [SerializeField] private bool m_ServerOnly; diff --git a/QuantumUNET/Components/QNetworkManager.cs b/QuantumUNET/Components/QNetworkManager.cs index 528ed480..63486581 100644 --- a/QuantumUNET/Components/QNetworkManager.cs +++ b/QuantumUNET/Components/QNetworkManager.cs @@ -32,7 +32,7 @@ namespace QuantumUNET.Components private ConnectionConfig m_ConnectionConfig; private GlobalConfig m_GlobalConfig; - private readonly int m_MaxBufferedPackets = 16; + public int m_MaxBufferedPackets = 16; private readonly bool m_AllowFragmentation = true; private static readonly QAddPlayerMessage s_AddPlayerMessage = new(); private static readonly QRemovePlayerMessage s_RemovePlayerMessage = new();