From eec388a3d325155825e6ef6c8027886b35422f10 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 3 Jan 2021 09:52:34 +0000 Subject: [PATCH] add moon stuff --- QSB/Events/EventNames.cs | 1 + QSB/Events/EventType.cs | 1 + QSB/Events/QSBEventManager.cs | 1 + QSB/Player/QSBPlayerManager.cs | 2 +- QSB/QSB.csproj | 2 + .../Events/MoonStateChangeEvent.cs | 51 +++++++++++++++++++ .../Events/MoonStateChangeMessage.cs | 29 +++++++++++ .../Events/MultiStateChangeEvent.cs | 2 +- .../ClientQuantumStateChangePatches.cs | 1 + .../ServerQuantumStateChangePatches.cs | 10 ++-- 10 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 QSB/QuantumSync/Events/MoonStateChangeEvent.cs create mode 100644 QSB/QuantumSync/Events/MoonStateChangeMessage.cs diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index d24ce2cc..15f719e6 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -41,6 +41,7 @@ public static string QSBSocketStateChange = "QSBSocketStateChange"; public static string QSBMultiStateChange = "QSBMultiStateChange"; public static string QSBQuantumShuffle = "QSBQuantumShuffle"; + public static string QSBMoonStateChange = "QSBMoonStateChange"; public static string QSBIdentifyFrequency = "QSBIdentifyFrequency"; public static string QSBIdentifySignal = "QSBIdentifySignal"; public static string QSBTextTranslated = "QSBTextTranslated"; diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index 3b9a9660..29a90d22 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -29,6 +29,7 @@ SocketStateChange, MultiStateChange, QuantumShuffle, + MoonStateChange, IdentifyFrequency, IdentifySignal, TextTranslated diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index be78d02e..0356d328 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -52,6 +52,7 @@ namespace QSB.Events new MultiStateChangeEvent(), new SetAsTranslatedEvent(), new QuantumShuffleEvent(), + new MoonStateChangeEvent(), // Conversation/dialogue/exploration new ConversationEvent(), new ConversationStartEndEvent(), diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index e32ac8ed..67bc11ab 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -78,7 +78,7 @@ namespace QSB.Player public static List GetPlayerCameras() { var cameraList = PlayerList.Where(x => x.Camera != null).Select(x => x.Camera).ToList(); - cameraList.Add(Locator.GetPlayerCamera()); + cameraList.Add(Locator.GetActiveCamera()); return cameraList; } } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 76bf0cff..e2779dba 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -190,6 +190,8 @@ + + diff --git a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs new file mode 100644 index 00000000..18eaaa80 --- /dev/null +++ b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs @@ -0,0 +1,51 @@ +using OWML.Utils; +using QSB.Events; +using QSB.Utility; +using System.Linq; +using UnityEngine; + +namespace QSB.QuantumSync.Events +{ + public class MoonStateChangeEvent : QSBEvent + { + public override QSB.Events.EventType Type => QSB.Events.EventType.MoonStateChange; + + 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 MoonStateChangeMessage + { + AboutId = LocalPlayerId, + StateIndex = stateIndex, + OnUnitSphere = onUnitSphere, + OrbitAngle = orbitAngle + }; + + public override void OnReceiveRemote(bool server, MoonStateChangeMessage message) + { + if (!QSBCore.HasWokenUp) + { + return; + } + DebugLog.DebugWrite($"MOON TO INDEX {message.StateIndex}, ANGLE {message.OrbitAngle}, POINT {message.OnUnitSphere}"); + var moon = Locator.GetQuantumMoon(); + 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); + } + } +} diff --git a/QSB/QuantumSync/Events/MoonStateChangeMessage.cs b/QSB/QuantumSync/Events/MoonStateChangeMessage.cs new file mode 100644 index 00000000..54b6df26 --- /dev/null +++ b/QSB/QuantumSync/Events/MoonStateChangeMessage.cs @@ -0,0 +1,29 @@ +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 index adc5118f..1a9d1533 100644 --- a/QSB/QuantumSync/Events/MultiStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/MultiStateChangeEvent.cs @@ -7,7 +7,7 @@ namespace QSB.QuantumSync.Events { public class MultiStateChangeEvent : QSBEvent { - public override QSB.Events.EventType Type => QSB.Events.EventType.MultiStateChange; + public override EventType Type => EventType.MultiStateChange; public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBMultiStateChange, Handler); public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBMultiStateChange, Handler); diff --git a/QSB/QuantumSync/Patches/ClientQuantumStateChangePatches.cs b/QSB/QuantumSync/Patches/ClientQuantumStateChangePatches.cs index d336e6c2..1321f9d9 100644 --- a/QSB/QuantumSync/Patches/ClientQuantumStateChangePatches.cs +++ b/QSB/QuantumSync/Patches/ClientQuantumStateChangePatches.cs @@ -11,6 +11,7 @@ namespace QSB.QuantumSync.Patches QSBCore.Helper.HarmonyHelper.AddPrefix("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch)); QSBCore.Helper.HarmonyHelper.AddPrefix("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch)); QSBCore.Helper.HarmonyHelper.AddPrefix("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch)); + QSBCore.Helper.HarmonyHelper.AddPrefix("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch)); } public static bool ReturnFalsePatch() => false; diff --git a/QSB/QuantumSync/Patches/ServerQuantumStateChangePatches.cs b/QSB/QuantumSync/Patches/ServerQuantumStateChangePatches.cs index d6b4185f..9bca3757 100644 --- a/QSB/QuantumSync/Patches/ServerQuantumStateChangePatches.cs +++ b/QSB/QuantumSync/Patches/ServerQuantumStateChangePatches.cs @@ -1,8 +1,6 @@ -using OWML.Utils; -using QSB.Events; +using QSB.Events; using QSB.Patches; using QSB.QuantumSync.WorldObjects; -using QSB.Utility; using QSB.WorldSync; using System; using System.Collections.Generic; @@ -166,7 +164,8 @@ namespace QSB.QuantumSync.Patches velocity = (initialMotion == null) ? Vector3.zero : initialMotion.GetInitVelocity(); ____useInitialMotion = false; } - ____moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, ____moonBody, UnityEngine.Random.Range(0, 360)) + velocity); + var orbitAngle = UnityEngine.Random.Range(0, 360); + ____moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, ____moonBody, orbitAngle) + velocity); ____lastStateIndex = ____stateIndex; ____stateIndex = stateIndex; ____collapseToIndex = -1; @@ -175,6 +174,7 @@ namespace QSB.QuantumSync.Patches { ____stateSkipCounts[k] = (k != ____stateIndex) ? (____stateSkipCounts[k] + 1) : 0; } + GlobalMessenger.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle); break; } ____visibilityTracker.transform.localPosition = Vector3.zero; @@ -192,7 +192,7 @@ namespace QSB.QuantumSync.Patches } else { - __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { ____stateIndex }); + __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 }); ____quantumSignal.SetSignalActivation(____stateIndex != 5, 2f); } ____referenceFrameVolume.gameObject.SetActive(____stateIndex != 5);